Merge branch 'Test_HIR_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_HIR_Net8
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2025-03-25 14:09:07 +08:00
commit 7184ea9565
6 changed files with 154 additions and 34 deletions

View File

@ -2601,7 +2601,7 @@
<returns></returns> <returns></returns>
</member> </member>
<!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.FileDownSave(System.String,System.String)" --> <!-- Badly formed XML comment ignored for member "M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.FileDownSave(System.String,System.String)" -->
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.GetTaskTableAnswer(System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Guid,IRaCIS.Core.Domain.Share.LesionType,IRaCIS.Core.Domain.Share.QuestionMark,System.Decimal)"> <member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.GeneralCalculateService.GetTaskTableAnswer(System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Guid,IRaCIS.Core.Domain.Share.LesionType,IRaCIS.Core.Domain.Share.QuestionMark,System.Decimal,System.Boolean)">
<summary> <summary>
获取任务表格问题答案 获取任务表格问题答案
</summary> </summary>
@ -5489,7 +5489,7 @@
<param name="questionType">任务类型</param> <param name="questionType">任务类型</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.IGeneralCalculateService.GetTaskTableAnswer(System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Guid,IRaCIS.Core.Domain.Share.LesionType,IRaCIS.Core.Domain.Share.QuestionMark,System.Decimal)"> <member name="M:IRaCIS.Core.Application.Service.IGeneralCalculateService.GetTaskTableAnswer(System.Collections.Generic.List{IRaCIS.Core.Domain.Models.ReadingTableQuestionAnswer},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Collections.Generic.List{IRaCIS.Core.Domain.Models.Dictionary},System.Guid,IRaCIS.Core.Domain.Share.LesionType,IRaCIS.Core.Domain.Share.QuestionMark,System.Decimal,System.Boolean)">
<summary> <summary>
获取任务表格问题答案 获取任务表格问题答案
</summary> </summary>

View File

@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string ResearchProgramNo { get; set; } = string.Empty; public string ResearchProgramNo { get; set; } = string.Empty;
public ExportData Lesion { get; set; }=new ExportData();
/// <summary> /// <summary>
/// 访视一 /// 访视一
/// </summary> /// </summary>
@ -123,11 +125,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{ {
Title = item.Title, Title = item.Title,
VisitOneImgNum = item.VisitImgNum, 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, 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, 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); targets.Add(targetInfo);
index++; index++;
@ -157,6 +159,64 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string VisitThreeLength { get; set; } = string.Empty; 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 public class ExportVisitData
{ {
/// <summary> /// <summary>
@ -221,7 +281,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{ {
get get
{ {
return $"{DoctorName}/{SignTime}"; return DoctorName==string.Empty?string.Empty: $"{DoctorName}/{SignTime}";
} }
} }
@ -233,7 +293,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// <summary> /// <summary>
/// 靶病灶总长度 /// 靶病灶总长度
/// </summary> /// </summary>
public decimal TargetSum public decimal? TargetSum
{ {
get get
{ {
@ -322,7 +382,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
/// <summary> /// <summary>
/// 长度 /// 长度
/// </summary> /// </summary>
public decimal VisitLength { get; set; } public decimal? VisitLength { get; set; }
} }

View File

@ -14,6 +14,7 @@ using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.PixelFormats;
using System.Data; using System.Data;
using System.IO; using System.IO;
using System.Reflection;
using System.Text; using System.Text;
namespace IRaCIS.Core.Application.Service.ReadingCalculate namespace IRaCIS.Core.Application.Service.ReadingCalculate
@ -670,6 +671,35 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
} }
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;
}
/// <summary> /// <summary>
/// 获取报告No /// 获取报告No
/// </summary> /// </summary>
@ -779,7 +809,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <param name="questionMark">问题标识</param> /// <param name="questionMark">问题标识</param>
/// <param name="rowIndex">索引</param> /// <param name="rowIndex">索引</param>
/// <returns></returns> /// <returns></returns>
public string GetTaskTableAnswer(List<ReadingTableQuestionAnswer>? tableAnswerList, List<Dictionary>? dictionList, List<Dictionary>? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex) public string GetTaskTableAnswer(List<ReadingTableQuestionAnswer>? tableAnswerList, List<Dictionary>? dictionList, List<Dictionary>? 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); var answerData = tableAnswerList.FirstOrDefault(x => x.VisitTaskId == taskId && x.ReadingQuestionTrial.LesionType == lesionType && x.ReadingTableQuestionTrial.QuestionMark == questionMark && x.RowIndex == rowIndex);
@ -798,6 +828,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
answer = answerData.Answer; answer = answerData.Answer;
} }
if (AutoUnit)
{
if (answer != "NA" && answerData.ReadingTableQuestionTrial.Unit != null && answerData.ReadingTableQuestionTrial.Unit != ValueUnit.none) 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(); answer += " " + unitDictionary.SelectMany(x => x.ChildList).Where(x => x.Code == ((int)answerData.ReadingTableQuestionTrial.Unit).ToString()).Select(x => x.ValueCN).FirstIsNullReturnEmpty();
@ -808,6 +840,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
answer += " %"; answer += " %";
} }
}
return answer; return answer;
} }

