diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index f72e57c79..942b2e096 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -546,6 +546,45 @@ namespace IRaCIS.Core.Application.Contracts } + public class TrialKeyImageExportDTO + { + public Guid Id { get; set; } + public string ResearchProgramNo { get; set; } + public string CriterionName { get; set; } + public ArbitrationRule ArbitrationRule { get; set; } + + public bool IsGlobalReading { get; set; } + + public List SubjectCriterionReadingPeriodVisitNumList { get; set; } + + public string TrialSiteCode { get; set; } + + public string VisitName { get; set; } + + public Decimal VisitTaskNum { get; set; } + + public string SubjectCode { get; set; } + + public Arm ArmEnum { get; set; } + + public Guid? JudgeResultTaskId { get; set; } + + public bool? IsTrigerJudge { get; set; } + public bool? IsJudgeSelect { get; set; } + + public ReadingCategory ReadingCategory { get; set; } + + + public List QuestionMarkPictureList { get; set; } + + public List TableQuestionRowPictureList { get; set; } + } + public class TrialKeyPicturePath + { + public string PicturePath { get; set; } + + public string OtherPicturePath { get; set; } + } public class TrialExportImageCommand { [NotDefault] diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index 71918706c..77a140e77 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -5,8 +5,10 @@ using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Service.ImageAndDoc.DTO; +using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infrastructure; using MassTransit; using MassTransit.Initializers; @@ -1013,7 +1015,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc InstancePathList = z.DicomInstanceList.Select(k => new { k.Path, - k.FileSize + k.FileSize }) }) @@ -1031,7 +1033,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc { file.FileName, file.Path, - file.FileType, + file.FileType, file.FileSize }) }) @@ -1260,30 +1262,246 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc if (inCommand.IsKeyImage) { - var downloadInfo = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.IsAnalysisCreate == false) + var downloadInfoList = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) + && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.IsAnalysisCreate == false) .Where(t => inCommand.SubjectVisitIdList.Contains((Guid)t.SourceSubjectVisitId)) - .Select(t => new + .Select(t => new TrialKeyImageExportDTO() { - t.Trial.ResearchProgramNo, + ResearchProgramNo = t.Trial.ResearchProgramNo, CriterionName = t.TrialReadingCriterion.CriterionName, + ArbitrationRule = t.TrialReadingCriterion.ArbitrationRule, + IsGlobalReading = t.TrialReadingCriterion.IsGlobalReading, + SubjectCriterionReadingPeriodVisitNumList = t.Subject.ReadModuleList + .Where(u => u.TrialReadingCriterionId == t.TrialReadingCriterionId && u.ReadingSetType == ReadingSetType.ImageReading).Select(c => c.SubjectVisit.VisitNum).ToList(), TrialSiteCode = t.Subject.TrialSite.TrialSiteCode, SubjectCode = t.Subject.Code, - VisitName = (string?)t.SourceSubjectVisit.VisitName, + + ReadingCategory = t.ReadingCategory, + + VisitName = t.ReadingCategory == ReadingCategory.Visit ? t.SourceSubjectVisit.VisitName : "", + + VisitTaskNum = t.VisitTaskNum, ArmEnum = t.ArmEnum, - QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.Select(c => new { c.PicturePath, c.OtherPicturePath }).ToList(), + QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(), - TableQuestionRowPictureList = t.LesionList.Select(c => new { c.PicturePath, c.OtherPicturePath }).ToList(), + TableQuestionRowPictureList = t.LesionList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(), + Id = t.Id, + //裁判选择结果 + JudgeResultTaskId = t.JudgeVisitTask.JudgeResultTaskId, - IsJudgeSelect = t.JudgeResultTaskId == t.Id + //是否触发裁判 + IsTrigerJudge = t.JudgeVisitTaskId != null, + + IsJudgeSelect = null }).ToList(); - return ResponseOutput.Ok(downloadInfo); + foreach (var subjectCriterionGroup in downloadInfoList.GroupBy(t => new { t.SubjectCode, t.CriterionName, t.ArbitrationRule, t.IsGlobalReading })) + { + var arbitrationRule = subjectCriterionGroup.Key.ArbitrationRule; + var isGlobalReading = subjectCriterionGroup.Key.IsGlobalReading; + + foreach (var item in subjectCriterionGroup) + { + if (arbitrationRule == ArbitrationRule.Visit) + { + //是否产生裁判 + + if (item.IsTrigerJudge == true) + { + //裁判做完了 + if (item.JudgeResultTaskId != null) + { + //裁判选择了自己,那么设置 + if (item.JudgeResultTaskId == item.Id) + { + item.IsJudgeSelect = true; + } + else + { + item.IsJudgeSelect = false; + } + } + + } + else + { + //没产生 且两个人做完了 默认R1 + + if (subjectCriterionGroup.Where(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode).Select(t => t.ArmEnum).Distinct().Count() == 2) + { + if (item.ArmEnum == Arm.DoubleReadingArm1) + { + item.IsJudgeSelect = true; + } + else + { + item.IsJudgeSelect = false; + } + } + + + } + + } + else if (arbitrationRule == ArbitrationRule.Reading) + { + + //阅片期访视号 + var subjectReadingPeriondVisitNumList = subjectCriterionGroup.FirstOrDefault()?.SubjectCriterionReadingPeriodVisitNumList; + + //两个人完成最大得任务号(访视+全局) + var subjectMaxFinishedTaskNum = subjectCriterionGroup.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max(); + + var addReadingPeriodNum = isGlobalReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : 0; + + //可能没有配置阅片期 ,或者配置了 没有完成 + var finishedGlobalCount = 0; + + var globalFinishedVisitTaskNumList = new List(); + + //没有配置阅片期 + if (subjectReadingPeriondVisitNumList == null) + { + finishedGlobalCount = 0; + } + { + globalFinishedVisitTaskNumList = subjectCriterionGroup.Where(t => subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum)) + .Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct() + .GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).ToList(); + + finishedGlobalCount = globalFinishedVisitTaskNumList.Count(); + + } + + if (finishedGlobalCount != 0) + { + //最大的完成的全局是否产生裁判 + + var maxFinishedGlobalNum = globalFinishedVisitTaskNumList.Max(); + + var globalMaxTask = subjectCriterionGroup.FirstOrDefault(t => t.VisitTaskNum == maxFinishedGlobalNum); + + // 触发了裁判 + if (globalMaxTask.IsTrigerJudge == true) + { + //最大裁判完成了 + + var maxJudgeVisitTaskNum = maxFinishedGlobalNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge]; + + if (globalMaxTask.JudgeResultTaskId != null) + { + + var maxJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == globalMaxTask.JudgeResultTaskId).FirstOrDefault().ArmEnum; + + if (item.VisitTaskNum < maxJudgeVisitTaskNum) + { + //触发裁判 + item.IsTrigerJudge = true; + + if (item.ArmEnum == maxJudgeArmEnum) + { + item.IsJudgeSelect = true; + } + //裁判没选择的人设置为false + else + { + item.IsJudgeSelect = false; + } + } + } + else + { + //最大的裁判未完成 + + //找到当前未阅最大裁判之前的已完成的最大裁判任务 + + var finishedGlobalFinishedMaxJudge = subjectCriterionGroup.Where(t => globalFinishedVisitTaskNumList.Contains(t.VisitTaskNum) && t.IsTrigerJudge == true && t.JudgeResultTaskId != null).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault(); + + + //未完成裁判之前 没有已完成的全局裁判 + if (finishedGlobalFinishedMaxJudge == null) + { + if (item.VisitTaskNum < maxJudgeVisitTaskNum) + { + item.IsTrigerJudge = true; + //item.IsJudgeSelect = null; + } + } + else + { + + + var maxFinishedJudgeVisitTaskNum = finishedGlobalFinishedMaxJudge.VisitTaskNum + +ReadingCommon.TaskNumDic[ReadingCategory.Judge]; + + var maxFinishedJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == finishedGlobalFinishedMaxJudge.JudgeResultTaskId).FirstOrDefault().ArmEnum; + + if (item.VisitTaskNum < maxFinishedJudgeVisitTaskNum) + { + item.IsTrigerJudge = true; + + if (item.ArmEnum == maxFinishedJudgeArmEnum) + { + item.IsJudgeSelect = true; + } + //裁判没选择的人设置为false + else + { + item.IsJudgeSelect = false; + } + } + else if (item.VisitTaskNum > maxFinishedJudgeVisitTaskNum && item.VisitTaskNum < maxJudgeVisitTaskNum) + { + //完成裁判 和未完成裁判之间的 裁判选择标记默认是null + + item.IsTrigerJudge = true; + } + else + { + //在未完成全局裁判之后的访视 未知 都是null + + item.IsTrigerJudge = null; + } + } + + + } + } + else + { + //最大的全局未产生裁判 + + if (item.VisitTaskNum <= maxFinishedGlobalNum) + { + item.IsTrigerJudge = false; + + if (item.ArmEnum == Arm.DoubleReadingArm1) + { + item.IsJudgeSelect = true; + + } + else + { + item.IsJudgeSelect = false; + } + } + } + } + + + } + + } + + } + + downloadInfoList = downloadInfoList.Where(t => t.ReadingCategory == ReadingCategory.Visit).ToList(); + return ResponseOutput.Ok(downloadInfoList); } else {