diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 6e842f51..26d9aad8 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1393,6 +1393,13 @@ + + + 获取存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上的病灶 + + + + 被评估为NE的单个靶病灶 @@ -2023,22 +2030,22 @@ SOD 百分比 与基线期SOD相比减小<30% - + SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% - + SOD 百分比 比整体访视期间最低点SOD增加≥20% - + SOD 变化值 比整体访视期间最低点SOD绝对增加值<5 mm - + 比整体访视期间最低点SOD绝对增加值≥5 mm @@ -2073,6 +2080,16 @@ 该淋巴结靶病灶短径绝对增加值≥5 mm + + + 靶病灶短径增加值有5mm的Index + + + + + 短径有10mm的Index + + 阅片计算Dto diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 4fab6332..71fb881d 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -62,22 +62,22 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% /// - public bool LowPercentLess20 { get; set; } + public bool LowSODPercentLess20 { get; set; } /// /// SOD 百分比 比整体访视期间最低点SOD增加≥20% /// - public bool LowPercentBigger20 { get; set; } + public bool LowSODPercentBigger20 { get; set; } /// /// SOD 变化值 比整体访视期间最低点SOD绝对增加值<5 mm /// - public bool LowChangeLess5 { get; set; } + public bool LowSODChangeLess5 { get; set; } /// /// 比整体访视期间最低点SOD绝对增加值≥5 mm /// - public bool LowChangeBigger5 { get; set; } + public bool LowSODChangeBigger5 { get; set; } /// /// 被评估为NE的单个靶病灶 是否存在状态为不可评估的靶病灶 @@ -109,6 +109,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool IsAddFive { get; set; } + /// + /// 靶病灶短径增加值有5mm的Index + /// + public List AddFiveIndexs { get; set; } + + /// + /// 短径有10mm的Index + /// + public List ShortBigger10Indexs { get; set; } } /// diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs index 4f94fe61..a46afeba 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs @@ -264,6 +264,7 @@ namespace IRaCIS.Application.Services x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && x.SubjectId == taskInfo.SubjectId && x.IsAnalysisCreate == taskInfo.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < taskInfo.VisitTaskNum) .Where(x => x.DoctorUserId == taskInfo.DoctorUserId) + .OrderByDescending(x=>x.VisitTaskNum) .FirstOrDefaultAsync(); List? globalAnswers = new List(); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index e2e65f24..2bd8fec5 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -1863,6 +1863,10 @@ namespace IRaCIS.Application.Services { TrialId = inDto.TrialId, TrialReadingCriterionId = trialReadingCriterionId.Value, + Page=new PageInput() { + PageIndex=1, + PageSize=99999, + } })).Item2; var index = 0; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index d7fdd40b..1bd970ed 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -1045,15 +1045,26 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { return YesOrNoOrNa.NA.GetEnumInt(); } + var addFiveList = await GetIsAddFiveRowIndexs(inDto); + var isExists = addFiveList.Count() > 0 ? true : false; + return isExists ? YesOrNoOrNa.Yes.GetEnumInt() : YesOrNoOrNa.No.GetEnumInt(); + + } + + /// + /// 获取存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上的病灶 + /// + /// + /// + public async Task> GetIsAddFiveRowIndexs(ReadingCalculateDto inDto) + { + List result = new List(); var LastVisitTaskId = await this.GetLastVisitTaskId(inDto); - var questionIds = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).Select(x => x.QuestionId).ToList(); var lastQuestionAsnwer = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == LastVisitTaskId && questionIds.Contains(x.QuestionId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); var rowIndexs = lastQuestionAsnwer.Where(x => x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)).Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToList(); var thisQuestionAsnwer = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); - - var isExists = false; foreach (var item in rowIndexs) { var lastValue = lastQuestionAsnwer.Where(x => x.RowIndex == item && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); @@ -1063,12 +1074,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (thisValue - lastValue >= 5) { - isExists = true; + result.Add(item); } } - return isExists ? YesOrNoOrNa.Yes.GetEnumInt() : YesOrNoOrNa.No.GetEnumInt(); - + return result; } #endregion @@ -1447,6 +1457,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate TargetLesionCalculateDto resultData = new TargetLesionCalculateDto() { + + // 是否存在靶病灶 ExistsTargetLesion = tableQuestion.Count() > 0, @@ -1466,24 +1478,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate SODPercent = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()), // SOD 百分比与基线期SOD相比减小≥30% bool - SODPercentBigger30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <=- 30, + SODPercentBigger30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <= -30, // SOD 百分比 与基线期SOD相比减小<30% bool - SODPercentLess30 = 0>inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0())&& + SODPercentLess30 = 0 > inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) && inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) > -30, // SOD 百分比 整体访视期间SOD最低点SOD相比增加<20% - LowPercentLess20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 20, + LowSODPercentLess20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 20, // SOD 百分比 比整体访视期间SOD最低点SOD增加≥20% - LowPercentBigger20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, + LowSODPercentBigger20 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20, // SOD 变化值 比整体访视期间SOD最低点SOD绝对增加值<5 mm - LowChangeLess5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 5, - + LowSODChangeLess5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) < 5, + // 比整体访视期间SOD最低点SOD绝对增加值≥5 mm - LowChangeBigger5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, + LowSODChangeBigger5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowestIncrease).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5, // 被评估为NE的单个靶病灶 是否存在状态为不可评估的靶病灶 ExixtsNETargetLesion = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)), @@ -1497,6 +1509,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 当前访视点淋巴结病灶, 至少一个淋巴结靶病灶短径≥10 mm CurrenShortBigger10 = false, + // 靶病灶短径增加值有5mm的Index + AddFiveIndexs = await GetIsAddFiveRowIndexs(inDto), + + // 短径有10mm的Index + ShortBigger10Indexs = new List(), + //淋巴结非靶病灶状态全部为消失 NonTargetStateIsLoss = true, @@ -1523,7 +1541,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 淋巴结的短径 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; + var shortIsBigger10 = (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0() >= 10; + resultData.CurrenShortBigger10= resultData.CurrenShortBigger10|| shortIsBigger10; + + if (shortIsBigger10) + { + resultData.ShortBigger10Indexs.Add(item.RowIndex); + } } @@ -1575,7 +1599,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (resultData.LowSod > 0) { // if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) - if (resultData.LowPercentBigger20 && resultData.LowChangeBigger5) + if (resultData.LowSODPercentBigger20 && resultData.LowSODChangeBigger5) { // 靶病灶疗效为 PD result = TargetAssessment.PD; @@ -1585,7 +1609,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { //进入该分支最低点SOD=0 // if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) - if (resultData.PresentSod > 0 && resultData.LowChangeBigger5) + if (resultData.PresentSod > 0 && resultData.LowSODChangeBigger5) { // 靶病灶疗效为PD result = TargetAssessment.PD; @@ -1595,7 +1619,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (resultData.LastTargetLesionEvaluate.EqEnum(TargetAssessment.CR)) { //if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) - if (resultData.CurrenShortBigger10 && resultData.IsAddFive) + // 换句话说 就是 短径≥10 的病灶 和 短径增加值≥5的病灶 的交集数量大于0 + if (resultData.ShortBigger10Indexs.Intersect(resultData.AddFiveIndexs).ToList().Count()>0) { //靶病灶疗效为 PD result = TargetAssessment.PD;