103 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
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)
 | 
						||
            {
 | 
						||
 | 
						||
                await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.ToSubmit,
 | 
						||
                    u => new SubjectVisit() { VisitExecuted = 0, SVENDTC = null, SVSTDTC = null, SubmitState = SubmitStateEnum.None },true);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        /// <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()
 | 
						||
            });
 | 
						||
        }
 | 
						||
    }
 | 
						||
} |