125 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
| 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
 | |
| {
 | |
|     /// <summary>
 | |
|     /// 添加访视计划  要给改项目下的所有Subject 添加该访视
 | |
|     /// </summary>
 | |
|     public class SubjectTrigger(
 | |
|          IStringLocalizer _localizer,
 | |
|          IRepository<SubjectVisit> _subjectVisitRepository,
 | |
|          IRepository<VisitStage> _visitStageRepository,
 | |
|          IRepository<Trial> _trialRepository,
 | |
|          IMapper _mapper) : IBeforeSaveTrigger<Subject>, IAfterSaveTrigger<Subject>
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 手动设置出组状态
 | |
|         /// </summary>
 | |
|         /// <param name="context"></param>
 | |
|         /// <param name="cancellationToken"></param>
 | |
|         /// <returns></returns>
 | |
|         /// <exception cref="BusinessValidationFailedException"></exception>
 | |
|         public async Task AfterSave(ITriggerContext<Subject> 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<SubjectVisit>(t => t.VisitExecuted == VisitExecutedEnum.UnExecuted && t.SubjectId == mapedSubject.Id && t.InPlan == false);
 | |
|                     //}
 | |
| 
 | |
|                     ////如果是出组了  将受试者未执行的 设置为不可用
 | |
|                     //if (mapedSubject.Status == SubjectStatus.OutOfEnrollment)
 | |
|                     //{
 | |
|                     //    await _repository.UpdateFromQueryAsync<SubjectVisit>(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<Subject> 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<List<SubjectVisit>>(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);
 | |
| 
 | |
| 
 | |
|             }
 | |
| 
 | |
|         }
 | |
|     }
 | |
| } |