From b00ac06ceeedba3d23c4c47bddfc455c485e78bc Mon Sep 17 00:00:00 2001
From: he <10978375@qq.com>
Date: Mon, 10 Apr 2023 17:21:42 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IRaCIS.Core.Application.xml | 50 ++++-
.../Dto/CriterionCalculateDto.cs | 46 ++++-
.../IRECIST1Point1CalculateService.cs | 173 +++++++++++++++---
IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 27 ++-
4 files changed, 252 insertions(+), 44 deletions(-)
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,
+
}