From da485e1dde04eda93542181882846fdcaa45a52c Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 15 May 2026 13:31:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=A8=E6=9C=9F=E6=80=A7?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E8=AF=AD=E8=A8=80=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Recurring/IRRecurringConsumer.cs | 10 ++- .../Recurring/QCRecurringEmailConsumer.cs | 30 ++++++-- .../Service/Common/DeployConfigService.cs | 76 +++++++++++++++++++ 3 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 IRaCIS.Core.Application/Service/Common/DeployConfigService.cs diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs index 791843c2b..7c62558c1 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/IRRecurringConsumer.cs @@ -74,13 +74,17 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring t.UserRole.IdentityUser.EMail, t.UserRole.IdentityUser.UserName, t.Trial.TrialCode, - t.Trial.ResearchProgramNo + t.Trial.ResearchProgramNo, + t.UserRole.IdentityUser.UserWorkLanguage //TrialReadingCriterionList = t.Trial.TrialReadingCriterionList.Select(t => new { t.CriterionName, TrialReadingCriterionId = t.Id }).ToList() }); foreach (var trialUser in trialUserList) { + //重新设置当前发送邮件的语言 + var workLanguage = trialUser.UserWorkLanguage; + isEn_US = workLanguage == UserWorkLanguage.US; var userId = trialUser.UserId; @@ -153,7 +157,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring - var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, emailContent), + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, emailContent, workLanguage), trialUser.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), @@ -167,7 +171,7 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring return (topicStr, htmlBodyStr); }; - await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc); + await CommonEmailHelper.GetTrialEmailSubejctAndHtmlInfoAndBuildAsync(trialEmailConfig, messageToSend, emailConfigFunc, workLanguage); await SendEmailHelper.SendEmailAsync(messageToSend, trialInfo); diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs index b3862f003..028ec03e3 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs @@ -44,12 +44,17 @@ public class QCImageQuestionRecurringEventConsumer(IRepository _trialRepo var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); //找到 该项目的CRC 用户Id - var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync(); + var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.UserRole.FullName, t.UserRole.IdentityUser.UserWorkLanguage }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 foreach (var user in userList) { + + //重新设置当前发送邮件的语言 + var workLanguage = user.UserWorkLanguage; + isEn_us = workLanguage == UserWorkLanguage.US; + var userId = user.UserId; //过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id var query = _trialRepository.Where(t => t.Id == trialId) @@ -72,7 +77,7 @@ public class QCImageQuestionRecurringEventConsumer(IRepository _trialRepo { var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; - var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent, workLanguage), user.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr, isEn_us, userId); @@ -116,12 +121,17 @@ public class CRCImageQuestionRecurringEventConsumer(IRepository _trialRep var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync(); //找到 该项目的IQC 用户Id - var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync(); + var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName, t.UserRole.IdentityUser.UserWorkLanguage }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 foreach (var user in userList) { + + //重新设置当前发送邮件的语言 + var workLanguage = user.UserWorkLanguage; + isEn_us = workLanguage == UserWorkLanguage.US; + var userId = user.UserId; //过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id @@ -147,7 +157,7 @@ public class CRCImageQuestionRecurringEventConsumer(IRepository _trialRep { var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; - var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent, workLanguage), user.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); @@ -181,7 +191,7 @@ public class ImageQCRecurringEventConsumer(IRepository _trialRepository, private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { - var trialId=context.Message.TrialId; + var trialId = context.Message.TrialId; var isEn_us = context.Message.CultureInfoName == StaticData.CultureInfo.en_US; @@ -192,13 +202,17 @@ public class ImageQCRecurringEventConsumer(IRepository _trialRepository, var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); //找到 该项目的IQC 用户Id - var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName }).ToListAsync(); + var userList = await _trialUserRoleRepository.Where(t => t.TrialId == trialId).Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.UserRole.FullName, t.UserRole.IdentityUser.UserWorkLanguage }).ToListAsync(); //判断是否任务可以领取 ,可以的话 发送邮件 var userIdList = userList.Select(t => t.UserId).ToList(); foreach (var user in userList) { + //重新设置当前发送邮件的语言 + var workLanguage = user.UserWorkLanguage; + isEn_us = workLanguage == UserWorkLanguage.US; + var userId = user.UserId; //过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id @@ -222,11 +236,11 @@ public class ImageQCRecurringEventConsumer(IRepository _trialRepository, Func topicAndHtmlFunc = trialEmailConfig => { - + var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; - var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent, workLanguage), user.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr, false, userId); diff --git a/IRaCIS.Core.Application/Service/Common/DeployConfigService.cs b/IRaCIS.Core.Application/Service/Common/DeployConfigService.cs new file mode 100644 index 000000000..2c47a87a5 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Common/DeployConfigService.cs @@ -0,0 +1,76 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using IRaCIS.Application.Contracts; +using Medallion.Threading; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Service.Common +{ + public class DeployConfigService(IMapper _mapper, IUserInfo _userInfo, IWebHostEnvironment _hostEnvironment, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService + { + + /// + /// 获取系统基础配置信息 + /// + /// + /// + public async Task GetSystemBasicConfigInfo([FromServices] IOptionsMonitor options) + { + return options.CurrentValue; + } + + [HttpPost] + public async Task UpdateSystemBasicConfig(ServiceVerifyConfigOption basicSystemConfigOption) + { + var path = $"appsettings.{_hostEnvironment.EnvironmentName}.json"; + + string text = System.IO.File.ReadAllText(path); + + // 修改 + JObject obj = JObject.Parse(text); + // QCRiskControl 相关配置 + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.QCRiskControl)] = basicSystemConfigOption.QCRiskControl; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.OpenUserComplexPassword)] = basicSystemConfigOption.OpenUserComplexPassword; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.OpenSignDocumentBeforeWork)] = basicSystemConfigOption.OpenSignDocumentBeforeWork; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.OpenTrialRelationDelete)] = basicSystemConfigOption.OpenTrialRelationDelete; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.OpenLoginLimit)] = basicSystemConfigOption.OpenLoginLimit; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.LoginMaxFailCount)] = basicSystemConfigOption.LoginMaxFailCount; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.LoginFailLockMinutes)] = basicSystemConfigOption.LoginFailLockMinutes; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.AutoLoginOutMinutes)] = basicSystemConfigOption.AutoLoginOutMinutes; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.OpenLoginMFA)] = basicSystemConfigOption.OpenLoginMFA; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.ContinuousReadingTimeMin)] = basicSystemConfigOption.ContinuousReadingTimeMin; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.ReadingRestTimeMin)] = basicSystemConfigOption.ReadingRestTimeMin; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.IsNeedChangePassWord)] = basicSystemConfigOption.IsNeedChangePassWord; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.ChangePassWordDays)] = basicSystemConfigOption.ChangePassWordDays; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.TemplateType)] = ((int)basicSystemConfigOption.TemplateType).ToString(); // 枚举需要转换为字符串 + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.ThirdPdfUrl)] = basicSystemConfigOption.ThirdPdfUrl; + obj["BasicSystemConfig"][nameof(ServiceVerifyConfigOption.UserMFAVerifyMinutes)] = basicSystemConfigOption.UserMFAVerifyMinutes; + + + // 重新写入appsettings.json + string result = obj.ToString(); + System.IO.File.WriteAllText(path, result); + + + return ResponseOutput.Ok(); + } + + public async Task GetEmailConfigInfo([FromServices] IOptionsMonitor options) + { + return options.CurrentValue; + } + + + + + } +}