From 823f0823962273403bc5588cfa1f423861b9d61e Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 21 Oct 2024 18:02:35 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_ServiceExtensions/SerilogSetup.cs | 15 +++++++++------ .../LegacyController/ProjectExceptionFilter.cs | 1 + IRaCIS.Core.Application/TestService.cs | 6 ------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs index 7622f1c24..f8eb97fe1 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs @@ -1,4 +1,5 @@ -using Serilog; +using DocumentFormat.OpenXml.Bibliography; +using Serilog; using Serilog.Events; using Serilog.Formatting.Compact; @@ -28,12 +29,14 @@ namespace IRaCIS.Core.API .Enrich.FromLogContext() .Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health")) - //https://github.com/serilog/serilog-formatting-compact - // 控制台输出 JSON 格式 - .WriteTo.Console(formatter: new CompactJsonFormatter(),LogEventLevel.Warning) + //https://github.com/serilog/serilog-formatting-compact - // 文件输出 JSON 格式 - .WriteTo.File(new CompactJsonFormatter(), $"{AppContext.BaseDirectory}Serilogs/.json", rollingInterval: RollingInterval.Day); + .WriteTo.Console() + .WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day); + //// 控制台输出 JSON 格式 + //.WriteTo.Console(formatter: new CompactJsonFormatter(), LogEventLevel.Warning), + //// 文件输出 JSON 格式 + //.WriteTo.File(new CompactJsonFormatter(), $"{AppContext.BaseDirectory}Serilogs/.json", rollingInterval: RollingInterval.Day); ////控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型 //.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning, diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs index 444c1dfbd..f9fc7aa85 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs @@ -57,6 +57,7 @@ public class ProjectExceptionFilter(ILogger _logger, ISt _logger.LogError(errorInfo); + //_logger.LogError(exception, exception.Message); } else { diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index c764d0838..61d451cb8 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -33,12 +33,6 @@ using System.Text; namespace IRaCIS.Core.Application.Service { - - - - - - [ApiExplorerSettings(GroupName = "Institution")] public class TestService(IRepository _dicRepository, IRepository _trialRepository, From 3ff092fbdaee34eb1fc3e224a4b39978519083b2 Mon Sep 17 00:00:00 2001 From: hang <87227557@qq.com> Date: Mon, 21 Oct 2024 21:03:22 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RecurringJobConfigurationService .cs | 30 +++++++++ .../_ServiceExtensions/MassTransitSetup.cs | 66 ++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 IRaCIS.Core.API/HostService/RecurringJobConfigurationService .cs diff --git a/IRaCIS.Core.API/HostService/RecurringJobConfigurationService .cs b/IRaCIS.Core.API/HostService/RecurringJobConfigurationService .cs new file mode 100644 index 000000000..429d56a28 --- /dev/null +++ b/IRaCIS.Core.API/HostService/RecurringJobConfigurationService .cs @@ -0,0 +1,30 @@ +using IRaCIS.Core.Application.MassTransit.Consumer; +using MassTransit; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.Threading; +using System.Threading.Tasks; + +namespace IRaCIS.Core.API.HostService +{ + public class RecurringJobConfigurationService : + BackgroundService + { + readonly IServiceScopeFactory _scopeFactory; + + public RecurringJobConfigurationService(IServiceScopeFactory scopeFactory) + { + _scopeFactory = scopeFactory; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + await using var scope = _scopeFactory.CreateAsyncScope(); + + var endpoint = scope.ServiceProvider.GetRequiredService(); + + await endpoint.AddOrUpdateRecurringJob(nameof(MasstransitTestConsumer), new MasstransiTestCommand(), x => x.Every(minutes: 1), + stoppingToken); + } + } +} diff --git a/IRaCIS.Core.API/_ServiceExtensions/MassTransitSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/MassTransitSetup.cs index f2a6b5730..c4ca5643d 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/MassTransitSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/MassTransitSetup.cs @@ -1,7 +1,10 @@ -using IRaCIS.Core.Application.MassTransit.Consumer; +using IRaCIS.Core.API.HostService; +using IRaCIS.Core.Application.MassTransit.Consumer; using IRaCIS.Core.Domain.BaseModel; +using IRaCIS.Core.Infra.EFCore; using MassTransit; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using System; namespace IRaCIS.Core.API @@ -41,7 +44,7 @@ namespace IRaCIS.Core.API cfg.UseConsumeFilter(typeof(ConsumeExceptionFilter<>), context, x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent)))); - + cfg.UseConsumeFilter(typeof(CultureInfoFilter<>), context, x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent)))); @@ -49,8 +52,67 @@ namespace IRaCIS.Core.API }); + + #region rabitmq obsolute + + //cfg.UsingRabbitMq((context, cfg) => + //{ + // cfg.UsePublishMessageScheduler(); + + // cfg.Host( + // host: "106.14.89.110", + // port: 5672, + // virtualHost: "/", + // configure: hostConfig => + // { + // hostConfig.Username("rabbitmq"); + // hostConfig.Password("rabbitmq"); + // }); + + // cfg.ConfigureEndpoints(context); + //}); + #endregion + + #region Outbox obsolute + + //cfg.AddConfigureEndpointsCallback((context, name, cfg) => + //{ + // cfg.UseEntityFrameworkOutbox(context); + + // //cfg.UseDelayedRedelivery(r => r.Intervals(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(30))); + + // //// 全局重试策略:重试 3 次,每次延迟 5 秒 + // //cfg.UseMessageRetry(retryConfig => + // //{ + // // retryConfig.Interval(3, TimeSpan.FromSeconds(10)); + // //}); + //}); + + //cfg.AddEntityFrameworkOutbox(o => + //{ + // o.UseSqlServer(); + // o.UseBusOutbox(); + //}); + + #endregion + + }); + + + //services.AddOptions() + // .Configure(options => + // { + // options.WaitUntilStarted = true; + // options.StartTimeout = TimeSpan.FromMinutes(1); + // options.StopTimeout = TimeSpan.FromMinutes(1); + // }); + + //services.AddOptions() + // .Configure(options => options.ShutdownTimeout = TimeSpan.FromMinutes(1)); + + //services.AddHostedService(); #endregion From f6252f62c438f071cdf9e620d38ae42a53f7eebd Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 22 Oct 2024 09:57:25 +0800 Subject: [PATCH 3/5] =?UTF-8?q?serilog=20=E5=A2=9E=E5=8A=A0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=91=E7=94=9F=E9=94=99=E8=AF=AF=E5=8F=91=E9=80=81?= =?UTF-8?q?=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/IRaCIS.Core.API.csproj | 1 + IRaCIS.Core.API/Progranm.cs | 9 +-- .../_ServiceExtensions/SerilogSetup.cs | 76 ++++++++++--------- IRaCIS.Core.API/appsettings.Prod_IRC.json | 4 +- IRaCIS.Core.API/appsettings.Test_IRC.json | 4 +- IRaCIS.Core.API/appsettings.US_Prod_IRC.json | 4 +- IRaCIS.Core.API/appsettings.US_Test_IRC.json | 4 +- IRaCIS.Core.API/appsettings.US_Uat_IRC.json | 4 +- IRaCIS.Core.API/appsettings.Uat_IRC.json | 4 +- .../ProjectExceptionFilter.cs | 1 + .../BusinessFilter/_Config/_AppSettings.cs | 4 + 11 files changed, 67 insertions(+), 48 deletions(-) diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index b35be1db0..598b50dde 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -77,6 +77,7 @@ + diff --git a/IRaCIS.Core.API/Progranm.cs b/IRaCIS.Core.API/Progranm.cs index 0863231cd..3384f7c9f 100644 --- a/IRaCIS.Core.API/Progranm.cs +++ b/IRaCIS.Core.API/Progranm.cs @@ -47,6 +47,9 @@ if (string.IsNullOrWhiteSpace(enviromentName)) } #endregion +// Serilog +SerilogExtension.AddSerilogSetup(enviromentName); + var builder = WebApplication.CreateBuilder(new WebApplicationOptions { EnvironmentName = enviromentName @@ -131,8 +134,6 @@ builder.Services.AddDicomSetup(); builder.Services.AddSignalR(); - - //// 添加反伪造服务 //builder.Services.AddAntiforgery(options => //{ @@ -242,10 +243,6 @@ app.MapHealthChecks("/health"); -// Serilog -SerilogExtension.AddSerilogSetup(enviromentName, app.Services); - - try diff --git a/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs index f8eb97fe1..00cef4889 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/SerilogSetup.cs @@ -1,17 +1,22 @@ -using DocumentFormat.OpenXml.Bibliography; +using Amazon.SecurityToken.Model; +using DocumentFormat.OpenXml.Bibliography; +using IRaCIS.Core.Domain.Share; +using Microsoft.Extensions.Configuration.Json; +using Microsoft.Extensions.Configuration; using Serilog; using Serilog.Events; using Serilog.Formatting.Compact; - -//using Serilog.Sinks.Email; +using Serilog.Formatting.Display; using System; +using System.Collections.Generic; +using System.Net; namespace IRaCIS.Core.API { public class SerilogExtension { - public static void AddSerilogSetup(string environment, IServiceProvider serviceProvider) + public static void AddSerilogSetup(string environment) { var config = new LoggerConfiguration() @@ -23,49 +28,48 @@ namespace IRaCIS.Core.API .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning) .MinimumLevel.Override("Hangfire", LogEventLevel.Warning) - //如果有反向代理并不会获取到用户的真实IP - //.Enrich.WithClientIp() - //.Enrich.WithRequestHeader("User-Agent") .Enrich.FromLogContext() .Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health")) - - //https://github.com/serilog/serilog-formatting-compact - .WriteTo.Console() .WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day); - //// 控制台输出 JSON 格式 - //.WriteTo.Console(formatter: new CompactJsonFormatter(), LogEventLevel.Warning), - //// 文件输出 JSON 格式 - //.WriteTo.File(new CompactJsonFormatter(), $"{AppContext.BaseDirectory}Serilogs/.json", rollingInterval: RollingInterval.Day); - ////控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型 - //.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning, - // outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {ClientIp} {SourceContext:l} || {Message} || {Exception} ||end {NewLine}") + #region 根据环境配置是否打开错误发送邮件通知 - //.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day, - // outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {ClientIp} {SourceContext:l} || {Message} || {Exception} ||end {NewLine}"); + //读取配置文件 + var configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = $"appsettings.{environment}.json", ReloadOnChange = true }).Build(); + // 手动绑定配置 + var emailConfig = new SystemEmailSendConfig(); + configuration.GetSection("SystemEmailSendConfig").Bind(emailConfig); + + if (emailConfig.IsOpenErrorNoticeEmail) + { + config.WriteTo.Email(options: new Serilog.Sinks.Email.EmailSinkOptions() + { + From = emailConfig.FromEmail, + To = emailConfig.ErrorNoticeEmailList, + Host = emailConfig.Host, + Port = emailConfig.Port, + Subject = new MessageTemplateTextFormatter("Log Alert - 系统发生了异常,请核查"), + Credentials = new NetworkCredential(emailConfig.FromEmail, emailConfig.AuthorizationCode) + + }, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error); + } + #endregion Log.Logger = config.CreateLogger(); - //.WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。 + #region 废弃-输出Json格式的日志 + //如果有反向代理并不会获取到用户的真实IP + //.Enrich.WithClientIp() + //.Enrich.WithRequestHeader("User-Agent") + //https://github.com/serilog/serilog-formatting-compact + //// 控制台输出 JSON 格式 + //.WriteTo.Console(formatter: new CompactJsonFormatter(), LogEventLevel.Warning), + //// 文件输出 JSON 格式 + //.WriteTo.File(new CompactJsonFormatter(), $"{AppContext.BaseDirectory}Serilogs/.json", rollingInterval: RollingInterval.Day); + #endregion - //if (environment == "Production") - //{ - // config.WriteTo.Email(new EmailConnectionInfo() - // { - // EmailSubject = "系统警告,请速速查看!",//邮件标题 - // FromEmail = "test@extimaging.com",//发件人邮箱 - // MailServer = "smtp.qiye.aliyun.com",//smtp服务器地址 - // NetworkCredentials = new NetworkCredential("test@extimaging.com", "SHzyyl2021"),//两个参数分别是发件人邮箱与客户端授权码 - // Port = 465,//端口号 - // ToEmail = "872297557@qq.com"//收件人 - // }, restrictedToMinimumLevel: LogEventLevel.Error, - // outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [ {Level} {ClientIp} {ClientAgent} {TokenUserRealName} {TokenUserType} ] || [path: {RequestPath} arguments: {RequestBody}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine})"); - //} - - //扩展方法 获取上下文的ip 用户名 用户类型 - //Log.Logger = config.Enrich.WithHttpContextInfo(serviceProvider).CreateLogger(); } } diff --git a/IRaCIS.Core.API/appsettings.Prod_IRC.json b/IRaCIS.Core.API/appsettings.Prod_IRC.json index 1b7b7f0f0..9c63cd9b1 100644 --- a/IRaCIS.Core.API/appsettings.Prod_IRC.json +++ b/IRaCIS.Core.API/appsettings.Prod_IRC.json @@ -70,7 +70,9 @@ "CompanyNameCN": "上海展影医疗科技有限公司", "CompanyShortName": "Extensive Imaging", "CompanyShortNameCN": "展影医疗", - "IsEnv_US": false + "IsEnv_US": false, + "IsOpenErrorNoticeEmail": true, + "ErrorNoticeEmailList": [ "872297557@qq.com" ] }, "SystemPacsConfig": { "Port": "11113", diff --git a/IRaCIS.Core.API/appsettings.Test_IRC.json b/IRaCIS.Core.API/appsettings.Test_IRC.json index 85d1b7163..8ac7cdae1 100644 --- a/IRaCIS.Core.API/appsettings.Test_IRC.json +++ b/IRaCIS.Core.API/appsettings.Test_IRC.json @@ -91,7 +91,9 @@ "CompanyNameCN": "上海展影医疗科技有限公司", "CompanyShortName": "Extensive Imaging", "CompanyShortNameCN": "展影医疗", - "IsEnv_US": false + "IsEnv_US": false, + "IsOpenErrorNoticeEmail": false, + "ErrorNoticeEmailList": ["872297557@qq.com"] }, "SystemPacsConfig": { diff --git a/IRaCIS.Core.API/appsettings.US_Prod_IRC.json b/IRaCIS.Core.API/appsettings.US_Prod_IRC.json index e64ab36a0..db7dbebd0 100644 --- a/IRaCIS.Core.API/appsettings.US_Prod_IRC.json +++ b/IRaCIS.Core.API/appsettings.US_Prod_IRC.json @@ -74,7 +74,9 @@ "CompanyShortName": "Elevate Imaging", "CompanyShortNameCN": "展影医疗", "SiteUrl": "https://lili.elevateimaging.ai/login", - "IsEnv_US": true + "IsEnv_US": true, + "IsOpenErrorNoticeEmail": true, + "ErrorNoticeEmailList": [ "872297557@qq.com" ] }, "SystemPacsConfig": { diff --git a/IRaCIS.Core.API/appsettings.US_Test_IRC.json b/IRaCIS.Core.API/appsettings.US_Test_IRC.json index 98b59be71..717c771f7 100644 --- a/IRaCIS.Core.API/appsettings.US_Test_IRC.json +++ b/IRaCIS.Core.API/appsettings.US_Test_IRC.json @@ -82,7 +82,9 @@ "CompanyShortName": "Elevate Imaging", "CompanyShortNameCN": "展影医疗", "SiteUrl": "https://lili.test.elevateimaging.ai/login", - "IsEnv_US": true + "IsEnv_US": true, + "IsOpenErrorNoticeEmail": false, + "ErrorNoticeEmailList": [ "872297557@qq.com" ] }, "SystemPacsConfig": { diff --git a/IRaCIS.Core.API/appsettings.US_Uat_IRC.json b/IRaCIS.Core.API/appsettings.US_Uat_IRC.json index 7414ffe32..51a821e9b 100644 --- a/IRaCIS.Core.API/appsettings.US_Uat_IRC.json +++ b/IRaCIS.Core.API/appsettings.US_Uat_IRC.json @@ -86,7 +86,9 @@ "CompanyShortName": "Elevate Imaging", "CompanyShortNameCN": "展影医疗", "SiteUrl": "https://lili.test.elevateimaging.ai/login", - "IsEnv_US": true + "IsEnv_US": true, + "IsOpenErrorNoticeEmail": false, + "ErrorNoticeEmailList": [ "872297557@qq.com" ] }, "SystemPacsConfig": { diff --git a/IRaCIS.Core.API/appsettings.Uat_IRC.json b/IRaCIS.Core.API/appsettings.Uat_IRC.json index 6acd423f1..f591b3e19 100644 --- a/IRaCIS.Core.API/appsettings.Uat_IRC.json +++ b/IRaCIS.Core.API/appsettings.Uat_IRC.json @@ -87,7 +87,9 @@ "CompanyNameCN": "上海展影医疗科技有限公司", "CompanyShortName": "Extensive Imaging", "CompanyShortNameCN": "展影医疗", - "IsEnv_US": false + "IsEnv_US": false, + "IsOpenErrorNoticeEmail": false, + "ErrorNoticeEmailList": [ "872297557@qq.com" ] }, "SystemPacsConfig": { diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs index f9fc7aa85..44f3c7005 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ProjectExceptionFilter.cs @@ -55,6 +55,7 @@ public class ProjectExceptionFilter(ILogger _logger, ISt var errorInfo = $"Exception: {exception.Message}[{exception.StackTrace}]" + (exception.InnerException != null ? $" InnerException: {exception.InnerException.Message}[{exception.InnerException.StackTrace}]" : ""); + _logger.LogError(errorInfo); //_logger.LogError(exception, exception.Message); diff --git a/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs b/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs index c89c9a803..e2c6fcddb 100644 --- a/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs +++ b/IRaCIS.Core.Application/BusinessFilter/_Config/_AppSettings.cs @@ -63,6 +63,10 @@ public class SystemEmailSendConfig public string CompanyShortNameCN { get; set; } = string.Empty; public bool IsEnv_US { get; set; } + + public bool IsOpenErrorNoticeEmail { get; set; } + + public List ErrorNoticeEmailList { get; set; } =new List(); } public class SystemEmailSendConfigView From 7c246dcecdfdd6421502265d6efc966cca9d90e5 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 22 Oct 2024 10:15:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=BC=E8=A1=A8?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Common/ExcelExportService.cs | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index bc1d86bf2..b86aeef53 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -1593,53 +1593,7 @@ namespace IRaCIS.Core.Application.Service.Common } - /// - /// 获取阅片标准可以导出的列表 - /// - /// - /// - public async Task> GetTrialReadingCriterionCanExportDocumentList(Guid trialReadingCriterionId) - { - var list = new List(); - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); - - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - - - if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB) - { - list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.EvaluationOfTumorEfficacy }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - } - - else if (criterion.CriterionType == CriterionType.PCWG3) - { - list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - } - else if (criterion.CriterionType == CriterionType.IRECIST1Point1) - { - list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.IRECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - } - else if (criterion.CriterionType == CriterionType.Lugano2014) - { - list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.Lugano2014EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - } - - var result = _commonDocumentRepository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList(); - - foreach (var item in list) - { - item.FileName = result.Where(t => t.Code == item.Code).FirstOrDefault()?.FileName; - } - return list; - } public List DealJudgeMark(ArbitrationRule arbitrationRule, IEnumerable list) where T : OverallTumorEvaluationExport { @@ -2034,6 +1988,58 @@ namespace IRaCIS.Core.Application.Service.Common #endregion #region 通用阅片结果导出 + /// + /// 获取阅片标准可以导出的列表 + /// + /// + /// + public async Task> GetTrialReadingCriterionCanExportDocumentList(Guid trialReadingCriterionId) + { + + var list = new List(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); + + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + + list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + + + + + //if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB) + //{ + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.EvaluationOfTumorEfficacy }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); + //} + + //else if (criterion.CriterionType == CriterionType.PCWG3) + //{ + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); + //} + //else if (criterion.CriterionType == CriterionType.IRECIST1Point1) + //{ + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.IRECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); + //} + //else if (criterion.CriterionType == CriterionType.Lugano2014) + //{ + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.Lugano2014EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); + //} + + var result = _commonDocumentRepository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList(); + + foreach (var item in list) + { + item.FileName = result.Where(t => t.Code == item.Code).FirstOrDefault()?.FileName; + } + return list; + } [HttpPost] public async Task GetCommonEvaluationList_Export(VisitTaskQuery inQuery, [FromServices] IRepository _commonDocumentRepository, From 78c90734b202740e675295f5033b9361599a3264 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 22 Oct 2024 10:54:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?Excel=20=E5=AF=BC=E8=A1=A8=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E6=B5=8B=E8=AF=95=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 14 ++-- .../Service/Common/ExcelExportService.cs | 68 ++++++++++++++----- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 0d73b1ae2..1d6548d52 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -798,13 +798,6 @@ - - - 获取阅片标准可以导出的列表 - - - - 整体肿瘤评估 (目前仅仅 RECIST1.1 多个标准一个接口 Excel 列是一样的 ) @@ -836,6 +829,13 @@ + + + 获取阅片标准可以导出的列表 + + + + 裁判阅片明细表 diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index b86aeef53..bac7d39c6 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -31,7 +31,7 @@ namespace IRaCIS.Core.Application.Service.Common IRepository _systemDocConfirmedUserRepository, IRepository _trialDocNeedConfirmedUserTypeRepository, IRepository _trialDocConfirmedUserRepository, - IRepository _subjectRepository, + IRepository _subjectRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService { @@ -1590,6 +1590,14 @@ namespace IRaCIS.Core.Application.Service.Common //评估病灶明细 DetailedOfEvaluatedLesion = 3, + CommonReading_Export = 4, + CommonReadingDetail_Export = 5, + + CommonJudgeReadingDetail_Export = 6, + + VisitJudgeRatio_Export = 7, + + ReadingPeriodJudgeRatio_Export = 8, } @@ -1756,7 +1764,7 @@ namespace IRaCIS.Core.Application.Service.Common return await ExcelExportHelper.DataExportAsync(StaticData.Export.OverallTumorEvaluation_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(OverallTumorEvaluationExport), criterion.CriterionType); - + } /// @@ -1997,16 +2005,33 @@ namespace IRaCIS.Core.Application.Service.Common { var list = new List(); - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportCatogory.CommonReading_Export }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportCatogory.CommonReadingDetail_Export }); + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportCatogory.CommonJudgeReadingDetail_Export }); + + switch (criterion.ArbitrationRule) + { + case ArbitrationRule.None: + break; + + case ArbitrationRule.Visit: + list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportCatogory.VisitJudgeRatio_Export }); + + break; + case ArbitrationRule.Reading: + list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportCatogory.ReadingPeriodJudgeRatio_Export }); + + break; + case ArbitrationRule.NA: + break; + default: + break; + } //if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB) @@ -2050,7 +2075,7 @@ namespace IRaCIS.Core.Application.Service.Common var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); - var list = await _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect && t.TaskState==TaskState.Freeze)) + var list = await _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect && t.TaskState == TaskState.Freeze)) //访视和全局查询已签名完成的,裁判可以是未签名,未完成的 .Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || (t.ReadingCategory == ReadingCategory.Judge)) @@ -2072,10 +2097,12 @@ namespace IRaCIS.Core.Application.Service.Common .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode)) .WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate) .WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1)) - .ProjectTo(_mapper.ConfigurationProvider, new { readingExportType=inQuery.ReadingExportType, criterionType = criterion.CriterionType, arbitrationRule = criterion.ArbitrationRule, trialReadingCriterionId = inQuery.TrialReadingCriterionId, isEn_Us = _userInfo.IsEn_Us }).ToListAsync(); + .ProjectTo(_mapper.ConfigurationProvider, new { readingExportType = inQuery.ReadingExportType, criterionType = criterion.CriterionType, arbitrationRule = criterion.ArbitrationRule, trialReadingCriterionId = inQuery.TrialReadingCriterionId, isEn_Us = _userInfo.IsEn_Us }).ToListAsync(); list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum).ToList(); + var export_Template = StaticData.Export.CommonReading_Export; + if (inQuery.ReadingExportType == ReadingExportType.JudgeReadingDetailResult) { //R1 R2 两个人的访视都阅片完成了才可以,去除只有一个人阅片完成的访视 @@ -2083,6 +2110,12 @@ namespace IRaCIS.Core.Application.Service.Common //找到只有一个人阅片的受试者 和访视 var exceptVisit = list.GroupBy(t => new { t.SubjectCode, t.TaskName }).Where(g => g.Count() == 1).Select(g => new { g.Key.SubjectCode, g.Key.TaskName }).ToList(); list = list.Where(t => !exceptVisit.Any(ev => ev.SubjectCode == t.SubjectCode && ev.TaskName == t.TaskName)).ToList(); + + export_Template = StaticData.Export.CommonJudgeReadingDetail_Export; + } + if (inQuery.ReadingExportType == ReadingExportType.ReadingDetailResult) + { + export_Template = StaticData.Export.CommonReadingDetail_Export; } var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); @@ -2094,17 +2127,20 @@ namespace IRaCIS.Core.Application.Service.Common exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); - var dynamicColumnConfig = new DynamicColumnConfig() { AutoColumnTitleRowIndex = 2, AutoColumnStartIndex = 6, + var dynamicColumnConfig = new DynamicColumnConfig() + { + AutoColumnTitleRowIndex = 2, + AutoColumnStartIndex = 6, TempalteLastColumnIndex = 8, DynamicItemDicName = "TranslateDicName", DynamicItemValueName = "QuestionValue", DynamicListName = "QuestionAnswerList", - RemoveColunmIndexList = new List() { 1, 7 }, + RemoveColunmIndexList = new List() { }, ColumnNameList = list.FirstOrDefault()?.QuestionAnswerList.Select(t => t.QuestionName).ToList() ?? new List(), TranslateDicNameList = list.FirstOrDefault()?.QuestionAnswerList.Select(t => t.TranslateDicName).ToList() ?? new List() }; - var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.CommonReading_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); + var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") @@ -2190,7 +2226,7 @@ namespace IRaCIS.Core.Application.Service.Common //每次查询必须是单标准的 var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); - + var trialReadingCriterionId = inQuery.TrialReadingCriterionId; Expression> comonTaskFilter = u => u.TrialId == inQuery.TrialId && u.IsAnalysisCreate == false && u.TaskState == TaskState.Effect && u.TrialReadingCriterionId == trialReadingCriterionId; @@ -2225,13 +2261,13 @@ namespace IRaCIS.Core.Application.Service.Common FullName = g.Key.FullName, //访视产生裁判的访视数量 - TotalJudgeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), + TotalJudgeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), JudgeAgreeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.JudgeResultTaskId == t.Id).Count(), }); - + exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(doctorList, _userInfo.TimeZoneId); return await ExcelExportHelper.DataExportAsync(StaticData.Export.VisitJudgeRatio_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment);