using AutoMapper;
using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using MassTransit;
namespace IRaCIS.Core.Application.Triggers
{
///
///
///
public class SubjectStateTrigger : IAfterSaveTrigger
{
private readonly IRepository _subjectVisitRepository;
private readonly IRepository _repository;
private readonly IMapper _mapper;
public SubjectStateTrigger(IRepository subjectVisitRepository, IRepository repository, IMapper mapper)
{
_subjectVisitRepository = subjectVisitRepository;
_repository = repository;
_mapper = mapper;
}
public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken)
{
var dbSubject = context.Entity;
if (context.ChangeType == ChangeType.Modified )
{
//Site变更
if ( context.Entity.SiteId != context.UnmodifiedEntity?.SiteId)
{
var subjectId = context.Entity.Id;
var siteId = context.Entity.SiteId;
await _repository.BatchUpdateAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { SiteId = siteId });
await _repository.BatchUpdateAsync(t => t.SubjectId == subjectId, u => new DicomStudy() { SiteId = siteId });
#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(
"该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。");
}
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(
"该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。");
}
sv.IsFinalVisit = true;
//末次访视后的 访视设置为不可用
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
}
}
}
}
}
}