diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 38b8efcca..95ce32241 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1458,9 +1458,9 @@ - + - 获取第一次转变访视任务Id + 获取比较任务Id 需要之前一次访视为IUPD或者ICPD diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs index ba39e9c72..4a5941163 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs @@ -479,6 +479,9 @@ namespace IRaCIS.Application.Services // 在修改前 去除这个问题 x.BeforeQuestionList = x.BeforeQuestionList.Where(x => x.QuestionType != QuestionType.SiteVisitForTumorEvaluation).ToList(); + + x.AfterQuestionList = x.AfterQuestionList.Where(x => x.QuestionType == QuestionType.SiteVisitForTumorEvaluation|| x.GlobalAnswerType != GlobalAnswerType.Question).ToList(); + }); } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs index 8841115eb..39ae896be 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Dto/CriterionCalculateDto.cs @@ -1,4 +1,5 @@ -using System; +using IRaCIS.Core.Domain.Share; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -11,6 +12,18 @@ namespace IRaCIS.Core.Application.ViewModel public Guid VisitTaskId { get; set; } } + public class ReadingTaskQuestionAnswerDto : ReadingTaskQuestionAnswer + { + public QuestionType QuestionType { get; set; } + } + public class TirggerTaskInfo + { + public Guid VisitTaskId { get; set; } + + public decimal VisitNum { get; set; } + + public string TumorAnswer { get; set; } = string.Empty; + } public class VisitStudyTime { /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 3c78a4c4e..3c9ce3764 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -462,7 +462,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { #region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果 - var needAddList = new List(); + var needAddList = new List(); List calculateList = new List() @@ -498,13 +498,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate new ReadingCalculateData (){QuestionType=QuestionType.NETarget,GetStringFun=GetNETarget}, // 与触发iRECIST访视相比SOD变化量 - new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringSODChange,GetDecimalNullFun=GetComparedTriggeringSODChange,IsConvertedTask=true}, + new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringSODChange,GetStringFun=GetComparedTriggeringSODChange,IsConvertedTask=true}, // 新靶病灶直径之和(iSOD) new ReadingCalculateData (){QuestionType=QuestionType.ISOD,GetDecimalNullFun=GetiSODData,IsConvertedTask=true}, // 与触发iRECIST访视相比iSOD变化量 - new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringiSODChange,GetDecimalNullFun=GetComparedTriggeringiSODChange,IsConvertedTask=true}, + new ReadingCalculateData (){QuestionType=QuestionType.ComparedTriggeringiSODChange,GetStringFun=GetComparedTriggeringiSODChange,IsConvertedTask=true}, // 靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,IsConvertedTask=false}, @@ -710,9 +710,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate - needAddList.Add(new ReadingTaskQuestionAnswer() + needAddList.Add(new ReadingTaskQuestionAnswerDto() { Answer = item.Answer, + QuestionType= calculate.QuestionType, ReadingQuestionTrialId = item.QuestionId, }); } @@ -730,13 +731,35 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } } + + var questionIds = needAddList.Select(x => x.ReadingQuestionTrialId).ToList(); await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => questionIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId); + + // 这里在某些条件下 要删除 sod变化量 和isod变化量 + // 靶病灶评估为IUPD或者ICPD + + var targetLesionIsIUorIC = needAddList.Any(x => x.QuestionType == QuestionType.TargetLesion && (x.Answer.EqEnum(TargetAssessment.iUPD) || x.Answer.EqEnum(TargetAssessment.iCPD))); + + // 新靶病灶为IUPD或者ICPD + var newTargetLesionIsIUorIC = needAddList.Any(x => x.QuestionType == QuestionType.NewTargetLesion && (x.Answer.EqEnum(NewTargetLesionAssessment.iUPD) || x.Answer.EqEnum(NewTargetLesionAssessment.iCPD))); + + needAddList.ForEach(x => { + + if (x.QuestionType == QuestionType.ComparedTriggeringSODChange && !targetLesionIsIUorIC) + { + x.Answer = string.Empty; + } + else if (x.QuestionType == QuestionType.ComparedTriggeringiSODChange && !newTargetLesionIsIUorIC) + { + x.Answer = string.Empty; + } + x.SubjectId = inDto.SubjectId; x.ReadingQuestionCriterionTrialId = inDto.CriterionId; x.VisitTaskId = inDto.VisitTaskId; @@ -1335,18 +1358,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - public async Task GetComparedTriggeringSODChange(ReadingCalculateDto inDto) + public async Task GetComparedTriggeringSODChange(ReadingCalculateDto inDto) { - var firstChangeTaskId = await this.GetFirstChangeTaskId(inDto); + var compareTaskId = await this.GetCompareTaskId(inDto,QuestionType.TargetLesion); + if (compareTaskId == null) + { + return string.Empty; + } var firstChangeSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); var value = await GetSODData(inDto); if (value == null || inDto.IsBaseLine|| !inDto.IsConvertedTask||inDto.BeforeConvertedTaskId!=null) { - return null; + return string.Empty; } - return value.NullChange0() - firstChangeSOD; + return (value.NullChange0() - firstChangeSOD).ToString(); } #endregion @@ -1409,20 +1436,24 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - public async Task GetComparedTriggeringiSODChange(ReadingCalculateDto inDto) + public async Task GetComparedTriggeringiSODChange(ReadingCalculateDto inDto) { - var firstChangeTaskId = await GetFirstChangeTaskId(inDto); - - var firstChangeiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == firstChangeTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); + var compareTaskId = await this.GetCompareTaskId(inDto, QuestionType.NewTargetLesion); + if (compareTaskId == null) + { + return string.Empty; + } + + var firstChangeiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == compareTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0(); var value = await GetiSODData(inDto); if (value == null || inDto.IsBaseLine || !inDto.IsConvertedTask || inDto.BeforeConvertedTaskId != null) { - return null; + return string.Empty; } - return value.NullChange0() - firstChangeiSOD; + return (value.NullChange0() - firstChangeiSOD).ToString(); } #endregion @@ -1666,33 +1697,37 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 获取第一次转变访视任务Id + /// 获取比较任务Id 需要之前一次访视为IUPD或者ICPD /// /// - private async Task GetFirstChangeTaskId(ReadingCalculateDto inDto) + private async Task GetCompareTaskId(ReadingCalculateDto inDto,QuestionType questionType) { - - if (firstChangeTaskId != null) + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); + var lastTaskId = await GetLastVisitTaskId(inDto); + Guid? compareTaskId = null; + switch (questionType) { - return firstChangeTaskId.Value; - } - else - { - var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); - var taskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && - x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId && - x.IsAnalysisCreate == taskinfo.IsAnalysisCreate && - x.DoctorUserId == taskinfo.DoctorUserId && - x.IsSelfAnalysis == taskinfo.IsSelfAnalysis && - x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum - && x.BeforeConvertedTaskId != null && x.TaskState == TaskState.Effect - ).OrderBy(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync(); - firstChangeTaskId = taskId; - return taskId; - } - + case QuestionType.TargetLesion: + if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion && + (x.Answer == TargetAssessment.iUPD.GetEnumInt() || x.Answer == TargetAssessment.iCPD.GetEnumInt()))) + { + compareTaskId = lastTaskId; + } + break; + case QuestionType.NewTargetLesion: + if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion && + (x.Answer == NewTargetLesionAssessment.iUPD.GetEnumInt() || x.Answer == NewTargetLesionAssessment.iCPD.GetEnumInt()))) + { + compareTaskId = lastTaskId; + } + break; + } + + + return compareTaskId; } + #endregion #region 计算阅片问题 外层问题 @@ -1745,7 +1780,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); var lastVisitTaskId = await GetLastVisitTaskId(inDto); var targetLesionQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.QuestionId).FirstOrDefault(); - var firstChangeTaskId = await GetFirstChangeTaskId(inDto); + var sodQuestionId = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SOD).Select(x => x.QuestionId).FirstOrDefault(); IRECISTTargetLesionDto resultData = new IRECISTTargetLesionDto() {