Trigger 修改分类整理
This commit is contained in:
@@ -1,26 +0,0 @@
|
||||
using EntityFrameworkCore.Triggered;
|
||||
using IRaCIS.Core.Application.Service.Reading.Interface;
|
||||
|
||||
namespace IRaCIS.Core.Application.Triggers
|
||||
{
|
||||
public class AddCRCCliniaclDataTrigger(
|
||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||
IClinicalAnswerService _iClinicalAnswerService) : IAfterSaveTrigger<SubjectVisit>
|
||||
{
|
||||
|
||||
|
||||
//注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId
|
||||
public async Task AfterSave(ITriggerContext<SubjectVisit> context, CancellationToken cancellationToken)
|
||||
{
|
||||
var subjectVisit = context.Entity;
|
||||
|
||||
await _iClinicalAnswerService.AutoAddCRCClinical(new Service.Reading.Dto.AutoAddClinicalInDto()
|
||||
{
|
||||
TrialId = subjectVisit.TrialId,
|
||||
SubjectId = subjectVisit.SubjectId,
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,11 @@ using IRaCIS.Core.Domain.Share;
|
||||
namespace IRaCIS.Core.Application.Triggers
|
||||
{
|
||||
|
||||
//访视 质疑状态 触发修改
|
||||
/// <summary>
|
||||
/// 访视 质疑状态 触发修改
|
||||
/// </summary>
|
||||
/// <param name="_qcChallengeRepository"></param>
|
||||
/// <param name="_subjectVisitRepository"></param>
|
||||
public class ChallengeStateTrigger(IRepository<QCChallenge> _qcChallengeRepository, IRepository<SubjectVisit> _subjectVisitRepository) : IAfterSaveTrigger<QCChallenge>
|
||||
{
|
||||
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
using EntityFrameworkCore.Triggered;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace IRaCIS.Core.Application.Triggers
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class SubjectStateTrigger(
|
||||
IStringLocalizer _localizer,
|
||||
IRepository<SubjectVisit> _subjectVisitRepository) : IAfterSaveTrigger<Subject>
|
||||
{
|
||||
|
||||
|
||||
public async Task AfterSave(ITriggerContext<Subject> context, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
var dbSubject = context.Entity;
|
||||
|
||||
if (context.ChangeType == ChangeType.Modified)
|
||||
{
|
||||
//Site变更
|
||||
|
||||
if (context.Entity.TrialSiteId != context.UnmodifiedEntity?.TrialSiteId)
|
||||
{
|
||||
var subjectId = context.Entity.Id;
|
||||
var trialSiteId = context.Entity.TrialSiteId;
|
||||
|
||||
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId });
|
||||
|
||||
|
||||
|
||||
#region 废弃
|
||||
////如果访视结束了 需要删除计划外未执行的访视
|
||||
//if (mapedSubject.Status == SubjectStatus.EndOfVisit)
|
||||
//{
|
||||
// await _repository.DeleteFromQueryAsync<SubjectVisit>(t => t.VisitExecuted == VisitExecutedEnum.UnExecuted && t.SubjectId == mapedSubject.Id && t.InPlan == false);
|
||||
//}
|
||||
|
||||
////如果是出组了 将受试者未执行的 设置为不可用
|
||||
//if (mapedSubject.Status == SubjectStatus.OutOfEnrollment)
|
||||
//{
|
||||
// await _repository.UpdateFromQueryAsync<SubjectVisit>(t => t.SubjectId == mapedSubject.Id && t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
|
||||
//}
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
// 出组 状态发生了变更
|
||||
if (context.Entity.Status == SubjectStatus.OutOfVisit && context.Entity.Status != context.UnmodifiedEntity?.Status)
|
||||
{
|
||||
if (context.Entity.FinalSubjectVisitId != null)
|
||||
{
|
||||
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.IsFinalVisit && t.Id != dbSubject.FinalSubjectVisitId))
|
||||
{
|
||||
|
||||
throw new BusinessValidationFailedException(
|
||||
//---该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。
|
||||
_localizer["SubjectState_CannotSetCurrentAsLastVisit"]);
|
||||
}
|
||||
|
||||
var sv = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == dbSubject.FinalSubjectVisitId).IfNullThrowException();
|
||||
|
||||
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum && t.SubmitState == SubmitStateEnum.ToSubmit))
|
||||
{
|
||||
|
||||
throw new BusinessValidationFailedException(
|
||||
//---该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。
|
||||
_localizer["SubjectState_CannotSetAsLastVisitWithImage"]);
|
||||
|
||||
}
|
||||
|
||||
sv.IsFinalVisit = true;
|
||||
|
||||
await _subjectVisitRepository.SaveChangesAsync();
|
||||
//末次访视后的 访视设置为不可用
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == dbSubject.Id && t.VisitNum > sv.VisitNum, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,174 +0,0 @@
|
||||
using EntityFrameworkCore.Triggered;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using MassTransit;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace IRaCIS.Core.Application.Triggers
|
||||
{
|
||||
/// <summary>
|
||||
/// 处理 访视 末次评估 会影响Subject 状态
|
||||
/// </summary>
|
||||
public class SubjectVisitFinalVisitTrigger(
|
||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||
IRepository<ReadModule> _readModuleRepository,
|
||||
IRepository<Subject> _subjectRepository,
|
||||
IRepository<VisitTask> _visitTaskRepository,
|
||||
IVisitTaskHelpeService _ivisitTaskHelpeService,
|
||||
IStringLocalizer _localizer,
|
||||
IRepository<Trial> _trialRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository
|
||||
) : IAfterSaveTrigger<SubjectVisit>
|
||||
{
|
||||
|
||||
|
||||
public async Task AfterSave(ITriggerContext<SubjectVisit> context, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
var subjectVisit = context.Entity;
|
||||
|
||||
|
||||
if (context.ChangeType == ChangeType.Modified)
|
||||
{
|
||||
|
||||
// 修改了IsFinalVisit
|
||||
if (context.UnmodifiedEntity?.IsFinalVisit != subjectVisit.IsFinalVisit)
|
||||
{
|
||||
if (subjectVisit.IsFinalVisit)
|
||||
{
|
||||
await VerifyDealFinalVisitAsync(subjectVisit);
|
||||
|
||||
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//回退
|
||||
|
||||
await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisit.SubjectId,
|
||||
u => new Subject() { Status = SubjectStatus.OnVisit, FinalSubjectVisitId = null });
|
||||
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitExecuted == VisitExecutedEnum.Unavailable, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.UnExecuted });
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if (context.ChangeType == ChangeType.Added && subjectVisit.IsFinalVisit)
|
||||
{
|
||||
await VerifyDealFinalVisitAsync(subjectVisit);
|
||||
|
||||
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理生成阅片期 以及后续访视状态
|
||||
/// </summary>
|
||||
/// <param name="subjectVisit"></param>
|
||||
/// <returns></returns>
|
||||
private async Task DealGenerateReadModuleAndSubjectVisit(SubjectVisit subjectVisit)
|
||||
{
|
||||
|
||||
await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisit.SubjectId,
|
||||
u => new Subject() { Status = SubjectStatus.OutOfVisit, FinalSubjectVisitId = subjectVisit.Id });
|
||||
|
||||
|
||||
//末次访视后的 访视设置为不可用
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum &&
|
||||
t.VisitExecuted == VisitExecutedEnum.UnExecuted, u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.Unavailable });
|
||||
|
||||
|
||||
#region 末次访视生成阅片器和任务
|
||||
|
||||
|
||||
var trialId = subjectVisit.TrialId;
|
||||
var subjectVisitId = subjectVisit.Id;
|
||||
// 是否全局阅片
|
||||
|
||||
|
||||
var trial = await _trialRepository.Where(x => x.Id == trialId).FirstNotNullAsync();
|
||||
|
||||
|
||||
if (!subjectVisit.IsBaseLine && subjectVisit.SubmitState == SubmitStateEnum.Submitted)
|
||||
{
|
||||
var criterionList = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialId && x.ReadingInfoSignTime != null && x.IsConfirm && x.IsReadingPeriod && x.IsReadingTaskViewInOrder == ReadingOrder.InOrder).ToListAsync();
|
||||
foreach (var item in criterionList)
|
||||
{
|
||||
|
||||
var readModule = await _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialReadingCriterionId == item.Id && x.SubjectVisitId == subjectVisitId).FirstOrDefaultAsync();
|
||||
|
||||
if (readModule == null)
|
||||
|
||||
{
|
||||
|
||||
ReadModule newReadModule = new ReadModule()
|
||||
{
|
||||
//ReadingPeriodSetId = readingPeriodSet.Id,
|
||||
Id = NewId.NextGuid(),
|
||||
IsUrgent = subjectVisit.IsUrgent,
|
||||
SubjectVisitId = subjectVisitId,
|
||||
ReadingStatus = ReadingStatusEnum.TaskAllocate,
|
||||
SubjectId = subjectVisit.SubjectId,
|
||||
ModuleName = $"G-{subjectVisit.VisitName}",// 全局阅片
|
||||
ReadingSetType = ReadingSetType.ImageReading,
|
||||
ModuleType = ModuleTypeEnum.Global,
|
||||
TrialId = subjectVisit.TrialId,
|
||||
//VisitNum = subjectVisit.VisitNum,
|
||||
TrialReadingCriterionId = item.Id,
|
||||
};
|
||||
|
||||
readModule = await _readModuleRepository.AddAsync(newReadModule);
|
||||
}
|
||||
|
||||
var visitTaskList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == item.Id && x.SourceSubjectVisitId == subjectVisitId && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned).ToListAsync();
|
||||
|
||||
foreach (var visitTask in visitTaskList)
|
||||
{
|
||||
await _ivisitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
|
||||
{
|
||||
OriginalVisitId = visitTask.Id,
|
||||
ReadingCategory = GenerateTaskCategory.Global,
|
||||
TrialId = subjectVisit.TrialId,
|
||||
|
||||
ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
|
||||
|
||||
new ReadingGenerataTaskDTO (){
|
||||
IsUrgent=subjectVisit.IsUrgent,
|
||||
ReadingCategory=ReadingCategory.Global,
|
||||
ReadingName=readModule.ModuleName,
|
||||
ReadModuleId=readModule.Id,
|
||||
SubjectId=subjectVisit.SubjectId,
|
||||
VisitNum=visitTask.VisitTaskNum,
|
||||
},
|
||||
|
||||
},
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
await _readModuleRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
private async Task VerifyDealFinalVisitAsync(SubjectVisit subjectVisit)
|
||||
{
|
||||
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum &&
|
||||
(t.SubmitState == SubmitStateEnum.ToSubmit || t.SubmitState == SubmitStateEnum.Submitted)))
|
||||
{
|
||||
//---该受试者已有后续访视已上传影像或已提交,当前访视不允许设置为末次访视。
|
||||
throw new BusinessValidationFailedException(_localizer["SubjectVisit_CannotSetAsLastVisit"]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user