irc-netcore-api/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainExt.cs

528 lines
24 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain._DomainEvent;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Cmp;
namespace IRaCIS.Core.Infra.EFCore;
public static class DBContext_Ext
{
public static void AddDomainEvents(this DbContext context)
{
var dbContext = (IRaCISDBContext)context;
var changeTracker = context.ChangeTracker;
//记录要保存到数据库的事件
var eventStoreList = new List<EventStoreRecord>();
#region 中心调研邮件通知
foreach (var entry in changeTracker.Entries<TrialSiteSurvey>())
{
var trialSiteSurvey = entry.Entity;
var originState = entry.Property(p => p.State).OriginalValue;
//状态从待提交 变为CRC提交||SPM 提交 (驳回也会变为已提交,所以必须设置前置状态是待提交)
if ((trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted || trialSiteSurvey.State == TrialSiteSurveyEnum.SPMApproved) && originState == TrialSiteSurveyEnum.ToSubmit)
{
trialSiteSurvey.AddDomainEvent(new UserSiteSurveySubmitedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id });
}
//SPM CPM 提交的时候
else if (trialSiteSurvey.State == TrialSiteSurveyEnum.SPMApproved && originState == TrialSiteSurveyEnum.CRCSubmitted)
{
trialSiteSurvey.AddDomainEvent(new SiteSurveySPMSubmitedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id });
}
//PM 驳回
else if ((trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted || trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit) && originState == TrialSiteSurveyEnum.SPMApproved)
{
trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id, IsHaveSPMOrCPM = trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted });
}
//SPM 驳回
else if (trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit && originState == TrialSiteSurveyEnum.CRCSubmitted)
{
trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id, IsHaveSPMOrCPM = true });
}
//添加进记录
eventStoreList.AddRange(GetStoreEvents(trialSiteSurvey.DomainEvents));
}
#endregion
#region PD 入组发送邮件(不侵入之前的代码,有些判断过于复杂的,在代码里面有的,就手动 在跟踪的实体添加领域事件)
foreach (var entry in changeTracker.Entries<SubjectVisit>())
{
var subjectVisit = entry.Entity;
var originSubmitState = entry.Property(p => p.SubmitState).OriginalValue;
var originAuditState = entry.Property(p => p.AuditState).OriginalValue;
var originCheckState = entry.Property(p => p.CheckState).OriginalValue;
var originCurrentActionUserId = entry.Property(p => p.CurrentActionUserId).OriginalValue;
var originRequestBackState = entry.Property(p => p.RequestBackState).OriginalValue;
//入组或者PD 才执行下面的逻辑
if ((subjectVisit.IsEnrollmentConfirm || subjectVisit.PDState == PDStateEnum.PDProgress))
{
//质控状态变为待审核的时候
if (originSubmitState == SubmitStateEnum.ToSubmit && subjectVisit.SubmitState == SubmitStateEnum.Submitted &&
originAuditState == AuditStateEnum.None && subjectVisit.AuditState == AuditStateEnum.ToAudit
)
{
subjectVisit.AddDomainEvent(new CRCSubmitedAndQCToAuditEvent() { SubjectVisitId = subjectVisit.Id, IsPd = subjectVisit.PDState == PDStateEnum.PDProgress });
}
//一致性核查通知PM发送邮件
if (originCheckState == CheckStateEnum.None && subjectVisit.CheckState == CheckStateEnum.ToCheck
)
{
subjectVisit.AddDomainEvent(new CheckStateChangedToAuditEvent() { IsPd = subjectVisit.PDState == PDStateEnum.PDProgress, SubjectVisitId = subjectVisit.Id });
}
if (originCurrentActionUserId == null && subjectVisit.CurrentActionUserId != null)
{
var businessEnum = subjectVisit.IsEnrollmentConfirm ? EmailBusinessScenario.EligibilityVerification_PendingImageQC : EmailBusinessScenario.PDVerification_PendingImageQC;
var delaySeconds = dbContext.TrialEmailNoticeConfig.Where(t => t.TrialId == subjectVisit.TrialId && t.BusinessScenarioEnum == businessEnum)
.Select(t => t.EmailDelaySeconds).FirstOrDefault();
Console.WriteLine("qc领取任务" + DateTime.Now.ToShortTimeString() + $"延时{delaySeconds}");
if (delaySeconds > 0)
{
subjectVisit.AddDomainEvent(new QCClaimTaskEvent() { IsPd = subjectVisit.PDState == PDStateEnum.PDProgress, SubjectVisitId = subjectVisit.Id, DelaySeconds = delaySeconds, CurrentActionUserId = (Guid)subjectVisit.CurrentActionUserId });
}
}
}
// 重传影像
//CRC 申请 || PM审批的时候
if ((originRequestBackState != RequestBackStateEnum.CRC_RequestBack && subjectVisit.RequestBackState == RequestBackStateEnum.CRC_RequestBack) ||
(originRequestBackState == RequestBackStateEnum.CRC_RequestBack && (subjectVisit.RequestBackState == RequestBackStateEnum.PM_AgressBack || subjectVisit.RequestBackState == RequestBackStateEnum.PM_NotAgree)))
{
subjectVisit.AddDomainEvent(new CheckReuploadEvent() { RequestBackState = subjectVisit.RequestBackState, SubjectVisitId = subjectVisit.Id });
}
//PM 直接退回任务
if ((originSubmitState == SubmitStateEnum.Submitted && subjectVisit.SubmitState == SubmitStateEnum.ToSubmit) &&
(originAuditState == AuditStateEnum.QCPassed && subjectVisit.AuditState == AuditStateEnum.None) &&
(originCheckState == CheckStateEnum.CVPassed && subjectVisit.CheckState == CheckStateEnum.None))
{
subjectVisit.AddDomainEvent(new UnReadVisitTaskReReadingApproval() { SubjectVisitId = subjectVisit.Id });
}
if (subjectVisit.DomainEvents.Count > 0)
{
//添加进记录
eventStoreList.AddRange(GetStoreEvents(subjectVisit.DomainEvents));
}
}
foreach (var entry in changeTracker.Entries<QCChallenge>())
{
var qCChallenge = entry.Entity;
var originReuploadEnum = entry.Property(p => p.ReuploadEnum).OriginalValue;
var findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == qCChallenge.SubjectVisitId)
.Select(t => new { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState, t.Id, t.TrialId }).FirstOrDefault().IfNullThrowException();
//入组或者PD 才执行下面的逻辑
if ((findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress))
{
if (entry.State == EntityState.Added)
{
qCChallenge.AddDomainEvent(new QCRepliedQCChallengeEvent()
{
IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress,
QCChallengeId = qCChallenge.Id,
SubjectVisitId = findSubjectVisit.Id,
TrialId = findSubjectVisit.TrialId
});
}
}
//重传影像
if (
//CRC 申请
(originReuploadEnum != QCChanllengeReuploadEnum.CRCRequestReupload && qCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload)
||
//同意申请
(originReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload && qCChallenge.ReuploadEnum == QCChanllengeReuploadEnum.QCAgreeUpload))
{
qCChallenge.AddDomainEvent(new QCChanllengeReuploadEvent()
{
SubjectVisitId = findSubjectVisit.Id,
ReuploadEnum = qCChallenge.ReuploadEnum
});
}
if (qCChallenge.DomainEvents.Count > 0)
{
//添加进记录
eventStoreList.AddRange(GetStoreEvents(qCChallenge.DomainEvents));
}
}
foreach (var entry in changeTracker.Entries<QCChallengeDialog>())
{
var qCChallengeDialog = entry.Entity;
var findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == qCChallengeDialog.SubjectVisitId)
.Select(t => new { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState, t.Id, t.TrialId }).FirstOrDefault().IfNullThrowException();
//入组或者PD 才执行下面的逻辑
if ((findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress))
{
//CRC 针对质控质疑进行回复
if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)
{
qCChallengeDialog.AddDomainEvent(new CRCRepliedQCChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//QC 针对质控质疑进行回复
else if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.IQC)
{
qCChallengeDialog.AddDomainEvent(new QCRepliedQCChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//添加进记录
eventStoreList.AddRange(GetStoreEvents(qCChallengeDialog.DomainEvents));
}
}
foreach (var entry in changeTracker.Entries<CheckChallengeDialog>())
{
var checkChallengeDialog = entry.Entity;
var findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == checkChallengeDialog.SubjectVisitId)
.Select(t => new { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState, t.Id, t.TrialId }).FirstOrDefault().IfNullThrowException();
//入组或者PD 才执行下面的逻辑
if ((findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress))
{
//CRC 针对质控质疑进行回复
if (entry.State == EntityState.Added && checkChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)
{
checkChallengeDialog.AddDomainEvent(new CRCRepliedCheckChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, CheckChallengeDialogId = checkChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
else if (entry.State == EntityState.Added && checkChallengeDialog.UserTypeEnum == UserTypeEnum.ProjectManager)
{
checkChallengeDialog.AddDomainEvent(new PMRepliedCheckChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, CheckChallengeDialogId = checkChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//添加进记录
eventStoreList.AddRange(GetStoreEvents(checkChallengeDialog.DomainEvents));
}
}
//医学审核任务
foreach (var entry in changeTracker.Entries<TaskMedicalReview>())
{
var taskMedicalReview = entry.Entity;
if (entry.State == EntityState.Added)
{
var findVisitTask = dbContext.VisitTask.Where(t => t.Id == taskMedicalReview.VisitTaskId).Select(t => new { t.SourceSubjectVisitId, t.SouceReadModuleId }).FirstOrDefault().IfNullThrowException();
var findSubjectVisit = new EnrollmentConfirmAndPD();
if (findVisitTask.SourceSubjectVisitId != null)
{
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == findVisitTask.SourceSubjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
else
{
var subjectVisitId = dbContext.ReadModule.Where(t => t.Id == findVisitTask.SouceReadModuleId).Select(t => t.SubjectVisitId).FirstOrDefault();
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == subjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
//入组或者PD 才执行下面的逻辑
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
{
taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId });
//添加进记录
eventStoreList.AddRange(GetStoreEvents(taskMedicalReview.DomainEvents));
}
}
}
//医学反馈
foreach (var entry in changeTracker.Entries<ReadingMedicalReviewDialog>())
{
var readingMedicalReviewDialog = entry.Entity;
var findVisitTask = dbContext.VisitTask.Where(t => t.Id == readingMedicalReviewDialog.VisitTaskId).Select(t => new { t.SourceSubjectVisitId, t.SouceReadModuleId }).FirstOrDefault().IfNullThrowException();
var findSubjectVisit = new EnrollmentConfirmAndPD();
if (findVisitTask.SourceSubjectVisitId != null)
{
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == findVisitTask.SourceSubjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
else
{
var subjectVisitId = dbContext.ReadModule.Where(t => t.Id == findVisitTask.SouceReadModuleId).Select(t => t.SubjectVisitId).FirstOrDefault();
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == subjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
//入组或者PD 才执行下面的逻辑
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
{
if (entry.State == EntityState.Added && readingMedicalReviewDialog.UserTypeEnumInt == (int)UserTypeEnum.MIM)
{
readingMedicalReviewDialog.AddDomainEvent(new UrgentMIMRepliedMedicalReview() { MedicalReviewId = readingMedicalReviewDialog.TaskMedicalReviewId, ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
}
else if (entry.State == EntityState.Added && readingMedicalReviewDialog.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer)
{
readingMedicalReviewDialog.AddDomainEvent(new UrgentIRRepliedMedicalReview() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = readingMedicalReviewDialog.TaskMedicalReviewId, ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
}
//添加进记录
eventStoreList.AddRange(GetStoreEvents(readingMedicalReviewDialog.DomainEvents));
}
}
//任务 申请重阅ReReadingApplyState
foreach (var entry in changeTracker.Entries<VisitTask>())
{
var visitTask = entry.Entity;
var originReReadingApplyState = entry.Property(p => p.ReReadingApplyState).OriginalValue;
if ((originReReadingApplyState != ReReadingApplyState.TrialGroupHaveApplyed && originReReadingApplyState != ReReadingApplyState.DocotorHaveApplyed) && (visitTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || visitTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed))
{
var findSubjectVisit = new EnrollmentConfirmAndPD();
if (visitTask.SourceSubjectVisitId != null)
{
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == visitTask.SourceSubjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
else
{
var subjectVisitId = dbContext.ReadModule.Where(t => t.Id == visitTask.SouceReadModuleId).Select(t => t.SubjectVisitId).FirstOrDefault();
findSubjectVisit = dbContext.SubjectVisit.Where(t => t.Id == subjectVisitId)
.Select(t => new EnrollmentConfirmAndPD { IsEnrollmentConfirm = t.IsEnrollmentConfirm, PDState = t.PDState }).FirstOrDefault();
}
//入组或者PD 才执行下面的逻辑
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
{
visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState = visitTask.ReReadingApplyState });
}
if (visitTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
{
visitTask.AddDomainEvent(new HaveReadVisitTaskReReading() { SubjectId = visitTask.SubjectId, VisitTaskId = visitTask.Id, ReReadingApplyState = visitTask.ReReadingApplyState });
}
}
if ((originReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || originReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed) &&
(visitTask.ReReadingApplyState == ReReadingApplyState.Agree || visitTask.ReReadingApplyState == ReReadingApplyState.Reject))
{
visitTask.AddDomainEvent(new HaveReadVisitTaskReReading() { SubjectId = visitTask.SubjectId, VisitTaskId = visitTask.Id, ReReadingApplyState = visitTask.ReReadingApplyState });
}
if (visitTask.DomainEvents.Count > 0)
{
//添加进记录
eventStoreList.AddRange(GetStoreEvents(visitTask.DomainEvents));
}
}
#endregion
#region 直接申请流程重传
foreach (var entry in changeTracker.Entries<SubjectVisitImageBackRecord>())
{
var subjectVisitImageBackRecord = entry.Entity;
var originApplyUserRole = entry.Property(p => p.ApplyUserRole).OriginalValue;
var originImageBackState = entry.Property(p => p.ImageBackState).OriginalValue;
if (
//申请的时候 每次申请都是新的记录,所以状态只会存在前进,不会存在驳回后或者同意后再次变为申请
(subjectVisitImageBackRecord.ImageBackState == ImageBackStateEnum.None &&
(subjectVisitImageBackRecord.ApplyUserRole == ImageBackApplyEnum.IQCRequestBack || subjectVisitImageBackRecord.ApplyUserRole == ImageBackApplyEnum.CRCRequestBack)) ||
//审核完成的时候
(originImageBackState == ImageBackStateEnum.None && subjectVisitImageBackRecord.ImageBackState != ImageBackStateEnum.None)
)
{
subjectVisitImageBackRecord.AddDomainEvent(new DirectApplyReupdloadEvent()
{
SubjectVisitId = subjectVisitImageBackRecord.SubjectVisitId,
ApplyUserRole = subjectVisitImageBackRecord.ApplyUserRole,
ImageBackState = subjectVisitImageBackRecord.ImageBackState
});
}
if (subjectVisitImageBackRecord.DomainEvents.Count > 0)
{
//添加进记录
eventStoreList.AddRange(GetStoreEvents(subjectVisitImageBackRecord.DomainEvents));
}
}
#endregion
#region 阅片人筛选
var spmApproveEnrollIdList = new List<Guid>();
var pmApplyEnrollIdList = new List<Guid>();
Enroll lastEnroll = null;
foreach (var entry in changeTracker.Entries<Enroll>())
{
var enroll = entry.Entity;
var originEnrollStatus = entry.Property(p => p.EnrollStatus).OriginalValue;
if (originEnrollStatus == EnrollStatus.HasCommittedToCRO && enroll.EnrollStatus == EnrollStatus.InviteIntoGroup)
{
spmApproveEnrollIdList.Add(enroll.Id);
lastEnroll = enroll;
}
if (originEnrollStatus == EnrollStatus.HasApplyDownloadResume && enroll.EnrollStatus == EnrollStatus.HasCommittedToCRO)
{
pmApplyEnrollIdList.Add(enroll.Id);
lastEnroll = enroll;
}
}
if (spmApproveEnrollIdList.Count > 0)
{
lastEnroll.AddDomainEvent(new ReviewerSPMApprovedEvent() { TrialId = lastEnroll.TrialId, EnrollIdList = spmApproveEnrollIdList });
eventStoreList.AddRange(GetStoreEvents(lastEnroll.DomainEvents));
}
if (pmApplyEnrollIdList.Count > 0)
{
lastEnroll.AddDomainEvent(new ReviewerPMApplyEvent() { TrialId = lastEnroll.TrialId, EnrollIdList = pmApplyEnrollIdList });
eventStoreList.AddRange(GetStoreEvents(lastEnroll.DomainEvents));
}
#endregion
//跟随事务一起保存数据库
dbContext.EventStoreRecord.AddRange(eventStoreList);
}
private static List<EventStoreRecord> GetStoreEvents(IReadOnlyCollection<DomainEvent> domainEvents)
{
return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName = t.GetType().Name, EventData = t.ToJsonStr() }).ToList();
}
public class EnrollmentConfirmAndPD
{
public bool IsEnrollmentConfirm { get; set; }
public PDStateEnum PDState { get; set; }
}
#region 暂时废弃
/// <summary>
/// 暂时废弃,没有场景使用
/// </summary>
/// <param name="context"></param>
public static void AddDomainCommands(this DbContext context)
{
var changeTracker = context.ChangeTracker;
//遍历 ChangeTracker 中的实体
//foreach (var entry in changeTracker.Entries<UserLog>())
//{
// var userLog = entry.Entity;
// if (entry.State == EntityState.Added)
// {
// // 受试者添加 触发访视自动添加
// var addCommand = new AddUserLogTriggerCommand { UserLog=userLog };
// userLog.AddDomainCommand(addCommand);
// }
//}
//foreach (var entry in changeTracker.Entries<Subject>())
//{
// var subject = entry.Entity;
// if (entry.State == EntityState.Added)
// {
// // 受试者添加 触发访视自动添加
// var addedEvent = new AddSubjectTriggerCommand { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId };
// subject.AddDomainCommand(addedEvent);
// }
//}
}
#endregion
}