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 index fb576fc7d..910a854b2 100644 Binary files a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx 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 17ec78301..294e1284e 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -2601,7 +2601,7 @@ - + 获取任务表格问题答案 @@ -5489,7 +5489,7 @@ 任务类型 - + 获取任务表格问题答案 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs index ccfacd9e3..a8bf6bd35 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs @@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string ResearchProgramNo { get; set; } = string.Empty; + public ExportData Lesion { get; set; }=new ExportData(); + /// /// 访视一 /// @@ -123,11 +125,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { Title = item.Title, VisitOneImgNum = item.VisitImgNum, - VisitOneLength = item.VisitLength.ToString(), + VisitOneLength = item.VisitLength!=null? item.VisitLength.Value.ToString():string.Empty, VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitTwoLength = VisitList.Count >= 2 ? VisitTwo.VisitNoTargetInfoList[index].VisitLength.ToString() : string.Empty, + VisitTwoLength = VisitList.Count >= 2&& VisitTwo.VisitNoTargetInfoList[index].VisitLength!=null ? VisitTwo.VisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitThreeLength = VisitList.Count >= 3 ? VisitThree.VisitNoTargetInfoList[index].VisitLength.ToString() : string.Empty + VisitThreeLength = VisitList.Count >= 3&& VisitThree.VisitNoTargetInfoList[index].VisitLength!=null ? VisitThree.VisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty }; targets.Add(targetInfo); index++; @@ -157,6 +159,64 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string VisitThreeLength { get; set; } = string.Empty; } + public class ExportData + { + public string OneVisitName { get; set; } = string.Empty; + + public string OneCheckDate { get; set; } = string.Empty; + + public string OneCheckInfoStr { get; set; } = string.Empty; + + public string OneTargetSum { get; set; } = string.Empty; + + public string OneHaveNewLesion { get; set; } = string.Empty; + + public string OneTargetResult { get; set; } = string.Empty; + + public string OneNoTargetResult { get; set; } = string.Empty; + + public string OneOverallResult { get; set; } = string.Empty; + + public string OneDoctorSignTime { get; set; } = string.Empty; + + public string TwoVisitName { get; set; } = string.Empty; + + public string TwoCheckDate { get; set; } = string.Empty; + + + public string TwoCheckInfoStr { get; set; } = string.Empty; + + public string TwoTargetSum { get; set; } = string.Empty; + + public string TwoHaveNewLesion { get; set; } = string.Empty; + + public string TwoTargetResult { get; set; } = string.Empty; + + public string TwoNoTargetResult { get; set; } = string.Empty; + + public string TwoOverallResult { get; set; } = string.Empty; + + public string TwoDoctorSignTime { get; set; } = string.Empty; + + public string ThreeVisitName { get; set; } = string.Empty; + + public string ThreeCheckDate { get; set; } = string.Empty; + + public string ThreeCheckInfoStr { get; set; } = string.Empty; + + public string ThreeTargetSum { get; set; } = string.Empty; + + public string ThreeHaveNewLesion { get; set; } = string.Empty; + + public string ThreeTargetResult { get; set; } = string.Empty; + + public string ThreeNoTargetResult { get; set; } = string.Empty; + + public string ThreeOverallResult { get; set; } = string.Empty; + + public string ThreeDoctorSignTime { get; set; } = string.Empty; + } + public class ExportVisitData { /// @@ -221,7 +281,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { get { - return $"{DoctorName}/{SignTime}"; + return DoctorName==string.Empty?string.Empty: $"{DoctorName}/{SignTime}"; } } @@ -233,7 +293,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 靶病灶总长度 /// - public decimal TargetSum + public decimal? TargetSum { get { @@ -322,7 +382,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 长度 /// - public decimal VisitLength { get; set; } + public decimal? VisitLength { get; set; } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs index bd52df167..6fbbe51bb 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs @@ -14,6 +14,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using System.Data; using System.IO; +using System.Reflection; using System.Text; namespace IRaCIS.Core.Application.Service.ReadingCalculate @@ -669,13 +670,42 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return answer; } - - /// - /// 获取报告No - /// - /// - /// - public async Task GetReportExportNo(VisitTask visitTaskInfo) + + public void SetPropertyDynamically(object targetObj, string targetPropName, object sourceObj, string prefix) + { + // 1. 解析目标属性名(如"CheckInfoStr") + string basePropName = targetPropName.Replace(prefix, ""); + + // 2. 获取源对象路径(如"VisitOne.CheckInfoStr") + string sourcePath = $"Visit{prefix}.{basePropName}"; + object sourceValue = GetNestedPropertyValue(sourceObj, sourcePath); + + // 3. 赋值给目标属性 + PropertyInfo targetProp = targetObj.GetType().GetProperty(prefix+targetPropName); + if (targetProp != null && sourceValue != null) + { + targetProp.SetValue(targetObj, sourceValue); + } + } + + public object GetNestedPropertyValue(object obj, string path) + { + foreach (string part in path.Split('.')) + { + if (obj == null) return null; + PropertyInfo prop = obj.GetType().GetProperty(part); + if (prop == null) return null; + obj = prop.GetValue(obj); + } + return obj; + } + + /// + /// 获取报告No + /// + /// + /// + public async Task GetReportExportNo(VisitTask visitTaskInfo) { if (visitTaskInfo.ReportExportDate != null && visitTaskInfo.ReportExportNum != null) { @@ -779,7 +809,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// 问题标识 /// 索引 /// - public string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex) + public string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex,bool AutoUnit=true) { var answerData = tableAnswerList.FirstOrDefault(x => x.VisitTaskId == taskId && x.ReadingQuestionTrial.LesionType == lesionType && x.ReadingTableQuestionTrial.QuestionMark == questionMark && x.RowIndex == rowIndex); @@ -798,16 +828,20 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate answer = answerData.Answer; } - if (answer != "NA" && answerData.ReadingTableQuestionTrial.Unit != null && answerData.ReadingTableQuestionTrial.Unit != ValueUnit.none) + if (AutoUnit) { - 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.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 += " %"; + if (answer != "NA" && answerData.ReadingTableQuestionTrial.ValueType == ValueOfType.Percentage) + { + answer += " %"; + } } + return answer; } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs index c1e57ca84..37445abf1 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/IGeneralCalculateService.cs @@ -128,7 +128,7 @@ namespace IRaCIS.Core.Application.Service /// 问题标识 /// 索引 /// - string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex); + string GetTaskTableAnswer(List? tableAnswerList, List? dictionList, List? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex, bool AutoUnit = true); /// /// 获取阅片报告 @@ -136,5 +136,7 @@ namespace IRaCIS.Core.Application.Service /// /// Task GetReportExportNo(VisitTask visitTaskInfo); + + void SetPropertyDynamically(object targetObj, string targetPropName, object sourceObj, string prefix); } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 762c83721..a4726b404 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -15,6 +15,7 @@ using Microsoft.Extensions.Options; using MiniSoftware; using Newtonsoft.Json; using System.Linq; +using System.Reflection; using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate @@ -113,15 +114,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate 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), + VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion,x.Id), + VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions, x.Id), }).OrderBy(x=>x.VisitNum).ToList(); #region 两个函数 - List getLesionInfo(LesionType lesionType) + List getLesionInfo(LesionType lesionType,Guid Visittaskid) { - var targetFocus = rowinfoList.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.RowIndex).ToList(); + var targetFocus = rowinfoList.Where(x => x.VisitTaskId == Visittaskid && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.RowIndex).ToList(); var targetInfo = new List(); @@ -129,11 +130,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate 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), + RowMark = rowinfoList.Where(x => x.VisitTaskId == Visittaskid && x.RowIndex == item.RowIndex && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowMark).FirstIsNullReturnEmpty(), + Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex), + Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, 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, @@ -143,6 +145,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }; targetInfo.Add(target); num++; + } if (lesionType == LesionType.TargetLesion) { @@ -153,7 +156,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Number = i, }; targetInfo.Add(target); - i++; + } } @@ -165,10 +168,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { // 非淋巴结取长径 淋巴结取长短径 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 majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.MajorAxis, item,false); 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 shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.ShortAxis, item, false); var result = string.Empty; @@ -196,6 +199,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate List resultdata = new List(); + List times= new List() { "One", "Two", "Three" }; + List columns=new List() { "VisitName", "CheckDate","CheckInfoStr", "HaveNewLesion", "TargetResult", "NoTargetResult", "OverallResult", "DoctorSignTime" }; for (int i = 0; i < (int)Math.Ceiling((double)exportVisitDatas.Count() / 3); i++) { ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo @@ -205,15 +210,34 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate SubjectCode = subjectCode, VisitList= exportVisitDatas.Skip(i*3).Take(3).ToList(), }; + + export.Lesion = new ExportData() + { + OneTargetSum = export.VisitOne.TargetSum.ToString(), + TwoTargetSum = export.VisitTwo.VisitTargetInfoList.Count()> 0? export.VisitTwo.TargetSum.ToString():string.Empty, + ThreeTargetSum = export.VisitThree.VisitTargetInfoList.Count() > 0 ? export.VisitThree.TargetSum.ToString() : string.Empty, + + + }; + foreach (var time in times) + { + foreach (var column in columns) + { + _generalCalculateService.SetPropertyDynamically(export.Lesion, column, export, time); + } + + } + resultdata.Add(export); } + + var value = new { VisitTaskList = resultdata, }; - 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");