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();
}
}
}
}
}