irc-netcore-api/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs

120 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Domain.Common;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Triggers
{
/// <summary>
/// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
/// </summary>
public class SubjectVisitTrigger : IAfterSaveTrigger<NoneDicomStudy>, IAfterSaveTrigger<DicomStudy>
{
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
public SubjectVisitTrigger(IRepository<SubjectVisit> subjectVisitRepository)
{
_subjectVisitRepository = subjectVisitRepository;
}
//注意删除不能用扩展方法必须用EF跟踪的实体 否则不能取到 SubjectVisitId
public async Task AfterSave(ITriggerContext<NoneDicomStudy> context, CancellationToken cancellationToken)
{
var subjectVisitId = context.Entity.SubjectVisitId;
if (context.ChangeType == ChangeType.Added || context.ChangeType == ChangeType.Modified)
{
await UpdateSubjectVisitImageDateAsync(context.Entity.SubjectVisitId);
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit()
{
VisitExecuted = VisitExecutedEnum.Executed
});
}
if (context.ChangeType == ChangeType.Deleted)
{
await UpdateSubjectVisitImageDateAsync(context.Entity.SubjectVisitId);
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
}
}
public async Task AfterSave(ITriggerContext<DicomStudy> context, CancellationToken cancellationToken)
{
var subjectVisitId = context.Entity.SubjectVisitId;
if (context.ChangeType == ChangeType.Added )
{
await UpdateSubjectVisitImageDateAsync(subjectVisitId);
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit()
{
VisitExecuted = VisitExecutedEnum.Executed
});
}
if (context.ChangeType == ChangeType.Deleted)
{
await UpdateSubjectVisitImageDateAsync(subjectVisitId);
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
}
}
/// <summary>处理提交状态</summary>
public async Task UpdateSubjectVisitSubmitStateAsync(Guid subjectVisitId)
{
//一个访视下面有多个检查,所以需要检测 没有的时候才清空 非dicom 是检查文件 不是表记录
if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 &&
await _subjectVisitRepository.Where(t => t.Id == subjectVisitId)
.SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0)
{
var subjectvisit =await _subjectVisitRepository.FirstOrDefaultAsync(x => x.Id == subjectVisitId&&x.SubmitState == SubmitStateEnum.ToSubmit);
subjectvisit.SubmitState = SubmitStateEnum.None;
List<DataInspection> datas = new List<DataInspection>();
datas.Add(new DataInspection()
{
Identification = "Edit|Visit|Status|Visit-Image Upload|Add Image",
TrialId = subjectvisit.TrialId,
SiteId = subjectvisit.SiteId,
SubjectId = subjectvisit.SubjectId,
SubjectVisitId = subjectvisit.Id,
Reason = "删除影像",
JsonDetail = subjectvisit.ToJcJson(),
});
await _subjectVisitRepository.AddListInspectionRecordAsync(datas);
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.ToSubmit,
u => new SubjectVisit() { VisitExecuted = 0, SVENDTC = null, SVSTDTC = null, SubmitState = SubmitStateEnum.None });
}
}
/// <summary>处理拍片日期</summary>
private async Task UpdateSubjectVisitImageDateAsync(Guid subjectVisitId)
{
var svTime = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new
{
DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime),
DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime),
NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate),
NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate)
}).FirstOrDefault().IfNullThrowException();
var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime };
var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime };
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t=>t.Id ==subjectVisitId, u => new SubjectVisit()
{
EarliestScanDate = minArray.Min(),
LatestScanDate = maxArray.Max()
});
}
}
}