Trigger 修改分类整理
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
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);
|
||||
|
||||
await _subjectVisitRepository.SaveChangesAsync();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user