diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index a8c54a077..dab5f2a05 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -50,6 +50,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsChangeOtherTask { get; set; } + + public ComputationTrigger ComputationTrigger { get; set; } } public class TargetLesionCalculateDto @@ -218,7 +220,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid SubjectVisitId { get; set; } - public Arm ArmEnum { get; set; } + public Arm ArmEnum { get; set; } + + public ComputationTrigger ComputationTrigger { get; set; } = ComputationTrigger.Lesion; /// /// 是否修改其他任务 @@ -348,6 +352,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public QuestionType QuestionType { get; set; } + + public ComputationTrigger? ComputationTrigger { get; set; } + public Func> GetDecimalFun { get; set; } public Func> GetIntFun { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 495dbc433..dcf3282cb 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -1741,6 +1741,7 @@ namespace IRaCIS.Application.Services { IsChangeOtherTask = false, VisitTaskId = inDto.VisitTaskId, + ComputationTrigger=ComputationTrigger.Lesion, }); return ResponseOutput.Ok(true); } @@ -2141,6 +2142,7 @@ namespace IRaCIS.Application.Services { IsChangeOtherTask = false, VisitTaskId = inDto.VisitTaskId, + ComputationTrigger = ComputationTrigger.Lesion, }); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs index ff966babf..49509412d 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/ReadingCalculateService.cs @@ -196,7 +196,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { await service.CalculateTask(new CalculateTaskInDto() { - + ComputationTrigger= ComputationTrigger.Report, VisitTaskId = inDto.VisitTaskId }); } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs index 9de580fbe..2308d2d46 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs @@ -429,6 +429,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId); readingData.IsChangeOtherTask = inDto.IsChangeOtherTask; + readingData.ComputationTrigger = inDto.ComputationTrigger; await ReadingCalculate(readingData); } @@ -493,16 +494,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate}, //新病灶评估 - new ReadingCalculateData (){QuestionType=QuestionType.NewLesions,GetStringFun=GetNewLesionEvaluate}, + new ReadingCalculateData (){QuestionType=QuestionType.NewLesionEvaluation,GetStringFun=GetNewLesionEvaluate}, + + //获取肝脏评估 + new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment}, + + // 骨髓中是否存在局灶性 FDG亲和病灶的证据 + new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTrigger=ComputationTrigger.Lesion}, //CT/MRI new ReadingCalculateData (){QuestionType=QuestionType.CTandMRI,GetStringFun=CTMRIEvaluation}, // PET 5PS评分 - new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS}, + new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS,ComputationTrigger=ComputationTrigger.Lesion}, //与基线相比摄取值变化 - new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange}, + new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange,ComputationTrigger=ComputationTrigger.Lesion}, // FDG-PET 评估结果 new ReadingCalculateData (){QuestionType=QuestionType.FDGPET,GetStringFun=GetFDGPETOverallAssessment}, @@ -518,8 +525,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // SUVmax所在病灶 new ReadingCalculateData (){QuestionType=QuestionType.SUVmaxLesion,GetStringFun=GetSuvMaxFocus}, - //获取肝脏评估 - new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment}, + + + ////靶病灶径线之和(SOD) //new ReadingCalculateData (){QuestionType=QuestionType.SOD,GetDecimalNullFun=GetSODData}, @@ -602,6 +610,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate calculateList = calculateList.Where(x => calculateType.Contains(x.QuestionType)).ToList(); } + + calculateList = calculateList.Where(x => x.ComputationTrigger == null || x.ComputationTrigger == inDto.ComputationTrigger).ToList(); var typeNAList = new List { QuestionType.SODChange, @@ -1622,7 +1632,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0(); if (baseLineSpd != 0) { - return (presentSpd - baseLineSpd) / baseLineSpd; + return (presentSpd - baseLineSpd)*100 / baseLineSpd; } else { @@ -1913,10 +1923,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task GetPET5PS(ReadingCalculateDto inDto) { - if (inDto.IsBaseLine) + //if (inDto.IsBaseLine) + //{ + // return SpleenAssessment.Stabilization.GetEnumInt(); + //} + + if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt())) { - return SpleenAssessment.Stabilization.GetEnumInt(); + return PET5PSScore.NE.GetEnumInt(); } + + + PET5PSScore result = PET5PSScore.X; // 最大Suvmax @@ -1978,6 +1996,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return SUVChangeVSBaseline.NotEvaluable.GetEnumInt(); } + if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt())) + { + return SUVChangeVSBaseline.NotEvaluable.GetEnumInt(); + } + var result = SUVChangeVSBaseline.NotEvaluable; var baseLineTaskId = await GetBaseLineTaskId(inDto); @@ -2081,7 +2104,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate new CalculationDto(){ Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Five,PET5PSScore.Four }), Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.Decrease }), - Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.YesSustain}), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}), Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.PMR }), }, @@ -2089,7 +2112,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate new CalculationDto(){ Column1=ReadingCommon.EnumToString(new List() { PET5PSScore.Five,PET5PSScore.Four }), Column2=ReadingCommon.EnumToString(new List() { SUVChangeVSBaseline.DidNotChange }), - Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.YesSustain}), + Column3=ReadingCommon.EnumToString(new List() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}), Column4=ReadingCommon.EnumToString(new List() { FDGPETOverallAssessment.NMR }), }, }; @@ -2105,7 +2128,25 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } #endregion + #region 骨髓中是否存在局灶性 FDG亲和病灶的证据 + /// + /// 骨髓中是否存在局灶性 FDG亲和病灶的证据 + /// + /// + /// + public async Task GetEvidenceFocalFDG(ReadingCalculateDto inDto) + { + if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt())) + { + return FDGAffinityFociInBM.NE.GetEnumInt(); + } + else + { + return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.EvidenceFocalFDG).Select(x => x.Answer).FirstOrDefault(); + } + } + #endregion #region 肝脏评估 /// @@ -2345,11 +2386,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task GetTargetLesionEvaluate(ReadingCalculateDto inDto) { + + + var rowInfo = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); - //if (inDto.IsBaseLine) - //{ - // return TargetAssessment.NA.GetEnumInt(); - //} + if (inDto.IsBaseLine) + { + return TargetAssessment.NA.GetEnumInt(); + } var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).ToList(); TargetAssessment result = TargetAssessment.SD; @@ -2414,10 +2458,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { result = TargetAssessment.PD; } - //在排除PD后,有任一靶病灶为NE状态 - else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate))) + //当前访视没有任何一个状态为“疾病进展”的靶病灶; + //当前访视存在至少一个状态为“不可评估”的靶病灶。 + else if ( + !tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.DiseaseProgression))&& + tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate))) { - result = TargetAssessment.PD; + result = TargetAssessment.NE; } //1、基线非淋巴结靶病灶不存在,或者当前访视非淋巴结靶病灶全部消失; //并且 2.当前访视淋巴结靶病灶的状态全部变为“消失”。 @@ -2449,10 +2496,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate NoTargetAssessment result = NoTargetAssessment.PD; - //if (inDto.IsBaseLine) - //{ - // return NoTargetAssessment.NA.GetEnumInt(); - //} + if (inDto.IsBaseLine) + { + return NoTargetAssessment.NA.GetEnumInt(); + } var tableRows = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList(); @@ -2550,14 +2597,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task CTMRIEvaluation(ReadingCalculateDto inDto) { + if (inDto.IsBaseLine) + { + return CTMRIOverallAssessment.NA.GetEnumInt(); + } // 靶病灶评估 var targetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefault(); // 非靶病灶评估 - var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NETarget).Select(x => x.Answer).FirstOrDefault(); + var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefault(); // 存在新病灶 - var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewTargetLesion).Select(x => x.Answer).FirstOrDefault(); + var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionEvaluation).Select(x => x.Answer).FirstOrDefault(); // 肝脏评估 var liverEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverAssessment).Select(x => x.Answer).FirstOrDefault(); @@ -2571,7 +2622,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate new CalculationDto(){ Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), - Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected }), + Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No, NewLesionAssessment.Suspected }), Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Normal }), Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal }), Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), @@ -2595,14 +2646,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Column5=ReadingCommon.EnumToString(new List() { }), Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), }, - //PD 任一结果 是 任一结果 任一结果 PD + //任一结果 任一结果 是 任一结果 任一结果 PD new CalculationDto(){ - Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.PD }), + Column1=ReadingCommon.EnumToString(new List() { }), Column2=ReadingCommon.EnumToString(new List() { }), Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.Yes }), Column4=ReadingCommon.EnumToString(new List() { }), Column5=ReadingCommon.EnumToString(new List() { }), - Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), }, //任一结果 任一结果 任一结果 显著增大 任一结果 PD new CalculationDto(){ @@ -2611,7 +2662,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Column3=ReadingCommon.EnumToString(new List() { }), Column4=ReadingCommon.EnumToString(new List() { LiverAssessment.Increase }), Column5=ReadingCommon.EnumToString(new List() { }), - Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), }, //任一结果 任一结果 任一结果 任一结果 显著增大 PD new CalculationDto(){ @@ -2620,7 +2671,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Column3=ReadingCommon.EnumToString(new List() {}), Column4=ReadingCommon.EnumToString(new List() { }), Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Increase }), - Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.ND }), + Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.PD }), }, //CR CR/ND 否 正常 正常 CR new CalculationDto(){ @@ -2640,9 +2691,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Column5=ReadingCommon.EnumToString(new List() { SpleenAssessment.Normal }), Column6=ReadingCommon.EnumToString(new List() { CTMRIOverallAssessment.CR }), }, - //NE 非PD 否/疑似/无法评估 显著增大 显著增大 NE + //NE 非PD 否/疑似/无法评估 非显著增大 非显著增大 NE new CalculationDto(){ - NotEq=new List(){ 2}, + NotEq=new List(){ 2,4,5}, Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.NE }), Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.PD }), Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected, NewLesionAssessment.NE}), @@ -2672,7 +2723,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }, //ND ND 否/疑似 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) NE new CalculationDto(){ - NotEq=new List(){ 4}, + NotEq=new List(){ 5}, Column1=ReadingCommon.EnumToString(new List() { TargetAssessment.ND }), Column2=ReadingCommon.EnumToString(new List() { NoTargetAssessment.ND }), Column3=ReadingCommon.EnumToString(new List() { NewLesionAssessment.No,NewLesionAssessment.Suspected }), @@ -2739,6 +2790,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate }, }; + var index= data.FindIndex(x => + (x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) && + (x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) && + (x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) && + (x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) && + (x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0)) + ; + Console.WriteLine(index); var result = data.Where(x => (x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) && (x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) && diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index e2ac99422..5cb3743d9 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -894,17 +894,22 @@ namespace IRaCIS.Core.Domain.Share /// /// 稳定 /// - Stabilization = 2, + Tumefaction = 2, + + /// + /// 稳定 + /// + Stabilization = 3, /// /// 显著增大 /// - Increase = 3, + Increase = 4, /// /// 无法评估 /// - NotEvaluable = 4, + NotEvaluable = 5, } /// @@ -2230,12 +2235,10 @@ public enum SUVChangeVSBaseline - - - /// - /// PET 5PS 评分 - /// - public enum PET5PSScore +/// +/// PET 5PS 评分 +/// +public enum PET5PSScore { /// /// 5分 @@ -2255,7 +2258,7 @@ public enum SUVChangeVSBaseline /// /// 2分 /// - Two = 5, + Two = 2, /// /// 1分 @@ -2274,6 +2277,22 @@ public enum SUVChangeVSBaseline } + /// + /// 计算触发 + /// + public enum ComputationTrigger + { + /// + /// 病灶 + /// + Lesion=0, + + /// + /// 报告 + /// + Report=1, + } + /// /// 新靶病灶评估 ///