Uat_Study
parent
33c55db206
commit
5f1a25c2ec
|
@ -105,6 +105,11 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool BaseLineLessThan30 { get; set; }
|
public bool BaseLineLessThan30 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 非靶病灶中淋巴结病灶全部消失
|
||||||
|
/// </summary>
|
||||||
|
public bool NoTargetLymphLoss { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -187,6 +192,16 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||||
/// 至少有一个新靶病无法评估
|
/// 至少有一个新靶病无法评估
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ExixtsUnevaluableState { get; set; }
|
public bool ExixtsUnevaluableState { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当有“存在”状态的淋巴结新靶病灶
|
||||||
|
/// </summary>
|
||||||
|
public bool ExixtsLymphTarget { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当有“存在”或“太小”状态的非淋巴结新靶病灶
|
||||||
|
/// </summary>
|
||||||
|
public bool ExixtsOrLessNoLymphTarget{ get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -487,11 +487,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
// 与前一访视SOD相比变化量
|
// 与前一访视SOD相比变化量
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.LastVisitSODChange,GetDecimalNullFun=GetLastTaskSODChange,IsConvertedTask=true},
|
new ReadingCalculateData (){QuestionType=QuestionType.LastVisitSODChange,GetDecimalNullFun=GetLastTaskSODChange,IsConvertedTask=true},
|
||||||
|
|
||||||
//新靶病灶直径之和(iSOD)
|
// 新靶病灶直径之和(iSOD)
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.ISOD,GetDecimalNullFun=GetiSODData,IsConvertedTask=true},
|
new ReadingCalculateData (){QuestionType=QuestionType.ISOD,GetDecimalNullFun=GetiSODData,IsConvertedTask=true},
|
||||||
|
|
||||||
// 与前一访视相比iSOD变化量
|
// 与触发iRECIST访视相比iSOD变化量
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.LastVisitiSODChange,GetDecimalNullFun=GetISODChange,IsConvertedTask=true},
|
new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringiSODChange,GetDecimalNullFun=GetComparedTriggeringiSODChange,IsConvertedTask=true},
|
||||||
|
|
||||||
// 靶病灶评估
|
// 靶病灶评估
|
||||||
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,IsConvertedTask=false},
|
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,IsConvertedTask=false},
|
||||||
|
@ -578,7 +578,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
List<QuestionType> questionTypes = new List<QuestionType>()
|
List<QuestionType> questionTypes = new List<QuestionType>()
|
||||||
{
|
{
|
||||||
QuestionType.ISOD,
|
QuestionType.ISOD,
|
||||||
QuestionType.LastVisitiSODChange,
|
QuestionType.ComparedTriggeringiSODChange,
|
||||||
QuestionType.TargetLesion,
|
QuestionType.TargetLesion,
|
||||||
QuestionType.NoTargetLesion,
|
QuestionType.NoTargetLesion,
|
||||||
QuestionType.NewLesions,
|
QuestionType.NewLesions,
|
||||||
|
@ -1388,18 +1388,19 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 与前一访视相比iSOD变化量
|
#region 与触发iRECIST访视相比iSOD变化量
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 与前一访视相比iSOD变化量
|
/// 与触发iRECIST访视相比iSOD变化量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="inDto"></param>
|
/// <param name="inDto"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<decimal?> GetISODChange(ReadingCalculateDto inDto)
|
public async Task<decimal?> GetComparedTriggeringiSODChange(ReadingCalculateDto inDto)
|
||||||
{
|
{
|
||||||
|
|
||||||
var lastTaskId = await this.GetLastVisitTaskId(inDto);
|
var firstChangeTaskId = await GetFirstChangeTaskId(inDto);
|
||||||
var lastiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
|
||||||
|
var firstChangeiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||||||
|
|
||||||
var value = await GetiSODData(inDto);
|
var value = await GetiSODData(inDto);
|
||||||
|
|
||||||
|
@ -1407,7 +1408,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return value.NullChange0() - lastiSOD;
|
return value.NullChange0() - firstChangeiSOD;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -1702,10 +1703,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
/// {
|
/// {
|
||||||
/// 靶病灶疗效为 NE
|
/// 靶病灶疗效为 NE
|
||||||
/// }
|
/// }
|
||||||
/// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm)
|
/// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm && 非靶病灶中淋巴结病灶全部消失)
|
||||||
/// {
|
/// {
|
||||||
/// 靶病灶疗效为 iCR
|
/// 靶病灶疗效为 iCR
|
||||||
/// } else if (与基线期SOD相比减小≥30 %)
|
/// } else if (与基线期SOD相比减小≥30 %||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失))
|
||||||
/// {
|
/// {
|
||||||
/// 靶病灶疗效为 iPR
|
/// 靶病灶疗效为 iPR
|
||||||
/// }
|
/// }
|
||||||
|
@ -1721,7 +1722,6 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
|
|
||||||
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||||||
var lastVisitTaskId = await GetLastVisitTaskId(inDto);
|
var lastVisitTaskId = await GetLastVisitTaskId(inDto);
|
||||||
var firstChangeTaskId = await GetFirstChangeTaskId(inDto);
|
|
||||||
var targetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.QuestionId).FirstOrDefault();
|
var targetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.QuestionId).FirstOrDefault();
|
||||||
|
|
||||||
var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault();
|
var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault();
|
||||||
|
@ -1738,8 +1738,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
MeetRECISTPD = (await GetTargetLesionEvaluate(inDto)) == TargetAssessment.PD.GetEnumInt(),
|
MeetRECISTPD = (await GetTargetLesionEvaluate(inDto)) == TargetAssessment.PD.GetEnumInt(),
|
||||||
|
|
||||||
// 本次访视SOD与触发iRECIST访视相比本次访视SOD增加不小于5mm
|
// 本次访视SOD与触发iRECIST访视相比本次访视SOD增加不小于5mm
|
||||||
SODTiggerAddGreaterThan5 = firstChangeTaskId==inDto.VisitTaskId ? false : await GetSODData(inDto) - (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrialId == sodQuestionId)
|
SODTiggerAddGreaterThan5 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ComparedTriggeringiSODChange).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 5,
|
||||||
.Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0() >= 5,
|
|
||||||
|
|
||||||
//比整体访视期间最低点SOD增加≥20 %
|
//比整体访视期间最低点SOD增加≥20 %
|
||||||
LowSodAddGreaterThan20Percent = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20,
|
LowSodAddGreaterThan20Percent = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LowPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) >= 20,
|
||||||
|
@ -1761,8 +1760,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
|
|
||||||
// 与基线期SOD相比减小≥30 %
|
// 与基线期SOD相比减小≥30 %
|
||||||
BaseLineLessThan30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <= -30,
|
BaseLineLessThan30 = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SODPercent).Sum(x => x.Answer.IsNullOrEmptyReturn0()) <= -30,
|
||||||
|
|
||||||
|
//非靶病灶中淋巴结病灶全部消失
|
||||||
|
NoTargetLymphLoss = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var noTargetTableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList();
|
||||||
|
|
||||||
|
foreach (var item in noTargetTableQuestion)
|
||||||
|
{
|
||||||
|
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)))
|
||||||
|
{
|
||||||
|
|
||||||
|
resultData.NoTargetLymphLoss = resultData.NoTargetLymphLoss && item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.State).Select(x => x.Answer).FirstOrDefault() == NoTargetState.Loss.GetEnumInt();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var item in tableQuestion)
|
foreach (var item in tableQuestion)
|
||||||
{
|
{
|
||||||
|
@ -1811,14 +1824,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
// 靶病灶疗效为 NE
|
// 靶病灶疗效为 NE
|
||||||
result = TargetAssessment.NE;
|
result = TargetAssessment.NE;
|
||||||
}
|
}
|
||||||
// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm)
|
// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm && 非靶病灶中淋巴结病灶全部消失)
|
||||||
else if(resultData.AllLesionVanish&&resultData.AllMinorAxisLessThan10)
|
else if (resultData.AllLesionVanish&&resultData.AllMinorAxisLessThan10&& resultData.NoTargetLymphLoss)
|
||||||
{
|
{
|
||||||
// 靶病灶疗效为 iCR
|
// 靶病灶疗效为 iCR
|
||||||
result = TargetAssessment.iCR;
|
result = TargetAssessment.iCR;
|
||||||
}
|
}
|
||||||
// else if (与基线期SOD相比减小≥30 %)
|
// else if (与基线期SOD相比减小≥30 %||(所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm&&非靶病灶中有淋巴结病灶为非消失))
|
||||||
else if(resultData.BaseLineLessThan30)
|
else if (resultData.BaseLineLessThan30||(resultData.AllLesionVanish && resultData.AllMinorAxisLessThan10 && !resultData.NoTargetLymphLoss))
|
||||||
{
|
{
|
||||||
// 靶病灶疗效为 iPR
|
// 靶病灶疗效为 iPR
|
||||||
result = TargetAssessment.iPR;
|
result = TargetAssessment.iPR;
|
||||||
|
@ -1982,11 +1995,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
/// {
|
/// {
|
||||||
/// 疗效为 iCPD
|
/// 疗效为 iCPD
|
||||||
/// }
|
/// }
|
||||||
/// else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶)
|
/// else if (上一访视新靶病灶评估为“iCPD”&& (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶))
|
||||||
/// {
|
/// {
|
||||||
/// 疗效为 iCPD
|
/// 疗效为 iCPD
|
||||||
/// }
|
/// }
|
||||||
/// else if (有存在状态的新靶病灶时评估为该结果)
|
/// else if (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶)
|
||||||
/// {
|
/// {
|
||||||
/// 疗效为 iUPD
|
/// 疗效为 iUPD
|
||||||
/// }
|
/// }
|
||||||
|
@ -2029,15 +2042,41 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
// 至少有一个新靶病无法评估
|
// 至少有一个新靶病无法评估
|
||||||
ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.NotEvaluable)),
|
ExixtsUnevaluableState = tableQuestion.SelectMany(x => x.TableQuestionList).Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.NotEvaluable)),
|
||||||
|
|
||||||
|
|
||||||
|
// 当有“存在”状态的淋巴结新靶病灶
|
||||||
|
ExixtsLymphTarget = false,
|
||||||
|
|
||||||
|
// 当有“存在”或“太小”状态的非淋巴结新靶病灶
|
||||||
|
ExixtsOrLessNoLymphTarget = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
foreach (var item in tableQuestion)
|
foreach (var item in tableQuestion)
|
||||||
{
|
{
|
||||||
data.AllVanish = data.AllVanish && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Loss));
|
data.AllVanish = data.AllVanish && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Loss));
|
||||||
|
|
||||||
|
|
||||||
|
data.ExixtsLymphTarget = data.ExixtsLymphTarget ||
|
||||||
|
(
|
||||||
|
item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist)) &&
|
||||||
|
item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes))
|
||||||
|
);
|
||||||
|
|
||||||
|
data.ExixtsOrLessNoLymphTarget = data.ExixtsLymphTarget ||
|
||||||
|
(
|
||||||
|
|
||||||
|
(
|
||||||
|
item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.Exist))
|
||||||
|
|| item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewTargetLesionState.TooSmall))
|
||||||
|
)
|
||||||
|
|
||||||
|
&&
|
||||||
|
item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && !x.Answer.EqEnum(YesOrNoOrNa.Yes))
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NewTargetLesionAssessment result = NewTargetLesionAssessment.ND;
|
NewTargetLesionAssessment? result = null;
|
||||||
|
|
||||||
// if(所有新靶病灶消失或一直不存在任何新靶病灶)
|
// if(所有新靶病灶消失或一直不存在任何新靶病灶)
|
||||||
if(data.NotExistsNewTargetLesion||data.AllVanish)
|
if(data.NotExistsNewTargetLesion||data.AllVanish)
|
||||||
|
@ -2051,14 +2090,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
// 疗效为 iCPD
|
// 疗效为 iCPD
|
||||||
result = NewTargetLesionAssessment.iCPD;
|
result = NewTargetLesionAssessment.iCPD;
|
||||||
}
|
}
|
||||||
// else if (上一访视新靶病灶评估为“iCPD”&& 有"存在"状态的新靶病灶)
|
// else if (上一访视新靶病灶评估为“iCPD”&& (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶))
|
||||||
else if (data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iCPD) && data.HaveExixtsState)
|
else if (data.LastTaskNewTargetLesion.EqEnum(NewTargetLesionAssessment.iCPD) && data.ExixtsLymphTarget && data.ExixtsOrLessNoLymphTarget)
|
||||||
{
|
{
|
||||||
// 疗效为 iCPD
|
// 疗效为 iCPD
|
||||||
result = NewTargetLesionAssessment.iCPD;
|
result = NewTargetLesionAssessment.iCPD;
|
||||||
}
|
}
|
||||||
// else if (有存在状态的新靶病灶时评估为该结果)
|
// else if (当有“存在”状态的淋巴结新靶病灶||当有“存在”或“太小”状态的非淋巴结新靶病灶)
|
||||||
else if ( data.HaveExixtsState)
|
else if ( data.HaveExixtsState||data.ExixtsOrLessNoLymphTarget)
|
||||||
{
|
{
|
||||||
// 疗效为 iUPD
|
// 疗效为 iUPD
|
||||||
result = NewTargetLesionAssessment.iUPD;
|
result = NewTargetLesionAssessment.iUPD;
|
||||||
|
@ -2070,7 +2109,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||||
result = NewTargetLesionAssessment.NE;
|
result = NewTargetLesionAssessment.NE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.GetEnumInt();
|
return result==null?string.Empty: result.Value.GetEnumInt();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -1246,6 +1246,11 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
/// 无法评估
|
/// 无法评估
|
||||||
/// </summary>
|
/// </summary>
|
||||||
NotEvaluable=3,
|
NotEvaluable=3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 太小
|
||||||
|
/// </summary>
|
||||||
|
TooSmall=4,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1469,9 +1474,9 @@ namespace IRaCIS.Core.Domain.Share
|
||||||
ISOD = 24,
|
ISOD = 24,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 与前一访视相比iSOD变化量
|
/// 与触发iRECIST访视相比iSOD变化量 Compared with triggering iRECIST visit
|
||||||
/// </summary>
|
/// </summary>
|
||||||
LastVisitiSODChange = 25,
|
ComparedTriggeringiSODChange = 25,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 新靶病灶评估
|
/// 新靶病灶评估
|
||||||
|
|
Loading…
Reference in New Issue