From 44f33fb7f0630af35933773766626acf7fc858af Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 14 Nov 2024 10:53:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E7=89=87=E6=8A=A5=E5=91=8A=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/IRaCIS.Core.API.csproj | 12 + .../ReportTemplate_IRECIST_CN_V1.docx | Bin 0 -> 41643 bytes .../ReportTemplate_PCWG3_CN_V1.docx | Bin 0 -> 39087 bytes .../ReportTemplate_RECIST1.1_CN_V1.docx | Bin 0 -> 38990 bytes .../ReadReoprtTemplate/downLoad/file.txt | 0 IRaCIS.Core.Application/Helper/OSSService.cs | 2 + .../IRaCIS.Core.Application.xml | 320 +++++++++++++++ .../Reading/Dto/ReadingCalculateViewModel.cs | 23 ++ .../Reading/Dto/ReadingImageTaskViewModel.cs | 18 + .../Interface/IReadingImageTaskService.cs | 2 + .../ReadingImageTaskService.cs | 25 ++ .../General/GeneralCalculateService.cs | 382 ++++++++++++++++++ .../General/ReadingCalculateService.cs | 130 +++++- .../IRECIST1Point1CalculateService.cs | 290 ++++++++++++- .../ReadingCalculate/IVUSCalculateService.cs | 10 + .../Interface/ICriterionCalculateService.cs | 7 + .../Interface/IGeneralCalculateService.cs | 91 +++++ .../Interface/IReadingCalculateService.cs | 24 +- .../LuganoCalculateService.cs | 10 + .../LuganoWithoutPETCalculateService.cs | 10 + .../ReadingCalculate/OCTCalculateService.cs | 9 + .../ReadingCalculate/PCWG3CalculateService.cs | 211 +++++++++- .../RECIST1Point1CalculateService.cs | 248 +++++++++++- .../RECIST1Point1_BMCalculateService.cs | 247 ++++++++++- .../SelfDefineCalculateService.cs | 11 + 25 files changed, 2076 insertions(+), 6 deletions(-) create mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_IRECIST_CN_V1.docx create mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_PCWG3_CN_V1.docx create mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx create mode 100644 IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/downLoad/file.txt diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.csproj b/IRaCIS.Core.API/IRaCIS.Core.API.csproj index 8ddb0f03d..b85f69250 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.csproj +++ b/IRaCIS.Core.API/IRaCIS.Core.API.csproj @@ -112,6 +112,18 @@ Always + + Always + + + Always + + + Always + + + Always + diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_IRECIST_CN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_IRECIST_CN_V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..02037e28e92a84ea953d61e7269c53da3290d494 GIT binary patch literal 41643 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 PfjWIx0Zj#@oq_%blYoVR literal 0 HcmV?d00001 diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_PCWG3_CN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_PCWG3_CN_V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..c05aef561377725f2f4c350eac90356276d72356 GIT binary patch literal 39087 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%0Asmrp6X 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 literal 0 HcmV?d00001 diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx new file mode 100644 index 0000000000000000000000000000000000000000..44b3c18cfb11c3611ac6bc53781aa598aa5eb382 GIT binary patch literal 38990 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 + + + 空转为横线 + + + + + + + 获取word图片 + + + + + + + + + 获取word图片 + + + + + + + + + 最大宽高 + + + + + + + + + + 获取任务问题答案 + + 问题答案 + 字典数据 + 单位字典 + 任务Id + 任务类型 + + + + + 获取报告No + + + + + + + 获取并复制文件流 + + + + + + + + 获取任务表格问题答案 + + 表格答案 + 字典 + 单位字典 + 任务Id + 病灶类型 + 问题标识 + 索引 + + + + + 获取病灶的图片 rowinfoList要带question的信息 + + + + + 标准和服务对应 @@ -2533,6 +2615,34 @@ + + + 下载阅片报告 + + + + + + + 删除文件 + + + + + + 下载阅片报告流 + + + + + + + + 获取并生成报告URL + + + + 自动计算 并修改值 @@ -2601,6 +2711,13 @@ + + + 下载阅片报告 + + + + 获取Sod的值 @@ -2981,6 +3098,13 @@ + + + 下载阅片报告 + + + + 获取Sod的值 @@ -3110,6 +3234,13 @@ + + + 下载阅片报告 + + + + 获取Sod的值 @@ -3631,6 +3762,13 @@ + + + 下载阅片报告 + + + + 获取阅片的计算数据 @@ -4159,6 +4297,13 @@ + + + 下载阅片报告 + + + + 获取阅片的计算数据 @@ -4337,6 +4482,13 @@ + + + 下载阅片报告 + + + + 删除病灶获取起始病灶序号 @@ -4443,6 +4595,13 @@ + + + 下载阅片报告 + + + + 获取Sod的值 @@ -4694,6 +4853,13 @@ + + + 下载阅片报告 + + + + 获取Sod的值 @@ -4998,6 +5164,13 @@ + + + 下载阅片报告 + + + + 获取阅片的计算数据 @@ -5096,6 +5269,13 @@ + + + 下载阅片报告 + + + + 获取ReadingCalculateDto @@ -5134,6 +5314,96 @@ + + + 获取图片 + + + + + + + + + 获取图片 + + + + + + + + + 下载文件 + + + + + + + + 获取并复制文件流 + + + + + + + 最大宽高 保持比例 + + + + + + + + + + 空转为横线 + + + + + + + 获取病灶的图片 rowinfoList要带question的信息 + + + + + + + + + 获取任务问题答案 + + 问题答案 + 字典数据 + 单位字典 + 任务Id + 任务类型 + + + + + 获取任务表格问题答案 + + 表格答案 + 字典 + 单位字典 + 任务Id + 病灶类型 + 问题标识 + 索引 + + + + + 获取阅片报告 + + + + 自动计算 并修改值 @@ -5182,6 +5452,27 @@ + + + 下载阅片报告 + + + + + + + 获取阅片报告流 + + + + + + + 获取并生成报告URl + + + + SubjectCriteriaEvaluationService @@ -6846,6 +7137,11 @@ 值 + + + 任务Id + + 阅片计算Dto @@ -7486,6 +7782,16 @@ 任务Id + + + 任务Id + + + + + 任务Id + + 问题类型 @@ -11896,6 +12202,20 @@ IR影像阅片 + + + 下载阅片报告 + + + + + + + 获取阅片报告 + + + + 获取阅片的计算数据 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 00e20b823..796d8453a 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -291,6 +291,29 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List SheetNames { get; set; } } + + + public class ExportReportQuestion + { + public string QuestionName { get; set; } + + public QuestionType QuestionType { get; set; } + } + + + public class DownLoadReadReportInDto + { + /// + /// 任务Id + /// + public Guid VisitTaskId { get; set; } + + public Guid DownLoadGuid { get; set; } + } + + + + /// /// 阅片计算Dto /// diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index e165d3563..fcafbd6a3 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -446,6 +446,24 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } + public class CaGetVisitReadReportUrl + { + /// + /// 任务Id + /// + public Guid VisitTaskId { get; set; } + + } + + + public class GenerateReadingReportInDto + { + /// + /// 任务Id + /// + public Guid VisitTaskId { get; set; } + } + public class GetPreviousOtherPicturePathInDto { diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs index 45c59a834..11b73f720 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingImageTaskService.cs @@ -41,5 +41,7 @@ namespace IRaCIS.Core.Application.Contracts Task> GetReadingPastResultList(GetReadingPastResultListInDto inDto); + Task<(List, object)> GetRelatedVisitTask(GetRelatedVisitTaskInDto inDto); + } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 733d7bc52..6d714ca4d 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -68,6 +68,31 @@ namespace IRaCIS.Core.Application.Service + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReport(DownLoadReadReportInDto inDto) + { + return await _readingCalculateService.DownLoadReadReport(inDto); + } + + /// + /// 获取阅片报告 + /// + /// + /// + [HttpPost] + public async Task GetVisitReadReportUrl(GenerateReadingReportInDto inDto) + { + return await _readingCalculateService.GetVisitReadReportUrl(new CaGetVisitReadReportUrl() + { + VisitTaskId = inDto.VisitTaskId, + }); + } + + #region 计算 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs index 5333bcaed..f445bcb6a 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs @@ -3,10 +3,15 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore.Common; +using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using MiniExcelLibs; +using MiniSoftware; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; using System.Data; using System.IO; using System.Text; @@ -21,6 +26,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _readingTableAnswerRowInfoRepository, IRepository _readingQuestionTrialRepository, IRepository _subjectVisitRepository, + IOptionsMonitor _options, IRepository _tumorAssessmentRepository, IRepository _readingTaskQuestionAnswerRepository, IRepository _inspectionFileRepository, @@ -482,5 +488,381 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }); return taskInfoList; } + + + + /// + /// 空转为横线 + /// + /// + /// + public Dictionary StringEmptyTurnedLine(Dictionary myDictionary) + { + foreach (var item in myDictionary) + { + if (item.Value == null) + { + myDictionary[item.Key] = "-"; + } + else if (item.Value.GetType() == typeof(string)) + { + if (item.Value.ToString() == string.Empty || item.Value == null) + { + myDictionary[item.Key] = "-"; + }; + + } + else if (item.Value.GetType() == typeof(List>)) + { + var value = item.Value; + + foreach (var column in value as List>) + { + foreach (var item2 in column) + { + if (item2.Value.ToString() == string.Empty || item.Value == null) + { + column[item2.Key] = "-"; + }; + } + + } + + myDictionary[item.Key] = value; + + } + + } + return myDictionary; + + } + + /// + /// 获取word图片 + /// + /// + /// + /// + /// + public async Task GetWordPicture(string url, string savePath, int width) + { + var resultUrl = await this.FileDownSave(url, savePath); + + int picWidth = 0; + int picHeight = 0; + + + + using (var bitmap = Image.Load(resultUrl)) + { + // 获取图片的宽度和高度 + picWidth = bitmap.Width; + picHeight = bitmap.Height; + } + + var height = width * picHeight / picWidth; + + return new MiniWordPicture() + { + Path = resultUrl, + Height = height, + Width = width + }; + } + + /// + /// 获取word图片 + /// + /// + /// + /// + /// + public async Task GetWordPicture(string url, string savePath, int width, int height) + { + var resultUrl = await this.FileDownSave(url, System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/downLoad")); + + return new MiniWordPicture() + { + Path = resultUrl, + Height = height, + Width = width + }; + } + + /// + /// 最大宽高 + /// + /// + /// + /// + /// + /// + public async Task GetWordPictureMaxWL(string url, string savePath, int width, int height) + { + var resultUrl = await this.FileDownSave(url, savePath); + + + int picWidth = 0; + int picHeight = 0; + using (var bitmap = Image.Load(resultUrl)) + { + // 获取图片的宽度和高度 + picWidth = bitmap.Width; + picHeight = bitmap.Height; + } + + if (picWidth / picHeight > width / height) + { + height = width * picHeight / picWidth; + + } + else + { + width = height * picWidth / picHeight; + + } + + + return new MiniWordPicture() + { + Path = resultUrl, + Height = height, + Width = width + }; + } + + /// + /// 获取任务问题答案 + /// + /// 问题答案 + /// 字典数据 + /// 单位字典 + /// 任务Id + /// 任务类型 + /// + public string GetTaskanswer(List? answerList, List? dictionList, List? unitDictionary, Guid taskId, QuestionType questionType) + { + var answerData = answerList.FirstOrDefault(x => x.VisitTaskId == taskId && x.ReadingQuestionTrial.QuestionType == questionType); + if (answerData == null || answerData.Answer == string.Empty) + { + return string.Empty; + } + var answer = string.Empty; + if (answerData.ReadingQuestionTrial.QuestionGenre == TableQuestionType.Dictionary) + { + answer = dictionList.Where(x => x.Code == answerData.ReadingQuestionTrial.DictionaryCode).SelectMany(x => x.ChildList).Where(x => x.Code == answerData.Answer).Select(x => x.ValueCN).FirstIsNullReturnEmpty(); + } + else + { + answer = answerData.Answer; + } + if (answer != "NA" && answerData.ReadingQuestionTrial.Unit != null && answerData.ReadingQuestionTrial.Unit != ValueUnit.none) + { + answer += " " + unitDictionary.SelectMany(x => x.ChildList).Where(x => x.Code == ((int)answerData.ReadingQuestionTrial.Unit).ToString()).Select(x => x.ValueCN).FirstIsNullReturnEmpty(); + } + if (answer != "NA" && answerData.ReadingQuestionTrial.ValueType == ValueOfType.Percentage) + { + answer += " %"; + + } + + return answer; + } + + + /// + /// 获取报告No + /// + /// + /// + public async Task GetReportExportNo(VisitTask visitTaskInfo) + { + if (visitTaskInfo.ReportExportDate != null && visitTaskInfo.ReportExportNum != null) + { + return visitTaskInfo.ReportExportDate.Value.ToString("yyyyMMdd") + visitTaskInfo.ReportExportNum.ToString().PadLeft(4, '0'); + } + else + { + DateTime today = DateTime.Today; + + + var reportExportNum = await _visitTaskRepository.Where(x => x.TrialId == visitTaskInfo.TrialId && x.ReportExportDate != null && x.ReportExportDate.Value.Date == today).MaxAsync(x => x.ReportExportNum); + reportExportNum = reportExportNum == null ? 0 : reportExportNum; + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskInfo.Id, x => new VisitTask() + { + + ReportExportDate = today, + ReportExportNum = reportExportNum + 1 + }); + + return today.ToString("yyyyMMdd") + (reportExportNum + 1).ToString().PadLeft(4, '0'); + + } + } + + + + /// + /// 获取并复制文件流 + /// + /// + /// + public Stream ReadAndReturnStream(string outputFilePath) + { + byte[] data; + + using (Stream stream = new FileStream(outputFilePath, FileMode.Open, FileAccess.Read)) + { + // 从流中读取数据保存到内存中 + using (MemoryStream memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + data = memoryStream.ToArray(); + } + } + + // 返回内存中的数据作为新的流 + return new MemoryStream(data); + } + + /// + /// 下载并保存 + /// + /// 网络路径 + /// 保存本地的文件夹 + /// A + public async Task FileDownSave(string url, string savePath) + { + try + { + HttpClient httpClient = new HttpClient(); + if (!string.IsNullOrWhiteSpace(url)) + { + string[] strArry = url.Split('/'); + savePath = savePath + "/" + strArry[strArry.Length - 1]; + } + + var t = httpClient.GetByteArrayAsync(url); + t.Wait(); + Stream responseStream = new MemoryStream(t.Result); + Stream stream = new FileStream(savePath, FileMode.Create); + byte[] bArr = new byte[1024]; + int size = responseStream.Read(bArr, 0, bArr.Length); + while (size > 0) + { + stream.Write(bArr, 0, size); + size = responseStream.Read(bArr, 0, bArr.Length); + } + + stream.Close(); + responseStream.Close(); + + return savePath; + } + catch (Exception) + { + + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_ImageNotExist"]); + } + + + } + + /// + /// 获取任务表格问题答案 + /// + /// 表格答案 + /// 字典 + /// 单位字典 + /// 任务Id + /// 病灶类型 + /// 问题标识 + /// 索引 + /// + public string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex) + { + var answerData = tableAnswerList.FirstOrDefault(x => x.VisitTaskId == taskId && x.ReadingQuestionTrial.LesionType == lesionType && x.ReadingTableQuestionTrial.QuestionMark == questionMark && x.RowIndex == rowIndex); + + if (answerData == null || answerData.Answer == string.Empty) + { + return string.Empty; + } + var answer = string.Empty; + if (answerData.ReadingTableQuestionTrial.TableQuestionType == TableQuestionType.Dictionary) + { + answer = dictionList.Where(x => x.Code == answerData.ReadingTableQuestionTrial.DictionaryCode).SelectMany(x => x.ChildList).Where(x => x.Code == answerData.Answer).Select(x => x.ValueCN).FirstIsNullReturnEmpty(); + + } + else + { + answer = answerData.Answer; + + } + if (answer != "NA" && answerData.ReadingTableQuestionTrial.Unit != null && answerData.ReadingTableQuestionTrial.Unit != ValueUnit.none) + { + answer += " " + unitDictionary.SelectMany(x => x.ChildList).Where(x => x.Code == ((int)answerData.ReadingTableQuestionTrial.Unit).ToString()).Select(x => x.ValueCN).FirstIsNullReturnEmpty(); + } + + if (answer != "NA" && answerData.ReadingTableQuestionTrial.ValueType == ValueOfType.Percentage) + { + answer += " %"; + + } + + return answer; + } + + + /// + /// 获取病灶的图片 rowinfoList要带question的信息 + /// + /// + /// + /// + public async Task>> GetLesionPic(List rowinfoList, LesionType lesionType, Guid DownLoadGuid) + { + var lesionRowinfo = rowinfoList.Where(x => x.PicturePath != string.Empty && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.VisitTask.VisitTaskNum).OrderBy(x => x.RowIndex).ToList(); + List> lesionImage = new List>(); + + + var lesionCount = lesionRowinfo.Select(x => x.VisitTask.VisitTaskNum).Distinct().OrderBy(x => x).ToList(); + + int picNum = 0; + + foreach (var num in lesionCount) + { + var picRowinfo = lesionRowinfo.Where(x => x.VisitTask.VisitTaskNum == num).OrderBy(x => x.RowIndex).ToList(); + var picCount = picRowinfo.Count(); + for (int i = 0; i < Math.Ceiling((double)picCount / 2); i++) + { + lesionImage.Add(new Dictionary() + { + { "ImageOneMark",getPicNum(true)+ picRowinfo[2*i].VisitTask.TaskName+" "+picRowinfo[2*i].RowMark}, + { "ImageOneUrl" ,await GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+picRowinfo[2*i].PicturePath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{DownLoadGuid}"),290,390) }, + { "ImageTwoMark",getPicNum(picCount>2*i+1) + (picCount<=2*i+1?string.Empty:picRowinfo[2*i+1].VisitTask.TaskName+" "+picRowinfo[2*i+1].RowMark) }, + { "ImageTwoUrl", picCount<=2*i+1?string.Empty:await GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+picRowinfo[2*i+1].PicturePath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{DownLoadGuid}"),290, 390) }, + + }); + } + } + + string getPicNum(bool isHavePic) + { + if (isHavePic) + { + picNum += 1; + + return $"图{picNum} "; + + } + else + { + return string.Empty; + } + } + + return lesionImage; + + } } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs index 688854f61..89789f83b 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs @@ -1,4 +1,5 @@ -using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; @@ -7,12 +8,14 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; using System.Data; +using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate { [ApiExplorerSettings(GroupName = "Image")] public class ReadingCalculateService(IEnumerable _criterionServices, IRepository _visitTaskRepository, + IOSSService _oSSService, IRepository _readingQuestionCriterionTrialRepository, IStringLocalizer _localizer, IUserInfo _userInfo @@ -81,6 +84,131 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } } + + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReport(DownLoadReadReportInDto inDto) + { + var service = await this.GetService(inDto.VisitTaskId); + if (service != null) + { + inDto.DownLoadGuid = Guid.NewGuid(); + Stream stream = await service.DownLoadReadReportStream(inDto); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + FileStreamResult actionResult = new FileStreamResult(stream, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream")); + + actionResult.FileDownloadName = "ReadReoprtTemplate.docx"; + + + this.DeleteFile(inDto); + return actionResult; + } + else + { + FileStreamResult actionResult = new FileStreamResult(stream, new Microsoft.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream")); + actionResult.FileDownloadName = "ReadReoprtTemplate.pdf"; + this.DeleteFile(inDto); + return actionResult; + } + + } + else + { + throw new BusinessValidationFailedException("error"); + } + } + + /// + /// 删除文件 + /// + /// + + public void DeleteFile(DownLoadReadReportInDto inDto) + { + + + + try + { + File.Delete(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx")); + + } + catch (Exception) + { + + } + + try + { + File.Delete(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.pdf")); + + } + catch (Exception) + { + + } + + } + + /// + /// 下载阅片报告流 + /// + /// + /// + /// + public async Task DownLoadReadReportStream(DownLoadReadReportInDto inDto) + { + var service = await this.GetService(inDto.VisitTaskId); + if (service != null) + { + inDto.DownLoadGuid = Guid.NewGuid(); + var result = await service.DownLoadReadReportStream(inDto); + this.DeleteFile(inDto); + return result; + + } + else + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + } + + /// + /// 获取并生成报告URL + /// + /// + /// + public async Task GetVisitReadReportUrl(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 DownLoadReadReportStream(new DownLoadReadReportInDto() + { + VisitTaskId = inDto.VisitTaskId, + }); + var url = await _oSSService.UploadToOSSAsync(stream, $"ReadingReport/{taskinfo.TrialId.ToString()}/{taskinfo.Id.ToString()}", $"{taskinfo.Subject.Code}_{taskinfo.SourceSubjectVisit.VisitName}.pdf", false); + + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask() + { + ReportExportUrl = url + }); + return url; + + } + + } + + /// /// 自动计算 并修改值 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 33890e963..68e484310 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -1,11 +1,19 @@ -using IRaCIS.Core.Application.Service.Reading.Dto; +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; using MassTransit; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using MiniSoftware; +using System.Runtime.InteropServices; using System.Text; namespace IRaCIS.Core.Application.Service.ReadingCalculate @@ -24,9 +32,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _tumorAssessmentRepository, IGeneralCalculateService _generalCalculateService, IRepository _readingTaskQuestionAnswerRepository, + IRepository _subjectRepository, + IRepository _userRepository, + IServiceProvider ServiceProvider, + IOptionsMonitor _hospital, + IRepository _dictionaryRepository, + IRepository _dicomStudyRepository, + IRepository _subjectPatientRepository, ILogger _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { + + /// /// 获取阅片的计算数据 /// @@ -39,6 +56,277 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(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.SubjectPatientList).FirstNotNullAsync(); + var doctor = await _userRepository.Where(x => x.Id == taskinfo.DoctorUserId).FirstOrDefaultAsync(); + + 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(); + List taskIds = new List() { }; + var relatedVisitTask = await ServiceProvider.GetService().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedCount = relatedVisitTask.Item1.Count(); + + if (relatedCount <= 3) + { + taskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + } + else + { + var count = relatedVisitTask.Item1.Count(); + taskIds.Add(relatedVisitTask.Item1[0].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 2].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 1].VisitTaskId); + + } + relatedVisitTask.Item1 = relatedVisitTask.Item1.Where(x => taskIds.Contains(x.VisitTaskId)).ToList(); + // 所有访视问题的答案 + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + // 单位字典 + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); + var imageProblem = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.ImageQualityAssessment); + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + + #region 获取各个病灶 + List> getLesionInfo(LesionType lesionType) + { + List targetFocusNum = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowIndex).OrderBy(x => x).ToList(); + + List> targetInfo = new List>(); + + foreach (var item in targetFocusNum) + { + var bodyPartDescription = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.BodyPartDescription, item); + + var rowMark = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == item && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowMark).FirstIsNullReturnEmpty(); + + var reportMark = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == item && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.ReportMark).FirstIsNullReturnEmpty(); + + if (reportMark != string.Empty) + { + rowMark = $"{rowMark}({reportMark})"; + + } + Dictionary target = new Dictionary() + { + { "RowMark",rowMark}, + { "Organ",_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Organ,item)+":"+_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Part,item)+ (bodyPartDescription==string.Empty?string.Empty:","+bodyPartDescription) }, + { "FirstVisit",getStateInfo(0,item, lesionType) }, + { "SecondVisit", relatedCount>=2?getStateInfo(1,item,lesionType):string.Empty }, + { "ThirdlyVisit", relatedCount>=3?getStateInfo(2,item,lesionType):string.Empty }, + }; + targetInfo.Add(target); + } + return targetInfo; + } + + string getStateInfo(int index, decimal item, LesionType lesionType) + { + // 非淋巴结取长径 淋巴结取长短径 + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.State, item); + var majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.MajorAxis, item); + + var isLymph = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.IsLymph, item); + var shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.ShortAxis, item); + + var result = string.Empty; + + if (!state.IsNullOrEmpty()) + { + result = state; + + } + + if (!majorAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"L:{majorAxis}" : $",L:{majorAxis}"; + } + + if (isLymph.EqEnum(YesOrNoOrNa.Yes) && !shortAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"S:{shortAxis}" : $",S:{shortAxis}"; + } + + return result; + + } + + #endregion + + + #region 外层问题处理 + + // 获取外层问题 + List> getQuestionAnswerList(List exports) + { + List> questionAnswerList = new List>(); + foreach (var item in exports) + { + Dictionary questionAnswer = new Dictionary() + { + {"Name",item.QuestionName }, + {"FirstVisit", _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[0],item.QuestionType)}, + {"SecondVisit", relatedCount>=2? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[1],item.QuestionType):string.Empty }, + {"ThirdlyVisit", relatedCount>=3? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[2],item.QuestionType):string.Empty }, + }; + questionAnswerList.Add(questionAnswer); + } + return questionAnswerList; + } + + #endregion + + var studyInfo = (await _dicomStudyRepository.Where(x => x.SubjectVisitId == taskinfo.SourceSubjectVisitId).Select(x => new + { + + x.Modalities, + x.StudyTime, + x.BodyPartExamined, + x.Description + + }).OrderBy(x => x.StudyTime).ToListAsync()).Select(x => new Dictionary() { + + { "Modalities",x.Modalities}, + { "StudyTime",x.StudyTime?.ToString("yyyy-MM-dd")}, + { "Description",x.Description}, + { "ImageProblem",imageProblem}, + }).ToList(); + + + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + + + var resultList = new List() + { new ExportReportQuestion (){ QuestionName="靶病灶径线之和(SOD)",QuestionType=QuestionType.SOD}, + new ExportReportQuestion (){ QuestionName="非淋巴结靶病灶长径之和",QuestionType=QuestionType.SumOfDiameter}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化量",QuestionType=QuestionType.SODChange}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化百分比",QuestionType=QuestionType.SODPercent}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化量",QuestionType=QuestionType.LowestIncrease}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化百分比",QuestionType=QuestionType.LowPercent}, + new ExportReportQuestion (){ QuestionName="最低点访视",QuestionType=QuestionType.LowVisit}, + }; + + var isConvertedTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.IsConvertedTask).FirstOrDefaultAsync(); + + if (isConvertedTask) + { + resultList.AddRange(new List() + { new ExportReportQuestion (){ QuestionName="与触发iRECIST访视相比SOD变化量",QuestionType=QuestionType.ComparedTriggeringSODChange}, + new ExportReportQuestion (){ QuestionName="新靶病灶直径之和(iSOD)",QuestionType=QuestionType.ISOD}, + new ExportReportQuestion (){ QuestionName="与触发iRECIST访视相比iSOD变化量",QuestionType=QuestionType.ComparedTriggeringiSODChange}, + + }); + + } + + var assessmentResult = string.Empty; + if (visitInfo.IsBaseLine) + { + var existDisease = answerList.Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).Select(x => x.Answer).FirstIsNullReturnEmpty().EqEnum(ExistDisease.No) ? "不" : string.Empty; + assessmentResult = $"{existDisease}存在疾病"; + } + else + { + assessmentResult = $"整体肿瘤评估结果为{_generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.Tumor)}"; + } + var value = new Dictionary() + { + // { "Logo" ,await _generalCalculateService.GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+_hospital.CurrentValue.HospitalLogoPath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"),110,100) }, + + { "HospitalName",_hospital.CurrentValue.HospitalName } ,// 医院名称 + { "SubjectName",subjectInfo.ShortName }, //患者姓名 + { "SubjectSex", subjectInfo.Sex==string.Empty?string.Empty: subjectInfo.Sex=="M"?"男":"女" }, //患者性别 + { "SubjectAge",subjectInfo.Age==null?string.Empty: subjectInfo.Age +"岁" }, //患者年龄 + { "SubjectCode",subjectPatientList.Select(x=>x.Patient).OrderByDescending(x=>x.CreateTime).Select(x=>x.PatientIdStr).FirstIsNullReturnEmpty() }, //患者编号 + { "VisitName",visitInfo.VisitName }, //访视名称 + { "LatestScanDate",visitInfo.StudyList.Min(x=>x.StudyTime)?.ToString("yyyy-MM-dd") }, //随访日期 + { "CriterionName",taskinfo.TrialReadingCriterion.CriterionName }, //评估标准 + { "AssessmentResult", assessmentResult }, //评估结果 + { "DoctorName",doctor.LastName + doctor.FirstName}, //医生姓名 + { "SignTime",taskinfo.SignTime?.ToString("yyyy-MM-dd HH:mm:ss") }, //签名时间 + { "StudyInfo",studyInfo }, // 检查信息 + { "FirstVisit", relatedVisitTask.Item1[0].TaskName}, + { "SecondVisit",relatedCount>=2?relatedVisitTask.Item1[1].TaskName:string.Empty}, + { "ThirdlyVisit", relatedCount>=3?relatedVisitTask.Item1[2].TaskName:string.Empty}, + + { "TargetInfo", getLesionInfo(LesionType.TargetLesion)}, // 靶病灶 + { "NoTargetInfo", getLesionInfo(LesionType.NonTargetLesions)}, // 非把病灶 + { "NewTargetInfo", getLesionInfo(LesionType.NewLesions)},// 新病灶 + { "NewITargetInfo", getLesionInfo(LesionType.NewTargetLesion)}, // 新靶病灶 + { "NewNoTargetInfo", getLesionInfo(LesionType.NewNonTargetLesion)}, // 新非靶病灶 + { "OtherPreviousNewInfo", getLesionInfo(LesionType.OtherPreviousNewLesion)}, // 其它既往新病灶 + { "TriggeringIRECSITInfo", getLesionInfo(LesionType.TriggeringIRECSIT)}, // 触发iRECSIT后的新病灶 + + + { "TargetImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.TargetLesion,inDto.DownLoadGuid)}, // 靶病灶图片 + { "NoTargetImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NonTargetLesions,inDto.DownLoadGuid)}, // 非靶病灶图片 + { "NewImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewLesions,inDto.DownLoadGuid)}, // 新病灶图片 + + { "NewITargetImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewTargetLesion,inDto.DownLoadGuid)}, // 新靶病灶 + { "NewNoTargetImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewNonTargetLesion,inDto.DownLoadGuid)}, // 新非靶病灶 + { "OtherPreviousNewImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.OtherPreviousNewLesion,inDto.DownLoadGuid)}, // 其它既往新病灶 + { "TriggeringIRECSITImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.TriggeringIRECSIT,inDto.DownLoadGuid)}, // 触发iRECSIT后的新病灶 + + + + + { "Result",getQuestionAnswerList(resultList)}, // 评估结果 + { "Curative",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="靶病灶评估",QuestionType=QuestionType.TargetLesion}, + new ExportReportQuestion (){ QuestionName="非靶病灶评估",QuestionType=QuestionType.NoTargetLesion}, + new ExportReportQuestion (){ QuestionName="存在新病灶",QuestionType=QuestionType.NewLesions}, + new ExportReportQuestion (){ QuestionName="存在疾病",QuestionType=QuestionType.ExistDisease}, + new ExportReportQuestion (){ QuestionName="整体肿瘤评估",QuestionType=QuestionType.Tumor}, + })}, // 疗效结果 + + { "ReportNo",await _generalCalculateService.GetReportExportNo(taskinfo) } , + }; + + value = _generalCalculateService.StringEmptyTurnedLine(value); + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx"); + if (isConvertedTask) + { + templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/ReportTemplate_IRECIST_CN_V1.docx"); + + } + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, value); + 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; + } + } + #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs index 37d479e9f..f28086782 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IVUSCalculateService.cs @@ -45,6 +45,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs index d5dc5048f..9086a7cdf 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ICriterionCalculateService.cs @@ -55,6 +55,13 @@ namespace IRaCIS.Core.Application.Service Task GetReadingCalculationData(GetReadingCalculationDataInDto inDto); + /// + /// 下载阅片报告 + /// + /// + /// + Task DownLoadReadReportStream(DownLoadReadReportInDto inDto); + } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs index 9eaefec17..c1e57ca84 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs @@ -1,6 +1,7 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Http; +using MiniSoftware; using System.Data; namespace IRaCIS.Core.Application.Service @@ -45,5 +46,95 @@ namespace IRaCIS.Core.Application.Service /// /// Task GetDataTableFromUpload(IFormFile file, string pathCode, Guid trialId); + + /// + /// 获取图片 + /// + /// + /// + /// + /// + Task GetWordPicture(string url, string savePath, int width); + + /// + /// 获取图片 + /// + /// + /// + /// + /// + Task GetWordPicture(string url, string savePath, int width, int height); + + /// + /// 下载文件 + /// + /// + /// + /// + Task FileDownSave(string url, string savePath); + + /// + /// 获取并复制文件流 + /// + /// + /// + Stream ReadAndReturnStream(string outputFilePath); + + /// + /// 最大宽高 保持比例 + /// + /// + /// + /// + /// + /// + Task GetWordPictureMaxWL(string url, string savePath, int width, int height); + + /// + /// 空转为横线 + /// + /// + /// + Dictionary StringEmptyTurnedLine(Dictionary myDictionary); + + /// + /// 获取病灶的图片 rowinfoList要带question的信息 + /// + /// + /// + /// + /// + Task>> GetLesionPic(List rowinfoList, LesionType lesionType, Guid downLoadGuid); + + /// + /// 获取任务问题答案 + /// + /// 问题答案 + /// 字典数据 + /// 单位字典 + /// 任务Id + /// 任务类型 + /// + string GetTaskanswer(List? answerList, List? dictionList, List? unitDictionary, Guid taskId, QuestionType questionType); + + /// + /// 获取任务表格问题答案 + /// + /// 表格答案 + /// 字典 + /// 单位字典 + /// 任务Id + /// 病灶类型 + /// 问题标识 + /// 索引 + /// + string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex); + + /// + /// 获取阅片报告 + /// + /// + /// + Task GetReportExportNo(VisitTask visitTaskInfo); } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs index 37449f651..c47890320 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IReadingCalculateService.cs @@ -1,6 +1,7 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using System.Data; namespace IRaCIS.Core.Application.Service @@ -56,7 +57,28 @@ namespace IRaCIS.Core.Application.Service /// Task GetReadingCalculationData(GetReadingCalculationDataInDto inDto); - + + /// + /// 下载阅片报告 + /// + /// + /// + Task DownLoadReadReport(DownLoadReadReportInDto inDto); + + /// + /// 获取阅片报告流 + /// + /// + /// + Task DownLoadReadReportStream(DownLoadReadReportInDto inDto); + + /// + /// 获取并生成报告URl + /// + /// + /// + Task GetVisitReadReportUrl(CaGetVisitReadReportUrl inDto); + } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs index c8a774a9d..8dff69f73 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 DownLoadReadReportStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoWithoutPETCalculateService.cs index e93bfa616..2bc4c7a52 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 DownLoadReadReportStream(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 1878f5413..f2d9daa97 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/OCTCalculateService.cs @@ -28,6 +28,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _readingTaskQuestionAnswerRepository, ILogger _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(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 27c8ccf4a..8eed15ecd 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -1,10 +1,17 @@ -using IRaCIS.Core.Application.Service.Reading.Dto; +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.Share; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using MiniSoftware; +using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate { @@ -21,6 +28,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _noneDicomStudyRepository, IRepository _tumorAssessmentRepository, IGeneralCalculateService _generalCalculateService, + IRepository _subjectRepository, + IRepository _userRepository, + IServiceProvider ServiceProvider, + IOptionsMonitor _hospital, + IRepository _dictionaryRepository, + IRepository _subjectPatientRepository, IRepository _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { @@ -39,6 +52,202 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(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.SubjectPatientList).FirstNotNullAsync(); + var doctor = await _userRepository.Where(x => x.Id == taskinfo.DoctorUserId).FirstOrDefaultAsync(); + + 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(); + List taskIds = new List() { }; + var relatedVisitTask = await ServiceProvider.GetService().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedCount = relatedVisitTask.Item1.Count(); + + if (relatedCount <= 3) + { + taskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + } + else + { + var count = relatedVisitTask.Item1.Count(); + taskIds.Add(relatedVisitTask.Item1[0].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 2].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 1].VisitTaskId); + + } + relatedVisitTask.Item1 = relatedVisitTask.Item1.Where(x => taskIds.Contains(x.VisitTaskId)).ToList(); + // 所有访视问题的答案 + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + // 单位字典 + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); + var imageProblem = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.ImageQualityAssessment); + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + + #region 获取各个病灶 + List> getLesionInfo(LesionType lesionType) + { + List targetFocusNum = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowIndex).OrderBy(x => x).ToList(); + + List> targetInfo = new List>(); + + foreach (var item in targetFocusNum) + { + var bodyPartDescription = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.BodyPartDescription, item); + Dictionary target = new Dictionary() + { + { "RowMark",rowinfoList.Where(x=>x.VisitTaskId == inDto.VisitTaskId &&x.RowIndex==item && x.ReadingQuestionTrial.LesionType == lesionType).Select(x=>x.RowMark).FirstIsNullReturnEmpty() }, + { "Organ",_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Organ,item)+":"+_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Part,item)+ (bodyPartDescription==string.Empty?string.Empty:","+bodyPartDescription) }, + { "FirstVisit",getStateInfo(0,item, lesionType) }, + { "SecondVisit", relatedCount>=2?getStateInfo(1,item,lesionType):string.Empty }, + { "ThirdlyVisit", relatedCount>=3?getStateInfo(2,item,lesionType):string.Empty }, + }; + targetInfo.Add(target); + } + return targetInfo; + } + + string getStateInfo(int index, decimal item, LesionType lesionType) + { + + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.State, item); + var LesionNumber = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.LesionNumber, item); + var result = string.Empty; + + if (lesionType == LesionType.BaselineLesions) + { + return LesionNumber; + } + else + { + return state; + + } + } + + #endregion + + + #region 外层问题处理 + + // 获取外层问题 + List> getQuestionAnswerList(List exports) + { + List> questionAnswerList = new List>(); + foreach (var item in exports) + { + Dictionary questionAnswer = new Dictionary() + { + {"Name",item.QuestionName }, + {"FirstVisit", _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[0],item.QuestionType)}, + {"SecondVisit", relatedCount>=2? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[1],item.QuestionType):string.Empty }, + {"ThirdlyVisit", relatedCount>=3? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[2],item.QuestionType):string.Empty }, + }; + questionAnswerList.Add(questionAnswer); + } + return questionAnswerList; + } + + #endregion + + var studyInfo = (await _dicomStudyRepository.Where(x => x.SubjectVisitId == taskinfo.SourceSubjectVisitId).Select(x => new + { + + x.Modalities, + x.StudyTime, + x.BodyPartExamined, + x.Description + + }).OrderBy(x => x.StudyTime).ToListAsync()).Select(x => new Dictionary() { + + { "Modalities",x.Modalities}, + { "StudyTime",x.StudyTime?.ToString("yyyy-MM-dd")}, + { "Description",x.Description}, + { "ImageProblem",imageProblem}, + }).ToList(); + + + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + + + + var value = new Dictionary() + { + // { "Logo" ,await _generalCalculateService.GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+_hospital.CurrentValue.HospitalLogoPath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"),110,100) }, + { "HospitalName",_hospital.CurrentValue.HospitalName } ,// 医院名称 + { "SubjectName",subjectInfo.ShortName }, //患者姓名 + { "SubjectSex", subjectInfo.Sex==string.Empty?string.Empty: subjectInfo.Sex=="M"?"男":"女" }, //患者性别 + { "SubjectAge",subjectInfo.Age==null?string.Empty: subjectInfo.Age +"岁" }, //患者年龄 + { "SubjectCode",subjectPatientList.Select(x=>x.Patient).OrderByDescending(x=>x.CreateTime).Select(x=>x.PatientIdStr).FirstIsNullReturnEmpty() }, //患者编号 + { "VisitName",visitInfo.VisitName }, //访视名称 + { "LatestScanDate",visitInfo.StudyList.Min(x=>x.StudyTime)?.ToString("yyyy-MM-dd") }, //随访日期 + { "CriterionName",taskinfo.TrialReadingCriterion.CriterionName }, //评估标准 + { "AssessmentResult", _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,inDto.VisitTaskId,QuestionType.SiteVisitForTumorEvaluation) }, //评估结果 + { "DoctorName",doctor.LastName + doctor.FirstName}, //医生姓名 + { "SignTime",taskinfo.SignTime?.ToString("yyyy-MM-dd HH:mm:ss") }, //签名时间 + { "StudyInfo",studyInfo }, // 检查信息 + { "FirstVisit", relatedVisitTask.Item1[0].TaskName}, + { "SecondVisit",relatedCount>=2?relatedVisitTask.Item1[1].TaskName:string.Empty}, + { "ThirdlyVisit", relatedCount>=3?relatedVisitTask.Item1[2].TaskName:string.Empty}, + { "BaselineLesionsInfo", getLesionInfo(LesionType.BaselineLesions)}, // 基线病灶 + { "AlwaysNewLesionsInfo", getLesionInfo(LesionType.AlwaysNewLesions)}, // 既往新病灶 + { "NewTargetInfo", getLesionInfo(LesionType.NewLesions)},// 新病灶 + { "BaselineLesionsImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.BaselineLesions, inDto.DownLoadGuid)}, // 基线病灶 + { "AlwaysNewLesionsImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.AlwaysNewLesions, inDto.DownLoadGuid)}, // 既往新病灶 + { "NewImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewLesions, inDto.DownLoadGuid)}, // 新病灶图片 + { "Result",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="基线病灶计数",QuestionType=QuestionType.BaseLineLesionsCount}, + new ExportReportQuestion (){ QuestionName="新病灶计数",QuestionType=QuestionType.NewLesionsCount}, + new ExportReportQuestion (){ QuestionName="既往新病灶计数",QuestionType=QuestionType.AlwaysNewLesionsCount}, + new ExportReportQuestion (){ QuestionName="自治疗后第二个访视点以来持续的新骨病变数量",QuestionType=QuestionType.NewBoneLesionsCount}, + new ExportReportQuestion (){ QuestionName="与前一个访视间隔天数",QuestionType=QuestionType.DaysBetween}, + })}, // 评估结果 + { "Curative",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="访视点肿瘤评估",QuestionType=QuestionType.SiteVisitForTumorEvaluation}, + new ExportReportQuestion (){ QuestionName="访视阅片备注",QuestionType=QuestionType.AdjustReason}, + })}, // 疗效结果 + + { "ReportNo",await _generalCalculateService.GetReportExportNo(taskinfo) } , + }; + + value = _generalCalculateService.StringEmptyTurnedLine(value); + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/ReportTemplate_PCWG3_CN_V1.docx"); + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, value); + 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; + } + } + #region 删除病灶获取起始病灶序号 /// /// 删除病灶获取起始病灶序号 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index dfeb51bc0..3b1579c37 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -1,10 +1,17 @@ -using IRaCIS.Core.Application.Service.Reading.Dto; +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.Share; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using MiniSoftware; +using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate { @@ -21,6 +28,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _subjectVisitRepository, IRepository _tumorAssessmentRepository, IGeneralCalculateService _generalCalculateService, + IRepository _subjectRepository, + IRepository _userRepository, + IServiceProvider ServiceProvider, + IOptionsMonitor _hospital, + IRepository _dictionaryRepository, + IRepository _dicomStudyRepository, + IRepository _subjectPatientRepository, IRepository _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { @@ -36,6 +50,238 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(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.SubjectPatientList).FirstNotNullAsync(); + var doctor = await _userRepository.Where(x => x.Id == taskinfo.DoctorUserId).FirstOrDefaultAsync(); + + 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(); + List taskIds = new List() { }; + var relatedVisitTask = await ServiceProvider.GetService().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedCount = relatedVisitTask.Item1.Count(); + + if (relatedCount <= 3) + { + taskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + } + else + { + var count = relatedVisitTask.Item1.Count(); + taskIds.Add(relatedVisitTask.Item1[0].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 2].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 1].VisitTaskId); + + } + relatedVisitTask.Item1 = relatedVisitTask.Item1.Where(x => taskIds.Contains(x.VisitTaskId)).ToList(); + // 所有访视问题的答案 + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + // 单位字典 + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); + var imageProblem = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.ImageQualityAssessment); + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + + #region 获取各个病灶 + List> getLesionInfo(LesionType lesionType) + { + List targetFocusNum = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowIndex).OrderBy(x => x).ToList(); + + List> targetInfo = new List>(); + + foreach (var item in targetFocusNum) + { + var bodyPartDescription = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.BodyPartDescription, item); + Dictionary target = new Dictionary() + { + { "RowMark",rowinfoList.Where(x=>x.VisitTaskId == inDto.VisitTaskId &&x.RowIndex==item && x.ReadingQuestionTrial.LesionType == lesionType).Select(x=>x.RowMark).FirstIsNullReturnEmpty() }, + { "Organ",_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Organ,item)+":"+_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Part,item)+ (bodyPartDescription==string.Empty?string.Empty:","+bodyPartDescription) }, + { "FirstVisit",getStateInfo(0,item, lesionType) }, + { "SecondVisit", relatedCount>=2?getStateInfo(1,item,lesionType):string.Empty }, + { "ThirdlyVisit", relatedCount>=3?getStateInfo(2,item,lesionType):string.Empty }, + }; + targetInfo.Add(target); + } + return targetInfo; + } + + string getStateInfo(int index, decimal item, LesionType lesionType) + { + // 非淋巴结取长径 淋巴结取长短径 + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.State, item); + var majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.MajorAxis, item); + + var isLymph = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.IsLymph, item); + var shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.ShortAxis, item); + + var result = string.Empty; + + if (!state.IsNullOrEmpty()) + { + result = state; + + } + + if (!majorAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"L:{majorAxis}" : $",L:{majorAxis}"; + } + + if (isLymph.EqEnum(YesOrNoOrNa.Yes) && !shortAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"S:{shortAxis}" : $",S:{shortAxis}"; + } + + return result; + + } + + #endregion + + + #region 外层问题处理 + + // 获取外层问题 + List> getQuestionAnswerList(List exports) + { + List> questionAnswerList = new List>(); + foreach (var item in exports) + { + Dictionary questionAnswer = new Dictionary() + { + {"Name",item.QuestionName }, + {"FirstVisit", _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[0],item.QuestionType)}, + {"SecondVisit", relatedCount>=2? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[1],item.QuestionType):string.Empty }, + {"ThirdlyVisit", relatedCount>=3? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[2],item.QuestionType):string.Empty }, + }; + questionAnswerList.Add(questionAnswer); + } + return questionAnswerList; + } + + #endregion + + var studyInfo = (await _dicomStudyRepository.Where(x => x.SubjectVisitId == taskinfo.SourceSubjectVisitId).Select(x => new + { + + x.Modalities, + x.StudyTime, + x.BodyPartExamined, + x.Description + + }).OrderBy(x => x.StudyTime).ToListAsync()).Select(x => new Dictionary() { + + { "Modalities",x.Modalities}, + { "StudyTime",x.StudyTime?.ToString("yyyy-MM-dd")}, + { "Description",x.Description}, + { "ImageProblem",imageProblem}, + }).ToList(); + + + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + + var assessmentResult = string.Empty; + if (visitInfo.IsBaseLine) + { + var existDisease = answerList.Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).Select(x => x.Answer).FirstIsNullReturnEmpty().EqEnum(ExistDisease.No) ? "不" : string.Empty; + assessmentResult = $"{existDisease}存在疾病"; + } + else + { + assessmentResult = $"整体肿瘤评估结果为{_generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.Tumor)}"; + } + + var value = new Dictionary() + { + // { "Logo" ,await _generalCalculateService.GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+_hospital.CurrentValue.HospitalLogoPath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"),110,100) }, + + { "HospitalName",_hospital.CurrentValue.HospitalName } ,// 医院名称 + { "SubjectName",subjectInfo.ShortName }, //患者姓名 + { "SubjectSex", subjectInfo.Sex==string.Empty?string.Empty: subjectInfo.Sex=="M"?"男":"女" }, //患者性别 + { "SubjectAge",subjectInfo.Age==null?string.Empty: subjectInfo.Age +"岁" }, //患者年龄 + { "SubjectCode",subjectPatientList.Select(x=>x.Patient).OrderByDescending(x=>x.CreateTime).Select(x=>x.PatientIdStr).FirstIsNullReturnEmpty() }, //患者编号 + { "VisitName",visitInfo.VisitName }, //访视名称 + { "LatestScanDate",visitInfo.StudyList.Min(x=>x.StudyTime)?.ToString("yyyy-MM-dd") }, //随访日期 + { "CriterionName",taskinfo.TrialReadingCriterion.CriterionName }, //评估标准 + { "AssessmentResult", assessmentResult }, //评估结果 + { "DoctorName",doctor.LastName + doctor.FirstName}, //医生姓名 + { "SignTime",taskinfo.SignTime?.ToString("yyyy-MM-dd HH:mm:ss") }, //签名时间 + { "StudyInfo",studyInfo }, // 检查信息 + { "FirstVisit", relatedVisitTask.Item1[0].TaskName}, + { "SecondVisit",relatedCount>=2?relatedVisitTask.Item1[1].TaskName:string.Empty}, + { "ThirdlyVisit", relatedCount>=3?relatedVisitTask.Item1[2].TaskName:string.Empty}, + { "TargetInfo", getLesionInfo(LesionType.TargetLesion)}, // 靶病灶 + { "NoTargetInfo", getLesionInfo(LesionType.NonTargetLesions)}, // 非把病灶 + { "NewTargetInfo", getLesionInfo(LesionType.NewLesions)},// 新病灶 + { "TargetImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.TargetLesion,inDto.DownLoadGuid)}, // 靶病灶图片 + { "NoTargetImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NonTargetLesions,inDto.DownLoadGuid)}, // 非靶病灶图片 + { "NewImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewLesions,inDto.DownLoadGuid)}, // 新病灶图片 + { "Result",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="靶病灶径线之和(SOD)",QuestionType=QuestionType.SOD}, + new ExportReportQuestion (){ QuestionName="非淋巴结靶病灶长径之和",QuestionType=QuestionType.SumOfDiameter}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化量",QuestionType=QuestionType.SODChange}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化百分比",QuestionType=QuestionType.SODPercent}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化量",QuestionType=QuestionType.LowestIncrease}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化百分比",QuestionType=QuestionType.LowPercent}, + new ExportReportQuestion (){ QuestionName="最低点访视",QuestionType=QuestionType.LowVisit}, + })}, // 评估结果 + { "Curative",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="靶病灶评估",QuestionType=QuestionType.TargetLesion}, + new ExportReportQuestion (){ QuestionName="非靶病灶评估",QuestionType=QuestionType.NoTargetLesion}, + new ExportReportQuestion (){ QuestionName="存在新病灶",QuestionType=QuestionType.NewLesions}, + new ExportReportQuestion (){ QuestionName="存在疾病",QuestionType=QuestionType.ExistDisease}, + new ExportReportQuestion (){ QuestionName="整体肿瘤评估",QuestionType=QuestionType.Tumor}, + })}, // 疗效结果 + + { "ReportNo",await _generalCalculateService.GetReportExportNo(taskinfo) } , + }; + + value = _generalCalculateService.StringEmptyTurnedLine(value); + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx"); + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + + + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, value); + + + //// 获取文件夹中的所有文件路径 + 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; + } + } + #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs index 70e446434..bd02df1ff 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs @@ -1,10 +1,18 @@ -using IRaCIS.Core.Application.Service.Reading.Dto; +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; using MassTransit; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using MiniSoftware; +using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate { @@ -21,6 +29,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository _subjectVisitRepository, IRepository _tumorAssessment_RECIST1Point1BM, IGeneralCalculateService _generalCalculateService, + IRepository _subjectRepository, + IRepository _userRepository, + IServiceProvider ServiceProvider, + IOptionsMonitor _hospital, + IRepository _dictionaryRepository, + IRepository _dicomStudyRepository, + IRepository _subjectPatientRepository, IRepository _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService { @@ -36,6 +51,236 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; } + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(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.SubjectPatientList).FirstNotNullAsync(); + var doctor = await _userRepository.Where(x => x.Id == taskinfo.DoctorUserId).FirstOrDefaultAsync(); + + 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(); + List taskIds = new List() { }; + var relatedVisitTask = await ServiceProvider.GetService().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedCount = relatedVisitTask.Item1.Count(); + + if (relatedCount <= 3) + { + taskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + } + else + { + var count = relatedVisitTask.Item1.Count(); + taskIds.Add(relatedVisitTask.Item1[0].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 2].VisitTaskId); + taskIds.Add(relatedVisitTask.Item1[count - 1].VisitTaskId); + + } + relatedVisitTask.Item1 = relatedVisitTask.Item1.Where(x => taskIds.Contains(x.VisitTaskId)).ToList(); + // 所有访视问题的答案 + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + // 单位字典 + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); + var imageProblem = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.ImageQualityAssessment); + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + + #region 获取各个病灶 + List> getLesionInfo(LesionType lesionType) + { + List targetFocusNum = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowIndex).OrderBy(x => x).ToList(); + + List> targetInfo = new List>(); + + foreach (var item in targetFocusNum) + { + var bodyPartDescription = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.BodyPartDescription, item); + Dictionary target = new Dictionary() + { + { "RowMark",rowinfoList.Where(x=>x.VisitTaskId == inDto.VisitTaskId &&x.RowIndex==item && x.ReadingQuestionTrial.LesionType == lesionType).Select(x=>x.RowMark).FirstIsNullReturnEmpty() }, + { "Organ",_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Organ,item)+":"+_generalCalculateService.GetTaskTableAnswer(tableAnswerList,dictionList,unitDictionary,inDto.VisitTaskId,lesionType,QuestionMark.Part,item)+ (bodyPartDescription==string.Empty?string.Empty:","+bodyPartDescription) }, + { "FirstVisit",getStateInfo(0,item, lesionType) }, + { "SecondVisit", relatedCount>=2?getStateInfo(1,item,lesionType):string.Empty }, + { "ThirdlyVisit", relatedCount>=3?getStateInfo(2,item,lesionType):string.Empty }, + }; + targetInfo.Add(target); + } + return targetInfo; + } + + string getStateInfo(int index, decimal item, LesionType lesionType) + { + // 非淋巴结取长径 淋巴结取长短径 + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.State, item); + var majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.MajorAxis, item); + + var isLymph = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.IsLymph, item); + var shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, taskIds[index], lesionType, QuestionMark.ShortAxis, item); + + var result = string.Empty; + + if (!state.IsNullOrEmpty()) + { + result = state; + + } + + if (!majorAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"L:{majorAxis}" : $",L:{majorAxis}"; + } + + if (isLymph.EqEnum(YesOrNoOrNa.Yes) && !shortAxis.IsNullOrEmpty()) + { + result += result == string.Empty ? $"S:{shortAxis}" : $",S:{shortAxis}"; + } + + return result; + + } + + #endregion + + + #region 外层问题处理 + + // 获取外层问题 + List> getQuestionAnswerList(List exports) + { + List> questionAnswerList = new List>(); + foreach (var item in exports) + { + Dictionary questionAnswer = new Dictionary() + { + {"Name",item.QuestionName }, + {"FirstVisit", _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[0],item.QuestionType)}, + {"SecondVisit", relatedCount>=2? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[1],item.QuestionType):string.Empty }, + {"ThirdlyVisit", relatedCount>=3? _generalCalculateService.GetTaskanswer(answerList,dictionList,unitDictionary,taskIds[2],item.QuestionType):string.Empty }, + }; + questionAnswerList.Add(questionAnswer); + } + return questionAnswerList; + } + + #endregion + + var studyInfo = (await _dicomStudyRepository.Where(x => x.SubjectVisitId == taskinfo.SourceSubjectVisitId).Select(x => new + { + + x.Modalities, + x.StudyTime, + x.BodyPartExamined, + x.Description + + }).OrderBy(x => x.StudyTime).ToListAsync()).Select(x => new Dictionary() { + + { "Modalities",x.Modalities}, + { "StudyTime",x.StudyTime?.ToString("yyyy-MM-dd")}, + { "Description",x.Description}, + { "ImageProblem",imageProblem}, + }).ToList(); + + + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + + var assessmentResult = string.Empty; + if (visitInfo.IsBaseLine) + { + var existDisease = answerList.Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).Select(x => x.Answer).FirstIsNullReturnEmpty().EqEnum(ExistDisease.No) ? "不" : string.Empty; + assessmentResult = $"{existDisease}存在疾病"; + } + else + { + assessmentResult = $"整体肿瘤评估结果为{_generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, inDto.VisitTaskId, QuestionType.Tumor)}"; + } + + var value = new Dictionary() + { + // { "Logo" ,await _generalCalculateService.GetWordPictureMaxWL(_options.CurrentValue.MinIO.viewEndpoint+_hospital.CurrentValue.HospitalLogoPath ,System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"),110,100) }, + + { "HospitalName",_hospital.CurrentValue.HospitalName } ,// 医院名称 + { "SubjectName",subjectInfo.ShortName }, //患者姓名 + { "SubjectSex", subjectInfo.Sex==string.Empty?string.Empty: subjectInfo.Sex=="M"?"男":"女" }, //患者性别 + { "SubjectAge",subjectInfo.Age==null?string.Empty: subjectInfo.Age +"岁" }, //患者年龄 + { "SubjectCode",subjectPatientList.Select(x=>x.Patient).OrderByDescending(x=>x.CreateTime).Select(x=>x.PatientIdStr).FirstIsNullReturnEmpty() }, //患者编号 + { "VisitName",visitInfo.VisitName }, //访视名称 + { "LatestScanDate",visitInfo.StudyList.Min(x=>x.StudyTime)?.ToString("yyyy-MM-dd") }, //随访日期 + { "CriterionName",taskinfo.TrialReadingCriterion.CriterionName }, //评估标准 + { "AssessmentResult", assessmentResult }, //评估结果 + { "DoctorName",doctor.LastName + doctor.FirstName}, //医生姓名 + { "SignTime",taskinfo.SignTime?.ToString("yyyy-MM-dd HH:mm:ss") }, //签名时间 + { "StudyInfo",studyInfo }, // 检查信息 + { "FirstVisit", relatedVisitTask.Item1[0].TaskName}, + { "SecondVisit",relatedCount>=2?relatedVisitTask.Item1[1].TaskName:string.Empty}, + { "ThirdlyVisit", relatedCount>=3?relatedVisitTask.Item1[2].TaskName:string.Empty}, + { "TargetInfo", getLesionInfo(LesionType.TargetLesion)}, // 靶病灶 + { "NoTargetInfo", getLesionInfo(LesionType.NonTargetLesions)}, // 非把病灶 + { "NewTargetInfo", getLesionInfo(LesionType.NewLesions)},// 新病灶 + { "TargetImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.TargetLesion,inDto.DownLoadGuid)}, // 靶病灶图片 + { "NoTargetImage",await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NonTargetLesions,inDto.DownLoadGuid)}, // 非靶病灶图片 + { "NewImage", await _generalCalculateService.GetLesionPic(rowinfoList, LesionType.NewLesions,inDto.DownLoadGuid)}, // 新病灶图片 + { "Result",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="靶病灶径线之和(SOD)",QuestionType=QuestionType.SOD}, + new ExportReportQuestion (){ QuestionName="非淋巴结靶病灶长径之和",QuestionType=QuestionType.SumOfDiameter}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化量",QuestionType=QuestionType.SODChange}, + new ExportReportQuestion (){ QuestionName="与基线相比SOD变化百分比",QuestionType=QuestionType.SODPercent}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化量",QuestionType=QuestionType.LowestIncrease}, + new ExportReportQuestion (){ QuestionName="与最低点相比SOD变化百分比",QuestionType=QuestionType.LowPercent}, + new ExportReportQuestion (){ QuestionName="最低点访视",QuestionType=QuestionType.LowVisit}, + })}, // 评估结果 + { "Curative",getQuestionAnswerList(new List() + { new ExportReportQuestion (){ QuestionName="靶病灶评估",QuestionType=QuestionType.TargetLesion}, + new ExportReportQuestion (){ QuestionName="非靶病灶评估",QuestionType=QuestionType.NoTargetLesion}, + new ExportReportQuestion (){ QuestionName="存在新病灶",QuestionType=QuestionType.NewLesions}, + new ExportReportQuestion (){ QuestionName="存在疾病",QuestionType=QuestionType.ExistDisease}, + new ExportReportQuestion (){ QuestionName="整体肿瘤评估",QuestionType=QuestionType.Tumor}, + })}, // 疗效结果 + + { "ReportNo",await _generalCalculateService.GetReportExportNo(taskinfo) } , + }; + + value = _generalCalculateService.StringEmptyTurnedLine(value); + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/ReportTemplate_RECIST1.1_CN_V1.docx"); + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + + + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, value); + + + //// 获取文件夹中的所有文件路径 + 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; + } + } + #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs index c8b2d5060..465775d3e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/SelfDefineCalculateService.cs @@ -2,6 +2,7 @@ using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infra.EFCore.Common; +using IRaCIS.Core.Infrastructure; using MassTransit; using Microsoft.AspNetCore.Mvc; @@ -25,6 +26,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { + /// + /// 下载阅片报告 + /// + /// + /// + public async Task DownLoadReadReportStream(DownLoadReadReportInDto inDto) + { + throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + } + private List siteVisitForTumorList = new List(); ///