diff --git a/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs index 54ed5e74..4fb10d3e 100644 --- a/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/Interface/ITrialEmailNoticeConfigService.cs @@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Interfaces Task DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId); - Task BaseBusinessScenarioSendEmailAsync( Guid visitTaskId); + Task BaseBusinessScenarioSendEmailAsync( Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading = null); } } diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index eef5e204..0ba787b5 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -28,19 +28,23 @@ namespace IRaCIS.Core.Application.Service { private readonly IRepository _trialEmailNoticeConfigRepository; + private readonly IRepository _trialRepository; + private readonly IRepository _taskMedicalReviewRepository; + public IRepository _visitTaskRepository { get; } public IRepository _trialUserRepository { get; } public TrialEmailNoticeConfigService(IRepository trialEmailNoticeConfigRepository, IRepository visitTaskRepository, IRepository trialRepository, - IRepository trialUserRepository) + IRepository trialUserRepository, IRepository taskMedicalReviewRepository) { _trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository; _visitTaskRepository = visitTaskRepository; this._trialRepository = trialRepository; _trialUserRepository = trialUserRepository; + _taskMedicalReviewRepository = taskMedicalReviewRepository; } /// @@ -161,13 +165,57 @@ namespace IRaCIS.Core.Application.Service + private async Task DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isMedicalReviewAndSuggestApplyReReading,string pdAnswer, List taskIdList, List minUserIdList) + { + + var isNeedSend = true; + + if (pdAnswer == "是") + { + isNeedSend = true; + + } + else + { + + if (isMedicalReviewAndSuggestApplyReReading == null) + { + isNeedSend = false; + + //生成任务 + foreach (var taskId in taskIdList) + { + await _taskMedicalReviewRepository.AddAsync(new TaskMedicalReview() { TrialId = trialId, VisitTaskId = taskId, MedicalManagerUserId = minUserIdList.FirstOrDefault(), AllocateTime = DateTime.Now }); + + } + } + else if (isMedicalReviewAndSuggestApplyReReading == true) + { + //手动发送 + isNeedSend = false; + } + else + { + // 医学审核确认未否了 才发 + isNeedSend = true; + } + } + + + + + return isNeedSend; + + } + /// /// 测试邮件 带附件 填充word --前端不需要用 /// /// + /// /// /// - public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId) + public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading) { CommonDocumentBusinessScenario? businessScenarioEnum = null; @@ -357,6 +405,7 @@ namespace IRaCIS.Core.Application.Service var answer = "否"; var isNeedSend = true; + var minUserIdList = _trialUserRepository.Where(t => t.User.UserTypeEnum == Domain.Share.UserTypeEnum.MIM && t.TrialId == taskInfo.TrialId).Select(t => t.UserId).ToList(); //入组确认 根据每个标准配置的是否自动发送,发送邮件与否 if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed) @@ -381,24 +430,24 @@ namespace IRaCIS.Core.Application.Service ); } + + if (await _repository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && + x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) + { + answer = "是"; - if (await _repository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && - x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) - { + //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) + var urgent = _repository.Where(t => t.Id == taskInfo.SourceSubjectVisitId).Select(t => new { IsSubjectUrgent = t.Subject.IsUrgent, t.Trial.IsUrgent }).FirstOrDefault(); - answer = "是"; - } - - //把另外一个人的任务设置为不加急(如果项目加急是否 subject 加急是否) - var urgent = _repository.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 }); - } + 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 }); + } + } + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); } @@ -460,6 +509,8 @@ namespace IRaCIS.Core.Application.Service throw new BusinessValidationFailedException("单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!"); } + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); + } //双重 @@ -481,6 +532,10 @@ namespace IRaCIS.Core.Application.Service { answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + } //双人 产生裁判,并且裁判完成 发 else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1) @@ -488,6 +543,8 @@ namespace IRaCIS.Core.Application.Service answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + } else { @@ -496,38 +553,16 @@ namespace IRaCIS.Core.Application.Service } + + } - //在阅片期 仲裁在全局阅片,不会在访视上 + //仲裁在阅片期 else if (taskInfo.ArbitrationRule == ArbitrationRule.Reading) { //是访视任务 不可能是裁判任务(访视上不会生成裁判),也不会是全局任务(全局任务 SourceSubjectVisitId=null ) if (taskInfo.SourceSubjectVisitId != null) { - #region MyRegion - - ////看该访视是否是截止访视 - //var moduleIdList = await _repository.Where(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.SubjectVisitId == taskInfo.SourceSubjectVisitId && t.ReadingSetType == ReadingSetType.ImageReading) - // .Select(t => (Guid?) t.Id).ToListAsync(); - - ////截止访视 - //if (moduleIdList.Count > 0) - //{ - // //截止访视,需要等待生成全局,完成全局再发 - - // isNeedSend = false; - - //} - ////非截止访视 CRC在该访视设置PD后,在提交的时候,生成了阅片期,一定会生成全局任务 - //else - //{ - - // isNeedSend = false; - //} - - #endregion - - //访视类型的任务 根本就不需要发送邮件 isNeedSend = false; @@ -544,6 +579,8 @@ namespace IRaCIS.Core.Application.Service { answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } //双人全局产生裁判 else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Global).Count() == 2) @@ -551,6 +588,8 @@ namespace IRaCIS.Core.Application.Service answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + } else { @@ -569,19 +608,19 @@ namespace IRaCIS.Core.Application.Service else { - //throw new BusinessValidationFailedException("双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!"); + throw new BusinessValidationFailedException("双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!"); - //只发第一个人 - if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && - t.Id != visitTaskId && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId)) - { - isNeedSend = false; - } - else - { + ////只发第一个人 + //if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && + //t.Id != visitTaskId && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId)) + //{ + // isNeedSend = false; + //} + //else + //{ - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - } + // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + //} } @@ -602,6 +641,8 @@ namespace IRaCIS.Core.Application.Service if (taskInfo.ReadingType == ReadingMethod.Single && taskInfo.ArbitrationRule == ArbitrationRule.None) { answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, new List() { visitTaskId }, minUserIdList); } //双重 截止访视只在阅片期的时候存在 要求PD确认的访视 肯定是非截止访视 else if (taskInfo.ReadingType == ReadingMethod.Double && taskInfo.ArbitrationRule == ArbitrationRule.Visit) @@ -615,11 +656,15 @@ namespace IRaCIS.Core.Application.Service { answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1) { answer = await TranslatePdStateAsync(taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().Id, ReadingCategory.Judge, taskInfo.CriterionType); + isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isMedicalReviewAndSuggestApplyReReading, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); + } else @@ -630,25 +675,32 @@ namespace IRaCIS.Core.Application.Service } else { - //throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!"); + throw new BusinessValidationFailedException("无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!"); - //只发第一个人 - if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && - t.Id != visitTaskId && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId)) - { - isNeedSend = false; - } - else - { + ////只发第一个人 + //if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && + //t.Id != visitTaskId && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId)) + //{ + // isNeedSend = false; + //} + //else + //{ - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); - } + // answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + //} } } + + + + + + + } else { @@ -750,17 +802,15 @@ namespace IRaCIS.Core.Application.Service if (answer == OverallAssessment.PD.GetEnumInt()) { - return "是"; + answer = "是"; } - //if (answer == OverallAssessment.NA.GetEnumInt()) - //{ - // return "NA"; - //} else { - return "否"; + answer = "否"; } + break; + case CriterionType.PCWG3: if (readingCategory == ReadingCategory.Visit) { @@ -791,20 +841,21 @@ namespace IRaCIS.Core.Application.Service if (answer == VisitTumorEvaluation.PD.GetEnumInt()) { - return "是"; + answer = "是"; } if (answer == VisitTumorEvaluation.ND.GetEnumInt()) { - return "ND"; + answer = "ND"; } if (answer == VisitTumorEvaluation.NE.GetEnumInt()) { - return "NE"; + answer = "NE"; } else { - return "否"; + answer = "否"; } + break; case CriterionType.SelfDefine: case CriterionType.mRECISTMesothelioma: case CriterionType.RECIL: @@ -827,7 +878,7 @@ namespace IRaCIS.Core.Application.Service - + return answer; @@ -854,7 +905,7 @@ namespace IRaCIS.Core.Application.Service [HttpPost] public async Task> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery) { - await SyncSystemEmainCofigDocListAsync(inQuery.TrialId); + await SyncSystemEmainCofigDocListAsync(inQuery.TrialId); var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == inQuery.TrialId) .WhereIf(inQuery.IsDistinguishCriteria == false, t => t.TrialReadingCriterionId == null) diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs index 525341d7..12c128eb 100644 --- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs +++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs @@ -39,6 +39,8 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _readingMedicineQuestionAnswerRepository; private readonly IRepository _readingMedicineSystemQuestionRepository; + private readonly ITrialEmailNoticeConfigService _trialEmailNoticeConfigService; + public ReadingMedicalReviewService( IRepository readingMedicineTrialQuestionRepository, IRepository trialRepository, @@ -54,7 +56,9 @@ namespace IRaCIS.Core.Application.Service IRepository readingMedicalReviewDialogRepository, IRepository readingQuestionCriterionTrial, IRepository readingMedicineQuestionAnswerRepository, - IRepository readingMedicineSystemQuestionRepository + IRepository readingMedicineSystemQuestionRepository, + ITrialEmailNoticeConfigService trialEmailNoticeConfigService + ) { this._readingMedicineTrialQuestionRepository = readingMedicineTrialQuestionRepository; @@ -72,6 +76,7 @@ namespace IRaCIS.Core.Application.Service this._readingQuestionCriterionTrial = readingQuestionCriterionTrial; this._readingMedicineQuestionAnswerRepository = readingMedicineQuestionAnswerRepository; this._readingMedicineSystemQuestionRepository = readingMedicineSystemQuestionRepository; + _trialEmailNoticeConfigService = trialEmailNoticeConfigService; } /// @@ -678,6 +683,9 @@ namespace IRaCIS.Core.Application.Service AuditSignTime=DateTime.Now, }); + + await _trialEmailNoticeConfigService.BaseBusinessScenarioSendEmailAsync(medicalReviewInfo.VisitTaskId, true&& medicalReviewInfo.IsApplyHeavyReading); + var result = await _taskMedicalReviewRepository.SaveChangesAsync(); return ResponseOutput.Result(result); }