using AutoMapper; using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; using MassTransit; namespace IRaCIS.Core.Application.Triggers { /// /// 添加访视计划 要给改项目下的所有Subject 添加该访视 /// public class AddSubjectTrigger : IBeforeSaveTrigger { private readonly IRepository _subjectVisitRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _readingClinicalDataRepository; private readonly IRepository _visitStageRepository; private readonly IRepository _trialRepository; private readonly IMapper _mapper; public AddSubjectTrigger(IRepository subjectVisitRepository, IRepository clinicalDataTrialSetRepository, IRepository readingClinicalDataRepository, IMapper mapper, IRepository visitStageRepository, IRepository trialRepository) { _subjectVisitRepository = subjectVisitRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._readingClinicalDataRepository = readingClinicalDataRepository; _trialRepository = trialRepository; _visitStageRepository = visitStageRepository; _mapper = mapper; } 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(); var cRCClinicalDatas = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == subject.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) .Select(x =>new { x.Id, x.ClinicalDataLevel, } ).ToListAsync(); List readingClinicals = new List(); svList.ForEach(t => { t.Subject = subject; t.SubjectId = subject.Id; t.TrialId = subject.TrialId; t.SiteId = subject.SiteId; t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false; readingClinicals.AddRange( cRCClinicalDatas.WhereIf(!t.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Select(x => new ReadingClinicalData() { ClinicalDataTrialSetId = x.Id, IsVisit = true, SubjectId = subject.Id, ReadingId = t.Id, TrialId = subject.TrialId }).ToList() ); }); await _readingClinicalDataRepository.AddRangeAsync(readingClinicals); await _subjectVisitRepository.AddRangeAsync(svList); await _subjectVisitRepository.SaveChangesAsync(); #region 在f访视计划确认的时候处理 给subject添加访视计划 ////已添加受试者 都不存在该新增的计划名称 那么该项目所有受试者都增加一个访视记录 //if (!await _subjectVisitRepository.AnyAsync(t => t.VisitName == visitPlan.VisitName && t.TrialId == visitPlan.TrialId)) //{ // var subjectSVS = await _subjectVisitRepository.Where(t => t.TrialId == visitPlan.TrialId).Select(t => new { t.SubjectId, t.SiteId, t.IsFinalVisit }).Distinct().ToListAsync(); // var subjects = subjectSVS.Select(t => new { t.SubjectId, t.SiteId }).Distinct().ToList(); // foreach (var subject in subjects) // { // var svItem = _mapper.Map(visitPlan); // svItem.SiteId = subject.SiteId; // svItem.SubjectId = subject.SubjectId; // svItem.Id = NewId.NextGuid(); // //设置了末次访视,那么加访视计划的时候,设置为不可用 // if (subjectSVS.Any(t => t.SubjectId == svItem.SubjectId && t.IsFinalVisit)) // { // svItem.VisitExecuted = VisitExecutedEnum.Unavailable; // } // await _subjectVisitRepository.AddAsync(svItem); // } // await _subjectVisitRepository.SaveChangesAsync(); //} #endregion } } } }