Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details

Test_IRC_Net8
he 2026-02-12 20:00:05 -05:00
commit 3fd299bb49
19 changed files with 447 additions and 316 deletions

View File

@ -15,12 +15,13 @@ using Hangfire.Storage;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MassTransit.Mediator; using MassTransit.Mediator;
using Microsoft.Extensions.Configuration;
namespace IRaCIS.Core.API.HostService; namespace IRaCIS.Core.API.HostService;
public class HangfireHostService(IRecurringMessageScheduler _recurringMessageScheduler, public class HangfireHostService(IRecurringMessageScheduler _recurringMessageScheduler,
IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository, IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
IConfiguration _config,
IRepository<EmailNoticeConfig> _emailNoticeConfigrepository, IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
IMediator _mediator, IMediator _mediator,
ILogger<HangfireHostService> _logger) : IHostedService ILogger<HangfireHostService> _logger) : IHostedService
@ -56,6 +57,8 @@ public class HangfireHostService(IRecurringMessageScheduler _recurringMessageSch
} }
} }
string defaultCulture = _config.GetValue<string>("SystemEmailSendConfig:CronEmailDefaultCulture");
// 项目手动选择,周期性邮件 // 项目手动选择,周期性邮件
var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend)
.Select(t => new { t.Id, t.Code, TrialCode = t.Trial.TrialCode, t.EmailCron, t.BusinessScenarioEnum, t.TrialId }) .Select(t => new { t.Id, t.Code, TrialCode = t.Trial.TrialCode, t.EmailCron, t.BusinessScenarioEnum, t.TrialId })
@ -68,11 +71,11 @@ public class HangfireHostService(IRecurringMessageScheduler _recurringMessageSch
var trialId = task.TrialId; var trialId = task.TrialId;
HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, trialId, task.BusinessScenarioEnum, task.EmailCron); HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, trialId, task.BusinessScenarioEnum, task.EmailCron, defaultCulture);
} }
// 系统邮件定时任务 // 系统邮件定时任务 要设置默认语言
var systemTaskInfoList = await _emailNoticeConfigrepository.Where(t => t.EmailCron != string.Empty && t.IsAutoSend) var systemTaskInfoList = await _emailNoticeConfigrepository.Where(t => t.EmailCron != string.Empty && t.IsAutoSend)
.Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, }) .Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, })
.ToListAsync(); .ToListAsync();
@ -82,7 +85,7 @@ public class HangfireHostService(IRecurringMessageScheduler _recurringMessageSch
//利用主键作为任务Id //利用主键作为任务Id
var jobId = $"{task.Id}_({task.BusinessScenarioEnum})"; var jobId = $"{task.Id}_({task.BusinessScenarioEnum})";
HangfireJobHelper.AddOrUpdateTimingCronJob(jobId, task.BusinessScenarioEnum, task.EmailCron); HangfireJobHelper.AddOrUpdateTimingCronJob(jobId, task.BusinessScenarioEnum, task.EmailCron, defaultCulture);
} }

View File

@ -22,6 +22,7 @@ using Newtonsoft.Json;
using Serilog; using Serilog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -29,6 +30,10 @@ using System.Runtime.InteropServices;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true); AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
Console.WriteLine("Startup Culture: " + CultureInfo.CurrentCulture.Name);
Console.WriteLine("Startup UI Culture: " + CultureInfo.CurrentUICulture.Name);
#region 获取环境变量 #region 获取环境变量
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数) //以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
var config = new ConfigurationBuilder() var config = new ConfigurationBuilder()

View File

