diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 38b8efcca..62d5a29ed 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1220,6 +1220,11 @@ 首次转变的任务ID + + + 触发任务list + + 删除病灶获取起始病灶序号(RECIST1Point1 固定是1) @@ -1233,7 +1238,7 @@ - + 测试计算 @@ -1458,9 +1463,9 @@ - + - 获取第一次转变访视任务Id + 获取比较任务Id 需要之前一次访视为IUPD或者ICPD @@ -7444,6 +7449,16 @@ SystemNoticeAddOrEdit 列表查询参数模型 + + + 靶病灶是否为IUPD或者ICPD + + + + + 靶病灶是否为IUPD或者ICPD + + 访视Id 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..5e9f7d556 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,39 @@ 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; } + + /// + /// 靶病灶是否为IUPD或者ICPD + /// + public bool TargetAssessmentIsIUorIC { get; set; } + + /// + /// 靶病灶是否为IUPD或者ICPD + /// + public bool NewTargetLesionAssessmentIsIUorIC { get; set; } + } + + + public class TirggerAnswerInfo + { + public Guid VisitTaskId { get; set; } + + public QuestionType QuestionType { get; set; } + + public string Answer { 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..0321b51b3 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -88,6 +88,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// 首次转变的任务ID /// public Guid? firstChangeTaskId; + + /// + /// 触发任务list + /// + public List? compareTaskList = null; #endregion #region 删除病灶获取起始病灶序号 @@ -394,14 +399,22 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// /// /// - [HttpPost] - public async Task TestCalculate(Guid visitTaskId, QuestionType type) + [HttpGet] + public async Task TestCalculate(Guid visitTaskId, QuestionType? type) { //_logger.LogError("测试计算"); ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(visitTaskId); // await _generalCalculateService.LogRecord(readingData, "其他既往新病灶", LesionType.OtherPreviousNewLesion); + if (type == null) + { + await ReadingCalculate(readingData); + } + else - await ReadingCalculate(readingData,new List() { type}); + { + await ReadingCalculate(readingData, new List() { type.Value }); + } + } @@ -462,7 +475,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { #region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果 - var needAddList = new List(); + var needAddList = new List(); List calculateList = new List() @@ -498,13 +511,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 +723,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 +744,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 +1371,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 +1449,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 +1710,109 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } /// - /// 获取第一次转变访视任务Id + /// 获取比较任务Id 需要之前一次访视为IUPD或者ICPD /// /// - private async Task GetFirstChangeTaskId(ReadingCalculateDto inDto) + private async Task GetCompareTaskId(ReadingCalculateDto inDto,QuestionType questionType) { + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); + var lastTaskId = await GetLastVisitTaskId(inDto); - if (firstChangeTaskId != null) + + if (compareTaskList == null) { - 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 && + // 先找到第一个转变任务的number 直接找是否为转变任务 查询耗性能 + var firstChangeVisitTaskNum = 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; + ).OrderBy(x => x.VisitTaskNum).Select(x => x.VisitTaskNum).FirstOrDefaultAsync(); + + // 找到转变之后 所有任务 + compareTaskList = 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.VisitTaskNum >= firstChangeVisitTaskNum && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect + ).OrderBy(x => x.VisitTaskNum).Select(x => new TirggerTaskInfo() + { + VisitTaskId = x.Id, + VisitNum = x.VisitTaskNum, + }).ToListAsync(); + + // 获取所有任务Id + var visitTaskids = compareTaskList.Select(x => x.VisitTaskId).ToList(); + + // 找到所有任务的靶病灶评估和非靶病灶评估 + var answers = await _readingTaskQuestionAnswerRepository.Where(x => (x.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion || x.ReadingQuestionTrial.QuestionType == QuestionType.NewTargetLesion) && + visitTaskids.Contains(x.VisitTaskId) + ).Select(x => new TirggerAnswerInfo() + { + VisitTaskId = x.VisitTaskId, + Answer = x.Answer, + QuestionType = x.ReadingQuestionTrial.QuestionType.Value + }).ToListAsync(); + + compareTaskList.ForEach(x => + { + x.TargetAssessmentIsIUorIC = answers.Any(x => questionType == QuestionType.TargetLesion && (x.Answer == TargetAssessment.iUPD.GetEnumInt() || x.Answer == TargetAssessment.iCPD.GetEnumInt())); + x.NewTargetLesionAssessmentIsIUorIC = answers.Any(x => questionType == QuestionType.NewTargetLesion && (x.Answer == NewTargetLesionAssessment.iUPD.GetEnumInt() || x.Answer == NewTargetLesionAssessment.iCPD.GetEnumInt())); + }); } + + + + + + Guid? compareTaskId = null; + if(compareTaskList.Count()==0) + { + return compareTaskId; + } + int index = 0; + switch (questionType) + { + case QuestionType.TargetLesion: + index = compareTaskList.FindLastIndex(x => x.TargetAssessmentIsIUorIC); + if (index == -1) + { + return compareTaskList[0].VisitTaskId; + } + else if (index > 0 && !compareTaskList[index-1].TargetAssessmentIsIUorIC) + { + return compareTaskList[index-1].VisitTaskId; + } + else + { + return compareTaskList[0].VisitTaskId; + } + case QuestionType.NewTargetLesion: + index = compareTaskList.FindLastIndex(x => x.NewTargetLesionAssessmentIsIUorIC); + if (index == -1) + { + return compareTaskList[0].VisitTaskId; + } + else if (index > 0 && !compareTaskList[index - 1].NewTargetLesionAssessmentIsIUorIC) + { + return compareTaskList[index - 1].VisitTaskId; + } + else + { + return compareTaskList[0].VisitTaskId; + } + } + + + return compareTaskId; } + #endregion #region 计算阅片问题 外层问题 @@ -1745,7 +1865,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() {