diff --git a/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs b/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs index b87896b90..8597cbf7d 100644 --- a/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs +++ b/IRaCIS.Core.Application/Helper/Email/SendEmailHelper.cs @@ -17,7 +17,7 @@ public static class SendEmailHelper //没有收件人 那么不发送 if (messageToSend.To.Count == 0) - { + { return string.Empty; } @@ -147,7 +147,7 @@ public static class SendEmailHelper return true; } - public static async Task SendEmailAsync(SMTPEmailConfig sMTPEmailConfig,Trial? trial, EventHandler? messageSentSuccess = null) + public static async Task SendEmailAsync(SMTPEmailConfig sMTPEmailConfig, Trial? trial, EventHandler? messageSentSuccess = null) { var messageToSend = new MimeMessage(); @@ -161,8 +161,9 @@ public static class SendEmailHelper if (sMTPEmailConfig.ToMailAddressList.Count == 0) { + return; //---没有收件人 - throw new ArgumentException(I18n.T("SendEmail_NoRecipient")); + //throw new ArgumentException(I18n.T("SendEmail_NoRecipient")); } else { diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 654eb64f0..e8359eef5 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -2340,7 +2340,7 @@ - + 获取入组结果 @@ -2348,9 +2348,10 @@ + - + 获取PD 结果 @@ -2358,6 +2359,7 @@ 任务类型 标准类型 是否是全局产生(区分裁判任务) + diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/Dto/SendImageReuploadEmailDto.cs b/IRaCIS.Core.Application/MassTransit/Consumer/Dto/SendImageReuploadEmailDto.cs index 263f606e4..9fa2f0410 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/Dto/SendImageReuploadEmailDto.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/Dto/SendImageReuploadEmailDto.cs @@ -27,5 +27,16 @@ namespace IRaCIS.Core.Application.MassTransit.Consumer.Dto + } + + public class SendEmailUserDto + { + public UserTypeEnum UserTypeEnum { get; set; } + + public string FullName { get; set; } + + public UserWorkLanguage UserWorkLanguage { get; set; } + + public string EMail { get; set; } } } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs index f45d703d5..832e6b638 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs @@ -273,15 +273,30 @@ public class ImageConsumer( }; // 根据不同场景获取不同角色的用户 先排除CRC和CRA - var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == inDto.TrialId && !x.TrialUser.IsDeleted && !filterUserTypeList.Contains(x.UserRole.UserTypeEnum) ).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync(); + var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == inDto.TrialId && !x.TrialUser.IsDeleted && !filterUserTypeList.Contains(x.UserRole.UserTypeEnum) ).Include(x => x.UserRole).Select(x => x.UserRole) + .Select(x => new SendEmailUserDto() + { + UserTypeEnum = x.UserTypeEnum, + FullName = x.FullName, + UserWorkLanguage = x.IdentityUser.UserWorkLanguage, + EMail=x.EMail, + }) + .ToListAsync(); // CRC和CRA单独取 - var crcAndcraUserList = await _trialSiteRepository.Where(x => x.Id == inDto.SubjectVisit.TrialSiteId).SelectMany(x => x.CRCUserList.Select(y => y.UserRole)).ToListAsync(); + var crcAndcraUserList = await _trialSiteRepository.Where(x => x.Id == inDto.SubjectVisit.TrialSiteId).SelectMany(x => x.CRCUserList.Select(y => y.UserRole)) + .Select(x => new SendEmailUserDto() + { + UserTypeEnum = x.UserTypeEnum, + FullName = x.FullName, + UserWorkLanguage = x.IdentityUser.UserWorkLanguage, + EMail = x.EMail, + }).ToListAsync(); trialUserList.AddRange(crcAndcraUserList); // 根据场景确定收件人 - List toUserList = new List(); - List ccUserList = new List(); + List toUserList = new List(); + List ccUserList = new List(); var emailNoticeUserList = await _emailNoticeUserTypeRepository.Where(x => x.EmailNoticeConfigId == inDto.EmailNoticeConfig.Id).ToListAsync(); var userTypeEnumList = emailNoticeUserList.Select(x => x.UserType).ToList(); @@ -334,40 +349,53 @@ public class ImageConsumer( DictionaryList = dictionaryDtos }); - foreach (var userinfo in toUserList) + + var userWorkLanguageList = toUserList.Select(x => x.UserWorkLanguage).Distinct().ToList(); + + foreach (var workLanguage in userWorkLanguageList) { + + var userinfoList = toUserList.Where(x => x.UserWorkLanguage == workLanguage).ToList(); var messageToSend = new MimeMessage(); // 发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + + foreach (var userinfo in userinfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } + // 添加抄送 foreach (var ccUser in ccUserList) { messageToSend.Cc.Add(new MailboxAddress(ccUser.FullName, ccUser.EMail)); } + + var userNames = userinfoList.Select(x => x.FullName).ToList(); + // 格式化邮件内容 Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => - { - var subjectCode = inDto.SubjectVisit.Subject.Code; - var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, inDto.SubjectVisit.VisitName); - var htmlBodyStr = string.Format( - CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr), - userinfo.FullName, // 用户名 {0} - trialInfo.ExperimentName, // 项目 {1} - subjectCode, // 受试者 {2} - inDto.SubjectVisit.VisitName, // 访视 {3} - dictionValue[0], // 是否加急 {4} - dictionValue[1], // 审批结果 {5} - _systemEmailConfig.SiteUrl // 链接 {6} - ); + { + var subjectCode = inDto.SubjectVisit.Subject.Code; + var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, inDto.SubjectVisit.VisitName); + var htmlBodyStr = string.Format( + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + string.Join(',', userNames), // 用户名 {0} + trialInfo.ExperimentName, // 项目 {1} + subjectCode, // 受试者 {2} + inDto.SubjectVisit.VisitName, // 访视 {3} + dictionValue[0], // 是否加急 {4} + dictionValue[1], // 审批结果 {5} + _systemEmailConfig.SiteUrl // 链接 {6} + ); - return (topicStr, htmlBodyStr); - }; + return (topicStr, htmlBodyStr); + }; - - - await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(inDto.EmailNoticeConfig, messageToSend, emailConfigFunc); + + + await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(inDto.EmailNoticeConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } @@ -446,11 +474,19 @@ public class ImageConsumer( var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId); // 根据不同场景获取不同角色的用户 - var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId && !x.TrialUser.IsDeleted).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync(); + var trialUser = await _trialUseRoleRepository.Where(x => x.TrialId == trialId && !x.TrialUser.IsDeleted).Include(x => x.UserRole).Select(x => x.UserRole) + .Select(x => new SendEmailUserDto() + { + UserTypeEnum = x.UserTypeEnum, + FullName = x.FullName, + UserWorkLanguage = x.IdentityUser.UserWorkLanguage, + EMail = x.EMail, + }) + .ToListAsync(); // 根据场景确定收件人 - List toUserList = new List(); - List ccUserList = new List(); + List toUserList = new List(); + List ccUserList = new List(); var emailNoticeUserList = await _emailNoticeUserTypeRepository.Where(x => x.EmailNoticeConfigId == emailNoticeConfig.Id).ToListAsync(); @@ -469,12 +505,19 @@ public class ImageConsumer( return; } - foreach (var userinfo in toUserList) + var userWorkLanguageList = toUserList.Select(x => x.UserWorkLanguage).Distinct().ToList(); + + foreach (var workLanguage in userWorkLanguageList) { + var userinfoList = toUserList.Where(x => x.UserWorkLanguage == workLanguage).ToList(); var messageToSend = new MimeMessage(); // 发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + + foreach (var userinfo in userinfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } // 添加抄送 foreach (var ccUser in ccUserList) @@ -482,13 +525,15 @@ public class ImageConsumer( messageToSend.Cc.Add(new MailboxAddress(ccUser.FullName, ccUser.EMail)); } + var userNames = userinfoList.Select(x => x.FullName).ToList(); + // 格式化邮件内容 Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo); var htmlBodyStr = string.Format( - CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr), - userinfo.FullName, // 用户名 {0} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + string.Join(',', userNames), // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} "", // 受试者 {2} - 阅片人筛选不涉及受试者 "", // 访视 {3} - 阅片人筛选不涉及访视 @@ -500,7 +545,7 @@ public class ImageConsumer( return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailNoticeConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailNoticeConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs index c494a2ccc..f620b1f11 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/ReadingRelationEmailConsumer.cs @@ -1,5 +1,6 @@ -using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.MassTransit.Command; +using IRaCIS.Core.Application.MassTransit.Consumer.Dto; using IRaCIS.Core.Domain; using IRaCIS.Core.Domain.BaseModel; using IRaCIS.Core.Domain.Models; @@ -68,7 +69,7 @@ public class UrgentMedicalReviewAddedEventConsumer( var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == medicalReview.VisitTask.TrialReadingCriterionId); - var userinfo = await _userRoleRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).FirstOrDefaultAsync(); + var userinfo = await _userRoleRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).Include(x => x.IdentityUser).FirstOrDefaultAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).Include(x => x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync(); @@ -78,7 +79,8 @@ public class UrgentMedicalReviewAddedEventConsumer( var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync(); - + var workLanguage = userinfo.IdentityUser?.UserWorkLanguage; + var userIsEn_US = workLanguage.HasValue ? workLanguage.Value == UserWorkLanguage.US : isEn_US; var messageToSend = new MimeMessage(); //发件地址 @@ -86,14 +88,14 @@ public class UrgentMedicalReviewAddedEventConsumer( messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId); - var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() { DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, + IsEn_US = userIsEn_US, DictionaryList = new List() @@ -110,7 +112,7 @@ public class UrgentMedicalReviewAddedEventConsumer( 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), + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), userinfo.FullName, // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} criterion.CriterionName, // 阅片标准 {2} @@ -126,7 +128,7 @@ public class UrgentMedicalReviewAddedEventConsumer( return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); @@ -177,7 +179,7 @@ public class UrgentIRRepliedMedicalReviewConsumer( var criterion = await _readingQuestionCriterionTrialRepository.FirstOrDefaultAsync(x => x.Id == medicalReview.VisitTask.TrialReadingCriterionId); - var userinfo = await _userRoleRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).FirstOrDefaultAsync(); + var userinfo = await _userRoleRepository.Where(x => x.Id == medicalReview.MedicalManagerUserId).Include(x => x.IdentityUser).FirstOrDefaultAsync(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == medicalReview.VisitTaskId).Include(x => x.SourceSubjectVisit).Include(x => x.ReadModule).Include(x => x.Subject).FirstNotNullAsync(); @@ -187,6 +189,8 @@ public class UrgentIRRepliedMedicalReviewConsumer( var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync(); + var workLanguage = userinfo.IdentityUser?.UserWorkLanguage; + var userIsEn_US = workLanguage.HasValue ? workLanguage.Value == UserWorkLanguage.US : isEn_US; var messageToSend = new MimeMessage(); @@ -195,14 +199,14 @@ public class UrgentIRRepliedMedicalReviewConsumer( messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId); - var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() { DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, + IsEn_US = userIsEn_US, DictionaryList = new List() @@ -219,7 +223,7 @@ public class UrgentIRRepliedMedicalReviewConsumer( 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), + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), userinfo.FullName, // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} criterion.CriterionName, // 阅片标准 {2} @@ -234,7 +238,7 @@ public class UrgentIRRepliedMedicalReviewConsumer( return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } @@ -293,7 +297,7 @@ public class UrgentMIMRepliedMedicalReviewConsumer( 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 _userRoleRepository.Where(x => x.Id == taskInfo.DoctorUserId).FirstOrDefaultAsync(); + var userinfo = await _userRoleRepository.Where(x => x.Id == taskInfo.DoctorUserId).Include(x => x.IdentityUser).FirstOrDefaultAsync(); @@ -303,6 +307,9 @@ public class UrgentMIMRepliedMedicalReviewConsumer( var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync(); + var workLanguage = userinfo.IdentityUser?.UserWorkLanguage; + var userIsEn_US = workLanguage.HasValue ? workLanguage.Value == UserWorkLanguage.US : isEn_US; + var messageToSend = new MimeMessage(); @@ -311,14 +318,14 @@ public class UrgentMIMRepliedMedicalReviewConsumer( messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == medicalReview.TrialId); - var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() { DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, + IsEn_US = userIsEn_US, DictionaryList = new List() @@ -335,7 +342,7 @@ public class UrgentMIMRepliedMedicalReviewConsumer( 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), + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), userinfo.FullName, // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} subjectCode, // 受试者 {2} @@ -352,7 +359,7 @@ public class UrgentMIMRepliedMedicalReviewConsumer( return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } } @@ -399,7 +406,15 @@ public class UrgentIRApplyedReReadingConsumer( var doctorInfo = await _userRoleRepository.Where(x => x.Id == taskInfo.DoctorUserId).FirstOrDefaultAsync(); - var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == taskInfo.TrialId && x.TrialUser.IsDeleted==false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync(); + var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == taskInfo.TrialId && x.TrialUser.IsDeleted==false).Include(x => x.UserRole).Select(x => x.UserRole) + .Select(x => new SendEmailUserDto() + { + UserTypeEnum = x.UserTypeEnum, + FullName = x.FullName, + UserWorkLanguage = x.IdentityUser.UserWorkLanguage, + EMail = x.EMail, + }) + .ToListAsync(); var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.ProjectManager || x.UserTypeEnum == UserTypeEnum.APM).ToList(); if (context.Message.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed) @@ -412,37 +427,48 @@ public class UrgentIRApplyedReReadingConsumer( var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == visitid).FirstOrDefaultAsync(); + var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == taskInfo.TrialId); - foreach (var userinfo in userinfoList) + var userWorkLanguageList = userinfoList.Select(x => x.UserWorkLanguage).Distinct().ToList(); + + foreach (var workLanguage in userWorkLanguageList) { - var messageToSend = new MimeMessage(); - //发件地址 - messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); - - var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == taskInfo.TrialId); - var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + var langUserinfoList = userinfoList.Where(x => x.UserWorkLanguage == workLanguage).ToList(); + if (!langUserinfoList.Any()) continue; + var userIsEn_US = workLanguage == UserWorkLanguage.US; var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() { - DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, + IsEn_US = userIsEn_US, DictionaryList = new List() - { - new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), }, //任务类型 - new DictionaryDto (){DictionaryCode= "RequestReReadingResult",EnumValue="0", }, //审批结果 都是待审批 - } + { + new DictionaryDto (){DictionaryCode= "ReadingCategory",EnumValue=taskInfo.ReadingCategory.GetEnumInt(), }, //任务类型 + new DictionaryDto (){DictionaryCode= "RequestReReadingResult",EnumValue="0", }, //审批结果 都是待审批 + } }); + var messageToSend = new MimeMessage(); + //发件地址 + messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); + + foreach (var userinfo in langUserinfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } + + var companyName = userIsEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + var userNames = langUserinfoList.Select(x => x.FullName).ToList(); + 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} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + string.Join(',', userNames), // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} subjectCode, // 受试者 {2} taskInfo.TaskBlindName, // 访视 {3} @@ -451,16 +477,12 @@ public class UrgentIRApplyedReReadingConsumer( criterion.CriterionName, // 阅片标准 {6} dictionValue[1], // 审批结果 {7} _systemEmailConfig.SiteUrl // 链接 {8} - - - - ); return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs index 90e99b950..86be11cde 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/SubjectVisitQCAndCheckConsumer.cs @@ -388,7 +388,7 @@ public class CRCRepliedCheckChallengeEventConsumer( private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { - Console.WriteLine("发送(019,020) 【 CRC 回复一致性核查质疑 通知PM】邮件!!!"); + Log.Logger.Warning("发送(019,020) 【 CRC 回复一致性核查质疑 通知PM】邮件!!!"); var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; @@ -407,49 +407,58 @@ public class CRCRepliedCheckChallengeEventConsumer( { - var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync(); + var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false) + .Select(t => new { t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum, t.UserRole.IdentityUser.UserWorkLanguage }).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() + // 遍历语言枚举 在底层判断收件人是否为空,决定是否跳过邮件发送,避免每个邮件场景的地方都重复判断 + foreach (UserWorkLanguage workLanguage in Enum.GetValues()) { - - DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, - DictionaryList = new List() - { - new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态 - - } - }); + //重新设置当前发送邮件的语言 + isEn_US = workLanguage == UserWorkLanguage.US; + + + + var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() + { + + DictionaryRepository = _dictionaryRepository, + IsEn_US = isEn_US, + DictionaryList = new List() + { + new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态 + + } + }); + + var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager) + .Where(t => t.UserWorkLanguage == workLanguage).ToList(); - 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 toUserName = string.Join('、', userinfoList.Select(t => t.FullName)); + foreach (var userinfo in userinfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, 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} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + toUserName, // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} subjectCode, // 受试者 {2} subjectVisit.VisitName, // 访视 {3} @@ -461,10 +470,17 @@ public class CRCRepliedCheckChallengeEventConsumer( }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); + } + + + + + + } } } @@ -490,7 +506,7 @@ public class PMRepliedCheckChallengeEventConsumer( private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { - Console.WriteLine("发送(016,017) 【 PM 一致性核查 通知CRC】邮件!!!"); + Log.Logger.Warning("发送(016,017) 【 PM 一致性核查 通知CRC】邮件!!!"); var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var subjectVisitId = context.Message.SubjectVisitId; @@ -510,11 +526,11 @@ public class PMRepliedCheckChallengeEventConsumer( 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 trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false) + .Select(t => new { t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum, t.UserRole.IdentityUser.UserWorkLanguage }).ToListAsync(); - var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).ToList(); - var craInfo = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).FirstOrDefault(); + var craInfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.CRA).ToList(); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId); @@ -523,28 +539,42 @@ public class PMRepliedCheckChallengeEventConsumer( modalities = subjectVisit.NoneDicomStudyList.Select(t => t.Modality) .Union(subjectVisit.StudyList.Select(k => k.ModalityForEdit)).ToList(); - var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() + + // 遍历语言枚举 在底层判断收件人是否为空,决定是否跳过邮件发送,避免每个邮件场景的地方都重复判断 + foreach (UserWorkLanguage workLanguage in Enum.GetValues()) { + //重新设置当前发送邮件的语言 + isEn_US = workLanguage == UserWorkLanguage.US; - DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, - DictionaryList = new List() - { - new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //核查状态 - - } - }); + var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Where(t => t.UserWorkLanguage == workLanguage).ToList(); - foreach (var userinfo in userinfoList) - { + var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() + { + + DictionaryRepository = _dictionaryRepository, + IsEn_US = isEn_US, + DictionaryList = new List() + { + new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //核查状态 + + } + }); + var messageToSend = new MimeMessage(); + //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); - messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); - if (craInfo != null) + + var toUserName = string.Join('、', userinfoList.Select(t => t.FullName)); + foreach (var userinfo in userinfoList) { - messageToSend.Cc.Add(new MailboxAddress(craInfo.FullName, craInfo.EMail)); + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, userinfo.EMail)); + } + + foreach (var user in craInfoList) + { + messageToSend.Cc.Add(new MailboxAddress(user.FullName, user.EMail)); } var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; @@ -555,8 +585,8 @@ public class PMRepliedCheckChallengeEventConsumer( 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} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + toUserName, // 用户名 {0} trialInfo.ExperimentName, // 项目 {1} subjectCode, // 受试者 {2} @@ -571,10 +601,11 @@ public class PMRepliedCheckChallengeEventConsumer( }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } + } } } @@ -616,49 +647,57 @@ public class CheckStateChangedToAuditEventConsumer( - var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false).Include(x => x.UserRole).Select(x => x.UserRole).ToListAsync(); + var trialUserList = await _trialUseRoleRepository.Where(x => x.TrialId == subjectVisit.TrialId && x.TrialUser.IsDeleted == false) + .Select(t => new { t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum, t.UserRole.IdentityUser.UserWorkLanguage }).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() + // 遍历语言枚举 在底层判断收件人是否为空,决定是否跳过邮件发送,避免每个邮件场景的地方都重复判断 + foreach (UserWorkLanguage workLanguage in Enum.GetValues()) { + //重新设置当前发送邮件的语言 + isEn_US = workLanguage == UserWorkLanguage.US; - DictionaryRepository = _dictionaryRepository, - IsEn_US = isEn_US, - DictionaryList = new List() - { - new DictionaryDto (){DictionaryCode= "CheckState",EnumValue=subjectVisit.CheckState.GetEnumInt(), }, //审核状态 + var userinfoList = trialUserList.Where(x => x.UserTypeEnum == UserTypeEnum.APM || x.UserTypeEnum == UserTypeEnum.ProjectManager) + .Where(t => t.UserWorkLanguage == workLanguage).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(userinfo.FullName, userinfo.EMail)); + + var toUserName = string.Join('、', userinfoList.Select(t => t.FullName)); + + foreach (var userinfo in userinfoList) + { + messageToSend.To.Add(new MailboxAddress(userinfo.FullName, 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} + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + toUserName, // 姓名 {0} trialInfo.ExperimentName, // 项目 {1} subjectCode, // 受试者 {2} subjectVisit.VisitName, // 访视 {3} @@ -670,10 +709,11 @@ public class CheckStateChangedToAuditEventConsumer( }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); } + } } } diff --git a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs index e00fec414..1952a0a69 100644 --- a/IRaCIS.Core.Application/Service/Document/EmailSendService.cs +++ b/IRaCIS.Core.Application/Service/Document/EmailSendService.cs @@ -62,42 +62,51 @@ namespace IRaCIS.Core.Application.Service }).FirstNotNullAsync(); - var isEn_us = _userInfo.IsEn_Us; + //找到当前收件人语言 + var workLanguageList = _trialUserRoleRepository.Where(t => t.TrialId == taskInfo.TrialId && t.UserRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => t.UserRole.IdentityUser.UserWorkLanguage).Distinct().ToList(); - var resultStr = isEn_us ? (result == true ? "Yes" : "No") : (result == true ? "是" : "否"); - - if (isEnrollment == true) + foreach (var workLanguage in workLanguageList) { - Func topicAndHtmlFunc = trialEmailConfig => + //设置工作语言 + var isEn_us = workLanguage == UserWorkLanguage.US; + + var resultStr = isEn_us ? (result == true ? "Yes" : "No") : (result == true ? "是" : "否"); + + + + if (isEnrollment == true) { - var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode); + Func topicAndHtmlFunc = trialEmailConfig => + { + var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode); - var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, - EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr); + var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr); - return (topicStr, htmlBodyStr, isEn_us, null); - }; + return (topicStr, htmlBodyStr, isEn_us, null); + }; - await SendTrialEmailAsync(taskInfo.TrialId, taskInfo.CriterionType, businessScenarioEnum, topicAndHtmlFunc, taskInfo.TrialSiteId); - } - else - { - Func topicAndHtmlFunc = trialEmailConfig => + await SendTrialEmailAsync(taskInfo.TrialId, taskInfo.CriterionType, businessScenarioEnum, topicAndHtmlFunc, taskInfo.TrialSiteId); + } + else { - var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName); + Func topicAndHtmlFunc = trialEmailConfig => + { + var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName); - var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, - EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName, resultStr); + var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName, resultStr); - return (topicStr, htmlBodyStr, isEn_us, null); - }; + return (topicStr, htmlBodyStr, isEn_us, null); + }; + + await SendTrialEmailAsync(taskInfo.TrialId, taskInfo.CriterionType, businessScenarioEnum, topicAndHtmlFunc, taskInfo.TrialSiteId); + } - await SendTrialEmailAsync(taskInfo.TrialId, taskInfo.CriterionType, businessScenarioEnum, topicAndHtmlFunc, taskInfo.TrialSiteId); } - } @@ -133,8 +142,12 @@ namespace IRaCIS.Core.Application.Service var (topicStr, htmlBodyStr, isEn_us, onlyToUserId) = topicAndHtmlFunc(trialEmailConfig); + //设置工作语言 + var workLanguage = isEn_us ? UserWorkLanguage.US : UserWorkLanguage.CN; + + //处理替换公司名 - htmlBodyStr = CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlBodyStr); + htmlBodyStr = CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlBodyStr, workLanguage); sendEmailConfig.TopicDescription = topicStr; @@ -150,10 +163,10 @@ namespace IRaCIS.Core.Application.Service var allUserTypeEnumList = toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList(); - var allUserList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.UserRole.UserTypeEnum)).Select(t => new { t.UserId, t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum }).ToListAsync(); + var allUserList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.UserRole.UserTypeEnum)).Select(t => new { t.UserId, t.UserRole.IdentityUser.EMail, t.UserRole.FullName, t.UserRole.UserTypeEnum, t.UserRole.IdentityUser.UserWorkLanguage }).ToListAsync(); - - var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum)) + //过滤当前语言 + var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum)).Where(t=>t.UserWorkLanguage==workLanguage) .ToList(); //收件人 有CRC CRA , CRC CRA的账户要按照中心发送 @@ -191,11 +204,6 @@ namespace IRaCIS.Core.Application.Service sendEmailConfig.HtmlBodyStr = htmlBodyStr.Replace(EmailNamePlaceholder, string.Join(isEn_us ? ", " : "、", toUserList.Select(t => t.FullName).ToList())); } - if (toUserList.Count == 0) - { - //---没有收件人,无法发送邮件 - throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]); - } if (trialEmailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(trialEmailConfig.FromEmail)) @@ -235,20 +243,7 @@ namespace IRaCIS.Core.Application.Service } } - //邮件附件 这里是原格式发送,不是PDF - //if (trialEmailConfig.AttachCNPath != string.Empty && trialEmailConfig.AttachPath != string.Empty) - //{ - // var phyPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, isEn_us? trialEmailConfig.AttachName: trialEmailConfig.AttachNameCN); - - // //先预先生成了邮件,发送预先生成的邮件 - // sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() - // { - // FileName = $"{attachPrefix}_{Path.GetFileName(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig.AttachNameCN)}", - - // FileStream = File.OpenRead(phyPath), - // }); - //} return (trialEmailConfig, sendEmailConfig); diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 800feaec9..2ddbfada5 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -24,6 +24,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Spire.Doc; using System.Linq.Dynamic.Core; +using System.Runtime; using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service @@ -194,7 +195,15 @@ namespace IRaCIS.Core.Application.Service /// public async Task BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isHandSend, EmailStoreSendMode emailStoreMode, string sendFileRelativePath) { - var isEn_us = _userInfo.IsEn_Us; + + //简单处理,找到该中心的语言 设置工作语言 + + var country = _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => t.Subject.TrialSite.Country).First(); + + var isEn_us = country == StaticData.SiteCountry.US; + + var workLanguage = isEn_us ? UserWorkLanguage.US : UserWorkLanguage.CN; + EmailBusinessScenario businessScenarioEnum = EmailBusinessScenario.None; var enrollReplace = ""; @@ -330,7 +339,7 @@ namespace IRaCIS.Core.Application.Service { var findItem = (await _dictionaryService.GetBasicDataSelect("Trial_Enroll_Report")).Where(t => t.Code == ((int)taskInfo.CriterionType).ToString()).FirstOrDefault(); - enrollReplace = _userInfo.IsEn_Us ? findItem.Value : findItem.ValueCN; + enrollReplace = isEn_us ? findItem.Value : findItem.ValueCN; //如果其他阅片人已经做了,说明发送了入组确认报告,第二个人做完就不发送了 @@ -348,7 +357,7 @@ namespace IRaCIS.Core.Application.Service { bool isEnroll = false; - (answer, isEnroll) = await DealEnrollAnswer(visitTaskId, (Guid)taskInfo.SourceSubjectVisitId, taskInfo.CriterionType, taskInfo.TrialReadingCriterionId); + (answer, isEnroll) = await DealEnrollAnswer(visitTaskId, (Guid)taskInfo.SourceSubjectVisitId, taskInfo.CriterionType, taskInfo.TrialReadingCriterionId, workLanguage); isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, new List() { visitTaskId }, minUserIdList); } @@ -357,7 +366,7 @@ namespace IRaCIS.Core.Application.Service { var findItem = (await _dictionaryService.GetBasicDataSelect("Trial_PD_Report")).Where(t => t.Code == ((int)taskInfo.CriterionType).ToString()).FirstOrDefault(); - PdReplace = _userInfo.IsEn_Us ? findItem.Value : findItem.ValueCN; + PdReplace = isEn_us ? findItem.Value : findItem.ValueCN; //有序 @@ -384,7 +393,7 @@ namespace IRaCIS.Core.Application.Service if (taskList.Count == 2 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit) == 2) { - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType, workLanguage); isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); @@ -394,7 +403,7 @@ namespace IRaCIS.Core.Application.Service else if (taskList.Count == 3 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned) == 3 && taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Count() == 1) { var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First()!.JudgeResultTaskId!.Value; - answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Visit, taskInfo.CriterionType); + answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Visit, taskInfo.CriterionType, workLanguage); isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); @@ -431,7 +440,7 @@ namespace IRaCIS.Core.Application.Service if (taskList.Count == 2 && taskList.Count(t => t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Global) == 2) { - answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType); + answer = await TranslatePdStateAsync(visitTaskId, taskInfo.ReadingCategory, taskInfo.CriterionType, workLanguage); isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Select(t => t.Id).ToList(), minUserIdList); } @@ -440,7 +449,7 @@ namespace IRaCIS.Core.Application.Service { var judgeResultId = taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).First().JudgeResultTaskId!.Value; - answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Global, taskInfo.CriterionType); + answer = await TranslatePdStateAsync(judgeResultId, ReadingCategory.Global, taskInfo.CriterionType, workLanguage); isNeedSend = await DealMedicalReviewTasKGenerateAndIsSendAsync(taskInfo.TrialId, isHandSend, answer, taskList.Where(t => t.ReadingCategory == ReadingCategory.Judge).Select(t => t.Id).ToList(), minUserIdList); @@ -613,7 +622,7 @@ namespace IRaCIS.Core.Application.Service //先预先生成了邮件,发送预先生成的邮件 sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() { - FileName = $"{attachPrefix}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig!.AttachNameCN)}.pdf", + FileName = $"{attachPrefix}_{Path.GetFileNameWithoutExtension(isEn_us ? trialEmailConfig.AttachName : trialEmailConfig!.AttachNameCN)}.pdf", FileStream = File.OpenRead(phyPath), }); @@ -639,7 +648,7 @@ namespace IRaCIS.Core.Application.Service }; - var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, _userInfo.IsEn_Us ? trialEmailConfig.AttachPath : trialEmailConfig.AttachCNPath); + var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, isEn_us ? trialEmailConfig.AttachPath : trialEmailConfig.AttachCNPath); //获取从word 到 PDF的路径 var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.TrialSiteId, taskInfo.SubjectId, true); @@ -729,7 +738,7 @@ namespace IRaCIS.Core.Application.Service pdfMemoryStream.Seek(0, SeekOrigin.Begin); sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig() { - FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? trialEmailConfig.AttachName : trialEmailConfig.AttachNameCN)}.pdf", + FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(isEn_us ? trialEmailConfig.AttachName : trialEmailConfig.AttachNameCN)}.pdf", FileStream = pdfMemoryStream }); @@ -1067,11 +1076,14 @@ namespace IRaCIS.Core.Application.Service /// /// /// + /// /// - private async Task<(string enrollAnswer, bool isEnroll)> DealEnrollAnswer(Guid visitTaskId, Guid subjectVisitId, CriterionType criterionType, Guid trialReadingCriterionId) + private async Task<(string enrollAnswer, bool isEnroll)> DealEnrollAnswer(Guid visitTaskId, Guid subjectVisitId, CriterionType criterionType, Guid trialReadingCriterionId, UserWorkLanguage userWorkLanguage) { - var enrollAnswer = _userInfo.IsEn_Us ? "No" : "否"; + var isEn_us = userWorkLanguage == UserWorkLanguage.US; + + var enrollAnswer = isEn_us ? "No" : "否"; var isEnroll = false; switch (criterionType) @@ -1088,7 +1100,7 @@ namespace IRaCIS.Core.Application.Service if (await _readingTableQuestionAnswerRepository.Where().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion)) { - enrollAnswer = _userInfo.IsEn_Us ? "Yes" : "是"; + enrollAnswer = isEn_us ? "Yes" : "是"; isEnroll = true; } @@ -1102,7 +1114,7 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi bool exists = list.Any(s => int.TryParse(s, out var n) && n >= 1); if (exists) { - enrollAnswer = _userInfo.IsEn_Us ? "Yes" : "是"; + enrollAnswer = isEn_us ? "Yes" : "是"; isEnroll = true; } @@ -1168,9 +1180,10 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi /// 任务类型 /// 标准类型 /// 是否是全局产生(区分裁判任务) + /// /// /// - private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType, bool? IsGlobalGenerate = null) + private async Task TranslatePdStateAsync(Guid visitTaskId, ReadingCategory readingCategory, CriterionType criterionType, UserWorkLanguage userWorkLanguage, bool? IsGlobalGenerate = null ) { var answer = string.Empty; @@ -1361,6 +1374,7 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]); } + var isEn_us = userWorkLanguage == UserWorkLanguage.US; switch (criterionType) { @@ -1372,11 +1386,11 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi if (answer == OverallAssessment.PD.GetEnumInt()) { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; + answer = isEn_us ? "Yes" : "是"; } else { - answer = _userInfo.IsEn_Us ? "No" : "否"; + answer = isEn_us ? "No" : "否"; } break; @@ -1384,11 +1398,11 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi if (answer == OverallAssessment.iCPD.GetEnumInt()) { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; + answer = isEn_us ? "Yes" : "是"; } else { - answer = _userInfo.IsEn_Us ? "No" : "否"; + answer = isEn_us ? "No" : "否"; } break; @@ -1396,11 +1410,11 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi if (answer == CTMRIOverallAssessment.PD.GetEnumInt()) { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; + answer = isEn_us ? "Yes" : "是"; } else { - answer = _userInfo.IsEn_Us ? "No" : "否"; + answer = isEn_us ? "No" : "否"; } break; @@ -1408,11 +1422,11 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi if (answer == ImagingOverallAssessment_Lugano.PMDPD.GetEnumInt()) { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; + answer = isEn_us ? "Yes" : "是"; } else { - answer = _userInfo.IsEn_Us ? "No" : "否"; + answer = isEn_us ? "No" : "否"; } break; @@ -1423,11 +1437,11 @@ x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.LesionNumber && x.Readi if (answer == VisitTumorEvaluation.PD.GetEnumInt()) { - answer = _userInfo.IsEn_Us ? "Yes" : "是"; + answer = isEn_us ? "Yes" : "是"; } else { - answer = _userInfo.IsEn_Us ? "No" : "否"; + answer = isEn_us ? "No" : "否"; } break; diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs index de096f6fb..f43ae6e89 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs @@ -1174,6 +1174,7 @@ namespace IRaCIS.Core.Application.Service throw new BusinessValidationFailedException(_localizer["ReadModule_TumorExists"]); } + if (await _visitTaskRepository.AnyAsync(x => readModuleId == x.SouceReadModuleId && (x.TaskState==TaskState.Effect||x.ReadingTaskState==ReadingTaskState.HaveSigned))) { //---当前阅片已生成任务,操作失败。 @@ -1183,7 +1184,7 @@ namespace IRaCIS.Core.Application.Service // 如果生成了 访视级别的阅片期裁判 不让删除 if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading) { - if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge)) + if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge && (x.TaskState == TaskState.Effect || x.ReadingTaskState == ReadingTaskState.HaveSigned))) { //---当前阅片已生成裁判任务,操作失败。 throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]);