From 9bfdb2f06ad6d55a753a0a414e4b91c96340808f Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Fri, 3 Jul 2026 11:05:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=94=E6=A1=88=E5=BC=82=E5=B8=B8=20?= =?UTF-8?q?=E4=B8=8E=E8=A3=81=E5=88=A4=E5=BC=82=E5=B8=B8=20=E5=8F=91?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E7=BB=99PM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 15 ++- .../ReadingImageTaskService.cs | 17 ++- .../ReadingJudgeTaskService.cs | 124 +++++++++++++++++- .../Common/EmailScenarioEnum.cs | 10 ++ 4 files changed, 158 insertions(+), 8 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index fb63be48d..749376002 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -14743,7 +14743,7 @@ - + IR影像阅片 @@ -15206,6 +15206,13 @@ + + + 发送邮件通知 + + + + 计算返回的结果 为True表示不相等 @@ -17530,17 +17537,17 @@ - 质疑 + ���� - 一致性核查 + һ���Ժ˲� - 复制 + ���� diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index dae68cf6c..d2a04e586 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -51,6 +51,9 @@ namespace IRaCIS.Core.Application.Service IRepository _readModuleRepository, IRepository _dicomInstanceRepository, IRepository _organInfoRepository, + IRepository _trialUserRoleRepository, + IRepository _emailNoticeUserTypeRepository, + IRepository _emailNoticeConfigrepository, IRepository _organTrialInfoRepository, IRepository _trialDocumentRepository, ILuganoCalculateService _luganoCalculateService, @@ -73,8 +76,10 @@ namespace IRaCIS.Core.Application.Service IConfiguration _config, IDownloadAndUploadService _downloadAndUploadService, ITrialEmailNoticeConfigService _trialEmailNoticeConfigService, + IOptionsMonitor systemEmailConfig, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IReadingImageTaskService { + private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; /// /// 获取报告图表数据 @@ -3437,7 +3442,17 @@ namespace IRaCIS.Core.Application.Service if (hasDuplicate) { - _ = SendWeComNotifier(inDto.VisitTaskId, "阅片问题答案有重复"); + try + { + _ = SendWeComNotifier(inDto.VisitTaskId, "阅片问题答案有重复"); + _ = SendAbnormalEmail(inDto.VisitTaskId, EmailBusinessScenario.RepeatedVisitAnswers); + } + catch (Exception) + { + + + } + throw new BusinessValidationFailedException(_localizer["ReadingImage_VisitAnswerRepeated"]); } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index b2ab335a5..43bbbc56c 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -1,6 +1,9 @@ using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper.OtherTool; +using IRaCIS.Core.Application.MassTransit.Consumer; +using IRaCIS.Core.Application.MassTransit.Consumer.Dto; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; @@ -9,6 +12,7 @@ using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; +using MimeKit; using Newtonsoft.Json; namespace IRaCIS.Core.Application.Service @@ -973,8 +977,101 @@ namespace IRaCIS.Core.Application.Service } } + /// + /// 发送邮件通知 + /// + /// + /// + public async Task SendAbnormalEmail(Guid visiTaskId, EmailBusinessScenario type) + { + var emailNotice = _emailNoticeConfigrepository.Where(x => x.BusinessScenarioEnum == type).FirstOrDefault(); + + var taskinfo= _visitTaskRepository.Where(x => x.Id == visiTaskId).Include(x => x.Trial).Include(x => x.Subject).Include(x => x.SourceSubjectVisit).FirstOrDefault(); + if (taskinfo == null) + { + return; + } + + // 根据不同场景获取不同角色的用户 + var trialUser = _trialUserRoleRepository.Where(x => x.TrialId == taskinfo.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, + }) + .ToList(); + + // 根据场景确定收件人 + List toUserList = new List(); + List ccUserList = new List(); + + var emailNoticeUserList = _emailNoticeUserTypeRepository.Where(x => x.EmailNoticeConfigId == emailNotice.Id).ToList(); + + var toList = emailNoticeUserList.Where(x => x.EmailUserType == EmailUserType.To).Select(x => x.UserType).ToList(); + + toUserList = trialUser.Where(x => toList.Contains(x.UserTypeEnum)).ToList(); + + var ccList = emailNoticeUserList.Where(x => x.EmailUserType == EmailUserType.Copy).Select(x => x.UserType).ToList(); + + ccUserList = trialUser.Where(x => ccList.Contains(x.UserTypeEnum)).ToList(); + + + // 如果没有收件人,则不发送邮件 + if (toUserList.Count == 0) + { + return; + } + + 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(taskinfo.Trial.EmailFromName, taskinfo.Trial.EmailFromEmail)); + + 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 topicStr = string.Format(input.topicStr, taskinfo.Trial.ResearchProgramNo, taskinfo.Subject.Code,taskinfo.SourceSubjectVisit.VisitName); + var htmlBodyStr = string.Format( + CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr, workLanguage), + string.Join(',', userNames), // 用户名 {0} + taskinfo.Trial.ExperimentName, // 项目 {1} + taskinfo.Subject.Code, // 受试者编号 {2} + taskinfo.SourceSubjectVisit.VisitName, // 访视名称 {3} + taskinfo.TaskName, // 任务名称 {4} + taskinfo.Id.ToString(), // 任务Id {5} + _systemEmailConfig.SiteUrl // 链接 {6} + ); + + return (topicStr, htmlBodyStr); + }; + + await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(emailNotice, messageToSend, emailConfigFunc, workLanguage); + + await SendEmailHelper.SendTrialEmailAsync(messageToSend, taskinfo.Trial); + } + } + /// /// 计算返回的结果 为True表示不相等 /// @@ -988,13 +1085,34 @@ namespace IRaCIS.Core.Application.Service // 裁判问题可以不必填 if(item.TaskAnswerList.Count()==0) { - _ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案等于0"); + + try + { + _ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案等于0"); + _ = SendAbnormalEmail(visiTaskId, EmailBusinessScenario.JudgeExceptio); + } + catch (Exception) + { + + + } break; } else if (item.TaskAnswerList.Count() != 2) { - // 发送微信通知 - _ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案不等于2"); + + + try + { + // 发送微信通知 + _ = SendWeComNotifier(visiTaskId, "两个阅片任务的答案不等于2"); + _ = SendAbnormalEmail(visiTaskId, EmailBusinessScenario.JudgeExceptio); + } + catch (Exception) + { + + + } break; } else if (noteEqual) diff --git a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs index 857c1c5c1..537718959 100644 --- a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs +++ b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs @@ -328,6 +328,16 @@ namespace IRaCIS.Core.Domain.Share SiteSurvey_CheckUser = 74, SiteSurvey_UpdateUser = 75, + + /// + /// 访视答案重复 + /// + RepeatedVisitAnswers = 76, + + /// + /// 裁判答案验证异常 + /// + JudgeExceptio = 77, }