diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 52674a116..a12d28ada 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -131,7 +131,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsConvertedTask { get; set; } - public bool IsAnalysisCreate { get; set; } + public Guid? BeforeConvertedTaskId { get; set; } + + public bool IsAnalysisCreate { get; set; } public bool? IsSelfAnalysis { get; set; } @@ -295,7 +297,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Func ChangeAllTaskFun { get; set; } public bool? IsConvertedTask { get; set; } - } + + /// + /// 是否是正在转化 + /// + public bool IsBeTransforming { get; set; } = false; + + } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs index d9407fc06..6fffbc2b4 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs @@ -117,19 +117,20 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate } - ReadingCalculateDto readingData = new ReadingCalculateDto() - { - SubjectId = visitTask.SubjectId, - TaskBlindName = visitTask.TaskBlindName, - IsConvertedTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x => x.IsConvertedTask).FirstOrDefaultAsync(), - VisitTaskId = visitTaskId, - SubjectVisitId = visitTask.SourceSubjectVisitId!.Value, - QuestionInfo = questionInfos, - CriterionId = visitTask.TrialReadingCriterionId, - TrialId = visitTask.TrialId, - IsAnalysisCreate = visitTask.IsAnalysisCreate, - IsSelfAnalysis = visitTask.IsSelfAnalysis, - IsBaseLine = subjectVisit!.IsBaseLine, + ReadingCalculateDto readingData = new ReadingCalculateDto() + { + SubjectId = visitTask.SubjectId, + TaskBlindName = visitTask.TaskBlindName, + IsConvertedTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x => x.IsConvertedTask).FirstOrDefaultAsync(), + BeforeConvertedTaskId = visitTask.BeforeConvertedTaskId, + VisitTaskId = visitTaskId, + SubjectVisitId = visitTask.SourceSubjectVisitId!.Value, + QuestionInfo = questionInfos, + CriterionId = visitTask.TrialReadingCriterionId, + TrialId = visitTask.TrialId, + IsAnalysisCreate = visitTask.IsAnalysisCreate, + IsSelfAnalysis = visitTask.IsSelfAnalysis, + IsBaseLine = subjectVisit!.IsBaseLine, DoctorUserId = visitTask.DoctorUserId, TrialReadingCriterionId = visitTask.TrialReadingCriterionId, BaseLineTaskId = baseLinetaskId, diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index e6b3855c5..40c440e50 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -470,12 +470,18 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // IRECIST靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetIRECISTTargetLesionEvaluate,IsConvertedTask=true}, + // 转化时靶病灶评估 + new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetConvertingTargetLesionEvaluate,IsConvertedTask=true,IsBeTransforming=true}, + //非靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate,IsConvertedTask=false}, //IRECIST非靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetIRECISTNoTargetLesionEvaluate,IsConvertedTask=true}, + // 转化时非靶病灶评估 + new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetConvertingNoTargetLesionEvaluate,IsConvertedTask=true ,IsBeTransforming=true}, + // IRECIST新靶病灶评估 new ReadingCalculateData (){QuestionType=QuestionType.NewTargetLesion,GetStringFun=GetNewTargetLesionEvaluate,IsConvertedTask=true}, @@ -506,6 +512,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate //IRECIST整体肿瘤评估 new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetIRECSITTargetLesionEvaluate,IsConvertedTask=true}, + // 转化时整体肿瘤评估 + new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetConvertingTumor,IsConvertedTask=true,IsBeTransforming=true}, + //IRECIST整体肿瘤评估 new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetIRECSITTargetLesionEvaluate,IsConvertedTask=true}, @@ -517,6 +526,25 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate // 过滤转化的 calculateList = calculateList.Where(x => x.IsConvertedTask == inDto.IsConvertedTask||x.IsConvertedTask==null).ToList(); + if (inDto.IsConvertedTask) + { + + + if (inDto.BeforeConvertedTaskId != null) + { + List questionTypes = calculateList.Where(x => x.IsBeTransforming).Select(x => x.QuestionType).ToList(); + + // 排除这几个 且不为正在转化的 + calculateList = calculateList.Where(x => !(questionTypes.Contains(x.QuestionType)&& x.IsBeTransforming == false)).ToList(); + + } + else + { + calculateList = calculateList.Where(x => x.IsBeTransforming == false).ToList(); + + } + + } // 没有靶病灶只计算最后几个 if (inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).Sum(x => x.TableRowInfoList.Count()) == 0) @@ -2391,6 +2419,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate public async Task GetNewLesionIRECSITEvaluate(ReadingCalculateDto inDto) { + // 逻辑改了 现在转变后全部都是NA; + return NewLesionAssessment.NA.GetEnumInt(); + NewLesionAssessment result = NewLesionAssessment.No; if (inDto.IsBaseLine) { @@ -2682,78 +2713,182 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate return result == null ? string.Empty : ((OverallAssessment)result).GetEnumInt(); } - #endregion - #endregion + #endregion + #endregion + + #region 转化时计算 + + #region 获取转化的靶病灶评估 + /// + /// 获取转化的靶病灶评估 + /// + /// + /// + public async Task GetConvertingTargetLesionEvaluate(ReadingCalculateDto inDto) + { + var beforeConvertedAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.BeforeConvertedTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefaultAsync(); + + Dictionary answerConverDic = new Dictionary() + { + {TargetAssessment.SD.GetEnumInt(),TargetAssessment.iSD.GetEnumInt() }, + {TargetAssessment.PR.GetEnumInt(),TargetAssessment.iPR.GetEnumInt() }, + {TargetAssessment.PD.GetEnumInt(),TargetAssessment.iUPD.GetEnumInt() }, + {TargetAssessment.CR.GetEnumInt(), TargetAssessment.iCR.GetEnumInt() }, + }; + + try + { + return answerConverDic[beforeConvertedAnswer]; + + } + catch (Exception) + { + + return beforeConvertedAnswer; + + } + + } + #endregion - #region 获取靶病灶评估 - /// - /// 获取靶病灶评估 - /// - /// - /// - /// 靶病灶疗效评估算法-20230306确认版本: - ///if(基线没有靶病灶) - ///{ - /// 靶病灶疗效为 ND - ///}else - ///{ - /// 初始化靶病灶疗效为 SD - /// - /// if (与基线期SOD相比减小≥30 %) - /// { - /// 靶病灶疗效为 PR - /// - /// } - /// - ///if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10且淋巴结非靶病灶全部消失) - /// { - /// 靶病灶疗效为 CR - /// - /// } - /// - ///if (有被评估为NE的单个靶病灶) - /// { - /// 靶病灶疗效为 NE - /// - /// } - /// - ///if (最低点SOD > 0) - ///{ - /// if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) - /// { - /// 靶病灶疗效为 PD - /// - /// } - ///} - ///else - ///{ - /// //进入该分支最低点SOD=0 - /// if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) - /// { - /// 靶病灶疗效为PD - /// - /// } - ///} - /// - ///if(上次访视点评估是CR) - /// { - /// if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) - /// { - /// 靶病灶疗效为 PD - /// - /// } - /// if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) - /// { - /// 靶病灶疗效为 PD - /// - /// } - ///} - ///} - /// - /// - public async Task GetTargetLesionEvaluate(ReadingCalculateDto inDto) + #region 获取转化的非靶病灶评估 + + /// + /// 获取转化的非靶病灶评估 + /// + /// + /// + public async Task GetConvertingNoTargetLesionEvaluate(ReadingCalculateDto inDto) + { + var beforeConvertedAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.BeforeConvertedTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefaultAsync(); + + Dictionary answerConverDic = new Dictionary() + { + {NoTargetAssessment.NN.GetEnumInt(),NoTargetAssessment.iNN.GetEnumInt() }, + {NoTargetAssessment.PD.GetEnumInt(),NoTargetAssessment.iUPD.GetEnumInt() }, + {NoTargetAssessment.CR.GetEnumInt(), NoTargetAssessment.iCR.GetEnumInt() }, + }; + + try + { + return answerConverDic[beforeConvertedAnswer]; + + } + catch (Exception) + { + + return beforeConvertedAnswer; + + } + } + #endregion + + #region 获取转化的整体肿瘤评估 + + /// + /// 获取转化的整体肿瘤评估 + /// + /// + /// + public async Task GetConvertingTumor(ReadingCalculateDto inDto) + { + var beforeConvertedAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.BeforeConvertedTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(x => x.Answer).FirstOrDefaultAsync(); + + Dictionary answerConverDic = new Dictionary() + { + {OverallAssessment.NN.GetEnumInt(),OverallAssessment.iNN.GetEnumInt() }, + {OverallAssessment.PD.GetEnumInt(),OverallAssessment.iUPD.GetEnumInt() }, + {OverallAssessment.CR.GetEnumInt(), OverallAssessment.iCR.GetEnumInt() }, + {OverallAssessment.SD.GetEnumInt(), OverallAssessment.iSD.GetEnumInt() }, + {OverallAssessment.PR.GetEnumInt(), OverallAssessment.iPR.GetEnumInt() }, + }; + + try + { + return answerConverDic[beforeConvertedAnswer]; + + } + catch (Exception) + { + + return beforeConvertedAnswer; + + } + } + #endregion + #endregion + + + + #region 获取靶病灶评估 + /// + /// 获取靶病灶评估 + /// + /// + /// + /// 靶病灶疗效评估算法-20230306确认版本: + ///if(基线没有靶病灶) + ///{ + /// 靶病灶疗效为 ND + ///}else + ///{ + /// 初始化靶病灶疗效为 SD + /// + /// if (与基线期SOD相比减小≥30 %) + /// { + /// 靶病灶疗效为 PR + /// + /// } + /// + ///if (非淋巴结靶病灶长径之和 == 0 并且所有淋巴结靶病灶的短径 < 10且淋巴结非靶病灶全部消失) + /// { + /// 靶病灶疗效为 CR + /// + /// } + /// + ///if (有被评估为NE的单个靶病灶) + /// { + /// 靶病灶疗效为 NE + /// + /// } + /// + ///if (最低点SOD > 0) + ///{ + /// if(比整体访视期间最低点SOD增加≥20 % 且与整个访视期间最低点相比增加的值≥5 mm) + /// { + /// 靶病灶疗效为 PD + /// + /// } + ///} + ///else + ///{ + /// //进入该分支最低点SOD=0 + /// if (当前访视SOD > 0 且与整个访视期间最低点相比增加的值≥5 mm) + /// { + /// 靶病灶疗效为PD + /// + /// } + ///} + /// + ///if(上次访视点评估是CR) + /// { + /// if (当前访视点淋巴结病灶,至少一个淋巴结靶病灶短径≥10 mm 并且该淋巴结靶病灶短径绝对增加值≥5 mm) + /// { + /// 靶病灶疗效为 PD + /// + /// } + /// if (当前访视点非淋巴结病灶至少一个非淋巴结靶病灶的长径>0 mm。) + /// { + /// 靶病灶疗效为 PD + /// + /// } + ///} + ///} + /// + /// + public async Task GetTargetLesionEvaluate(ReadingCalculateDto inDto) { var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList(); if (inDto.IsBaseLine)