From db73a841b259be2ff087baeed575671b8991b2d1 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 13 May 2026 13:40:43 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=98=85=E7=89=87=E6=9C=9F=E6=93=8D=E4=BD=9C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Reading/ReadingPeriod/ReadModuleService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs index f6d28a4d5..f43ae6e89 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs @@ -1184,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"]); From 0cb36465541bed0189d3bb2d43868e58dfd6655f Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 13 May 2026 14:25:24 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E8=8B=B1=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Consumer/Dto/SendImageReuploadEmailDto.cs | 11 +++ .../MassTransit/Consumer/ImageConsumer.cs | 80 +++++++++++++------ 2 files changed, 66 insertions(+), 25 deletions(-) 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..f0b3079bc 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,7 +474,9 @@ 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) + + .ToListAsync(); // 根据场景确定收件人 List toUserList = new List(); From 311359f6b81f4ad38a39abbf9ecc6a3122a4b9a0 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 13 May 2026 14:38:13 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MassTransit/Consumer/ImageConsumer.cs | 31 ++++-- .../Consumer/ReadingRelationEmailConsumer.cs | 100 +++++++++++------- 2 files changed, 84 insertions(+), 47 deletions(-) diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs index f0b3079bc..832e6b638 100644 --- a/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Consumer/ImageConsumer.cs @@ -475,12 +475,18 @@ public class ImageConsumer( // 根据不同场景获取不同角色的用户 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(); @@ -499,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) @@ -512,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} - 阅片人筛选不涉及访视 @@ -530,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); }