From 834f6be5481080be2af0f1776a88ad1d3e1d0379 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 5 Jan 2026 14:02:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=AD=E5=BF=83ORR?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrialSiteUser/DTO/TrialStatViewModel.cs | 20 ++++++- .../Service/TrialSiteUser/TrialStatService.cs | 55 +++++++++++++++---- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs index b38ff1f96..974fe06ce 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialStatViewModel.cs @@ -137,7 +137,23 @@ namespace IRaCIS.Core.Application.ViewModel public int SubjectCount => SubjectCodeList.Count(); - public List SubjectCodeList { get; set; } + public List SubjectCodeList { get; set; } + } + + + public class EfficacyEvaluationSubjectInfo + { + public string TrialSiteCode { get; set; } + + public string SubjectCode { get; set; } + } + + public class TrialSiteOrrStat + { + public string TrialSiteCode { get; set; } + public int SiteSubjectCount { get; set; } + public int SiteCrPrSubjectCount { get; set; } + public string OrrPercent { get; set; } } public class EfficacyEvaluationExport @@ -152,6 +168,8 @@ namespace IRaCIS.Core.Application.ViewModel public Guid SubjectId { get; set; } + public string TrialSiteCode { get; set; } + public string SubjectCode { get; set; } = String.Empty; public decimal VisitTaskNum { get; set; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs index 63d14b0cf..4e1b7cc55 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialStatService.cs @@ -162,6 +162,7 @@ public class TrialStatService( { Id = t.Id, SubjectId = t.SubjectId, + TrialSiteCode=t.Subject.TrialSite.TrialSiteCode, SubjectCode = t.Subject.Code, VisitTaskNum = t.VisitTaskNum, TaskName = t.TaskName, @@ -236,7 +237,7 @@ public class TrialStatService( DictionaryCode = g.FirstOrDefault()?.DictionaryCode, OverallTumorEvaluation = g.Key, Code = g.Key, - SubjectCodeList = g.Select(t => t.SubjectCode).Distinct().ToList() + SubjectCodeList = g.Select(t => new EfficacyEvaluationSubjectInfo { SubjectCode= t.SubjectCode, TrialSiteCode=t.TrialSiteCode }).Distinct().ToList() }).ToList(); @@ -260,22 +261,15 @@ public class TrialStatService( DictionaryCode = dicName, Code = t.Code, //方便找到首次PD的日期 OverallTumorEvaluation = t.Value,//翻译后的值 - SubjectCodeList = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : new List() + SubjectCodeList = resultDict.ContainsKey(t.Code) ? resultDict[t.Code] : new List() }) .ToList(); - // (cr +pr) /总人数 - - var crAddPr = translateList.Where(t => t.OverallTumorEvaluation == "PR" || t.OverallTumorEvaluation == "CR").Sum(t => t.SubjectCount); - - var orrPercent = totalSubjectCount > 0 - ? ((decimal)crAddPr / totalSubjectCount * 100).ToString("0.00") + "%" - : "0.00%"; var pdInfo = translateList .WhereIf(criterion.CriterionType == CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "iCPD") .WhereIf(criterion.CriterionType == CriterionType.Lugano2014, t => t.OverallTumorEvaluation == "PMD/PD") - .WhereIf(criterion.CriterionType != CriterionType.IRECIST1Point1 && criterion.CriterionType != CriterionType.IRECIST1Point1, t => t.OverallTumorEvaluation == "PD") + .WhereIf(criterion.CriterionType != CriterionType.IRECIST1Point1 && criterion.CriterionType != CriterionType.Lugano2014, t => t.OverallTumorEvaluation == "PD") .FirstOrDefault(); var firstPdList = new List(); @@ -300,8 +294,47 @@ public class TrialStatService( } + // (cr +pr) /总人数 - return ResponseOutput.Ok(translateList, new { PDList = firstPdList, ORR = orrPercent }); + var crAddPr = translateList.Where(t => t.OverallTumorEvaluation == "PR" || t.OverallTumorEvaluation == "CR").Sum(t => t.SubjectCount); + + var orrPercent = totalSubjectCount > 0 + ? ((decimal)crAddPr / totalSubjectCount * 100).ToString("0.00") + "%" + : "0.00%"; + + + var centerOrrList = translateList + // 先把 Subject 拆平 + .SelectMany(t => t.SubjectCodeList.Select(s => new + { + s.TrialSiteCode, + s.SubjectCode, + t.OverallTumorEvaluation + })) + // 按中心分组 + .GroupBy(x => x.TrialSiteCode) + .Select(g => + { + var total = g.Count(); + + var crPr = g.Count(x => + x.OverallTumorEvaluation == "CR" || + x.OverallTumorEvaluation == "PR"); + + return new TrialSiteOrrStat + { + TrialSiteCode = g.Key, + SiteSubjectCount = total, + SiteCrPrSubjectCount = crPr, + OrrPercent = total > 0 + ? ((decimal)crPr / total * 100).ToString("0.00") + "%" + : "0.00%" + }; + }) + .ToList(); + + + return ResponseOutput.Ok(translateList, new { PDList = firstPdList, ORR = orrPercent,SiteORRList= centerOrrList }); }