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,
}