入组或者PD 增加触发和消费者
continuous-integration/drone/push Build is passing Details

IRC_NewDev
hang 2024-10-10 16:07:58 +08:00
parent 2d1785f513
commit 9ad11b16d1
9 changed files with 513 additions and 73 deletions

View File

@ -12727,6 +12727,21 @@
<param name="_trialRepository"></param> <param name="_trialRepository"></param>
<param name="_mapper"></param> <param name="_mapper"></param>
</member> </member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMedicalReviewAddedEventConsumer">
<summary>
加急的医学反馈任务 通知MIM
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMIMRepliedMedicalReviewConsumer">
<summary>
MIM 回复医学返回通知IR
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UrgentIRApplyedReReadingConsumer">
<summary>
加急阅片 IR 申请重阅
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UserSiteSurveySubmitedEventConsumer"> <member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UserSiteSurveySubmitedEventConsumer">
<summary> <summary>
用户提交 发送邮件 通知SPM 或者PM 用户提交 发送邮件 通知SPM 或者PM
@ -12742,6 +12757,36 @@
调研表驳回发送邮件 之前已有,需要迁移过来 调研表驳回发送邮件 之前已有,需要迁移过来
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CRCSubmitedAndQCToAuditEventConsumer">
<summary>
CRC 提交了 通知QC进行质控
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CRCRepliedQCChallengeEventConsumer">
<summary>
CRC 回复质控质疑 通知QC
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.QCRepliedQCChallengeEventConsumer">
<summary>
QC回复 质控质疑通知CRC
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CRCRepliedCheckChallengeEventConsumer">
<summary>
CRC 回复一致性核查质疑 通知PM
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.PMRepliedCheckChallengeEventConsumer">
<summary>
PM 一致性核查 通知CRC
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CheckStateChangedToAuditEventConsumer">
<summary>
通知PM 进行一致性核查
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.MediatorHttpContextScopeFilterExtensions"> <member name="T:IRaCIS.Core.Application.MassTransit.Consumer.MediatorHttpContextScopeFilterExtensions">
<summary> <summary>
参考链接https://github.com/MassTransit/MassTransit/discussions/2498 参考链接https://github.com/MassTransit/MassTransit/discussions/2498

View File

