Trigger 修改分类整理
parent
b8f5f32596
commit
7760b0736e
|
@ -75,12 +75,9 @@ namespace IRaCIS.Core.API
|
||||||
|
|
||||||
options.UseTriggers(triggerOptions =>
|
options.UseTriggers(triggerOptions =>
|
||||||
{
|
{
|
||||||
triggerOptions.AddTrigger<AddSubjectTrigger>();
|
triggerOptions.AddTrigger<SubjectTrigger>();
|
||||||
triggerOptions.AddTrigger<ChallengeStateTrigger>();
|
triggerOptions.AddTrigger<ChallengeStateTrigger>();
|
||||||
triggerOptions.AddTrigger<SubjectStateTrigger>();
|
triggerOptions.AddTrigger<SubjectVisitTrigger>();
|
||||||
triggerOptions.AddTrigger<AddCRCCliniaclDataTrigger>();
|
|
||||||
triggerOptions.AddTrigger<SubjectVisitCheckPassedTrigger>();
|
|
||||||
triggerOptions.AddTrigger<SubjectVisitFinalVisitTrigger>();
|
|
||||||
triggerOptions.AddTrigger<SubjectVisitScanDateTrigger>();
|
triggerOptions.AddTrigger<SubjectVisitScanDateTrigger>();
|
||||||
triggerOptions.AddTrigger<TrialCriterionSignTrigger>();
|
triggerOptions.AddTrigger<TrialCriterionSignTrigger>();
|
||||||
triggerOptions.AddTrigger<TableQuestionRowTrigger>();
|
triggerOptions.AddTrigger<TableQuestionRowTrigger>();
|
||||||
|
|
|
@ -16097,32 +16097,19 @@
|
||||||
<param name="trialConfig"></param>
|
<param name="trialConfig"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.SubjectStateTrigger">
|
<member name="T:IRaCIS.Core.Application.Triggers.ChallengeStateTrigger">
|
||||||
<summary>
|
<summary>
|
||||||
|
访视 质疑状态 触发修改
|
||||||
</summary>
|
</summary>
|
||||||
|
<param name="_qcChallengeRepository"></param>
|
||||||
|
<param name="_subjectVisitRepository"></param>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Core.Application.Triggers.SubjectStateTrigger.#ctor(Microsoft.Extensions.Localization.IStringLocalizer,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit})">
|
<member name="M:IRaCIS.Core.Application.Triggers.ChallengeStateTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.QCChallenge},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit})">
|
||||||
<summary>
|
<summary>
|
||||||
|
访视 质疑状态 触发修改
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
<param name="_qcChallengeRepository"></param>
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitFinalVisitTrigger">
|
<param name="_subjectVisitRepository"></param>
|
||||||
<summary>
|
|
||||||
处理 访视 末次评估 会影响Subject 状态
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitFinalVisitTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,Microsoft.Extensions.Localization.IStringLocalizer,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial})">
|
|
||||||
<summary>
|
|
||||||
处理 访视 末次评估 会影响Subject 状态
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitFinalVisitTrigger.DealGenerateReadModuleAndSubjectVisit(IRaCIS.Core.Domain.Models.SubjectVisit)">
|
|
||||||
<summary>
|
|
||||||
处理生成阅片期 以及后续访视状态
|
|
||||||
</summary>
|
|
||||||
<param name="subjectVisit"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger">
|
<member name="T:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger">
|
||||||
<summary>
|
<summary>
|
||||||
|
@ -16134,26 +16121,6 @@
|
||||||
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
|
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.AddSubjectTrigger">
|
|
||||||
<summary>
|
|
||||||
添加访视计划 要给改项目下的所有Subject 添加该访视
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Triggers.AddSubjectTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitStage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},AutoMapper.IMapper)">
|
|
||||||
<summary>
|
|
||||||
添加访视计划 要给改项目下的所有Subject 添加该访视
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger">
|
|
||||||
<summary>
|
|
||||||
处理 访视 末次评估 会影响Subject 状态
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger.#ctor(IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Application.Interfaces.ISubjectCriteriaEvaluationService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation})">
|
|
||||||
<summary>
|
|
||||||
处理 访视 末次评估 会影响Subject 状态
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.TrialCriterionSignTrigger">
|
<member name="T:IRaCIS.Core.Application.Triggers.TrialCriterionSignTrigger">
|
||||||
<summary>
|
<summary>
|
||||||
因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务
|
因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务
|
||||||
|
@ -16185,6 +16152,25 @@
|
||||||
<param name="cancellationToken"></param>
|
<param name="cancellationToken"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:IRaCIS.Core.Application.Triggers.SubjectTrigger">
|
||||||
|
<summary>
|
||||||
|
添加访视计划 要给改项目下的所有Subject 添加该访视
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Triggers.SubjectTrigger.#ctor(Microsoft.Extensions.Localization.IStringLocalizer,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitStage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},AutoMapper.IMapper)">
|
||||||
|
<summary>
|
||||||
|
添加访视计划 要给改项目下的所有Subject 添加该访视
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Triggers.SubjectTrigger.AfterSave(EntityFrameworkCore.Triggered.ITriggerContext{IRaCIS.Core.Domain.Models.Subject},System.Threading.CancellationToken)">
|
||||||
|
<summary>
|
||||||
|
手动设置出组状态
|
||||||
|
</summary>
|
||||||
|
<param name="context"></param>
|
||||||
|
<param name="cancellationToken"></param>
|
||||||
|
<returns></returns>
|
||||||
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
|
</member>
|
||||||
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger">
|
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger">
|
||||||
<summary>
|
<summary>
|
||||||
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
|
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
|
||||||
|
@ -16209,6 +16195,33 @@
|
||||||
<param name="subjectVisitId"></param>
|
<param name="subjectVisitId"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger">
|
||||||
|
<summary>
|
||||||
|
访视保存后: 末次访视设置和取消触发 Subject状态,以后后续访视状态的修改,以及自动生成阅片期和任务
|
||||||
|
访视保存前:一致性核查通过,生成任务
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},Microsoft.Extensions.Localization.IStringLocalizer,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Application.Service.Reading.Interface.IClinicalAnswerService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Application.Interfaces.ISubjectCriteriaEvaluationService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation},IRaCIS.Core.Application.Service.IVisitTaskHelpeService)">
|
||||||
|
<summary>
|
||||||
|
访视保存后: 末次访视设置和取消触发 Subject状态,以后后续访视状态的修改,以及自动生成阅片期和任务
|
||||||
|
访视保存前:一致性核查通过,生成任务
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.DealGenerateReadModuleAndSubjectVisit(IRaCIS.Core.Domain.Models.SubjectVisit)">
|
||||||
|
<summary>
|
||||||
|
处理生成阅片期 以及后续访视状态
|
||||||
|
</summary>
|
||||||
|
<param name="subjectVisit"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.VerifyDealFinalVisitAsync(IRaCIS.Core.Domain.Models.SubjectVisit)">
|
||||||
|
<summary>
|
||||||
|
验证末次访视
|
||||||
|
</summary>
|
||||||
|
<param name="subjectVisit"></param>
|
||||||
|
<returns></returns>
|
||||||
|
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||||
|
</member>
|
||||||
<member name="P:IRaCIS.Core.Domain.Models.ReadModuleView.Id">
|
<member name="P:IRaCIS.Core.Domain.Models.ReadModuleView.Id">
|
||||||
<summary>
|
<summary>
|
||||||
Id(阅片期Id 或者 访视ID)
|
Id(阅片期Id 或者 访视ID)
|
||||||
|
|
|
@ -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
|
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>
|
public class ChallengeStateTrigger(IRepository<QCChallenge> _qcChallengeRepository, IRepository<SubjectVisit> _subjectVisitRepository) : IAfterSaveTrigger<QCChallenge>
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
using AutoMapper;
|
|
||||||
using EntityFrameworkCore.Triggered;
|
|
||||||
using MassTransit;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Triggers
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 添加访视计划 要给改项目下的所有Subject 添加该访视
|
|
||||||
/// </summary>
|
|
||||||
public class AddSubjectTrigger(
|
|
||||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
|
||||||
IRepository<VisitStage> _visitStageRepository,
|
|
||||||
IRepository<Trial> _trialRepository,
|
|
||||||
IMapper _mapper) : IBeforeSaveTrigger<Subject>
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
public async Task BeforeSave(ITriggerContext<Subject> context, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var subject = context.Entity;
|
|
||||||
|
|
||||||
if (context.ChangeType == ChangeType.Added)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//添加受试者的时候,获取访视计划列表,添加到受试者访视表。
|
|
||||||
var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == subject.TrialId && t.IsConfirmed).ToListAsync();
|
|
||||||
|
|
||||||
var svList = _mapper.Map<List<SubjectVisit>>(visitPlanList);
|
|
||||||
|
|
||||||
var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == subject.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
svList.ForEach(t =>
|
|
||||||
{
|
|
||||||
t.Subject = subject;
|
|
||||||
t.SubjectId = subject.Id;
|
|
||||||
t.TrialId = subject.TrialId;
|
|
||||||
t.TrialSiteId = subject.TrialSiteId;
|
|
||||||
t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
|
|
||||||
t.Id = NewId.NextGuid();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
await _subjectVisitRepository.AddRangeAsync(svList);
|
|
||||||
|
|
||||||
await _subjectVisitRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
using EntityFrameworkCore.Triggered;
|
|
||||||
using IRaCIS.Core.Application.Interfaces;
|
|
||||||
using IRaCIS.Core.Domain.Share;
|
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Triggers
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 处理 访视 末次评估 会影响Subject 状态
|
|
||||||
/// </summary>
|
|
||||||
public class SubjectVisitCheckPassedTrigger(
|
|
||||||
IVisitTaskHelpeService _visitTaskHelpeService,
|
|
||||||
IRepository<Subject> _subjectRepository,
|
|
||||||
IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
|
|
||||||
ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService,
|
|
||||||
IRepository<SubjectCriteriaEvaluation> _subjectCriteriaEvaluationRepository) : IBeforeSaveTrigger<SubjectVisit>
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
public async Task BeforeSave(ITriggerContext<SubjectVisit> context, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var subjectVisit = context.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
if (context.ChangeType == ChangeType.Modified)
|
|
||||||
{
|
|
||||||
|
|
||||||
// 一致性核查通过 生成读片任务
|
|
||||||
if (context.UnmodifiedEntity?.CheckState != subjectVisit.CheckState && subjectVisit.CheckState == CheckStateEnum.CVPassed)
|
|
||||||
{
|
|
||||||
//退回或者重阅的任务一致性核查通过了 此时设置Subject 重阅影响状态
|
|
||||||
if (context.Entity.IsPMBackOrReReading == true)
|
|
||||||
{
|
|
||||||
await _subjectRepository.UpdatePartialFromQueryAsync(context.Entity.SubjectId, u => new Subject() { IsReReadingOrBackInfluenceAnalysis = false });
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Entity.IsPMBackOrReReading = false;
|
|
||||||
|
|
||||||
//找到手动生成任务的标准
|
|
||||||
var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId, t.IsReadingTaskViewInOrder }).ToListAsync();
|
|
||||||
|
|
||||||
foreach (var criterion in criterionList)
|
|
||||||
{
|
|
||||||
//if(!await _SubjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId&& t.SubjectVisitId==subjectVisit.Id && t.TrialReadingCriterionId == criterion.Id))
|
|
||||||
//{
|
|
||||||
// await _SubjectCriteriaEvaluationVisitFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitFilter() { SubjectId = subjectVisit.SubjectId, SubjectVisitId = subjectVisit.Id, TrialReadingCriterionId = criterion.Id });
|
|
||||||
//}
|
|
||||||
|
|
||||||
//如果参与评估,那么久对当前访视进行自动筛选
|
|
||||||
if (await _subjectCriteriaEvaluationRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == criterion.Id && t.IsJoinEvaluation))
|
|
||||||
{
|
|
||||||
await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List<Guid>() { subjectVisit.Id }, true);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +1,36 @@
|
||||||
using EntityFrameworkCore.Triggered;
|
using AutoMapper;
|
||||||
|
using EntityFrameworkCore.Triggered;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
|
using MassTransit;
|
||||||
using Microsoft.Extensions.Localization;
|
using Microsoft.Extensions.Localization;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Triggers
|
namespace IRaCIS.Core.Application.Triggers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// 添加访视计划 要给改项目下的所有Subject 添加该访视
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SubjectStateTrigger(
|
public class SubjectTrigger(
|
||||||
IStringLocalizer _localizer,
|
IStringLocalizer _localizer,
|
||||||
IRepository<SubjectVisit> _subjectVisitRepository) : IAfterSaveTrigger<Subject>
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
|
IRepository<VisitStage> _visitStageRepository,
|
||||||
|
IRepository<Trial> _trialRepository,
|
||||||
|
IMapper _mapper) : IBeforeSaveTrigger<Subject>, IAfterSaveTrigger<Subject>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 手动设置出组状态
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||||
public async Task AfterSave(ITriggerContext<Subject> context, CancellationToken cancellationToken)
|
public async Task AfterSave(ITriggerContext<Subject> context, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
|
||||||
var dbSubject = context.Entity;
|
|
||||||
|
|
||||||
if (context.ChangeType == ChangeType.Modified)
|
if (context.ChangeType == ChangeType.Modified)
|
||||||
{
|
{
|
||||||
//Site变更
|
var dbSubject = context.Entity;
|
||||||
|
|
||||||
|
//Site变更
|
||||||
if (context.Entity.TrialSiteId != context.UnmodifiedEntity?.TrialSiteId)
|
if (context.Entity.TrialSiteId != context.UnmodifiedEntity?.TrialSiteId)
|
||||||
{
|
{
|
||||||
var subjectId = context.Entity.Id;
|
var subjectId = context.Entity.Id;
|
||||||
|
@ -31,8 +39,6 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
|
|
||||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId });
|
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId, u => new SubjectVisit() { TrialSiteId = trialSiteId });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 废弃
|
#region 废弃
|
||||||
////如果访视结束了 需要删除计划外未执行的访视
|
////如果访视结束了 需要删除计划外未执行的访视
|
||||||
//if (mapedSubject.Status == SubjectStatus.EndOfVisit)
|
//if (mapedSubject.Status == SubjectStatus.EndOfVisit)
|
||||||
|
@ -81,11 +87,40 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task BeforeSave(ITriggerContext<Subject> context, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var subject = context.Entity;
|
||||||
|
|
||||||
|
if (context.ChangeType == ChangeType.Added)
|
||||||
|
{
|
||||||
|
|
||||||
|
//添加受试者的时候,获取访视计划列表,添加到受试者访视表。
|
||||||
|
var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == subject.TrialId && t.IsConfirmed).ToListAsync();
|
||||||
|
|
||||||
|
var svList = _mapper.Map<List<SubjectVisit>>(visitPlanList);
|
||||||
|
|
||||||
|
var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == subject.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
svList.ForEach(t =>
|
||||||
|
{
|
||||||
|
t.Subject = subject;
|
||||||
|
t.SubjectId = subject.Id;
|
||||||
|
t.TrialId = subject.TrialId;
|
||||||
|
t.TrialSiteId = subject.TrialSiteId;
|
||||||
|
t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
|
||||||
|
t.Id = NewId.NextGuid();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
await _subjectVisitRepository.AddRangeAsync(svList);
|
||||||
|
|
||||||
|
await _subjectVisitRepository.SaveChangesAsync();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
using EntityFrameworkCore.Triggered;
|
using EntityFrameworkCore.Triggered;
|
||||||
|
using IRaCIS.Core.Application.Interfaces;
|
||||||
|
using IRaCIS.Core.Application.Service.Reading.Interface;
|
||||||
using IRaCIS.Core.Application.ViewModel;
|
using IRaCIS.Core.Application.ViewModel;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
|
@ -8,18 +10,23 @@ using Microsoft.Extensions.Localization;
|
||||||
namespace IRaCIS.Core.Application.Triggers
|
namespace IRaCIS.Core.Application.Triggers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理 访视 末次评估 会影响Subject 状态
|
/// 访视保存后: 末次访视设置和取消触发 Subject状态,以后后续访视状态的修改,以及自动生成阅片期和任务
|
||||||
|
/// 访视保存前:一致性核查通过,生成任务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SubjectVisitFinalVisitTrigger(
|
public class SubjectVisitTrigger(
|
||||||
IRepository<SubjectVisit> _subjectVisitRepository,
|
IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
IRepository<ReadModule> _readModuleRepository,
|
IRepository<ReadModule> _readModuleRepository,
|
||||||
IRepository<Subject> _subjectRepository,
|
IRepository<Subject> _subjectRepository,
|
||||||
IRepository<VisitTask> _visitTaskRepository,
|
IRepository<VisitTask> _visitTaskRepository,
|
||||||
IVisitTaskHelpeService _ivisitTaskHelpeService,
|
|
||||||
IStringLocalizer _localizer,
|
IStringLocalizer _localizer,
|
||||||
IRepository<Trial> _trialRepository,
|
IRepository<Trial> _trialRepository,
|
||||||
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository
|
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
|
||||||
) : IAfterSaveTrigger<SubjectVisit>
|
IClinicalAnswerService _iClinicalAnswerService,
|
||||||
|
IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository,
|
||||||
|
ISubjectCriteriaEvaluationService _subjectCriteriaEvaluationService,
|
||||||
|
IRepository<SubjectCriteriaEvaluation> _subjectCriteriaEvaluationRepository,
|
||||||
|
IVisitTaskHelpeService _visitTaskHelpeService
|
||||||
|
) : IAfterSaveTrigger<SubjectVisit>, IBeforeSaveTrigger<SubjectVisit>
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,28 +47,78 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
await VerifyDealFinalVisitAsync(subjectVisit);
|
await VerifyDealFinalVisitAsync(subjectVisit);
|
||||||
|
|
||||||
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//回退
|
//回退
|
||||||
|
|
||||||
await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisit.SubjectId,
|
await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisit.SubjectId,
|
||||||
u => new Subject() { Status = SubjectStatus.OnVisit, FinalSubjectVisitId = null });
|
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 });
|
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)
|
else if (context.ChangeType == ChangeType.Added)
|
||||||
{
|
{
|
||||||
await VerifyDealFinalVisitAsync(subjectVisit);
|
|
||||||
|
|
||||||
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
if (subjectVisit.IsFinalVisit)
|
||||||
|
{
|
||||||
|
await VerifyDealFinalVisitAsync(subjectVisit);
|
||||||
|
|
||||||
|
await DealGenerateReadModuleAndSubjectVisit(subjectVisit);
|
||||||
|
}
|
||||||
|
|
||||||
|
//访视添加后 自动处理临床数据 移动
|
||||||
|
await _iClinicalAnswerService.AutoAddCRCClinical(new Service.Reading.Dto.AutoAddClinicalInDto()
|
||||||
|
{
|
||||||
|
TrialId = subjectVisit.TrialId,
|
||||||
|
SubjectId = subjectVisit.SubjectId,
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task BeforeSave(ITriggerContext<SubjectVisit> context, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var subjectVisit = context.Entity;
|
||||||
|
|
||||||
|
if (context.ChangeType == ChangeType.Modified)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 一致性核查通过 生成读片任务
|
||||||
|
if (context.UnmodifiedEntity?.CheckState != subjectVisit.CheckState && subjectVisit.CheckState == CheckStateEnum.CVPassed)
|
||||||
|
{
|
||||||
|
//退回或者重阅的任务一致性核查通过了 此时设置Subject 重阅影响状态
|
||||||
|
if (context.Entity.IsPMBackOrReReading == true)
|
||||||
|
{
|
||||||
|
await _subjectRepository.UpdatePartialFromQueryAsync(context.Entity.SubjectId, u => new Subject() { IsReReadingOrBackInfluenceAnalysis = false });
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Entity.IsPMBackOrReReading = false;
|
||||||
|
|
||||||
|
//找到手动生成任务的标准
|
||||||
|
var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId, t.IsReadingTaskViewInOrder }).ToListAsync();
|
||||||
|
|
||||||
|
foreach (var criterion in criterionList)
|
||||||
|
{
|
||||||
|
//if(!await _SubjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId&& t.SubjectVisitId==subjectVisit.Id && t.TrialReadingCriterionId == criterion.Id))
|
||||||
|
//{
|
||||||
|
// await _SubjectCriteriaEvaluationVisitFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitFilter() { SubjectId = subjectVisit.SubjectId, SubjectVisitId = subjectVisit.Id, TrialReadingCriterionId = criterion.Id });
|
||||||
|
//}
|
||||||
|
|
||||||
|
//如果参与评估,那么久对当前访视进行自动筛选
|
||||||
|
if (await _subjectCriteriaEvaluationRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == criterion.Id && t.IsJoinEvaluation))
|
||||||
|
{
|
||||||
|
await _subjectCriteriaEvaluationService.AutoSubjectCriteriaEvaluationVisitFilter(subjectVisit.SubjectId, subjectVisit.Id, criterion.Id);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List<Guid>() { subjectVisit.Id }, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +159,6 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
var readModule = await _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialReadingCriterionId == item.Id && x.SubjectVisitId == subjectVisitId).FirstOrDefaultAsync();
|
var readModule = await _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialReadingCriterionId == item.Id && x.SubjectVisitId == subjectVisitId).FirstOrDefaultAsync();
|
||||||
|
|
||||||
if (readModule == null)
|
if (readModule == null)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
ReadModule newReadModule = new ReadModule()
|
ReadModule newReadModule = new ReadModule()
|
||||||
|
@ -128,7 +184,7 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
|
|
||||||
foreach (var visitTask in visitTaskList)
|
foreach (var visitTask in visitTaskList)
|
||||||
{
|
{
|
||||||
await _ivisitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
|
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
|
||||||
{
|
{
|
||||||
OriginalVisitId = visitTask.Id,
|
OriginalVisitId = visitTask.Id,
|
||||||
ReadingCategory = GenerateTaskCategory.Global,
|
ReadingCategory = GenerateTaskCategory.Global,
|
||||||
|
@ -158,6 +214,12 @@ namespace IRaCIS.Core.Application.Triggers
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证末次访视
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="subjectVisit"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||||
private async Task VerifyDealFinalVisitAsync(SubjectVisit subjectVisit)
|
private async Task VerifyDealFinalVisitAsync(SubjectVisit subjectVisit)
|
||||||
{
|
{
|
||||||
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum &&
|
if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectVisit.SubjectId && t.VisitNum > subjectVisit.VisitNum &&
|
Loading…
Reference in New Issue