From 26652160df62cffa2271b95fef27cfbb3877f107 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 17 Oct 2024 09:01:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E5=88=92=E4=BB=BB=E5=8A=A1=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A41?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/Progranm.cs | 8 -- .../BackGroundJob/IRaCISCHangfireJob.cs | 50 ++++----- .../Helper/HangfireJobHelper.cs | 4 +- .../IRaCIS.Core.Application.xml | 67 ++++++------ .../NeedVerify/AddSubjectTriggerConsumer.cs | 101 ------------------ .../Consumer/{NeedVerify => }/TestConsumer.cs | 1 + .../Recurring/RecurringEmailConsumer.cs | 56 ++++++++++ .../Service/Document/EmailSendService.cs | 4 +- IRaCIS.Core.Application/TestService.cs | 2 + .../Common/EmailScenarioEnum.cs | 6 +- 10 files changed, 123 insertions(+), 176 deletions(-) delete mode 100644 IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/AddSubjectTriggerConsumer.cs rename IRaCIS.Core.Application/MassTransit/Consumer/{NeedVerify => }/TestConsumer.cs (99%) create mode 100644 IRaCIS.Core.Application/MassTransit/Recurring/RecurringEmailConsumer.cs diff --git a/IRaCIS.Core.API/Progranm.cs b/IRaCIS.Core.API/Progranm.cs index 2e99be6b9..4aabde1ba 100644 --- a/IRaCIS.Core.API/Progranm.cs +++ b/IRaCIS.Core.API/Progranm.cs @@ -63,14 +63,6 @@ builder.Configuration.AddJsonFile(ConfigMapFileProvider.FromRelativePath(""), "a builder.Host.UseSerilog(); -#region Autofac 废弃 -//builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()) -// .ConfigureContainer(containerBuilder => -// { -// containerBuilder.RegisterModule(); -// }).UseWindowsService(); -#endregion - #endregion diff --git a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs index 29fbf83ee..18b02bbf5 100644 --- a/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/IRaCISCHangfireJob.cs @@ -1,7 +1,10 @@ using Hangfire; using Hangfire.Storage; using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; +using MassTransit; +using MassTransit.Scheduling; using Microsoft.Extensions.Logging; namespace IRaCIS.Core.Application.Service.BackGroundJob @@ -14,7 +17,8 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob } public class IRaCISCHangfireJob(ILogger _logger, IRepository _internationalizationRepository, - IRepository _trialEmailNoticeConfigRepository + IRepository _trialEmailNoticeConfigRepository, + IMessageScheduler _IMessageScheduler ) : IIRaCISHangfireJob { public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources); @@ -49,15 +53,6 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob public async Task InitSysAndTrialCronJobAsync() { - //var deleteJobIdList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr != StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) - // .Select(t => t.TrialId + "_" + t.Id) - // .ToListAsync(); - - //foreach (var jobId in deleteJobIdList) - //{ - // HangfireJobHelper.RemoveCronJob(jobId); - //} - var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) .Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, t.TrialId }) @@ -68,24 +63,29 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob //利用主键作为任务Id var jobId = $"{task.TrialId}_{task.Id}"; + switch (task.BusinessScenarioEnum) + { + + case EmailBusinessScenario.QCTask: + + break; + + case EmailBusinessScenario.CRCToQCQuestion: + + break; + case EmailBusinessScenario.QCToCRCImageQuestion: + break; + + default: + break; + } + + + + HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, task.TrialId, task.BusinessScenarioEnum, task.EmailCron); } - var addOrUpdateJobIdList = taskInfoList.Select(t => $"{t.TrialId}_{t.Id}").ToList(); - - var list = JobStorage.Current.GetConnection().GetRecurringJobs().ToList(); - - //项目定时任务都在default 队列 - //var dbJobIdList = JobStorage.Current.GetConnection().GetRecurringJobs().Where(t => t.Queue == "default").Select(t => t.Id).ToList(); - - //var deleteList= dbJobIdList.Except(addOrUpdateJobIdList).ToList(); - - // foreach (var jobId in deleteList) - // { - // HangfireJobHelper.RemoveCronJob(jobId); - // } - - } diff --git a/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs index 7b4d669c3..f27c6c1f9 100644 --- a/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs +++ b/IRaCIS.Core.Application/Helper/HangfireJobHelper.cs @@ -64,10 +64,10 @@ namespace IRaCIS.Core.Application.Helper case EmailBusinessScenario.QCTask: HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQCTaskEmailAsync(trialId), emailCron); break; - case EmailBusinessScenario.QCQuestion: + case EmailBusinessScenario.CRCToQCQuestion: HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialQCQuestionEmailAsync(trialId), emailCron); break; - case EmailBusinessScenario.ImageQuestion: + case EmailBusinessScenario.QCToCRCImageQuestion: HangfireJobHelper.AddOrUpdateCronJob(jobId, t => t.SendTrialImageQuestionAsync(trialId), emailCron); break; diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 0bfa238ee..21ebebc56 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -12897,42 +12897,6 @@ 构造函数注入 - - - 添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 - 因为消费者这里的数据库上下文 和消息发送者上下文不是同一个,相当于两个独立的事务 - - - - - - - - - 添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 - 因为消费者这里的数据库上下文 和消息发送者上下文不是同一个,相当于两个独立的事务 - - - - - - - - - meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码 - publish 请求流不会先到消费者,发布后,直接执行后续代码 - - - - - - - meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码 - publish 请求流不会先到消费者,发布后,直接执行后续代码 - - - - 加急的医学反馈任务 通知MIM @@ -13021,11 +12985,42 @@ 通知PM 进行一致性核查 + + + meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码 + publish 请求流不会先到消费者,发布后,直接执行后续代码 + + + + + + + meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码 + publish 请求流不会先到消费者,发布后,直接执行后续代码 + + + + 参考链接:https://github.com/MassTransit/MassTransit/discussions/2498 + + + QC 影像质疑待处理 + + + + + CRC 影像质疑 + + + + + 影像质控 + + TaskAllocationRuleView 列表视图模型 diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/AddSubjectTriggerConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/AddSubjectTriggerConsumer.cs deleted file mode 100644 index f9875948e..000000000 --- a/IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/AddSubjectTriggerConsumer.cs +++ /dev/null @@ -1,101 +0,0 @@ - - -using AutoMapper; -using IRaCIS.Core.Domain; -using MassTransit; -using Microsoft.AspNetCore.Http; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; - -namespace IRaCIS.Core.Application.MassTransit.Consumer; - - - - -/// -/// 添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 -/// 因为消费者这里的数据库上下文 和消息发送者上下文不是同一个,相当于两个独立的事务 -/// -/// -/// -/// -/// -public class AddSubjectTriggerConsumer(IRepository _subjectVisitRepository, - - IRepository _visitStageRepository, - IRepository _trialRepository, - IMapper _mapper) : IConsumer -{ - public async Task Consume(ConsumeContext context) - { - var addSubjectEvent = context.Message; - - - { - Console.WriteLine(_visitStageRepository._dbContext.GetHashCode()); - - Console.WriteLine("两个 DbContext 不是同一个实例"); - } - - - //添加受试者的时候,获取访视计划列表,添加到受试者访视表。 - var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == addSubjectEvent.TrialId && t.IsConfirmed).ToListAsync(); - - var svList = _mapper.Map>(visitPlanList); - - var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == addSubjectEvent.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync(); - - svList.ForEach(t => - { - t.SubjectId = addSubjectEvent.SubjectId; - t.TrialId = addSubjectEvent.TrialId; - t.TrialSiteId = addSubjectEvent.TrialSiteId; - t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false; - t.Id = NewId.NextGuid(); - - }); - - await _subjectVisitRepository.AddRangeAsync(svList); - } -} - -public class AddSubjectTriggerConsumer2(IRepository _subjectVisitRepository, - - IRepository _visitStageRepository, - IRepository _trialRepository, - IMapper _mapper) : IConsumer -{ - public async Task Consume(ConsumeContext context) - { - var addSubjectEvent = context.Message; - - - { - Console.WriteLine(_visitStageRepository._dbContext.GetHashCode()); - - Console.WriteLine("两个 DbContext 不是同一个实例"); - } - - - //添加受试者的时候,获取访视计划列表,添加到受试者访视表。 - var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == addSubjectEvent.TrialId && t.IsConfirmed).ToListAsync(); - - var svList = _mapper.Map>(visitPlanList); - - var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == addSubjectEvent.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync(); - - svList.ForEach(t => - { - t.SubjectId = addSubjectEvent.SubjectId; - t.TrialId = addSubjectEvent.TrialId; - t.TrialSiteId = addSubjectEvent.TrialSiteId; - t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false; - t.Id = NewId.NextGuid(); - - }); - - await _subjectVisitRepository.AddRangeAsync(svList); - } -} - - diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/TestConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/TestConsumer.cs similarity index 99% rename from IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/TestConsumer.cs rename to IRaCIS.Core.Application/MassTransit/Consumer/TestConsumer.cs index 07d313afa..0dbef2b9d 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/NeedVerify/TestConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/TestConsumer.cs @@ -54,6 +54,7 @@ public class TestMasstransitService : BaseService { var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; + Console.WriteLine(_testLengthRepository._dbContext.GetHashCode()); //IScopedMediator 上下文一致, IMediator上下文不一致 diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/RecurringEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/RecurringEmailConsumer.cs new file mode 100644 index 000000000..fb35a334a --- /dev/null +++ b/IRaCIS.Core.Application/MassTransit/Recurring/RecurringEmailConsumer.cs @@ -0,0 +1,56 @@ +using MassTransit; +using MassTransit.Scheduling; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.MassTransit.Consumer; +public abstract class IRCRecurringSchedule : + RecurringSchedule +{ + protected IRCRecurringSchedule() + { + ScheduleGroup = GetType().Name; + + TimeZoneId = TimeZoneInfo.Local.Id; + StartTime = DateTime.Now; + } + + public MissedEventPolicy MisfirePolicy { get; protected set; } + public string TimeZoneId { get; protected set; } + public DateTimeOffset StartTime { get; protected set; } + public DateTimeOffset? EndTime { get; protected set; } + public string ScheduleId { get; private set; } + public string ScheduleGroup { get; private set; } + public string CronExpression { get; protected set; } + public string Description { get; protected set; } +} + +/// +/// QC 影像质疑待处理 +/// +public class QCImageQuestionSchedule : IRCRecurringSchedule +{ + +} + +/// +/// CRC 影像质疑 +/// +public class CRCImageQuestionSchedule : IRCRecurringSchedule +{ + +} + +/// +/// 影像质控 +/// +public class ImageQCSchedule : IRCRecurringSchedule +{ + +} + + + diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs index d64befeff..16aa1eb8d 100644 --- a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -203,7 +203,7 @@ namespace IRaCIS.Core.Application.Service return (topicStr, htmlBodyStr, false, userId); }; - await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCQuestion, topicAndHtmlFunc); + await SendTrialEmailAsync(trialId, EmailBusinessScenario.CRCToQCQuestion, topicAndHtmlFunc); } } } @@ -253,7 +253,7 @@ namespace IRaCIS.Core.Application.Service return (topicStr, htmlBodyStr, isEn_us, userId); }; - await SendTrialEmailAsync(trialId, EmailBusinessScenario.ImageQuestion, topicAndHtmlFunc); + await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCToCRCImageQuestion, topicAndHtmlFunc); } } } diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index e85e65479..f3955893b 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -30,6 +30,7 @@ using System.Runtime.InteropServices; using System.Text; + namespace IRaCIS.Core.Application.Service { /// @@ -58,6 +59,7 @@ namespace IRaCIS.Core.Application.Service [AllowAnonymous] public IResponseOutput GetTest() { + //throw new BusinessValidationFailedException("手动抛出的异常"); return ResponseOutput.Ok(_userInfo.IP); diff --git a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs index 64594296b..1caeec8d2 100644 --- a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs +++ b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs @@ -46,11 +46,13 @@ namespace IRaCIS.Core.Domain.Share //Reviewer=4, + //QC影像质控任务 QCTask = 5, - QCQuestion = 6, - ImageQuestion = 7, + CRCToQCQuestion = 6, + + QCToCRCImageQuestion = 7,