Uat_Study
			
			
		
		
							parent
							
								
									40baccf48b
								
							
						
					
					
						commit
						1d82214520
					
				| 
						 | 
				
			
			@ -149,6 +149,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        public bool IsOnlyChangeAllTask { get; set; } = false;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 修约小数点
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public int DigitPlaces { get; set; } = 2;
 | 
			
		||||
 | 
			
		||||
        public List<QuestionInfo> QuestionInfo { get; set; } = new List<QuestionInfo>();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<CriterionType, string> errorMsgDic = new Dictionary<CriterionType, string>()
 | 
			
		||||
                            {
 | 
			
		||||
                               {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);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
 | 
			
		|||
        public async Task<ReadingCalculateDto> 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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,6 +53,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
 | 
			
		|||
            this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private List<SiteVisitForTumor> siteVisitForTumorList = null;
 | 
			
		||||
 | 
			
		||||
        #region 获取阅片报告
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -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 自治疗后第二个访视点以来持续的新骨病变数量
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 自治疗后第二个访视点以来持续的新骨病变数量
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -616,6 +623,36 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
 | 
			
		|||
        #endregion
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        #region 间隔天数
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 获取
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="inDto"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public async Task<int> 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 访视点肿瘤评估
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 获取访视日期信息
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="inDto"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public async Task<List<SiteVisitForTumor>> 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<object> GetReportVerify(GetReportVerifyInDto inDto)
 | 
			
		||||
        {
 | 
			
		||||
            return new() { 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="inDto"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1014,7 +1014,7 @@ namespace IRaCIS.Core.Domain.Share
 | 
			
		|||
        /// <summary>
 | 
			
		||||
        /// 间隔天数
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        DaysBetween = 21,
 | 
			
		||||
        DaysBetween = 22,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common
 | 
			
		|||
            }; 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static Dictionary<int, string> SplitLesionDic = new Dictionary<int, string>()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue