diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index c50f93154..47242c654 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -149,6 +149,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool IsOnlyChangeAllTask { get; set; } = false; + /// + /// 修约小数点 + /// + public int DigitPlaces { get; set; } = 2; + public List QuestionInfo { get; set; } = new List(); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 753263923..c6211e9c8 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -842,7 +842,8 @@ namespace IRaCIS.Application.Services { SubmitTableQuestionOutDto result = new SubmitTableQuestionOutDto(); await VerifyTaskIsSign(inDto.VisitTaskId); - + var criterionId = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.TrialReadingCriterionId).FirstOrDefaultAsync(); + var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterionId).FirstNotNullAsync(); var tableQuestionIds = inDto.AnswerList.Select(x => x.TableQuestionId).ToList(); var tableQuestionIdGroup = tableQuestionIds.GroupBy(x => new { TableQuestionId = x }).Select(x => new TableQuestionData @@ -883,8 +884,23 @@ namespace IRaCIS.Application.Services if (rowCount > item.MaxRowCount.Value - 1) { - //throw new BusinessValidationFailedException($"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!"); - throw new BusinessValidationFailedException($"按照RECIST1.1的相关规则,同一器官的靶病灶数量不超过{item.MaxRowCount.Value}个,请确认!!"); + + Dictionary errorMsgDic = new Dictionary() + { + {CriterionType.RECIST1Pointt1, "按照RECIST1.1的相关规则,同一器官的靶病灶数量不超过"}, + }; + string msg = string.Empty; + try + { + msg = $"{ errorMsgDic[criterionInfo.CriterionType]}{item.MaxRowCount.Value}个,请确认!!"; + } + catch (Exception) + { + + msg=$"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!"; + } + + throw new BusinessValidationFailedException(msg); } } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/GeneralCalculateService.cs index 97938994c..b7ea032eb 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/GeneralCalculateService.cs @@ -52,6 +52,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate public async Task GetReadingCalculateDto(Guid visitTaskId) { var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); + + var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).FirstNotNullAsync(); var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == (visitTask.SourceSubjectVisitId ?? default(Guid))).FirstOrDefaultAsync(); var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == visitTask.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); @@ -129,6 +131,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate VisitName = subjectVisit.VisitName, BlindName = subjectVisit.BlindName, VisitTaskNum = visitTask.VisitTaskNum, + DigitPlaces= criterionInfo.DigitPlaces??2, }; return readingData; diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs index 50095083f..49cbb64f8 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/PCWG3CalculateService.cs @@ -53,6 +53,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; } + private List siteVisitForTumorList = null; #region 获取阅片报告 /// @@ -437,6 +438,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 自治疗后第二个访视点以来持续的新骨病变数量 new ReadingCalculateData (){QuestionType=QuestionType.NewBoneLesionsCount,GetIntFun=GetNewBoneLesionCount}, + // 间隔天数 + new ReadingCalculateData (){QuestionType=QuestionType.DaysBetween,GetIntFun=GetNumberOfDaysBetween}, + // 自治疗后第二个访视点以来持续的新骨病变数量 new ReadingCalculateData (){QuestionType=QuestionType.SiteVisitForTumorEvaluation,GetStringFun=GetSiteVisitForTumorEvaluation}, @@ -498,6 +502,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate item.Answer = nameof(YesOrNoOrNa.NA); } break; + case QuestionType.DaysBetween: + item.Answer = (await calculate.GetIntFun(inDto)).ToString(); + break; case QuestionType.SiteVisitForTumorEvaluation: item.Answer = await calculate.GetStringFun(inDto); break; @@ -595,7 +602,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion - #region 既往新病灶计数 + #region 自治疗后第二个访视点以来持续的新骨病变数量 /// /// 自治疗后第二个访视点以来持续的新骨病变数量 /// @@ -616,6 +623,36 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion + #region 间隔天数 + /// + /// 获取 + /// + /// + /// + public async Task GetNumberOfDaysBetween(ReadingCalculateDto inDto) + { + if (inDto.IsBaseLine) + { + return 0; + } + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); + var taskList = await GetSiteVisitForTumorList(inDto); + var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault(); + if (lastTask != null) + { + var thisTask = taskList.FirstOrDefault(); + + return (int)Math.Floor((thisTask.EarliestScanDate-lastTask.LatestScanDate).TotalDays); + } + else + { + return 0; + } + } + + #endregion + + #region 访视点肿瘤评估 /// @@ -649,16 +686,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate 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 taskList =await GetSiteVisitForTumorList(inDto); var lastTask = taskList.Where(x => x.VisitTaskNum < taskinfo.VisitTaskNum).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault(); var baseLineTask = taskList.OrderBy(x => x.VisitTaskNum).FirstOrDefault(); @@ -720,6 +748,34 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate #endregion + /// + /// 获取访视日期信息 + /// + /// + /// + public async Task> GetSiteVisitForTumorList(ReadingCalculateDto inDto) + { + if (siteVisitForTumorList == null) + { + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); + siteVisitForTumorList = 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(); + } + + return siteVisitForTumorList; + + + } + + public async Task GetReportVerify(GetReportVerifyInDto inDto) { return new() { diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index ffaf06d70..03d74bc4f 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -752,7 +752,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } else { - return decimal.Round((thisSOD.NullChange0() - baseLineSOD) * 100 / baseLineSOD, 2); + return decimal.Round((thisSOD.NullChange0() - baseLineSOD) * 100 / baseLineSOD, inDto.DigitPlaces); } } #endregion @@ -804,7 +804,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } else { - return decimal.Round((thisSOD.NullChange0() - minSOD) * 100 / minSOD, 2); + return decimal.Round((thisSOD.NullChange0() - minSOD) * 100 / minSOD, inDto.DigitPlaces); } @@ -996,30 +996,30 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - public async Task ChangeAllLowPercent(ChangeAllTaskDto inDto) - { - var visitTaskList = await GetVisitTaskAnswerList(inDto.calculateDto); + //public async Task ChangeAllLowPercent(ChangeAllTaskDto inDto) + //{ + // var visitTaskList = await GetVisitTaskAnswerList(inDto.calculateDto); - var lowSod = (await GetLowSODVisit(inDto.calculateDto)).Select(x => x.SOD).OrderBy(x => x).FirstOrDefault(); + // var lowSod = (await GetLowSODVisit(inDto.calculateDto)).Select(x => x.SOD).OrderBy(x => x).FirstOrDefault(); - foreach (var item in visitTaskList.Where(x => x.VisitTaskId != inDto.calculateDto.BaseLineTaskId)) - { - decimal percent = 0; - if (lowSod == 0) - { - percent = 100; - } - else - { - percent = decimal.Round((item.SOD - lowSod) * 100 / lowSod, 2); - } + // foreach (var item in visitTaskList.Where(x => x.VisitTaskId != inDto.calculateDto.BaseLineTaskId)) + // { + // decimal percent = 0; + // if (lowSod == 0) + // { + // percent = 100; + // } + // else + // { + // percent = decimal.Round((item.SOD - lowSod) * 100 / lowSod, 2); + // } - await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == inDto.QuestionId, x => new ReadingTaskQuestionAnswer() - { - Answer = percent.ToString() - }); - } - } + // await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == inDto.QuestionId, x => new ReadingTaskQuestionAnswer() + // { + // Answer = percent.ToString() + // }); + // } + //} #endregion diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index 06bc4fa24..9736bcd42 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -1014,7 +1014,7 @@ namespace IRaCIS.Core.Domain.Share /// /// 间隔天数 /// - DaysBetween = 21, + DaysBetween = 22, } /// diff --git a/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs b/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs index f3e7a9e65..44528c849 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs @@ -39,7 +39,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common }; } - + public static Dictionary SplitLesionDic = new Dictionary()