From 85261bc3cfda009f699634f086f86fc895be22d9 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Wed, 13 May 2026 15:20:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E7=BB=84=E5=92=8CPD=20=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helper/Email/SendEmailHelper.cs | 7 +- .../IRaCIS.Core.Application.xml | 6 +- .../Service/Document/EmailSendService.cs | 83 +++++++++---------- .../Document/TrialEmailNoticeConfigService.cs | 66 +++++++++------ 4 files changed, 87 insertions(+), 75 deletions(-) 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/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;