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, + } + /// /// 访视点肿瘤评估 ///