From e070a78872f85d8e2c33411c44f6d7345e9e2a68 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Mon, 29 Dec 2025 13:37:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E5=8A=9F=E8=83=BD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingImageTaskViewModel.cs | 15 ++ .../General/ReadingCalculateService.cs | 226 +++++++++++------- 2 files changed, 152 insertions(+), 89 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index e4e6f8eb1..d7b052aba 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -491,6 +491,21 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List Value { get; set; } } + public class GetReportsChartTypeDataInDto + { + public ReportChartType ReportChartTypeEnum { get; set; } + + public CriterionType CriterionType { get; set; } + public GetReadingReportEvaluationOutDto Data { get; set; } + } + + public class GetReportsChartSummaryInDto + { + public Guid SubjectId { get; set; } + + public CriterionType CriterionType { get; set; } + } + public class GetReportsChartDataInDto { public Guid VisitTaskId { get; set; } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs index e59d61d3f..242cfe12f 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs @@ -76,14 +76,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate await _readingImportFileRepository.AddAsync(new ReadingImportFile() { - + FilePath = ossRelativePath, VisitTaskId = visitTaskId, TrialId = visitTaskInfo.TrialId, SubjectId = visitTaskInfo.SubjectId, SubjectVisitId = visitTaskInfo.SourceSubjectVisitId, TrialReadingCriterionId = visitTaskInfo.TrialReadingCriterionId, - TableName= tableName, + TableName = tableName, }); @@ -260,103 +260,26 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate VisitTaskId = inDto.VisitTaskId, }); - GetReportsChartDataOutDto result = new GetReportsChartDataOutDto() + GetReportsChartDataOutDto result = new GetReportsChartDataOutDto() { VisitTaskNameList = data.VisitTaskList.Select(x => x.BlindName).ToList(), LatestScanDateList = data.VisitTaskList.Select(x => x.LatestScanDate).ToList(), - ChartDataList =new List() { }, + ChartDataList = new List() { }, }; - + result.VisitTaskNameList = data.VisitTaskList.Select(x => x.BlindName).ToList(); if (inDto.ReportChartTypeEnum != null) { - switch (inDto.ReportChartTypeEnum) + var reportData = await GetReportsChartTypeData(new GetReportsChartTypeDataInDto() { - 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; - } + CriterionType = criterionType, + Data = data, + ReportChartTypeEnum = inDto.ReportChartTypeEnum.Value, + }); + result.ChartDataList = reportData.ChartDataList; + result.Unit = reportData.Unit; } else if (inDto.QuestionId != null) { @@ -411,6 +334,131 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return result; } + private async Task GetReportsChartTypeData(GetReportsChartTypeDataInDto inDto) + { + var visitTaskNameList = inDto.Data.VisitTaskList.Select(x => x.BlindName).ToList(); + GetReportsChartDataOutDto result = new GetReportsChartDataOutDto() { }; + switch (inDto.ReportChartTypeEnum) + { + case ReportChartType.Target: + { + // 这是病灶 + var target = inDto.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 < visitTaskNameList.Count; i++) + { + + switch (inDto.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 = inDto.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; + } + + return result; + } + + /// + /// 获取报告图表汇总 + /// + /// + /// + public async Task GetReportsChartSummary(GetReportsChartSummaryInDto inDto) + { + var r1Data = await GetData(new List() { Arm.SingleReadingArm, Arm.DoubleReadingArm1 }); + var r2Data = await GetData(new List() { Arm.DoubleReadingArm2 }); + async Task GetData(List arms) + { + var data = new GetReadingReportEvaluationOutDto() { }; + var task = await _visitTaskRepository.Where(x => + x.SubjectId == inDto.SubjectId + && arms.Contains(x.ArmEnum) + && x.ReadingTaskState == ReadingTaskState.HaveSigned + && x.TaskState == TaskState.Effect + && x.TrialReadingCriterion.CriterionType == inDto.CriterionType + ).OrderByDescending(x => x.VisitTaskNum).FirstOrDefaultAsync(); + if (task != null) + { + data = await GetReadingReportEvaluation(new GetReadingReportEvaluationInDto() + { + TrialId = task.TrialId, + VisitTaskId = task.Id, + }); + } + return data; + } + + } + /// /// 获取阅片报告 ///