From 4c123a62270139a744732da983fd2cfd95f399de Mon Sep 17 00:00:00 2001 From: he <10978375@qq.com> Date: Wed, 9 Nov 2022 15:56:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingQuestionViewModel.cs | 2 +- .../Dto/CriterionCalculateDto.cs | 21 ++- .../ReadingCalculate/PCWG3CalculateService.cs | 120 ++++++++++++------ 3 files changed, 99 insertions(+), 44 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs index e7ba23e98..2e75c06f2 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs @@ -534,7 +534,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// 表单类型 /// - public FormType FormType { get; set; } + public FormType FormType { get; set; } = FormType.SinglePage; /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index 32a82237a..f790f5ac7 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs @@ -11,6 +11,16 @@ namespace IRaCIS.Core.Application.ViewModel public Guid VisitTaskId { get; set; } } + public class VisitStudyTime + { + /// + /// 访视Id + /// + public Guid SubjectVisitId { get; set; } + + public DateTime? StudyTime { get; set; } + } + public class SiteVisitForTumor { /// @@ -18,20 +28,19 @@ namespace IRaCIS.Core.Application.ViewModel /// public Guid VisitTaskId { get; set; } + public Guid? SubjectVisitId { get; set; } + /// /// 任务Num /// public decimal VisitTaskNum { get; set; } /// - /// 最早拍片日期 + /// 检查日期 /// - public DateTime EarliestScanDate { get; set; } + public DateTime? StudyTime { 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 9684c1abc..c6446002e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -24,6 +24,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate private readonly IRepository _readingTableAnswerRowInfoRepository; private readonly IRepository _readingQuestionTrialRepository; private readonly IRepository _subjectVisitRepository; + private readonly IRepository _dicomStudyRepository; + private readonly IRepository _noneDicomStudyRepository; private readonly IRepository _tumorAssessmentRepository; private readonly IGeneralCalculateService _generalCalculateService; private readonly IRepository _readingTaskQuestionAnswerRepository; @@ -36,6 +38,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate IRepository readingTableAnswerRowInfoRepository, IRepository readingQuestionTrialRepository, IRepository subjectVisitRepository, + IRepository dicomStudyRepository, + IRepository noneDicomStudyRepository, IRepository tumorAssessmentRepository, IGeneralCalculateService generalCalculateService, IRepository readingTaskQuestionAnswerRepository @@ -48,6 +52,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository; this._readingQuestionTrialRepository = readingQuestionTrialRepository; this._subjectVisitRepository = subjectVisitRepository; + this._dicomStudyRepository = dicomStudyRepository; + this._noneDicomStudyRepository = noneDicomStudyRepository; this._tumorAssessmentRepository = tumorAssessmentRepository; this._generalCalculateService = generalCalculateService; this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; @@ -697,12 +703,20 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate if (lastTask != null) { var thisTask = taskList.FirstOrDefault(); + if (thisTask.StudyTime != null && lastTask.StudyTime != null) + { + return (int)Math.Floor((thisTask.StudyTime.Value - lastTask.StudyTime.Value).TotalDays); + } + else + { + return -1; + } - return (int)Math.Floor((thisTask.EarliestScanDate-lastTask.LatestScanDate).TotalDays); + } else { - return 0; + return -1; } } @@ -766,46 +780,52 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var firstVisit = taskList.FirstOrDefault(); - - //基线后第二个访视(应满足访视间隔6周以上,否则顺延) - var secondVisit = taskList.Where(x => x.VisitTaskNum >= 2 && x.EarliestScanDate >= baseLineTask.LatestScanDate.AddDays(42)).FirstOrDefault(); - if (secondVisit != null) + if (baseLineTask.StudyTime != null) { - - var firstTaskNewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstVisit.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); - - // 第二访视数量 - var secondVisitLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); - - // 判断是否是当前访视 当前访视还未入库 - if (secondVisit.VisitTaskId == inDto.VisitTaskId) + //基线后第二个访视(应满足访视间隔6周以上,否则顺延) + var secondVisit = taskList.Where(x => x.VisitTaskNum >= 2 && x.StudyTime >= baseLineTask.StudyTime.Value.AddDays(42)).FirstOrDefault(); + if (secondVisit != null) { - secondVisitLesionsCount = (inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0(); + + var firstTaskNewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstVisit.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + + // 第二访视数量 + var secondVisitLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + + // 判断是否是当前访视 当前访视还未入库 + if (secondVisit.VisitTaskId == inDto.VisitTaskId) + { + secondVisitLesionsCount = (inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0(); + } + + if (firstTaskNewLesionsCount >= 2 && secondVisitLesionsCount >= 2) + { + isPDResult = true; + } } - if (firstTaskNewLesionsCount >= 2 && secondVisitLesionsCount >= 2) + #endregion + + + + if (lastTask.VisitTaskNum >= 2m) { - isPDResult = true; - } - } - - #endregion - - - - if (lastTask.VisitTaskNum >= 2m) - { - - var lastTasknewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); - var thisVisitTaskNewLesionsCount = (inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0(); - - var thisVisitTask = taskList.LastOrDefault(); - - if (lastTasknewLesionsCount >= 2 && thisVisitTaskNewLesionsCount >= 2 && lastTask.LatestScanDate.AddDays(42) <= thisVisitTask.EarliestScanDate) - { - isPDResult = true; + + var lastTasknewLesionsCount = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTask.VisitTaskId && x.ReadingQuestionTrialId == newLesionsCountQuestionId).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + var thisVisitTaskNewLesionsCount = (inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionsCount).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0(); + + var thisVisitTask = taskList.LastOrDefault(); + + if (thisVisitTask.StudyTime!=null&&lastTask.StudyTime!=null&& + + + lastTasknewLesionsCount >= 2 && thisVisitTaskNewLesionsCount >= 2 && lastTask.StudyTime.Value.AddDays(42) <= thisVisitTask.StudyTime) + { + isPDResult = true; + } } } + } if (isPDResult) { @@ -830,6 +850,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task> GetSiteVisitForTumorList(ReadingCalculateDto inDto) { + + if (siteVisitForTumorList == null) { var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); @@ -840,9 +862,33 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { VisitTaskId = x.Id, VisitTaskNum = x.VisitTaskNum, - EarliestScanDate = x.SourceSubjectVisit.EarliestScanDate ?? DateTime.Now, - LatestScanDate = x.SourceSubjectVisit.LatestScanDate ?? DateTime.Now, + SubjectVisitId=x.SourceSubjectVisitId, }).ToListAsync(); + + var visitIds = siteVisitForTumorList.Select(x => x.VisitTaskId).ToList(); + // Dicom 用NM 非dicom 用骨扫描 (BoneScan) + List visitStudies = await _dicomStudyRepository.Where(x => visitIds.Contains(x.SubjectVisitId) && x.Modalities == "NM").Select(x => new VisitStudyTime() + { + SubjectVisitId = x.SubjectVisitId, + StudyTime = x.StudyTime + + }).ToListAsync(); + + visitStudies.AddRange( + await _noneDicomStudyRepository.Where(x => visitIds.Contains(x.SubjectVisitId)&&x.Modality== "BoneScan").Select(x => new VisitStudyTime() { + SubjectVisitId = x.SubjectVisitId, + StudyTime = x.ImageDate + + }).ToListAsync() + ); + + visitStudies = visitStudies.Where(x => x.StudyTime != null).ToList(); + + foreach (var item in siteVisitForTumorList) + { + item.StudyTime = visitStudies.Where(x => x.SubjectVisitId == item.SubjectVisitId).Max(x => x.StudyTime); + } + } return siteVisitForTumorList;