From d8b799f05782476fae27376688e1fdb40e7cb545 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 4 Dec 2025 15:21:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?uat-=E5=8F=91=E5=B8=83=E5=AF=BC=E8=A1=A8-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common/Export/IVUS_OCTExportService.cs | 224 +++++++++++------- 1 file changed, 144 insertions(+), 80 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs b/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs index 5d46e7704..5e824492a 100644 --- a/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs @@ -185,16 +185,16 @@ public class OctExportDto : IVUS_OCTBaseDto public string LAMAX { get; set; } /// 巨噬细胞浸润 - public string MACRI { get; set; } + public string PLAMACRI { get; set; } /// 巨噬细胞浸润角度 - public string MIARC { get; set; } + public string PLAMIARC { get; set; } /// 微通道 - public string MC { get; set; } + public string PLAMC { get; set; } /// 胆固醇结晶 - public string CCS { get; set; } + public string PLACCS { get; set; } } @@ -459,98 +459,162 @@ public class IVUS_OCTExportService(IRepository _r { pNoIndex++; - var findFct1 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.FirstFCT).FirstOrDefault(); - - if (findFct1 != null) + foreach (var lessionAnswer in fctLesion?.LessionAnswerList.Where(t => t.QuestionMark != QuestionMark.PlaqueNumber).OrderBy(t=>t.ShowOrder)) { - var oct = CreatOCT(task, pNo); + var mark = string.Empty; + switch (lessionAnswer.QuestionMark) + { + + case QuestionMark.FirstFCT: + mark = "FCTMV1"; + break; + case QuestionMark.SecondFCT: + mark = "FCTMV2"; + break; + case QuestionMark.ThirdFCT: + mark = "FCTMV3"; + break; + case QuestionMark.AvgFCT: + mark = "AVGFCT"; + break; + case QuestionMark.MacrophageInfiltration: + mark = "MACRI"; + break; + case QuestionMark.MacrophageExtensionAngle: + mark = "MIARC"; + break; + case QuestionMark.Microchannels: + mark = "MC"; + break; + case QuestionMark.CholesterolCrystallization: + mark = "CCS"; + break; + case QuestionMark.LumenArea: + mark = "LUMEN"; + break; - // 测量标识 + + } - oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; + if (mark.IsNotNullOrEmpty()) + { + var oct = CreatOCT(task, pNo); - // 测量参数名称 + // 测量标识 阅片人_斑块号_表格_行号 - oct.TESTCD = "FCTMV1"; + oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; - // 测量参数值 - oct.ORRES = findFct1?.QuestionValue ?? string.Empty; + // 测量参数名称 - // 测量值单位 - oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct1.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + oct.TESTCD = mark; - octList.Add(oct); + // 测量参数值 + oct.ORRES = lessionAnswer?.QuestionValue ?? string.Empty; + + // 测量值单位 + oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)lessionAnswer.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + + octList.Add(oct); + } } - var findFct2 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.SecondFCT).FirstOrDefault(); - - if (findFct2 != null) - { - var oct = CreatOCT(task, pNo); - - // 测量标识 - - oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; - - // 测量参数名称 - - oct.TESTCD = "FCTMV2"; - - // 测量参数值 - oct.ORRES = findFct2?.QuestionValue ?? string.Empty; - - // 测量值单位 - oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct2.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; - - octList.Add(oct); - } - - var findFct3 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.ThirdFCT).FirstOrDefault(); - - if (findFct3 != null) - { - var oct = CreatOCT(task, pNo); - - // 测量标识 - - oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; - - // 测量参数名称 - - oct.TESTCD = "FCTMV3"; - - // 测量参数值 - oct.ORRES = findFct3?.QuestionValue ?? string.Empty; - - // 测量值单位 - oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct3.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; - - octList.Add(oct); - } + #region 废弃 - var avgFct = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.AvgFCT).FirstOrDefault(); + //var findFct1 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.FirstFCT).FirstOrDefault(); - if (avgFct != null) - { - var oct = CreatOCT(task, pNo); + //if (findFct1 != null) + //{ + // var oct = CreatOCT(task, pNo); - // 测量标识 + // // 测量标识 - oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; + // oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; - // 测量参数名称 + // // 测量参数名称 - oct.TESTCD = "AVGFCT"; + // oct.TESTCD = "FCTMV1"; - // 测量参数值 - oct.ORRES = avgFct?.QuestionValue ?? string.Empty; + // // 测量参数值 + // oct.ORRES = findFct1?.QuestionValue ?? string.Empty; - // 测量值单位 - oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)avgFct.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + // // 测量值单位 + // oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct1.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; - octList.Add(oct); - } + // octList.Add(oct); + //} + + //var findFct2 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.SecondFCT).FirstOrDefault(); + + //if (findFct2 != null) + //{ + // var oct = CreatOCT(task, pNo); + + // // 测量标识 + + // oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; + + // // 测量参数名称 + + // oct.TESTCD = "FCTMV2"; + + // // 测量参数值 + // oct.ORRES = findFct2?.QuestionValue ?? string.Empty; + + // // 测量值单位 + // oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct2.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + + // octList.Add(oct); + //} + + //var findFct3 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.ThirdFCT).FirstOrDefault(); + + //if (findFct3 != null) + //{ + // var oct = CreatOCT(task, pNo); + + // // 测量标识 + + // oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; + + // // 测量参数名称 + + // oct.TESTCD = "FCTMV3"; + + // // 测量参数值 + // oct.ORRES = findFct3?.QuestionValue ?? string.Empty; + + // // 测量值单位 + // oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct3.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + + // octList.Add(oct); + //} + + + //var avgFct = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.AvgFCT).FirstOrDefault(); + + //if (avgFct != null) + //{ + // var oct = CreatOCT(task, pNo); + + // // 测量标识 + + // oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}"; + + // // 测量参数名称 + + // oct.TESTCD = "AVGFCT"; + + // // 测量参数值 + // oct.ORRES = avgFct?.QuestionValue ?? string.Empty; + + // // 测量值单位 + // oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)avgFct.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + + // octList.Add(oct); + //} + + #endregion } @@ -668,13 +732,13 @@ public class IVUS_OCTExportService(IRepository _r // 脂质角度最大值 oct.LAMAX = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MaxAvgLipidAngle).FirstOrDefault()?.QuestionValue ?? string.Empty; // 巨噬细胞浸润 - oct.MACRI = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageInfiltration).FirstOrDefault()?.QuestionValue ?? string.Empty; + oct.PLAMACRI = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageInfiltration).FirstOrDefault()?.QuestionValue ?? string.Empty; // 巨噬细胞浸润角度 - oct.MIARC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageExtensionAngle).FirstOrDefault()?.QuestionValue ?? string.Empty; + oct.PLAMIARC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageExtensionAngle).FirstOrDefault()?.QuestionValue ?? string.Empty; // 微通道 - oct.MC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.Microchannels).FirstOrDefault()?.QuestionValue ?? string.Empty; + oct.PLAMC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.Microchannels).FirstOrDefault()?.QuestionValue ?? string.Empty; // 胆固醇结晶 - oct.CCS = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.CholesterolCrystallization).FirstOrDefault()?.QuestionValue ?? string.Empty; + oct.PLACCS = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.CholesterolCrystallization).FirstOrDefault()?.QuestionValue ?? string.Empty; return oct; } From 476ca95aa33557bd501289cb779371c8ca20506f Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 5 Dec 2025 09:45:00 +0800 Subject: [PATCH 2/3] =?UTF-8?q?uat-=E9=A1=B9=E7=9B=AE=E5=BD=B1=E5=83=8F?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD-dir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helper/DicomDIRHelper.cs | 1 + .../ImageAndDoc/DownloadAndUploadService.cs | 89 ++++++++++++++++++- 2 files changed, 88 insertions(+), 2 deletions(-) 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 1b07f0daa..88be734c7 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -1944,6 +1944,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) @@ -2192,6 +2194,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, @@ -2206,14 +2274,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 }) }) @@ -2237,6 +2310,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); } From 1821d82ded12e439e28f286818ff3b0d558f9b10 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 5 Dec 2025 14:01:56 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=AD=E5=BF=83=E8=B0=83=E7=A0=94?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs b/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs index 24239eb23..5d23847f5 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/DTO/TrialSiteSurveyViewModel.cs @@ -140,7 +140,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsDeleted { get; set; } public Guid Id { get; set; } public Guid TrialId { get; set; } - public Guid TrialSiteId { get; set; } + public Guid? TrialSiteId { get; set; } public DateTime CreateTime { get; set; } public Guid CreateUserId { get; set; } public DateTime UpdateTime { get; set; }