From 26f1a2b8ee37a80e504c57fef98a70247c1e1f60 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 11:12:32 +0800 Subject: [PATCH 1/6] =?UTF-8?q?DIR=20=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BC=96=E5=8F=B7=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/ImageAndDoc/DownloadAndUploadService.cs | 13 +++++++------ IRaCIS.Core.Domain/Image/DicomInstance.cs | 4 ++++ IRaCIS.Core.Domain/Image/DicomStudy.cs | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index d5ff743d4..a8cdf55a3 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -1137,6 +1137,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var dirDic = new Dictionary(); #region DIR处理导出文件名,并将对应关系上传到OSS里面存储 + var info = await _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).Select(t => new { t.Trial.TrialCode }).FirstOrDefaultAsync(); + //有传输语法值的导出 才生成DIR if (_subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty)) { @@ -1148,7 +1150,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc DicomStudyId = t.DicomStudy.Id, - PatientId = t.DicomStudy.PatientId, + PatientId = info.TrialCode + "-" + t.DicomStudy.PatientId, PatientName = t.DicomStudy.PatientName, PatientBirthDate = t.DicomStudy.PatientBirthDate, PatientSex = t.DicomStudy.PatientSex, @@ -1508,7 +1510,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public async Task GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery) { var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId) - .Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.TrialId, t.IsReadingTaskViewInOrder }).FirstNotNullAsync(); + .Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.TrialId, t.IsReadingTaskViewInOrder, t.Trial.TrialCode }).FirstNotNullAsync(); var isQueryDicom = inQuery.DicomStudyIdList.Count > 0; var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0; @@ -1539,7 +1541,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc DicomStudyId = t.DicomStudy.Id, - PatientId = t.DicomStudy.PatientId, + PatientId = info.TrialCode + "-" + t.DicomStudy.PatientId, PatientName = t.DicomStudy.PatientName, PatientBirthDate = t.DicomStudy.PatientBirthDate, PatientSex = t.DicomStudy.PatientSex, @@ -1579,7 +1581,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc DicomStudyId = t.TaskStudy.Id, - PatientId = t.TaskStudy.PatientId, + PatientId = info.TrialCode + "-" + t.TaskStudy.PatientId, PatientName = t.TaskStudy.PatientName, PatientBirthDate = t.TaskStudy.PatientBirthDate, PatientSex = t.TaskStudy.PatientSex, @@ -2248,7 +2250,6 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } else { - #region 在下载前先处理DIR文件 //有传输语法值的导出 才生成DIR @@ -2263,7 +2264,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc DicomStudyId = t.DicomStudy.Id, - PatientId = t.DicomStudy.PatientId, + PatientId = t.Trial.TrialCode + "-" + t.DicomStudy.PatientId, PatientName = t.DicomStudy.PatientName, PatientBirthDate = t.DicomStudy.PatientBirthDate, PatientSex = t.DicomStudy.PatientSex, diff --git a/IRaCIS.Core.Domain/Image/DicomInstance.cs b/IRaCIS.Core.Domain/Image/DicomInstance.cs index ad2cdc3c1..7f2615629 100644 --- a/IRaCIS.Core.Domain/Image/DicomInstance.cs +++ b/IRaCIS.Core.Domain/Image/DicomInstance.cs @@ -13,6 +13,10 @@ public class DicomInstance : BaseFullDeleteAuditEntity, IEntitySeqId [ForeignKey("StudyId")] public DicomStudy DicomStudy { get; set; } + [JsonIgnore] + [ForeignKey("TrialId")] + public Trial Trial { get; set; } + [JsonIgnore] public List ReadingTableAnswerRowInfoList { get; set; } #endregion diff --git a/IRaCIS.Core.Domain/Image/DicomStudy.cs b/IRaCIS.Core.Domain/Image/DicomStudy.cs index e625c6e1f..5bee7fab7 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudy.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudy.cs @@ -21,6 +21,7 @@ public class DicomStudy : BaseFullDeleteAuditEntity, IEntitySeqId [ForeignKey("SubjectVisitId")] public SubjectVisit SubjectVisit { get; set; } + [JsonIgnore] public List ReadingClinicalDataList { get; set; } From af333e72f5af3523cd88834fe3304b003553e123 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 11:44:58 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B5=8B=E8=AF=95dir=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D\=E6=9B=BF=E6=8D=A2=E4=B8=BA/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Helper/DicomDIRHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs index 6defc237e..4b9e83b9a 100644 --- a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs +++ b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs @@ -100,7 +100,7 @@ namespace IRaCIS.Core.Application.Helper var dicomFile = new DicomFile(dataset); // 文件名递增格式:IM_00001, IM_00002, ... - string filename = $@"IMAGE/IM_{index:D5}"; // :D5 表示补足5位 + string filename = $@"IMAGE\IM_{index:D5}"; // :D5 表示补足5位 mappings.Add($"{filename} => {item.InstanceId}"); From 9a31e04fadc485811922b972b2cbd65b29eda479 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 13:22:26 +0800 Subject: [PATCH 3/6] =?UTF-8?q?linux=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=20/=20\=20=E5=AF=B9=E4=BA=8E=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E7=9A=84=E5=BD=B1=E5=93=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Helper/DicomDIRHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs index 4b9e83b9a..96de86624 100644 --- a/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs +++ b/IRaCIS.Core.Application/Helper/DicomDIRHelper.cs @@ -104,7 +104,7 @@ namespace IRaCIS.Core.Application.Helper mappings.Add($"{filename} => {item.InstanceId}"); - dic.Add(item.InstanceId.ToString(), Path.GetFileName(filename)); + dic.Add(item.InstanceId.ToString(), filename.TrimEnd('/', '\\').Split('/', '\\').Last()); dicomDir.AddFile(dicomFile, filename); From 4aecfb3bed603da724637e941204461290ba4e63 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 17:06:39 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E8=A1=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 2 +- .../TrialSiteUser/DTO/TrialStatViewModel.cs | 33 ++++++- .../Service/TrialSiteUser/TrialStatService.cs | 92 ++++++++++++++++--- 3 files changed, 110 insertions(+), 17 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 2bbfe2ad7..731955b54 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -15707,7 +15707,7 @@ - 删除某个目录的文件 + 删除某个目录的文件 (包含单个文件,oss单个文件需要去除前缀/) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs index 1244fe508..b0df38be2 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs @@ -91,17 +91,48 @@ namespace IRaCIS.Core.Application.ViewModel public Guid? TrialSiteId { get; set; } } + public class FirstPdInfo + { + public string SubjectCode { get; set; } + + public DateTime? EarliestScanDate { get; set; } + + public DateTime? BaseLineLatestScanDate { get; set; } + + + // 新增属性:天数差 + public double? DaysDiff + { + get + { + if (BaseLineLatestScanDate.HasValue && EarliestScanDate.HasValue) + { + return (EarliestScanDate.Value - BaseLineLatestScanDate.Value).TotalDays; + } + return null; + } + } + } + public class EfficacyEvaluationStatViewModel { public string? DictionaryCode { get; set; } + + public string Code { get; set; } public string OverallTumorEvaluation { get; set; } - public int SubjectCount { get; set; } + public int SubjectCount => SubjectCodeList.Count(); + + public List SubjectCodeList { get; set; } } public class EfficacyEvaluationExport { + public DateTime? EarliestScanDate { get; set; } + + public DateTime? LatestScanDate { get; set; } + public Guid Id { get; set; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs index b5b7b15db..3eb13abe8 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs @@ -113,18 +113,18 @@ public class TrialStatService( /// /// [HttpPost] - public async Task> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery) + public async Task>> GetTrialEfficacyEvaluationStatList(EfficacyEvaluationQuery inQuery) { var trialReadingCriterionId = inQuery.TrialReadingCriterionId; //每次查询必须是单标准的 - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule,t.TrialId }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule, t.TrialId }).FirstNotNullAsync(); if (criterion.CriterionGroup == CriterionGroup.Nontumorous) { - return new List(); + return ResponseOutput.Ok(new List()); } @@ -132,15 +132,18 @@ public class TrialStatService( if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC) { - questionType = QuestionType.Tumor; - + //iresist pfs 是icpd } - else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + else if (criterion.CriterionType == CriterionType.Lugano2014) { questionType = QuestionType.ImgOncology; } + else if (criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + { + questionType = QuestionType.CTandMRI; + } else if (criterion.CriterionType == CriterionType.PCWG3) { @@ -164,6 +167,8 @@ public class TrialStatService( ReadingCategory = t.ReadingCategory, ArmEnum = t.ArmEnum, JudgeArmEnum = t.JudgeResultTask.ArmEnum, + LatestScanDate = t.SourceSubjectVisit.LatestScanDate, + EarliestScanDate = t.SourceSubjectVisit.EarliestScanDate, IsTrigerJudge = criterion.ArbitrationRule == ArbitrationRule.Visit ? t.JudgeVisitTaskId != null : (criterion.ArbitrationRule == ArbitrationRule.Reading ? @@ -176,7 +181,7 @@ public class TrialStatService( DictionaryCode = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).Select(t => t.ReadingQuestionTrial.DictionaryCode).FirstOrDefault(), //整体肿瘤评估答案 - OverallTumorEvaluation = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).FirstOrDefault()!.Answer + OverallTumorEvaluation = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == questionType).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault() }); @@ -201,6 +206,24 @@ public class TrialStatService( //处理裁判标记 list = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, list); + //基线(最晚拍片日期)-首次PD(所有触发PD的病灶的检查的最早拍片日期)的中位数,单位是天 + + // 构建字典:SubjectCode -> LatestScanDate + var baseLineDict = list.Where(t => t.VisitTaskNum == 0).GroupBy(t => t.SubjectCode) + .ToDictionary( + g => g.Key, + g => g.First().LatestScanDate // 如果同一个 SubjectCode 有多条记录,只取第一条 + ); + + //一定要两个人做完了,产生了裁判并且有结果的,否则就不算,并且排除基线 + list = list.Where(t => t.IsJudgeSelect == true && t.VisitTaskNum != 0 && t.ReadingCategory==ReadingCategory.Visit)//全局的答案已经放在对应访视上了 + .GroupBy(t => t.SubjectCode).Select(g => g.OrderByDescending(t => t.VisitTaskNum).First()).ToList(); + + + //总subject 数量 + var totalSubjectCount = list.Select(t => t.SubjectId).Distinct().Count(); + + //判断subject的逻辑需要确认,这么多次访视任务,有的符合,有的不符合,准则是什么? @@ -208,30 +231,69 @@ public class TrialStatService( { DictionaryCode = g.FirstOrDefault()?.DictionaryCode, OverallTumorEvaluation = g.Key, - SubjectCount = g.Select(t => t.SubjectId).Distinct().Count() + Code = g.Key, + SubjectCodeList = g.Select(t => t.SubjectCode).Distinct().ToList() }).ToList(); // 先把 resultList 转成内存字典 - var resultDict = resultList.ToDictionary(r => r.OverallTumorEvaluation, r => r.SubjectCount); + var resultDict = resultList.ToDictionary(r => r.OverallTumorEvaluation, r => r.SubjectCodeList); // 查询字典表,先把数据拉出来到内存,再合并 - var dicList = _dictionaryRepository + var translateList = _dictionaryRepository .Where(t => t.Parent.Code == dicName) .Select(t => new { - t.Code + t.Code, + t.Value, }) - .ToList() + .ToList() .Select(t => new EfficacyEvaluationStatViewModel { DictionaryCode = dicName, - OverallTumorEvaluation = t.Code, - SubjectCount = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : 0 + Code = t.Code, //方便找到首次PD的日期 + OverallTumorEvaluation = t.Value,//翻译后的值 + SubjectCodeList = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : new List() }) .ToList(); - return dicList; + // (cr +pr) /总人数 + + var crAddPr = translateList.Where(t => t.OverallTumorEvaluation == "PR" || t.OverallTumorEvaluation == "CR").Sum(t => t.SubjectCount); + + var orrPercent = totalSubjectCount > 0 + ? ((decimal)crAddPr / totalSubjectCount * 100).ToString("0.00") + "%" + : "0.00%"; + + var pdInfo = translateList + .WhereIf(criterion.CriterionType == CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "ICPD") + .WhereIf(criterion.CriterionType == CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "PD") + .FirstOrDefault(); + + var firstPdList = new List(); + if (pdInfo != null) + { + firstPdList = list.Where(t => t.OverallTumorEvaluation == pdInfo.Code).GroupBy(t => t.SubjectCode) + .Select(g => new FirstPdInfo + { + SubjectCode = g.Key, + EarliestScanDate = g.Where(t => t.OverallTumorEvaluation == pdInfo.Code).OrderBy(t => t.VisitTaskNum).First().EarliestScanDate + }) + .ToList(); + + foreach (var item in firstPdList) + { + if (baseLineDict.TryGetValue(item.SubjectCode, out var latestScanDate)) + { + item.BaseLineLatestScanDate = latestScanDate; + } + } + + + } + + + return ResponseOutput.Ok(translateList, new { PDList = firstPdList, ORR = orrPercent }); } From 12a0f7ad82dde1138e997c9d4f6b5cba981957c0 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 17:30:02 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=80=E5=9B=9E?= =?UTF-8?q?=E8=BF=87=E6=BB=A4-ivus-=E9=9D=B6=E6=AE=B5=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImageAndDoc/DownloadAndUploadService.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index a8cdf55a3..648a31570 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -159,7 +159,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc if (inQuery.IsImageSegmentLabel == true) { - var querySV = _subjectVisitRepository.WhereIf(inQuery.SubjectVisitId != null, t => t.Id == inQuery.SubjectVisitId) + var querySV = _subjectVisitRepository.Where(t => t.CheckState == CheckStateEnum.CVPassed) + .WhereIf(inQuery.SubjectVisitId != null, t => t.Id == inQuery.SubjectVisitId) .WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId) .Select(u => new SubjectVisitMarkUploadDto() { @@ -230,7 +231,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisitId != null + var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect) //满足 有序,或者随机只看到当前任务的dicom 非dicom检查 .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId) @@ -989,7 +990,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc - var list = _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId) + var list = _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId && t.SubjectVisit.CheckState == CheckStateEnum.CVPassed) .WhereIf(inQuery.SubjectVisitId != null, t => t.SubjectVisitId == inQuery.SubjectVisitId) //.WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|")) .Select(u => new TaskNoneDicomStudyDTO() @@ -1047,7 +1048,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc else { var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId - && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect) + && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect) //满足 有序,或者随机只看到当前任务的dicom 非dicom检查 .WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId) join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|")) @@ -1528,7 +1529,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc #region 在下载前先处理DIR文件 //有传输语法值的导出 才生成DIR - if (_subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty)) + if (_subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty)) { var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList) .Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false) @@ -1644,7 +1645,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc #endregion - var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))) + var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id) && t.CheckState == CheckStateEnum.CVPassed)) //一致性分析,导致查询出来两条数据 join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id)) on sv.Id equals visitTask.SourceSubjectVisitId into cc from leftVisitTask in cc.DefaultIfEmpty() @@ -2407,16 +2408,16 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc SubjectCode = t.Code, IsUrgent = t.IsUrgent, - VisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(), + VisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(), - MarkIVUSVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "IVUS").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()), + MarkIVUSVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "IVUS").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()), - MarkOCTVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "OCT").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()), + MarkOCTVisitCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).Count(t => t.NoneDicomStudyList.Where(t => t.Modality == "OCT").SelectMany(c => c.ImageLabelNoneDicomFileList).Any()), - DicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.StudyList).Count(), + DicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.StudyList).Count(), //MarkDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.TaskStudyList).Count(), - NoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Count(), + NoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.CheckState == CheckStateEnum.CVPassed).SelectMany(t => t.NoneDicomStudyList).Count(), //MarkNoneDicomStudyCount = t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted).SelectMany(t => t.NoneDicomStudyList).Where(t => t.ImageLabelNoneDicomFileList.Any()).Count(), }).ToPagedListAsync(inQuery); From a252142cefab789cd0c3cdf8af311999d49a1f3a Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 19 Dec 2025 17:40:36 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=88=97=E8=A1=A8-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/ImageAndDoc/DownloadAndUploadService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index 648a31570..900e69687 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -1332,7 +1332,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc if (inQuery.IsImageSegmentLabel == true) { - var list = await _subjectVisitRepository + var list = await _subjectVisitRepository.Where(t => t.CheckState == CheckStateEnum.CVPassed) .WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); @@ -1407,7 +1407,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId - && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId) + && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.DoctorUserId == doctorUserId) //满足 有序,或者随机只看到当前任务的dicom 非dicom检查 .WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的 .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)