using AutoMapper; using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; using MassTransit; namespace IRaCIS.Core.Application.Triggers { /// <summary> /// 添加访视计划 要给改项目下的所有Subject 添加该访视 /// </summary> public class AddSubjectTrigger : IBeforeSaveTrigger<Subject> { private readonly IRepository<SubjectVisit> _subjectVisitRepository; private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository; private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository; private readonly IRepository<VisitStage> _visitStageRepository; private readonly IRepository<Trial> _trialRepository; private readonly IMapper _mapper; public AddSubjectTrigger(IRepository<SubjectVisit> subjectVisitRepository, IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository, IRepository<ReadingClinicalData> readingClinicalDataRepository, IMapper mapper, IRepository<VisitStage> visitStageRepository, IRepository<Trial> trialRepository) { _subjectVisitRepository = subjectVisitRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._readingClinicalDataRepository = readingClinicalDataRepository; _trialRepository = trialRepository; _visitStageRepository = visitStageRepository; _mapper = mapper; } 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); await _subjectVisitRepository.SaveChangesAsync(); } } } }