@ -12,6 +12,12 @@
//"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true", //"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
//"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true" //"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "u", "wait..." ],
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621697b96f74e6f3d" ]
},
"ObjectStoreService": { "ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS", "ObjectStoreUse": "AliyunOSS",
"AliyunOSS": { "AliyunOSS": {
@ -81,6 +87,7 @@
"IsEnv_US": false, "IsEnv_US": false,
"IsOpenErrorNoticeEmail": false, "IsOpenErrorNoticeEmail": false,
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
"CronEmailDefaultCulture": "zh-CN",
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },
"SystemPacsConfig": { "SystemPacsConfig": {

View File

@ -18,6 +18,12 @@
// Hangfire // Hangfire
"Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" "Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "u", "wait..." ],
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621697b96f74e6f3d" ]
},
// //
"ObjectStoreService": { "ObjectStoreService": {
// 使 // 使
@ -162,6 +168,7 @@
"IsOpenErrorNoticeEmail": false, "IsOpenErrorNoticeEmail": false,
// //
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
"CronEmailDefaultCulture": "zh-CN",
// //
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },

View File

@ -12,7 +12,12 @@
//"RemoteNew": "Server=44.210.231.169,1435;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true", //"RemoteNew": "Server=44.210.231.169,1435;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
//"Hangfire": "Server=44.210.231.169,1435;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true", //"Hangfire": "Server=44.210.231.169,1435;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "u", "wait..." ],
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621697b96f74e6f3d" ]
},
"ObjectStoreService": { "ObjectStoreService": {
"ObjectStoreUse": "AWS", "ObjectStoreUse": "AWS",
"MinIO": { "MinIO": {
@ -87,6 +92,7 @@
"IsEnv_US": true, "IsEnv_US": true,
"IsOpenErrorNoticeEmail": false, "IsOpenErrorNoticeEmail": false,
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
"CronEmailDefaultCulture": "en-US",
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },

View File

@ -13,6 +13,12 @@
"RemoteNew": "Server=3.226.182.187,1435;Database=US_Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true", "RemoteNew": "Server=3.226.182.187,1435;Database=US_Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=3.226.182.187,1435;Database=US_Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" "Hangfire": "Server=3.226.182.187,1435;Database=US_Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "u", "wait..." ],
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621697b96f74e6f3d" ]
},
"ObjectStoreService": { "ObjectStoreService": {
@ -93,6 +99,7 @@
"IsEnv_US": true, "IsEnv_US": true,
"IsOpenErrorNoticeEmail": false, "IsOpenErrorNoticeEmail": false,
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
"CronEmailDefaultCulture": "en-US",
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },

View File

@ -10,6 +10,12 @@
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true", "RemoteNew": "Server=101.132.253.119,1435;Database=Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=101.132.253.119,1435;Database=Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true" "Hangfire": "Server=101.132.253.119,1435;Database=Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "u", "wait..." ],
"VueNoticeUserList": [ "wangxiaoshuang", "6b7717a31647293621697b96f74e6f3d" ]
},
"ObjectStoreService": { "ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS", "ObjectStoreUse": "AliyunOSS",
@ -100,6 +106,7 @@
"IsEnv_US": false, "IsEnv_US": false,
"IsOpenErrorNoticeEmail": false, "IsOpenErrorNoticeEmail": false,
"EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "EmailRegexStr": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
"CronEmailDefaultCulture": "zh-CN",
"ErrorNoticeEmailList": [ "872297557@qq.com" ] "ErrorNoticeEmailList": [ "872297557@qq.com" ]
}, },

View File

@ -43,12 +43,6 @@
} }
] ]
}, },
"WeComNoticeConfig": {
"IsOpenWeComNotice": true,
"WebhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4355b98e-1e72-4678-8dfb-2fc6ad0bf449", //4355b98e-1e72-4678-8dfb-2fc6ad0bf449 //cdd97aab-d256-4f07-9145-a0a2b1555322
"APINoticeUserList": [ "ZhouHang" ],
"VueNoticeUserList": [ "wangxiaoshuang" ]
},
"IRaCISImageStore": { "IRaCISImageStore": {
"SwitchingMode": "RemainingDiskCapacity", "SwitchingMode": "RemainingDiskCapacity",
"SwitchingRatio": 80, "SwitchingRatio": 80,

View File

@ -2,6 +2,7 @@
using IRaCIS.Core.Application.MassTransit.Consumer; using IRaCIS.Core.Application.MassTransit.Consumer;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using MassTransit.Mediator; using MassTransit.Mediator;
using System.Globalization;
namespace IRaCIS.Core.Application.Helper namespace IRaCIS.Core.Application.Helper
{ {
@ -57,25 +58,29 @@ namespace IRaCIS.Core.Application.Helper
} }
public static void AddOrUpdateTrialCronJob(string jobId, Guid trialId, EmailBusinessScenario businessScenario, string emailCron) public static void AddOrUpdateTrialCronJob(string jobId, Guid trialId, EmailBusinessScenario businessScenario, string emailCron,string defaultCulture="")
{ {
if (defaultCulture == "")
{
defaultCulture = CultureInfo.CurrentCulture.Name;
}
switch (businessScenario) switch (businessScenario)
{ {
case EmailBusinessScenario.QCTask: case EmailBusinessScenario.QCTask:
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new ImageQCRecurringEvent() { TrialId = trialId }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new ImageQCRecurringEvent() { TrialId = trialId,CultureInfoName= defaultCulture }, default), emailCron);
break; break;
case EmailBusinessScenario.CRCToQCQuestion: case EmailBusinessScenario.CRCToQCQuestion:
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new CRCImageQuestionRecurringEvent() { TrialId = trialId }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new CRCImageQuestionRecurringEvent() { TrialId = trialId, CultureInfoName = defaultCulture }, default), emailCron);
break; break;
case EmailBusinessScenario.QCToCRCImageQuestion: case EmailBusinessScenario.QCToCRCImageQuestion:
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new QCImageQuestionRecurringEvent() { TrialId = trialId }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new QCImageQuestionRecurringEvent() { TrialId = trialId, CultureInfoName = defaultCulture }, default), emailCron);
break; break;
//加急阅片 10分钟 //加急阅片 10分钟
case EmailBusinessScenario.ExpeditedReading: case EmailBusinessScenario.ExpeditedReading:
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new UrgentIRUnReadTaskRecurringEvent() { TrialId = trialId }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new UrgentIRUnReadTaskRecurringEvent() { TrialId = trialId, CultureInfoName = defaultCulture }, default), emailCron);
break; break;
default: default:
break; break;
@ -83,20 +88,25 @@ namespace IRaCIS.Core.Application.Helper
} }
public static void AddOrUpdateTimingCronJob(string jobId, EmailBusinessScenario businessScenario, string emailCron) public static void AddOrUpdateTimingCronJob(string jobId, EmailBusinessScenario businessScenario, string emailCron, string defaultCulture="")
{ {
if (defaultCulture == "")
{
defaultCulture = CultureInfo.CurrentCulture.Name;
}
switch (businessScenario) switch (businessScenario)
{ {
case EmailBusinessScenario.GeneralTraining_ExpirationNotification: case EmailBusinessScenario.GeneralTraining_ExpirationNotification:
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new SystemDocumentErverDayEvent() { }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new SystemDocumentErverDayEvent() { CultureInfoName = defaultCulture }, default), emailCron);
break; break;
case EmailBusinessScenario.TrialTraining_ExpirationNotification: case EmailBusinessScenario.TrialTraining_ExpirationNotification:
Console.WriteLine("更新项目到期job"); Console.WriteLine("更新项目到期job");
HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new TrialDocumentErverDayEvent() { }, default), emailCron); HangfireJobHelper.AddOrUpdateCronJob<IMediator>(jobId, t => t.Send(new TrialDocumentErverDayEvent() { CultureInfoName = defaultCulture }, default), emailCron);
break; break;
default: default:

