From c62e7b13a906adfae978d59e7059962ebd9c4e94 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 20 Jun 2025 14:25:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=90=9C=E7=B4=A2=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 12 +- .../DTO/TrialEmailNoticeConfigViewModel.cs | 4 +- .../Document/TrialEmailNoticeConfigService.cs | 464 +++++++++++++----- 3 files changed, 365 insertions(+), 115 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 2259a73af..c6ce61664 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1577,9 +1577,19 @@ + + + 获取入组结果 + + + + + + + - + 获取PD 结果 任务Id 任务类型 diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs index c1915fd5a..8eecea96b 100644 --- a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs @@ -99,7 +99,7 @@ namespace IRaCIS.Core.Application.ViewModel public EmailBusinessScenario? BusinessScenarioEnum { get; set; } - //public CriterionType? CriterionTypeEnum { get; set; } + public CriterionType? CriterionTypeEnum { get; set; } public Guid? TrialReadingCriterionId { get; set; } @@ -197,6 +197,8 @@ namespace IRaCIS.Core.Application.ViewModel [Comment("邮件配置的多个标准")] public List? CriterionTypeList { get; set; } + public bool IsDistinguishCriteria { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 60a1de26e..dacd08e01 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -4,11 +4,13 @@ // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- +using Amazon.Runtime; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.MassTransit.Consumer; +using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share.Common; @@ -125,20 +127,20 @@ namespace IRaCIS.Core.Application.Service /// /// /// - private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isHandSend, string pdAnswer, List taskIdList, List minUserIdList) + private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isHandSend, string answer, List taskIdList, List minUserIdList) { var isNeedSend = true; //手动发送的时候,也有可能答案是是 此时是 这里不发送,发送已经生成的文件 - if (pdAnswer == "是" && isHandSend == null) + if (answer == "是" && isHandSend == null) { isNeedSend = true; } else { - //正常阅片为否的 + //正常阅片自动发送,阅片为否的产生医学审核 if (isHandSend == null) { isNeedSend = false; @@ -161,12 +163,12 @@ namespace IRaCIS.Core.Application.Service } else if (isHandSend == true) { - //手动发送 + //医学审核手动发送 isNeedSend = false; } else { - // 医学审核确认未否了 才发 + // 医学审核自动发送 isNeedSend = true; } } @@ -175,6 +177,8 @@ namespace IRaCIS.Core.Application.Service } + + /// /// 测试邮件 带附件 填充word /// @@ -306,7 +310,7 @@ namespace IRaCIS.Core.Application.Service { #region 不同标准 不同项目配置 发送邮件的时机 处理具体逻辑 - var answer = _userInfo.IsEn_Us ? "No" : "否"; + var answer = string.Empty; var isNeedSend = true; var minUserIdList = _trialUserRoleRepository.Where(t => t.UserRole.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId == taskInfo.TrialId).Select(t => t.UserId).ToList(); @@ -315,11 +319,7 @@ namespace IRaCIS.Core.Application.Service //入组确认 根据每个标准配置的是否自动发送,发送邮件与否 if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed) { - if (await _readingTableQuestionAnswerRepository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && - x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) - { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; - } + //如果其他阅片人已经做了,说明发送了入组确认报告,第二个人做完就不发送了 @@ -336,22 +336,11 @@ namespace IRaCIS.Core.Application.Service } else { + bool isEnroll = false; + + (answer, isEnroll) = await DealEnrollAnswer(visitTaskId, (Guid)taskInfo.SourceSubjectVisitId, taskInfo.CriterionType, taskInfo.TrialReadingCriterionId); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); - - - if (answer == "是" || answer == "Yes") - { - //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) - var urgent = _subjectVisitRepository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); - - if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) - { - await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && - t.Id != visitTaskId && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId, u => new VisitTask() { IsUrgent = false }); - } - } - - } } else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed) @@ -1052,7 +1041,96 @@ namespace IRaCIS.Core.Application.Service } /// - /// + /// 获取入组结果 + /// + /// + /// + /// + /// + /// + private async Task<(string enrollAnswer, bool isEnroll)> DealEnrollAnswer(Guid visitTaskId, Guid subjectVisitId, CriterionType criterionType, Guid trialReadingCriterionId) + { + + var enrollAnswer = string.Empty; + var isEnroll = false; + + switch (criterionType) + { + + case CriterionType.RECIST1Point1: + case CriterionType.RECIST1Pointt1_MB: + case CriterionType.IRECIST1Point1: + case CriterionType.mRECISTHCC: + + case CriterionType.Lugano2014: + case CriterionType.Lugano2014WithoutPET: + + if (await _readingTableQuestionAnswerRepository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && + x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) + { + enrollAnswer = _userInfo.IsEn_Us ? "Yes" : "是"; + } + + break; + + case CriterionType.PCWG3: + break; + + case CriterionType.RANO_BM: + break; + case CriterionType.RANO: + break; + case CriterionType.IWCLL2018: + break; + + case CriterionType.Cheson2007: + break; + case CriterionType.IMWG2016: + break; + + case CriterionType.mRECISTMesothelioma: + break; + case CriterionType.RECIL: + break; + case CriterionType.RECIST1Point0: + break; + case CriterionType.WHO: + break; + case CriterionType.PERCIST: + break; + case CriterionType.Forrest: + break; + + case CriterionType.IVUS: + break; + case CriterionType.OCT: + break; + case CriterionType.MRIPDFF: + break; + case CriterionType.NoCriterion: + break; + case CriterionType.SelfDefine: + break; + default: + break; + } + + if (enrollAnswer == "是" || enrollAnswer == "Yes") + { + //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) + var urgent = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); + + if (urgent?.IsUrgent == false || urgent?.IsSubjectUrgent == false) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SourceSubjectVisitId == subjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && + t.Id != visitTaskId && t.TrialReadingCriterionId == trialReadingCriterionId, u => new VisitTask() { IsUrgent = false }); + } + } + return (enrollAnswer, isEnroll); + } + + /// + /// 获取PD 结果 /// /// 任务Id /// 任务类型 @@ -1067,95 +1145,237 @@ namespace IRaCIS.Core.Application.Service ReadingTaskQuestionAnswer visitQuestionAnswer = null; - ReadingTaskQuestionAnswer globalQuestionAnswer = null; + ReadingGlobalTaskInfo readingGlobalTaskInfo = null; + if (readingCategory == ReadingCategory.Visit) + { + + + switch (criterionType) + { + + + case CriterionType.RECIST1Point1: + case CriterionType.RECIST1Pointt1_MB: + case CriterionType.IRECIST1Point1: + case CriterionType.mRECISTHCC: + + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); + + answer = visitQuestionAnswer.Answer; + + break; + + case CriterionType.Lugano2014: + + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.ImgOncology).FirstNotNullAsync(); + + answer = visitQuestionAnswer.Answer; + + break; + + case CriterionType.Lugano2014WithoutPET: + + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.CTandMRI).FirstNotNullAsync(); + + answer = visitQuestionAnswer.Answer; + + break; + + case CriterionType.PCWG3: + + visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + + answer = visitQuestionAnswer.Answer; + + break; + + case CriterionType.SelfDefine: + case CriterionType.mRECISTMesothelioma: + case CriterionType.RECIL: + case CriterionType.RECIST1Point0: + case CriterionType.WHO: + case CriterionType.PERCIST: + case CriterionType.Forrest: + + case CriterionType.RANO_BM: + case CriterionType.RANO: + case CriterionType.IWCLL2018: + case CriterionType.Cheson2007: + case CriterionType.IMWG2016: + default: + + //---该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充 + throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDLogicNotDefined"]); + } + + + + } + else if (readingCategory == ReadingCategory.Global) + { + switch (criterionType) + { + + case CriterionType.RECIST1Point1: + case CriterionType.RECIST1Pointt1_MB: + case CriterionType.IRECIST1Point1: + case CriterionType.mRECISTHCC: + + readingGlobalTaskInfo = await _readingGlobalTaskInfoRepository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.Tumor).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); + + answer = readingGlobalTaskInfo.Answer; + if (string.IsNullOrEmpty(readingGlobalTaskInfo.Answer)) + { + answer = await _readingTaskQuestionAnswerRepository.Where(t => readingGlobalTaskInfo.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor) + .Select(t => t.Answer).FirstOrDefaultAsync(); + } + + break; + + case CriterionType.Lugano2014: + + readingGlobalTaskInfo = await _readingGlobalTaskInfoRepository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.ImgOncology).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); + + answer = readingGlobalTaskInfo.Answer; + if (string.IsNullOrEmpty(readingGlobalTaskInfo.Answer)) + { + answer = await _readingTaskQuestionAnswerRepository.Where(t => readingGlobalTaskInfo.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.ImgOncology) + .Select(t => t.Answer).FirstOrDefaultAsync(); + } + + break; + case CriterionType.Lugano2014WithoutPET: + + readingGlobalTaskInfo = await _readingGlobalTaskInfoRepository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.CTandMRI).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); + + answer = readingGlobalTaskInfo.Answer; + if (string.IsNullOrEmpty(readingGlobalTaskInfo.Answer)) + { + answer = await _readingTaskQuestionAnswerRepository.Where(t => readingGlobalTaskInfo.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.CTandMRI) + .Select(t => t.Answer).FirstOrDefaultAsync(); + } + + break; + + case CriterionType.PCWG3: + var questionAnsewer = await _readingGlobalTaskInfoRepository.Where(t => t.TaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); + + answer = questionAnsewer.Answer; + + break; + + + + case CriterionType.RANO_BM: + break; + case CriterionType.RANO: + break; + case CriterionType.IWCLL2018: + break; + case CriterionType.Cheson2007: + break; + case CriterionType.IMWG2016: + break; + + case CriterionType.mRECISTMesothelioma: + break; + case CriterionType.RECIL: + break; + case CriterionType.RECIST1Point0: + break; + case CriterionType.WHO: + break; + case CriterionType.PERCIST: + break; + case CriterionType.Forrest: + break; + + case CriterionType.IVUS: + break; + case CriterionType.OCT: + break; + case CriterionType.MRIPDFF: + break; + case CriterionType.NoCriterion: + break; + case CriterionType.SelfDefine: + break; + default: + break; + } + + } + else + { + //---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑 + throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]); + } + + switch (criterionType) { - case CriterionType.RECIST1Point1: + case CriterionType.RECIST1Pointt1_MB: + case CriterionType.mRECISTHCC: - if (readingCategory == ReadingCategory.Visit) - { - - visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); - - - answer = visitQuestionAnswer.Answer; - } - else if (readingCategory == ReadingCategory.Global) - { - var questionAnsewer = await _readingGlobalTaskInfoRepository.Where(t => t.GlobalTaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.Tumor).OrderByDescending(c => c.VisitTask.VisitTaskNum).FirstNotNullAsync(); - - - answer = questionAnsewer.Answer; - if (string.IsNullOrEmpty(questionAnsewer.Answer)) - { - answer = await _readingTaskQuestionAnswerRepository.Where(t => questionAnsewer.TaskId == t.VisitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor) - .Select(t => t.Answer).FirstOrDefaultAsync(); - } - - } - //else if (readingCategory == ReadingCategory.Judge) - //{ - // var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - - // var questionAnsewer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == judgeResultTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstNotNullAsync(); - - - // answer = questionAnsewer.Answer; - //} - else - { - //---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑 - throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]); - } if (answer == OverallAssessment.PD.GetEnumInt()) { - answer = "是"; + answer = _userInfo.IsEn_Us ? "Yes" : "是"; } else { - answer = "否"; + answer = _userInfo.IsEn_Us ? "No" : "否"; + } + + break; + case CriterionType.IRECIST1Point1: + + if (answer == OverallAssessment.iCPD.GetEnumInt()) + { + answer = _userInfo.IsEn_Us ? "Yes" : "是"; + } + else + { + answer = _userInfo.IsEn_Us ? "No" : "否"; + } + + break; + case CriterionType.Lugano2014: + + if (answer == ImagingOverallAssessment_Lugano.PMDPD.GetEnumInt()) + { + answer = _userInfo.IsEn_Us ? "Yes" : "是"; + } + else + { + answer = _userInfo.IsEn_Us ? "No" : "否"; + } + + break; + + case CriterionType.Lugano2014WithoutPET: + + if (answer == CTMRIOverallAssessment.PD.GetEnumInt()) + { + answer = _userInfo.IsEn_Us ? "Yes" : "是"; + } + else + { + answer = _userInfo.IsEn_Us ? "No" : "否"; } break; case CriterionType.PCWG3: - if (readingCategory == ReadingCategory.Visit) - { - - visitQuestionAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); - - - answer = visitQuestionAnswer.Answer; - } - else if (readingCategory == ReadingCategory.Global) - { - var questionAnsewer = await _readingGlobalTaskInfoRepository.Where(t => t.TaskId == visitTaskId && t.TrialReadingQuestion.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); - - answer = questionAnsewer.Answer; - } - //else if (readingCategory == ReadingCategory.Judge) - //{ - // //var judgeResultTaskId = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.JudgeResultTaskId).FirstNotNullAsync(); - - // var questionAnsewer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTaskId && t.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstNotNullAsync(); - - // answer = questionAnsewer.Answer; - //} - else - { - //---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑 - throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]); - } if (answer == VisitTumorEvaluation.PD.GetEnumInt()) { - answer = "是"; + answer = _userInfo.IsEn_Us ? "Yes" : "是"; } if (answer == VisitTumorEvaluation.ND.GetEnumInt()) { @@ -1167,32 +1387,50 @@ namespace IRaCIS.Core.Application.Service } else { - answer = "否"; + answer = _userInfo.IsEn_Us ? "No" : "否"; } break; - case CriterionType.SelfDefine: - case CriterionType.mRECISTMesothelioma: - case CriterionType.RECIL: - case CriterionType.RECIST1Point0: - case CriterionType.WHO: - case CriterionType.PERCIST: - case CriterionType.Forrest: - case CriterionType.Lugano2014: - case CriterionType.IRECIST1Point1: + + case CriterionType.RANO_BM: + break; case CriterionType.RANO: + break; case CriterionType.IWCLL2018: - case CriterionType.mRECISTHCC: + break; + case CriterionType.Cheson2007: + break; case CriterionType.IMWG2016: + break; + + case CriterionType.mRECISTMesothelioma: + break; + case CriterionType.RECIL: + break; + case CriterionType.RECIST1Point0: + break; + case CriterionType.WHO: + break; + case CriterionType.PERCIST: + break; + case CriterionType.Forrest: + break; + + case CriterionType.IVUS: + break; + case CriterionType.OCT: + break; + case CriterionType.MRIPDFF: + break; + case CriterionType.NoCriterion: + break; + case CriterionType.SelfDefine: + break; default: - - //---该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充 - throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDLogicNotDefined"]); + break; } - - return answer; @@ -1386,9 +1624,9 @@ namespace IRaCIS.Core.Application.Service var trialConfig = _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.IsEnrollementQualificationConfirm, t.IsPDProgressView }).First(); var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == inQuery.TrialId) - .WhereIf(inQuery.IsDistinguishCriteria == false, t => t.TrialReadingCriterionId == null) - .WhereIf(inQuery.IsDistinguishCriteria == true, t => t.CriterionTypeEnum != null) - .WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) + .WhereIf(inQuery.IsDistinguishCriteria == false, t => t.IsDistinguishCriteria == false) + .WhereIf(inQuery.IsDistinguishCriteria == true, t => t.IsDistinguishCriteria == true) + .WhereIf(inQuery.CriterionTypeEnum != null, t => t.CriterionTypeList.Any(c=>c==inQuery.CriterionTypeEnum)) .WhereIf(inQuery.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == inQuery.BusinessScenarioEnum) .WhereIf(inQuery.EmailUrgentEnum != null, t => t.EmailUrgentEnum == inQuery.EmailUrgentEnum) .WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)