764 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			764 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C#
		
	
	
| 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;
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// CRC 提交了 通知QC进行质控  Code005,006
 | ||
| /// </summary>
 | ||
| public class CRCSubmitedAndQCToAuditEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|       IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|       IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
 | ||
|       IRepository<VisitTask> _visitTaskRepository,
 | ||
|       IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCSubmitedAndQCToAuditEvent>
 | ||
| {
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<CRCSubmitedAndQCToAuditEvent> 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).FirstNotNullAsync();
 | ||
| 
 | ||
|         var trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQCClaim : EmailBusinessScenario.EligibilityVerification_PendingClaim;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
 | ||
| 
 | ||
| 
 | ||
|             var pmandAPm = trialUserList.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<DictionaryDto>()
 | ||
|             {
 | ||
|              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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|             await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// CRC 回复质控质疑 通知QC  Code012,013
 | ||
| /// </summary>
 | ||
| public class CRCRepliedQCChallengeEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<QCChallenge> _qCChallengeRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedQCChallengeEvent>
 | ||
| {
 | ||
| 
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<CRCRepliedQCChallengeEvent> 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 trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderQCQuery : EmailBusinessScenario.EligibilityVerification_Pending;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
|             var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId).Include(x => x.QCChallenge).FirstNotNullAsync();
 | ||
| 
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
 | ||
|             var pmandAPm = trialUserList.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<DictionaryDto>()
 | ||
|             {
 | ||
|              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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|             await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// QC回复 质控质疑,通知CRC (014,015)
 | ||
| /// </summary>
 | ||
| public class QCRepliedQCChallengeEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<QCChallenge> _qCChallengeRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<QCRepliedQCChallengeEvent>
 | ||
| {
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<QCRepliedQCChallengeEvent> context)
 | ||
|     {
 | ||
|         Console.WriteLine("发送(014,015) 【  QC回复 质控质疑,通知CRC】邮件!!!");
 | ||
|         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;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_ImageQuery : EmailBusinessScenario.EligibilityVerification_ImageQuery;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
|             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 trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
 | ||
| 
 | ||
|             var craInfo = trialUserList.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<DictionaryDto>()
 | ||
|             {
 | ||
|           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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|                 await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// CRC 回复一致性核查质疑 通知PM  (019,020)
 | ||
| /// </summary>
 | ||
| public class CRCRepliedCheckChallengeEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<QCChallenge> _qCChallengeRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedCheckChallengeEvent>
 | ||
| {
 | ||
| 
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<CRCRepliedCheckChallengeEvent> 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 trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDRForPMOrAPM : EmailBusinessScenario.EligibilityVerification_UnderDRForPMOrAPM;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.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<DictionaryDto>()
 | ||
|          {
 | ||
|           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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|                 await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// PM 一致性核查 通知CRC (016,017)
 | ||
| 
 | ||
| /// </summary>
 | ||
| public class PMRepliedCheckChallengeEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<CheckChallengeDialog> _checkChallengeDialogRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<PMRepliedCheckChallengeEvent>
 | ||
| {
 | ||
| 
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<PMRepliedCheckChallengeEvent> context)
 | ||
|     {
 | ||
|         Console.WriteLine("发送(016,017) 【  PM 一致性核查 通知CRC】邮件!!!");
 | ||
|         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.NoneDicomStudyList).Include(x => x.StudyList).Include(x => x.Subject).FirstNotNullAsync();
 | ||
| 
 | ||
|         var trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderDR : EmailBusinessScenario.EligibilityVerification_UnderDR;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
|             var checkChallengeDialog = await _checkChallengeDialogRepository.Where(x => x.Id == context.Message.CheckChallengeDialogId).FirstNotNullAsync();
 | ||
| 
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList();
 | ||
| 
 | ||
|             var craInfo = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault();
 | ||
| 
 | ||
|             var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
 | ||
| 
 | ||
| 
 | ||
|             List<string> modalities = new List<string>();
 | ||
|             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<DictionaryDto>()
 | ||
|          {
 | ||
|             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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|                 await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// 通知PM 进行一致性核查 (018,030)
 | ||
| /// </summary>
 | ||
| public class CheckStateChangedToAuditEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<QCChallenge> _qCChallengeRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CheckStateChangedToAuditEvent>
 | ||
| {
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<CheckStateChangedToAuditEvent> 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 trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_DR : EmailBusinessScenario.EligibilityVerification_DR;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
|             var userinfoList = trialUserList.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<DictionaryDto>()
 | ||
|             {
 | ||
|              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.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|                 await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// QC 领取了质控任务 (007,008) 
 | ||
| /// </summary>
 | ||
| public class QCClaimTaskEventConsumer(
 | ||
|       IRepository<UserRole> _userRoleRepository,
 | ||
|         IRepository<TrialUserRole> _trialUseRoleRepository,
 | ||
|        IRepository<SubjectVisit> _subjectVisitRepository,
 | ||
|       IRepository<Trial> _trialRepository,
 | ||
|       IRepository<QCChallenge> _qCChallengeRepository,
 | ||
|       IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
 | ||
|          IRepository<Dictionary> _dictionaryRepository,
 | ||
|        IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigrepository,
 | ||
|       IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<QCClaimTaskEvent>
 | ||
| {
 | ||
|     private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
 | ||
|     public async Task Consume(ConsumeContext<QCClaimTaskEvent> 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 trialId = subjectVisit.TrialId;
 | ||
| 
 | ||
|         var scenario = context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQC : EmailBusinessScenario.EligibilityVerification_PendingImageQC;
 | ||
| 
 | ||
|         var trialEmailConfig = _trialEmailNoticeConfigrepository.Where(t => t.TrialId == trialId && t.BusinessScenarioEnum == scenario && t.IsAutoSend && t.IsEnable).FirstOrDefault();
 | ||
| 
 | ||
|         if (trialEmailConfig != null)
 | ||
|         {
 | ||
| 
 | ||
| 
 | ||
|             var subjectVisitList = await _subjectVisitRepository.Where(x => x.CurrentActionUserId == context.Message.CurrentActionUserId && x.TrialId == subjectVisit.TrialId).Include(x => x.Subject).ToListAsync();
 | ||
| 
 | ||
| 
 | ||
|             var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync();
 | ||
| 
 | ||
| 
 | ||
|             var pmandAPm = trialUserList.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<DictionaryDto>()
 | ||
|          {
 | ||
|           new DictionaryDto (){DictionaryCode= auditStateCode,EnumValue=subjectVisit.AuditState.GetEnumInt(), }, //审核状态
 | ||
| 
 | ||
|          }
 | ||
|             });
 | ||
| 
 | ||
|             var subjectcodes = subjectVisitList.Select(x => x.Subject.Code).Distinct().ToList();
 | ||
|             var visitnames = subjectVisitList.Select(x => x.VisitName).Distinct().ToList();
 | ||
| 
 | ||
|             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}
 | ||
|                    string.Join(',', subjectcodes), // 受试者 {2}
 | ||
|                   string.Join(',', visitnames),             // 访视  {3}
 | ||
|                    dictionValue[0],    // 审核状态 {4}
 | ||
| 
 | ||
|                    _systemEmailConfig.SiteUrl             // 链接                  {5}
 | ||
|                     );
 | ||
| 
 | ||
|                 return (topicStr, htmlBodyStr);
 | ||
|             };
 | ||
| 
 | ||
| 
 | ||
|             await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc);
 | ||
| 
 | ||
|             await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
 | ||
|         }
 | ||
|     }
 | ||
| }
 |