From 12ae5b0e99914d1fc3ca041a73e0310b580c3523 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 09:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B7=E5=93=81=E6=B4=BB=E5=BA=A6=E6=B5=93?= =?UTF-8?q?=E5=BA=A6=E5=8C=BA=E9=97=B4=E9=A2=91=E7=8E=87=E5=88=86=E6=9E=90?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E6=B7=BB=E5=8A=A0=E7=BA=A7?= =?UTF-8?q?=E5=88=AB=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/entity/NuclideActConcIntvl.java | 4 + .../xml/GardsSampleStatAnalysisMapper.xml | 6 +- .../util/DistributionAnalysisToolkit.java | 85 +++++++++++++++---- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/NuclideActConcIntvl.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/NuclideActConcIntvl.java index c8d1e3d..86e89dc 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/NuclideActConcIntvl.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/NuclideActConcIntvl.java @@ -13,6 +13,10 @@ public class NuclideActConcIntvl { * */ private Integer sampleId; + /** + * 级别 + */ + private Integer category; /**样品类型 * 系统类型(P : particulate; B :gas with 3-D β-γ coincidence detection; G :all other gas systems (high-resolution diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml index 948020f..c4830e9 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml @@ -110,6 +110,7 @@ a.SAMPLE_TYPE, a.STATION_ID, a.STATUS, + c.CATEGORY, b.NUCLIDENAME NUCLIDE_NAME, b.CONCENTRATION AS conc, b.MDC, @@ -117,6 +118,9 @@ FROM ORIGINAL.GARDS_SAMPLE_DATA a INNER JOIN + RNAUTO.GARDS_ANALYSES c + ON a.SAMPLE_ID=c.SAMPLE_ID + INNER JOIN RNAUTO.GARDS_NUCL_IDED b ON a.SAMPLE_ID = b.SAMPLE_ID WHERE @@ -366,7 +370,7 @@ SELECT * FROM ${schemaName}.GARDS_THRESHOLD_RESULT_HIS - AND STATION_ID IN + AND STATION_ID IN #{stationId} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/util/DistributionAnalysisToolkit.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/util/DistributionAnalysisToolkit.java index 28a3954..aa20e4c 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/util/DistributionAnalysisToolkit.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/util/DistributionAnalysisToolkit.java @@ -1,5 +1,6 @@ package org.jeecg.util; +import lombok.Data; import org.jeecg.entity.NuclideActConcIntvl; import java.util.*; @@ -9,20 +10,24 @@ public class DistributionAnalysisToolkit { /** * 区间统计结果 */ + @Data public static class IntervalStat { private final String interval; private final int count; private final List values; - - public IntervalStat(String interval, int count, List values) { + private final Map levelDistribution; + public IntervalStat(String interval, List nuclideData) { + values=new ArrayList<>(); + levelDistribution=new TreeMap<>(); this.interval = interval; - this.count = count; - this.values = values; + this.count = nuclideData.size(); + for (NuclideActConcIntvl nuclide : nuclideData) { + //获取浓度值 + values.add(nuclide.getConc()); + //计算获取级别 + levelDistribution.merge(nuclide.getCategory(),1,Integer::sum); + } } - - public String getInterval() { return interval; } - public int getCount() { return count; } - public List getValues() { return values; } } /** @@ -59,22 +64,61 @@ public class DistributionAnalysisToolkit { /** * 数据区间统计 * - * @param data 原始数据 + * @param nuclideData 原始数据 * @param start 起始值 * @param step 区间宽度 * @return 区间统计结果列表 */ - public static List calculateIntervalStats(List data, double start, double step) { - if (data == null || data.isEmpty()) { + //region +// public static List calculateIntervalStats(List data, double start, double step) { +// if (data == null || data.isEmpty()) { +// throw new IllegalArgumentException("数据不能为空"); +// } +// +// // 计算结束边界 +// double max = Collections.max(data); +// double end = Math.ceil(max / step) * step + step; +// +// // 初始化区间映射 +// Map> intervalMap = new TreeMap<>(); +// for (double lower = start; lower < end; lower += step) { +// double upper = lower + step; +// String key = String.format("[%.1f, %.1f)", lower, upper); +// intervalMap.put(key, new ArrayList<>()); +// } +// +// // 分配数据到区间 +// for (double value : data) { +// double lower = Math.floor(value / step) * step; +// String key = String.format("[%.1f, %.1f)", lower, lower + step); +// intervalMap.get(key).add(value); +// } +// +// // 转换为统计结果对象 +// List stats = new ArrayList<>(); +// for (Map.Entry> entry : intervalMap.entrySet()) { +// stats.add(new IntervalStat(entry.getKey(), entry.getValue().size(), entry.getValue())); +// } +// +// return stats; +// } +// + //endregion + + public static List calculateIntervalStats(List nuclideData, double start, double step) { + if (nuclideData == null || nuclideData.isEmpty()) { throw new IllegalArgumentException("数据不能为空"); } // 计算结束边界 - double max = Collections.max(data); - double end = Math.ceil(max / step) * step + step; + double maxConc = nuclideData.stream() + .mapToDouble(NuclideActConcIntvl::getConc) + .max() + .orElse(0.0); + double end = Math.ceil(maxConc / step) * step + step; // 初始化区间映射 - Map> intervalMap = new TreeMap<>(); + Map> intervalMap = new TreeMap<>(); for (double lower = start; lower < end; lower += step) { double upper = lower + step; String key = String.format("[%.1f, %.1f)", lower, upper); @@ -82,22 +126,27 @@ public class DistributionAnalysisToolkit { } // 分配数据到区间 - for (double value : data) { + for (NuclideActConcIntvl nuclide : nuclideData) { + double value=nuclide.getConc(); double lower = Math.floor(value / step) * step; String key = String.format("[%.1f, %.1f)", lower, lower + step); - intervalMap.get(key).add(value); + + intervalMap.get(key).add(nuclide); } // 转换为统计结果对象 List stats = new ArrayList<>(); - for (Map.Entry> entry : intervalMap.entrySet()) { - stats.add(new IntervalStat(entry.getKey(), entry.getValue().size(), entry.getValue())); + for (Map.Entry> entry : intervalMap.entrySet()) { + stats.add(new IntervalStat(entry.getKey(), entry.getValue())); } return stats; } + + + /** * 计算95%累积线 *