From 93322582ed6e29b0e3bd435c1ee445f8550e39e8 Mon Sep 17 00:00:00 2001 From: he <10978375@qq.com> Date: Fri, 9 Sep 2022 14:29:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 14 +- .../Reading/Dto/ReadingCalculateViewModel.cs | 16 + .../Reading/ReadingCalculateService.cs | 385 +++++++++--------- IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 3 + 4 files changed, 213 insertions(+), 205 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index fef2a352..405302d9 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -3717,6 +3717,13 @@ + + + 自动计算 + + + + 验证访视提交 @@ -3731,13 +3738,6 @@ - - - 自动计算 - - - - 获取SOD diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 76fd8009..3546e9cf 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -179,6 +179,22 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public decimal SOD { get; set; } } + + public class ChangeAllTaskDto + { + public ReadingCalculateDto calculateDto { get; set; } + + public Guid QuestionId { get; set; } + } + + public class ReadingCalculateData + { + public QuestionType QuestionType { get; set; } + + public Func> GetSingleDataFun { get; set; } + + public Func ChangeAllTaskFun { get; set; } + } } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs index 4ed5eff1..5030598a 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs @@ -55,6 +55,7 @@ namespace IRaCIS.Core.Application.Service #region 临时对象 单个请求的生命周期 避免重复查询数据库 private List visitTaskAnswerList; + private decimal? sODData; #endregion /// @@ -70,6 +71,180 @@ namespace IRaCIS.Core.Application.Service await ReadingCalculate(readingData); } + /// + /// 自动计算 + /// + /// + /// + public async Task ReadingCalculate(ReadingCalculateDto inDto) + { + // 找到所有访视任务的Id + + var visitTaskIds = await _visitTaskRepository.Where(x => !x.IsAnalysisCreate && x.ReadingCategory == ReadingCategory.Visit && + x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.DoctorUserId == inDto.DoctorUserId).Select(x => x.Id).ToListAsync(); + + + + + #region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果 + var needAddList = new List(); + // 循环找要计算的值进行计算 + foreach (var item in inDto.QuestionInfo.Where(x => x.QuestionType != null)) + { + + switch (item.QuestionType) + { + // 靶病灶径线之和(SOD) + case QuestionType.SOD: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetSODData(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + + // 非淋巴结靶病灶长径之和 + case QuestionType.SumOfDiameter: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetSumOfDiameter(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + // 与基线SOD相比变化量(mm) + case QuestionType.SODChange: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetSODChange(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + // 与基线访视相比SOD变化百分比 + case QuestionType.SODPercent: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetSODPercent(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + // 与整个访视期间最低点相比增加的值(mm) 其他任务需要改 + case QuestionType.LowestIncrease: + + if (!inDto.IsChangeOtherTask) + { + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetLowestIncrease(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + } + else + { + await ChangeAllLowestIncrease(new ChangeAllTaskDto() + { + calculateDto = inDto, + QuestionId = item.QuestionId, + }); + } + + + break; + // 与整个访视期间最低点相比增加的百分比 其他任务需要改 + case QuestionType.LowPercent: + + if (!inDto.IsChangeOtherTask) + { + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = (await GetLowPercent(inDto)).ToString(), + ReadingQuestionTrialId = item.QuestionId, + }); + } + else + { + await ChangeAllLowPercent(inDto, item.QuestionId); + } + + + break; + // 整个访视期间最低点访视名称 其他任务需要改 + case QuestionType.LowVisit: + var answer = (await GetLowVisit(inDto)).ToString(); + if (!inDto.IsChangeOtherTask) + { + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = answer, + ReadingQuestionTrialId = item.QuestionId, + }); + } + else + { + if (inDto.IsChangeOtherTask) + { + await this.ChangeAllVisitTaskAnswer(visitTaskIds, item.QuestionId, answer); + } + } + + break; + // 是否存在非淋巴结靶病灶 + case QuestionType.IsLymphTarget: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = await GetIsLymphTarget(inDto), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + // 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 + case QuestionType.IsAddFive: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = await GetIsAddFive(inDto), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + + // 被评估为NE的单个靶病灶 + case QuestionType.NETarget: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = await GetNETarget(inDto), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + + // 整体肿瘤评估 + case QuestionType.Tumor: + needAddList.Add(new ReadingTaskQuestionAnswer() + { + Answer = await GetTumor(inDto), + ReadingQuestionTrialId = item.QuestionId, + }); + break; + } + } + + var questionIds = needAddList.Select(x => x.ReadingQuestionTrialId).ToList(); + + await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => questionIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId); + needAddList.ForEach(x => + { + x.SubjectId = inDto.SubjectId; + x.ReadingQuestionCriterionTrialId = inDto.CriterionId; + x.VisitTaskId = inDto.VisitTaskId; + x.TrialId = inDto.TrialId; + x.SubjectId = inDto.SubjectId; + }); + + await _readingTaskQuestionAnswerRepository.AddRangeAsync(needAddList); + + await _readingTaskQuestionAnswerRepository.SaveChangesAsync(); + #endregion + + + } + + /// /// 验证访视提交 /// @@ -174,200 +349,7 @@ namespace IRaCIS.Core.Application.Service return readingData; } - /// - /// 自动计算 - /// - /// - /// - public async Task ReadingCalculate(ReadingCalculateDto inDto) - { - // 找到所有访视任务的Id - - var visitTaskIds = await _visitTaskRepository.Where(x => !x.IsAnalysisCreate && x.ReadingCategory == ReadingCategory.Visit && - x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned&&x.DoctorUserId==inDto.DoctorUserId).Select(x => x.Id).ToListAsync(); - - - #region 先计算 - // 先计算然后保存结果 因为计算的结果在下面的计算可能会用到 - var needFirstCalculateTypes = new List() - { - QuestionType.SOD, - }; - - var needFirstAddList = new List(); - - foreach (var item in inDto.QuestionInfo.Where(x => needFirstCalculateTypes.Contains(x.QuestionType))) - { - switch (item.QuestionType) - { - // 靶病灶径线之和(SOD) - case QuestionType.SOD: - needFirstAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetSODData(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - } - } - - - var needFirstAddIds = needFirstAddList.Select(x => x.ReadingQuestionTrialId).ToList(); - await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => needFirstAddIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId); - needFirstAddList.ForEach(x => - { - x.SubjectId = inDto.SubjectId; - x.ReadingQuestionCriterionTrialId = inDto.CriterionId; - x.VisitTaskId = inDto.VisitTaskId; - x.TrialId = inDto.TrialId; - x.SubjectId = inDto.SubjectId; - }); - - await _readingTaskQuestionAnswerRepository.AddRangeAsync(needFirstAddList); - - await _readingTaskQuestionAnswerRepository.SaveChangesAsync(); - #endregion - - var needAddList = new List(); - // 循环找要计算的值进行计算 - foreach (var item in inDto.QuestionInfo.Where(x => x.QuestionType != null).Where(x=> !needFirstCalculateTypes.Contains(x.QuestionType))) - { - switch (item.QuestionType) - { - - // 非淋巴结靶病灶长径之和 - case QuestionType.SumOfDiameter: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetSumOfDiameter(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - // 与基线SOD相比变化量(mm) - case QuestionType.SODChange: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetSODChange(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - // 与基线访视相比SOD变化百分比 - case QuestionType.SODPercent: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetSODPercent(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - // 与整个访视期间最低点相比增加的值(mm) 其他任务需要改 - case QuestionType.LowestIncrease: - - if (!inDto.IsChangeOtherTask) - { - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetLowestIncrease(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - } - else - { - await ChangeAllLowestIncrease(inDto, item.QuestionId); - } - - - break; - // 与整个访视期间最低点相比增加的百分比 其他任务需要改 - case QuestionType.LowPercent: - - if (!inDto.IsChangeOtherTask) - { - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = (await GetLowPercent(inDto)).ToString(), - ReadingQuestionTrialId = item.QuestionId, - }); - } - else - { - await ChangeAllLowPercent(inDto, item.QuestionId); - } - - - break; - // 整个访视期间最低点访视名称 其他任务需要改 - case QuestionType.LowVisit: - var answer = (await GetLowVisit(inDto)).ToString(); - if (!inDto.IsChangeOtherTask) - { - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = answer, - ReadingQuestionTrialId = item.QuestionId, - }); - } - else - { - if (inDto.IsChangeOtherTask) - { - await this.ChangeAllVisitTaskAnswer(visitTaskIds, item.QuestionId, answer); - } - } - - break; - // 是否存在非淋巴结靶病灶 - case QuestionType.IsLymphTarget: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = await GetIsLymphTarget(inDto), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - // 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上 - case QuestionType.IsAddFive: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = await GetIsAddFive(inDto), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - - // 被评估为NE的单个靶病灶 - case QuestionType.NETarget: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = await GetNETarget(inDto), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - - // 整体肿瘤评估 - case QuestionType.Tumor: - needAddList.Add(new ReadingTaskQuestionAnswer() - { - Answer = await GetTumor(inDto), - ReadingQuestionTrialId = item.QuestionId, - }); - break; - } - } - - var questionIds = needAddList.Select(x => x.ReadingQuestionTrialId).ToList(); - - await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => questionIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId); - needAddList.ForEach(x => - { - x.SubjectId = inDto.SubjectId; - x.ReadingQuestionCriterionTrialId = inDto.CriterionId; - x.VisitTaskId = inDto.VisitTaskId; - x.TrialId = inDto.TrialId; - x.SubjectId = inDto.SubjectId; - }); - - await _readingTaskQuestionAnswerRepository.AddRangeAsync(needAddList); - - await _readingTaskQuestionAnswerRepository.SaveChangesAsync(); - } + #region 获取SOD @@ -382,6 +364,11 @@ namespace IRaCIS.Core.Application.Service /// public async Task GetSODData(ReadingCalculateDto inDto) { + if (sODData != null) + { + return sODData.Value; + } + var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); decimal result = 0; @@ -401,8 +388,10 @@ namespace IRaCIS.Core.Application.Service } } + sODData = result; - return result; + return sODData.Value; + } @@ -631,13 +620,13 @@ namespace IRaCIS.Core.Application.Service /// /// /// - public async Task ChangeAllLowestIncrease(ReadingCalculateDto inDto,Guid questionId) + public async Task ChangeAllLowestIncrease(ChangeAllTaskDto inDto) { - var visitTaskList = await GetVisitTaskAnswerList(inDto); + var visitTaskList = await GetVisitTaskAnswerList(inDto.calculateDto); var lowSod = visitTaskList.Select(x => x.SOD).OrderBy(x => x).FirstOrDefault(); foreach (var item in visitTaskList) { - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == questionId, x => new ReadingTaskQuestionAnswer() + await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == inDto.QuestionId, x => new ReadingTaskQuestionAnswer() { Answer = (item.SOD - lowSod).ToString() }) ; diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index ed3e254d..079fdb8b 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -277,6 +277,9 @@ namespace IRaCIS.Core.Domain.Share State = 7, } + /// + /// 问题类型 这里序号关系着计算顺序 请勿修改 + /// public enum QuestionType { ///