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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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 _userRoleRepository,
        IRepository _trialUseRoleRepository,
       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 _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.UserRole).Select(x => x.UserRole).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()
         {
          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.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
         context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQC : EmailBusinessScenario.EligibilityVerification_PendingImageQC,
            messageToSend, emailConfigFunc);
        await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
    }
}