|
|
|
@ -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>
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<string> 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>() { PET5PSScore.Five,PET5PSScore.Four }),
|
|
|
|
|
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.Decrease }),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesSustain}),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
|
|
|
|
|
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
@ -2089,7 +2112,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
new CalculationDto(){
|
|
|
|
|
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four }),
|
|
|
|
|
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.DidNotChange }),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesSustain}),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
|
|
|
|
|
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR }),
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
@ -2105,7 +2128,25 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
#region 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="inDto"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<string> 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 肝脏评估
|
|
|
|
|
/// <summary>
|
|
|
|
@ -2345,11 +2386,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<string> 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
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<string> 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();
|
|
|
|
@ -2595,14 +2646,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
|
|
|
|
},
|
|
|
|
|
//PD 任一结果 是 任一结果 任一结果 PD
|
|
|
|
|
//任一结果 任一结果 是 任一结果 任一结果 PD
|
|
|
|
|
new CalculationDto(){
|
|
|
|
|
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.PD }),
|
|
|
|
|
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
|
|
|
|
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Yes }),
|
|
|
|
|
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
|
|
|
|
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
|
|
|
|
},
|
|
|
|
|
//任一结果 任一结果 任一结果 显著增大 任一结果 PD
|
|
|
|
|
new CalculationDto(){
|
|
|
|
@ -2611,7 +2662,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { }),
|
|
|
|
|
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
|
|
|
|
|
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
|
|
|
|
},
|
|
|
|
|
//任一结果 任一结果 任一结果 任一结果 显著增大 PD
|
|
|
|
|
new CalculationDto(){
|
|
|
|
@ -2620,7 +2671,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() {}),
|
|
|
|
|
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
|
|
|
|
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
|
|
|
|
},
|
|
|
|
|
//CR CR/ND 否 正常 正常 CR
|
|
|
|
|
new CalculationDto(){
|
|
|
|
@ -2640,9 +2691,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
|
|
|
|
|
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
|
|
|
|
|
},
|
|
|
|
|
//NE 非PD 否/疑似/无法评估 显著增大 显著增大 NE
|
|
|
|
|
//NE 非PD 否/疑似/无法评估 非显著增大 非显著增大 NE
|
|
|
|
|
new CalculationDto(){
|
|
|
|
|
NotEq=new List<int>(){ 2},
|
|
|
|
|
NotEq=new List<int>(){ 2,4,5},
|
|
|
|
|
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.NE }),
|
|
|
|
|
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.PD }),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected, NewLesionAssessment.NE}),
|
|
|
|
@ -2672,7 +2723,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
|
|
|
|
},
|
|
|
|
|
//ND ND 否/疑似 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) NE
|
|
|
|
|
new CalculationDto(){
|
|
|
|
|
NotEq=new List<int>(){ 4},
|
|
|
|
|
NotEq=new List<int>(){ 5},
|
|
|
|
|
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
|
|
|
|
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
|
|
|
|
|
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { 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) &&
|
|
|
|
|