diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 12f90e6ca..ec1eff7b6 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -30,57 +30,24 @@ namespace IRaCIS.Core.Application.Service.Allocation /// 访视读片任务 /// [ApiExplorerSettings(GroupName = "Trial")] - public class VisitTaskService : BaseService, IVisitTaskService + public class VisitTaskService(IRepository _visitTaskRepository, + IRepository _trialRepository, + IRepository _subjectVisitRepository, + IRepository _taskAllocationRuleRepository, + IRepository _subjectRepository, + IRepository _subjectUserRepository, + IRepository _readModuleRepository, + IRepository _visitTaskReReadingRepository, + IRepository _taskMedicalReviewRepository, + IRepository _readingTaskQuestionAnswerRepository, + IRepository _readingClinicalDataReposiotry, + IRepository _subjectCriteriaEvaluationRepository, + IRepository _subjectCriteriaEvaluationVisitFilterRepository, + IRepository _trialReadingCriterionRepository, + IRepository _subjectCriteriaEvaluationVisitStudyFilterRepository) : BaseService, IVisitTaskService { - private readonly IRepository _visitTaskRepository; - private readonly IRepository _trialRepository; - private readonly IRepository _subjectVisitRepository; - private readonly IRepository _taskAllocationRuleRepository; - private readonly IRepository _subjectRepository; - private readonly IRepository _subjectUserRepository; - private readonly IRepository _readModuleRepository; - private readonly IRepository _visitTaskReReadingRepository; - private readonly IRepository _taskMedicalReviewRepository; - private readonly IRepository _readingTaskQuestionAnswerRepository; - - private readonly IRepository _readingClinicalDataReposiotry; - private readonly IRepository _subjectCriteriaEvaluationRepository; - private readonly IRepository _subjectCriteriaEvaluationVisitFilterRepository; - - private readonly IRepository _trialReadingCriterionRepository; - private readonly IRepository _subjectCriteriaEvaluationVisitStudyFilterRepository; - - public VisitTaskService(IRepository subjectVisitRepository, IRepository visitTaskRepository, IRepository trialRepository, - IRepository subjectRepository, IRepository subjectUserRepository, IRepository taskAllocationRuleRepository, - IRepository readModuleRepository, IRepository visitTaskReReadingRepository, - IRepository taskMedicalReviewRepository, - IRepository readingTaskQuestionAnswerRepository - , IRepository trialReadingCriterionRepository, - IRepository readingClinicalDataReposiotry, - IRepository subjectCriteriaEvaluationRepository, - IRepository subjectCriteriaEvaluationVisitFilterRepository, - IRepository subjectCriteriaEvaluationVisitStudyFilterRepository - ) - { - _readingClinicalDataReposiotry = readingClinicalDataReposiotry; - _taskAllocationRuleRepository = taskAllocationRuleRepository; - _visitTaskRepository = visitTaskRepository; - _trialRepository = trialRepository; - _subjectVisitRepository = subjectVisitRepository; - _subjectRepository = subjectRepository; - _subjectUserRepository = subjectUserRepository; - _readModuleRepository = readModuleRepository; - _visitTaskReReadingRepository = visitTaskReReadingRepository; - _taskMedicalReviewRepository = taskMedicalReviewRepository; - _readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; - - _trialReadingCriterionRepository = trialReadingCriterionRepository; - _subjectCriteriaEvaluationRepository = subjectCriteriaEvaluationRepository; - _subjectCriteriaEvaluationVisitFilterRepository = subjectCriteriaEvaluationVisitFilterRepository; - _subjectCriteriaEvaluationVisitStudyFilterRepository = subjectCriteriaEvaluationVisitStudyFilterRepository; - } /// /// 设置任务加急 @@ -290,7 +257,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { foreach (var command in cancelCommand.CancelList.Where(t => t.IsCancelAssign)) { - if (await _visitTaskRepository.AnyAsync(t => t.TaskState==TaskState.Effect && t.TrialReadingCriterionId == cancelCommand.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.DoctorUserId == command.DoctorUserId && t.ArmEnum == command.ArmEnum && t.ReadingTaskState != ReadingTaskState.WaitReading)) + if (await _visitTaskRepository.AnyAsync(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == cancelCommand.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.DoctorUserId == command.DoctorUserId && t.ArmEnum == command.ArmEnum && t.ReadingTaskState != ReadingTaskState.WaitReading)) { //---当前医生已开始做该Subject 该标准的任务,不允许取消分配 throw new BusinessValidationFailedException(_localizer["VisitTask_DoctorConfigNotFound"]); @@ -1463,7 +1430,7 @@ namespace IRaCIS.Core.Application.Service.Allocation throw new BusinessValidationFailedException(_localizer["VisitTask_LastReading"]); } - if (task.ReadingCategory == ReadingCategory.Oncology && await _visitTaskRepository.AnyAsync(filterExpression.And(t => t.ReadingCategory == ReadingCategory.Oncology && t.ReadingTaskState==ReadingTaskState.HaveSigned))) + if (task.ReadingCategory == ReadingCategory.Oncology && await _visitTaskRepository.AnyAsync(filterExpression.And(t => t.ReadingCategory == ReadingCategory.Oncology && t.ReadingTaskState == ReadingTaskState.HaveSigned))) { //---有序阅片,只允许申请该受试者阅片人最后一次完成肿瘤学任务重阅 throw new BusinessValidationFailedException(_localizer["VisitTask_LastOncologistRecheck"]); @@ -1484,8 +1451,8 @@ namespace IRaCIS.Core.Application.Service.Allocation var originalTask = pmApply.OriginalReReadingTask; //PM 无序影响列表 - if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId ) - .Where(t=>t.Id==originalTask.Id||t.Id==originalTask.JudgeVisitTaskId) + if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId) + .Where(t => t.Id == originalTask.Id || t.Id == originalTask.JudgeVisitTaskId) .AnyAsync(t => t.VisitTaskNum == task.VisitTaskNum)) { //---当前为无序阅片,影像存在问题,项目组已申请回退,暂不能申请重阅 @@ -1629,7 +1596,7 @@ namespace IRaCIS.Core.Application.Service.Allocation await _visitTaskReReadingRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new VisitTaskReReading() { RequestReReadingConfirmUserId = _userInfo.Id, RequestReReadingResultEnum = RequestReReadingResult.Invalid }); //---当前申请重阅任务的状态,已被其他任务重阅已影响,不允许对该状态下的任务进行重阅同意与否操作 - return ResponseOutput.Ok(string.Empty, msg:_localizer["VisitTask_ReapplyStatusConflict"]); + return ResponseOutput.Ok(string.Empty, msg: _localizer["VisitTask_ReapplyStatusConflict"]); } @@ -2580,7 +2547,7 @@ namespace IRaCIS.Core.Application.Service.Allocation private bool IsPMOrAPm() { - return _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM; + return _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM; } private bool IsSpmOrCPM() @@ -2619,7 +2586,7 @@ namespace IRaCIS.Core.Application.Service.Allocation { // IR 申请 PM 同意 - if ((( IsPMOrAPm() && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.IndependentReviewer)) + if (((IsPMOrAPm() && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.IndependentReviewer)) || (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer && applyId == null))) { diff --git a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs index b8b910bfc..ae9ff28d8 100644 --- a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs @@ -7,6 +7,7 @@ using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore; using Microsoft.AspNetCore.Mvc; +using System.Text.RegularExpressions; namespace IRaCIS.Core.Application.Contracts { @@ -44,6 +45,16 @@ namespace IRaCIS.Core.Application.Contracts VerifyMsg = _localizer["EmailNoticeConfig_RepeatEmailScenario"] }; + // 匹配所有占位符的正则表达式,允许包含空格的占位符 + var regex = new Regex(@"\{\s*\d+\s*\}"); + + if (regex.Matches($"{addOrEditEmailNoticeConfig.EmailTopic}{addOrEditEmailNoticeConfig.EmailTopicCN}{addOrEditEmailNoticeConfig.EmailHtmlContent}{addOrEditEmailNoticeConfig.EmailHtmlContentCN}" ) + .Any(t=>t.Value.Contains(" "))) + { + //邮件模板占位符不允许有空格,请核查占位符的地方 + return ResponseOutput.NotOk("EmailNoticeConfig_ContainEmpty"); + } + if (addOrEditEmailNoticeConfig.Id == null) {