From 1dc0219fa13e1464c4352775cc4d64fa99f21d00 Mon Sep 17 00:00:00 2001
From: he <10978375@qq.com>
Date: Wed, 12 Apr 2023 14:26:47 +0800
Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E6=B3=95=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 | 147 +++++-
.../Dto/CriterionCalculateDto.cs | 106 +++-
.../IRECIST1Point1CalculateService.cs | 490 +++++++++++++++++-
IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 183 ++++++-
4 files changed, 888 insertions(+), 38 deletions(-)
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 94798668d..679fd0af3 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -1437,10 +1437,57 @@
-
+
+
+
+
- 获取新靶病灶评估
+ 获取其它既往新病灶评估
+
+ if(有其它既往新病灶消失或一直不存在任何其它既往新病灶)
+ {
+ 疗效为 ND
+ }
+ else if (任一病灶从非“存在”状态改为“存在”状态)
+ {
+ 疗效为 iUPD
+ }
+ else if (至少有一个其它既往新病灶无法评估)
+ {
+ 疗效为 NE
+ }
+ else if (至少有一个其它既往新病灶为疑似状态)
+ {
+ 疗效为 疑似
+ }
+
+
+
+
+
+
+
+
+
+ if现至少1个“存在”状态的触发iRECIST后新病灶)
+ {
+ 疗效为 是
+ }
+ else if (只要有一个触发iRECIST后新病灶评估为NE)
+ {
+ 疗效为 NE
+ }
+ else if (只要有一个触发iRECIST后新病灶评估为疑似)
+ {
+ 疗效为 疑似
+ }
+ else
+ {
+ 疗效为 否
+ }
+
+
@@ -7229,14 +7276,59 @@
与基线期SOD相比减小≥30 %
+
+
+ IRECIST 非靶病灶
+
+
+
+
+ 基线未选择任何非靶病灶
+
+
+
+
+ 上次非靶病灶评估结果
+
+
+
+
+ 任一非靶病灶状态评估为“进一步增大(iCPD)”
+
+
+
+
+ 出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”
+
+
+
+
+ 任一非靶病灶状态评估为 iUPD
+
+
+
+
+ 满足RECIST1.1PD
+
+
+
+
+ 有任一非靶病灶为NE状态
+
+
+
+
+ 全部为消失
+
+
新靶病灶评估Dto
-
+
- 存在新靶病灶
+ 不存在新靶病灶
@@ -7244,9 +7336,9 @@
所有状态为消失
-
+
- 上一访视新靶病灶评估为“iUPD”
+ 上一访视新靶病灶评估
@@ -7264,9 +7356,39 @@
至少有一个新靶病无法评估
-
+
- 存在新非靶病灶
+ 其他既往新病灶
+
+
+
+
+ 不存在其他既往新病灶
+
+
+
+
+ 所有状态为消失
+
+
+
+
+ 当任一病灶从非“存在”状态改为“存在”状态
+
+
+
+
+ 至少有一个病灶无法评估
+
+
+
+
+ 至少有一个其它既往新病灶为疑似状态
+
+
+
+
+ 不存在新非靶病灶
@@ -7274,9 +7396,14 @@
所有状态为消失
-
+
- 上一访视新靶病灶评估为“iUPD”
+ 上一访视新非靶病灶评估
+
+
+
+
+ 当前访视的新靶病灶评估
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
index 9dab13d3d..a527181a4 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
@@ -107,7 +107,51 @@ namespace IRaCIS.Core.Application.ViewModel
}
-
+ ///
+ /// IRECIST 非靶病灶
+ ///
+ public class IRECISTNoTargetLesion
+ {
+ ///
+ /// 基线未选择任何非靶病灶
+ ///
+ public bool NotExistsNoTargetLesion { get; set; }
+
+ ///
+ /// 上次非靶病灶评估结果
+ ///
+ public string LastNoTargetLesion { get; set; }
+
+ ///
+ /// 任一非靶病灶状态评估为“进一步增大(iCPD)”
+ ///
+ public bool ExistiCPD { get; set; }
+
+ ///
+ /// 出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”
+ ///
+ public bool LastNoUPD { get; set; }
+
+ ///
+ /// 任一非靶病灶状态评估为 iUPD
+ ///
+ public bool ExistiUPD { get; set; }
+
+ ///
+ /// 满足RECIST1.1PD
+ ///
+ public bool RECISTPD { get; set; }
+
+ ///
+ /// 有任一非靶病灶为NE状态
+ ///
+ public bool HaveNeLesion { get; set; }
+
+ ///
+ /// 全部为消失
+ ///
+ public bool AllVanish { get; set; }
+ }
///
/// 新靶病灶评估Dto
@@ -115,9 +159,9 @@ namespace IRaCIS.Core.Application.ViewModel
public class IRECISTNewTargetLesionDto
{
///
- /// 存在新靶病灶
+ /// 不存在新靶病灶
///
- public bool ExistsNewTargetLesion { get; set; }
+ public bool NotExistsNewTargetLesion { get; set; }
///
/// 所有状态为消失
@@ -125,9 +169,9 @@ namespace IRaCIS.Core.Application.ViewModel
public bool AllVanish { get; set; }
///
- /// 上一访视新靶病灶评估为“iUPD”
+ /// 上一访视新靶病灶评估
///
- public bool LastTaskIsiUPD { get; set; }
+ public string LastTaskNewTargetLesion { get; set; }
///
/// SOD增加5mm以上
@@ -145,12 +189,51 @@ namespace IRaCIS.Core.Application.ViewModel
public bool ExixtsUnevaluableState { get; set; }
}
+ ///
+ /// 其他既往新病灶
+ ///
+ public class IRECISTOtherNewTargetLesionDto
+ {
+ ///
+ /// 不存在其他既往新病灶
+ ///
+ public bool NotExistsOtherNewTargetLesion { get; set; }
+
+ ///
+ /// 所有状态为消失
+ ///
+ public bool AllVanish { get; set; }
+
+ ///
+ /// 当任一病灶从非“存在”状态改为“存在”状态
+ ///
+ public bool LastTaskNoExists { get; set; }
+
+ ///
+ /// 至少有一个病灶无法评估
+ ///
+ public bool ExixtsUnevaluableState { get; set; }
+
+ ///
+ /// 至少有一个其它既往新病灶为疑似状态
+ ///
+ public bool ExixtsSuspectedState { get; set; }
+ }
+
+ /////
+ ///// 触发iRECIST后新病灶评估
+ /////
+ //public class NewLesionAfterTriggeringiRECSITAssessmentDto
+ //{
+
+ //}
+
public class IRECISTNewNoTargetLesionDto
{
///
- /// 存在新非靶病灶
+ /// 不存在新非靶病灶
///
- public bool ExistsNewNoTargetLesion { get; set; }
+ public bool NotExistsNewNoTargetLesion { get; set; }
///
/// 所有状态为消失
@@ -159,9 +242,14 @@ namespace IRaCIS.Core.Application.ViewModel
///
- /// 上一访视新靶病灶评估为“iUPD”
+ /// 上一访视新非靶病灶评估
///
- public bool LastTaskIsiUPD { get; set; }
+ public string LastTaskNewNoTargetLesion { get; set; }
+
+ ///
+ /// 当前访视的新靶病灶评估
+ ///
+ public string NewTargetLesion { get; set; }
///
/// 任一新非靶病灶状态为“增大”
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs
index ce53b4424..1ac0f3661 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs
@@ -1545,10 +1545,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// if(基线没有靶病灶)
/// {
/// 靶病灶疗效为 ND
- /// }else if ((上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件)|| 上一访视评估为iUPD || 本次访视SOD增加不小于5mm)
+ /// }
+ /// else if (上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件&&比整体访视期间最低点SOD增加≥20%&&比整体访视期间最低点SOD绝对增加值≥5 mm)
/// {
/// 靶病灶疗效为 ICPD
- /// } else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶))
+ /// }
+ /// else if (上一访视评估为iUPD||本次访视SOD增加不小于5mm)
+ /// {
+ /// 靶病灶疗效为 ICPD
+ /// }
+ /// else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶))
/// {
/// 靶病灶疗效为 iUPD
/// } else if (有任一靶病灶为NE状态)
@@ -1639,18 +1645,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 靶病灶疗效为 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)
+ // else if (上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件&&比整体访视期间最低点SOD增加≥20%&&比整体访视期间最低点SOD绝对增加值≥5 mm)
+ else if (resultData.LastTaskTarget.EqEnum(OverallAssessment.iCPD) && resultData.MeetRECISTPD && resultData.LowSodAddGreaterThan20Percent && resultData.LowSodAddGreaterThan5)
+ {
+ // 靶病灶疗效为 ICPD
+ result = TargetAssessment.iCPD;
+ }
+ // else if (上一访视评估为iUPD||本次访视SOD增加不小于5mm)
+ else if (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))
+ 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)
{
@@ -1683,11 +1695,164 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
#region IRECIST非靶病灶评估
+ ///
+ /// IRECIST非靶病灶评估
+ ///
+ ///
+ /// if(基线没有非靶病灶)
+ /// {
+ /// 非靶病灶疗效为 ND
+ /// }
+ /// else if (上次非靶病灶评估结果为非iUPD && (任一非靶病灶状态评估为“进一步增大(iCPD)||出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”))
+ /// {
+ /// 非靶病灶疗效为 iCPD
+ /// }
+ /// else if (上次非靶病灶评估结果为非iCPD && 任一非靶病灶状态评估为“进一步增大(iCPD)”或“显著增大(iUPD)”)
+ /// {
+ /// 非靶病灶疗效为 iCPD
+ /// }
+ /// else if (满足RECIST1.1的PD标准 && 任一非靶病灶状态评估为“显著增大(iUPD)”)
+ /// {
+ /// 非靶病灶疗效为 iUPD
+ /// }
+ /// else if (有任一非靶病灶为NE状态)
+ /// {
+ /// 非靶病灶疗效为 NE
+ /// }
+ /// else if (全部非靶病灶均为“消失”状态)
+ /// {
+ /// 非靶病灶疗效为 iCR
+ /// }
+ /// else
+ /// {
+ /// 非靶病灶疗效为 iNN
+ /// }
+ ///
+ ///
+ ///
+ public async Task GetIRECISTNoTargetLesionEvaluate(ReadingCalculateDto inDto)
+ {
+ var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList();
+ var lastVisitTaskId = await GetLastVisitTaskId(inDto);
+ var noTargetQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.QuestionId).FirstOrDefault();
+
+ // 找上一次任务 未被评为显著增大的非靶病灶
+ ReadingCalculateDto lastTaskCalculateDto = await _generalCalculateService.GetReadingCalculateDto(lastVisitTaskId);
+
+ var lastTaskNoiUPDIndexs = lastTaskCalculateDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList)
+ .Where(x => x.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && !x.Answer.EqEnum(NoTargetState.IUPD))).Select(x => x.RowIndex).ToList();
+
+
+ IRECISTNoTargetLesion data = new IRECISTNoTargetLesion()
+ {
+ // 基线没有非靶病灶
+ NotExistsNoTargetLesion = tableQuestion.Count() == 0,
+
+ // 上次非靶病灶评估结果
+ LastNoTargetLesion = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == noTargetQuestionId)
+ .Select(x => x.Answer).FirstOrDefaultAsync()) ?? string.Empty,
+
+ // 任一非靶病灶状态评估为“进一步增大(iCPD)”
+ ExistiCPD = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.ICPD)),
+
+ // 出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”
+ LastNoUPD = tableQuestion.Where(x => lastTaskNoiUPDIndexs.Contains(x.RowIndex)).SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.IUPD)),
+
+ // 任一非靶病灶状态评估为 iUPD
+ ExistiUPD = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.IUPD)),
+
+ // 满足RECIST1.1PD
+ RECISTPD = (await GetNoTargetLesionEvaluate(inDto)).EqEnum(NoTargetAssessment.PD),
+
+ // 有任一非靶病灶为NE状态
+ HaveNeLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.UnableEvaluate)),
+
+ // 全部为消失
+ AllVanish = true,
+ };
+
+
+ foreach (var item in tableQuestion)
+ {
+ data.AllVanish = data.AllVanish && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.Loss));
+ }
+
+ NoTargetAssessment result = NoTargetAssessment.iNN;
+
+ // if(基线没有非靶病灶)
+ if (data.NotExistsNoTargetLesion)
+ {
+ // 非靶病灶疗效为 ND
+ result = NoTargetAssessment.ND;
+ }
+ // else if (上次非靶病灶评估结果为非iUPD && (任一非靶病灶状态评估为“进一步增大(iCPD)||出现至少1个上一访视未评估为“显著增大(iUPD)”的病灶本次访视评估为“显著增大(iUPD)”))
+ else if (!data.LastNoTargetLesion.EqEnum(NoTargetAssessment.iUPD) && (data.ExistiCPD || data.LastNoUPD))
+ {
+ // 非靶病灶疗效为 iCPD
+ result = NoTargetAssessment.iCPD;
+ }
+ // else if (上次非靶病灶评估结果为非iCPD && 任一非靶病灶状态评估为“进一步增大(iCPD)”或“显著增大(iUPD)”)
+ else if (!data.LastNoTargetLesion.EqEnum(NoTargetAssessment.iCPD) && (data.ExistiCPD || data.ExistiUPD))
+ {
+ // 非靶病灶疗效为 iCPD
+ result = NoTargetAssessment.iCPD;
+ }
+ // else if (满足RECIST1.1的PD标准 && 任一非靶病灶状态评估为“显著增大(iUPD)”)
+ else if (data.RECISTPD && data.ExistiUPD)
+ {
+ // 非靶病灶疗效为 iUPD
+ result = NoTargetAssessment.iUPD;
+ }
+ // else if (有任一非靶病灶为NE状态)
+ else if (data.HaveNeLesion)
+ {
+ // 非靶病灶疗效为 NE
+ result = NoTargetAssessment.NE;
+ }
+ // else if (全部非靶病灶均为“消失”状态)
+ else if (data.AllVanish)
+ {
+ // 非靶病灶疗效为 iCR
+ result = NoTargetAssessment.iCR;
+ }
+ // else
+ else
+ {
+ // 非靶病灶疗效为 iNN
+ result = NoTargetAssessment.iNN;
+ }
+
+ return result.GetEnumInt();
+ }
#endregion
+ #region IRECIST新靶病灶评估
+
///
- /// 获取新靶病灶评估
+ /// 获取IRECIST新靶病灶评估
///
+ ///
+ /// if(所有新靶病灶消失或一直不存在任何新靶病灶)
+ /// {
+ /// 疗效为 ND
+ /// }
+ /// else if (上一访视新靶病灶评估为“iUPD” && 满足iSOD增加5mm)
+ /// {
+ /// 疗效为 iCPD
+ /// }
+ /// else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶)
+ /// {
+ /// 疗效为 iCPD
+ /// }
+ /// else if (有存在状态的新靶病灶时评估为该结果)
+ /// {
+ /// 疗效为 iUPD
+ /// }
+ /// else if (至少有一个新靶病无法评估)
+ /// {
+ /// 疗效为 NE
+ /// }
+ ///
///
///
public async Task GetNewTargetLesionEvaluate(ReadingCalculateDto inDto)
@@ -1697,33 +1862,322 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
return TargetAssessment.NA.GetEnumInt();
}
-
- IRECISTNewTargetLesionDto resultData = new IRECISTNewTargetLesionDto()
+ var lastVisitTaskId = await GetLastVisitTaskId(inDto);
+ var newTargetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewTargetLesion).Select(x => x.QuestionId).FirstOrDefault();
+ var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault();
+ IRECISTNewTargetLesionDto data = new IRECISTNewTargetLesionDto()
{
- // 是否存在新靶病灶
- ExistsNewTargetLesion = tableQuestion.Count() > 0,
+ // 不存在新靶病灶
+ NotExistsNewTargetLesion = tableQuestion.Count() == 0,
// 所有状态为消失
- AllVanish = false,
+ AllVanish = true,
- // 上一访视新靶病灶评估为“iUPD”
- LastTaskIsiUPD = true,
+ // 上一访视新靶病灶评估
+ LastTaskNewTargetLesion = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == newTargetLesionQuestionId)
+ .Select(x => x.Answer).FirstOrDefaultAsync()) ?? string.Empty,
//SOD增加5mm以上
- ISODAdd5mm = true,
+ ISODAdd5mm = await GetSODData(inDto) - (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == sodQuestionId)
+ .Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0() >= 5,
//有"存在"状态的新靶病灶
- HaveExixtsState = true,
+ HaveExixtsState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist)),
// 至少有一个新靶病无法评估
- ExixtsUnevaluableState = true,
+ ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist)),
};
- return string.Empty;
+
+ foreach (var item in tableQuestion)
+ {
+ data.AllVanish = data.AllVanish && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Loss));
+ }
+
+ NewTargetLesionAssessment result = NewTargetLesionAssessment.NE;
+
+ // if(所有新靶病灶消失或一直不存在任何新靶病灶)
+ if(data.NotExistsNewTargetLesion||data.AllVanish)
+ {
+ // 疗效为 ND
+ result = NewTargetLesionAssessment.ND;
+ }
+ // else if (上一访视新靶病灶评估为“iUPD” && 满足iSOD增加5mm)
+ else if(data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iUPD)&&data.ISODAdd5mm)
+ {
+ // 疗效为 iCPD
+ result = NewTargetLesionAssessment.iCPD;
+ }
+ // else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶)
+ else if (data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iCPD) && data.HaveExixtsState)
+ {
+ // 疗效为 iCPD
+ result = NewTargetLesionAssessment.iCPD;
+ }
+ // else if (有存在状态的新靶病灶时评估为该结果)
+ else if ( data.HaveExixtsState)
+ {
+ // 疗效为 iUPD
+ result = NewTargetLesionAssessment.iUPD;
+ }
+ // else if (至少有一个新靶病无法评估)
+ else if (data.ExixtsUnevaluableState)
+ {
+ // 疗效为 NE
+ result = NewTargetLesionAssessment.iUPD;
+ }
+
+ return result.GetEnumInt();
}
#endregion
+ #region 获取新非靶病灶评估
+ ///
+ /// 获取新非靶病灶评估
+ ///
+ ///
+ /// if(所有新非靶病灶消失或一直不存在任何新非靶病灶时评估为该结果)
+ /// {
+ /// 疗效为 ND
+ /// }
+ /// else if (上一访视新非靶病灶评估为“iUPD” && 满足任一新非靶病灶状态为“增大”)
+ /// {
+ /// 疗效为 iCPD
+ /// }
+ /// else if (上一访视新非靶病灶评估为“iCPD”&& 有"存在"状态的新非靶病灶)
+ /// {
+ /// 疗效为 iCPD
+ /// }
+ /// else if (当有存在状态的新非靶病灶)
+ /// {
+ /// 疗效为 iUPD
+ /// }
+ /// else if (至少有一个新非靶病无法评估)
+ /// {
+ /// 疗效为 NE
+ /// }
+ ///
+ ///
+ ///
+ public async Task GetNewNoTargetLesionEvaluate(ReadingCalculateDto inDto)
+ {
+ var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NewNonTargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
+
+ var newTargetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewTargetLesion).Select(x => x.QuestionId).FirstOrDefault();
+ var lastVisitTaskId = await GetLastVisitTaskId(inDto);
+ var newNoTargetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewNoTargetLesion).Select(x => x.QuestionId).FirstOrDefault();
+ IRECISTNewNoTargetLesionDto data = new IRECISTNewNoTargetLesionDto()
+ {
+ // 不存在新非靶病灶
+ NotExistsNewNoTargetLesion = tableQuestion.Count() == 0,
+
+ // 所有状态为消失
+ AllVanish = tableQuestion.Count() == tableQuestion.Where(x => x.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewNoTargetLesionState.Loss))).Count(),
+
+ // 上一访视新非靶病灶评估
+ LastTaskNewNoTargetLesion = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == newNoTargetLesionQuestionId)
+ .Select(x => x.Answer).FirstOrDefaultAsync()) ?? string.Empty,
+
+ //当前访视的新靶病灶评估
+ NewTargetLesion = inDto.QuestionInfo.Where(x=>x.QuestionId== newTargetLesionQuestionId).Select(x=>x.Answer).FirstIsNullReturnEmpty(),
+
+ // 任一新非靶病灶状态为“增大”
+ ExixtsEnlargementState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewNoTargetLesionState.Progression)),
+
+ // 有"存在"状态的病灶
+ HaveExixtsState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewNoTargetLesionState.Exist)),
+
+ // 至少有一个病灶无法评估
+ ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewNoTargetLesionState.NotEvaluable)),
+ };
+
+ NewNoTargetLesionAssessment result = NewNoTargetLesionAssessment.NE;
+
+ // if(所有新非靶病灶消失或一直不存在任何新非靶病灶时评估为该结果)
+ if(data.NotExistsNewNoTargetLesion|| data.AllVanish)
+ {
+ // 疗效为 ND
+ result = NewNoTargetLesionAssessment.ND;
+ }
+ // else if (上一访视新非靶病灶评估为“iUPD” && 满足任一新非靶病灶状态为“增大”)
+ else if(data.LastTaskNewNoTargetLesion.EqEnum(NewNoTargetLesionAssessment.iUPD)&& data.ExixtsEnlargementState)
+ {
+ // 疗效为 iCPD
+ result = NewNoTargetLesionAssessment.iCPD;
+ }
+ // else if (上一访视新非靶病灶评估为“iCPD”&& 有"存在"状态的新非靶病灶)
+ else if (data.LastTaskNewNoTargetLesion.EqEnum(NewNoTargetLesionAssessment.iCPD) && data.HaveExixtsState)
+ {
+ // 疗效为 iCPD
+ result = NewNoTargetLesionAssessment.iCPD;
+ }
+ // else if (当有存在状态的新非靶病灶)
+ else if (data.HaveExixtsState)
+ {
+ // 疗效为 iUPD
+ result = NewNoTargetLesionAssessment.iUPD;
+ }
+ // else if (至少有一个新非靶病无法评估)
+ else if(data.ExixtsUnevaluableState)
+ {
+ // 疗效为 NE
+ result = NewNoTargetLesionAssessment.NE;
+ }
+
+ return result.GetEnumInt();
+ }
+ #endregion
+
+ #region 其它既往新病灶评估
+ ///
+ /// 获取其它既往新病灶评估
+ ///
+ ///
+ /// if(有其它既往新病灶消失或一直不存在任何其它既往新病灶)
+ /// {
+ /// 疗效为 ND
+ /// }
+ /// else if (任一病灶从非“存在”状态改为“存在”状态)
+ /// {
+ /// 疗效为 iUPD
+ /// }
+ /// else if (至少有一个其它既往新病灶无法评估)
+ /// {
+ /// 疗效为 NE
+ /// }
+ /// else if (至少有一个其它既往新病灶为疑似状态)
+ /// {
+ /// 疗效为 疑似
+ /// }
+ ///
+ ///
+ ///
+ public async Task GetOtherNewTargetLesionEvaluate(ReadingCalculateDto inDto)
+ {
+ var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.OtherPreviousNewLesion).SelectMany(x => x.TableRowInfoList).ToList();
+
+ var lastVisitTaskId = await GetLastVisitTaskId(inDto);
+
+
+ // 找上一次任务 未被评为显著增大的非靶病灶
+ ReadingCalculateDto lastTaskCalculateDto = await _generalCalculateService.GetReadingCalculateDto(lastVisitTaskId);
+
+ var lastTaskNoExistIndexs = lastTaskCalculateDto.QuestionInfo.Where(x => x.LesionType == LesionType.OtherPreviousNewLesion).SelectMany(x => x.TableRowInfoList)
+ .Where(x => x.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && !x.Answer.EqEnum(OtherPreviousNewLesionState.Exists))).Select(x => x.RowIndex).ToList();
+
+ IRECISTOtherNewTargetLesionDto data = new IRECISTOtherNewTargetLesionDto()
+ {
+ // 不存在其他既往新病灶
+ NotExistsOtherNewTargetLesion = tableQuestion.Count() == 0,
+
+ // 所有状态为消失
+ AllVanish = tableQuestion.Count() == tableQuestion.Where(x => x.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(OtherPreviousNewLesionState.Loss))).Count(),
+
+ // 当任一病灶从非“存在”状态改为“存在”状态
+ LastTaskNoExists = tableQuestion.Where(x => lastTaskNoExistIndexs.Contains(x.RowIndex)).SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(OtherPreviousNewLesionState.Exists)),
+
+ // 至少有一个病灶无法评估
+ ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(OtherPreviousNewLesionState.NotEvaluable)),
+
+ // 至少有一个其它既往新病灶为疑似状态
+ ExixtsSuspectedState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(OtherPreviousNewLesionState.Equivocal)),
+
+ };
+
+ OtherPreviousNewLesionAssessment result = OtherPreviousNewLesionAssessment.Equivocal;
+
+ // if(有其它既往新病灶消失或一直不存在任何其它既往新病灶)
+ if (data.NotExistsOtherNewTargetLesion || data.AllVanish)
+ {
+ // 疗效为 ND
+ result = OtherPreviousNewLesionAssessment.ND;
+ }
+ // else if (任一病灶从非“存在”状态改为“存在”状态)
+ else if (data.LastTaskNoExists)
+ {
+ // 疗效为 iUPD
+ result = OtherPreviousNewLesionAssessment.iUPD;
+ }
+ // else if (至少有一个其它既往新病灶无法评估)
+ else if (data.ExixtsUnevaluableState)
+ {
+ // 疗效为 NE
+ result = OtherPreviousNewLesionAssessment.NE;
+ }
+ // else if (至少有一个其它既往新病灶为疑似状态)
+ else if (data.ExixtsSuspectedState)
+ {
+ // 疗效为 疑似
+ result = OtherPreviousNewLesionAssessment.Equivocal;
+ }
+
+ return result.GetEnumInt();
+
+ }
+ #endregion
+
+ #region 触发iRECIST后新病灶评估
+ ///
+ ///
+ ///
+ ///
+ /// if现至少1个“存在”状态的触发iRECIST后新病灶)
+ /// {
+ /// 疗效为 是
+ /// }
+ /// else if (只要有一个触发iRECIST后新病灶评估为NE)
+ /// {
+ /// 疗效为 NE
+ /// }
+ /// else if (只要有一个触发iRECIST后新病灶评估为疑似)
+ /// {
+ /// 疗效为 疑似
+ /// }
+ /// else
+ /// {
+ /// 疗效为 否
+ /// }
+ ///
+ ///
+ ///
+ ///
+ public async Task GetNewLesionAfterTriggeringiRECSITAssessment(ReadingCalculateDto inDto)
+ {
+ var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TriggeringIRECSIT).SelectMany(x => x.TableRowInfoList).ToList();
+
+ NewLesionAfterTriggeringiRECSITAssessment result = NewLesionAfterTriggeringiRECSITAssessment.No;
+
+ // if现至少1个“存在”状态的触发iRECIST后新病灶)
+ if (tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionAfterTriggeringiRECSITState.Exist)))
+ {
+ // 疗效为 是
+ result = NewLesionAfterTriggeringiRECSITAssessment.Yes;
+ }
+ // else if (只要有一个触发iRECIST后新病灶评估为NE)
+ else if (tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionAfterTriggeringiRECSITState.NotEvaluable)))
+ {
+ // 疗效为 NE
+ result = NewLesionAfterTriggeringiRECSITAssessment.NE;
+ }
+ // else if (只要有一个触发iRECIST后新病灶评估为疑似)
+ else if (tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionAfterTriggeringiRECSITState.Equivocal)))
+ {
+ // 疗效为 疑似
+ result = NewLesionAfterTriggeringiRECSITAssessment.Equivocal;
+ }
+ // else
+ else
+ {
+ // 疗效为 否
+ result = NewLesionAfterTriggeringiRECSITAssessment.No;
+ }
+
+ return result.GetEnumInt();
+ }
+ #endregion
+ #endregion
+
#region 获取靶病灶评估
diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
index 6a147cf42..ff826d146 100644
--- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
+++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs
@@ -438,6 +438,106 @@ namespace IRaCIS.Core.Domain.Share
Yes = 1
}
+ ///
+ /// 其他既往新病灶状态
+ ///
+ public enum OtherPreviousNewLesionState
+ {
+ ///
+ /// 存在
+ ///
+ Exists = 0,
+
+ ///
+ /// 疑似
+ ///
+ Equivocal = 1,
+
+ ///
+ /// 无法评估
+ ///
+ NotEvaluable = 2,
+
+ ///
+ /// 消失
+ ///
+ Loss = 3,
+ }
+
+ ///
+ /// 其他既往新病灶评估
+ ///
+ public enum OtherPreviousNewLesionAssessment
+ {
+
+ iUPD = 1,
+
+ iCPD = 2,
+
+ ///
+ /// 疑似
+ ///
+ Equivocal = 3,
+
+ NE = 4,
+
+ ND = 5,
+ }
+
+ ///
+ /// 触发iRECIST后新病灶状态
+ ///
+ public enum NewLesionAfterTriggeringiRECSITState
+ {
+ ///
+ /// 存在
+ ///
+ Exist=1,
+
+ ///
+ /// 疑似
+ ///
+ Equivocal=2,
+
+ ///
+ /// 消失
+ ///
+ Loss =3,
+
+ ///
+ /// 无法评估
+ ///
+ NotEvaluable = 4,
+
+ }
+
+ ///
+ /// 触发iRECIST后新病灶评估
+ ///
+ public enum NewLesionAfterTriggeringiRECSITAssessment
+ {
+
+ ///
+ /// 是
+ ///
+ Yes = 1,
+
+ ///
+ /// 否
+ ///
+ No = 2,
+
+ ///
+ /// 疑似
+ ///
+ Equivocal = 3,
+
+ ///
+ /// NE
+ ///
+ NE = 4
+ }
+
///
/// 整体肿瘤评估
///
@@ -598,7 +698,12 @@ namespace IRaCIS.Core.Domain.Share
///
NN = 4,
-
+ iCR = 5,
+
+ iNN = 6,
+ iUPD = 7,
+ iCPD = 8,
+
}
///
@@ -1051,6 +1156,64 @@ namespace IRaCIS.Core.Domain.Share
UpdateType = 3
}
+ ///
+ /// 新靶病灶状态
+ ///
+ public enum NewTargetLesionState
+ {
+ ///
+ /// 存在
+ ///
+ Exist=1,
+
+ ///
+ /// 消失
+ ///
+ Loss=2,
+
+ ///
+ /// 无法评估
+ ///
+ NotEvaluable=3,
+ }
+
+ ///
+ /// 新非靶病灶状态
+ ///
+ public enum NewNoTargetLesionState
+ {
+ ///
+ /// 存在
+ ///
+ Exist = 1,
+
+ ///
+ /// 增大
+ ///
+ Progression = 1,
+
+ ///
+ /// 无法评估
+ ///
+ NotEvaluable = 2,
+
+ ///
+ /// 消失
+ ///
+ Loss = 3,
+ }
+
+ ///
+ /// 新非靶病灶评估
+ ///
+ public enum NewNoTargetLesionAssessment
+ {
+ iUPD = 1,
+ iCPD = 2,
+ NE = 3,
+ ND = 4,
+ }
+
public enum QuestionMark
{
///
@@ -1277,6 +1440,24 @@ namespace IRaCIS.Core.Domain.Share
IsConverted = 44,
}
+ ///
+ /// 新靶病灶评估
+ ///
+ public enum NewTargetLesionAssessment
+ {
+
+ iUPD = 1,
+
+
+ iCPD = 2,
+
+
+ NE = 3,
+
+
+ ND = 4,
+ }
+
///
/// 访视点肿瘤评估
///