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 e23c655b9..000000000 Binary files a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST_CN_V1.docx and /dev/null differ 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 000000000..7e657a619 Binary files /dev/null and b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx differ diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 4e703453e..fc42114d2 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -4614,6 +4614,13 @@ + + + 获取肿瘤评估报告 + + + + 下载阅片报告 @@ -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; + /// /// 是否确认提醒 ///