View File

@ -48,8 +48,8 @@ public static class WeComNotifier
if (!string.IsNullOrWhiteSpace(stack)) if (!string.IsNullOrWhiteSpace(stack))
{ {
stack = stack.Replace("\n", "\n> "); stack = stack.Replace("\n", "\n> ");
if (stack.Length > 1200) if (stack.Length > 600)
stack = stack[..1200] + "...(已截断)"; stack = stack[..600] + "...(已截断)";
} }
var markdown = $@"## 🚨 系统告警 var markdown = $@"## 🚨 系统告警

View File

@ -674,6 +674,276 @@
<param name="childCode"></param> <param name="childCode"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ResearchProgramNo">
<summary>
方案编号 STUDYID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Domain">
<summary>
域 DOMAIN TU TR RS
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ValueType">
<summary>
取值类型 TUSPID TRSPID RSSPID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.SubjectCode">
<summary>
受试者编号 USUBJID 实际展示TrialSiteSubjectCode
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Vendor">
<summary>
供应商 TUNAM (Extensive Imaging)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.UserName">
<summary>
阅片人 TUEVAL TREVAL RSEVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ArmEnum">
<summary>
阅片人标识 TUEVALID TREVALID RSEVALID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitNum">
<summary>
访视编号 VISITNUM
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitName">
<summary>
访视名称 VISIT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.LatestScanDate">
<summary>
拍片日期 TUDTC TRDTC RSDTC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitTaskId">
<summary>
eCRF标识 TUREFID TRREFID RSREFID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.CriterionName">
<summary>
RSCAT 阅片标准
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.IsJudgeSelect">
<summary>
RSACPTFL 裁定标记 TUACPTFL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.No">
<summary>
序号 TUSEQ (同一个访视,所有阅片人选择病灶给个顺序号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.ARM_TumorNo">
<summary>
链接ID TULNKID (阅片人角色_病灶编号)不同访视可以重复
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationSimple">
<summary>
肿瘤识别简称 TUTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationFullName">
<summary>
肿瘤识别全称 TUTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResult">
<summary>
肿瘤鉴定结果 TUORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResultType">
<summary>
肿瘤识别结果类型 TUSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPart">
<summary>
部位 TULOC (对应病灶表的部位,需要国际化)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.IdentificationMethod">
<summary>
鉴定方法 TUMETHOD (Modality?)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPartDes">
<summary>
部位描述 LOCTEXT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRSEQ">
<summary>
每个subject 按照顺序编号 TRSEQ
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRGRPID">
<summary>
TRGRPID 组ID 对应TU表肿瘤鉴定结果 TumorIdentificationResult
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_TumorNo">
<summary>
TRLNKID 链接ID 对应TU表的链接ID TumorNo(阅片人角色_病灶编号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_VisitName">
<summary>
TRLNKGRP 链接组 ARM-任务名(访视名) 对应RS的链接组
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentSimpleName">
<summary>
肿瘤评估简称 TRTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentFullName">
<summary>
肿瘤评估全称 TRTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalMeasurements">
<summary>
原始测量 TRORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalUnit">
<summary>
原始单位 TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Character">
<summary>
标准结果(字符) TRSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Numeric">
<summary>
标准结果(数值) TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardUnit">
<summary>
标准单位 TRSTRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.CompletionStatus">
<summary>
完成状态 TRSTAT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.IdentificationMethod">
<summary>
完成状态 TRMETHOD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.NotMeasuredReason">
<summary>
无法测量原因 TRREASND
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RSSEQ">
<summary>
RSSEQ 按照subject 的数据顺序编号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ARM_VisitName">
<summary>
RSLNKGRP 链接组 ARM_任务名(访视名)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationSimpleName">
<summary>
RSTESTCD 疗效评估简称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationName">
<summary>
RSTEST 疗效评估全称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RespondEfficacyAssessment">
<summary>
RSORRES 响应评估原始结果
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.StandardEfficacyAssessment">
<summary>
RSSTRESC 标准疗效评估
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.CompletionStatus">
<summary>
RSSTAT 完成状态
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.NotAssessmentReason">
<summary>
RSREASND 无法评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.AssessmentReason">
<summary>
REASASM 评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ReAssessmentReason">
<summary>
REASOVR 重新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.UpdateAssessmentReason">
<summary>
REASUPD 更新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RDOMAIN">
<summary>
关联域 RS(访视点备注) 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.COSEQ">
<summary>
COSEQ 序号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.IdentificationVariable">
<summary>
IDVAR 标识变量 RSSEQ 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Identification">
<summary>
标识 IDVARVAL RSSEQ具体的值 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RemarksQuote">
<summary>
COREF 备注引用
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Remarks">
<summary>
备注 COVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.CODTC">
<summary>
裁决日期 CODTC
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialQCQuestionAnserList_Export(IRaCIS.Core.Application.Contracts.GetQCQuestionAnswerQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserRole},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestion},IRaCIS.Application.Interfaces.IDictionaryService)"> <member name="M:IRaCIS.Core.Application.Service.Common.ExcelExportService.GetTrialQCQuestionAnserList_Export(IRaCIS.Core.Application.Contracts.GetQCQuestionAnswerQuery,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.UserRole},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestion},IRaCIS.Application.Interfaces.IDictionaryService)">
<summary> <summary>
质控问题答案导出 质控问题答案导出
@ -989,276 +1259,6 @@
<returns></returns> <returns></returns>
<exception cref="T:System.Exception"></exception> <exception cref="T:System.Exception"></exception>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ResearchProgramNo">
<summary>
方案编号 STUDYID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Domain">
<summary>
域 DOMAIN TU TR RS
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ValueType">
<summary>
取值类型 TUSPID TRSPID RSSPID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.SubjectCode">
<summary>
受试者编号 USUBJID 实际展示TrialSiteSubjectCode
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.Vendor">
<summary>
供应商 TUNAM (Extensive Imaging)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.UserName">
<summary>
阅片人 TUEVAL TREVAL RSEVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.ArmEnum">
<summary>
阅片人标识 TUEVALID TREVALID RSEVALID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitNum">
<summary>
访视编号 VISITNUM
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitName">
<summary>
访视名称 VISIT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.LatestScanDate">
<summary>
拍片日期 TUDTC TRDTC RSDTC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.VisitTaskId">
<summary>
eCRF标识 TUREFID TRREFID RSREFID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.CriterionName">
<summary>
RSCAT 阅片标准
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_TR_RSBaseModel.IsJudgeSelect">
<summary>
RSACPTFL 裁定标记 TUACPTFL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.No">
<summary>
序号 TUSEQ (同一个访视,所有阅片人选择病灶给个顺序号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.ARM_TumorNo">
<summary>
链接ID TULNKID (阅片人角色_病灶编号)不同访视可以重复
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationSimple">
<summary>
肿瘤识别简称 TUTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationFullName">
<summary>
肿瘤识别全称 TUTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResult">
<summary>
肿瘤鉴定结果 TUORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.TumorIdentificationResultType">
<summary>
肿瘤识别结果类型 TUSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPart">
<summary>
部位 TULOC (对应病灶表的部位,需要国际化)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.IdentificationMethod">
<summary>
鉴定方法 TUMETHOD (Modality?)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TU_Export.BodyPartDes">
<summary>
部位描述 LOCTEXT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRSEQ">
<summary>
每个subject 按照顺序编号 TRSEQ
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TRGRPID">
<summary>
TRGRPID 组ID 对应TU表肿瘤鉴定结果 TumorIdentificationResult
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_TumorNo">
<summary>
TRLNKID 链接ID 对应TU表的链接ID TumorNo(阅片人角色_病灶编号)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.ARM_VisitName">
<summary>
TRLNKGRP 链接组 ARM-任务名(访视名) 对应RS的链接组
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentSimpleName">
<summary>
肿瘤评估简称 TRTESTCD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.TumorAssessmentFullName">
<summary>
肿瘤评估全称 TRTEST
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalMeasurements">
<summary>
原始测量 TRORRES
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.OriginalUnit">
<summary>
原始单位 TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Character">
<summary>
标准结果(字符) TRSTRESC
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardResult_Numeric">
<summary>
标准结果(数值) TRORRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.StandardUnit">
<summary>
标准单位 TRSTRESU
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.CompletionStatus">
<summary>
完成状态 TRSTAT
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.IdentificationMethod">
<summary>
完成状态 TRMETHOD
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.TR_Export.NotMeasuredReason">
<summary>
无法测量原因 TRREASND
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RSSEQ">
<summary>
RSSEQ 按照subject 的数据顺序编号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ARM_VisitName">
<summary>
RSLNKGRP 链接组 ARM_任务名(访视名)
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationSimpleName">
<summary>
RSTESTCD 疗效评估简称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.EfficacyEvaluationName">
<summary>
RSTEST 疗效评估全称
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.RespondEfficacyAssessment">
<summary>
RSORRES 响应评估原始结果
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.StandardEfficacyAssessment">
<summary>
RSSTRESC 标准疗效评估
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.CompletionStatus">
<summary>
RSSTAT 完成状态
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.NotAssessmentReason">
<summary>
RSREASND 无法评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.AssessmentReason">
<summary>
REASASM 评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.ReAssessmentReason">
<summary>
REASOVR 重新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.RS_Export.UpdateAssessmentReason">
<summary>
REASUPD 更新评估原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RDOMAIN">
<summary>
关联域 RS(访视点备注) 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.COSEQ">
<summary>
COSEQ 序号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.IdentificationVariable">
<summary>
IDVAR 标识变量 RSSEQ 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Identification">
<summary>
标识 IDVARVAL RSSEQ具体的值 空:裁判选择原因
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.RemarksQuote">
<summary>
COREF 备注引用
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.Remarks">
<summary>
备注 COVAL
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Common.CO_Export.CODTC">
<summary>
裁决日期 CODTC
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto"> <member name="T:IRaCIS.Core.Application.Service.Common.IVUS_OCTBaseDto">
<summary> <summary>
公共影像导表基类IVUS / OCT 通用) 公共影像导表基类IVUS / OCT 通用)
@ -16790,17 +16790,17 @@
</member> </member>
<member name="F:IRaCIS.Core.Application.ViewModel.AccessToDialogueEnum.Question"> <member name="F:IRaCIS.Core.Application.ViewModel.AccessToDialogueEnum.Question">
<summary> <summary>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 质疑
</summary> </summary>
</member> </member>
<member name="F:IRaCIS.Core.Application.ViewModel.AccessToDialogueEnum.Consistency"> <member name="F:IRaCIS.Core.Application.ViewModel.AccessToDialogueEnum.Consistency">
<summary> <summary>
һ<EFBFBD><EFBFBD><EFBFBD>Ժ˲<EFBFBD> 一致性核查
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.Application.ViewModel.CopyFrontAuditConfigItemDto"> <member name="T:IRaCIS.Core.Application.ViewModel.CopyFrontAuditConfigItemDto">
<summary> <summary>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 复制
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.Application.ViewModel.SystemNoticeView"> <member name="T:IRaCIS.Core.Application.ViewModel.SystemNoticeView">

