邮件修改+影像导出

This commit is contained in:
2025-06-06 11:12:46 +08:00
parent dd3b43da7b
commit 578aaa467c
7 changed files with 406 additions and 35 deletions
@@ -546,6 +546,110 @@ namespace IRaCIS.Core.Application.Contracts
}
public class TrialExportImageCommand
{
[NotDefault]
public Guid TrialId { get; set; }
public List<Guid> SubjectVisitIdList { get; set; }
public bool IsKeyImage { get; set; }
}
public class TrialVisitImageQuery : PageInput
{
[NotDefault]
public Guid TrialId { get; set; }
public Guid? TrialSiteId { get; set; }
public string? SubjectCode { get; set; }
public DateTime? BeginScanDate { get; set; }
public DateTime? EndScanDate { get; set; }
}
public class TrialVisitImageStatView
{
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
public Guid TrialSiteId { get; set; }
public string TrialSiteCode { get; set; }
public string SubjectCode { get; set; }
public string VisitName { get; set; }
public decimal VisitNum { get; set; }
public DateTime? EarliestScanDate { get; set; }
public DateTime? LatestScanDate { get; set; }
public int TotalStudyCount { get; set; }
public int TotalImageCount { get; set; }
public long? TotalImageSize { get; set; }
public string TotalImageSizeStr => TotalImageSize.HasValue
? $"{TotalImageSize.Value / 1024d / 1024d:F3} MB"
: "0.000 MB";
#region
//public int TotalStudyCount => DicomStudyCount + NoneDicomStudyCount;
//public int TotalImageCount => DicomImageCount + NoneDicomImageCount;
//public long? TotalImageSize => DicomImageSize + NoneDicomImageSize;
//public int DicomStudyCount { get; set; }
//public int DicomImageCount { get; set; }
//public long? DicomImageSize { get; set; }
//public int NoneDicomStudyCount { get; set; }
//public int NoneDicomImageCount { get; set; }
//public long? NoneDicomImageSize { get; set; }
#endregion
}
public class TrialImageStatInfo
{
public int SubjectCount { get; set; }
public int SubjectVisitCount { get; set; }
public long? TotalImageSize { get; set; }
public string TotalImageSizeStr => TotalImageSize.HasValue
? $"{TotalImageSize.Value / 1024d / 1024d:F3} MB"
: "0.000 MB";
public string SubjectImageAVGSizeStr => TotalImageSize.HasValue
? $"{TotalImageSize.Value / SubjectCount / 1024d / 1024d:F3} MB"
: "0.000 MB";
public string SubjectVisitImageAVGSizeStr => TotalImageSize.HasValue
? $"{TotalImageSize.Value / SubjectVisitCount / 1024d / 1024d:F3} MB"
: "0.000 MB";
}
public class TrialImageDownloadView
{
public Guid TrialId { get; set; }
@@ -1117,7 +1117,18 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
/// <summary>
/// 更新后处理上传的检查modality
/// </summary>
/// <param name="taskStudyId"></param>
/// <param name="modality"></param>
/// <returns></returns>
[HttpPut]
public async Task<IResponseOutput> UpdateTaskStudyModality(Guid taskStudyId, string modality)
{
await _taskStudyRepository.UpdatePartialFromQueryAsync(t => t.Id == taskStudyId, u => new TaskStudy() { ModalityForEdit = modality }, true);
return ResponseOutput.Ok();
}
/// <summary>
/// 影像下载成功回调
@@ -1154,19 +1165,174 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
return await query.ToPagedListAsync(inQuery);
}
/// <summary>
/// 更新后处理上传的检查modality
/// </summary>
/// <param name="taskStudyId"></param>
/// <param name="modality"></param>
/// <returns></returns>
[HttpPut]
public async Task<IResponseOutput> UpdateTaskStudyModality(Guid taskStudyId, string modality)
#region
public async Task<IResponseOutput<PageOutput<TrialVisitImageStatView>>> GetTrialVisitImageStatList(TrialVisitImageQuery inQuery)
{
await _taskStudyRepository.UpdatePartialFromQueryAsync(t => t.Id == taskStudyId, u => new TaskStudy() { ModalityForEdit = modality }, true);
return ResponseOutput.Ok();
var query = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)
.WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
.WhereIf(inQuery.SubjectCode.IsNotNullOrEmpty(), t => t.Subject.Code.Contains(inQuery.SubjectCode))
.WhereIf(inQuery.BeginScanDate != null, t => t.LatestScanDate >= inQuery.BeginScanDate)
.WhereIf(inQuery.EndScanDate != null, t => t.LatestScanDate == inQuery.EndScanDate)
.Select(t => new TrialVisitImageStatView()
{
TrialId = t.TrialId,
SubjectCode = t.Subject.Code,
TrialSiteCode = t.TrialSite.TrialSiteCode,
TrialSiteId = t.TrialSiteId,
VisitName = t.VisitName,
VisitNum = t.VisitNum,
EarliestScanDate = t.EarliestScanDate,
LatestScanDate = t.LatestScanDate,
TotalStudyCount = t.StudyList.Count() + t.NoneDicomStudyList.Count(),
TotalImageCount = t.StudyList.Sum(t => t.InstanceCount) + t.NoneDicomStudyList.Sum(t => t.FileCount),
TotalImageSize = t.StudyList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize) + t.NoneDicomStudyList.SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize),
//DicomStudyCount = t.StudyList.Count(),
//NoneDicomStudyCount = t.NoneDicomStudyList.Count(),
//DicomImageCount = t.StudyList.Sum(t => t.InstanceCount),
//NoneDicomImageCount = t.NoneDicomStudyList.Sum(t => t.FileCount),
//DicomImageSize = t.StudyList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize),
//NoneDicomImageSize = t.NoneDicomStudyList.SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize)
});
var pagelist = await query.ToPagedListAsync(inQuery);
return ResponseOutput.Ok(pagelist);
}
/// <summary>
/// 获取项目影像统计,有影像的subject 数量 访视数量
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
public async Task<IResponseOutput> GetTrialVisitImageStatInfo(Guid trialId)
{
var subjectImageList = _subjectVisitRepository.Where(t => t.TrialId == trialId)
.Where(t => t.StudyList.Sum(t => t.InstanceCount) > 0 || t.NoneDicomStudyList.Sum(t => t.FileCount) > 0)
.GroupBy(t => t.SubjectId)
.Select(g => new
{
SubjectId = g.Key,
VisitCount = g.Count(),
ImageSize = g.Sum(t => t.NoneDicomStudyList.SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize)
+ g.Sum(t => t.StudyList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize)))
})
.ToList();
var subjectCount = subjectImageList.Count;
var subjectVisitCount = subjectImageList.Sum(t => t.VisitCount);
var totalImageSize = subjectImageList.Sum(t => t.ImageSize);
return ResponseOutput.Ok(new TrialImageStatInfo { SubjectCount = subjectCount, SubjectVisitCount = subjectVisitCount, TotalImageSize = totalImageSize });
}
/// <summary>
/// 批量勾选访视 进行下载
/// </summary>
/// <param name="inCommand"></param>
/// <returns></returns>
public async Task<IResponseOutput> GetExportSubjectVisitImageList(TrialExportImageCommand inCommand)
{
if (inCommand.IsKeyImage)
{
var downloadInfo = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false)
.Where(t => inCommand.SubjectVisitIdList.Contains((Guid)t.SourceSubjectVisitId))
.Select(t => new
{
t.Trial.ResearchProgramNo,
CriterionName = t.TrialReadingCriterion.CriterionName,
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
SubjectCode = t.Subject.Code,
VisitName = (string?)t.SourceSubjectVisit.VisitName,
QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.SelectMany(c => new List<string>() { c.PicturePath, c.OtherPicturePath }).ToList(),
TableQuestionRowPictureList = t.LesionList.SelectMany(c => new List<string>() { c.PicturePath, c.OtherPicturePath }).ToList(),
IsJudgeSelect = t.JudgeResultTaskId == t.Id
}).FirstOrDefault();
return ResponseOutput.Ok(downloadInfo);
}
else
{
var downloadInfo = _trialRepository.Where(t => t.Id == inCommand.TrialId).Select(t => new
{
t.ResearchProgramNo,
VisitList = t.SubjectVisitList.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).Select(sv => new
{
TrialSiteCode = sv.TrialSite.TrialSiteCode,
SubjectCode = sv.Subject.Code,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Select(u => new
{
u.PatientId,
u.StudyTime,
u.StudyCode,
SeriesList = u.SeriesList.Select(z => new
{
z.Modality,
InstancePathList = z.DicomInstanceList.Select(k => new
{
k.Path
})
})
}),
NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new
{
nd.Modality,
nd.StudyCode,
nd.ImageDate,
FileList = nd.NoneDicomFileList.Select(file => new
{
file.FileName,
file.Path,
file.FileType
})
})
}).ToList()
}).FirstOrDefault();
return ResponseOutput.Ok(downloadInfo);
}
}
#endregion
#region