From e8aec5f04ca5f58306acb2c91ab52e2b68db2741 Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 6 May 2025 10:49:42 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=82=AE=E4=BB=B6?=
=?UTF-8?q?=E6=9E=9A=E4=B8=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MassTransit/Consumer/ImageConsumer.cs | 27 +++++++++
.../Common/EmailScenarioEnum.cs | 56 +++++++++++++++++++
2 files changed, 83 insertions(+)
create mode 100644 IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
new file mode 100644
index 000000000..548588285
--- /dev/null
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
@@ -0,0 +1,27 @@
+using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Domain;
+using IRaCIS.Core.Domain.Share;
+using MassTransit;
+using MassTransit.Mediator;
+using MassTransit.Scheduling;
+using Medallion.Threading;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.StaticFiles;
+using Microsoft.Extensions.Options;
+using RestSharp;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.MassTransit.Consumer;
+
+
+
+
+
+
+
diff --git a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
index 5de7cec99..26bbf8344 100644
--- a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
+++ b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs
@@ -254,6 +254,62 @@ namespace IRaCIS.Core.Domain.Share
GeneralTraining_ExpirationNotification = 59,
+ ///
+ /// 影像质疑-CRC申请重传
+ ///
+ ImageQueryCRCApplyRe_Uploading = 60,
+
+ ///
+ /// 影像质疑-IQC审批重传
+ ///
+ ImageQuery_IQCApprovalRe_Uploading = 61,
+
+ ///
+ /// 一致性核查 - CRC审批重传
+ ///
+ DataReconciliation_CRCApplyRe_Uploading = 62,
+
+ ///
+ /// 一致性核查 - PM审批重传
+ ///
+ DataReconciliation_PMApprovalRe_Uploading = 63,
+
+ ///
+ /// 影像质控 - IQC申请重传
+ ///
+ ImageQC_IQCApplyRe_Uploading = 64,
+
+ ///
+ /// 影像上传-CRC申请重传
+ ///
+ ImageUploadCRCApplyRe_Uploading = 65,
+
+ ///
+ /// 影像重传-PM审批重传
+ ///
+ ImageReUpload_PMApprovalRe_Uploading = 66,
+
+ ///
+ /// 阅片跟踪-PM 申请重阅
+ ///
+ ReadTracking_PMApplyRe_Reading = 67,
+
+ ///
+ /// 重阅审批-SPM/CPM 审批重阅审批
+ ///
+ Re_ReadApproval_SPMCPMApprovalRe_Reading = 68,
+
+ ///
+ /// 阅片人筛选-PM申请审批
+ ///
+ ReviewerSelection_PMApplyApproving = 69,
+
+ ///
+ /// 阅片人筛选-SPM 审批
+ ///
+ ReviewerSelection_SPMCPMApproval = 70,
+
+
}
From f7cf6d966954a64f1cba7ac14dd634377dadf0a4 Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 6 May 2025 13:39:49 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MassTransit/Consumer/ImageConsumer.cs | 430 +++++++++++++++++-
1 file changed, 428 insertions(+), 2 deletions(-)
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
index 548588285..9c5d17000 100644
--- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
@@ -1,6 +1,12 @@
using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Application.MassTransit.Command;
+using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain;
+using IRaCIS.Core.Domain._DomainEvent;
+using IRaCIS.Core.Domain.BaseModel;
+using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
+using IRaCIS.Core.Infra.EFCore.Common;
using MassTransit;
using MassTransit.Mediator;
using MassTransit.Scheduling;
@@ -8,7 +14,11 @@ using Medallion.Threading;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.Options;
+using MimeKit;
+using Newtonsoft.Json;
+using Panda.DynamicWebApi.Attributes;
using RestSharp;
+using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -19,9 +29,425 @@ using System.Threading.Tasks;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
+///
+/// 影像重传和阅片人筛选相关邮件发送
+///
+public class ImageConsumer(
+ IRepository _userRoleRepository,
+ IRepository _trialUseRoleRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _enrollRepository,
+ IRepository _visitTaskRepository,
+ IRepository _readModuleRepository,
+ IRepository _dictionaryRepository,
+ IRepository _trialEmailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) :
+ IConsumer,
+ IConsumer,
+ IConsumer,
+ IConsumer,
+ IConsumer,
+ IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+ ///
+ /// 处理直接申请流程的重传事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【影像重传-直接申请流程】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var subjectVisitId = context.Message.SubjectVisitId;
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();
+ var trialId = subjectVisit.TrialId;
+
+ // 根据申请角色和状态确定邮件场景
+ EmailBusinessScenario scenario;
+ if (context.Message.ImageBackState == ImageBackStateEnum.None)
+ {
+ switch (context.Message.ApplyUserRole)
+ {
+ case ImageBackApplyEnum.IQCRequestBack:
+ scenario = EmailBusinessScenario.ImageQC_IQCApplyRe_Uploading; // 64
+ break;
+ case ImageBackApplyEnum.CRCRequestBack:
+ scenario = EmailBusinessScenario.ImageUploadCRCApplyRe_Uploading; // 65
+ break;
+ default:
+ scenario = EmailBusinessScenario.ImageQC_IQCApplyRe_Uploading; // 64
+ break;
+
+ }
+ }
+ else
+ {
+ scenario = EmailBusinessScenario.ImageReUpload_PMApprovalRe_Uploading; // 66
+ }
-
-
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendImageReuploadEmail(trialEmailConfig, scenario, subjectVisit, trialId);
+ }
+ }
+
+ ///
+ /// 处理一致性核查申请重传事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【一致性核查-影像重传】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var subjectVisitId = context.Message.SubjectVisitId;
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();
+ var trialId = subjectVisit.TrialId;
+
+ // 根据状态确定邮件场景
+ EmailBusinessScenario scenario;
+ switch (context.Message.RequestBackState)
+ {
+ case RequestBackStateEnum.CRC_RequestBack:
+ scenario = EmailBusinessScenario.DataReconciliation_CRCApplyRe_Uploading; // 62
+ break;
+ case RequestBackStateEnum.PM_AgressBack:
+ scenario = EmailBusinessScenario.DataReconciliation_PMApprovalRe_Uploading; // 63
+ break;
+ default:
+ return; // 其他状态不发送邮件
+ }
+
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendImageReuploadEmail(trialEmailConfig, scenario, subjectVisit, trialId);
+ }
+ }
+
+ ///
+ /// 处理质疑CRC申请重传事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【影像质疑-影像重传】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var subjectVisitId = context.Message.SubjectVisitId;
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();
+ var trialId = subjectVisit.TrialId;
+
+ // 根据状态确定邮件场景
+ EmailBusinessScenario scenario;
+ switch (context.Message.ReuploadEnum)
+ {
+ case QCChanllengeReuploadEnum.CRCRequestReupload:
+ scenario = EmailBusinessScenario.ImageQueryCRCApplyRe_Uploading; // 60
+ break;
+ case QCChanllengeReuploadEnum.QCAgreeUpload:
+ scenario = EmailBusinessScenario.ImageQuery_IQCApprovalRe_Uploading; // 61
+ break;
+ default:
+ return; // 其他状态不发送邮件
+ }
+
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendImageReuploadEmail(trialEmailConfig, scenario, subjectVisit, trialId);
+ }
+ }
+
+ ///
+ /// 处理已阅任务重阅申请事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【重阅-影像重传】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var visitTaskId = context.Message.VisitTaskId;
+ // 获取VisitTask关联的SubjectVisit
+ var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.Subject).Include(x=>x.SourceSubjectVisit).FirstNotNullAsync();
+ var subjectVisit = new SubjectVisit() { };
+ if (visitTask.SourceSubjectVisitId != null)
+ {
+ subjectVisit = visitTask.SourceSubjectVisit;
+ }
+ else if(visitTask.SouceReadModuleId!=null)
+ {
+ var readModule = await _readModuleRepository.Where(x => x.Id == visitTask.SouceReadModuleId).Include(x => x.SubjectVisit).FirstOrDefaultAsync();
+ subjectVisit = readModule.SubjectVisit;
+ }
+
+ var trialId = subjectVisit.TrialId;
+
+ // 根据状态确定邮件场景
+ EmailBusinessScenario scenario;
+ switch (context.Message.ReReadingApplyState)
+ {
+ case ReReadingApplyState.TrialGroupHaveApplyed:
+ scenario = EmailBusinessScenario.ReadTracking_PMApplyRe_Reading; // 67
+ break;
+ case ReReadingApplyState.Agree:
+ case ReReadingApplyState.Reject:
+ scenario = EmailBusinessScenario.Re_ReadApproval_SPMCPMApprovalRe_Reading; // 68
+ break;
+ default:
+ return; // 其他状态不发送邮件
+ }
+
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendImageReuploadEmail(trialEmailConfig, scenario, subjectVisit, trialId);
+ }
+ }
+
+ ///
+ /// 发送影像重传相关邮件的通用方法
+ ///
+ private async Task SendImageReuploadEmail(TrialEmailNoticeConfig trialEmailConfig, EmailBusinessScenario scenario, SubjectVisit subjectVisit, Guid trialId)
+ {
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ // 获取项目信息
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
+
+ // 根据不同场景获取不同角色的用户
+ var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
+
+ // 根据场景确定收件人
+ List toUserList = new List();
+ List ccUserList = new List();
+
+ switch (scenario)
+ {
+ case EmailBusinessScenario.ImageQC_IQCApplyRe_Uploading: // 64 - IQC申请重传
+ case EmailBusinessScenario.ImageUploadCRCApplyRe_Uploading: // 65 - CRC申请重传
+ // PM/APM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ break;
+
+ case EmailBusinessScenario.ImageReUpload_PMApprovalRe_Uploading: // 66 - PM审批重传
+ case EmailBusinessScenario.DataReconciliation_PMApprovalRe_Uploading: // 63 - 一致性核查PM审批重传
+ case EmailBusinessScenario.ImageQuery_IQCApprovalRe_Uploading: // 61 - 影像质疑IQC审批重传
+ // CRC收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
+ // CRA抄送
+ ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).ToList();
+ break;
+
+ case EmailBusinessScenario.DataReconciliation_CRCApplyRe_Uploading: // 62 - 一致性核查CRC申请重传
+ // PM/APM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ break;
+
+ case EmailBusinessScenario.ImageQueryCRCApplyRe_Uploading: // 60 - 影像质疑CRC申请重传
+ // IQC收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
+ // PM/APM抄送
+ ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ break;
+
+ case EmailBusinessScenario.ReadTracking_PMApplyRe_Reading: // 67 - PM申请重阅
+ // SPM/CPM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.SPM || x.UserTypeEnum == UserTypeEnum.CPM).ToList();
+ break;
+
+ case EmailBusinessScenario.Re_ReadApproval_SPMCPMApprovalRe_Reading: // 68 - SPM/CPM审批重阅
+ // PM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ // 阅片人抄送
+ ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IndependentReviewer).ToList();
+ break;
+ }
+
+ // 如果没有收件人,则不发送邮件
+ if (toUserList.Count == 0)
+ {
+ return;
+ }
+
+ foreach (var userinfo in toUserList)
+ {
+ var messageToSend = new MimeMessage();
+ // 发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ // 添加抄送
+ foreach (var ccUser in ccUserList)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, ccUser.EMail));
+ }
+
+ // 格式化邮件内容
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var subjectCode = subjectVisit.Subject.Code;
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ subjectCode, // 受试者 {2}
+ subjectVisit.VisitName, // 访视 {3}
+ "是", // 是否加急 {4} - 固定为"是"
+ "", // 预留 {5}
+ _systemEmailConfig.SiteUrl // 链接 {6}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, scenario, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+
+ ///
+ /// 处理PM申请阅片人筛选事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【阅片人筛选-PM申请审批】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ // 获取项目信息
+ var enrollIdList = context.Message.EnrollIdList;
+ if (enrollIdList == null || !enrollIdList.Any())
+ {
+ return;
+ }
+
+ // 获取第一个Enroll的TrialId
+ var enrollId = enrollIdList.First();
+ var enroll = await _enrollRepository.Where(x => x.Id == enrollId).FirstNotNullAsync();
+ var trialId = enroll.TrialId;
+
+ // 设置邮件场景
+ var scenario = EmailBusinessScenario.ReviewerSelection_PMApplyApproving; // 69
+
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendReviewerSelectionEmail(trialEmailConfig, scenario, trialId, enrollIdList);
+ }
+ }
+
+ ///
+ /// 处理SPM审批阅片人筛选事件
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送【阅片人筛选-SPM审批】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ // 获取项目信息
+ var enrollIdList = context.Message.EnrollIdList;
+ if (enrollIdList == null || !enrollIdList.Any())
+ {
+ return;
+ }
+
+ // 获取第一个Enroll的TrialId
+ var enrollId = enrollIdList.First();
+ var enroll = await _enrollRepository.Where(x => x.Id == enrollId).FirstNotNullAsync();
+ var trialId = enroll.TrialId;
+
+ // 设置邮件场景
+ var scenario = EmailBusinessScenario.ReviewerSelection_SPMCPMApproval; // 70
+
+ var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
+
+ if (trialEmailConfig != null)
+ {
+ await SendReviewerSelectionEmail(trialEmailConfig, scenario, trialId, enrollIdList);
+ }
+ }
+
+ ///
+ /// 发送阅片人筛选相关邮件的通用方法
+ ///
+ private async Task SendReviewerSelectionEmail(TrialEmailNoticeConfig trialEmailConfig, EmailBusinessScenario scenario, Guid trialId, List enrollIdList)
+ {
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ // 获取项目信息
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
+
+ // 根据不同场景获取不同角色的用户
+ var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
+
+ // 根据场景确定收件人
+ List toUserList = new List();
+ List ccUserList = new List();
+
+ switch (scenario)
+ {
+ case EmailBusinessScenario.ReviewerSelection_PMApplyApproving: // 69 - PM申请审批
+ // SPM/CPM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.SPM || x.UserTypeEnum == UserTypeEnum.CPM).ToList();
+ break;
+
+ case EmailBusinessScenario.ReviewerSelection_SPMCPMApproval: // 70 - SPM审批
+ // PM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ break;
+ }
+
+ // 如果没有收件人,则不发送邮件
+ if (toUserList.Count == 0)
+ {
+ return;
+ }
+
+ foreach (var userinfo in toUserList)
+ {
+ var messageToSend = new MimeMessage();
+ // 发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ // 添加抄送
+ foreach (var ccUser in ccUserList)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, ccUser.EMail));
+ }
+
+ // 格式化邮件内容
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ "", // 受试者 {2} - 阅片人筛选不涉及受试者
+ "", // 访视 {3} - 阅片人筛选不涉及访视
+ "是", // 是否加急 {4} - 固定为"是"
+ "", // 预留 {5}
+ _systemEmailConfig.SiteUrl // 链接 {6}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, scenario, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+}
From ca0fd77176656008f73a32fb1d63952f40bbf8a1 Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 6 May 2025 13:57:31 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../MassTransit/Consumer/ImageConsumer.cs | 58 ++++++++++---------
1 file changed, 32 insertions(+), 26 deletions(-)
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
index 9c5d17000..7e5e12452 100644
--- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
@@ -185,7 +185,7 @@ public class ImageConsumer(
var readModule = await _readModuleRepository.Where(x => x.Id == visitTask.SouceReadModuleId).Include(x => x.SubjectVisit).FirstOrDefaultAsync();
subjectVisit = readModule.SubjectVisit;
}
-
+
var trialId = subjectVisit.TrialId;
// 根据状态确定邮件场景
@@ -230,43 +230,49 @@ public class ImageConsumer(
switch (scenario)
{
- case EmailBusinessScenario.ImageQC_IQCApplyRe_Uploading: // 64 - IQC申请重传
- case EmailBusinessScenario.ImageUploadCRCApplyRe_Uploading: // 65 - CRC申请重传
- // PM/APM收件
+ case EmailBusinessScenario.ImageQC_IQCApplyRe_Uploading: // 64 - IQC申请重传 - Code: 42
+ // PM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ break;
+
+ case EmailBusinessScenario.ImageUploadCRCApplyRe_Uploading: // 65 - CRC申请重传 - Code: 43
+ // PM、APM收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
break;
- case EmailBusinessScenario.ImageReUpload_PMApprovalRe_Uploading: // 66 - PM审批重传
- case EmailBusinessScenario.DataReconciliation_PMApprovalRe_Uploading: // 63 - 一致性核查PM审批重传
- case EmailBusinessScenario.ImageQuery_IQCApprovalRe_Uploading: // 61 - 影像质疑IQC审批重传
+ case EmailBusinessScenario.ImageReUpload_PMApprovalRe_Uploading: // 66 - PM审批重传 - Code: 44
+ // CRC、IQC收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || x.UserTypeEnum == UserTypeEnum.IQC).ToList();
+ break;
+
+ case EmailBusinessScenario.DataReconciliation_PMApprovalRe_Uploading: // 63 - 一致性核查PM审批重传 - Code: 41
// CRC收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
- // CRA抄送
- ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).ToList();
break;
- case EmailBusinessScenario.DataReconciliation_CRCApplyRe_Uploading: // 62 - 一致性核查CRC申请重传
- // PM/APM收件
+ case EmailBusinessScenario.ImageQuery_IQCApprovalRe_Uploading: // 61 - 影像质疑IQC审批重传 - Code: 39
+ // CRC收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
+ break;
+
+ case EmailBusinessScenario.DataReconciliation_CRCApplyRe_Uploading: // 62 - 一致性核查CRC申请重传 - Code: 40
+ // PM、APM收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
break;
- case EmailBusinessScenario.ImageQueryCRCApplyRe_Uploading: // 60 - 影像质疑CRC申请重传
+ case EmailBusinessScenario.ImageQueryCRCApplyRe_Uploading: // 60 - 影像质疑CRC申请重传 - Code: 38
// IQC收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
- // PM/APM抄送
- ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
break;
- case EmailBusinessScenario.ReadTracking_PMApplyRe_Reading: // 67 - PM申请重阅
- // SPM/CPM收件
+ case EmailBusinessScenario.ReadTracking_PMApplyRe_Reading: // 67 - PM申请重阅 - Code: 45
+ // CPM、SPM收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.SPM || x.UserTypeEnum == UserTypeEnum.CPM).ToList();
break;
- case EmailBusinessScenario.Re_ReadApproval_SPMCPMApprovalRe_Reading: // 68 - SPM/CPM审批重阅
- // PM收件
- toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
- // 阅片人抄送
- ccUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IndependentReviewer).ToList();
+ case EmailBusinessScenario.Re_ReadApproval_SPMCPMApprovalRe_Reading: // 68 - SPM/CPM审批重阅 - Code: 46
+ // CRC收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
break;
}
@@ -395,14 +401,14 @@ public class ImageConsumer(
switch (scenario)
{
- case EmailBusinessScenario.ReviewerSelection_PMApplyApproving: // 69 - PM申请审批
- // SPM/CPM收件
+ case EmailBusinessScenario.ReviewerSelection_PMApplyApproving: // 69 - PM申请审批 - Code: 47
+ // CPM、SPM收件
toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.SPM || x.UserTypeEnum == UserTypeEnum.CPM).ToList();
break;
- case EmailBusinessScenario.ReviewerSelection_SPMCPMApproval: // 70 - SPM审批
- // PM收件
- toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+ case EmailBusinessScenario.ReviewerSelection_SPMCPMApproval: // 70 - SPM审批 - Code: 48
+ // APM、PM收件
+ toUserList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager || x.UserTypeEnum == UserTypeEnum.APM).ToList();
break;
}
From 400d0d33363f9a72af39ed65eab68b9a8c29451d Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 6 May 2025 14:12:57 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
index 7e5e12452..411e85701 100644
--- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs
@@ -222,7 +222,7 @@ public class ImageConsumer(
var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
// 根据不同场景获取不同角色的用户
- var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
+ var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId && !x.TrialUser.IsDeleted).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
// 根据场景确定收件人
List toUserList = new List();
@@ -393,7 +393,7 @@ public class ImageConsumer(
var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
// 根据不同场景获取不同角色的用户
- var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
+ var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId &&!x.TrialUser.IsDeleted).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
// 根据场景确定收件人
List toUserList = new List();