View File

@ -1,14 +1,16 @@
using System; using IRaCIS.Core.Application.Helper.OtherTool;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using IRaCIS.Core.Domain.BaseModel; using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using MassTransit; using MassTransit;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using NPOI.SS.Formula.Functions; using Newtonsoft.Json;
using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
public class ConsumeExceptionFilter<T>(ILogger<ConsumeExceptionFilter<T>> _logger) : IFilter<ConsumeContext<T>> where T : DomainEvent public class ConsumeExceptionFilter<T>(ILogger<ConsumeExceptionFilter<T>> _logger, IConfiguration _config) : IFilter<ConsumeContext<T>> where T : DomainEvent
{ {
public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next) public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
@ -23,6 +25,44 @@ public class ConsumeExceptionFilter<T>(ILogger<ConsumeExceptionFilter<T>> _logge
{ {
var errorInfo = $"Exception: {exception.Message}[{exception.StackTrace}]" + (exception.InnerException != null ? $" InnerException: {exception.InnerException.Message}[{exception.InnerException.StackTrace}]" : ""); var errorInfo = $"Exception: {exception.Message}[{exception.StackTrace}]" + (exception.InnerException != null ? $" InnerException: {exception.InnerException.Message}[{exception.InnerException.StackTrace}]" : "");
_logger.LogError(errorInfo); _logger.LogError(errorInfo);
try
{
bool isOpenWeComNotice = _config.GetValue<bool>("WeComNoticeConfig:IsOpenWeComNotice");
if (isOpenWeComNotice)
{
string webhook = _config["WeComNoticeConfig:WebhookUrl"] ?? string.Empty;
var uri = new Uri(_config["SystemEmailSendConfig:SiteUrl"]);
var baseUrl = uri.GetLeftPart(UriPartial.Authority);
var userList = _config.GetSection("WeComNoticeConfig:APINoticeUserList").Get<string[]>();
// 🔔 异步告警(不要阻塞请求)
_ = WeComNotifier.SendAlertAsync(
webhook: webhook,
alert: new WeComAlert
{
Env = baseUrl,
UserName = "MassTransit 自动触发邮件",
Api = "",
Message = $"异常信息:{exception.Message} ",
Stack = exception.StackTrace,
AtUsers = userList ?? []
}
);
}
}
catch (Exception ex)
{
Log.Logger.Error($"MassTransit里发送企业微信出现错误{ex.Message}");
}
} }
} }

