Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC

IRC_NewDev
hang 2023-10-23 13:55:22 +08:00
commit b9d50179c0
5 changed files with 131 additions and 44 deletions

View File

@ -50,6 +50,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public bool IsChangeOtherTask { get; set; }
public ComputationTrigger ComputationTrigger { get; set; }
}
public class TargetLesionCalculateDto
@ -220,6 +222,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Arm ArmEnum { get; set; }
public ComputationTrigger ComputationTrigger { get; set; } = ComputationTrigger.Lesion;
/// <summary>
/// 是否修改其他任务
/// </summary>
@ -348,6 +352,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{
public QuestionType QuestionType { get; set; }
public ComputationTrigger? ComputationTrigger { get; set; }
public Func<ReadingCalculateDto, Task<decimal>> GetDecimalFun { get; set; }
public Func<ReadingCalculateDto, Task<int>> GetIntFun { get; set; }

View File

@ -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,
});

View File

@ -196,7 +196,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
{
await service.CalculateTask(new CalculateTaskInDto()
{
ComputationTrigger= ComputationTrigger.Report,
VisitTaskId = inDto.VisitTaskId
});
}

View File

@ -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();
@ -2571,7 +2622,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
new CalculationDto(){
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 }),
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No, NewLesionAssessment.Suspected }),
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal }),
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
@ -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) &&

View File

@ -894,17 +894,22 @@ namespace IRaCIS.Core.Domain.Share
/// <summary>
/// 稳定
/// </summary>
Stabilization = 2,
Tumefaction = 2,
/// <summary>
/// 稳定
/// </summary>
Stabilization = 3,
/// <summary>
/// 显著增大
/// </summary>
Increase = 3,
Increase = 4,
/// <summary>
/// 无法评估
/// </summary>
NotEvaluable = 4,
NotEvaluable = 5,
}
/// <summary>
@ -2230,12 +2235,10 @@ public enum SUVChangeVSBaseline
/// <summary>
/// PET 5PS 评分
/// </summary>
public enum PET5PSScore
/// <summary>
/// PET 5PS 评分
/// </summary>
public enum PET5PSScore
{
/// <summary>
/// 5分
@ -2255,7 +2258,7 @@ public enum SUVChangeVSBaseline
/// <summary>
/// 2分
/// </summary>
Two = 5,
Two = 2,
/// <summary>
/// 1分
@ -2274,6 +2277,22 @@ public enum SUVChangeVSBaseline
}
/// <summary>
/// 计算触发
/// </summary>
public enum ComputationTrigger
{
/// <summary>
/// 病灶
/// </summary>
Lesion=0,
/// <summary>
/// 报告
/// </summary>
Report=1,
}
/// <summary>
/// 新靶病灶评估
/// </summary>