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); } }