170 lines
7.1 KiB
C#
170 lines
7.1 KiB
C#
using EntityFrameworkCore.Triggered;
|
|
using IRaCIS.Core.Application.Service.Reading.Interface;
|
|
using IRaCIS.Core.Domain.Share;
|
|
|
|
namespace IRaCIS.Core.Application.Triggers
|
|
{
|
|
/// <summary>
|
|
/// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
|
|
/// </summary>
|
|
public class SubjectVisitScanDateTrigger(
|
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
|
IClinicalAnswerService _iClinicalAnswerService,
|
|
IRepository<DicomSeries> _dicomSeriesRepository,
|
|
IRepository<NoneDicomStudy> _noneDicomStudyRepository
|
|
) : IAfterSaveTrigger<NoneDicomStudy>, IAfterSaveTrigger<DicomStudy>, IAfterSaveTrigger<NoneDicomStudyFile>
|
|
{
|
|
|
|
|
|
//注意删除不能用扩展方法,必须用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 UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
var studyId = context.Entity.Id;
|
|
//处理Modality
|
|
var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(u => u.Modality).Distinct();
|
|
string ModaliyStr = string.Join('、', seriesModalityList.ToList());
|
|
|
|
|
|
context.Entity.Modalities = ModaliyStr;
|
|
|
|
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
|
|
|
|
//添加检查级别临床数据
|
|
|
|
// 检查类型 ModalityForEdit
|
|
// 检查模态 Modalities
|
|
var modalities = context.Entity.Modalities;
|
|
List<string> modalitieTypess = new List<string>() { "PT、CT", "CT、PT", "PET-CT" };
|
|
|
|
if (modalitieTypess.Contains(modalities))
|
|
{
|
|
await _iClinicalAnswerService.AddStudyClinical(new Service.Reading.Dto.AddStudyClinicalInDto()
|
|
{
|
|
StudyId = studyId,
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
|
|
if (context.ChangeType == ChangeType.Deleted)
|
|
{
|
|
await UpdateSubjectVisitImageDateAsync(subjectVisitId);
|
|
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
|
|
|
|
//删除检查级别临床数据
|
|
await _iClinicalAnswerService.DeleteStudyClinical(new Service.Reading.Dto.DeleteStudyClinicalInDto()
|
|
{
|
|
StudyId = context.Entity.Id,
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
public async Task AfterSave(ITriggerContext<NoneDicomStudyFile> context, CancellationToken cancellationToken)
|
|
{
|
|
var subjectVisitId = await _noneDicomStudyRepository.Where(x => x.Id == context.Entity.NoneDicomStudyId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
|
|
|
|
if (context.ChangeType == ChangeType.Deleted || context.ChangeType == ChangeType.Added)
|
|
{
|
|
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理提交状态
|
|
/// </summary>
|
|
/// <param name="subjectVisitId"></param>
|
|
/// <returns></returns>
|
|
|
|
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)
|
|
{
|
|
|
|
await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.ToSubmit,
|
|
u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.UnExecuted, SVENDTC = null, SVSTDTC = null, SubmitState = SubmitStateEnum.None }, true);
|
|
}
|
|
else
|
|
{
|
|
// 上传非Dicom 后 将状态改为待提交 分为普通上传 和QC后重传 普通上传时才改为待提交
|
|
await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.None, u => new SubjectVisit() { SubmitState = SubmitStateEnum.ToSubmit }, true);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理访视拍片日期
|
|
/// </summary>
|
|
/// <param name="subjectVisitId"></param>
|
|
/// <returns></returns>
|
|
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()
|
|
});
|
|
|
|
if (minArray.Min() == null && maxArray.Max() == null)
|
|
{
|
|
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit()
|
|
{
|
|
VisitExecuted = VisitExecutedEnum.UnExecuted
|
|
});
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit()
|
|
{
|
|
VisitExecuted = VisitExecutedEnum.Executed
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} |