@ -0,0 +1,58 @@
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.BaseModel;
using MassTransit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// <summary>
/// 加急的医学反馈任务 通知MIM
/// </summary>
public class UrgentMedicalReviewAddedEventConsumer : IConsumer<UrgentMedicalReviewAddedEvent>
{
public Task Consume(ConsumeContext<UrgentMedicalReviewAddedEvent> context)
{
throw new NotImplementedException();
}
}
//IR 回复医学反馈通知MIM
public class UrgentIRRepliedMedicalReviewConsumer : IConsumer<UrgentIRRepliedMedicalReview>
{
public Task Consume(ConsumeContext<UrgentIRRepliedMedicalReview> context)
{
throw new NotImplementedException();
}
}
public class UrgentIRRepliedMedicalReview : DomainEvent
{
public Guid ReadingMedicalReviewDialogId { get; set; }
}
/// <summary>
/// MIM 回复医学返回通知IR
/// </summary>
public class UrgentMIMRepliedMedicalReviewConsumer : IConsumer<UrgentMIMRepliedMedicalReview>
{
public Task Consume(ConsumeContext<UrgentMIMRepliedMedicalReview> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 加急阅片 IR 申请重阅
/// </summary>
public class UrgentIRApplyedReReadingConsumer : IConsumer<UrgentIRApplyedReReading>
{
public Task Consume(ConsumeContext<UrgentIRApplyedReReading> context)
{
throw new NotImplementedException();
}
}

View File

@ -8,41 +8,38 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace IRaCIS.Core.Application.MassTransit.Consumer namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// <summary>
/// 用户提交 发送邮件 通知SPM 或者PM
/// </summary>
public class UserSiteSurveySubmitedEventConsumer : IConsumer<UserSiteSurveySubmitedEvent>
{ {
/// <summary> public Task Consume(ConsumeContext<UserSiteSurveySubmitedEvent> context)
/// 用户提交 发送邮件 通知SPM 或者PM
/// </summary>
public class UserSiteSurveySubmitedEventConsumer : IConsumer<UserSiteSurveySubmitedEvent>
{ {
public Task Consume(ConsumeContext<UserSiteSurveySubmitedEvent> context) throw new NotImplementedException();
{ }
throw new NotImplementedException(); }
}
/// <summary>
/// 调研表初审通过,进行复审发送邮件
/// </summary>
public class SiteSurveySPMSubmitedEventConsumer : IConsumer<SiteSurveySPMSubmitedEvent>
{
public Task Consume(ConsumeContext<SiteSurveySPMSubmitedEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 调研表驳回发送邮件 之前已有,需要迁移过来
/// </summary>
public class SiteSurverRejectedEventConsumer : IConsumer<SiteSurverRejectedEvent>
{
public Task Consume(ConsumeContext<SiteSurverRejectedEvent> context)
{
throw new NotImplementedException();
} }
/// <summary>
/// 调研表初审通过,进行复审发送邮件
/// </summary>
public class SiteSurveySPMSubmitedEventConsumer : IConsumer<SiteSurveySPMSubmitedEvent>
{
public Task Consume(ConsumeContext<SiteSurveySPMSubmitedEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 调研表驳回发送邮件 之前已有,需要迁移过来
/// </summary>
public class SiteSurverRejectedEventConsumer : IConsumer<SiteSurverRejectedEvent>
{
public Task Consume(ConsumeContext<SiteSurverRejectedEvent> context)
{
throw new NotImplementedException();
}
}
} }

View File

@ -0,0 +1,85 @@
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.BaseModel;
using MassTransit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// <summary>
/// CRC 提交了 通知QC进行质控
/// </summary>
public class CRCSubmitedAndQCToAuditEventConsumer : IConsumer<CRCSubmitedAndQCToAuditEvent>
{
public Task Consume(ConsumeContext<CRCSubmitedAndQCToAuditEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// CRC 回复质控质疑 通知QC
/// </summary>
public class CRCRepliedQCChallengeEventConsumer : IConsumer<CRCRepliedQCChallengeEvent>
{
public Task Consume(ConsumeContext<CRCRepliedQCChallengeEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// QC回复 质控质疑通知CRC
/// </summary>
public class QCRepliedQCChallengeEventConsumer : IConsumer<QCRepliedQCChallengeEvent>
{
public Task Consume(ConsumeContext<QCRepliedQCChallengeEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// CRC 回复一致性核查质疑 通知PM
/// </summary>
public class CRCRepliedCheckChallengeEventConsumer : IConsumer<CRCRepliedCheckChallengeEvent>
{
public Task Consume(ConsumeContext<CRCRepliedCheckChallengeEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// PM 一致性核查 通知CRC
/// </summary>
public class PMRepliedCheckChallengeEventConsumer : IConsumer<PMRepliedCheckChallengeEvent>
{
public Task Consume(ConsumeContext<PMRepliedCheckChallengeEvent> context)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 通知PM 进行一致性核查
/// </summary>
public class CheckStateChangedToAuditEventConsumer : IConsumer<CheckStateChangedToAuditEvent>
{
public Task Consume(ConsumeContext<CheckStateChangedToAuditEvent> context)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,41 @@
using IRaCIS.Core.Domain.BaseModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Domain;
/// <summary>
/// 加急的医学反馈任务 通知MIM
/// </summary>
public class UrgentMedicalReviewAddedEvent : DomainEvent
{
public Guid VisitTaskId { get; set; }
public Guid MedicalReviewId { get; set; }
}
//IR 回复医学反馈通知MIM
public class UrgentIRRepliedMedicalReview : DomainEvent
{
public Guid ReadingMedicalReviewDialogId { get; set; }
}
/// <summary>
/// MIM 回复医学返回通知IR
/// </summary>
public class UrgentMIMRepliedMedicalReview : DomainEvent
{
public Guid ReadingMedicalReviewDialogId { get; set; }
}
/// <summary>
/// 加急阅片 IR 申请重阅
/// </summary>
public class UrgentIRApplyedReReading : DomainEvent
{
public Guid VisitTaskId { get; set; }
}

View File

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Domain._DomainEvent
{
}

View File

@ -0,0 +1,79 @@
using IRaCIS.Core.Domain.BaseModel;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Domain;
/// <summary>
/// CRC 提交了 通知QC进行质控
/// </summary>
public class CRCSubmitedAndQCToAuditEvent : DomainEvent
{
public Guid SubjectVisitId { get; set; }
}
/// <summary>
/// CRC 回复质控质疑 通知QC
/// </summary>
public class CRCRepliedQCChallengeEvent : DomainEvent
{
public Guid QCChallengeDialogId { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
}
/// <summary>
/// QC回复 质控质疑通知CRC
/// </summary>
public class QCRepliedQCChallengeEvent : DomainEvent
{
public Guid QCChallengeDialogId { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
}
/// <summary>
/// CRC 回复一致性核查质疑 通知PM
/// </summary>
public class CRCRepliedCheckChallengeEvent : DomainEvent
{
public Guid CheckChallengeDialogId { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
}
/// <summary>
/// CRC 回复一致性核查质疑 通知PM
/// </summary>
public class PMRepliedCheckChallengeEvent : DomainEvent
{
public Guid CheckChallengeDialogId { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
}
/// <summary>
/// 通知PM 进行一致性核查
/// </summary>
public class CheckStateChangedToAuditEvent : DomainEvent
{
public Guid SubjectVisitId { get; set; }
}

View File

@ -5,23 +5,21 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace IRaCIS.Core.Domain namespace IRaCIS.Core.Domain;
public class UserSiteSurveySubmitedEvent:DomainEvent
{ {
public class UserSiteSurveySubmitedEvent:DomainEvent public Guid TrialSiteSurveyId { get; set; }
{
public Guid TrialSiteSurveyId { get; set; }
}
public class SiteSurveySPMSubmitedEvent : DomainEvent
{
public Guid TrialSiteSurveyId { get; set; }
}
public class SiteSurverRejectedEvent : DomainEvent
{
public Guid TrialSiteSurveyId { get; set; }
}
} }
public class SiteSurveySPMSubmitedEvent : DomainEvent
{
public Guid TrialSiteSurveyId { get; set; }
}
public class SiteSurverRejectedEvent : DomainEvent
{
public Guid TrialSiteSurveyId { get; set; }
}

View File

@ -70,21 +70,173 @@ public static class DBContext_Ext
//入组或者PD 才执行下面的逻辑 //入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView) if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{ {
var originSubmitState = entry.Property(p => p.SubmitState).OriginalValue;
var originAuditState = entry.Property(p => p.AuditState).OriginalValue;
var originCheckState = entry.Property(p => p.CheckState).OriginalValue;
//质控状态变为待审核的时候
if (originSubmitState == SubmitStateEnum.ToSubmit && subjectVisit.SubmitState == SubmitStateEnum.Submitted &&
originAuditState == AuditStateEnum.None && subjectVisit.AuditState == AuditStateEnum.ToAudit
)
{
subjectVisit.AddDomainEvent(new CRCSubmitedAndQCToAuditEvent() { SubjectVisitId = subjectVisit.Id });
}
//一致性核查通知PM发送邮件
if (originCheckState == CheckStateEnum.None && subjectVisit.CheckState == CheckStateEnum.ToCheck
)
{
subjectVisit.AddDomainEvent(new CheckStateChangedToAuditEvent() { SubjectVisitId = subjectVisit.Id });
}
//添加进记录
eventStoreList.AddRange(subjectVisit.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
} }
} }
foreach (var entry in changeTracker.Entries<QCChallengeDialog>())
{
var qCChallengeDialog = entry.Entity;
//跟踪的方式查询 不会查询数据库多次
var findSubjectVisit = dbContext.SubjectVisit.Find(qCChallengeDialog.SubjectVisitId);
var findTrial = dbContext.Trial.Find(findSubjectVisit.TrialId);
//入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{
//CRC 针对质控质疑进行回复
if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)
{
qCChallengeDialog.AddDomainEvent(new CRCRepliedQCChallengeEvent() { QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//QC 针对质控质疑进行回复
else if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.IQC)
{
qCChallengeDialog.AddDomainEvent(new QCRepliedQCChallengeEvent() { QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//添加进记录
eventStoreList.AddRange(qCChallengeDialog.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
}
}
foreach (var entry in changeTracker.Entries<CheckChallengeDialog>())
{
var checkChallengeDialog = entry.Entity;
//跟踪的方式查询 不会查询数据库多次
var findSubjectVisit = dbContext.SubjectVisit.Find(checkChallengeDialog.SubjectVisitId);
var findTrial = dbContext.Trial.Find(findSubjectVisit.TrialId);
//入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{
//CRC 针对质控质疑进行回复
if (entry.State == EntityState.Added && checkChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)
{
checkChallengeDialog.AddDomainEvent(new CRCRepliedCheckChallengeEvent() { CheckChallengeDialogId = checkChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
else if (entry.State == EntityState.Added && checkChallengeDialog.UserTypeEnum == UserTypeEnum.ProjectManager)
{
checkChallengeDialog.AddDomainEvent(new PMRepliedCheckChallengeEvent() { CheckChallengeDialogId = checkChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
}
//添加进记录
eventStoreList.AddRange(checkChallengeDialog.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
}
}
//医学审核任务
foreach (var entry in changeTracker.Entries<TaskMedicalReview>())
{
var taskMedicalReview = entry.Entity;
//跟踪的方式查询 不会查询数据库多次
var findVisitTask = dbContext.VisitTask.Find(taskMedicalReview.VisitTaskId);
var findTrial = dbContext.Trial.Find(findVisitTask.TrialId);
//入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{
if (entry.State == EntityState.Added)
{
taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId });
}
//添加进记录
eventStoreList.AddRange(taskMedicalReview.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
}
}
//医学反馈
foreach (var entry in changeTracker.Entries<ReadingMedicalReviewDialog>())
{
var readingMedicalReviewDialog = entry.Entity;
//跟踪的方式查询 不会查询数据库多次
var findVisitTask = dbContext.VisitTask.Find(readingMedicalReviewDialog.VisitTaskId);
var findTrial = dbContext.Trial.Find(findVisitTask.TrialId);
//入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{
if (entry.State == EntityState.Added && readingMedicalReviewDialog.UserTypeEnumInt == (int)UserTypeEnum.MIM)
{
readingMedicalReviewDialog.AddDomainEvent(new UrgentMIMRepliedMedicalReview() { ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
}
else if (entry.State == EntityState.Added && readingMedicalReviewDialog.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer)
{
readingMedicalReviewDialog.AddDomainEvent(new UrgentIRRepliedMedicalReview() { ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
}
//添加进记录
eventStoreList.AddRange(readingMedicalReviewDialog.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
}
}
//任务 申请重阅ReReadingApplyState
foreach (var entry in changeTracker.Entries<VisitTask>())
{
var visitTask = entry.Entity;
//跟踪的方式查询 不会查询数据库多次
var findTrial = dbContext.Trial.Find(visitTask.TrialId);
//入组或者PD 才执行下面的逻辑
if (findTrial != null && findTrial.IsEnrollementQualificationConfirm && findTrial.IsPDProgressView)
{
var originReReadingApplyState = entry.Property(p => p.ReReadingApplyState).OriginalValue;
if (originReReadingApplyState == ReReadingApplyState.Default && visitTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed)
{
visitTask.AddDomainEvent(new UrgentIRApplyedReReading() { VisitTaskId = visitTask.Id });
}
//添加进记录
eventStoreList.AddRange(visitTask.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() }));
}
}
#endregion #endregion
//跟随事务一起保存数据库 //跟随事务一起保存数据库
dbContext.EventStoreRecord.AddRange(eventStoreList); dbContext.EventStoreRecord.AddRange(eventStoreList);
} }
#region 暂时废弃 #region 暂时废弃
/// <summary> /// <summary>
/// 暂时废弃,没有场景使用 /// 暂时废弃,没有场景使用
@ -128,6 +280,4 @@ public static class DBContext_Ext
#endregion #endregion
} }