From 5f1a25c2ec60cb932eb9cb3169f1ba6106458598 Mon Sep 17 00:00:00 2001
From: he <10978375@qq.com>
Date: Fri, 26 May 2023 11:25:58 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dto/CriterionCalculateDto.cs | 15 +++
.../IRECIST1Point1CalculateService.cs | 93 +++++++++++++------
IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 9 +-
3 files changed, 88 insertions(+), 29 deletions(-)
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,
///
/// 新靶病灶评估