using AutoMapper; using EasyCaching.Core; using EntityFrameworkCore.Triggered; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using System.Linq.Expressions; namespace IRaCIS.Core.Application.Triggers { /// /// 维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果 /// public class VisitTaskIsFrontTaskNeedSignButNotSignTrigger : IAfterSaveTrigger { private readonly IRepository _visitTaskRepository; private readonly IRepository _trialReadingCriterionRepository; private readonly IRepository _trialReadingQuestionRepository; private readonly IRepository _readingTaskQuestionAnswerRepository; private readonly IRepository _subjectAdditionalEvaluationResultRepository; public VisitTaskIsFrontTaskNeedSignButNotSignTrigger( IRepository visitTaskRepository, IRepository trialReadingCriterionRepository, IRepository trialReadingQuestionRepository , IRepository readingTaskQuestionAnswerRepository, IRepository subjectAdditionalEvaluationResultRepository) { _trialReadingCriterionRepository = trialReadingCriterionRepository; _visitTaskRepository = visitTaskRepository; _trialReadingQuestionRepository = trialReadingQuestionRepository; _readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; _subjectAdditionalEvaluationResultRepository = subjectAdditionalEvaluationResultRepository; } //添加任务的时候 如果需要签名 并且已经签名了 那么要维护该标准 该Subject IsFrontTaskNeedSignButNotSign字段 public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var visitTask = context.Entity; Expression> visitTaskLambda = x => x.TrialId == visitTask.TrialId && x.SubjectId == visitTask.SubjectId && x.TrialReadingCriterionId == visitTask.TrialReadingCriterionId; if (context.ChangeType == ChangeType.Added) { if (visitTask.IsNeedClinicalDataSign) { var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务 //小于自己任务号的任务 存在需要签名 但是没签名 .Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum) && t.IsFrontTaskNeedSignButNotSign == false) .Select(t => t.Id); await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask() { IsFrontTaskNeedSignButNotSign = true }); var visitTaskIdQueryable2 = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务 //小于自己任务号的任务 存在需要签名 但是没签名 .Where(t => !t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum) && t.IsFrontTaskNeedSignButNotSign == true) .Select(t => t.Id); await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable2.Contains(t.Id), u => new VisitTask() { IsFrontTaskNeedSignButNotSign = false }); } } #region 附加评估 暂时废弃 // //从未签名状态 改为签名状态时 判断是否进行了附加评估,将附加评估的结果冗余 // if (context.ChangeType == ChangeType.Modified && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned && context.UnmodifiedEntity.ReadingTaskState != ReadingTaskState.HaveSigned) // { // var criterion = _trialReadingCriterionRepository.Where(t => t.Id == visitTask.TrialReadingCriterionId).FirstOrDefault(); // //如果是附加评估 // if (criterion.IsAdditionalAssessment) // { // if (visitTask.ReadingCategory == ReadingCategory.Visit) // { // switch (criterion.CriterionType) // { // case CriterionType.RECIST1Point1: // var isbaseLine = _visitTaskRepository.Where(t => t.Id == visitTask.Id).Select(t => t.SourceSubjectVisit.IsBaseLine).FirstOrDefault(); // if (isbaseLine) // { // var currentTaskAdditionarlAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTask.Id && // t.ReadingQuestionTrial.IsAdditional == true && t.ReadingQuestionTrial.Type != "group" // ).Include(t => t.ReadingQuestionTrial).FirstOrDefaultAsync(); // //双重阅片完成了 // if (criterion.ReadingType == ReadingMethod.Double && //(_visitTaskRepository.Where(t => t.SubjectId == visitTask.SubjectId && t.TaskName == visitTask.TaskName && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == 2) // ) // { // var otherTaskId = await _visitTaskRepository.Where(t => t.SubjectId == visitTask.SubjectId && t.TaskName == visitTask.TaskName && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.Id != visitTask.Id) // .Select(t => t.Id).FirstOrDefaultAsync(); // var otherTaskAdditionarlAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == otherTaskId && // t.ReadingQuestionTrial.IsAdditional == true && t.ReadingQuestionTrial.Type != "group" // ).Include(t => t.ReadingQuestionTrial).FirstOrDefaultAsync(); // await _subjectAdditionalEvaluationResultRepository.AddAsync(new SubjectAdditionalEvaluationResult() // { // TrialReadingCriterionId = visitTask.TrialReadingCriterionId, // IsFinalResult = true, // SubjectId = visitTask.SubjectId, // TrialReadingQuestionId = currentTaskAdditionarlAnswer.ReadingQuestionTrialId, // FinalAnswer = currentTaskAdditionarlAnswer.Answer, // FinalTranslateDictionaryCode = currentTaskAdditionarlAnswer.ReadingQuestionTrial.DictionaryCode, // }); // } // if (criterion.ReadingType == ReadingMethod.Single) // { // await _subjectAdditionalEvaluationResultRepository.AddAsync(new SubjectAdditionalEvaluationResult() // { // TrialReadingCriterionId = visitTask.TrialReadingCriterionId, // IsFinalResult = true, // SubjectId = visitTask.SubjectId, // TrialReadingQuestionId = currentTaskAdditionarlAnswer.ReadingQuestionTrialId, // FinalAnswer = currentTaskAdditionarlAnswer.Answer, // FinalTranslateDictionaryCode = currentTaskAdditionarlAnswer.ReadingQuestionTrial.DictionaryCode, // }); // } // } // break; // default: // break; // } // } // } // } #endregion } } }