增加邮件模板验证
continuous-integration/drone/push Build is passing Details

IRC_NewDev
hang 2024-08-22 11:40:21 +08:00
parent dd07057ca5
commit 7db339d876
2 changed files with 33 additions and 55 deletions

View File

@ -30,57 +30,24 @@ namespace IRaCIS.Core.Application.Service.Allocation
/// 访视读片任务
/// </summary>
[ApiExplorerSettings(GroupName = "Trial")]
public class VisitTaskService : BaseService, IVisitTaskService
public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
IRepository<Trial> _trialRepository,
IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<TaskAllocationRule> _taskAllocationRuleRepository,
IRepository<Subject> _subjectRepository,
IRepository<SubjectUser> _subjectUserRepository,
IRepository<ReadModule> _readModuleRepository,
IRepository<VisitTaskReReading> _visitTaskReReadingRepository,
IRepository<TaskMedicalReview> _taskMedicalReviewRepository,
IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository,
IRepository<ReadingClinicalData> _readingClinicalDataReposiotry,
IRepository<SubjectCriteriaEvaluation> _subjectCriteriaEvaluationRepository,
IRepository<SubjectCriteriaEvaluationVisitFilter> _subjectCriteriaEvaluationVisitFilterRepository,
IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository) : BaseService, IVisitTaskService
{
private readonly IRepository<VisitTask> _visitTaskRepository;
private readonly IRepository<Trial> _trialRepository;
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
private readonly IRepository<TaskAllocationRule> _taskAllocationRuleRepository;
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<SubjectUser> _subjectUserRepository;
private readonly IRepository<ReadModule> _readModuleRepository;
private readonly IRepository<VisitTaskReReading> _visitTaskReReadingRepository;
private readonly IRepository<TaskMedicalReview> _taskMedicalReviewRepository;
private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository;
private readonly IRepository<ReadingClinicalData> _readingClinicalDataReposiotry;
private readonly IRepository<SubjectCriteriaEvaluation> _subjectCriteriaEvaluationRepository;
private readonly IRepository<SubjectCriteriaEvaluationVisitFilter> _subjectCriteriaEvaluationVisitFilterRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
private readonly IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository;
public VisitTaskService(IRepository<SubjectVisit> subjectVisitRepository, IRepository<VisitTask> visitTaskRepository, IRepository<Trial> trialRepository,
IRepository<Subject> subjectRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<TaskAllocationRule> taskAllocationRuleRepository,
IRepository<ReadModule> readModuleRepository, IRepository<VisitTaskReReading> visitTaskReReadingRepository,
IRepository<TaskMedicalReview> taskMedicalReviewRepository,
IRepository<ReadingTaskQuestionAnswer> readingTaskQuestionAnswerRepository
, IRepository<ReadingQuestionCriterionTrial> trialReadingCriterionRepository,
IRepository<ReadingClinicalData> readingClinicalDataReposiotry,
IRepository<SubjectCriteriaEvaluation> subjectCriteriaEvaluationRepository,
IRepository<SubjectCriteriaEvaluationVisitFilter> subjectCriteriaEvaluationVisitFilterRepository,
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> 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;
}
/// <summary>
/// 设置任务加急
@ -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)))
{

View File

@ -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)
{