@@ -513,88 +513,81 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
List < ReadingCalculateData > calculateList = new List < ReadingCalculateData > ( )
{
/*
* 保存影像质量问题
* 如果:不正常:PET-CT不能融合, FDG-PET的评估设置为NE
*
* 保存二维页面病灶
*
* 保存
*
*
*
*/
// 是否存在Pet
new ReadingCalculateData ( ) { QuestionType = QuestionType . ExistPET , GetStringFun = GetExistPET } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . ExistPET , GetStringFun = GetExistPET , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , } } ,
//垂直径乘积之和(SPD)
new ReadingCalculateData ( ) { QuestionType = QuestionType . SPD , GetDecimalFun = GetSPD } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SPD , GetDecimalFun = GetSPD , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . RemoveLesion , } } ,
// 与基线相比SPD变化的百分比
new ReadingCalculateData ( ) { QuestionType = QuestionType . SPDChange , GetStringFun = CompareBaselineSPD } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SPDChange , GetStringFun = CompareBaselineSPD , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . RemoveLesion , } } ,
// 脾脏垂直径
new ReadingCalculateData ( ) { QuestionType = QuestionType . SpleenLength , GetDecimalNullFun = GetSpleenLength , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 与基线相比脾肿大增加的百分比
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusChange , GetStringFun = GetSplenoncusChange } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusChange , GetStringFun = GetSplenoncusChange , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 与最低点相比脾脏垂直径长度的增加值
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusAdd , GetStringFun = GetSplenoncusAdd } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusAdd , GetStringFun = GetSplenoncusAdd , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 与基线相比脾垂直径变化值
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusDiameterChange , GetStringFun = GetSplenoncusDiameterChange } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenoncusDiameterChange , GetStringFun = GetSplenoncusDiameterChange , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 脾肿垂直径最低点访视
new ReadingCalculateData ( ) { QuestionType = QuestionType . LowestSplenoncusVisit , GetStringFun = GetLowestSplenoncusVisit } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . LowestSplenoncusVisit , GetStringFun = GetLowestSplenoncusVisit , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 获取脾脏状态
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenicStatus , GetStringFun = GetSplenicStatus , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , } } ,
// 获取脾脏评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenicEvaluation , GetStringFun = GetSplenicEvaluation } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SplenicEvaluation , GetStringFun = GetSplenicEvaluation , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , ComputationTrigger . SplenicEvaluation , } } ,
//靶病灶评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . TargetLesion , GetStringFun = GetTargetLesionEvaluate } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . TargetLesion , GetStringFun = GetTargetLesionEvaluate , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , ComputationTrigger . MergeLesion , } } ,
//非靶病灶评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . NoTargetLesion , GetStringFun = GetNoTargetLesionEvaluate } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . NoTargetLesion , GetStringFun = GetNoTargetLesionEvaluate , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
//新病灶评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . NewLesionEvaluation , GetStringFun = GetNewLesionEvaluate } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . NewLesionEvaluation , GetStringFun = GetNewLesionEvaluate , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
//获取肝脏评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . LiverAssessment , GetStringFun = GetLiverAssessment } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . LiverAssessment , GetStringFun = GetLiverAssessment , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . LiverStatus , } } ,
// // 骨髓中是否存在局灶性 FDG亲和病灶的证据
//new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTrigger=ComputationTrigger.Lesion},
// 骨髓中是否存在局灶性 FDG亲和病灶的证据
new ReadingCalculateData ( ) { QuestionType = QuestionType . EvidenceFocalFDG , GetStringFun = GetEvidenceFocalFDG , ComputationTriggerList = new List < ComputationTrigger > ( ) { } } ,
//CT/MRI
new ReadingCalculateData ( ) { QuestionType = QuestionType . CTandMRI , GetStringFun = CTMRIEvaluation } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . CTandMRI , GetStringFun = CTMRIEvaluation , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . LiverStatus , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , ComputationTrigger . SplenicEvaluation , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , ComputationTrigger . MergeLesion , } } ,
// PET 5PS评分
new ReadingCalculateData ( ) { QuestionType = QuestionType . PET5PS , GetStringFun = GetPET5PS , ComputationTrigger = ComputationTrigger . Lesion } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . PET5PS , GetStringFun = GetPET5PS , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . ImageQuality , ComputationTrigger . LiverBloodPool , ComputationTrigger . MediastinalPool , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
// 修改PET 5PS评分备注
new ReadingCalculateData ( ) { QuestionType = QuestionType . PSScoreRemarks , GetStringFun = GetPET5PSRemark , ComputationTrigger = ComputationTrigger . Lesion } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . PSScoreRemarks , GetStringFun = GetPET5PSRemark , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . LiverBloodPool , ComputationTrigger . MediastinalPool , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
//与基线相比摄取值变化
new ReadingCalculateData ( ) { QuestionType = QuestionType . UptakeChange , GetStringFun = GetUptakeChange , ComputationTrigger = ComputationTrigger . Lesion } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . UptakeChange , GetStringFun = GetUptakeChange , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . LiverBloodPool , ComputationTrigger . MediastinalPool , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
// FDG-PET 评估结果
new ReadingCalculateData ( ) { QuestionType = QuestionType . FDGPET , GetStringFun = GetFDGPETOverallAssessment } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . FDGPET , GetStringFun = GetFDGPETOverallAssessment , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . ImageQuality , ComputationTrigger . LiverBloodPool , ComputationTrigger . MediastinalPool , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , ComputationTrigger . PDGPET , } } ,
// 上一次 FDG-PET 评估结果
new ReadingCalculateData ( ) { QuestionType = QuestionType . LastFDGPET , GetStringFun = GetLastFDGPETOverallAssessment } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . LastFDGPET , GetStringFun = GetLastFDGPETOverallAssessment , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
// 影像学整体肿瘤评估
new ReadingCalculateData ( ) { QuestionType = QuestionType . ImgOncology , GetStringFun = GetImgOncology } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . ImgOncology , GetStringFun = GetImgOncology , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . LiverStatus , ComputationTrigger . SplenicApexPosition , ComputationTrigger . PositionSpleenFloor , ComputationTrigger . SplenicEvaluation , ComputationTrigger . LiverBloodPool , ComputationTrigger . MediastinalPool , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , ComputationTrigger . PDGPET , ComputationTrigger . MergeLesion , } } ,
//SUVmax
new ReadingCalculateData ( ) { QuestionType = QuestionType . SUVmax , GetDecimalNullFun = GetSuvMax } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SUVmax , GetDecimalNullFun = GetSuvMax , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
// SUVmax所在病灶
new ReadingCalculateData ( ) { QuestionType = QuestionType . SUVmaxLesion , GetStringFun = GetSuvMaxFocus } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . SUVmaxLesion , GetStringFun = GetSuvMaxFocus , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
//是否存在疾病
new ReadingCalculateData ( ) { QuestionType = QuestionType . ExistDisease , GetStringFun = GetIsExistDisease } ,
new ReadingCalculateData ( ) { QuestionType = QuestionType . ExistDisease , GetStringFun = GetIsExistDisease , ComputationTriggerList = new List < ComputationTrigger > ( ) { ComputationTrigger . InitialCalculation , ComputationTrigger . CTSave , ComputationTrigger . MergeSave , ComputationTrigger . RemoveLesion , } } ,
@@ -681,7 +674,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
calculateList = calculateList . Where ( x = > x . ComputationTrigger = = null | | x . ComputationTrigger = = inDto . ComputationTrigger ) . ToList ( ) ;
calculateList = calculateList . Where ( x = > x . ComputationTriggerList . Contains ( inDto . ComputationTrigger ) ) . ToList ( ) ;
var typeNAList = new List < QuestionType >
{
QuestionType . SODChange ,
@@ -2046,13 +2039,42 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
#endregion
#region 与 基 线 相 比 SPD变化的百分比
#region 脾 脏 垂 直 径
/// <summary>
/// 与基线相比SPD变化的百分比
/// 获取脾脏垂直径
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task < string > CompareBaselineSPD ( ReadingCalculateDto inDto )
public async Task < decimal? > GetSpleenLength ( ReadingCalculateDto inDto )
{
// 脾尖答案
var splenicTopAnswer = inDto . QuestionInfo . Where ( x = > x . QuestionType = = QuestionType . SplenicTopPosition ) . Select ( x = > x . Answer ) . FirstOrDefault ( ) ;
// 脾底答案
var splenicBottomAnswer = inDto . QuestionInfo . Where ( x = > x . QuestionType = = QuestionType . SplenicBottomPosition ) . Select ( x = > x . Answer ) . FirstOrDefault ( ) ;
decimal? spleenLength = null ;
if ( splenicTopAnswer ! = null & & splenicBottomAnswer ! = null )
{
spleenLength = splenicTopAnswer . IsNullOrEmptyReturn0 ( ) - splenicBottomAnswer . IsNullOrEmptyReturn0 ( ) ;
if ( spleenLength < 0 )
{
spleenLength = 0 - spleenLength ;
}
return spleenLength ;
}
return spleenLength ;
}
#endregion
#region 与 基 线 相 比 SPD变化的百分比
/// <summary>
/// 与基线相比SPD变化的百分比
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task < string > CompareBaselineSPD ( ReadingCalculateDto inDto )
{
if ( inDto . IsBaseLine )
{
@@ -2400,6 +2422,23 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
/// <summary>
/// 获取脾脏状态
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task < string > GetSplenicStatus ( ReadingCalculateDto inDto )
{
var spleenLength = inDto . QuestionInfo . Where ( x = > x . QuestionType = = QuestionType . SpleenLength ) . Select ( x = > x . Answer ) . FirstOrDefault ( ) ;
if ( spleenLength = = string . Empty )
{
return string . Empty ;
}
else
{
return await GetSplenicState ( inDto . VisitTaskId , spleenLength . IsNullOrEmptyReturn0 ( ) ) ;
}
}
#region 获 取 脾 脏 评 估
@@ -2488,12 +2527,52 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task < string > GetPET5PS ( ReadingCalculateDto inDto )
{
//病灶最大SUVmax、肝脏血池、纵膈血池SUVmax未发生改变时,不用计算
// 如果是保存影像进来 PET-CT不能融合 就是NE
if ( inDto . ComputationTrigger = = ComputationTrigger . ImageQuality )
{
if ( await ImageQualityIsUnableFuse ( inDto ) )
{
return PET5PSScore . NE . GetEnumInt ( ) ;
}
}
// 如果不是保存肝脏血池和纵隔血池
if ( inDto . ComputationTrigger ! = ComputationTrigger . LiverBloodPool & & inDto . ComputationTrigger ! = ComputationTrigger . MediastinalPool )
{
// 先在数据库查这几个值
List < QuestionType ? > needSearchTypes = new List < QuestionType ? > ( )
{
QuestionType . SUVmax ,
QuestionType . PET5PS ,
} ;
var dataBaseDataList = await _readingTaskQuestionAnswerRepository . Where ( x = > x . VisitTaskId = = inDto . VisitTaskId & & needSearchTypes . Contains ( x . ReadingQuestionTrial . QuestionType ) ) . Select ( x = > new
{
x . Answer ,
x . ReadingQuestionTrial . QuestionType
} ) . ToListAsync ( ) ; ;
// 数据库中最大SUVmax
var dataBaseSUVmax = dataBaseDataList . Where ( x = > x . QuestionType = = QuestionType . SUVmax ) . Select ( x = > x . Answer ) . FirstIsNullReturnEmpty ( ) ;
// 如果SUVmax没变 就不重新计算
if ( dataBaseSUVmax = = ( await GetSuvMax ( inDto ) ) . ToString ( ) )
{
return dataBaseDataList . Where ( x = > x . QuestionType = = QuestionType . PET5PS ) . Select ( x = > x . Answer ) . FirstIsNullReturnEmpty ( ) ;
}
}
//if (inDto.IsBaseLine)
//{
// return SpleenAssessment.Stabilization.GetEnumInt();
//}
if ( inDto . QuestionInfo . Any ( x = > x . QuestionType = = QuestionType . ExistPET & & x . Answer = = ReadingYesOrNo . No . GetEnumInt ( ) ) )
{
return PET5PSScore . NE . GetEnumInt ( ) ;
@@ -2577,8 +2656,33 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task < string > GetUptakeChange ( ReadingCalculateDto inDto )
{
//PET5ps评分改变时,才计算
if ( inDto . IsBaseLine )
//PET5ps评分改变时,才计算
List < QuestionType ? > needSearchTypes = new List < QuestionType ? > ( )
{
QuestionType . PET5PS ,
QuestionType . UptakeChange ,
} ;
var dataBaseDataList = await _readingTaskQuestionAnswerRepository . Where ( x = > x . VisitTaskId = = inDto . VisitTaskId & & needSearchTypes . Contains ( x . ReadingQuestionTrial . QuestionType ) ) . Select ( x = > new
{
x . Answer ,
x . ReadingQuestionTrial . QuestionType
} ) . ToListAsync ( ) ; ;
// 数据库中PET5ps评分
var dataBasePET5ps = dataBaseDataList . Where ( x = > x . QuestionType = = QuestionType . PET5PS ) . Select ( x = > x . Answer ) . FirstIsNullReturnEmpty ( ) ;
if ( dataBasePET5ps = = await GetPET5PS ( inDto ) )
{
return dataBaseDataList . Where ( x = > x . QuestionType = = QuestionType . UptakeChange ) . Select ( x = > x . Answer ) . FirstIsNullReturnEmpty ( ) ;
}
if ( inDto . IsBaseLine )
{
return SUVChangeVSBaseline . NA . GetEnumInt ( ) ;
}
@@ -2658,7 +2762,23 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
public async Task < string > GetFDGPETOverallAssessment ( ReadingCalculateDto inDto )
{
if ( inDto . IsBaseLine )
// 如果是保存影像进来 PET-CT不能融合 就是NE
if ( inDto . ComputationTrigger = = ComputationTrigger . ImageQuality )
{
if ( await ImageQualityIsUnableFuse ( inDto ) )
{
if ( inDto . IsBaseLine )
{
return FDGPETOverallAssessment . NA . GetEnumInt ( ) ;
}
else
{
return FDGPETOverallAssessment . NE . GetEnumInt ( ) ;
}
}
}
if ( inDto . IsBaseLine )
{
return FDGPETOverallAssessment . NA . GetEnumInt ( ) ;
}