View File

@ -37,7 +37,12 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
public async Task Consume(ConsumeContext<UrgentIRUnReadTaskRecurringEvent> context) public async Task Consume(ConsumeContext<UrgentIRUnReadTaskRecurringEvent> context)
{ {
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var trialId = context.Message.TrialId; var trialId = context.Message.TrialId;
var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId); var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);

View File

@ -7,6 +7,7 @@ using MassTransit.Scheduling;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -34,7 +35,11 @@ public class QCImageQuestionRecurringEventConsumer(IRepository<Trial> _trialRepo
{ {
var trialId = context.Message.TrialId; var trialId = context.Message.TrialId;
var isEn_us = false; var isEn_us = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
@ -102,7 +107,12 @@ public class CRCImageQuestionRecurringEventConsumer(IRepository<Trial> _trialRep
{ {
var trialId = context.Message.TrialId; var trialId = context.Message.TrialId;
var isEn_us = false; var isEn_us = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstNotNullAsync(); 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 //找到 该项目的IQC 用户Id
@ -173,7 +183,11 @@ public class ImageQCRecurringEventConsumer(IRepository<Trial> _trialRepository,
{ {
var trialId=context.Message.TrialId; var trialId=context.Message.TrialId;
var isEn_us = false; var isEn_us = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync(); var trialInfo = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();

View File

@ -42,7 +42,12 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
Console.WriteLine("发送定时过期提醒"); Console.WriteLine("发送定时过期提醒");
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var systemDocQuery = var systemDocQuery =
from sysDoc in _systemDocumentRepository.AsQueryable(false) from sysDoc in _systemDocumentRepository.AsQueryable(false)
from identityUser in _identityUserRepository.AsQueryable(false).Where(t => t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId))) from identityUser in _identityUserRepository.AsQueryable(false).Where(t => t.UserRoleList.Where(t => t.IsUserRoleDisabled == false).Any(t => sysDoc.NeedConfirmedUserTypeList.AsQueryable().Any(c => c.NeedConfirmUserTypeId == t.UserTypeId)))
@ -150,7 +155,11 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
public async Task Consume(ConsumeContext<SystemDocumentPublishEvent> context) public async Task Consume(ConsumeContext<SystemDocumentPublishEvent> context)
{ {
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
// 记录是否只发送给新增角色的日志 // 记录是否只发送给新增角色的日志
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())

View File

@ -53,7 +53,11 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
Console.WriteLine("发送定时项目过期提醒"); Console.WriteLine("发送定时项目过期提醒");
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
var trialDocQuery = var trialDocQuery =
from trialDoc in _trialDocumentRepository.AsQueryable(true) from trialDoc in _trialDocumentRepository.AsQueryable(true)
@ -177,7 +181,11 @@ namespace IRaCIS.Core.Application.MassTransit.Recurring
public async Task Consume(ConsumeContext<TrialDocumentPublishEvent> context) public async Task Consume(ConsumeContext<TrialDocumentPublishEvent> context)
{ {
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = context.Message.CultureInfoName == StaticData.CultureInfo.en_US;
//设置当前事件传递过来的语言
var culture = context.Message.CultureInfoName;
CultureInfo.CurrentCulture = new CultureInfo(culture);
// 记录是否只发送给新增角色的日志 // 记录是否只发送给新增角色的日志
if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any()) if (context.Message.NewUserTypeIds != null && context.Message.NewUserTypeIds.Any())

View File

@ -1,11 +1,16 @@
using DocumentFormat.OpenXml.Office2010.ExcelAc; using DocumentFormat.OpenXml.Office2010.ExcelAc;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces; using IRaCIS.Application.Interfaces;
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting;
using MiniExcelLibs; using MiniExcelLibs;
using System.ComponentModel.Design;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -485,20 +490,19 @@ namespace IRaCIS.Core.Application.Service
} }
[HttpGet("{visitPlanInfluenceStatId:guid}")] [HttpGet("{visitPlanInfluenceStatId:guid}")]
public async Task<IActionResult> DownloadInflunceStudyList(Guid visitPlanInfluenceStatId) public async Task<IActionResult> DownloadInflunceStudyList(Guid visitPlanInfluenceStatId,
[FromServices] IRepository<CommonDocument> _commonDocumentRepository, [FromServices] IWebHostEnvironment _hostEnvironment, [FromServices] IRaCIS.Application.Interfaces.IDictionaryService _dictionaryService)
{ {
var list = _influnceRepository.Where(t => t.VisitPlanInfluenceStatId == visitPlanInfluenceStatId) var list = _influnceRepository.Where(t => t.VisitPlanInfluenceStatId == visitPlanInfluenceStatId)
.ProjectTo<VisitPlanInfluenceSubjectVisitDTO>(_mapper.ConfigurationProvider).ToList(); .ProjectTo<VisitPlanInfluenceSubjectVisitDTO>(_mapper.ConfigurationProvider).ToList();
var memoryStream = new MemoryStream();
memoryStream.SaveAs(list);
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = _localizer["VisitPlan_CheckExport", DateTime.Now.ToString("yyyy-MM-dd:hh:mm:ss")]
};
var exportInfo = new ExcelExportInfo();
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialVisit_InfluenceStudys_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(VisitPlanInfluenceSubjectVisitDTO));
} }

View File

@ -316,6 +316,11 @@ public static class StaticData
public const string OCT_CDISC_Export = "OCT_CDISC_Export"; public const string OCT_CDISC_Export = "OCT_CDISC_Export";
public const string TrialVisit_InfluenceStudys_Export = "TrialVisit_InfluenceStudys_Export";
} }