diff --git a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs index 580154c9c..6defc237e 100644 --- a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs +++ b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs @@ -13,6 +13,7 @@ namespace IRaCIS.Core.Application.Helper public class StudyDIRInfo { + public Guid SubjectId { get; set; } public bool IsTaskStudy { get; set; } public Guid SubjectVisitId { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index e86f7d289..bcfc1079a 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -125,7 +125,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的 var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId) - .Select(t => new { t.IsReadingTaskViewInOrder, t.Trial.Modalitys,t.IsImageFilter,t.CriterionModalitys }).FirstNotNullAsync(); + .Select(t => new { t.IsReadingTaskViewInOrder, t.Trial.Modalitys, t.IsImageFilter, t.CriterionModalitys }).FirstNotNullAsync(); var subjectCode = string.Empty; var subjectId = inQuery.SubjectId; @@ -329,7 +329,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { foreach (var item in list) { - item.OrginalStudyList.AddRange(item.OriginalTaskStudyList.WhereIf(criterionInfo.IsImageFilter, t=>("|" + criterionInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))); + item.OrginalStudyList.AddRange(item.OriginalTaskStudyList.WhereIf(criterionInfo.IsImageFilter, t => ("|" + criterionInfo.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))); } } @@ -831,11 +831,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc //靶段标注删除访视影像 if (visitTaskId == Guid.Empty && subjectVisitId != null && subjectVisitId != Guid.Empty) { - var fisrtPath = await _taskInstanceRepository.Where(t => t.SubjectVisitId == subjectVisitId ).Select(t => t.Path).FirstOrDefaultAsync(); + var fisrtPath = await _taskInstanceRepository.Where(t => t.SubjectVisitId == subjectVisitId).Select(t => t.Path).FirstOrDefaultAsync(); var prefix = fisrtPath.Substring(1, fisrtPath.LastIndexOf('/') - 1); await _oSSService.DeleteFromPrefix(prefix, true); - await _taskStudyRepository.DeleteFromQueryAsync(t => t.SubjectVisitId == subjectVisitId ); + await _taskStudyRepository.DeleteFromQueryAsync(t => t.SubjectVisitId == subjectVisitId); await _taskSeriesRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId); await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == subjectVisitId); } @@ -1943,6 +1943,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var isExportReading = inCommand.IsExportReading == true; + var dirDic = new Dictionary(); + if (inCommand.IsKeyImage) { var downloadInfoList = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) @@ -2191,6 +2193,72 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc else { + #region 在下载前先处理DIR文件 + + //有传输语法值的导出 才生成DIR + if (_subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList.Where(t => isExportReading ? (t.IsReading && t.DicomSerie.IsReading) : true))).All(c => c.TransferSytaxUID != string.Empty)) + { + var dirInfolist = _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).SelectMany(t => t.StudyList) + .SelectMany(t => t.InstanceList.Where(t => isExportReading ? (t.IsReading && t.DicomSerie.IsReading) : true)) + .Select(t => new StudyDIRInfo() + { + SubjectId = t.SubjectId, + SubjectVisitId = t.SubjectVisitId, + + DicomStudyId = t.DicomStudy.Id, + + PatientId = t.DicomStudy.PatientId, + PatientName = t.DicomStudy.PatientName, + PatientBirthDate = t.DicomStudy.PatientBirthDate, + PatientSex = t.DicomStudy.PatientSex, + + StudyInstanceUid = t.StudyInstanceUid, + StudyId = t.DicomStudy.StudyId, + DicomStudyDate = t.DicomStudy.DicomStudyDate, + DicomStudyTime = t.DicomStudy.DicomStudyTime, + AccessionNumber = t.DicomStudy.AccessionNumber, + + StudyDescription = t.DicomStudy.Description, + + SeriesInstanceUid = t.DicomSerie.SeriesInstanceUid, + Modality = t.DicomSerie.Modality, + DicomSeriesDate = t.DicomSerie.DicomSeriesDate, + DicomSeriesTime = t.DicomSerie.DicomSeriesTime, + SeriesNumber = t.DicomSerie.SeriesNumber, + SeriesDescription = t.DicomSerie.Description, + + InstanceId = t.Id, + SopInstanceUid = t.SopInstanceUid, + SOPClassUID = t.SOPClassUID, + InstanceNumber = t.InstanceNumber, + MediaStorageSOPClassUID = t.MediaStorageSOPClassUID, + MediaStorageSOPInstanceUID = t.MediaStorageSOPInstanceUID, + TransferSytaxUID = t.TransferSytaxUID, + + }).ToList(); + + + + foreach (var item in dirInfolist.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId })) + { + var visitId = item.First().SubjectVisitId; + + var subjectId = item.First().SubjectId; + + + var ossFolder = $"{inCommand.TrialId}/Image/{subjectId}/{visitId}/{item.Key.StudyInstanceUid}"; + + var isSucess = await SafeBussinessHelper.RunAsync(async () => await DicomDIRHelper.GenerateStudyDIRAndUploadAsync(item.ToList(), dirDic, ossFolder, _oSSService)); + + if (isSucess) + { + await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new DicomStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" }); + } + } + } + + #endregion + var downloadInfo = _trialRepository.Where(t => t.Id == inCommand.TrialId).Select(t => new { t.ResearchProgramNo, @@ -2205,14 +2273,19 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc u.PatientId, u.StudyTime, u.StudyCode, + StudyDIRPath = u.StudyDIRPath, SeriesList = u.SeriesList.Where(t => isExportReading ? t.IsReading : true).Select(z => new { z.Modality, - InstancePathList = z.DicomInstanceList.Where(t => isExportReading ? t.IsReading : true).Select(k => new + InstanceList = z.DicomInstanceList.Where(t => isExportReading ? t.IsReading : true).Select(k => new DownloadDicomInstanceDto() { - k.Path + IsEncapsulated = k.IsEncapsulated, + InstanceId = k.Id, + FileName = string.Empty, + Path = k.Path, + FileSize = k.FileSize }) }) @@ -2236,6 +2309,18 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc }).FirstOrDefault(); + + + foreach (var item in downloadInfo.VisitList.SelectMany(t => t.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList))) + { + var key = item.InstanceId.ToString(); + if (dirDic.ContainsKey(key)) + { + item.FileName = dirDic[key]; + } + } + + return ResponseOutput.Ok(downloadInfo); }