using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; namespace IRaCIS.Core.Application.Triggers { /// /// 处理 项目访视计划确认,记录影像的检查,另外批量插入访视数据 /// public class TrialVisitPlanConfirmTrigger : IAfterSaveTrigger { private readonly IRepository _subjectVisitRepository; private readonly IRepository _subjectRepository; private readonly IRepository _visitStageRepository; private readonly IRepository _visitPlanInfluenceStatRepository; public TrialVisitPlanConfirmTrigger(IRepository subjectVisitRepository, IRepository subjectRepository,IRepository visitStageRepository, IRepository visitPlanInfluenceStatRepository) { _subjectVisitRepository = subjectVisitRepository; _subjectRepository = subjectRepository; _visitStageRepository = visitStageRepository; _visitPlanInfluenceStatRepository = visitPlanInfluenceStatRepository; } public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var trial = context.Entity; var trialId = context.Entity.Id; if (context.ChangeType == ChangeType.Modified) { //项目访视计划确认 状态改变触发 if (trial.VisitPlanConfirmed && trial.VisitPlanConfirmed != context.UnmodifiedEntity.VisitPlanConfirmed) { //找到访视计划修改的Item var changedList = await _visitStageRepository.Where(t => t.TrialId == trial.Id && t.IsConfirmed == false) .Select(t => new { t.Trial.IsHaveFirstGiveMedicineDate, t.Id, t.VisitName, t.TrialId, t.VisitWindowLeft, t.VisitWindowRight, t.VisitDay, t.VisitNum, t.IsBaseLine, t.BlindName, t.Description, IsConfirmed = true, }).ToListAsync(); var visitPlanInfluenceStat = new VisitPlanInfluenceStat() { TrialId = trial.Id }; foreach (var changedItem in changedList) { //找到该项目 访视已经执行,并且配置了有首次给药日期 并且更新后超窗的访视,要把超窗之前的值也要查询出来 var qcPassedVisitList = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.VisitExecuted == VisitExecutedEnum.Executed && t.AuditState == AuditStateEnum.QCPassed && t.Trial.IsHaveFirstGiveMedicineDate == true && t.VisitStageId == changedItem.Id && t.Subject.FirstGiveMedicineTime != null ).Select(k => new { SubjectVisitId = k.Id, SelfWindowLeft = k.Subject.FirstGiveMedicineTime!.Value.AddDays(k.VisitDay + k.VisitWindowLeft), SelfWindowRight = k.Subject.FirstGiveMedicineTime!.Value.AddDays(k.VisitDay + k.VisitWindowRight + 1).AddSeconds(-1), NowWindowLeft = k.Subject.FirstGiveMedicineTime!.Value.AddDays(changedItem.VisitDay + changedItem.VisitWindowLeft), NowWindowRight = k.Subject.FirstGiveMedicineTime!.Value.AddDays(changedItem.VisitDay + changedItem.VisitWindowRight + 1).AddSeconds(-1), NoneDicomStudyList = k.NoneDicomStudyList //之前是查询调整之后超窗的 现在调整前超窗 调整后 没超窗的也要记录 //.Where(study => study.ImageDate k.Subject.FirstGiveMedicineTime.Value.AddDays(changedItem.VisitDay + changedItem.VisitWindowRight??0 + 1).AddSeconds(-1)) .Select(t => new { NoneDicomStudyId = t.Id, t.Modality, StudyTime = t.ImageDate }), DicomStudyList = k.StudyList //.Where(study => study.StudyTime k.Subject.FirstGiveMedicineTime.Value.AddDays(changedItem.VisitDay + changedItem.VisitWindowRight??0 + 1).AddSeconds(-1)) .Select(t => new { StudyId = t.Id, Modality = t.Modalities, t.StudyTime }) }).ToListAsync(); foreach (var visit in qcPassedVisitList) { //找到本身没有超窗的数据 修改后超窗的 visit.DicomStudyList.Where(t => (t.StudyTime > visit.SelfWindowLeft && t.StudyTime < visit.SelfWindowRight) && (t.StudyTime < visit.NowWindowLeft || t.StudyTime > visit.NowWindowRight)).ForEach(t => { visitPlanInfluenceStat.InconsistentCount++; visitPlanInfluenceStat.InfluenceStudyList.Add(new VisitPlanInfluenceStudy() { IsOverWindowNowNotOverWindow = false, Modality = t.Modality, SubjectVisitId = visit.SubjectVisitId, StudyId = t.StudyId, IsDicomStudy = true, StudyTime = t.StudyTime, TrialId = trialId, HistoryWindow = visit.SelfWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.SelfWindowRight.ToString("yyyy-MM-dd"), NowWindow = visit.NowWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.NowWindowRight.ToString("yyyy-MM-dd") }); }); visit.NoneDicomStudyList.Where(t => (t.StudyTime > visit.SelfWindowLeft && t.StudyTime < visit.SelfWindowRight) && (t.StudyTime < visit.NowWindowLeft || t.StudyTime > visit.NowWindowRight)).ForEach(t => { visitPlanInfluenceStat.InconsistentCount++; visitPlanInfluenceStat.InfluenceStudyList.Add(new VisitPlanInfluenceStudy() { IsOverWindowNowNotOverWindow = false, Modality = t.Modality, SubjectVisitId = visit.SubjectVisitId, StudyId = t.NoneDicomStudyId, IsDicomStudy = false, StudyTime = t.StudyTime, TrialId = trialId, HistoryWindow = visit.SelfWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.SelfWindowRight.ToString("yyyy-MM-dd"), NowWindow = visit.NowWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.NowWindowRight.ToString("yyyy-MM-dd") }); }); //本身超窗 修改后没超窗的 visit.DicomStudyList.Where(t => (t.StudyTime < visit.SelfWindowLeft || t.StudyTime > visit.SelfWindowRight) && (t.StudyTime > visit.NowWindowLeft && t.StudyTime < visit.NowWindowRight)).ForEach(t => { visitPlanInfluenceStat.InconsistentCount++; visitPlanInfluenceStat.InfluenceStudyList.Add(new VisitPlanInfluenceStudy() { IsOverWindowNowNotOverWindow = true, Modality = t.Modality, SubjectVisitId = visit.SubjectVisitId, StudyId = t.StudyId, IsDicomStudy = true, StudyTime = t.StudyTime, TrialId = trialId, HistoryWindow = visit.SelfWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.SelfWindowRight.ToString("yyyy-MM-dd"), NowWindow = visit.NowWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.NowWindowRight.ToString("yyyy-MM-dd") }); }); visit.NoneDicomStudyList.Where(t => (t.StudyTime < visit.SelfWindowLeft || t.StudyTime > visit.SelfWindowRight) && (t.StudyTime > visit.NowWindowLeft && t.StudyTime < visit.NowWindowRight)).ForEach(t => { visitPlanInfluenceStat.InconsistentCount++; visitPlanInfluenceStat.InfluenceStudyList.Add(new VisitPlanInfluenceStudy() { IsOverWindowNowNotOverWindow = true, Modality = t.Modality, SubjectVisitId = visit.SubjectVisitId, StudyId = t.NoneDicomStudyId, IsDicomStudy = false, StudyTime = t.StudyTime, TrialId = trialId, HistoryWindow = visit.SelfWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.SelfWindowRight.ToString("yyyy-MM-dd"), NowWindow = visit.NowWindowLeft.ToString("yyyy-MM-dd") + " ~ " + visit.NowWindowRight.ToString("yyyy-MM-dd") }); }); //变更某一访视计划Item 受试者访视相关字段 await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.VisitStageId == changedItem.Id, k => new SubjectVisit() { IsBaseLine = changedItem.IsBaseLine, VisitName = changedItem.VisitName, VisitNum = changedItem.VisitNum, VisitDay = changedItem.VisitDay, VisitWindowLeft = changedItem.VisitWindowLeft, VisitWindowRight = changedItem.VisitWindowRight }); } } await _visitPlanInfluenceStatRepository.AddAsync(visitPlanInfluenceStat,true); } } } } }