diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index caebebb9..32a82237 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 c8d42b02..50095083 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 GetReportVerify(GetReportVerifyInDto inDto) { return new() { diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index ef406a99..e05f586c 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -995,6 +995,43 @@ namespace IRaCIS.Core.Domain.Share /// 自治疗后第二个访视点以来持续的新骨病变数量 /// NewBoneLesionsCount = 19, + + /// + /// 疗效评估分组 + /// + TherapeuticEffectEvaluationGroup=20, + + /// + /// 访视点肿瘤评估 + /// + SiteVisitForTumorEvaluation = 21, + } + + /// + /// 访视点肿瘤评估 + /// + public enum VisitTumorEvaluation + { + + /// + /// PD + /// + PD = 1, + + /// + /// ND + /// + ND = 2, + + /// + /// NE + /// + NE = 3, + + /// + /// 非PD + /// + NoPD = 4 } ///