From 9f32b92af3d60c37a0be547d127e6fd23d415183 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 26 Jul 2024 15:26:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E4=B8=8A=E7=BA=BF=E5=88=B0?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 2 +- .../Common/DTO/EmailNoticeConfigViewModel.cs | 2 + .../Service/Common/MailService.cs | 545 ++++++++---------- .../SiteSurvey/TrialSiteSurveyService.cs | 42 +- .../Common/EmailScenarioEnum.cs | 43 +- 5 files changed, 289 insertions(+), 345 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 1525d317b..add5bef1a 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -13403,7 +13403,7 @@ - 发送验证码 + Reviewer简历录入 发送验证码 diff --git a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs index 211be32dc..edb1cfc5a 100644 --- a/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs +++ b/IRaCIS.Core.Application/Service/Common/DTO/EmailNoticeConfigViewModel.cs @@ -128,6 +128,8 @@ namespace IRaCIS.Core.Application.Contracts public List ToUserTypeList { get; set; } public List CopyUserTypeList { get; set; } + public bool IsSystemLevel { get; set; } = false; + } diff --git a/IRaCIS.Core.Application/Service/Common/MailService.cs b/IRaCIS.Core.Application/Service/Common/MailService.cs index 588761284..7850b7e38 100644 --- a/IRaCIS.Core.Application/Service/Common/MailService.cs +++ b/IRaCIS.Core.Application/Service/Common/MailService.cs @@ -9,6 +9,15 @@ using IRaCIS.Application.Contracts; using Microsoft.Extensions.Options; using Medallion.Threading; using System.Text.RegularExpressions; +using IRaCIS.Core.Infrastructure; +using DocumentFormat.OpenXml.Spreadsheet; +using IRaCIS.Core.Application.Service.Reading.Dto; +using NPOI.SS.Formula.Functions; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using IRaCIS.Core.Domain.Models; +using DocumentFormat.OpenXml.Office2013.Excel; +using IRaCIS.Core.Application.Contracts; +using DocumentFormat.OpenXml.Vml; namespace IRaCIS.Application.Services { @@ -19,7 +28,7 @@ namespace IRaCIS.Application.Services Task SendEmailVerification(string emailAddress, int verificationCode); - Task SiteSurveyRejectEmail(MimeMessage messageToSend); + Task SiteSurveyRejectEmail(MimeMessage messageToSend, TrialSiteSurvey trialSiteSurvey, string routeUrl, User? user = null); Task SenMFAVerifyEmail(Guid userId, string userName, string emailAddress, int verificationCode, UserMFAType mfaType = UserMFAType.Login); @@ -40,7 +49,7 @@ namespace IRaCIS.Application.Services } - public class MailVerificationService : BaseService, IMailVerificationService + public class MailVerificationService : BaseService, IMailVerificationService { private readonly IRepository _verificationCodeRepository; @@ -59,15 +68,16 @@ namespace IRaCIS.Application.Services private readonly SystemEmailSendConfig _systemEmailConfig; + private readonly IRepository _emailNoticeConfigrepository; - - public MailVerificationService(IRepository verificationCodeRepository, + public MailVerificationService(IRepository verificationCodeRepository, IRepository systemBasicDatarepository, IRepository userRepository, ITokenService tokenService, IRepository trialRepository, IRepository userTypeRepository, IRepository doctorTypeRepository, + IRepository emailNoticeConfigRepository, IOptionsMonitor systemEmailConfig, IDistributedLockProvider distributedLockProvider) { _systemEmailConfig = systemEmailConfig.CurrentValue; @@ -80,16 +90,73 @@ namespace IRaCIS.Application.Services _userTypeRepository = userTypeRepository; _doctorTypeRepository = doctorTypeRepository; _distributedLockProvider = distributedLockProvider; - + _emailNoticeConfigrepository = emailNoticeConfigRepository; } + private async Task GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario scenario, MimeMessage messageToSend, + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailFunc) + { + var configInfo = await _emailNoticeConfigrepository.Where(t => t.BusinessScenarioEnum == scenario).FirstOrDefaultAsync(); + + if (configInfo == null) + { + throw new BusinessValidationFailedException("系统未找到当前场景邮件配置信息,请联系运维人员核查"); + } + + + var (topicStr, htmlBodyStr) = _userInfo.IsEn_Us ? (configInfo.EmailTopic, configInfo.EmailHtmlContent) : (configInfo.EmailTopicCN, configInfo.EmailHtmlContentCN); + + try + { + //每个场景修改主题 和body的逻辑不一样 + (topicStr, htmlBodyStr) = emailFunc((topicStr, htmlBodyStr)); + } + catch (Exception ex) + { + + throw new BusinessValidationFailedException("邮件模板内容有误,填充内容出现问题,请联系运维人员核查"); + } + + + messageToSend.Subject = topicStr; + + var builder = new BodyBuilder(); + + builder.HtmlBody = htmlBodyStr; + + messageToSend.Body = builder.ToMessageBody(); + + return messageToSend; + } + + + private EventHandler GetEmailSuccessHandle(Guid userId, int verificationCode, string email = "") + { + EventHandler sucessHandle = (sender, args) => + { + // args.Response + var code = verificationCode.ToString(); + _ = _verificationCodeRepository.AddAsync(new VerificationCode() + { + CodeType = VerifyType.Email, + HasSend = true, + Code = code, + UserId = userId, + EmailOrPhone = email, + ExpirationTime = DateTime.Now.AddMinutes(3) + }).Result; + _ = _verificationCodeRepository.SaveChangesAsync().Result; + + }; + + return sucessHandle; + } private string ReplaceCompanyName(string needDealtxt) { - var str= needDealtxt.Replace("{company}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyName : _systemEmailConfig.CompanyNameCN) + var str = needDealtxt.Replace("{company}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyName : _systemEmailConfig.CompanyNameCN) .Replace("{company abbreviation}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN); - return str; } @@ -101,120 +168,68 @@ namespace IRaCIS.Application.Services messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 messageToSend.To.Add(new MailboxAddress(userName, emailAddress)); - //主题 - //---[来自{0}] 关于MFA邮箱验证的提醒 - messageToSend.Subject = _localizer[mfaType == UserMFAType.Login? "Mail_EmailMFALoginTopic":"Mail_EmailMFAUnlockTopic", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + //主题---[来自{0}] 关于MFA邮箱验证的提醒 - var builder = new BodyBuilder(); + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "UserOptCommon.html"; - + (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html"); - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); - - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), userName, - _localizer[mfaType == UserMFAType.Login ? "Mail_EmailMFALoginEmail": "Mail_EmailMFAUnlockEmail"], + _localizer[mfaType == UserMFAType.Login ? "Mail_EmailMFALoginEmail" : "Mail_EmailMFAUnlockEmail"], verificationCode ); - } - - - messageToSend.Body = builder.ToMessageBody(); - - - - EventHandler sucessHandle = (sender, args) => - { - // args.Response - var code = verificationCode.ToString(); - _ = _verificationCodeRepository.AddAsync(new VerificationCode() - { - CodeType = 0, - HasSend = true, - Code = code, - UserId = userId, - ExpirationTime = DateTime.Now.AddMinutes(3) - }).Result; - _ = _verificationCodeRepository.SaveChangesAsync().Result; + return (topicStr, htmlBodyStr); }; + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(mfaType == UserMFAType.Login ? EmailBusinessScenario.MFALogin : EmailBusinessScenario.MFAUnlock, messageToSend, emailConfigFunc); + + + var sucessHandle = GetEmailSuccessHandle(userId, verificationCode); + + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle); } - //重置邮箱 + //用户重置邮箱 public async Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode) { - - var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 messageToSend.To.Add(new MailboxAddress(userName, emailAddress)); //主题 - //---[来自展影IRC] 关于重置邮箱的提醒 - messageToSend.Subject = _localizer["Mail_EmailResetReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + //---[来自展影IRC] 关于重置邮箱的提醒 - var builder = new BodyBuilder(); + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "UserOptCommon.html"; - +(_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html"); - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); - - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), userName, - //---尊敬的 - //_localizer["Mail_Dear", userName], - //---您正在进行邮箱重置操作 + //---您正在进行邮箱重置操作 _localizer["Mail_ResettingEmail"], verificationCode ); - } + + return (topicStr, htmlBodyStr); + }; - messageToSend.Body = builder.ToMessageBody(); + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.UserResetEmail, messageToSend, emailConfigFunc); - - EventHandler sucessHandle = (sender, args) => - { - // args.Response - var code = verificationCode.ToString(); - _ = _verificationCodeRepository.AddAsync(new VerificationCode() - { - CodeType = 0, - HasSend = true, - Code = code, - UserId = userId, - ExpirationTime = DateTime.Now.AddMinutes(3) - }).Result; - _ = _verificationCodeRepository.SaveChangesAsync().Result; - - }; - + var sucessHandle = GetEmailSuccessHandle(userId, verificationCode); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle); @@ -231,61 +246,37 @@ namespace IRaCIS.Application.Services messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); - //主题 - //---[来自展影IRC] 关于重置密码的提醒 - messageToSend.Subject = _localizer["Mail_IRCResettingPassword", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - var builder = new BodyBuilder(); - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "UserOptCommon.html"; - + (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html"); - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), - "", + "", //---您正在进行邮箱重置密码操作 _localizer["Mail_ResettingPassword"], verificationCode ); - } + + return (topicStr, htmlBodyStr); + }; + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.UnloginUseEmailResetPassword, messageToSend, emailConfigFunc); - messageToSend.Body = builder.ToMessageBody(); - - - EventHandler sucessHandle = (sender, args) => - { - var code = verificationCode.ToString(); - _ = _verificationCodeRepository.AddAsync(new VerificationCode() - { - CodeType = Core.Domain.Share.VerifyType.Email, - HasSend = true, - Code = code, - UserId = Guid.Empty,//此时不知道用户 - EmailOrPhone = emailAddress, - ExpirationTime = DateTime.Now.AddMinutes(3) - }).Result; - _ = _verificationCodeRepository.SaveChangesAsync().Result; - }; - + ////此时不知道用户 + var sucessHandle = GetEmailSuccessHandle(Guid.Empty, verificationCode); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle); } /// - /// 发送验证码 + /// Reviewer简历录入 发送验证码 /// /// /// @@ -293,61 +284,37 @@ namespace IRaCIS.Application.Services public async Task SendEmailVerification(string emailAddress, int verificationCode) { - var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 - //---[来自展影IRC]的提醒 - messageToSend.Subject = _localizer["Mail_ImagingIRCReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + //---[来自展影IRC]的提醒 + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - - - var builder = new BodyBuilder(); - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - + (_userInfo.IsEn_Us ? "UserOptCommon_US.html": "UserOptCommon.html" ); - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), - "Sir or Madam", + "Sir or Madam", //---您正在参与展影医疗IRC项目 - _localizer["Mail_IRCProject", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN], + _localizer["Mail_IRCProject", companyName], verificationCode ); - } - messageToSend.Body = builder.ToMessageBody(); - - - - EventHandler sucessHandle = (sender, args) => - { - // args.Response - var code = verificationCode.ToString(); - _ = _verificationCodeRepository.AddAsync(new VerificationCode() - { - CodeType = VerifyType.Email, - HasSend = true, - Code = code, - UserId = Guid.Empty,//此时不知道用户 - EmailOrPhone = emailAddress, - ExpirationTime = DateTime.Now.AddMinutes(3) - }).Result; - _ = _verificationCodeRepository.SaveChangesAsync().Result; + return (topicStr, htmlBodyStr); }; + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.UnloginUseEmailResetPassword, messageToSend, emailConfigFunc); + + //此时不知道用户 + var sucessHandle = GetEmailSuccessHandle(Guid.Empty, verificationCode, emailAddress); + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle); @@ -359,7 +326,6 @@ namespace IRaCIS.Application.Services public async Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode) { - var messageToSend = new MimeMessage(); //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); @@ -367,67 +333,74 @@ namespace IRaCIS.Application.Services messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress)); //主题 //$"[来自展影IRC] [{researchProgramNo}] 关于中心调研的提醒"; - messageToSend.Subject = _localizer["Mail_ProjectParticipationReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN, researchProgramNo]; + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - - - var builder = new BodyBuilder(); - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "UserOptCommon.html"; - + (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html"); - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName, researchProgramNo); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), "Sir or Madam", //---您正在参与展影医疗IRC项目中心调研工作 - _localizer["Mail_CenterResearchReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN], + _localizer["Mail_CenterResearchReminder", companyName], verificationCode ); - } - messageToSend.Body = builder.ToMessageBody(); - - - - EventHandler sucessHandle = (sender, args) => - { - // args.Response - var code = verificationCode.ToString(); - _ = _verificationCodeRepository.AddAsync(new VerificationCode() - { - CodeType = VerifyType.Email, - HasSend = true, - Code = code, - UserId = Guid.Empty,//此时不知道用户 - EmailOrPhone = emailAddress, - ExpirationTime = DateTime.Now.AddMinutes(3) - }).Result; - _ = _verificationCodeRepository.SaveChangesAsync().Result; + return (topicStr, htmlBodyStr); }; + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SiteSurveyLogin, messageToSend, emailConfigFunc); - await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig,sucessHandle); + //此时不知道用户 + var sucessHandle = GetEmailSuccessHandle(Guid.Empty, verificationCode); + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle); + } - public async Task SiteSurveyRejectEmail(MimeMessage messageToSend) + public async Task SiteSurveyRejectEmail(MimeMessage messageToSend, TrialSiteSurvey trialSiteSurvey, string routeUrl, User? user) { - + //发件地址 messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); + var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == trialSiteSurvey.TrialId); + + var siteInfo = await _repository.FirstOrDefaultAsync(t => t.TrialId == trialSiteSurvey.TrialId && t.Id == trialSiteSurvey.TrialSiteId, true); + + + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => + { + var topicStr = string.Format(input.topicStr, companyName, trialInfo.ResearchProgramNo); + + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), + + (user == null ? trialSiteSurvey.UserName : user.LastName + "/ " + user.FirstName), + trialInfo.TrialCode, + trialInfo.ResearchProgramNo, + trialInfo.ExperimentName, + siteInfo.TrialSiteCode, + siteInfo.TrialSiteAliasName, + trialSiteSurvey.LatestBackReason, + routeUrl, + (trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit ? "inline - block" : "none") + ); + + return (topicStr, htmlBodyStr); + }; + + + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SiteSurveyReject, messageToSend, emailConfigFunc); + + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); @@ -446,49 +419,42 @@ namespace IRaCIS.Application.Services //收件地址 messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 - //---[来自展影IRC] 关于创建账户的提醒 - messageToSend.Subject = _localizer["Mail_AccountCreationReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + //---[来自展影IRC] 关于创建账户的提醒 - - var builder = new BodyBuilder(); - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "AdminAddUser.html"; - + (_userInfo.IsEn_Us ? "AdminAddUser_US.html" : "AdminAddUser.html"); - var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map(sysUserInfo))); await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); - routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us?"en":"zh") + "&access_token=" + token; + routeUrl = routeUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), - sysUserInfo.FullName, + sysUserInfo.FullName, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, redirectUrl ); - } + + return (topicStr, htmlBodyStr); + }; - - messageToSend.Body = builder.ToMessageBody(); + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SysCreateUser, messageToSend, emailConfigFunc); - await SendEmailHelper.SendEmailAsync(messageToSend,_systemEmailConfig); + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); } //管理员重置密码发送邮件 @@ -502,38 +468,27 @@ namespace IRaCIS.Application.Services //收件地址 messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 - //---[来自展影IRC] 关于重置账户密码的提醒 - messageToSend.Subject = _localizer["Mail_AccountPasswordResetReminder", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN]; + //---[来自展影IRC] 关于重置账户密码的提醒 + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; - - var builder = new BodyBuilder(); - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - //+ "AdminResetUser.html"; - + (_userInfo.IsEn_Us ? "AdminResetUser_US.html" : "AdminResetUser.html"); - - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), - sysUserInfo.FullName, + sysUserInfo.FullName, sysUserInfo.UserName, sysUserInfo.UserTypeRole.UserTypeShortName, pwdNotMd5 ); - } + + return (topicStr, htmlBodyStr); + }; - - messageToSend.Body = builder.ToMessageBody(); - + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(EmailBusinessScenario.SysResetPassword, messageToSend, emailConfigFunc); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); } @@ -553,11 +508,6 @@ namespace IRaCIS.Application.Services messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail)); //主题 // $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信"; - messageToSend.Subject = _localizer["Mail_InvitationEmail", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN, trialInfo.ResearchProgramNo]; - - - - var builder = new BodyBuilder(); var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map(sysUserInfo))); @@ -567,24 +517,21 @@ namespace IRaCIS.Application.Services await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); } + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - + (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialUserFirstJoin_US.html" : "TrialUserFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialUserExistJoin_US.html" : "TrialUserExistJoin.html")); + var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; + + + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName, trialInfo.ResearchProgramNo); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - - var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; - - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), sysUserInfo.FullName, trialInfo.ExperimentName, trialInfo.ResearchProgramNo, @@ -593,11 +540,15 @@ namespace IRaCIS.Application.Services sysUserInfo.UserTypeRole.UserTypeShortName, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); - } - messageToSend.Body = builder.ToMessageBody(); + return (topicStr, htmlBodyStr); + }; - await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig,null); + + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.SiteUseOrExternalUserFirstrJoinTrial : EmailBusinessScenario.SiteUserOrExternalUserExistJoinTrial, messageToSend, emailConfigFunc); + + + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); } @@ -617,10 +568,6 @@ namespace IRaCIS.Application.Services messageToSend.To.Add(new MailboxAddress(String.Empty, sysUserInfo.EMail)); //主题 // $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信"; - messageToSend.Subject = _localizer["Mail_InvitationEmail", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN,trialInfo.ResearchProgramNo]; - - - var builder = new BodyBuilder(); @@ -630,23 +577,21 @@ namespace IRaCIS.Application.Services await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); } - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - + (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialUserFirstJoin_US.html" : "TrialUserFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialUserExistJoin_US.html" : "TrialUserExistJoin.html") ); + var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + + var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; + + + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName, trialInfo.ResearchProgramNo); - var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + sysUserInfo.UserTypeRole.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; - - var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; - - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), sysUserInfo.FullName, trialInfo.ExperimentName, trialInfo.ResearchProgramNo, @@ -655,11 +600,12 @@ namespace IRaCIS.Application.Services sysUserInfo.UserTypeRole.UserTypeShortName, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); - } + + return (topicStr, htmlBodyStr); + }; - - messageToSend.Body = builder.ToMessageBody(); + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.SiteUseOrExternalUserFirstrJoinTrial : EmailBusinessScenario.SiteUserOrExternalUserExistJoinTrial, messageToSend, emailConfigFunc); await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, null); @@ -730,13 +676,8 @@ namespace IRaCIS.Application.Services messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail)); //收件地址 messageToSend.To.Add(new MailboxAddress(doctor.FullName, doctor.EMail)); - //主题 - // $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信"; - messageToSend.Subject = _localizer["Mail_InvitationEmail", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN, trialInfo.ResearchProgramNo]; - var builder = new BodyBuilder(); - var basicInfo = IRaCISClaims.Create(_mapper.Map(sysUserInfo)); @@ -751,25 +692,25 @@ namespace IRaCIS.Application.Services await _userRepository.BatchUpdateNoTrackingAsync(t => t.Id == sysUserInfo.Id, u => new User() { EmailToken = token }); } + var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - + (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialDoctorFirstJoin_US.html" : "TrialDoctorFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialDoctorExistJoin_US.html" : "TrialDoctorExistJoin.html") ); + var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) + var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; + + //主题 + // $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信"; + + + var companyName = _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN; + + Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => { - var templateInfo = SourceReader.ReadToEnd(); + var topicStr = string.Format(input.topicStr, companyName, trialInfo.ResearchProgramNo); - var routeUrl = rootUrl + "?UserId=" + sysUserInfo.Id + "&Email=" + sysUserInfo.EMail + "&UserName=" + sysUserInfo.UserName + "&UserType=" + userType.UserTypeShortName + "&lang=" + (_userInfo.IsEn_Us ? "en" : "zh") + "&access_token=" + token; + var htmlBodyStr = string.Format(ReplaceCompanyName(input.htmlBodyStr), - var domain = baseUrl.Substring(0, baseUrl.IndexOf("/login")); - - var redirectUrl = $"{domain}/api/User/UserRedirect?url={System.Web.HttpUtility.UrlEncode(routeUrl)}"; - - builder.HtmlBody = string.Format(ReplaceCompanyName(templateInfo), - sysUserInfo.FullName, + sysUserInfo.FullName, trialInfo.ExperimentName, trialInfo.ResearchProgramNo, trialInfo.TrialCode, @@ -777,9 +718,13 @@ namespace IRaCIS.Application.Services userType.UserTypeShortName, sysUserInfo.IsFirstAdd ? redirectUrl : baseUrl ); - } - messageToSend.Body = builder.ToMessageBody(); + return (topicStr, htmlBodyStr); + }; + + + messageToSend = await GetEmailSubejctAndHtmlInfoAndBuildAsync(sysUserInfo.IsFirstAdd ? EmailBusinessScenario.DoctorUserFirstJoinTrial : EmailBusinessScenario.DoctorUserExistJoinTrial, messageToSend, emailConfigFunc); + await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, null); diff --git a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs index 957bdba54..9ff013fac 100644 --- a/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs +++ b/IRaCIS.Core.Application/Service/SiteSurvey/TrialSiteSurveyService.cs @@ -611,48 +611,8 @@ namespace IRaCIS.Core.Application.Contracts } - var builder = new BodyBuilder(); - var trialInfo = await _repository.FirstOrDefaultAsync(t => t.Id == trialSiteSubmitBackCommand.TrialId); - - var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialSiteSubmitBackCommand.TrialId && t.Id == survey.TrialSiteId, true); - - - //主题 - // $"[来自展影IRC] [{trialInfo.ResearchProgramNo}] 关于中心调研审批的提醒"; - messageToSend.Subject = _localizer["TrialSiteSurvey_IRCNotification", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN, trialInfo.ResearchProgramNo]; - - var pathToFile = _hostEnvironment.WebRootPath - + Path.DirectorySeparatorChar.ToString() - + "EmailTemplate" - + Path.DirectorySeparatorChar.ToString() - + (_userInfo.IsEn_Us ? "TrialSiteSurveyReject_US.html" : "TrialSiteSurveyReject.html"); - - - using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile)) - { - var templateInfo = SourceReader.ReadToEnd(); - - templateInfo = templateInfo.Replace("{company}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyName : _systemEmailConfig.CompanyNameCN) - .Replace("{company abbreviation}", _userInfo.IsEn_Us ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN); - - builder.HtmlBody = string.Format(templateInfo, - (user == null ? survey.UserName : user.LastName + "/ " + user.FirstName), - trialInfo.TrialCode, - trialInfo.ResearchProgramNo, - trialInfo.ExperimentName, - siteInfo.TrialSiteCode, - siteInfo.TrialSiteAliasName, - survey.LatestBackReason, - trialSiteSubmitBackCommand.RouteUrl, - (survey.State == TrialSiteSurveyEnum.ToSubmit ? "inline - block" : "none") - - ); - } - messageToSend.Body = builder.ToMessageBody(); - - - await _IMailVerificationService.SiteSurveyRejectEmail(messageToSend); + await _IMailVerificationService.SiteSurveyRejectEmail(messageToSend, survey , trialSiteSubmitBackCommand.RouteUrl, user); await _trialSiteSurveyRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs index 1d4ecdf1a..ee22efd38 100644 --- a/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs +++ b/IRaCIS.Core.Domain.Share/Common/EmailScenarioEnum.cs @@ -37,19 +37,56 @@ namespace IRaCIS.Core.Domain.Share public enum EmailBusinessScenario { None=-1, + EnrollConfirmed = 1, PDConfirmed = 2, - Trial=3, + //Trial=3, - Reviewer=4, + //Reviewer=4, QCTask = 5, QCQuestion = 6, - ImageQuestion = 7 + ImageQuestion = 7, + + + + MFALogin = 10, + + MFAUnlock = 11, + + + //医生简历信息录入入口登录 + ReviewerLogin=12, + + + + UserResetEmail = 13, + + + SiteSurveyLogin = 14, + + SiteUseOrExternalUserFirstrJoinTrial = 15, + + SiteUserOrExternalUserExistJoinTrial = 16, + + SiteSurveyReject=17, + + DoctorUserFirstJoinTrial=19, + + DoctorUserExistJoinTrial=20, + + + SysCreateUser = 21, + + SysResetPassword = 22, + + //不登陆通过邮箱重置密码 + UnloginUseEmailResetPassword = 23, + }