{_localizer["ConsistencyVerification_Desc"]}
");
+ dialogMsg.AppendLine(@$"
{_localizer["ConsistencyVerification_Desc"]}
");
dbSV.CheckResult = _localizer["ConsistencyVerification_Conf"] +
String.Join(" | ", dbExceptExcel.Select(t => $"{_localizer["ConsistencyVerification_EdcL", t.StudyDate, t.Modality]}")) + " | "
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/BackGroundJob/ObtainTaskAutoCancelJob.cs b/IRaCIS.Core.Application/MassTransit/Consumer/Old/ObtainTaskAutoCancelJob.cs
similarity index 100%
rename from IRaCIS.Core.Application/BackGroundJob/ObtainTaskAutoCancelJob.cs
rename to IRaCIS.Core.Application/MassTransit/Consumer/Old/ObtainTaskAutoCancelJob.cs
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs
new file mode 100644
index 000000000..a547968f0
--- /dev/null
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs
@@ -0,0 +1,448 @@
+using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Application.MassTransit.Command;
+using IRaCIS.Core.Domain;
+using IRaCIS.Core.Domain.BaseModel;
+using IRaCIS.Core.Domain.Models;
+using IRaCIS.Core.Domain.Share;
+using IRaCIS.Core.Infra.EFCore.Common;
+using MassTransit;
+using Microsoft.Extensions.Options;
+using MimeKit;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Reactive.Subjects;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.MassTransit.Consumer;
+
+///
+/// 加急的医学反馈任务 通知MIM
+///
+public class UrgentMedicalReviewAddedEventConsumer(
+ IRepository _userRepository,
+ IRepository _taskMedicalReviewRepository,
+ IRepository _trialRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _readingQuestionCriterionTrialRepository,
+ IRepository _visitTaskRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig
+ ) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+ ///
+ /// 加急的医学反馈任务 通知MIM (026,027)
+ ///
+ ///
+ ///
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(026,027) 【加急的医学反馈任务 通知MIM】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var medicalReviewId = context.Message.MedicalReviewId;
+
+ var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == medicalReviewId).Include(x => x.VisitTask).Include(x=>x.MedicalManagerUser).FirstOrDefaultAsync();
+
+
+
+ if (medicalReview.MedicalManagerUserId == null)
+ {
+ Console.WriteLine("MIMId为空 ID"+ medicalReviewId);
+ return;
+ }
+ var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == medicalReview.VisitTask.TrialReadingCriterionId);
+ var userinfo = await _userRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).FirstOrDefaultAsync();
+
+ var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).Include(x=>x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync();
+
+
+ var visitid = taskInfo.SourceSubjectVisit == null ? taskInfo.ReadModule.SubjectVisitId : taskInfo.SourceSubjectVisitId;
+
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync();
+
+
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId);
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+
+
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "MedicalReviewDoctorUserIdea",EnumValue=medicalReview.DoctorUserIdeaEnum.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "MedicalReviewAuditState",EnumValue=medicalReview.AuditState.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=taskInfo.IsUrgent.ToString().ToLower(), }
+ }
+ }) ;
+
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var subjectName = taskInfo.BlindSubjectCode.IsNullOrEmpty() ? taskInfo.Subject.Code : taskInfo.BlindSubjectCode;
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectName, taskInfo.TaskBlindName);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ criterion.CriterionName, // 阅片标准 {2}
+ subjectName, // 受试者 {3}
+ taskInfo.TaskBlindName, // 访视 {4}
+ dictionValue[0], // 任务类型 {5}
+ //dictionValue[1], // 阅片人是否同意 {6}
+ dictionValue[2], // 审核状态 {6}
+ dictionValue[3], // 是否加急 {7}
+ _systemEmailConfig.SiteUrl // 链接 {8}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPD ? EmailBusinessScenario.PDVerification_MedicalQC : EmailBusinessScenario.EligibilityVerification_MedicalQC,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+}
+
+//IR 回复医学反馈通知MIM
+public class UrgentIRRepliedMedicalReviewConsumer(
+ IRepository _userRepository,
+ IRepository _taskMedicalReviewRepository,
+ IRepository _trialRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _readingQuestionCriterionTrialRepository,
+ IRepository _visitTaskRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+
+ //IR 回复医学反馈通知MIM
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(028,029) 【IR 回复医学反馈通知MIM】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var medicalReviewId = context.Message.MedicalReviewId;
+
+ var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == medicalReviewId).Include(x => x.VisitTask).Include(x => x.MedicalManagerUser).FirstOrDefaultAsync();
+
+
+
+ if (medicalReview.MedicalManagerUserId == null)
+ {
+ Console.WriteLine("MIMId为空 ID" + medicalReviewId);
+ return;
+ }
+ var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == medicalReview.VisitTask.TrialReadingCriterionId);
+ var userinfo = await _userRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).FirstOrDefaultAsync();
+
+ var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).Include(x => x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync();
+
+
+ var visitid = taskInfo.SourceSubjectVisit == null ? taskInfo.ReadModule.SubjectVisitId : taskInfo.SourceSubjectVisitId;
+
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync();
+
+
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId);
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+
+
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "MedicalReviewDoctorUserIdea",EnumValue=medicalReview.DoctorUserIdeaEnum.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "MedicalReviewAuditState",EnumValue=medicalReview.AuditState.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=taskInfo.IsUrgent.ToString().ToLower(), }
+ }
+ });
+
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var subjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty() ? taskInfo.Subject.Code : taskInfo.BlindSubjectCode;
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, taskInfo.TaskBlindName);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ criterion.CriterionName, // 阅片标准 {2}
+ subjectCode, // 受试者 {3}
+ taskInfo.TaskBlindName, // 访视 {4}
+ dictionValue[0], // 任务类型 {5}
+ dictionValue[1], // 阅片人是否同意 {6}
+ dictionValue[2], // 审核状态 {7}
+ dictionValue[3], // 是否加急 {8}
+ _systemEmailConfig.SiteUrl // 链接 {9}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPD ? EmailBusinessScenario.PDVerification_ExpeditedMedicalQCResponse : EmailBusinessScenario.EligibilityVerification_ExpeditedMedicalQCResponse,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+}
+
+///
+/// MIM 回复医学返回通知IR
+///
+public class UrgentMIMRepliedMedicalReviewConsumer(
+ IRepository _userRepository,
+ IRepository _taskMedicalReviewRepository,
+ IRepository _trialRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _readingQuestionCriterionTrialRepository,
+ IRepository _visitTaskRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+ ///
+ /// MIM 回复医学返回通知IR
+ ///
+ ///
+ ///
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(022) 【加急医学反馈】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var medicalReviewId = context.Message.MedicalReviewId;
+
+ var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == medicalReviewId).Include(x => x.VisitTask).Include(x => x.MedicalManagerUser).FirstOrDefaultAsync();
+
+
+
+ if (medicalReview.MedicalManagerUserId == null)
+ {
+ Console.WriteLine("MIMId为空 ID" + medicalReviewId);
+ return;
+ }
+ var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == medicalReview.VisitTask.TrialReadingCriterionId);
+ var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).Include(x => x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync();
+
+ var userinfo = await _userRepository.Where(x => x.Id == taskInfo.DoctorUserId).FirstOrDefaultAsync();
+
+
+
+
+ var visitid = taskInfo.SourceSubjectVisit == null ? taskInfo.ReadModule.SubjectVisitId : taskInfo.SourceSubjectVisitId;
+
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync();
+
+
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId);
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+
+
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), },
+ new DictionaryDto (){DictionaryCode= "IsPass",EnumValue=medicalReview.IsHaveQuestion.ToString().ToLower(), },// 审核结论
+ new DictionaryDto (){DictionaryCode= "AuditAdvice",EnumValue=medicalReview.AuditAdviceEnum.GetEnumInt(), },// 审核建议
+ new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=taskInfo.IsUrgent.ToString().ToLower(), }, //是否加急
+
+
+
+
+
+ }
+ });
+
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var subjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty() ? taskInfo.Subject.Code : taskInfo.BlindSubjectCode;
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, taskInfo.TaskBlindName);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ subjectCode, // 受试者 {2}
+ taskInfo.TaskBlindName, // 访视 {3}
+ criterion.CriterionName, // 阅片标准 {4}
+ dictionValue[0], // 任务类型 {5}
+ dictionValue[1], // 审核结论 {6}
+ dictionValue[2], // 医学审核建议 {7}
+ dictionValue[3], // 是否加急 {8}
+
+ _systemEmailConfig.SiteUrl // 链接 {9}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ EmailBusinessScenario.ExpeditedMedicalQCToIR,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+}
+
+///
+/// 加急阅片 IR 申请重阅 或者PM 申请重阅
+///
+public class UrgentIRApplyedReReadingConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _taskMedicalReviewRepository,
+ IRepository _trialRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _readingQuestionCriterionTrialRepository,
+ IRepository _visitTaskRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(024,025) 【加急医学反馈】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var visitTaskId = context.Message.VisitTaskId;
+
+ var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync();
+ var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == taskInfo.TrialReadingCriterionId);
+
+
+ var doctorInfo = await _userRepository.Where(x => x.Id == taskInfo.DoctorUserId).FirstOrDefaultAsync();
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == taskInfo.TrialId).Include(x => x.User).Select(x=>x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager||x.UserTypeEnum==UserTypeEnum.APM).ToList();
+ if (context.Message.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed)
+ {
+ userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CPM || x.UserTypeEnum == UserTypeEnum.SPM).ToList();
+ }
+
+ var visitid = taskInfo.SourceSubjectVisit == null ? taskInfo.ReadModule.SubjectVisitId : taskInfo.SourceSubjectVisitId;
+
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync();
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == taskInfo.TrialId);
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), }, //任务类型
+ new DictionaryDto (){DictionaryCode= "RequestReReadingResult",EnumValue="0", }, //审批结果 都是待审批
+ }
+ });
+
+ Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
+ {
+ var subjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty() ? taskInfo.Subject.Code : taskInfo.BlindSubjectCode;
+ var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, taskInfo.TaskBlindName);
+ var htmlBodyStr = string.Format(
+ CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ userinfo.FullName, // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ subjectCode, // 受试者 {2}
+ taskInfo.TaskBlindName, // 访视 {3}
+ dictionValue[0], // 任务类型 {4}
+ doctorInfo.FullName, // 阅片人 {5}
+ criterion.CriterionName, // 阅片标准 {6}
+ dictionValue[1], // 审批结果 {7}
+ _systemEmailConfig.SiteUrl // 链接 {8}
+
+
+
+
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed? EmailBusinessScenario.ReReadFromPMApproval: EmailBusinessScenario.ReReadFromIRApproval,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+
+
+ }
+}
+
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs
new file mode 100644
index 000000000..d1734d2e1
--- /dev/null
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/SiteSurverEmailConsumer.cs
@@ -0,0 +1,299 @@
+using DocumentFormat.OpenXml.Office2013.Excel;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.Vml;
+using DocumentFormat.OpenXml.Wordprocessing;
+using IRaCIS.Core.Application.Contracts;
+using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Application.MassTransit.Command;
+using IRaCIS.Core.Domain;
+using IRaCIS.Core.Domain.BaseModel;
+using IRaCIS.Core.Domain.Models;
+using IRaCIS.Core.Domain.Share;
+using MassTransit;
+using Microsoft.AspNetCore.Components.Routing;
+using Microsoft.Extensions.Options;
+using MimeKit;
+using NPOI.SS.Formula.Functions;
+using NPOI.Util;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.MassTransit.Consumer;
+
+///
+/// 用户提交 发送邮件 通知SPM 或者PM
+///
+public class UserSiteSurveySubmitedEventConsumer(
+ IRepository _trialRepository,
+ IRepository _trialSiteRepository,
+ IRepository _trialUserRepository,
+ IRepository _trialSiteSurveyRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig
+ ) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
+
+ var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
+
+ var trialId = siteSurveyInfo.TrialId;
+
+ var trialUserList = await _trialUserRepository.Where(t => t.TrialId == siteSurveyInfo.TrialId)
+ .Where(t => t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM || t.User.UserTypeEnum == UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM)
+ .Select(t => new { t.User.FullName, t.User.EMail, t.User.UserTypeEnum }).ToListAsync();
+
+ var sPMOrCPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.SPM || t.UserTypeEnum == UserTypeEnum.CPM).ToList();
+ var pmAndAPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserTypeEnum == UserTypeEnum.APM).ToList();
+
+ var messageToSend = new MimeMessage();
+
+ var toUserName = string.Empty;
+
+ //有SPM
+ if (sPMOrCPMList.Count > 0)
+ {
+ foreach (var user in sPMOrCPMList)
+ {
+ messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
+ }
+
+ toUserName = string.Join('、', sPMOrCPMList.Select(t => t.FullName));
+
+ foreach (var user in pmAndAPMList)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(user.FullName, user.EMail));
+ }
+
+ }
+ else
+ {
+ foreach (var user in pmAndAPMList)
+ {
+ messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
+ }
+
+ toUserName = string.Join('、', pmAndAPMList.Select(t => t.FullName));
+ }
+
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
+
+ var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
+
+ 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, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ toUserName,
+ siteInfo.TrialSiteCode,
+ siteInfo.TrialSiteAliasName,
+
+ siteSurveyInfo.UserName,
+ siteSurveyInfo.Email,
+ siteSurveyInfo.Phone,
+ _systemEmailConfig.SiteUrl
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ var scenario = _trialSiteSurveyRepository.Where(t => t.Id != trialSiteSurveyId && t.TrialId == siteSurveyInfo.TrialId && t.TrialSiteId == siteSurveyInfo.TrialSiteId).IgnoreQueryFilters().Any() ?
+ EmailBusinessScenario.Approval_UpdateSiteSurvey : EmailBusinessScenario.Approval_SubmitSiteSurvey;
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, scenario, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+
+ }
+}
+
+///
+/// 调研表初审通过,进行复审发送邮件
+///
+public class SiteSurveySPMSubmitedEventConsumer(
+ IRepository _trialRepository,
+ IRepository _trialUserRepository,
+ IRepository _trialSiteRepository,
+ IRepository _trialSiteSurveyRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
+
+ var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
+
+ var trialId = siteSurveyInfo.TrialId;
+
+ var messageToSend = new MimeMessage();
+
+ var trialUserList = _trialUserRepository.Where(t => t.TrialId == trialId)
+ .Where(t => t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM || t.User.UserTypeEnum == UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM)
+ .Select(t => new { t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToList();
+
+ var sPMOrCPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.SPM || t.UserTypeEnum == UserTypeEnum.CPM).ToList();
+ var pmAndAPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserTypeEnum == UserTypeEnum.APM).ToList();
+
+ var toUserName = string.Empty;
+
+ foreach (var item in pmAndAPMList)
+ {
+ messageToSend.To.Add(new MailboxAddress(item.FullName, item.EMail));
+
+ toUserName = string.Join('、', pmAndAPMList.Select(t => t.FullName));
+ }
+
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
+
+ var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
+
+
+ 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, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ toUserName,
+ siteInfo.TrialSiteCode,
+ siteInfo.TrialSiteAliasName,
+
+ siteSurveyInfo.UserName,
+ siteSurveyInfo.Email,
+ siteSurveyInfo.Phone,
+ _systemEmailConfig.SiteUrl
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.Approval_SubmitSiteSurvey, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+}
+
+
+///
+/// 调研表驳回发送邮件 之前已有,需要迁移过来
+///
+public class SiteSurverRejectedEventConsumer(
+ IRepository _trialUserRepository,
+ IRepository _trialRepository,
+ IRepository _trialSiteRepository,
+ IRepository _trialSiteSurveyRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig
+ ) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+
+ public async Task Consume(ConsumeContext context)
+ {
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ var trialSiteSurveyId = context.Message.TrialSiteSurveyId;
+
+ var siteSurveyInfo = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).FirstOrDefault().IfNullThrowException();
+
+ var trialId = siteSurveyInfo.TrialId;
+
+ var messageToSend = new MimeMessage();
+
+ var toUserName = siteSurveyInfo.UserName;
+
+ if (context.Message.IsHaveSPMOrCPM)
+ {
+ //PM 驳回到SPM
+ if (siteSurveyInfo.State == TrialSiteSurveyEnum.CRCSubmitted)
+ {
+ //var user = await _userRepository.FirstOrDefaultAsync(t => t.Id == siteSurveyInfo.PreliminaryUserId);
+
+ //name = user.FullName;
+
+ var sPMOrCPMList = _trialUserRepository.Where(t => t.TrialId == trialId)
+ .Where(t => t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM)
+ .Select(t => new { t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToList();
+
+
+ foreach (var user in sPMOrCPMList)
+ {
+ messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
+ }
+
+ toUserName = string.Join('、', sPMOrCPMList.Select(t => t.FullName));
+
+ }
+ //SPM 驳回到CRC
+ else if (siteSurveyInfo.State == TrialSiteSurveyEnum.ToSubmit)
+ {
+ messageToSend.To.Add(new MailboxAddress(toUserName, siteSurveyInfo.Email));
+ }
+
+ }
+ else
+ {
+ //没有SPM PM驳回到CRC
+
+ messageToSend.To.Add(new MailboxAddress(String.Empty, siteSurveyInfo.Email));
+ }
+
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
+
+ var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
+
+
+ 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, trialInfo.ResearchProgramNo);
+ var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
+ toUserName,
+ trialInfo.TrialCode,
+ trialInfo.ResearchProgramNo,
+ trialInfo.ExperimentName,
+ siteInfo.TrialSiteCode,
+ siteInfo.TrialSiteAliasName,
+ siteSurveyInfo.LatestBackReason,
+ _systemEmailConfig.SiteUrl,
+ (siteSurveyInfo.State == TrialSiteSurveyEnum.ToSubmit ? "inline - block" : "none")
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.SiteSurveyReject, messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+
+
+ }
+}
diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs
new file mode 100644
index 000000000..22f58a5da
--- /dev/null
+++ b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs
@@ -0,0 +1,714 @@
+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.BaseModel;
+using IRaCIS.Core.Domain.Models;
+using IRaCIS.Core.Infra.EFCore.Common;
+using MassTransit;
+using Microsoft.Extensions.Options;
+using MimeKit;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.MassTransit.Consumer;
+
+
+///
+/// CRC 提交了 通知QC进行质控 Code005,006
+///
+public class CRCSubmitedAndQCToAuditEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _readingQuestionCriterionTrialRepository,
+ IRepository _visitTaskRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(005,006) 【加急项目所有IQC待领取质控任务】邮件!!!");
+ 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).FirstOrDefaultAsync();
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
+
+
+ var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+ var auditStateCode = "AuditStatePE";
+
+ if (trialInfo.QCProcessEnum == TrialQCProcess.DoubleAudit)
+ {
+ auditStateCode = "AuditStateRC";
+ }
+
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= auditStateCode,EnumValue=subjectVisit.AuditState.GetEnumInt(), }, //审核状态
+
+ }
+ });
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+ }
+
+ var userNames = userinfoList.Select(x => x.FullName).ToList();
+
+ foreach (var pm in pmandAPm)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
+ }
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+
+ 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),
+ string.Join(',', userNames), // 用户名 {0}
+ trialInfo.ExperimentName, // 项目 {1}
+ subjectCode, // 受试者 {2}
+ subjectVisit.VisitName, // 访视 {3}
+ dictionValue[0], // 审核状态 {4}
+ _systemEmailConfig.SiteUrl // 链接 {5}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQCClaim : EmailBusinessScenario.EligibilityVerification_PendingClaim,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+
+ }
+}
+
+
+///
+/// CRC 回复质控质疑 通知QC Code012,013
+///
+public class CRCRepliedQCChallengeEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _qCChallengeRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(Code012,013) 【CRC 回复质控质疑 通知QC】邮件!!!");
+ 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).Include(x => x.CurrentActionUser).FirstNotNullAsync();
+
+
+ var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId).Include(x => x.QCChallenge).FirstNotNullAsync();
+
+
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+
+
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
+ var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+ var userinfo = subjectVisit.CurrentActionUser;
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ foreach (var pm in pmandAPm)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
+ }
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=qCChallengeDialog.QCChallenge.IsClosed.ToString().ToLower(), }, //是否关闭
+
+ }
+ });
+
+ 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}
+ dictionValue[0], // 是否关闭 {4}
+ qCChallengeDialog.TalkContent, // 质疑内容{5}
+ _systemEmailConfig.SiteUrl // 链接 {6}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderQCQuery : EmailBusinessScenario.EligibilityVerification_Pending,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+}
+
+
+///
+/// QC回复 质控质疑,通知CRC (014,015)
+///
+public class QCRepliedQCChallengeEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _qCChallengeRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(014,015) 【 QC回复 质控质疑,通知CRC】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+
+ string talkContent = string.Empty;
+ var isclose = false;
+ if (context.Message.QCChallengeDialogId != null)
+ {
+ var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId.Value).Include(x => x.QCChallenge).FirstNotNullAsync();
+ talkContent = qCChallengeDialog.TalkContent;
+ isclose = qCChallengeDialog.QCChallenge.IsClosed;
+ }
+ else if(context.Message.QCChallengeId != null)
+ {
+ var qCChallenge = await _qCChallengeRepository.Where(x => x.Id == context.Message.QCChallengeId.Value).FirstNotNullAsync();
+ talkContent = qCChallenge.Content;
+ isclose = qCChallenge.IsClosed;
+ }
+
+ var subjectVisitId = context.Message.SubjectVisitId;
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstNotNullAsync();
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
+
+ var craInfo = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault();
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=isclose.ToString().ToLower(), }, //是否关闭
+
+ }
+ });
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+ if (craInfo != null)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, craInfo.EMail));
+ }
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+
+
+ 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}
+ dictionValue[0], // 质疑是否关闭 {4}
+ talkContent, // 质疑内容 {5}
+ _systemEmailConfig.SiteUrl // 链接 {65}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_ImageQuery : EmailBusinessScenario.EligibilityVerification_ImageQuery,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+}
+
+
+///
+/// CRC 回复一致性核查质疑 通知PM (019,020)
+///
+public class CRCRepliedCheckChallengeEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _qCChallengeRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(019,020) 【 CRC 回复一致性核查质疑 通知PM】邮件!!!");
+ 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 trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态
+
+ }
+ });
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+
+
+ 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}
+ dictionValue[0], // 核查状态 {4}
+ _systemEmailConfig.SiteUrl // 链接 {5}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDRForPMOrAPM : EmailBusinessScenario.EligibilityVerification_UnderDRForPMOrAPM,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+}
+
+
+
+///
+/// PM 一致性核查 通知CRC (016,017)
+
+///
+public class PMRepliedCheckChallengeEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _checkChallengeDialogRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(016,017) 【 PM 一致性核查 通知CRC】邮件!!!");
+ var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
+ var checkChallengeDialog = await _checkChallengeDialogRepository.Where(x => x.Id == context.Message.CheckChallengeDialogId).FirstNotNullAsync();
+ var subjectVisitId = context.Message.SubjectVisitId;
+
+ var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.NoneDicomStudyList).Include(x => x.StudyList).Include(x => x.Subject).FirstNotNullAsync();
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
+
+ var craInfo = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault();
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+ List modalities = new List();
+ modalities =subjectVisit.NoneDicomStudyList.Select(t => t.Modality)
+ .Union(subjectVisit.StudyList.Select(k => k.ModalityForEdit)).ToList();
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //核查状态
+
+ }
+ });
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+ if (craInfo != null)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, craInfo.EMail));
+ }
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+
+
+ 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}
+ string.Join(',', modalities), // 检查类型 {4}
+ dictionValue[0], // 核查状态 {5}
+ checkChallengeDialog.TalkContent,// 质疑内容{6}
+ _systemEmailConfig.SiteUrl // 链接 {7}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDR : EmailBusinessScenario.EligibilityVerification_UnderDR,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+}
+
+
+///
+/// 通知PM 进行一致性核查 (018,030)
+///
+public class CheckStateChangedToAuditEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _qCChallengeRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(018,030) 【通知PM 进行一致性核查】邮件!!!");
+ 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 trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+ var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List()
+ {
+ new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态
+
+ }
+ });
+
+
+ foreach (var userinfo in userinfoList)
+ {
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+
+
+
+ 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),
+ trialInfo.ExperimentName, // 项目 {1}
+ userinfo.FullName, // 用户名 {1}
+ subjectCode, // 受试者 {2}
+ subjectVisit.VisitName, // 访视 {3}
+ dictionValue[0], // 核查状态 {4}
+ _systemEmailConfig.SiteUrl // 链接 {5}
+ );
+
+ return (topicStr, htmlBodyStr);
+ };
+
+ await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
+
+ context.Message.IsPd ? EmailBusinessScenario.PDVerification_DR : EmailBusinessScenario.EligibilityVerification_DR,
+
+ messageToSend, emailConfigFunc);
+
+ await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
+ }
+ }
+}
+
+///
+/// QC 领取了质控任务 (007,008)
+///
+public class QCClaimTaskEventConsumer(
+ IRepository _userRepository,
+ IRepository _trialUseRepository,
+ IRepository _subjectVisitRepository,
+ IRepository _trialRepository,
+ IRepository _qCChallengeRepository,
+ IRepository _qCChallengeDialogRepository,
+ IRepository _dictionaryRepository,
+ IRepository _emailNoticeConfigrepository,
+ IOptionsMonitor systemEmailConfig) : IConsumer
+{
+ private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
+ public async Task Consume(ConsumeContext context)
+ {
+ Console.WriteLine("发送(Code007,008) 【QC 领取了质控任务】邮件!!!");
+ 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).Include(x => x.CurrentActionUser).FirstNotNullAsync();
+
+
+ var subjectVisitList = await _subjectVisitRepository.Where(x => x.CurrentActionUserId == context.Message.CurrentActionUserId && x.TrialId == subjectVisit.TrialId).Include(x => x.Subject).ToListAsync();
+
+
+
+
+
+ var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
+
+
+
+
+
+ var pmandAPm = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager).ToList();
+
+
+ var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
+
+
+ var userinfo = subjectVisit.CurrentActionUser;
+
+ var messageToSend = new MimeMessage();
+ //发件地址
+ messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
+ messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
+
+ foreach (var pm in pmandAPm)
+ {
+ messageToSend.Cc.Add(new MailboxAddress(String.Empty, pm.EMail));
+ }
+ var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
+
+ var auditStateCode = "AuditStatePE";
+
+ if (trialInfo.QCProcessEnum == TrialQCProcess.DoubleAudit)
+ {
+ auditStateCode = "AuditStateRC";
+ }
+
+ var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
+ {
+ DictionaryRepository = _dictionaryRepository,
+ IsEn_US = isEn_US,
+ DictionaryList = new List