From 05693d090d1da1645d5a853b48cffc18f2078000 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 17 Oct 2024 14:32:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=BB=B6=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 5 +++++ .../SubjectVisitQCAndCheckConsumer.cs | 10 ++++++++++ .../DTO/TrialEmailNoticeConfigViewModel.cs | 4 +++- IRaCIS.Core.Domain/BaseModel/DomainEvent.cs | 5 +++-- .../Common/EmailNoticeConfig.cs | 4 ++++ .../Document/TrialEmailNoticeConfig.cs | 4 ++++ .../SubjectVisitStateChangedEvent.cs | 10 ++++++++++ .../Interceptor/AddDomainExt.cs | 19 +++++++++++++++---- .../DispatchDomainEventsInterceptor.cs | 4 ++-- 9 files changed, 56 insertions(+), 9 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 90b381918..6b84b2d21 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -12985,6 +12985,11 @@ 通知PM 进行一致性核查 + + + QC 领取了质控任务 + + meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码 diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs index 8dd211249..7ce433edd 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs @@ -83,3 +83,13 @@ public class CheckStateChangedToAuditEventConsumer : IConsumer +/// QC 领取了质控任务 +/// +public class QCClaimTaskEventConsumer : IConsumer +{ + public Task Consume(ConsumeContext context) + { + throw new NotImplementedException(); + } +} diff --git a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs index 321c33568..b31de2b4d 100644 --- a/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Document/DTO/TrialEmailNoticeConfigViewModel.cs @@ -184,6 +184,9 @@ namespace IRaCIS.Core.Application.ViewModel public string EmailHtmlContent { get; set; } = string.Empty; public string EmailHtmlContentCN { get; set; } = string.Empty; + + public int? EmailDelaySeconds { get; set; } + } @@ -206,7 +209,6 @@ namespace IRaCIS.Core.Application.ViewModel public string FromEmail { get; set; } = string.Empty; public List BlackUserIdList { get; set; } - } diff --git a/IRaCIS.Core.Domain/BaseModel/DomainEvent.cs b/IRaCIS.Core.Domain/BaseModel/DomainEvent.cs index 3eac599a3..aa8ffda7b 100644 --- a/IRaCIS.Core.Domain/BaseModel/DomainEvent.cs +++ b/IRaCIS.Core.Domain/BaseModel/DomainEvent.cs @@ -17,12 +17,13 @@ public abstract class DomainEvent public Guid EventId { get; set; } = NewId.NextSequentialGuid(); //是不是延迟消费的事件,需要用定时任务调度 - public bool IsScheduleEvent { get; set; }=false; + public bool IsDelayScheduleEvent => DelaySeconds!=null && DelaySeconds > 0; + /// /// 在事件产生多少s后开始消费该事件 /// - public int DelaySeconds{ get; set; } + public int? DelaySeconds{ get; set; } public string CultureInfoName { get; set; } = CultureInfo.CurrentCulture.Name; } diff --git a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs index 617d20635..8b8235438 100644 --- a/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs +++ b/IRaCIS.Core.Domain/Common/EmailNoticeConfig.cs @@ -40,6 +40,10 @@ public class EmailNoticeConfig : BaseFullDeleteAuditEntity [Comment("发送周期")] public string EmailCron { get; set; } = null!; + + [Comment("邮件延时秒数,比如一个事件触发,延迟多少s后才发邮件")] + public int? EmailDelaySeconds { get; set; } = null!; + [MaxLength] public string EmailHtmlContent { get; set; } = null!; [MaxLength] diff --git a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs index 5b86c4bfa..7831bbaca 100644 --- a/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs +++ b/IRaCIS.Core.Domain/Document/TrialEmailNoticeConfig.cs @@ -82,6 +82,10 @@ public class TrialEmailNoticeConfig : BaseFullDeleteAuditEntity public Guid? TrialReadingCriterionId { get; set; } + + [Comment("邮件延时秒数,比如一个事件触发,延迟多少s后才发邮件")] + public int? EmailDelaySeconds { get; set; } = null!; + } [Comment("项目 - 项目邮件用户黑名单")] diff --git a/IRaCIS.Core.Domain/_DomainEvent/SubjectVisitStateChangedEvent.cs b/IRaCIS.Core.Domain/_DomainEvent/SubjectVisitStateChangedEvent.cs index 30d6474af..fb6c3cb06 100644 --- a/IRaCIS.Core.Domain/_DomainEvent/SubjectVisitStateChangedEvent.cs +++ b/IRaCIS.Core.Domain/_DomainEvent/SubjectVisitStateChangedEvent.cs @@ -76,4 +76,14 @@ public class CheckStateChangedToAuditEvent : DomainEvent { public Guid SubjectVisitId { get; set; } +} + +/// +/// QC 领取了质控任务 +/// +public class QCClaimTaskEvent : DomainEvent +{ + public Guid SubjectVisitId { get; set; } + + public Guid CurrentActionUserId { get; set; } } \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainExt.cs b/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainExt.cs index 0135866e8..ac68121c6 100644 --- a/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainExt.cs +++ b/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainExt.cs @@ -71,6 +71,7 @@ public static class DBContext_Ext 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; //入组或者PD 才执行下面的逻辑 if ((subjectVisit.IsEnrollmentConfirm || subjectVisit.PDState == PDStateEnum.PDProgress)) @@ -91,6 +92,16 @@ public static class DBContext_Ext subjectVisit.AddDomainEvent(new CheckStateChangedToAuditEvent() { SubjectVisitId = subjectVisit.Id }); } + if (originCurrentActionUserId == null && subjectVisit.CurrentActionUserId != null) + { + var delaySeconds = dbContext.TrialEmailNoticeConfig.Where(t => t.BusinessScenarioEnum == EmailBusinessScenario.EligibilityVerification_PendingClaim) + .Select(t => t.EmailDelaySeconds).FirstOrDefault(); + + subjectVisit.AddDomainEvent(new QCClaimTaskEvent() { SubjectVisitId = subjectVisit.Id, DelaySeconds= delaySeconds, CurrentActionUserId = (Guid)subjectVisit.CurrentActionUserId }); + + } + + //添加进记录 eventStoreList.AddRange(GetStoreEvents(subjectVisit.DomainEvents)); } @@ -180,7 +191,7 @@ public static class DBContext_Ext if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress) { - taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { IsPD= findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId }); + taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId }); //添加进记录 eventStoreList.AddRange(GetStoreEvents(taskMedicalReview.DomainEvents)); @@ -220,7 +231,7 @@ public static class DBContext_Ext } 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 }); + readingMedicalReviewDialog.AddDomainEvent(new UrgentIRRepliedMedicalReview() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = readingMedicalReviewDialog.TaskMedicalReviewId, ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id }); } //添加进记录 @@ -259,7 +270,7 @@ public static class DBContext_Ext if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress) { - visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState= visitTask.ReReadingApplyState }); + visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState = visitTask.ReReadingApplyState }); //添加进记录 eventStoreList.AddRange(GetStoreEvents(visitTask.DomainEvents)); @@ -275,7 +286,7 @@ public static class DBContext_Ext private static List GetStoreEvents(IReadOnlyCollection domainEvents) { - return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName=t.GetType().Name, EventData = t.ToJsonStr() }).ToList(); + return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName = t.GetType().Name, EventData = t.ToJsonStr() }).ToList(); } public class EnrollmentConfirmAndPD { diff --git a/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs b/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs index 70818ee0e..efd08cb85 100644 --- a/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs +++ b/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs @@ -58,10 +58,10 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor //这种方式会导致消息没处理 //await publishEndpoint.Publish(domainEvent); - if (domainEvent.IsScheduleEvent) + if (domainEvent.IsDelayScheduleEvent) { //延迟调度的消息,比如1h后再消费 - await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(domainEvent.DelaySeconds), (object)domainEvent); + await _scheduler.SchedulePublish(DateTime.Now.AddSeconds((int)domainEvent.DelaySeconds!), (object)domainEvent); } await _mediator.Publish(domainEvent.GetType(), domainEvent);