diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index ad48de76..b0e13ad8 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -2020,7 +2020,7 @@ - SOD 百分比 整体访视期间最低点SOD相比增加 + SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% @@ -2050,7 +2050,7 @@ - 当前访视点非淋巴结病灶长径>0 + 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index a85d8b4b..8ac891b4 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -630,6 +630,7 @@ namespace IRaCIS.Application.Services IsSign = x.IsSign, ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, CriterionEnumList = x.ClinicalDataTrialSet.CriterionEnumList, + TrialClinicalDataSetCriteriaList=x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList, Id = x.Id, UploadRole = x.ClinicalDataTrialSet.UploadRole, IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC, @@ -647,8 +648,9 @@ namespace IRaCIS.Application.Services // 根据标准 if (inDto.VisitTaskId != null) { - var criterionType = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).Select(x => x.TrialReadingCriterion.CriterionType).FirstNotNullAsync(); - result = result.Where(x => x.CriterionEnumList.Contains((int)criterionType)).ToList(); + var visitTaskInfo = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId); + + result = result.Where(x => x.TrialClinicalDataSetCriteriaList.Any(z=>z.TrialReadingCriterionId==visitTaskInfo.TrialReadingCriterionId)).ToList(); } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 8e854dd3..4fab6332 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -25,7 +25,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public decimal LowSod { get; set; } /// - /// 是否存在靶病灶 + /// 当前SOD + /// + public decimal PresentSod { get; set; } + + /// + /// 是否存在靶病灶 (当前访视 至少一个靶病灶的状态为存在) /// public bool ExistsTargetLesion { get; set; } @@ -55,7 +60,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool SODPercentLess30 { get; set; } /// - /// SOD 百分比 整体访视期间最低点SOD相比增加 + /// SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% /// public bool LowPercentLess20 { get; set; } @@ -85,7 +90,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string LastTargetLesionEvaluate { get; set; } /// - /// 当前访视点非淋巴结病灶长径>0 + /// 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 /// public bool CurrentMajoreBigger0 { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index 2be2e2e4..6ec1ee08 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -389,6 +389,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public ClinicalDataTable ClinicalTableData { get; set; } + + public List TrialClinicalDataSetCriteriaList { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index c3dd14ba..e2e65f24 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -1977,6 +1977,8 @@ namespace IRaCIS.Application.Services task.IsNeedReadClinicalData = clinicalDataList.Where(x => x.ClinicalDataLevel != ClinicalLevel.Subject).Count() > 0; } + // 如果已经签名 就不需要再读了 + task.IsNeedReadClinicalData = visitTaskInfo.ReadingTaskState == ReadingTaskState.HaveSigned ? false : task.IsNeedReadClinicalData; task.DigitPlaces = criterionInfo.DigitPlaces; task.CriterionType = criterionInfo.CriterionType; task.IseCRFShowInDicomReading = criterionInfo.IseCRFShowInDicomReading; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 31ef0224..d7fdd40b 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -1377,54 +1377,63 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - /// 靶病灶疗效评估算法: - ///if(没有靶病灶) + /// 靶病灶疗效评估算法-20230306确认版本: + ///if(基线没有靶病灶) ///{ - ///靶病灶疗效为 ND + /// 靶病灶疗效为 ND ///}else ///{ - ///初始化靶病灶疗效为 SD - ///If(上次访视点评估是CR) - ///{ - ///修改靶病灶疗效为 CR - ///If (有被评估为NE的单个靶病灶) - ///{ - ///靶病灶疗效为 NE - ///} - ///If(当前访视点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) - ///{ - /// 靶病灶疗效为 PD - ///} - ///If(当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) - ///{ - /// 靶病灶疗效为 PD - ///} - ///} else - ///{ - /// if(最低点SOD不为0,比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值(mm)≥5 mm) + /// 初始化靶病灶疗效为 SD + /// + /// if (与基线期SOD相比减小≥30 %) + /// { + /// 靶病灶疗效为 PR + /// + /// } + /// + ///if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10且淋巴结非靶病灶全部消失) + /// { + /// 靶病灶疗效为 CR + /// + /// } + /// + ///if (有被评估为NE的单个靶病灶) + /// { + /// 靶病灶疗效为 NE + /// + /// } + /// + ///if (最低点SOD > 0) ///{ + /// if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + /// { /// 靶病灶疗效为 PD - ///}else - /// { - /// if (有被评估为NE的单个靶病灶) + /// + /// } + ///} + ///else ///{ - /// 靶病灶疗效为 NE - ///}else - /// { - /// if (与基线期SOD相比减小≥30 % - ///{ - /// if (与整体访视期间最低点SOD相比增加<20 % 或者 比整体访视期间最低点SOD绝对增加值<5 mm) - ///{ - /// 靶病灶疗效为 PR + /// //进入该分支最低点SOD=0 + /// if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + /// { + /// 靶病灶疗效为PD + /// + /// } ///} /// - /// if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10) - ///{ - /// 靶病灶疗效为 CR - ///} - /// } + ///if(上次访视点评估是CR) + /// { + /// if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + /// { + /// 靶病灶疗效为 PD + /// /// } - /// } + /// if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + /// { + /// 靶病灶疗效为 PD + /// + /// } + ///} ///} /// /// @@ -1435,14 +1444,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { return TargetAssessment.NA.GetEnumInt(); } - + TargetLesionCalculateDto resultData = new TargetLesionCalculateDto() { // 是否存在靶病灶 - ExistsTargetLesion= tableQuestion.Count()>0, + ExistsTargetLesion = tableQuestion.Count() > 0, // 最低SOD - LowSod=(await GetLowSODVisit(inDto)).Select(x=>x.SOD).FirstOrDefault(), + LowSod = (await GetLowSODVisit(inDto)).Select(x => x.SOD).FirstOrDefault(), + + // 当前Sod + PresentSod = (await GetSODData(inDto)) ?? 0, //非淋巴结靶病灶长径之和 decimal SumOfDiameter = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SumOfDiameter).Sum(x => x.Answer.IsNullOrEmptyReturn0()), @@ -1479,11 +1491,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate //// 上次访视点整体肿瘤评估 LastTargetLesionEvaluate = string.Empty, - // 当前访视点非淋巴结病灶长径>0 - CurrentMajoreBigger0 = true, + // 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm + CurrentMajoreBigger0 = false, - // 至少一个淋巴结靶病灶短径≥10 mm - CurrenShortBigger10 = true, + // 当前访视点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm + CurrenShortBigger10 = false, //淋巴结非靶病灶状态全部为消失 NonTargetStateIsLoss = true, @@ -1499,7 +1511,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) { // 淋巴结非靶病灶状态全部为消失 - resultData.NonTargetStateIsLoss = item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault()== NoTargetState.Loss.GetEnumInt(); + resultData.NonTargetStateIsLoss = resultData.NonTargetStateIsLoss&& item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault()== NoTargetState.Loss.GetEnumInt(); } } @@ -1509,15 +1521,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))) { // 淋巴结的短径 - resultData.DiameterLessThan10 = (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() < 10; + resultData.DiameterLessThan10 = resultData.DiameterLessThan10&&(item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() < 10; + + resultData.CurrenShortBigger10= resultData.CurrenShortBigger10|| (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.CurrentMajoreBigger0 = (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() > 0; + // 当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径 + resultData.CurrentMajoreBigger0 = resultData.CurrentMajoreBigger0|| (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() > 0; } } @@ -1527,64 +1541,126 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate resultData.LastTargetLesionEvaluate = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastVisitTaskId && x.ReadingQuestionTrialId == questionId) .Select(x => x.Answer).FirstOrDefaultAsync()) ?? string.Empty; - - - - TargetAssessment result = TargetAssessment.SD; + //if(基线没有靶病灶) if (!resultData.ExistsTargetLesion) { + // 靶病灶疗效为 ND result = TargetAssessment.ND; } else { - if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) + //初始化靶病灶疗效为 SD + result = TargetAssessment.SD; + + //if (与基线期SOD相比减小≥30 %) + if (resultData.SODPercentBigger30) { - if (resultData.ExixtsNETargetLesion) - { - result = TargetAssessment.NE; - } - if (resultData.CurrenShortBigger10 && resultData.IsAddFive) - { - result = TargetAssessment.PD; - } - if (resultData.CurrentMajoreBigger0) + //靶病灶疗效为 PR + result = TargetAssessment.PR; + } + //if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10且淋巴结非靶病灶全部消失) + if (resultData.SumOfDiameter == 0 && resultData.DiameterLessThan10 && resultData.NonTargetStateIsLoss) + { + //靶病灶疗效为 CR + result = TargetAssessment.CR; + } + // if (有被评估为NE的单个靶病灶) + if (resultData.ExixtsNETargetLesion) + { + // 靶病灶疗效为 NE + result = TargetAssessment.NE; + } + //if (最低点SOD > 0) + if (resultData.LowSod > 0) + { + // if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + if (resultData.LowPercentBigger20 && resultData.LowChangeBigger5) { + // 靶病灶疗效为 PD result = TargetAssessment.PD; } } - else { - if (resultData.LowSod != 0 && resultData.LowPercentBigger20 && resultData.LowChangeBigger5) + //进入该分支最低点SOD=0 + // if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + if (resultData.PresentSod > 0 && resultData.LowChangeBigger5) { + // 靶病灶疗效为PD result = TargetAssessment.PD; } - else - { - if (resultData.ExixtsNETargetLesion) - { - result = TargetAssessment.NE; - } - else - { - if (resultData.SODPercentBigger30) - { - if (resultData.LowPercentLess20 || resultData.LowChangeLess5) - { - result = TargetAssessment.PR; - } - - if (resultData.SumOfDiameter == 0 && resultData.DiameterLessThan10&&resultData.NonTargetStateIsLoss) - { - result = TargetAssessment.CR; - } - } - } - } - - } + //if(上次访视点评估是CR) + if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) + { + //if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + if (resultData.CurrenShortBigger10 && resultData.IsAddFive) + { + //靶病灶疗效为 PD + result = TargetAssessment.PD; + } + //if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + if (resultData.CurrentMajoreBigger0) + { + //靶病灶疗效为 PD + result = TargetAssessment.PD; + } + } + + + + #region 之前的逻辑 备注 + //if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) + //{ + // if (resultData.ExixtsNETargetLesion) + // { + // result = TargetAssessment.NE; + // } + // if (resultData.CurrenShortBigger10 && resultData.IsAddFive) + // { + // result = TargetAssessment.PD; + // } + // if (resultData.CurrentMajoreBigger0) + // { + // result = TargetAssessment.PD; + // } + //} + + //else + //{ + // if (resultData.LowSod != 0 && resultData.LowPercentBigger20 && resultData.LowChangeBigger5) + // { + // result = TargetAssessment.PD; + // } + // else + // { + // if (resultData.ExixtsNETargetLesion) + // { + // result = TargetAssessment.NE; + // } + // else + // { + // if (resultData.SODPercentBigger30) + // { + // if (resultData.LowPercentLess20 || resultData.LowChangeLess5) + // { + // result = TargetAssessment.PR; + // } + + // if (resultData.SumOfDiameter == 0 && resultData.DiameterLessThan10 && resultData.NonTargetStateIsLoss) + // { + // result = TargetAssessment.CR; + // } + // } + // } + // } + + + //} + #endregion + + } return result.GetEnumInt();