From 7e8995a7b210fb42715a0b6ccc56dafa77ebd831 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Mon, 24 Mar 2025 16:15:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E8=82=BF=E7=98=A4=E6=8A=A5?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TumorEvaluation_IRECIST_CN_V1.docx | Bin 15872 -> 0 bytes .../TumorEvaluation_RECIST1.1_CN_V1.docx | Bin 0 -> 16921 bytes .../IRaCIS.Core.Application.xml | 162 +++++++++++ .../Reading/Dto/ExportTumorEvaluationDto.cs | 254 +++++++++++++++++- .../ReadingImageTaskService.cs | 27 ++ .../General/ReadingCalculateService.cs | 92 +++++++ .../IRECIST1Point1CalculateService.cs | 10 + .../ReadingCalculate/IVUSCalculateService.cs | 11 + .../Interface/ICriterionCalculateService.cs | 2 + .../Interface/IReadingCalculateService.cs | 22 ++ .../LuganoCalculateService.cs | 10 + .../LuganoWithoutPETCalculateService.cs | 10 + .../ReadingCalculate/OCTCalculateService.cs | 11 + .../ReadingCalculate/PCWG3CalculateService.cs | 9 + .../RECIST1Point1CalculateService.cs | 224 +++++++++++---- .../RECIST1Point1_BMCalculateService.cs | 10 + .../SelfDefineCalculateService.cs | 9 + IRaCIS.Core.Domain/Allocation/VisitTask.cs | 2 + 18 files changed, 810 insertions(+), 55 deletions(-) delete mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST_CN_V1.docx create mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST_CN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST_CN_V1.docx deleted file mode 100644 index e23c655b97aa6055de7d79117f5afd13b57e945f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15872 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 diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..7e657a619414859911717673585203c2a155583c GIT binary patch literal 16921 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 + + + 获取肿瘤评估报告 + + + + 下载阅片报告 @@ -6781,6 +6788,161 @@ 项目临床数据Id + + + 所有访视的靶病灶列表 + + + + + 访视一 + + + + + 访视二 + + + + + 访视三 + + + + + 靶病灶信息 + + + + + 非靶病灶信息 + + + + + 访视名称 + + + + + 访视序号 + + + + + 检查日期 + + + + + 检查信息 + + + + + 检查信息字符串 + + + + + 是否有新病灶 + + + + + 靶病灶结果 + + + + + 非靶病灶结果 + + + + + 总体结果 + + + + + 医生名称 + + + + + 签名时间 + + + + + 医生签名时间 + + + + + 靶病灶信息 + + + + + 靶病灶总长度 + + + + + 非靶病灶信息 + + + + + 序号 + + + + + 器官 + + + + + 部位 + + + + + 检查号 + + + + + 序列号 + + + + + 图像号 + + + + + 图像号 + + + + + 长度 + + + + + 检查类型 + + + + + 标记 + + 项目中心Code diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs index dab50c7f2..ccfacd9e3 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs @@ -9,6 +9,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class TumorEvaluationInfo { + + public List VisitList { get; set; } } @@ -19,36 +21,124 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public List VisitList { get; set; } + /// + /// 受试者Code + /// + public string SubjectCode { get; set; } =string.Empty; + + public string SubjectName { get; set; } = string.Empty; + + public string ResearchProgramNo { get; set; } = string.Empty; + /// /// 访视一 /// - public ExportVisitData VisitOne { get; set; } + public ExportVisitData VisitOne + { + get + { + return VisitList[0]; + } + } /// /// 访视二 /// - public ExportVisitData VisitTwo { get; set; } - + public ExportVisitData VisitTwo + { + get + { + if (VisitList.Count >= 2) + { + return VisitList[1]; + } + else + { + return new ExportVisitData(); + } + + } + } /// /// 访视三 /// - public ExportVisitData VisitThree { get; set; } + public ExportVisitData VisitThree + { + get + { + if (VisitList.Count >= 3) + { + return VisitList[2]; + } + else + { + return new ExportVisitData(); + } + } + } /// /// 靶病灶信息 /// - public List TargetInfoList { get; set; } + public List TargetInfoList + { + get + { + List targets=new List(); + + var index = 0; + foreach (var item in VisitOne.VisitTargetInfoList) + { + TargetInfo targetInfo = new TargetInfo() + { + Title = item.Title, + VisitOneImgNum = item.VisitImgNum, + VisitOneLength = item.VisitLength.ToString(), + VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitImgNum : string.Empty, + VisitTwoLength = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitLength.ToString() : string.Empty, + VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitTargetInfoList[index].VisitImgNum : string.Empty, + VisitThreeLength = VisitList.Count >= 3 ? VisitThree.VisitTargetInfoList[index].VisitLength.ToString() : string.Empty + }; + targets.Add(targetInfo); + index++; + } + return targets; + + } + } /// /// 非靶病灶信息 /// - public List NoTargetInfoList { get; set; } + public List NoTargetInfoList + { + get + { + List targets = new List(); + + var index = 0; + foreach (var item in VisitOne.VisitNoTargetInfoList) + { + TargetInfo targetInfo = new TargetInfo() + { + Title = item.Title, + VisitOneImgNum = item.VisitImgNum, + VisitOneLength = item.VisitLength.ToString(), + VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, + VisitTwoLength = VisitList.Count >= 2 ? VisitTwo.VisitNoTargetInfoList[index].VisitLength.ToString() : string.Empty, + VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, + VisitThreeLength = VisitList.Count >= 3 ? VisitThree.VisitNoTargetInfoList[index].VisitLength.ToString() : string.Empty + }; + targets.Add(targetInfo); + index++; + } + return targets; + + } + } } - public class NoTargetInfo - { - - } + public class TargetInfo { @@ -74,6 +164,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public string VisitName { get; set; } = string.Empty; + /// + /// 访视序号 + /// + public decimal VisitNum { get; set; } + /// /// 检查日期 /// @@ -89,10 +184,149 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public string CheckInfoStr => string.Join("/", CheckInfoList.Select(x => $"{x.Modalities}、{x.BodyPartExamined}")); + /// + /// 是否有新病灶 + /// + public string HaveNewLesion { get; set; } = string.Empty; + /// + /// 靶病灶结果 + /// + public string TargetResult { get; set; } = string.Empty; + + /// + /// 非靶病灶结果 + /// + public string NoTargetResult { get; set; } = string.Empty; + + /// + /// 总体结果 + /// + public string OverallResult { get; set; } = string.Empty; + + /// + /// 医生名称 + /// + public string DoctorName { get; set; } = string.Empty; + + /// + /// 签名时间 + /// + public string SignTime { get; set; } = string.Empty; + + /// + /// 医生签名时间 + /// + public string DoctorSignTime + { + get + { + return $"{DoctorName}/{SignTime}"; + } + } + + /// + /// 靶病灶信息 + /// + public List VisitTargetInfoList { get; set; } = new List(); + + /// + /// 靶病灶总长度 + /// + public decimal TargetSum + { + get + { + return VisitTargetInfoList.Sum(x => x.VisitLength); + } + } + + + /// + /// 非靶病灶信息 + /// + public List VisitNoTargetInfoList { get; set; } = new List(); } + public class VisitLesionInfo + { + /// + /// 序号 + /// + public string RowMark { get; set; } = string.Empty; + + /// + /// 器官 + /// + public string Organ { get; set; } = string.Empty; + + /// + /// 部位 + /// + public string Part { get; set; } = string.Empty; + + public int Number { get; set; } + + public string Title { + get + { + if (RowMark != string.Empty) + { + return $"{Number}:{RowMark},{Organ}:{Part}"; + } + else + { + return $"{Number}"; + } + + } + } + + /// + /// 检查号 + /// + public int StudyCode { get; set; } + + public Guid? RowId { get; set; } + + /// + /// 序列号 + /// + public int SeriesNumber { get; set; } + + /// + /// 图像号 + /// + public int InstanceNumber { get; set; } + + /// + /// 图像号 + /// + public string VisitImgNum + { + get + { + if (RowId == null) + { + return string.Empty; + } + else + { + return $"{StudyCode}/{SeriesNumber}/{InstanceNumber}"; + } + + } + } + + /// + /// 长度 + /// + public decimal VisitLength { get; set; } + } + + + public class DicomStudyInfo { /// diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index dfe416260..c8b7342fa 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -92,6 +92,33 @@ namespace IRaCIS.Core.Application.Service }); } + /// + /// 下载瘤评估 + /// + /// + /// + [HttpPost] + public async Task DownTumorEvaluation(DownLoadReadReportInDto inDto) + { + return await _readingCalculateService.DownLoadTumorEvaluation(inDto); + } + + /// + /// 获取肿瘤评估 + /// + /// + /// + [HttpPost] + public async Task GetTumorEvaluationUrl(GenerateReadingReportInDto inDto) + { + return await _readingCalculateService.GetTumorEvaluationReportUrl(new CaGetVisitReadReportUrl() + { + VisitTaskId = inDto.VisitTaskId, + }); + } + + + #region 计算 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs index 89789f83b..8ce688dfa 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs @@ -208,6 +208,98 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } + /// + /// 下载肿瘤评估流 + /// + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + var service = await this.GetService(inDto.VisitTaskId); + if (service != null) + { + inDto.DownLoadGuid = Guid.NewGuid(); + var result = await service.DownLoadTumorEvaluationStream(inDto); + this.DeleteFile(inDto); + return result; + + } + else + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + } + + /// + /// 获取肿瘤并生成报告URL + /// + /// + /// + public async Task GetTumorEvaluationReportUrl(CaGetVisitReadReportUrl inDto) + { + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.Subject).Include(x => x.SourceSubjectVisit).FirstNotNullAsync(); + if (taskinfo.ReportExportUrl != string.Empty) + { + return taskinfo.ReportExportUrl; + } + else + { + var stream = await DownLoadTumorEvaluationStream(new DownLoadReadReportInDto() + { + VisitTaskId = inDto.VisitTaskId, + }); + var url = await _oSSService.UploadToOSSAsync(stream, $"ReadingReport/{taskinfo.TrialId.ToString()}/{taskinfo.Id.ToString()}", $"TumorEvaluation_{taskinfo.Subject.Code}_{taskinfo.SourceSubjectVisit.VisitName}.pdf", false); + + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask() + { + TumorEvaluationUrl = url + }); + return url; + + } + + } + + /// + /// 下载肿瘤评估 + /// + /// + /// + /// + public async Task DownLoadTumorEvaluation(DownLoadReadReportInDto inDto) + { + var service = await this.GetService(inDto.VisitTaskId); + if (service != null) + { + inDto.DownLoadGuid = Guid.NewGuid(); + Stream stream = await service.DownLoadTumorEvaluationStream(inDto); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + FileStreamResult actionResult = new FileStreamResult(stream, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream")); + + actionResult.FileDownloadName = "ReadReoprtTemplateTumorEvaluation.docx"; + + + this.DeleteFile(inDto); + return actionResult; + } + else + { + FileStreamResult actionResult = new FileStreamResult(stream, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream")); + actionResult.FileDownloadName = "ReadReoprtTemplateTumorEvaluation.pdf"; + this.DeleteFile(inDto); + return actionResult; + } + + } + else + { + throw new BusinessValidationFailedException("error"); + } + } + /// /// 自动计算 并修改值 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 04331d07f..b0f6fdca0 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -56,6 +56,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs index f28086782..568fe9d7e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs @@ -45,6 +45,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs index 9086a7cdf..8c38f60ad 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs @@ -62,6 +62,8 @@ namespace IRaCIS.Core.Application.Service /// Task DownLoadReadReportStream(DownLoadReadReportInDto inDto); + Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto); + } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs index c47890320..80504817b 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs @@ -80,5 +80,27 @@ namespace IRaCIS.Core.Application.Service Task GetVisitReadReportUrl(CaGetVisitReadReportUrl inDto); + /// + /// 下载阅片报告 + /// + /// + /// + Task DownLoadTumorEvaluation(DownLoadReadReportInDto inDto); + + /// + /// 获取肿瘤评估流 + /// + /// + /// + Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto); + + /// + /// 获取并生成肿瘤评估URl + /// + /// + /// + Task GetTumorEvaluationReportUrl(CaGetVisitReadReportUrl inDto); + + } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs index 27cfc4ef6..2eac4bb95 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs @@ -55,6 +55,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs index 7e6767b22..50bb2d901 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs @@ -29,6 +29,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService, ILuganoCalculateService { + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs index f2d9daa97..515e2a4eb 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs @@ -28,6 +28,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _readingTaskQuestionAnswerRepository, ILogger _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { + + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 4d002e02d..a9a4fd746 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -52,6 +52,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } /// /// 下载阅片报告 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 039b72a41..db4861c89 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -1,8 +1,10 @@ -using IRaCIS.Application.Contracts; + +using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Helper; 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; @@ -11,6 +13,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MiniSoftware; +using System.Linq; using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate @@ -19,6 +22,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate [ApiExplorerSettings(GroupName = "Reading")] public class RECIST1Point1CalculateService(IRepository _readingTableQuestionAnswerRepository, IRepository _visitTaskRepository, + IRepository _dicomInstanceRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _readingTableQuestionTrialRepository, IRepository _readingTableAnswerRowInfoRepository, @@ -50,55 +54,185 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } - ///// - ///// 获取肿瘤评估报告 - ///// - ///// - ///// - //public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) - //{ - // var downFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"); - // Directory.CreateDirectory(downFile); + /// + /// 获取肿瘤评估报告 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + var downFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"); + Directory.CreateDirectory(downFile); - // var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId && x.ReadingCategory == ReadingCategory.Visit) - // .Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); - // var visitInfo = await _subjectVisitRepository.Where(x => x.Id == taskinfo.SourceSubjectVisitId).Include(x => x.StudyList).FirstNotNullAsync(); - // var subjectInfo = await _subjectRepository.Where(x => x.Id == taskinfo.SubjectId).Include(x=>x.Trial).Include(x => x.SubjectPatientList).FirstNotNullAsync(); - // var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId && x.ReadingCategory == ReadingCategory.Visit) + .Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); + var visitInfo = await _subjectVisitRepository.Where(x => x.Id == taskinfo.SourceSubjectVisitId).Include(x => x.StudyList).FirstNotNullAsync(); + var subjectInfo = await _subjectRepository.Where(x => x.Id == taskinfo.SubjectId).Include(x => x.Trial).Include(x => x.SubjectPatientList).FirstNotNullAsync(); + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + var trialQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).ToListAsync(); + var tableQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).ToListAsync(); + var dicotionCode = trialQuestion.Where(x => x.DictionaryCode != string.Empty).Select(x => x.DictionaryCode).Distinct().ToList(); + dicotionCode.AddRange(tableQuestion.Where(x => x.DictionaryCode != string.Empty).Select(x => x.DictionaryCode).Distinct()); + var dictionList = await _dictionaryRepository.Where(x => dicotionCode.Contains(x.Code)).Include(x => x.ChildList).ToListAsync(); + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); - // var value = new Dictionary() - // { - // { "ResearchProgramNo" ,subjectInfo.Trial.ResearchProgramNo }, // 试验方案号 - // { "SubjectName",subjectInfo.ShortName }, //患者姓名 - // { "SubjectCode",subjectPatientList.Select(x=>x.Patient).OrderByDescending(x=>x.CreateTime).Select(x=>x.PatientIdStr).FirstIsNullReturnEmpty() }, //患者编号 + var relatedVisitTask = await ServiceProvider.GetService().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedTaskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + var instanceIdList = rowinfoList.Select(x => x.InstanceId).ToList(); + var instanceList = await _dicomInstanceRepository.Where(x => instanceIdList.Contains(x.Id)).Include(x => x.DicomSerie.DicomStudy).ToListAsync(); + + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + var taskinfoList = await _visitTaskRepository.Where(x => relatedTaskIds.Contains(x.Id)) + .Include(x => x.SourceSubjectVisit).Include(x => x.SourceSubjectVisit.StudyList) + .Include(x => x.DoctorUser).ToListAsync(); + + List exportVisitDatas = taskinfoList + .Select(x => new ExportVisitData() + { + VisitName = x.SourceSubjectVisit.VisitName, + VisitNum = x.VisitTaskNum, + CheckDate = string.Join(",", x.SourceSubjectVisit.StudyList.Where(x => x.StudyTime != null).Select(x => x.StudyTime.Value.ToString("yyyy-MM-dd"))), + CheckInfoList = x.SourceSubjectVisit.StudyList.Select(x => new DicomStudyInfo() + { + BodyPartExamined = x.BodyPartExamined, + Modalities = x.Modalities + }).ToList(), + HaveNewLesion = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NewLesions), + TargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.TargetLesion), + NoTargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NoTargetLesion), + OverallResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.Tumor), + DoctorName = x.DoctorUser.LastName + x.DoctorUser.FirstName, + SignTime = x.SignTime?.ToString("yyyy-MM-dd HH:mm:ss"), + VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion), + VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions), + }).OrderBy(x=>x.VisitNum).ToList(); + + + #region 两个函数 + List getLesionInfo(LesionType lesionType) + { + var targetFocus = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.RowIndex).ToList(); + + + var targetInfo = new List(); + + int num = 1; + foreach (var item in targetFocus) + { + VisitLesionInfo target = new VisitLesionInfo + { + RowMark = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == item.RowIndex && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowMark).FirstIsNullReturnEmpty(), + Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.Organ, item.RowIndex), + Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.Part, item.RowIndex), + Number = num, + StudyCode = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.Code).FirstOrDefault(), + RowId = item.Id, + SeriesNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.SeriesNumber).FirstOrDefault(), + InstanceNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.InstanceNumber).FirstOrDefault(), + VisitLength = getStateInfo(item.VisitTaskId, item.RowIndex, lesionType), + }; + targetInfo.Add(target); + num++; + } + if (lesionType == LesionType.TargetLesion) + { + for (int i = num; i <= 5; i++) + { + VisitLesionInfo target = new VisitLesionInfo + { + Number = i, + }; + targetInfo.Add(target); + i++; + } + + } + + return targetInfo; + } + + decimal getStateInfo(Guid visitTaskid, decimal item, LesionType lesionType) + { + // 非淋巴结取长径 淋巴结取长短径 + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.State, item); + var majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.MajorAxis, item); + + var isLymph = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.IsLymph, item); + var shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.ShortAxis, item); + + var result = string.Empty; + + if (!majorAxis.IsNullOrEmpty()) + { + result = majorAxis; + + } + + if (isLymph.EqEnum(YesOrNoOrNa.Yes) && !shortAxis.IsNullOrEmpty()) + { + result = shortAxis; + } + + return result.IsNullOrEmptyReturn0(); + + } + #endregion + + var researchProgramNo = subjectInfo.Trial.ResearchProgramNo; + var subjectName = subjectInfo.ShortName; + var subjectCode = subjectPatientList.Select(x => x.Patient).OrderByDescending(x => x.CreateTime).Select(x => x.PatientIdStr).FirstIsNullReturnEmpty(); - // { "SubjectName","" }, //患者姓名 - // { "SubjectSex", "" }, //患者性别 - // { "SubjectAge", "" }, //患者年龄 - // { "SubjectCode", "" }, //患者编号 - // { "VisitName", "" }, //访视名称 - // { "LatestScanDate", "" }, //随访日期 - // { "CriterionName", "" }, //评估标准 - // { "AssessmentResult", "" }, //评估结果 - // { "DoctorName", "" }, //医生姓名 - // { "SignTime", "" }, //签名时间 - // { "StudyInfo", new List>() }, // 检查信息 - // { "FirstVisit", "" }, - // { "SecondVisit", "" }, - // { "ThirdlyVisit", "" }, - // { "TargetInfo", new List>() }, // 靶病灶 - // { "NoTargetInfo", new List>() }, // 非把病灶 - // { "NewTargetInfo", new List>() },// 新病灶 - // { "TargetImage", "" }, // 靶病灶图片 - // { "NoTargetImage", "" }, // 非靶病灶图片 - // { "NewImage", "" }, // 新病灶图片 - // { "Result", new List>() }, // 评估结果 - // { "Curative", new List>() }, // 疗效结果 - // { "ReportNo", "" } , - // }; - //} + List resultdata = new List(); + + for (int i = 0; i < (int)Math.Ceiling((double)exportVisitDatas.Count() / 3); i++) + { + ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo + { + ResearchProgramNo = researchProgramNo, + SubjectName = subjectName, + SubjectCode = subjectCode, + VisitList= exportVisitDatas.Skip(i*3).Take(3).ToList(), + }; + } + + + + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx"); + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + + + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, resultdata); + + + //// 获取文件夹中的所有文件路径 + Directory.Delete(downFile, true); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Stream stream = _generalCalculateService.ReadAndReturnStream(outputFilePath); + return stream; + } + else + { + + var pdfurl = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/downLoad"); + FileConvertHelper.ConvertWordToPdf(outputFilePath, pdfurl); + Stream stream = _generalCalculateService.ReadAndReturnStream(pdfurl + $"/{inDto.DownLoadGuid}.pdf"); + return stream; + } + } /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs index b33a08b02..233ad6e6a 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs @@ -51,6 +51,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + /// /// 下载阅片报告 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs index 7c986f08e..cfdb4e37b 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs @@ -25,6 +25,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { + /// + /// 下载肿瘤评估 + /// + /// + /// + public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } /// /// 下载阅片报告 diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index ccece8407..2a711c764 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -342,6 +342,8 @@ public class VisitTask : BaseFullAuditEntity public string ReportExportUrl { get; set; } = string.Empty; + public string TumorEvaluationUrl { get; set; } = string.Empty; + /// /// 是否确认提醒 ///