Test.EIImageViewer
he 2022-11-03 16:45:57 +08:00
parent 592ec6ed98
commit 962a710ed1
3 changed files with 177 additions and 6 deletions

View File

@ -11,6 +11,28 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid VisitTaskId { get; set; }
}
public class SiteVisitForTumor
{
/// <summary>
/// 访视Id
/// </summary>
public Guid VisitTaskId { get; set; }
/// <summary>
/// 任务Num
/// </summary>
public decimal VisitTaskNum { get; set; }
/// <summary>
/// 最早拍片日期
/// </summary>
public DateTime EarliestScanDate { get; set; }
/// <summary>
/// 最晚拍片日期
/// </summary>
public DateTime LatestScanDate { get; set; }
}
public class AddTaskLesionAnswerFromLastTaskOutDto
{

View File

@ -437,7 +437,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 自治疗后第二个访视点以来持续的新骨病变数量
new ReadingCalculateData (){QuestionType=QuestionType.NewBoneLesionsCount,GetIntFun=GetNewBoneLesionCount},
// 自治疗后第二个访视点以来持续的新骨病变数量
new ReadingCalculateData (){QuestionType=QuestionType.SiteVisitForTumorEvaluation,GetStringFun=GetSiteVisitForTumorEvaluation},
};
@ -460,14 +463,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
#region 计算答案
var value = await calculate.GetIntFun(inDto);
switch (calculate.QuestionType)
{
case QuestionType.NewLesionsCount:
if (inDto.VisitTaskNum >= 1)
{
item.Answer = value.ToString();
item.Answer = (await calculate.GetIntFun(inDto)).ToString();
}
else
{
@ -477,7 +481,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
case QuestionType.AlwaysNewLesionsCount:
if (inDto.VisitTaskNum >= 2)
{
item.Answer = value.ToString();
item.Answer = (await calculate.GetIntFun(inDto)).ToString();
}
else
{
@ -487,15 +491,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
case QuestionType.NewBoneLesionsCount:
if (inDto.VisitTaskNum >= 3)
{
item.Answer = value.ToString();
item.Answer = (await calculate.GetIntFun(inDto)).ToString();
}
else
{
item.Answer = nameof(YesOrNoOrNa.NA);
}
break;
case QuestionType.SiteVisitForTumorEvaluation:
item.Answer = await calculate.GetStringFun(inDto);
break;
default:
item.Answer = value.ToString();
item.Answer =string.Empty;
break;
}
@ -608,6 +615,111 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
#endregion
#region 访视点肿瘤评估
/// <summary>
/// 访视点肿瘤评估
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<string> GetSiteVisitForTumorEvaluation(ReadingCalculateDto inDto)
{
await ChangeLastTaskSiteVisitForTumorEvaluation(inDto);
var newLesionsCount = int.Parse(inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault() ?? "0");
var baseLineLesionsCount = int.Parse(inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.BaseLineLesionsCount).Select(x => x.Answer).FirstOrDefault() ?? "0");
var alwaysNewLesionsCount = int.Parse(inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.AlwaysNewLesionsCount).Select(x => x.Answer).FirstOrDefault() ?? "0");
if (newLesionsCount == 0 &&
baseLineLesionsCount == 0 &&
alwaysNewLesionsCount == 0)
{
return VisitTumorEvaluation.ND.GetEnumInt();
}
else
{
return VisitTumorEvaluation.NoPD.GetEnumInt();
}
}
/// <summary>
/// 修改上一次访视结果
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task ChangeLastTaskSiteVisitForTumorEvaluation(ReadingCalculateDto inDto)
{
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
var taskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum <= taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum
).OrderByDescending(x => x.VisitTaskNum).Select(x => new SiteVisitForTumor()
{
VisitTaskId=x.Id,
VisitTaskNum=x.VisitTaskNum,
EarliestScanDate=x.SourceSubjectVisit.EarliestScanDate??DateTime.Now,
LatestScanDate=x.SourceSubjectVisit.LatestScanDate ?? DateTime.Now,
}).ToListAsync();
var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault();
var baseLineTask = taskList.OrderBy(x => x.VisitTaskNum).FirstOrDefault();
var newLesionsCountQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.QuestionId).FirstOrDefault();
var isPDResult = false;
if (lastTask != null)
{
var lastTasknewLesionsCount = int.Parse(await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync() ?? "0");
if (lastTask.VisitTaskNum == 1m)
{
//基线后第二个访视应满足访视间隔6周以上否则顺延
var secondVisit = taskList.Where(x => x.VisitTaskNum >= 2 && x.EarliestScanDate >= baseLineTask.LatestScanDate.AddDays(42)).FirstOrDefault();
if (secondVisit != null)
{
// 第二访视数量
var secondVisitLesionsCount = int.Parse(await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync() ?? "0");
// 判断是否是当前访视
if (secondVisit.VisitTaskId == inDto.VisitTaskId)
{
secondVisitLesionsCount = int.Parse(inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault() ?? "0");
}
if (lastTasknewLesionsCount >= 2 && secondVisitLesionsCount >= 2)
{
isPDResult = true;
}
}
}
else
{
var thisVisitTaskNewLesionsCount= int.Parse(inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault() ?? "0");
var thisVisitTask = taskList.LastOrDefault();
if (lastTasknewLesionsCount >= 2 && thisVisitTaskNewLesionsCount >= 2&&lastTask.LatestScanDate.AddDays(42)<= thisVisitTask.EarliestScanDate)
{
isPDResult = true;
}
}
}
if (isPDResult)
{
var visitForTumorEvaluationQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation).Select(x => x.QuestionId).FirstOrDefault();
await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == visitForTumorEvaluationQuestionId,x=> new ReadingTaskQuestionAnswer
{
Answer= VisitTumorEvaluation.PD.GetEnumInt(),
});
}
}
#endregion
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
{
return new() {

View File

@ -995,6 +995,43 @@ namespace IRaCIS.Core.Domain.Share
/// 自治疗后第二个访视点以来持续的新骨病变数量
/// </summary>
NewBoneLesionsCount = 19,
/// <summary>
/// 疗效评估分组
/// </summary>
TherapeuticEffectEvaluationGroup=20,
/// <summary>
/// 访视点肿瘤评估
/// </summary>
SiteVisitForTumorEvaluation = 21,
}
/// <summary>
/// 访视点肿瘤评估
/// </summary>
public enum VisitTumorEvaluation
{
/// <summary>
/// PD
/// </summary>
PD = 1,
/// <summary>
/// ND
/// </summary>
ND = 2,
/// <summary>
/// NE
/// </summary>
NE = 3,
/// <summary>
/// 非PD
/// </summary>
NoPD = 4
}
/// <summary>