From 32e659c26b96214673cfa7fe782617f4d7ca254e Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 2 Sep 2025 17:09:17 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=8F=91=E5=B8=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
IRaCIS.Core.Application/IRaCIS.Core.Application.xml | 7 +++++++
.../Service/ReadingCalculate/MRECISTHCCCalculateService.cs | 1 +
2 files changed, 8 insertions(+)
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 13c97baf1..7ff383dc8 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -4234,6 +4234,13 @@
+
+
+ 获取肿瘤评估报告
+
+
+
+
下载阅片报告
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs
index d00efab66..5cdf98f50 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs
@@ -1156,6 +1156,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
if (tableAnswerList.Count > 0)
{
+
// 状态为空
errorMassage += _localizer["ReadingCalculate_StatusIsEmpty", string.Join(',', stateIsNullList)] + ",";
}
From 7750b1ba12814e58c9dc01c3cbbb29891ffbcb21 Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Tue, 2 Sep 2025 17:56:13 +0800
Subject: [PATCH 2/2] =?UTF-8?q?BM=E6=8A=A5=E5=91=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../RECIST1Point1_BMCalculateService.cs | 224 +++++++++++++++++-
1 file changed, 223 insertions(+), 1 deletion(-)
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs
index ab5df1c04..2fbee178a 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs
@@ -26,6 +26,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IRepository _readingTableAnswerRowInfoRepository,
IRepository _readingQuestionTrialRepository,
IRepository _organInfoRepository,
+ IRepository _dicomInstanceRepository,
IRepository _readingGlobalTaskInfoRepository,
IRepository _subjectVisitRepository,
IRepository _tumorAssessment_RECIST1Point1BM,
@@ -59,7 +60,228 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
///
public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto)
{
- throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]);
+ 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 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 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, x.Id),
+ VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions, x.Id),
+ }).OrderBy(x => x.VisitNum).ToList();
+
+
+ #region 两个函数
+ List getLesionInfo(LesionType lesionType, Guid Visittaskid)
+ {
+ var targetFocus = rowinfoList.Where(x => x.VisitTaskId == 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 == 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,
+ 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);
+
+ }
+
+ }
+
+ 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, 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, false);
+
+ 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();
+
+
+
+ List resultdata = new List();
+ List times = new List() { "One", "Two", "Three" };
+ List columns = new List() { "VisitName", "CheckDate", "CheckInfoStr", "HaveNewLesion", "TargetResult", "NoTargetResult", "OverallResult", "DoctorSignTime" };
+
+ var forCount = (int)Math.Ceiling((double)exportVisitDatas.Count() / 3);
+ for (int i = 0; i < forCount; i++)
+ {
+ ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo
+ {
+ ResearchProgramNo = researchProgramNo,
+ SubjectName = subjectName,
+ 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);
+ }
+
+ }
+
+ if (i >= forCount - 1)
+ {
+ export.IsLastPage = true;
+ // 之后最后一个任务需要签名
+ var thisVisitListNum = export.VisitList.Count();
+ switch (thisVisitListNum)
+ {
+ case 1:
+ export.Lesion.OneDoctorSign = "签字:";
+ break;
+ case 2:
+ export.Lesion.TwoDoctorSign = "签字:";
+ break;
+ case 3:
+ export.Lesion.ThreeDoctorSign = "签字:";
+ break;
+ }
+
+ }
+ resultdata.Add(export);
+ }
+
+
+
+
+
+ var value = new
+ {
+ VisitTaskList = resultdata,
+ IsLastPage = false,
+ };
+
+
+ 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, 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;
+ }
}
///