View File

@ -128,7 +128,7 @@ namespace IRaCIS.Core.Application.Service
/// <param name="questionMark">问题标识</param> /// <param name="questionMark">问题标识</param>
/// <param name="rowIndex">索引</param> /// <param name="rowIndex">索引</param>
/// <returns></returns> /// <returns></returns>
string GetTaskTableAnswer(List<ReadingTableQuestionAnswer>? tableAnswerList, List<Dictionary>? dictionList, List<Dictionary>? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex); string GetTaskTableAnswer(List<ReadingTableQuestionAnswer>? tableAnswerList, List<Dictionary>? dictionList, List<Dictionary>? unitDictionary, Guid taskId, LesionType lesionType, QuestionMark questionMark, decimal rowIndex, bool AutoUnit = true);
/// <summary> /// <summary>
/// 获取阅片报告 /// 获取阅片报告
@ -136,5 +136,7 @@ namespace IRaCIS.Core.Application.Service
/// <param name="visitTaskInfo"></param> /// <param name="visitTaskInfo"></param>
/// <returns></returns> /// <returns></returns>
Task<string> GetReportExportNo(VisitTask visitTaskInfo); Task<string> GetReportExportNo(VisitTask visitTaskInfo);
void SetPropertyDynamically(object targetObj, string targetPropName, object sourceObj, string prefix);
} }
} }

View File

@ -15,6 +15,7 @@ using Microsoft.Extensions.Options;
using MiniSoftware; using MiniSoftware;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace IRaCIS.Core.Application.Service.ReadingCalculate 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), OverallResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.Tumor),
DoctorName = x.DoctorUser.LastName + x.DoctorUser.FirstName, DoctorName = x.DoctorUser.LastName + x.DoctorUser.FirstName,
SignTime = x.SignTime?.ToString("yyyy-MM-dd HH:mm:ss"), SignTime = x.SignTime?.ToString("yyyy-MM-dd HH:mm:ss"),
VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion), VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion,x.Id),
VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions), VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions, x.Id),
}).OrderBy(x=>x.VisitNum).ToList(); }).OrderBy(x=>x.VisitNum).ToList();
#region 两个函数 #region 两个函数
List<VisitLesionInfo> getLesionInfo(LesionType lesionType) List<VisitLesionInfo> 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<VisitLesionInfo>(); var targetInfo = new List<VisitLesionInfo>();
@ -129,11 +130,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
int num = 1; int num = 1;
foreach (var item in targetFocus) foreach (var item in targetFocus)
{ {
VisitLesionInfo target = new VisitLesionInfo 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(), 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, inDto.VisitTaskId, lesionType, QuestionMark.Organ, item.RowIndex), Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex),
Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, inDto.VisitTaskId, lesionType, QuestionMark.Part, item.RowIndex), Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Part, item.RowIndex),
Number = num, Number = num,
StudyCode = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.Code).FirstOrDefault(), StudyCode = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.Code).FirstOrDefault(),
RowId = item.Id, RowId = item.Id,
@ -143,6 +145,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}; };
targetInfo.Add(target); targetInfo.Add(target);
num++; num++;
} }
if (lesionType == LesionType.TargetLesion) if (lesionType == LesionType.TargetLesion)
{ {
@ -153,7 +156,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Number = i, Number = i,
}; };
targetInfo.Add(target); 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 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 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; var result = string.Empty;
@ -196,6 +199,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
List<ExportTumorEvaluationInfo> resultdata = new List<ExportTumorEvaluationInfo>(); List<ExportTumorEvaluationInfo> resultdata = new List<ExportTumorEvaluationInfo>();
List<string> times= new List<string>() { "One", "Two", "Three" };
List<string> columns=new List<string>() { "VisitName", "CheckDate","CheckInfoStr", "HaveNewLesion", "TargetResult", "NoTargetResult", "OverallResult", "DoctorSignTime" };
for (int i = 0; i < (int)Math.Ceiling((double)exportVisitDatas.Count() / 3); i++) for (int i = 0; i < (int)Math.Ceiling((double)exportVisitDatas.Count() / 3); i++)
{ {
ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo
@ -205,16 +210,35 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
SubjectCode = subjectCode, SubjectCode = subjectCode,
VisitList= exportVisitDatas.Skip(i*3).Take(3).ToList(), 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); resultdata.Add(export);
} }
var value = new var value = new
{ {
VisitTaskList = resultdata, VisitTaskList = resultdata,
}; };
var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_CN_V1.docx"); 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"); var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx");