diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 0a901c2db..94798668d 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1436,13 +1436,7 @@ - - - 获取IRECIST靶病灶评估 - - - - + 获取新靶病灶评估 @@ -7184,14 +7178,14 @@ 检查日期 - + 基线未选择任何靶病灶 - + - 上一访视评估为iCPD + 上一访视评估 @@ -7199,6 +7193,42 @@ 满足RECISTPD + + + 本次访视SOD增加不小于5mm + + + + + 比整体访视期间最低点SOD增加≥20 % + + + + + 比整体访视期间最低点SOD绝对增加值≥5 mm + + + + + 当前访视至少有一个“存在”状态的靶病灶 + + + + + 有任一靶病灶为NE状态 + + + + + 所有非淋巴结靶病灶消失,径线总和为0 + + + + + + 与基线期SOD相比减小≥30 % + + 新靶病灶评估Dto diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index 952d6eee3..9dab13d3d 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs @@ -53,22 +53,62 @@ namespace IRaCIS.Core.Application.ViewModel /// /// 基线未选择任何靶病灶 /// - public bool ExistsTargetLesion { get; set; } + public bool NotExistsTargetLesion { get; set; } /// - /// 上一访视评估为iCPD + /// 上一访视评估 /// - public bool LastTaskIsICPD { get; set; } + public string LastTaskTarget { get; set; } /// /// 满足RECISTPD /// public bool MeetRECISTPD { get; set; } + /// + /// 本次访视SOD增加不小于5mm + /// + public bool SODAddGreaterThan5 { get; set; } + /// + /// 比整体访视期间最低点SOD增加≥20 % + /// + public bool LowSodAddGreaterThan20Percent { get; set; } + + /// + /// 比整体访视期间最低点SOD绝对增加值≥5 mm + /// + public bool LowSodAddGreaterThan5 { get; set; } + + /// + /// 当前访视至少有一个“存在”状态的靶病灶 + /// + public bool HaveExistLesion { get; set; } + + /// + /// 有任一靶病灶为NE状态 + /// + public bool HaveNeLesion { get; set; } + + /// + /// 所有非淋巴结靶病灶消失,径线总和为0 + /// + public bool AllLesionVanish { get; set; } + + /// + /// 所有淋巴结靶病灶的短径缩小到 < 10 mm + /// + public bool AllMinorAxisLessThan10 { get; set; } + + /// + /// 与基线期SOD相比减小≥30 % + /// + public bool BaseLineLessThan30 { get; set; } } + + /// /// 新靶病灶评估Dto /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 0b6782622..ce53b4424 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -1524,55 +1524,166 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate lastVisitTaskId = lastTaskId; return lastTaskId; } - - - + + + } #endregion #region 计算阅片问题 外层问题 + #region IRECIST计算 + #region 获取IRECIST靶病灶评估 /// /// 获取IRECIST靶病灶评估 /// /// + /// + /// if(基线没有靶病灶) + /// { + /// 靶病灶疗效为 ND + /// }else if ((上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件)|| 上一访视评估为iUPD || 本次访视SOD增加不小于5mm) + /// { + /// 靶病灶疗效为 ICPD + /// } else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶)) + /// { + /// 靶病灶疗效为 iUPD + /// } else if (有任一靶病灶为NE状态) + /// { + /// 靶病灶疗效为 NE + /// } + /// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm) + /// { + /// 靶病灶疗效为 iCR + /// } else if (与基线期SOD相比减小≥30 %) + /// { + /// 靶病灶疗效为 iPR + /// } + /// else + /// { + /// 靶病灶疗效为 iSD + /// } + /// + /// /// public async Task GetIRECISTTargetLesionEvaluate(ReadingCalculateDto inDto) { - //if(基线没有靶病灶) - //{ - // 靶病灶疗效为 ND - //}else if ((上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件)|| 上一访视评估为iUPD || 本次访视SOD增加不小于5mm) - //{ - // 靶病灶疗效为 ICPD - //} else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶)) - //{ - // 靶病灶疗效为 iUPD - //} else if (有任一靶病灶为NE状态) - // { - // 靶病灶疗效为 NE - //} - // else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm) - //{ - // 靶病灶疗效为 iCR - //} else if (与基线期SOD相比减小≥30 %) - //{ - // 靶病灶疗效为 iPR - //} - //else - // { - // 靶病灶疗效为 iSD - //} + var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); + var lastVisitTaskId = await GetLastVisitTaskId(inDto); + var tumorQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.Tumor).Select(x => x.QuestionId).FirstOrDefault(); - //if() - return string.Empty; + var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault(); + IRECISTTargetLesionDto resultData = new IRECISTTargetLesionDto() + { + // 基线没有靶病灶 + NotExistsTargetLesion = tableQuestion.Count() == 0, + + // 上一访视评估 + LastTaskTarget = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == tumorQuestionId) + .Select(x => x.Answer).FirstOrDefaultAsync()) ?? string.Empty, + + // 满足RECISTPD + MeetRECISTPD = (await GetTargetLesionEvaluate(inDto)) == TargetAssessment.PD.GetEnumInt(), + + // 本次访视SOD增加不小于5mm + SODAddGreaterThan5 = await GetSODData(inDto) - (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == sodQuestionId) + .Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0() >= 5, + + //比整体访视期间最低点SOD增加≥20 % + LowSodAddGreaterThan20Percent = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, + + // 比整体访视期间最低点SOD绝对增加值≥5 mm + LowSodAddGreaterThan5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, + + // 当前访视至少有一个“存在”状态的靶病灶 + HaveExistLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.Exist)), + + // 有任一靶病灶为NE状态 + HaveNeLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)), + + // 所有非淋巴结靶病灶消失,径线总和为0 + AllLesionVanish = true, + + // 所有淋巴结靶病灶的短径缩小到 < 10 mm + AllMinorAxisLessThan10 = true, + + // 与基线期SOD相比减小≥30 % + BaseLineLessThan30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <= -30, + }; + + + foreach (var item in tableQuestion) + { + if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) + { + // 淋巴结的短径 + resultData.AllMinorAxisLessThan10 = resultData.AllMinorAxisLessThan10 && (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() < 10; + + + } + + if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && !x.Answer.EqEnum(YesOrNoOrNa.Yes))) + { + resultData.AllLesionVanish = resultData.AllLesionVanish && item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault() == TargetState.Loss.GetEnumInt(); + } + } + TargetAssessment result = TargetAssessment.SD; + + // if(基线没有靶病灶) + if (resultData.NotExistsTargetLesion) + { + // 靶病灶疗效为 ND + result = TargetAssessment.ND; + } + // }else if ((上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件)|| 上一访视评估为iUPD || 本次访视SOD增加不小于5mm) + else if ((resultData.LastTaskTarget.EqEnum(OverallAssessment.iCPD) && resultData.MeetRECISTPD) || resultData.LastTaskTarget.EqEnum(OverallAssessment.iUPD) || resultData.SODAddGreaterThan5) + { + // 靶病灶疗效为 ICPD + result = TargetAssessment.iCPD; + } + // } else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶)) + else if(resultData.MeetRECISTPD&&(resultData.LowSodAddGreaterThan20Percent&&resultData.LowSodAddGreaterThan5)|| (resultData.LastTaskTarget.EqEnum(OverallAssessment.iCR)&&resultData.HaveExistLesion)) + { + // 靶病灶疗效为 iUPD + result = TargetAssessment.iUPD; + } + // else if (有任一靶病灶为NE状态) + else if(resultData.HaveNeLesion) + { + // 靶病灶疗效为 NE + result = TargetAssessment.NE; + } + // else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm) + else if(resultData.AllLesionVanish&&resultData.AllMinorAxisLessThan10) + { + // 靶病灶疗效为 iCR + result = TargetAssessment.iCR; + } + // else if (与基线期SOD相比减小≥30 %) + else if(resultData.BaseLineLessThan30) + { + // 靶病灶疗效为 iPR + result = TargetAssessment.iPR; + } + // else + else + { + // 靶病灶疗效为 iSD + result = TargetAssessment.iSD; + } + + + return result.GetEnumInt(); } #endregion + #region IRECIST非靶病灶评估 + + #endregion /// /// 获取新靶病灶评估 @@ -1611,6 +1722,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return string.Empty; } + #endregion + #region 获取靶病灶评估 @@ -1848,7 +1961,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } } //if(上次访视点评估是CR) - if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) + if (resultData.LastTargetLesionEvaluate.EqEnum(OverallAssessment.CR)) { //if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) // 换句话说 就是 短径≥10 的病灶 和 短径增加值≥5的病灶 的交集数量大于0 diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index efc847663..6a147cf42 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -483,7 +483,22 @@ namespace IRaCIS.Core.Domain.Share /// SD = 6, - + iCR = 7, + + + iPR = 8, + + + iSD = 10, + + + iNN = 11, + + + iUPD = 12, + + + iCPD = 13, } @@ -626,6 +641,16 @@ namespace IRaCIS.Core.Domain.Share /// ND = 5, + iCR=6, + + iPR=7, + + iSD=8, + + iUPD=9, + + iCPD=10, + }