From 290493fa34b3416b3bcafc563f88c1f30a7762be Mon Sep 17 00:00:00 2001 From: duwenyuan <15600000461@163.com> Date: Mon, 22 Dec 2025 21:23:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/entity/GardsThresholdResultHis.java | 8 + .../org/jeecg/entity/NuclideActConcIntvl.java | 19 +- .../org/jeecg/entity/SampleLevelData.java | 26 ++- .../mapper/GardsSampleStatAnalysisMapper.java | 6 + .../xml/GardsSampleStatAnalysisMapper.xml | 197 +++++++++++------- .../impl/SampleStatAnalysisService.java | 136 ++++++++---- .../util/DistributionAnalysisToolkit.java | 14 +- 7 files changed, 288 insertions(+), 118 deletions(-) diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsThresholdResultHis.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsThresholdResultHis.java index 90210cd..bb77704 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsThresholdResultHis.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsThresholdResultHis.java @@ -1,6 +1,8 @@ package org.jeecg.entity; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -15,4 +17,10 @@ public class GardsThresholdResultHis { private double percentile75; private Date calculationTime; private Long idAnalysis; + /** 收集停止时间 + * + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date collectStop; } 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 b109792..3955d1a 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 @@ -2,6 +2,7 @@ package org.jeecg.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -12,62 +13,78 @@ public class NuclideActConcIntvl { /** 样品ID * */ + @JsonProperty("SAMPLEID") private Integer sampleId; /** * 级别 */ + @JsonProperty("CATEGORY") private Integer category; + /** + * 阈值 + */ + @JsonProperty("THRESHOLDVALUE") + private double thresholdValue; /**样品类型 * 系统类型(P : particulate; B :gas with 3-D β-γ coincidence detection; G :all other gas systems (high-resolution * γ-spectrometry or 2-D β-γ coincidence * detection)) */ + @JsonProperty("SAMPLE_TYPE") private String sampleType; /** 台站ID * */ + @JsonProperty("STATIONID") private Integer stationId; /** 台站编码 * */ + @JsonProperty("STATIONCODE") private String stationCode; /**数据源 * */ + @JsonProperty("DATASOURCE") private Integer dataSource; /** MDC * */ + @JsonProperty("MDC") private Double mdc; /** 活度浓度 * */ + @JsonProperty("CONC") private Double conc; /** 收集停止时间 * */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonProperty("COLLECTSTOP") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date collectStop; /** * 活度值不确定度 */ + @JsonProperty("CONCERR") private Double concErr; /** * 样品处理状态 */ - + @JsonProperty("STATUS") private String status; /** * 核素名称 */ + @JsonProperty("NUCLIDE_NAME") private String nuclideName; } diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java index 8de079b..fc71412 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java @@ -1,6 +1,8 @@ package org.jeecg.entity; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; @@ -11,14 +13,34 @@ public class SampleLevelData { * 样品ID */ private Integer sampleId; - /** - * 采集停止时间 + /** 收集停止时间 + * */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date collectStop; /** * 级别 */ private Integer category; + /** 活度浓度 + * + */ + private Double conc; + /** + * 活度值不确定度 + */ + private Double concErr; + + /** MDC + * + */ + private Double mdc; + + /** + * 阈值 + */ + private Double thresholdValue; } diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java index f5a6b53..3d619b4 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java @@ -44,6 +44,12 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper getRnManSampleLevel(String station, @Param("startTime") String startTime, @Param("endTime") String endTime); + + List getNuclideTimeSeriesAnalysis (@Param("schemaName") String schemaName ,@Param("station")String station,@Param("nuclideName")String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); + + + + //endregion //region RNAUTO 获取样品中元素的浓度活度、MDC信息 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 27da943..c65864f 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 @@ -41,8 +41,8 @@ ON t1.SAMPLE_ID = t2.SAMPLE_ID WHERE t1.STATION_ID = #{station} AND t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -56,8 +56,8 @@ ON t1.SAMPLE_ID = t2.SAMPLE_ID WHERE t1.STATION_ID = #{station} AND t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -73,8 +73,8 @@ RNAUTO.GARDS_ANALYSES b WHERE a.SAMPLE_ID = b.SAMPLE_ID AND a.STATION_ID = #{station} - AND a.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND a.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -112,8 +112,8 @@ WHERE a.SAMPLE_TYPE = #{sampleType} AND a.STATION_ID = #{station} AND b.NUCLIDENAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -134,8 +134,8 @@ WHERE a.SAMPLE_TYPE = '#{sampleType}' AND a.STATION_ID = #{station} AND b.NUCLIDENAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -158,8 +158,8 @@ WHERE a.SAMPLE_TYPE = '#{sampleType}' AND a.STATION_ID = #{station} AND b.NUCLIDENAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -180,8 +180,8 @@ WHERE a.SAMPLE_TYPE = '#{sampleType}' AND a.STATION_ID = #{station} AND b.NUCLIDENAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') @@ -190,41 +190,54 @@ @@ -238,8 +251,50 @@ RNAUTO.GARDS_ANALYSES B ON A.SAMPLE_ID = B.SAMPLE_ID WHERE A.STATION_ID = #{station} - AND A.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND A.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + + + @@ -271,9 +326,9 @@ WHERE t1.STATION_ID = #{station} AND t1.STATUS != 'F' AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime} - , 'YYYY-MM-DD hh24:mi:ss') + , 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE(#{endTime} - , 'YYYY-MM-DD hh24:mi:ss') + , 'YYYY-MM-DD HH24:MI:SS') @@ -539,22 +594,22 @@ LEFT JOIN CONFIGURATION.GARDS_STATIONS c1 ON t1.STATION_ID = c1.STATION_ID WHERE t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD hh24:mi:ss') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD hh24:mi:ss') + AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') + AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') ORDER BY t1.COLLECT_STOP ASC - + SELECT * FROM CONFIGURATION.GARDS_STATIONS + + TYPE IN + + ('Manual', 'CINDER', 'RASA', 'LAB') + + + ('SAUNA', 'ARIX-4', 'ARIX-2', 'SPALAX') + + - + \ No newline at end of file diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java index 32fc7e1..5a6f3b1 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java @@ -1,9 +1,13 @@ package org.jeecg.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; +import com.fasterxml.jackson.core.type.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.jeecg.common.api.vo.Result; @@ -21,6 +25,7 @@ import org.jeecg.vo.StationInfoVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.File; import java.text.SimpleDateFormat; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -221,6 +226,43 @@ public class SampleStatAnalysisService extends ServiceImpl p.getNuclideName() != null) .collect(Collectors.groupingBy(NuclideActConcIntvl::getNuclideName)); + //查询级别 getSample + List nuclideNames = new ArrayList<>(groupedByNuclideName.keySet()); + if (CollectionUtils.isNotEmpty(nuclideNames)) { + //通过台站ID、核素名称查找阈值 + thresholdResultHisDataList = this.baseMapper.selectByStationAndNuclides(schemaName, Integer.valueOf(stationCode), nuclideNames, startTime, endTime); + + if (CollectionUtils.isNotEmpty(thresholdResultHisDataList)) { + // 构建Map: 复合键 -> 阈值 + Map thresholdMap = new HashMap<>(); + + for (GardsThresholdResultHis threshold : thresholdResultHisDataList) { + // 创建复合键: nuclideName|stationId|collectStop + String key = threshold.getNuclideName() + "|" + + (threshold.getStationId() != null ? Integer.valueOf(threshold.getStationId()) : stationCode) + "|" + + safeGetTime(threshold.getCollectStop()); + thresholdMap.put(key, threshold); + } + + // 设置阈值 + for (NuclideActConcIntvl data : nuclideActConcIntvlList) { + if (data.getNuclideName() == null || data.getCollectStop() == null) { + continue; + } + // 创建相同的复合键 + String dataKey = data.getNuclideName() + "|" + + (data.getStationCode() != null ? Integer.valueOf(data.getStationCode()) : stationCode) + "|" + + data.getCollectStop().getTime(); + + GardsThresholdResultHis threshold = thresholdMap.get(dataKey); + if (threshold != null) { + data.setThresholdValue(threshold.getThresholdValue()); + } + } + } + } + + Map> sortedByCount = groupedByNuclideName.entrySet().stream() .sorted(Map.Entry.>comparingByValue( Comparator.comparingInt(List::size) @@ -233,17 +275,10 @@ public class SampleStatAnalysisService extends ServiceImpl nuclideNames = new ArrayList<>(groupedByNuclideName.keySet()); - if (CollectionUtils.isNotEmpty(nuclideNames)) { - //通过台站ID、核素名称查找阈值 - thresholdResultHisDataList = this.baseMapper.selectByStationAndNuclides(schemaName, Integer.valueOf(stationCode), nuclideNames, startTime, endTime); - } - // resultMap.put("nuclideActConcIntvlList", groupedByNuclideName); + // resultMap.put("nuclideActConcIntvlList", groupedByNuclideName); resultMap.put("nuclideActConcIntvlList", sortedByCount); - resultMap.put("sampleLevelDataList", sampleLevelDataList); - resultMap.put("thresholdResultHisDataList", thresholdResultHisDataList); + //resultMap.put("sampleLevelDataList", sampleLevelDataList); + //resultMap.put("thresholdResultHisDataList", thresholdResultHisDataList); result.setSuccess(true); result.setResult(resultMap); return result; @@ -253,7 +288,10 @@ public class SampleStatAnalysisService extends ServiceImpl>() {}); + //获取浓度出现的次数 //获取浓度值集合 List data = DistributionAnalysisToolkit.convertConcToDoubleList(nuclideActConcIntvls); @@ -465,44 +510,53 @@ public class SampleStatAnalysisService extends ServiceImpl thresholdResultHisList = new ArrayList<>(); List nuclideActConcIntvls = new ArrayList<>(); - nuclideActConcIntvls = switch (sampleType) { - case "P" -> { - sampleDatas = this.baseMapper.getRnAutoSampleLevel(station, startTime, endTime); - yield switch (dataSource) { - //RNAUTO - case 1 -> - this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - //RNMAN - case 2 -> - this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - default -> nuclideActConcIntvls; - }; - } - case "B" -> { - sampleDatas = this.baseMapper.getRnManSampleLevel(station, startTime, endTime); - yield switch (dataSource) { - case 1 -> - this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - case 2 -> - this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - default -> nuclideActConcIntvls; - }; - } - default -> nuclideActConcIntvls; - }; + //region +// nuclideActConcIntvls = switch (sampleType) { +// case "P" -> { +// sampleDatas = this.baseMapper.getRnAutoSampleLevel(station, startTime, endTime); +// yield switch (dataSource) { +// //RNAUTO +// case 1 -> +// this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); +// //RNMAN +// case 2 -> +// this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); +// default -> nuclideActConcIntvls; +// }; +// } +// case "B" -> { +// sampleDatas = this.baseMapper.getRnManSampleLevel(station, startTime, endTime); +// yield switch (dataSource) { +// case 1 -> +// this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); +// case 2 -> +// this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); +// default -> nuclideActConcIntvls; +// }; +// } +// default -> nuclideActConcIntvls; +// }; + //endregion String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; - thresholdResultHisList = this.baseMapper.selectByCondition(schemaName, Arrays.asList(Integer.valueOf(station)) - , Arrays.asList(nuclideName), startTime, endTime); + + List sampleDatass = this.baseMapper.getNuclideTimeSeriesAnalysis(schemaName,station,nuclideName, startTime, endTime); + + + + +// thresholdResultHisList = this.baseMapper.selectByCondition(schemaName, Arrays.asList(Integer.valueOf(station)) +// , Arrays.asList(nuclideName), startTime, endTime); resultMap.put("sampleDataList", sampleDatas); - resultMap.put("nuclideInfoList", nuclideActConcIntvls); - resultMap.put("thresholdResultHisList", thresholdResultHisList); +// resultMap.put("nuclideInfoList", nuclideActConcIntvls); +// resultMap.put("thresholdResultHisList", thresholdResultHisList); result.setSuccess(true); result.setResult(resultMap); return result; } catch (Exception e) { - result.error500("核素活度浓度时序分析错误:" + e.getMessage()); + log.error("核素活度浓度时序分析错误:" + e.getMessage(), e); + result.error500("核素活度浓度时序分析错误" ); return result; } 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 aa20e4c..fc599ca 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 @@ -23,9 +23,17 @@ public class DistributionAnalysisToolkit { this.count = nuclideData.size(); for (NuclideActConcIntvl nuclide : nuclideData) { //获取浓度值 - values.add(nuclide.getConc()); - //计算获取级别 - levelDistribution.merge(nuclide.getCategory(),1,Integer::sum); + Double conc = nuclide.getConc(); + if (conc != null) { // 过滤 conc null + values.add(conc); + } + Integer category = nuclide.getCategory(); + if (category != null) { // 跳过 null + levelDistribution.merge(category, 1, Integer::sum); + } else { + // 数据库中存在记录 null 级别,用特殊 key 如 -1 + // levelDistribution.merge(-1, 1, Integer::sum); + } } } }