diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index b0435897e..c7f2c9b26 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs @@ -105,6 +105,11 @@ namespace IRaCIS.Core.Application.ViewModel /// public bool BaseLineLessThan30 { get; set; } + /// + /// 非靶病灶中淋巴结病灶全部消失 + /// + public bool NoTargetLymphLoss { get; set; } + } /// @@ -187,6 +192,16 @@ namespace IRaCIS.Core.Application.ViewModel /// 至少有一个新靶病无法评估 /// public bool ExixtsUnevaluableState { get; set; } + + /// + /// 当有“存在”状态的淋巴结新靶病灶 + /// + public bool ExixtsLymphTarget { get; set; } + + /// + /// 当有“存在”或“太小”状态的非淋巴结新靶病灶 + /// + public bool ExixtsOrLessNoLymphTarget{ get; set; } } /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 7dfef8c98..2b55ba542 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -487,11 +487,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 与前一访视SOD相比变化量 new ReadingCalculateData (){QuestionType=QuestionType.LastVisitSODChange,GetDecimalNullFun=GetLastTaskSODChange,IsConvertedTask=true}, - //新靶病灶直径之和(iSOD) + // 新靶病灶直径之和(iSOD) new ReadingCalculateData (){QuestionType=QuestionType.ISOD,GetDecimalNullFun=GetiSODData,IsConvertedTask=true}, - // 与前一访视相比iSOD变化量 - new ReadingCalculateData (){QuestionType=QuestionType.LastVisitiSODChange,GetDecimalNullFun=GetISODChange,IsConvertedTask=true}, + // 与触发iRECIST访视相比iSOD变化量 + new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringiSODChange,GetDecimalNullFun=GetComparedTriggeringiSODChange,IsConvertedTask=true}, // 靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,IsConvertedTask=false}, @@ -578,7 +578,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate List questionTypes = new List() { QuestionType.ISOD, - QuestionType.LastVisitiSODChange, + QuestionType.ComparedTriggeringiSODChange, QuestionType.TargetLesion, QuestionType.NoTargetLesion, QuestionType.NewLesions, @@ -1388,18 +1388,19 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion - #region 与前一访视相比iSOD变化量 + #region 与触发iRECIST访视相比iSOD变化量 /// - /// 与前一访视相比iSOD变化量 + /// 与触发iRECIST访视相比iSOD变化量 /// /// /// - public async Task GetISODChange(ReadingCalculateDto inDto) + public async Task GetComparedTriggeringiSODChange(ReadingCalculateDto inDto) { - var lastTaskId = await this.GetLastVisitTaskId(inDto); - var lastiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + var firstChangeTaskId = await GetFirstChangeTaskId(inDto); + + var firstChangeiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); var value = await GetiSODData(inDto); @@ -1407,7 +1408,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { return null; } - return value.NullChange0() - lastiSOD; + return value.NullChange0() - firstChangeiSOD; } #endregion @@ -1702,10 +1703,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// { /// 靶病灶疗效为 NE /// } - /// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm) + /// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm && 非靶病灶中淋巴结病灶全部消失) /// { /// 靶病灶疗效为 iCR - /// } else if (与基线期SOD相比减小≥30 %) + /// } else if (与基线期SOD相比减小≥30 %||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失)) /// { /// 靶病灶疗效为 iPR /// } @@ -1721,7 +1722,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); var lastVisitTaskId = await GetLastVisitTaskId(inDto); - var firstChangeTaskId = await GetFirstChangeTaskId(inDto); var targetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.QuestionId).FirstOrDefault(); var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault(); @@ -1738,8 +1738,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate MeetRECISTPD = (await GetTargetLesionEvaluate(inDto)) == TargetAssessment.PD.GetEnumInt(), // 本次访视SOD与触发iRECIST访视相比本次访视SOD增加不小于5mm - SODTiggerAddGreaterThan5 = firstChangeTaskId==inDto.VisitTaskId ? false : await GetSODData(inDto) - (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrialId == sodQuestionId) - .Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0() >= 5, + SODTiggerAddGreaterThan5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ComparedTriggeringiSODChange).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, //比整体访视期间最低点SOD增加≥20 % LowSodAddGreaterThan20Percent = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, @@ -1761,8 +1760,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 与基线期SOD相比减小≥30 % BaseLineLessThan30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <= -30, + + //非靶病灶中淋巴结病灶全部消失 + NoTargetLymphLoss = true, }; + var noTargetTableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList(); + + foreach (var item in noTargetTableQuestion) + { + if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) + { + + resultData.NoTargetLymphLoss = resultData.NoTargetLymphLoss && item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault() == NoTargetState.Loss.GetEnumInt(); + + } + } foreach (var item in tableQuestion) { @@ -1811,14 +1824,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 靶病灶疗效为 NE result = TargetAssessment.NE; } - // else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm) - else if(resultData.AllLesionVanish&&resultData.AllMinorAxisLessThan10) + // else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm && 非靶病灶中淋巴结病灶全部消失) + else if (resultData.AllLesionVanish&&resultData.AllMinorAxisLessThan10&& resultData.NoTargetLymphLoss) { // 靶病灶疗效为 iCR result = TargetAssessment.iCR; } - // else if (与基线期SOD相比减小≥30 %) - else if(resultData.BaseLineLessThan30) + // else if (与基线期SOD相比减小≥30 %||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失)) + else if (resultData.BaseLineLessThan30||(resultData.AllLesionVanish && resultData.AllMinorAxisLessThan10 && !resultData.NoTargetLymphLoss)) { // 靶病灶疗效为 iPR result = TargetAssessment.iPR; @@ -1982,11 +1995,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// { /// 疗效为 iCPD /// } - /// else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶) + /// else if (上一访视新靶病灶评估为“iCPD”&& (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶)) /// { /// 疗效为 iCPD /// } - /// else if (有存在状态的新靶病灶时评估为该结果) + /// else if (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶) /// { /// 疗效为 iUPD /// } @@ -2029,15 +2042,41 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 至少有一个新靶病无法评估 ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.NotEvaluable)), + + // 当有“存在”状态的淋巴结新靶病灶 + ExixtsLymphTarget = false, + + // 当有“存在”或“太小”状态的非淋巴结新靶病灶 + ExixtsOrLessNoLymphTarget = false, }; foreach (var item in tableQuestion) { data.AllVanish = data.AllVanish && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Loss)); + + + data.ExixtsLymphTarget = data.ExixtsLymphTarget || + ( + item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist)) && + item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)) + ); + + data.ExixtsOrLessNoLymphTarget = data.ExixtsLymphTarget || + ( + + ( + item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist)) + || item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.TooSmall)) + ) + + && + item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && !x.Answer.EqEnum(YesOrNoOrNa.Yes)) + ); + } - NewTargetLesionAssessment result = NewTargetLesionAssessment.ND; + NewTargetLesionAssessment? result = null; // if(所有新靶病灶消失或一直不存在任何新靶病灶) if(data.NotExistsNewTargetLesion||data.AllVanish) @@ -2051,14 +2090,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 疗效为 iCPD result = NewTargetLesionAssessment.iCPD; } - // else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶) - else if (data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iCPD) && data.HaveExixtsState) + // else if (上一访视新靶病灶评估为“iCPD”&& (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶)) + else if (data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iCPD) && data.ExixtsLymphTarget && data.ExixtsOrLessNoLymphTarget) { // 疗效为 iCPD result = NewTargetLesionAssessment.iCPD; } - // else if (有存在状态的新靶病灶时评估为该结果) - else if ( data.HaveExixtsState) + // else if (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶) + else if ( data.HaveExixtsState||data.ExixtsOrLessNoLymphTarget) { // 疗效为 iUPD result = NewTargetLesionAssessment.iUPD; @@ -2070,7 +2109,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate result = NewTargetLesionAssessment.NE; } - return result.GetEnumInt(); + return result==null?string.Empty: result.Value.GetEnumInt(); } #endregion diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index e17780ed5..43c3fc008 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -1246,6 +1246,11 @@ namespace IRaCIS.Core.Domain.Share /// 无法评估 /// NotEvaluable=3, + + /// + /// 太小 + /// + TooSmall=4, } /// @@ -1469,9 +1474,9 @@ namespace IRaCIS.Core.Domain.Share ISOD = 24, /// - /// 与前一访视相比iSOD变化量 + /// 与触发iRECIST访视相比iSOD变化量 Compared with triggering iRECIST visit /// - LastVisitiSODChange = 25, + ComparedTriggeringiSODChange = 25, /// /// 新靶病灶评估