From 3971e65482d8571b3b5849b29d1ac73b3bc9b6a0 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 10 Dec 2025 16:36:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 8 +++---- .../Recurring/QCRecurringEmailConsumer.cs | 24 ++++++++++++++----- .../Service/Document/TrialDocumentService.cs | 18 +++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 6c879191d..7ce34bb53 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -15329,7 +15329,7 @@ QC 影像质疑 - + QC 影像质疑 @@ -15339,7 +15339,7 @@ CRC 影像质疑 - + CRC 影像质疑 @@ -15349,7 +15349,7 @@ 影像质控 发送给QC的 - + 影像质控 发送给QC的 @@ -18222,7 +18222,7 @@ - 测试定时发送 + 测试邮件定时发送 diff --git a/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs b/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs index 84ee27d3a..f3460726c 100644 --- a/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs +++ b/IRaCIS.Core.Application/MassTransit/Recurring/QCRecurringEmailConsumer.cs @@ -25,9 +25,11 @@ public class QCImageQuestionRecurringEventConsumer(IRepository _trialRepo IRepository _trialEmailNoticeConfigRepository, IRepository _trialUserRoleRepository, IRepository _visitTaskRepository, + IOptionsMonitor systemEmailConfig, IRepository _trialSiteUserRoleRepository, IOptionsMonitor _SystemEmailSendConfig) : IConsumer { + private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { var trialId = context.Message.TrialId; @@ -64,8 +66,9 @@ public class QCImageQuestionRecurringEventConsumer(IRepository _trialRepo Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, - user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); + var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), + user.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr, isEn_us, userId); }; @@ -91,8 +94,10 @@ public class CRCImageQuestionRecurringEventConsumer(IRepository _trialRep IRepository _trialUserRoleRepository, IRepository _visitTaskRepository, IRepository _trialSiteUserRoleRepository, + IOptionsMonitor systemEmailConfig, IOptionsMonitor _SystemEmailSendConfig) : IConsumer { + private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { var trialId = context.Message.TrialId; @@ -131,9 +136,10 @@ public class CRCImageQuestionRecurringEventConsumer(IRepository _trialRep Func topicAndHtmlFunc = trialEmailConfig => { var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, + var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), - user.FullName, DateTime.Now, sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); + user.FullName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); return (topicStr, htmlBodyStr, false, userId); @@ -158,8 +164,11 @@ public class ImageQCRecurringEventConsumer(IRepository _trialRepository, IRepository _trialUserRoleRepository, IRepository _visitTaskRepository, IRepository _trialSiteUserRoleRepository, + IOptionsMonitor systemEmailConfig, IOptionsMonitor _SystemEmailSendConfig) : IConsumer { + + private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; public async Task Consume(ConsumeContext context) { var trialId=context.Message.TrialId; @@ -199,9 +208,12 @@ public class ImageQCRecurringEventConsumer(IRepository _trialRepository, Func topicAndHtmlFunc = trialEmailConfig => { + var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo); - var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN, - user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl); + + var htmlContent = isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN; + var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, htmlContent), + 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/Document/TrialDocumentService.cs b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs index 7189d817a..131b4c887 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialDocumentService.cs @@ -121,7 +121,7 @@ namespace IRaCIS.Core.Application.Services } /// - /// 测试定时发送 + /// 测试邮件定时发送 /// /// public async Task TestPush() @@ -139,6 +139,22 @@ namespace IRaCIS.Core.Application.Services return ResponseOutput.Result(true); } + + public async Task TestSendEmail() + { + Task.Run(async () => + { + // 创建独立作用域 + using (var scope = serviceScopeFactory.CreateScope()) + { + // 从新作用域解析服务 + var mediator = scope.ServiceProvider.GetRequiredService(); + await mediator.Publish(new ImageQCRecurringEvent { TrialId= Guid.Parse("08de2254-5d7d-581a-0242-0a0001000000") }); + } + }); + return ResponseOutput.Result(true); + } + /// /// Setting 界面的 项目所有文档列表 /// From f7525942e78b59e4657771f49418260f0fbe723f Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Mon, 15 Dec 2025 14:06:24 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingImageTaskViewModel.cs | 36 ++++ .../ReadingImageTaskService.cs | 10 ++ .../General/ReadingCalculateService.cs | 167 ++++++++++++++++++ .../Interface/IReadingCalculateService.cs | 7 +- IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 18 ++ 5 files changed, 237 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index eca0bb09d..a3a050f72 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -537,6 +537,42 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public new decimal? RowIndex { get; set; } } + public class GetReportsChartDataOutDto + { + public List VisitTaskNameList { get; set; } + + public List LatestScanDateList { get; set; } + + /// + /// 单位 + /// + public ValueUnit? Unit { get; set; } + + public List ChartDataList { get; set; } + + + } + + public class ReportChartData + { + public string Name { get; set; } + public List Value { get; set; } + } + + public class GetReportsChartDataInDto + { + public Guid VisitTaskId { get; set; } + + public Guid TrialId { get; set; } + + public Guid? QuestionId { get; set; } + + public Guid? TableQuestionId { get; set; } + + public decimal? RowIndex { get; set; } + + public ReportChartType? ReportChartTypeEnum { get; set; } + } public class GetPreviousOtherPicturePathInDto diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index d5b7ad04b..6fb412f29 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -78,6 +78,16 @@ namespace IRaCIS.Core.Application.Service { + /// + /// 获取报告图表数据 + /// + /// + /// + [HttpPost] + public async Task GetReportsChartData(GetReportsChartDataInDto inDto) + { + return await _readingCalculateService.GetReportsChartData(inDto); + } #region 计算 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs index 61406ff9a..ce916acd4 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs @@ -3,6 +3,7 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infrastructure; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -42,7 +43,173 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate {CriterionType.mRECISTHCC,typeof(MRECISTHCCCalculateService) }, }; + /// + /// 获取报告图表数据 + /// + /// + /// + public async Task GetReportsChartData(GetReportsChartDataInDto inDto) + { + var criterionId = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.TrialReadingCriterionId).FirstNotNullAsync(); + var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterionId).Select(x => x.CriterionType).FirstOrDefaultAsync(); + + var data = await GetReadingReportEvaluation(new GetReadingReportEvaluationInDto() + { + TrialId = inDto.TrialId, + VisitTaskId = inDto.VisitTaskId, + }); + + GetReportsChartDataOutDto result = new GetReportsChartDataOutDto() + { + VisitTaskNameList = data.VisitTaskList.Select(x => x.BlindName).ToList(), + LatestScanDateList = data.VisitTaskList.Select(x => x.LatestScanDate).ToList(), + ChartDataList = new List() { }, + }; + + + result.VisitTaskNameList = data.VisitTaskList.Select(x => x.BlindName).ToList(); + + if (inDto.ReportChartTypeEnum != null) + { + switch (inDto.ReportChartTypeEnum) + { + case ReportChartType.Target: + { + // 这是病灶 + var target = data.TaskQuestions.SelectMany(x => x.Childrens) + .Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.Childrens) + .ToList(); + + + foreach (var item in target) + { + ReportChartData chartData = new ReportChartData() + { + Name = item.QuestionName, + Value = new List(), + }; + + for (var i = 0; i < result.VisitTaskNameList.Count; i++) + { + + switch (criterionType) + { + case CriterionType.RECIST1Point1: + case CriterionType.RECIST1Pointt1_MB: + case CriterionType.mRECISTHCC: + case CriterionType.IRECIST1Point1: + // 淋巴结的短径 + if (item.Childrens.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer[i].Answer.EqEnum(ReadingYesOrNo.Yes))) + { + chartData.Value.Add(item.Childrens.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer[i].Answer).FirstOrDefault()); + result.Unit = item.Childrens.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Unit).FirstOrDefault(); + } + else + { + chartData.Value.Add(item.Childrens.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer[i].Answer).FirstOrDefault()); + result.Unit = item.Childrens.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Unit).FirstOrDefault(); + } + break; + + case CriterionType.Lugano2014: + case CriterionType.Lugano2014WithoutPET: + chartData.Value.Add(item.Childrens.Where(x => x.QuestionMark == QuestionMark.PPD).Select(x => x.Answer[i].Answer).FirstOrDefault()); + result.Unit = item.Childrens.Where(x => x.QuestionMark == QuestionMark.PPD).Select(x => x.Unit).FirstOrDefault(); + break; + } + + + } + + result.ChartDataList.Add(chartData); + } + + } + break; + + case ReportChartType.BaseLineTarget: + // 这是病灶 + var baseTarget = data.TaskQuestions.SelectMany(x => x.Childrens) + .Where(x => x.LesionType == LesionType.BaselineLesions).SelectMany(x => x.Childrens) + .ToList(); + + foreach (var item in baseTarget) + { + ReportChartData chartData = new ReportChartData() + { + Name = item.QuestionName, + Value = new List(), + }; + + for (var i = 0; i < result.VisitTaskNameList.Count; i++) + { + + chartData.Value.Add(item.Childrens.Where(x => x.QuestionMark == QuestionMark.LesionNumber).Select(x => x.Answer[i].Answer).FirstOrDefault()); + result.Unit = item.Childrens.Where(x => x.QuestionMark == QuestionMark.LesionNumber).Select(x => x.Unit).FirstOrDefault(); + + + } + + result.ChartDataList.Add(chartData); + } + break; + default: + break; + } + } + else if (inDto.QuestionId != null) + { + var question = data.TaskQuestions.SelectMany(x => x.Childrens) + .Where(x => x.QuestionId == inDto.QuestionId.Value).FirstOrDefault(); + if (question != null) + { + result.Unit = question.Unit; + ReportChartData chartData = new ReportChartData() + { + Name = question.QuestionName, + Value = new List(), + }; + foreach (var answer in question.Answer) + { + chartData.Value.Add(answer.Answer); + } + result.ChartDataList.Add(chartData); + } + + } + else + { + var lesion = data.TaskQuestions + // 问题 靶病灶 + .SelectMany(x => x.Childrens) + // 病灶 + .SelectMany(x => x.Childrens).Where(x => x.RowIndex == inDto.RowIndex) + // 表格问题 + .SelectMany(x => x.Childrens).Where(x => x.TableQuestionId == inDto.TableQuestionId) + + .FirstOrDefault(); + + if (lesion != null) + { + result.Unit = lesion.Unit; + ReportChartData chartData = new ReportChartData() + { + Name = lesion.QuestionName, + Value = new List(), + }; + foreach (var answer in lesion.Answer) + { + chartData.Value.Add(answer.Answer); + } + result.ChartDataList.Add(chartData); + } + + + } + + return result; + } /// /// 阅片导入 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs index 53cb9f726..d43ed69d3 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs @@ -14,8 +14,13 @@ namespace IRaCIS.Core.Application.Service /// Task CalculateTask(CalculateTaskInDto inDto); + /// + /// 获取报告图表数据 + /// + /// + /// + Task GetReportsChartData(GetReportsChartDataInDto inDto); - /// /// 验证访视提交 diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index c29e87765..e95738f52 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -621,6 +621,24 @@ namespace IRaCIS.Core.Domain.Share Min = 9 } + /// + /// 阅片图表类型 + /// + public enum ReportChartType + { + /// + /// 靶病灶 + /// + Target = 0, + + + /// + /// 基线病灶 + /// + BaseLineTarget = 1, + + } + /// /// 数值单位 ///