using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Common; using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Triggers { /// /// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期 /// public class SubjectVisitTrigger : IAfterSaveTrigger, IAfterSaveTrigger { private readonly IRepository _subjectVisitRepository; public SubjectVisitTrigger(IRepository subjectVisitRepository) { _subjectVisitRepository = subjectVisitRepository; } //注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var subjectVisitId = context.Entity.SubjectVisitId; if (context.ChangeType == ChangeType.Added || context.ChangeType == ChangeType.Modified) { await UpdateSubjectVisitImageDateAsync(context.Entity.SubjectVisitId); await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Executed }); } if (context.ChangeType == ChangeType.Deleted) { await UpdateSubjectVisitImageDateAsync(context.Entity.SubjectVisitId); await UpdateSubjectVisitSubmitStateAsync(subjectVisitId); } } public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var subjectVisitId = context.Entity.SubjectVisitId; if (context.ChangeType == ChangeType.Added ) { await UpdateSubjectVisitImageDateAsync(subjectVisitId); await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Executed }); } if (context.ChangeType == ChangeType.Deleted) { await UpdateSubjectVisitImageDateAsync(subjectVisitId); await UpdateSubjectVisitSubmitStateAsync(subjectVisitId); } } /// 处理提交状态 public async Task UpdateSubjectVisitSubmitStateAsync(Guid subjectVisitId) { //一个访视下面有多个检查,所以需要检测 没有的时候才清空 非dicom 是检查文件 不是表记录 if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 && await _subjectVisitRepository.Where(t => t.Id == subjectVisitId) .SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) { var subjectvisit =await _subjectVisitRepository.FirstOrDefaultAsync(x => x.Id == subjectVisitId&&x.SubmitState == SubmitStateEnum.ToSubmit); subjectvisit.SubmitState = SubmitStateEnum.None; List datas = new List(); datas.Add(new DataInspection() { Identification = "Edit|Visit|Status|Visit-Image Upload|Add Image", TrialId = subjectvisit.TrialId, SiteId = subjectvisit.SiteId, SubjectId = subjectvisit.SubjectId, SubjectVisitId = subjectvisit.Id, Reason = "删除影像", JsonDetail = subjectvisit.ToJcJson(), }); // 这里是触发器的位置 await _subjectVisitRepository.AddListInspectionRecordAsync(datas); await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.ToSubmit, u => new SubjectVisit() { VisitExecuted = 0, SVENDTC = null, SVSTDTC = null, SubmitState = SubmitStateEnum.None }); } } /// 处理拍片日期 private async Task UpdateSubjectVisitImageDateAsync(Guid subjectVisitId) { var svTime = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime), DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime), NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate), NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate) }).FirstOrDefault().IfNullThrowException(); var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime }; var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime }; await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t=>t.Id ==subjectVisitId, u => new SubjectVisit() { EarliestScanDate = minArray.Min(), LatestScanDate = maxArray.Max() }); } } }