using EasyCaching.Core; using EntityFrameworkCore.Triggered; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; namespace IRaCIS.Core.Application.Triggers { /// /// 处理 访视 末次评估 会影响Subject 状态 /// public class SubjectVisitPassedTrigger : IAfterSaveTrigger { private readonly IRepository _subjectVisitRepository; private readonly IRepository _visitTaskRepository; private readonly IEasyCachingProvider _provider; public SubjectVisitPassedTrigger(IRepository subjectVisitRepository, IRepository visitTaskRepository, IEasyCachingProvider provider) { _subjectVisitRepository = subjectVisitRepository; _visitTaskRepository = visitTaskRepository; _provider = provider; } public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) { var subjectVisit = context.Entity; if (context.ChangeType == ChangeType.Modified) { // 一致性核查通过 生成读片任务 if (context.UnmodifiedEntity?.CheckState != subjectVisit.CheckState && subjectVisit.CheckState == CheckStateEnum.CVPassed) { var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == subjectVisit.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); var cacheMaxCodeInt = _provider.Get($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}").Value; int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode; _provider.Set($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt + 2, TimeSpan.FromMinutes(30)); await _visitTaskRepository.AddAsync(new VisitTask() { TrialId = subjectVisit.TrialId, SubjectId = subjectVisit.SubjectId, IsUrgent = subjectVisit.IsUrgent, TaskBlindName = subjectVisit.BlindName, TaskName = subjectVisit.VisitName, CheckPassedTime = subjectVisit.CheckPassedTime, ArmEnum = 1, Code = currentMaxCodeInt + 1, TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit }); await _visitTaskRepository.AddAsync(new VisitTask() { TrialId = subjectVisit.TrialId, SubjectId = subjectVisit.SubjectId, IsUrgent = subjectVisit.IsUrgent, TaskBlindName = subjectVisit.BlindName, TaskName = subjectVisit.VisitName, CheckPassedTime = subjectVisit.CheckPassedTime, ArmEnum = 2, Code = currentMaxCodeInt + 2, TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit }); await _visitTaskRepository.SaveChangesAsync(); } } } } }