From 1f9d9b283152edbf32b2a8ccf1abbd567bd8f303 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 14 May 2026 09:06:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TrialSiteUser/PersonalWorkstation.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index 75d415e92..b6887fbeb 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -1146,6 +1146,8 @@ namespace IRaCIS.Core.Application var isInternal = _userInfo.IsZhiZhun; + var workLanguage = _userInfo.UserWorkLanguage; + var needSignTrialCount = await _trialRepository.Where(t => t.TrialStatusStr == StaticData.TrialState.TrialOngoing) .Where(t => t.TrialIdentityUserList.Any(t => t.IdentityUserId == _userInfo.IdentityUserId && t.TrialUserRoleList.Any(t => t.UserRole.UserTypeId == _userInfo.UserTypeId))) .Where(c => c.TrialDocumentList.Where(t => t.IsDeleted == false && t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) @@ -1153,6 +1155,8 @@ namespace IRaCIS.Core.Application var needSignSysDocCont = await _systemDocumentRepository.Where(t => t.IsPublish) .Where(t => t.IsDeleted == false && !t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.IdentityUserId && t.ConfirmTime != null)) + .WhereIf(workLanguage == UserWorkLanguage.CN, t => t.DocLanguageType == DocLanguageType.CN || t.DocLanguageType == DocLanguageType.CN_US) + .WhereIf(workLanguage == UserWorkLanguage.US, t => t.DocLanguageType == DocLanguageType.US || t.DocLanguageType == DocLanguageType.CN_US) //外部人员 只签署 外部需要签署的 .WhereIf(isInternal == false, t => t.DocUserSignType == DocUserSignType.InnerAndOuter) .SelectMany(t => t.NeedConfirmedUserTypeList) From 24dfa32ad48624f0dd6361385d91b153353ca5d9 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 14 May 2026 11:11:26 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96liquid=20=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LiquidTemplate/EntityService.liquid | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/IRaCIS.Core.Test/LiquidTemplate/EntityService.liquid b/IRaCIS.Core.Test/LiquidTemplate/EntityService.liquid index c371c2227..7a5a2df57 100644 --- a/IRaCIS.Core.Test/LiquidTemplate/EntityService.liquid +++ b/IRaCIS.Core.Test/LiquidTemplate/EntityService.liquid @@ -24,7 +24,14 @@ public class {{TableName}}Service(IRepository<{{TableName}}> {{LowercaseReposito { var {{LowercaseQueryableName}} ={{LowercaseRepositoryName}} - .ProjectTo<{{TableNameView}}>(_mapper.ConfigurationProvider); +{% for field in QueryListFieldList -%} + {% if field.CSharpType == "string" -%} + .WhereIf(!string.IsNullOrEmpty(inQuery.{{ field.FieldName }}), t => t.{{ field.FieldName }}.Contains(inQuery.{{ field.FieldName }})) + {%- elsif field.CSharpType != "DateTime" -%} + .WhereIf(inQuery.{{ field.FieldName }} != null, t => t.{{ field.FieldName }} == inQuery.{{ field.FieldName }}) + {%- endif %} +{% endfor -%} + .ProjectTo<{{TableNameView}}>(_mapper.ConfigurationProvider); var pageList= await {{LowercaseQueryableName}}.ToPagedListAsync(inQuery); @@ -37,7 +44,14 @@ public class {{TableName}}Service(IRepository<{{TableName}}> {{LowercaseReposito var {{LowercaseQueryableName}} ={{LowercaseRepositoryName}} - .ProjectTo<{{TableNameView}}>(_mapper.ConfigurationProvider); +{% for field in QueryListFieldList -%} + {% if field.CSharpType == "string" -%} + .WhereIf(!string.IsNullOrEmpty(inQuery.{{ field.FieldName }}), t => t.{{ field.FieldName }}.Contains(inQuery.{{ field.FieldName }})) + {%- elsif field.CSharpType != "DateTime" -%} + .WhereIf(inQuery.{{ field.FieldName }} != null, t => t.{{ field.FieldName }} == inQuery.{{ field.FieldName }}) + {%- endif %} +{% endfor -%} + .ProjectTo<{{TableNameView}}>(_mapper.ConfigurationProvider); return await {{LowercaseQueryableName}}.ToListAsync(); } 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 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E6=80=A7=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; + } + + + + + } +}