diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
index caebebb9f..32a82237a 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs
@@ -11,6 +11,28 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid VisitTaskId { get; set; }
}
+ public class SiteVisitForTumor
+ {
+ ///
+ /// 访视Id
+ ///
+ public Guid VisitTaskId { get; set; }
+
+ ///
+ /// 任务Num
+ ///
+ public decimal VisitTaskNum { get; set; }
+
+ ///
+ /// 最早拍片日期
+ ///
+ public DateTime EarliestScanDate { get; set; }
+
+ ///
+ /// 最晚拍片日期
+ ///
+ public DateTime LatestScanDate { get; set; }
+ }
public class AddTaskLesionAnswerFromLastTaskOutDto
{
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs
index c8d42b02a..50095083f 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs
@@ -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 访视点肿瘤评估
+ ///
+ /// 访视点肿瘤评估
+ ///
+ ///
+ ///
+ public async Task 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();
+ }
+ }
+
+ ///
+ /// 修改上一次访视结果
+ ///
+ ///
+ ///
+ 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