From d1ae5007352c767aadfc453a7d0a185ef5f60bc5 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 18 Sep 2025 10:00:41 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9PCWG=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 17 +- .../Reading/Dto/ReadingCalculateViewModel.cs | 8 +- .../General/GeneralCalculateService.cs | 5 +- .../ReadingCalculate/PCWG3CalculateService.cs | 207 ++++++++++++++---- 4 files changed, 187 insertions(+), 50 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index d497e69d9..c25be1f22 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -4847,11 +4847,26 @@ - + + + 获取肿瘤评估 逻辑抽离 + + + + + + + + 前端获取访视点肿瘤评估 + + + + 修改上一次访视结果 并且计算是不是PD + diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index b6451ed74..ff6e8151c 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -319,7 +319,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } - + public class FrontGetSiteVisitForTumorEvaluationInDto + { + public Guid VisitTaskId { get; set; } + public int NumberOfDaysBetween { get; set; } + } /// @@ -399,6 +403,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public string Answer { get; set; } + public string PCWGInterimAnswer { get; set; } + /// /// 问题名称 /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs index d042403ea..17fa0e2cf 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs @@ -207,7 +207,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var questionAnswers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).Select(x => new { x.ReadingQuestionTrialId, - x.Answer + x.Answer, + x.PCWGInterimAnswer, }).ToListAsync(); var tableQuestion = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).Include(x => x.ReadingTableQuestionTrial).Select(x => new TableQuestionInfo() @@ -226,7 +227,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { item.Answer = questionAnswers.Where(y => y.ReadingQuestionTrialId == item.QuestionId).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; - + item.PCWGInterimAnswer = questionAnswers.Where(y => y.ReadingQuestionTrialId == item.QuestionId).Select(x => x.PCWGInterimAnswer).FirstOrDefault() ?? string.Empty; var thisItemRowInfo = rowInfoList.Where(x => x.QuestionId == item.QuestionId).ToList(); var thisItemTableQuestions = tableQuestion.Where(x => x.QuestionId == item.QuestionId).ToList(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 090b46956..4e6ca5b72 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -1,8 +1,10 @@ -using IRaCIS.Application.Contracts; +using DocumentFormat.OpenXml.Spreadsheet; +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; @@ -12,6 +14,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MiniSoftware; +using NPOI.SS.Formula.Functions; using System.Runtime.InteropServices; namespace IRaCIS.Core.Application.Service.ReadingCalculate @@ -753,6 +756,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate public async Task TestCalculate(Guid visitTaskId, QuestionType type) { ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(visitTaskId); + // 只获取当前的 不会获取上一次临时修改的结果 + foreach (var item in readingData.QuestionInfo) + { + if (item.PCWGInterimAnswer != string.Empty) + { + item.Answer = item.PCWGInterimAnswer; + } + } await ReadingCalculate(readingData, new List() { type }); } @@ -765,6 +776,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate public async Task CalculateTask(CalculateTaskInDto inDto) { ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId); + // 只获取当前的 不会获取上一次临时修改的结果 + foreach (var item in readingData.QuestionInfo) + { + if (item.PCWGInterimAnswer != string.Empty) + { + item.Answer = item.PCWGInterimAnswer; + } + } readingData.IsChangeOtherTask = inDto.IsChangeOtherTask; await ReadingCalculate(readingData); } @@ -1049,6 +1068,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { return -1; } + + // 这里的answer可能是临时结果了 有的话就不计算了 + var daysBetween = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.DaysBetween).Select(x => x.Answer).FirstIsNullReturnEmpty(); + if (daysBetween!=string.Empty) + { + return int.Parse(daysBetween); + } + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var taskList = await GetSiteVisitForTumorList(inDto); var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum && x.VisitTaskId != inDto.VisitTaskId).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault(); @@ -1083,6 +1110,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// public async Task GetSiteVisitForTumorEvaluation(ReadingCalculateDto inDto) + { + return await GetSiteVisitForTumorEvaluationByDay(inDto); + } + + /// + /// 获取肿瘤评估 逻辑抽离 + /// + /// + /// + /// + public async Task GetSiteVisitForTumorEvaluationByDay(ReadingCalculateDto inDto, int? daysBetween = null) { if (inDto.IsBaseLine) { @@ -1099,7 +1137,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate //影像质量不正常 return VisitTumorEvaluation.NE.GetEnumInt(); } - var isPD = await ChangeLastTaskSiteVisitForTumorEvaluation(inDto); + var isPD = await ChangeLastTaskSiteVisitForTumorEvaluation(inDto, daysBetween); var newLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); var baseLineLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.BaseLineLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); var alwaysNewLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.AlwaysNewLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); @@ -1120,19 +1158,40 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } } + /// + /// 前端获取访视点肿瘤评估 + /// + /// + [HttpPost] + public async Task FrontGetSiteVisitForTumorEvaluation(FrontGetSiteVisitForTumorEvaluationInDto inDto) + { + ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId); + // 只获取当前的 不会获取上一次临时修改的结果 + foreach (var item in readingData.QuestionInfo) + { + if (item.PCWGInterimAnswer != string.Empty) + { + item.Answer = item.PCWGInterimAnswer; + } + } + + return await GetSiteVisitForTumorEvaluationByDay(readingData, inDto.NumberOfDaysBetween); + } + + /// /// 修改上一次访视结果 并且计算是不是PD /// /// + /// /// - public async Task ChangeLastTaskSiteVisitForTumorEvaluation(ReadingCalculateDto inDto) + public async Task ChangeLastTaskSiteVisitForTumorEvaluation(ReadingCalculateDto inDto, int? numOfDaysBetween) { var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var taskList = await GetSiteVisitForTumorList(inDto); var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum && x.VisitTaskId != inDto.VisitTaskId).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault(); var baseLineTask = taskList.OrderBy(x => x.VisitTaskNum).FirstOrDefault(); - var newLesionsCountQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.QuestionId).FirstOrDefault(); var isPDResult = false; @@ -1142,62 +1201,118 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 查看历史有没有PD var taskIdList = taskList.Select(x => x.VisitTaskId).ToList(); - var pdTaskList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId!=inDto.VisitTaskId&& taskIdList.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation && x.Answer == VisitTumorEvaluation.PD.GetEnumInt()).OrderByDescending(x=>x.VisitTask.VisitTaskNum).ToListAsync(); - + // pd的任务列表 + var pdTaskList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId != inDto.VisitTaskId && taskIdList.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation && x.Answer == VisitTumorEvaluation.PD.GetEnumInt()).OrderByDescending(x => x.VisitTask.VisitTaskNum).ToListAsync(); + + // 自治疗后第二个访视点以来持续的新骨变数量 + var thisNewBoneLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewBoneLesionsCount).Select(x => x.Answer).FirstIsNullReturnEmpty().IsNullOrEmptyReturn0(); + + // 当前任务的BL-BTN + var thisBTN = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.BaseLineLesionsCount).Select(x => x.Answer).FirstIsNullReturnEmpty().IsNullOrEmptyReturn0(); + // 当前访视新病灶数量 - var thisNewLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); + var thisNewLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstIsNullReturnEmpty().IsNullOrEmptyReturn0(); + + // 其他访视的BTN + var otherBTNStrList =await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId != inDto.VisitTaskId && taskIdList.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.QuestionType == QuestionType.BaseLineLesionsCount).Select(x=>new { + x.VisitTask.VisitTaskNum, + x.Answer, + }).ToListAsync(); + + // 最小的BTN 这个时候再转为int 避免查询报错 + var othenMinBTNCount= otherBTNStrList.Select(x => x.Answer.IsNullOrEmptyReturn0()).Min(); + // 历史有PD - if (pdTaskList.Count() > 0&& thisNewLesionsCount >= 2) + if (pdTaskList.Count() > 0) { - // 满足以下所有条件:1、前序访视已经确定为PD;2、当前访视,新病灶≥2个; - isPDResult = true; - } - else - { - // 满足以下所有条件:1、前序访视没有评估为PD,2、前一个访视:新病灶计数≥2个;3、当前访视:新病灶2个:4.前后2个访视间隔6周以上。 - - var lastStudyDate = taskList.Where(x=>x.VisitTaskId==lastTask.VisitTaskId).Select(x=>x.StudyTime).FirstOrDefault(); - var thisStudyDate= taskList.Where(x => x.VisitTaskId == inDto.VisitTaskId).Select(x => x.StudyTime).FirstOrDefault(); - - var lastNewLesionsStr=await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync(); - - var lastNewLesionsCount = lastNewLesionsStr.IsNullOrEmptyReturn0(); - if (lastStudyDate != null && thisStudyDate != null) + // 当前访视:自治疗后第二个访视点以来持续的新骨变数量 + [(V3 - BTN - Min(V2 - BTN、V1 - BTN、BL - BTN)] + 新病灶 >= 2 + if (thisNewBoneLesionsCount + thisBTN - othenMinBTNCount + thisNewLesionsCount >= 2) { - if (lastNewLesionsCount >= 2 && thisNewLesionsCount >= 2 && thisStudyDate.Value > lastStudyDate.Value.AddDays(42)) + isPDResult = true; + } + + + } + else + { + // 间隔天数 + var daysBetween = numOfDaysBetween != null ? numOfDaysBetween.Value : await GetNumberOfDaysBetween(inDto); + + + // 上一次访视的新病灶数量 + var lastNewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + + // 之前不存在pd 又分为两种情况 在访视2 和 访视2以后 + if (inDto.VisitTaskNum == 2) + { + // V1:新病灶计数>=2; V2:新病灶计数 >= 2; V2与V1的间隔 >= 6周 + if (lastNewLesionsCount >= 2 && thisNewLesionsCount >= 2 && daysBetween >= 42) { - var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId, x => new ReadingTaskQuestionAnswer - { - PCWGInterimAnswer = VisitTumorEvaluation.PD.GetEnumInt(), - }); isPDResult = true; } + } - - } - - } - - if (!isPDResult) - { - if (lastTask != null) - { - // 如果不是PD 需要把上一次的PD改为NoPD - var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); - - var lastAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId).FirstOrDefaultAsync(); - if (lastAnswer != null) + else if (inDto.VisitTaskNum > 2) { - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.Id == lastAnswer.Id, x => new ReadingTaskQuestionAnswer + // 上一个访视的BTN + var lastBTN = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.BaseLineLesionsCount).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + + // 上上个访视的 最小BTN + var lastTwoBTN = otherBTNStrList.Where(x => x.VisitTaskNum < lastTask.VisitTaskNum).Select(x => x.Answer.IsNullOrEmptyReturn0()).Min(); + + + // V2:新病灶计数+[(V2-BTN- Min(V1-BTN、BL-BTN)]>=2; + // V3:自治疗后第二个访视点以来持续的新骨变数量 + [(V3 - BTN - Min(V2 - BTN、V1 - BTN、BL - BTN)] + 新病灶 >= 2 + // V3与V2的间隔 >= 6周 + + // 按上面条件写三个if看着清晰点 + if (lastNewLesionsCount + lastBTN - lastTwoBTN >= 2) { - PCWGInterimAnswer = string.Empty, + if (thisNewBoneLesionsCount + thisBTN - othenMinBTNCount + thisNewLesionsCount >= 2) + { + if (daysBetween >= 42) + { + isPDResult = true; + } + } + } + + } + + + if (isPDResult) + { + var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId, x => new ReadingTaskQuestionAnswer + { + PCWGInterimAnswer = VisitTumorEvaluation.PD.GetEnumInt(), }); } - + else + { + if (lastTask != null) + { + // 如果不是PD 需要把上一次的PD改为NoPD + var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); + + var lastAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId).FirstOrDefaultAsync(); + if (lastAnswer != null) + { + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.Id == lastAnswer.Id, x => new ReadingTaskQuestionAnswer + { + PCWGInterimAnswer = string.Empty, + }); + } + + } + + } + } - + } + + return isPDResult; } From 4c1da73c333f34a7b619d0bc34d26ba5bcce710c Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 18 Sep 2025 13:25:11 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReadingCalculate/PCWG3CalculateService.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 4e6ca5b72..5f1c8df52 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -1293,16 +1293,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (lastTask != null) { // 如果不是PD 需要把上一次的PD改为NoPD - var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); - - var lastAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId).FirstOrDefaultAsync(); - if (lastAnswer != null) + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId&&x.ReadingQuestionTrial.QuestionType== QuestionType.SiteVisitForTumorEvaluation, x => new ReadingTaskQuestionAnswer { - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.Id == lastAnswer.Id, x => new ReadingTaskQuestionAnswer - { - PCWGInterimAnswer = string.Empty, - }); - } + PCWGInterimAnswer = string.Empty, + }); + + } From 72fd347c01f62b1b72c2b354ec43d30387fae035 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 18 Sep 2025 14:17:16 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingCalculateViewModel.cs | 30 ++++++ .../ReadingCalculate/PCWG3CalculateService.cs | 97 ++++++++++++++----- 2 files changed, 101 insertions(+), 26 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index ff6e8151c..f455f55a7 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -325,6 +325,36 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public int NumberOfDaysBetween { get; set; } } + public class FrontGetSiteVisitForTumorEvaluationOutDto + { + public List ResultList { get; set; } + } + + public class FrontGetSiteVisitForTumor + { + public Guid VisitTaskId { get; set; } + + public string TumorEvaluationResult { get; set; }=string.Empty; + } + + public class SiteVisitForTumorEvaluationByDayOutDto + { + public string Result{ get; set; }=string.Empty; + + public string? LastTaskResult { get; set; } + + public Guid? LastTaskId { get; set; } + + } + + public class PCWGSiteVisitForTumor + { + public bool IsPD { get; set; } + + public string? LastTaskResult { get; set; } + + public Guid? LastTaskId { get; set; } + } /// /// 阅片计算Dto diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 5f1c8df52..a44b7c1fe 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -1,4 +1,5 @@ using DocumentFormat.OpenXml.Spreadsheet; +using DocumentFormat.OpenXml.Vml.Spreadsheet; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Helper; @@ -1111,51 +1112,62 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task GetSiteVisitForTumorEvaluation(ReadingCalculateDto inDto) { - return await GetSiteVisitForTumorEvaluationByDay(inDto); + return (await GetSiteVisitForTumorEvaluationByDay(inDto)).Result; } /// - /// 获取肿瘤评估 逻辑抽离 + /// 获取肿瘤评估 逻辑抽离 这里还要返回上一次的结果 /// /// /// /// - public async Task GetSiteVisitForTumorEvaluationByDay(ReadingCalculateDto inDto, int? daysBetween = null) + public async Task GetSiteVisitForTumorEvaluationByDay(ReadingCalculateDto inDto, int? daysBetween = null) { + SiteVisitForTumorEvaluationByDayOutDto result= new SiteVisitForTumorEvaluationByDayOutDto(); if (inDto.IsBaseLine) { - return VisitTumorEvaluation.NA.GetEnumInt(); + result.Result= VisitTumorEvaluation.NA.GetEnumInt(); + return result; } //如果日期未知,不需要计算肿瘤评估结果; if (await GetNumberOfDaysBetween(inDto) == -1) { - return string.Empty; + result.Result = string.Empty; + return result; } if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ImageQualityAssessment && x.Answer == ImageQualityEvaluation.Abnormal.GetEnumInt())) { //影像质量不正常 - return VisitTumorEvaluation.NE.GetEnumInt(); + result.Result = VisitTumorEvaluation.NE.GetEnumInt(); + return result; } - var isPD = await ChangeLastTaskSiteVisitForTumorEvaluation(inDto, daysBetween); + var pdResult = await ChangeLastTaskSiteVisitForTumorEvaluation(inDto, daysBetween); + + // 这里为什么要这样写 因为要把上一次的也返回前端去 前端要修改 + result.LastTaskResult = pdResult.LastTaskResult; + result.LastTaskId = pdResult.LastTaskId; + var newLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); var baseLineLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.BaseLineLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); var alwaysNewLesionsCount = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.AlwaysNewLesionsCount).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); - if (isPD) + if (pdResult.IsPD) { - return VisitTumorEvaluation.PD.GetEnumInt(); + result.Result = VisitTumorEvaluation.PD.GetEnumInt(); } else if (newLesionsCount == 0 && baseLineLesionsCount == 0 && alwaysNewLesionsCount == 0) { - return VisitTumorEvaluation.ND.GetEnumInt(); + result.Result = VisitTumorEvaluation.ND.GetEnumInt(); } else { - return VisitTumorEvaluation.NoPD.GetEnumInt(); + result.Result = VisitTumorEvaluation.NoPD.GetEnumInt(); } + + return result; } /// @@ -1163,7 +1175,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// [HttpPost] - public async Task FrontGetSiteVisitForTumorEvaluation(FrontGetSiteVisitForTumorEvaluationInDto inDto) + public async Task FrontGetSiteVisitForTumorEvaluation(FrontGetSiteVisitForTumorEvaluationInDto inDto) { ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId); // 只获取当前的 不会获取上一次临时修改的结果 @@ -1174,8 +1186,28 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate item.Answer = item.PCWGInterimAnswer; } } + FrontGetSiteVisitForTumorEvaluationOutDto result = new FrontGetSiteVisitForTumorEvaluationOutDto(); - return await GetSiteVisitForTumorEvaluationByDay(readingData, inDto.NumberOfDaysBetween); + + + var tumorEvaluation= await GetSiteVisitForTumorEvaluationByDay(readingData, inDto.NumberOfDaysBetween); + + result.ResultList = new List() { + new FrontGetSiteVisitForTumor(){ + VisitTaskId=inDto.VisitTaskId, + TumorEvaluationResult=tumorEvaluation.Result, + } + }; + if (tumorEvaluation.LastTaskResult != null && tumorEvaluation.LastTaskId != null) + { + result.ResultList.Add(new FrontGetSiteVisitForTumor() + { + VisitTaskId = tumorEvaluation.LastTaskId.Value, + TumorEvaluationResult = tumorEvaluation.LastTaskResult, + }); + } + + return result; } @@ -1185,15 +1217,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - public async Task ChangeLastTaskSiteVisitForTumorEvaluation(ReadingCalculateDto inDto, int? numOfDaysBetween) + public async Task ChangeLastTaskSiteVisitForTumorEvaluation(ReadingCalculateDto inDto, int? numOfDaysBetween) { + PCWGSiteVisitForTumor result = new PCWGSiteVisitForTumor() { + IsPD=false, + }; var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var taskList = await GetSiteVisitForTumorList(inDto); var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum && x.VisitTaskId != inDto.VisitTaskId).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault(); var baseLineTask = taskList.OrderBy(x => x.VisitTaskNum).FirstOrDefault(); - var isPDResult = false; // 先判断有没有上一个任务 if (lastTask != null) @@ -1228,7 +1262,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 当前访视:自治疗后第二个访视点以来持续的新骨变数量 + [(V3 - BTN - Min(V2 - BTN、V1 - BTN、BL - BTN)] + 新病灶 >= 2 if (thisNewBoneLesionsCount + thisBTN - othenMinBTNCount + thisNewLesionsCount >= 2) { - isPDResult = true; + result.IsPD = true; } @@ -1248,7 +1282,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // V1:新病灶计数>=2; V2:新病灶计数 >= 2; V2与V1的间隔 >= 6周 if (lastNewLesionsCount >= 2 && thisNewLesionsCount >= 2 && daysBetween >= 42) { - isPDResult = true; + + result.IsPD = true; } } @@ -1272,7 +1307,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { if (daysBetween >= 42) { - isPDResult = true; + result.IsPD = true; } } } @@ -1280,25 +1315,35 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } - if (isPDResult) + if (result.IsPD) { - var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId, x => new ReadingTaskQuestionAnswer + // 为 null 说明不是前端传的 + if (numOfDaysBetween == null) { - PCWGInterimAnswer = VisitTumorEvaluation.PD.GetEnumInt(), - }); + var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault(); + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId, x => new ReadingTaskQuestionAnswer + { + PCWGInterimAnswer = VisitTumorEvaluation.PD.GetEnumInt(), + }); + } + result.LastTaskResult= VisitTumorEvaluation.PD.GetEnumInt(); + result.LastTaskId= lastTask.VisitTaskId; + + } else { if (lastTask != null) { - // 如果不是PD 需要把上一次的PD改为NoPD + // 如果不是PD 需要把上一次的PD改为NoPD 这里去掉临时答案就是原始答案 await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId&&x.ReadingQuestionTrial.QuestionType== QuestionType.SiteVisitForTumorEvaluation, x => new ReadingTaskQuestionAnswer { PCWGInterimAnswer = string.Empty, }); - + var lastTaskResult = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.Answer).FirstOrDefaultAsync(); + result.LastTaskResult = lastTaskResult; + result.LastTaskId = lastTask.VisitTaskId; } @@ -1309,7 +1354,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } - return isPDResult; + return result; } #endregion From 3d19ee7b043c98e600cb6a5d6d61cb6a1a85bf78 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Thu, 18 Sep 2025 16:52:01 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/IRaCIS.Core.Application.xml | 2 +- .../Service/ReadingCalculate/PCWG3CalculateService.cs | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index c25be1f22..14dda6423 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -4849,7 +4849,7 @@ - 获取肿瘤评估 逻辑抽离 + 获取肿瘤评估 逻辑抽离 这里还要返回上一次的结果 diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index a44b7c1fe..76b639edf 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -1335,11 +1335,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { if (lastTask != null) { - // 如果不是PD 需要把上一次的PD改为NoPD 这里去掉临时答案就是原始答案 - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId&&x.ReadingQuestionTrial.QuestionType== QuestionType.SiteVisitForTumorEvaluation, x => new ReadingTaskQuestionAnswer + if (numOfDaysBetween == null) { - PCWGInterimAnswer = string.Empty, - }); + // 如果不是PD 需要把上一次的PD改为NoPD 这里去掉临时答案就是原始答案 + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation, x => new ReadingTaskQuestionAnswer + { + PCWGInterimAnswer = string.Empty, + }); + } var lastTaskResult = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.Answer).FirstOrDefaultAsync(); result.LastTaskResult = lastTaskResult;