using AutoMapper; using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.Extensions.Localization; namespace IRaCIS.Core.Application.Triggers { /// /// 添加访视计划 要给改项目下的所有Subject 添加该访视 /// public class SubjectTrigger( IStringLocalizer _localizer, IRepository _subjectVisitRepository, IRepository _visitStageRepository, IRepository _trialRepository, IMapper _mapper) : IBeforeSaveTrigger, IAfterSaveTrigger { /// /// 手动设置出组状态 /// /// /// /// /// public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { if (context.ChangeType == ChangeType.Modified) { var dbSubject = context.Entity; //Site变更 if (context.Entity.TrialSiteId != context.UnmodifiedEntity?.TrialSiteId) { var subjectId = context.Entity.Id; var trialSiteId = context.Entity.TrialSiteId; await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId }); #region 废弃 ////如果访视结束了 需要删除计划外未执行的访视 //if (mapedSubject.Status == SubjectStatus.EndOfVisit) //{ // await _repository.DeleteFromQueryAsync(t => t.VisitExecuted == VisitExecutedEnum.UnExecuted && t.SubjectId == mapedSubject.Id && t.InPlan == false); //} ////如果是出组了 将受试者未执行的 设置为不可用 //if (mapedSubject.Status == SubjectStatus.OutOfEnrollment) //{ // await _repository.UpdateFromQueryAsync(t => t.SubjectId == mapedSubject.Id && t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable }); //} #endregion } // 出组 状态发生了变更 if (context.Entity.Status == SubjectStatus.OutOfVisit && context.Entity.Status != context.UnmodifiedEntity?.Status) { if (context.Entity.FinalSubjectVisitId != null) { if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.IsFinalVisit && t.Id != dbSubject.FinalSubjectVisitId)) { throw new BusinessValidationFailedException( //---该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。 _localizer["SubjectState_CannotSetCurrentAsLastVisit"]); } var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == dbSubject.FinalSubjectVisitId).IfNullThrowException(); if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum && t.SubmitState == SubmitStateEnum.ToSubmit)) { throw new BusinessValidationFailedException( //---该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。 _localizer["SubjectState_CannotSetAsLastVisitWithImage"]); } sv.IsFinalVisit = true; await _subjectVisitRepository.SaveChangesAsync(); //末次访视后的 访视设置为不可用 await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable }); } } } } public async Task BeforeSave(ITriggerContext context, CancellationToken cancellationToken) { var subject = context.Entity; if (context.ChangeType == ChangeType.Added) { //添加受试者的时候,获取访视计划列表,添加到受试者访视表。 var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == subject.TrialId && t.IsConfirmed).ToListAsync(); var svList = _mapper.Map>(visitPlanList); var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == subject.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync(); svList.ForEach(t => { t.Subject = subject; t.SubjectId = subject.Id; t.TrialId = subject.TrialId; t.TrialSiteId = subject.TrialSiteId; t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false; t.Id = NewId.NextGuid(); }); await _subjectVisitRepository.AddRangeAsync(svList); } } } }