87 lines
3.4 KiB
C#
87 lines
3.4 KiB
C#
using EasyCaching.Core;
|
|
using EntityFrameworkCore.Triggered;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using IRaCIS.Core.Infrastructure;
|
|
|
|
namespace IRaCIS.Core.Application.Triggers
|
|
{
|
|
/// <summary>
|
|
/// 处理 访视 末次评估 会影响Subject 状态
|
|
/// </summary>
|
|
public class SubjectVisitPassedTrigger : IAfterSaveTrigger<SubjectVisit>
|
|
{
|
|
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
|
private readonly IRepository<VisitTask> _visitTaskRepository;
|
|
|
|
private readonly IEasyCachingProvider _provider;
|
|
|
|
public SubjectVisitPassedTrigger(IRepository<SubjectVisit> subjectVisitRepository, IRepository<VisitTask> visitTaskRepository, IEasyCachingProvider provider)
|
|
{
|
|
_subjectVisitRepository = subjectVisitRepository;
|
|
_visitTaskRepository = visitTaskRepository;
|
|
_provider = provider;
|
|
}
|
|
|
|
public async Task AfterSave(ITriggerContext<SubjectVisit> 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<int>($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}").Value;
|
|
|
|
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
|
|
|
|
_provider.Set<int>($"{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();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
} |