From 03d735a287b68766fd225ff724db15328d605de0 Mon Sep 17 00:00:00 2001
From: hang <872297557@qq.com>
Date: Fri, 18 Oct 2024 11:01:57 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8B=E4=BB=B6=E5=8F=91?=
=?UTF-8?q?=E5=B8=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IRaCIS.Core.Application.xml | 7 +-
...ediatorHttpContextScopeFilterExtensions.cs | 83 -------------------
.../Recurring/IRRecurringConsumer.cs | 54 ++++++++++--
.../Common/EmailNoticeConfigService.cs | 2 +-
.../Service/Common/EventStoreRecordService.cs | 1 +
.../SiteSurvey/TrialSiteSurveyService.cs | 2 +-
.../DispatchDomainEventsInterceptor.cs | 4 +-
7 files changed, 52 insertions(+), 101 deletions(-)
delete mode 100644 IRaCIS.Core.Application/MassTransit/Extension/MediatorHttpContextScopeFilterExtensions.cs
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index deee21df8..a6fb03013 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -12997,11 +12997,6 @@
-
-
- 参考链接:https://github.com/MassTransit/MassTransit/discussions/2498
-
-
QC 影像质疑
@@ -13067,7 +13062,7 @@
10分钟检测通知IR 已通知的进行标注,下次不会再通知
-
+
10分钟检测通知IR 已通知的进行标注,下次不会再通知
diff --git a/IRaCIS.Core.Application/MassTransit/Extension/MediatorHttpContextScopeFilterExtensions.cs b/IRaCIS.Core.Application/MassTransit/Extension/MediatorHttpContextScopeFilterExtensions.cs
deleted file mode 100644
index 7a1d2684b..000000000
--- a/IRaCIS.Core.Application/MassTransit/Extension/MediatorHttpContextScopeFilterExtensions.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-using IRaCIS.Core.Application.MassTransit.Consumer;
-using MassTransit;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.DependencyInjection;
-
-namespace IRaCIS.Core.Application.MassTransit.Consumer;
-
-///
-/// 参考链接:https://github.com/MassTransit/MassTransit/discussions/2498
-///
-public static class MediatorHttpContextScopeFilterExtensions
-{
- public static void UseHttpContextScopeFilter(this IMediatorConfigurator configurator, IServiceProvider serviceProvider)
- {
- var filter = new HttpContextScopeFilter(serviceProvider.GetRequiredService());
-
- configurator.ConfigurePublish(x => x.UseFilter(filter));
- configurator.ConfigureSend(x => x.UseFilter(filter));
- configurator.UseFilter(filter);
- }
-}
-
-public class HttpContextScopeFilter :
- IFilter,
- IFilter,
- IFilter
-{
- private readonly IHttpContextAccessor _httpContextAccessor;
-
- public HttpContextScopeFilter(IHttpContextAccessor httpContextAccessor)
- {
- _httpContextAccessor = httpContextAccessor;
- }
-
- private void AddPayload(PipeContext context)
- {
- if (_httpContextAccessor.HttpContext == null)
- return;
-
- var serviceProvider = _httpContextAccessor.HttpContext.RequestServices;
- context.GetOrAddPayload(() => serviceProvider);
- context.GetOrAddPayload(() => new NoopScope(serviceProvider));
- }
-
- public Task Send(PublishContext context, IPipe next)
- {
- AddPayload(context);
- return next.Send(context);
- }
-
- public Task Send(SendContext context, IPipe next)
- {
- AddPayload(context);
- return next.Send(context);
- }
-
- public Task Send(ConsumeContext context, IPipe next)
- {
- AddPayload(context);
- return next.Send(context);
- }
-
- public void Probe(ProbeContext context)
- {
- }
-
- private class NoopScope :
- IServiceScope
- {
- public NoopScope(IServiceProvider serviceProvider)
- {
- ServiceProvider = serviceProvider;
- }
-
- public void Dispose()
- {
- }
-
- public IServiceProvider ServiceProvider { get; }
- }
-}
\ No newline at end of file
diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs
index 9b582d7b4..882c04b39 100644
--- a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs
+++ b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs
@@ -1,9 +1,13 @@
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
+using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MassTransit.Consumer;
using MassTransit;
+using Microsoft.Extensions.Options;
+using MimeKit;
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -14,11 +18,19 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
///
/// 10分钟检测通知IR 已通知的进行标注,下次不会再通知
///
- public class UrgentIRUnReadTaskRecurringEventConsumer(IRepository _trialReadingCriterionRepository,
- IRepository _visitTaskRepository, IRepository _trialUserRepository) : IConsumer
+ public class UrgentIRUnReadTaskRecurringEventConsumer(
+ IRepository _trialReadingCriterionRepository,
+ IRepository _visitTaskRepository,
+ IRepository _trialUserRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
{
- public Task Consume(ConsumeContext context)
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+ public async Task Consume(ConsumeContext context)
{
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
var trialId = context.Message.TrialId;
//找到该项目所有的IR 并且有加急 和Pd 未读的任务
@@ -41,7 +53,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
var userId=trialUser.UserId;
- var doctorCriterionList = _trialReadingCriterionRepository.Where(t => t.IsSigned && t.IsConfirm && t.Trial.TrialUserList.Any(t => t.UserId == userId))
+ var doctorCriterionList = await _trialReadingCriterionRepository.Where(t => t.IsSigned && t.IsConfirm && t.Trial.TrialUserList.Any(t => t.UserId == userId))
.Select(c => new
{
@@ -65,9 +77,37 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
c.TaskName
}).ToList()
- });
+ }).ToListAsync();
-
+
+ var toTalUnreadCount= doctorCriterionList.SelectMany(t=>t.UnReadList).Count();
+
+
+ var messageToSend = new MimeMessage();
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var topicStr = string.Format(input.topicStr, trialUser.ResearchProgramNo);
+ var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ trialUser.FullName,
+
+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+ toTalUnreadCount,
+
+ trialUser.ResearchProgramNo,
+ trialUser.TrialReadingCriterionList,
+ //siteSurveyInfo.Phone,
+ _systemEmailConfig.SiteUrl
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.Approval_SubmitSiteSurvey, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
}
@@ -77,9 +117,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
- Console.WriteLine(DateTime.Now);
- return Task.CompletedTask;
}
}
}
diff --git a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
index 4a59b524d..c022238a5 100644
--- a/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
+++ b/IRaCIS.Core.Application/Service/Common/EmailNoticeConfigService.cs
@@ -51,7 +51,7 @@ namespace IRaCIS.Core.Application.Contracts
.Any(t => t.Value.Contains(" ")))
{
//邮件模板占位符不允许有空格,请核查占位符的地方
- return ResponseOutput.NotOk("EmailNoticeConfig_ContainEmpty");
+ return ResponseOutput.NotOk(I18n.T("EmailNoticeConfig_ContainEmpty"));
}
diff --git a/IRaCIS.Core.Application/Service/Common/EventStoreRecordService.cs b/IRaCIS.Core.Application/Service/Common/EventStoreRecordService.cs
index c80624930..c5e7c2949 100644
--- a/IRaCIS.Core.Application/Service/Common/EventStoreRecordService.cs
+++ b/IRaCIS.Core.Application/Service/Common/EventStoreRecordService.cs
@@ -44,6 +44,7 @@ public class EventStoreRecordService(IRepository _eventStoreRe
///
///
///
+ [HttpGet]
public async Task RePublishEvent(Guid eventId)
{
var storedEvent = await _eventStoreRecordRepository.FirstOrDefaultAsync(t => t.Id == eventId);
diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs
index 054d98947..4a3ac77f3 100644
--- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs
+++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs
@@ -685,7 +685,7 @@ namespace IRaCIS.Core.Application.Contracts
- if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.Undefined)
+ if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.Undefined || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
{
var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM));
diff --git a/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs b/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs
index efd08cb85..d2825a696 100644
--- a/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs
+++ b/IRaCIS.Core.Infra.EFCore/Interceptor/DispatchDomainEventsInterceptor.cs
@@ -14,7 +14,7 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
// 发件箱模式参考: https://dev.to/antonmartyniuk/use-masstransit-to-implement-outbox-pattern-with-ef-core-and-mongodb-oep#:~:text=MongoDB%20replica%20set%20is%20required%20for%20both%20publisher%20and%20consumer
// 1、IPublishEndpoint 才会将事件存储到发件箱表中, 高级IBus接口时 - 消息不会存储在发件箱中,必须有savechanges 才会一起提交保存到数据库中
// 2、进入消息代理之前,发布事件在OutboxState OutboxMessage, 进入消费者以后(已经删除OutboxState OutboxMessage),消费失败,需要修改代码重新发布,然后之前消费事件的重新处理,错误处理参考:https://www.youtube.com/watch?v=3TMKUu7c4lc
- public class DispatchDomainEventsInterceptor(IMediator _mediator, IMessageScheduler _scheduler) : SaveChangesInterceptor
+ public class DispatchDomainEventsInterceptor(IMediator _mediator, IMessageScheduler _scheduler, IPublishEndpoint _publishEndpoint) : SaveChangesInterceptor
{
//领域事件通常与数据变更密切相关。如果在 SaveChanges 之前发布事件,有可能事件发布时的数据状态还没有被持久化到数据库。这可能导致事件消费者看到的是一个不一致的状态
@@ -64,7 +64,7 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds((int)domainEvent.DelaySeconds!), (object)domainEvent);
}
- await _mediator.Publish(domainEvent.GetType(), domainEvent);
+ await _publishEndpoint.Publish(domainEvent.GetType(), domainEvent);
}
}