diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index a8cb8b25..acc19c68 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -19,6 +19,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class TargetLesionCalculateDto { + /// + /// 是否存在靶病灶 + /// + public bool ExistsTargetLesion { get; set; } + /// /// 非淋巴结靶病灶长径之和 decimal /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 020be441..a083b692 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -885,7 +885,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var thisRowData = thisQuestionAsnwer.Where(x => x.RowIndex == item).SelectMany(x => x.TableQuestionList).ToList(); var thisValue = thisRowData.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); - if (thisValue - lastValue > 5) + if (thisValue - lastValue >= 5) { isExists = true; } @@ -1190,6 +1190,49 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// 获取靶病灶评估 /// /// + /// + /// 靶病灶疗效评估算法: + /// If(没有靶病灶) + /// { + /// 靶病灶疗效为 ND。 + /// }else + /// { + /// 初始化靶病灶疗效为 SD + /// If(上次访视点评估是CR) + /// { + /// If(当前访视点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + /// { + /// 靶病灶疗效为 PD + /// } + /// If(当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + /// { + /// 靶病灶疗效为 PD + /// } + /// } else if(比整体访视期间最低点SOD增加≥20 %) + /// { + /// 靶病灶疗效为 PD + /// }else + /// { + /// If (有被评估为NE的单个靶病灶) + /// { + /// 靶病灶疗效为 NE + /// }else + /// { + /// If(与基线期SOD相比减小≥30 % + /// { + /// If(与整体访视期间最低点SOD相比增加<20 % 或者 比整体访视期间最低点SOD绝对增加值<5 mm) + /// { + /// 靶病灶疗效为 PR + /// } + /// } + /// if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10) + /// { + /// 靶病灶疗效为 CR + /// } + /// } + /// } + /// } + /// /// public async Task GetTargetLesionEvaluate(ReadingCalculateDto inDto) { @@ -1204,6 +1247,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } TargetLesionCalculateDto resultData = new TargetLesionCalculateDto() { + // 是否存在靶病灶 + ExistsTargetLesion= tableQuestion.Count()>0, + //非淋巴结靶病灶长径之和 decimal SumOfDiameter = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SumOfDiameter).Sum(x => x.Answer.IsNullOrEmptyReturn0()), @@ -1228,14 +1274,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate LowPercentBigger20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, // SOD 变化值 比整体访视期间SOD最低点SOD绝对增加值<5 mm - LowChangeLess5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 5 - && inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >- 5 - , + LowChangeLess5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 5, // 比整体访视期间SOD最低点SOD绝对增加值≥5 mm - LowChangeBigger5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5 - || inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <=- 5 - , + LowChangeBigger5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, // 被评估为NE的单个靶病灶 是否存在状态为不可评估的靶病灶 ExixtsNETargetLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)), @@ -1284,54 +1326,50 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate - TargetAssessment result = TargetAssessment.NE; - if (resultData.SumOfDiameter == 0 && resultData.DiameterLessThan10 && !resultData.ExixtsNETargetLesion) - { - result = TargetAssessment.CR; - } - else if ( - (resultData.SODPercentBigger30 && resultData.LowPercentLess20 && !resultData.ExixtsNETargetLesion) - || - (resultData.SODPercentBigger30 && resultData.LowChangeLess5 && !resultData.ExixtsNETargetLesion) - ) - { - result = TargetAssessment.PR; - } - else if ( - (resultData.SODPercentLess30 && resultData.LowPercentLess20 && !resultData.ExixtsNETargetLesion) - || - (resultData.SODPercentLess30 && resultData.LowChangeLess5 && !resultData.ExixtsNETargetLesion) - ) - { - result = TargetAssessment.SD; - } - else if (resultData.LowPercentBigger20 && resultData.LowChangeBigger5) - { - result = TargetAssessment.PD; - } - else if ( - (resultData.LowPercentLess20 && resultData.ExixtsNETargetLesion) - || - (resultData.LowPercentBigger20 && resultData.LowChangeLess5 && resultData.ExixtsNETargetLesion) - ) - { - result = TargetAssessment.NE; - } - - else if (!resultData.ExixtsNETargetLesion && resultData.SumOfDiameter == 0 && resultData.SODPercent == 0) + TargetAssessment result = TargetAssessment.SD; + if (!resultData.ExistsTargetLesion) { result = TargetAssessment.ND; } - - else if ( - (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR) && resultData.CurrenShortBigger10 && resultData.IsAddFive) - || - (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR) && resultData.CurrentMajoreBigger0) - ) + else { - result = TargetAssessment.PD; - } + if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) + { + if (resultData.CurrenShortBigger10 && resultData.IsAddFive) + { + result = TargetAssessment.PD; + } + if (resultData.CurrentMajoreBigger0) + { + result = TargetAssessment.PD; + } + } + else if (resultData.LowPercentBigger20) + { + result = TargetAssessment.PD; + } + else + { + if (resultData.ExixtsNETargetLesion) + { + result = TargetAssessment.NE; + } else + { + if (resultData.SODPercentBigger30) + { + if (resultData.LowPercentLess20||resultData.LowChangeLess5) + { + result = TargetAssessment.PR; + } + if (resultData.SumOfDiameter == 0 && resultData.DiameterLessThan10) + { + result = TargetAssessment.CR; + } + } + } + } + } return result.GetEnumInt(); }