From b46a773d53b7623bc51d110ca4744552890c6369 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 09:34:44 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=9CCode=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/service/impl/SampleStatAnalysisService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 fd781a8..c7355d9 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 @@ -4,6 +4,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; import org.jeecg.entity.GardsThresholdResultHis; import org.jeecg.modules.base.entity.original.GardsSampleData; @@ -28,6 +29,7 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); List StationInfoDataList = new ArrayList<>(); @@ -73,7 +75,6 @@ public class SampleStatAnalysisService extends ServiceImpl sampleDataList = new ArrayList<>(); //region 局部变量 Result result = new Result(); + result.setCode(CommonConstant.SC_OK_200); if (StringUtils.isBlank(sampleType)) { result.error500("SampleType Code cannot be null"); return result; @@ -215,6 +218,7 @@ public class SampleStatAnalysisService extends ServiceImpl nuclideActConcIntvls = new ArrayList<>(); //region 局部变量 Result result = new Result(); + result.setCode(CommonConstant.SC_OK_200); if (StringUtils.isBlank(sampleType)) { result.error500("SampleType Code cannot be null"); return result; @@ -276,7 +280,7 @@ public class SampleStatAnalysisService extends ServiceImpl stats = DistributionAnalysisToolkit.calculateIntervalStats(data, start, step); + List stats = DistributionAnalysisToolkit.calculateIntervalStats(nuclideActConcIntvls, start, step); // 3. 累积分布函数 List cdfPoints = DistributionAnalysisToolkit.calculateCDF(data); // 4. 核密度估计 @@ -309,6 +313,7 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); //region 局部变量 @@ -392,6 +397,7 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); List nuclideActConcIntvls = new ArrayList<>(); //region 局部变量 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 2/9] =?UTF-8?q?=E6=A0=B7=E5=93=81=E6=B4=BB=E5=BA=A6?= =?UTF-8?q?=E6=B5=93=E5=BA=A6=E5=8C=BA=E9=97=B4=E9=A2=91=E7=8E=87=E5=88=86?= =?UTF-8?q?=E6=9E=90=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BA=A7=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%累积线 * From dd7f721dc0168e336584129f3dc5eb2da0bfa74d Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 17:07:51 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=B8=E7=B4=A0?= =?UTF-8?q?=E6=B4=BB=E5=BA=A6=E6=B5=93=E5=BA=A6=E5=AF=B9=E6=AF=94=E5=88=86?= =?UTF-8?q?=E6=9E=90SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/GardsSampleStatAnalysisMapper.java | 48 +++-- .../xml/GardsSampleStatAnalysisMapper.xml | 170 +++++++++++------- 2 files changed, 124 insertions(+), 94 deletions(-) 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 438c9de..c2c267b 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 @@ -55,7 +55,7 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper */ - List getRnautoPNuclideActConcIntvl(String sampleType,String station,String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnautoPNuclideActConcIntvl(String sampleType, String station, String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); /*** 获取样品中元素的浓度活度、MDC信息 * 查询RNAUTO.GARDS_XE_RESULTS中的活度浓度、MDC信息 @@ -64,7 +64,7 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper getRnautoNuclideActConcIntvl(String sampleType,String station,String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnautoNuclideActConcIntvl(String sampleType, String station, String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); //endregion @@ -78,7 +78,7 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper */ - List getRnmanPNuclideActConcIntvl(String sampleType,String station,String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnmanPNuclideActConcIntvl(String sampleType, String station, String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); /*** 获取样品中元素的浓度活度、MDC信息 * 查询RNAUTO.GARDS_XE_RESULTS中的活度浓度、MDC信息 @@ -87,7 +87,7 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper getRnmanNuclideActConcIntvl(String sampleType,String station,String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnmanNuclideActConcIntvl(String sampleType, String station, String nuclideName, @Param("startTime") String startTime, @Param("endTime") String endTime); //endregion @@ -119,10 +119,10 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper getRnManNuclideTimeSeriesAnalysis(String station, @Param("startTime") String startTime, @Param("endTime") String endTime); - /** * 精确查询(单个站点 + 单个核素) - * @param stationId 站点ID (必填) + * + * @param stationId 站点ID (必填) * @param nuclideName 核素名称 (必填) * @return 匹配的记录列表 */ @@ -136,7 +136,8 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper selectByCondition( @@ -194,32 +198,24 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper getRnAutoAnalyzeNuclideActivityConc(String sampleType, String nuclideName, @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnAutoAnalyzeNuclideActivityConc(@Param("sampleType")String sampleType, @Param("nuclideName")String nuclideName, @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, @Param("endTime") String endTime); - List getRnManAnalyzeNuclideActivityConc(String sampleType, String nuclideName, @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnManAnalyzeNuclideActivityConc(@Param("sampleType")String sampleType, @Param("nuclideName")String nuclideName, @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, @Param("endTime") String endTime); //endregion //region 样品监测结果 - List getRnAutoSampleResult(String sampleType, @Param("startTime") String startTime, @Param("endTime") String endTime); + List getRnAutoSampleResult( String sampleType, @Param("startTime") String startTime, @Param("endTime") String endTime); List getRnManSampleResult(String sampleType, @Param("startTime") String startTime, @Param("endTime") String endTime); - + //endregion + //region 查询台站信息 + List findStationListByMenuName(); //endregion - } 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 c4830e9..490d44c 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 @@ -398,78 +398,114 @@ @@ -533,6 +569,4 @@ - - \ No newline at end of file From 913490643ebea5f014b3281a7792bcc2926f1ca5 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 17:12:19 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=B0=E7=AB=99?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/entity/GardsStations.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsStations.java diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsStations.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsStations.java new file mode 100644 index 0000000..b5053b4 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/GardsStations.java @@ -0,0 +1,103 @@ +package org.jeecg.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName(value = "CONFIGURATION.GARDS_STATIONS") +public class GardsStations implements Serializable { + + /** + * 台站id + */ + @TableId(type = IdType.INPUT) + private Integer stationId; + + /** + * 台站编码 + */ + @TableField(value = "STATION_CODE") + private String stationCode; + + /** + * 城市编码 + */ + @TableField(value = "COUNTRY_CODE") + private String countryCode; + + /** + * 台站类型 + */ + @TableField(value = "TYPE") + private String type; + + /** + * 经度 + */ + @TableField(value = "LON") + private Double lon; + + /** + * 纬度 + */ + @TableField(value = "LAT") + private Double lat; + + /** + * 海拔 + */ + @TableField(value = "ELEVATION") + private Double elevation; + + /** + * 描述 + */ + @TableField(value = "DESCRIPTION") + private String description; + + /** + * 开始运行日期 + */ + @TableField(value = "DATE_BEGIN") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date dateBegin; + + /** + * 运行终止日期 + */ + @TableField(value = "DATE_END") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date dateEnd; + + /** + * 运行状态 + */ + @TableField(value = "STATUS") + private String status; + + /** + * 操作时间 + */ + @TableField(value = "MODDATE") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date moddate; + + @TableField(value = "CATEGORY") + private Integer category; + /** + * 有效率计算类型 + */ + @TableField(value = "EFFIC_CALCUL_TYPE") + private String efficCalculType; +} From 98a5d1d78d2fc0838f55a976140ef8e54320c0c1 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 18:55:24 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=8F=B0=E7=AB=99=E4=BF=A1=E6=81=AF=E5=92=8C=E6=A0=B8=E7=B4=A0?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DataAnalysisController.java | 33 ++ .../org/jeecg/entity/SysDefaultNuclide.java | 61 +++ .../jeecg/mapper/SysDefaultNuclideMapper.java | 9 + .../xml/GardsSampleStatAnalysisMapper.xml | 484 ++++++++---------- .../service/ISampleStatAnalysisService.java | 6 + .../impl/SampleStatAnalysisService.java | 29 +- 6 files changed, 355 insertions(+), 267 deletions(-) create mode 100644 jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SysDefaultNuclide.java create mode 100644 jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/SysDefaultNuclideMapper.java diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java index cb8e3d2..02c10ee 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java @@ -5,6 +5,8 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jeecg.common.api.vo.Result; import org.jeecg.common.util.DateUtils; +import org.jeecg.entity.GardsStations; +import org.jeecg.entity.SysDefaultNuclide; import org.jeecg.service.ISampleStatAnalysisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; @@ -14,7 +16,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Objects; @RestController @@ -127,4 +131,33 @@ public class DataAnalysisController { } + @GetMapping("/findStationList") + public Result findStationList(String systemType) { + Result result = new Result(); + try { + List gardsStations = sampleStatAnalysisService.findStationListByMenuName(); + result.setCode(200); + result.setSuccess(true); + result.setResult(gardsStations); + } catch (Exception e) { + result.setCode(500); + result.setSuccess(false); + } + return result; + } + @GetMapping("/findNuclideList") + public Result findNuclideList(String systemType) { + Result result = new Result(); + try { + List defaultNuclides = sampleStatAnalysisService.findNuclideList(); + result.setCode(200); + result.setSuccess(true); + result.setResult(defaultNuclides); + } catch (Exception e) { + result.setCode(500); + result.setSuccess(false); + } + return result; + } + } diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SysDefaultNuclide.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SysDefaultNuclide.java new file mode 100644 index 0000000..e8b7df2 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SysDefaultNuclide.java @@ -0,0 +1,61 @@ +package org.jeecg.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDefaultNuclide implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + + /** + * 核素名称 + */ + @Excel(name = "核素名称", width = 15) + private String nuclideName; + + /** + * 核素用途 + */ + @Excel(name = "核素用途", width = 15) + private Integer useType; + + /** + * 核素类型 + */ + @Excel(name = "核素类型", width = 8) + private String nuclideType; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新人 + */ + private String createBy; +} + + diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/SysDefaultNuclideMapper.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/SysDefaultNuclideMapper.java new file mode 100644 index 0000000..7227698 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/SysDefaultNuclideMapper.java @@ -0,0 +1,9 @@ +package org.jeecg.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.jeecg.entity.SysDefaultNuclide; +@Mapper +public interface SysDefaultNuclideMapper extends BaseMapper +{ +} 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 490d44c..cd2c6f8 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 @@ -2,19 +2,15 @@ @@ -77,135 +67,121 @@ @@ -245,77 +221,72 @@ AND t1.SAMPLE_ID = t3.SAMPLE_ID WHERE t1.STATION_ID = #{station} AND t1.STATUS != 'F' - 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') @@ -370,7 +342,7 @@ SELECT * FROM ${schemaName}.GARDS_THRESHOLD_RESULT_HIS - AND STATION_ID IN + AND STATION_ID IN #{stationId} @@ -392,9 +364,6 @@ - - - @@ -510,63 +478,57 @@ - - + + - + \ No newline at end of file diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java index 8f49104..2920039 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java @@ -2,6 +2,8 @@ package org.jeecg.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.common.api.vo.Result; +import org.jeecg.entity.GardsStations; +import org.jeecg.entity.SysDefaultNuclide; import org.jeecg.modules.base.entity.original.GardsSampleData; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.RequestParam; @@ -24,4 +26,8 @@ public interface ISampleStatAnalysisService extends IService { Result getNuclideActivityConcAnalyze(String sampleType, Integer[] stationIds, String nuclideName, Integer dataSource, Date startDate, Date endDate); + + List findStationListByMenuName(); + List findNuclideList(); + } 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 c7355d9..a7d3257 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,19 +1,19 @@ package org.jeecg.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; -import org.jeecg.entity.GardsThresholdResultHis; +import org.jeecg.entity.*; +import org.jeecg.mapper.SysDefaultNuclideMapper; import org.jeecg.modules.base.entity.original.GardsSampleData; -import org.jeecg.entity.NuclideActConcIntvl; -import org.jeecg.entity.SampleLevelData; -import org.jeecg.entity.StationInfoData; import org.jeecg.mapper.GardsSampleStatAnalysisMapper; import org.jeecg.service.ISampleStatAnalysisService; import org.jeecg.util.DistributionAnalysisToolkit; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.ZoneId; @@ -25,7 +25,8 @@ import java.util.stream.Collectors; @Service @DS("ora") public class SampleStatAnalysisService extends ServiceImpl implements ISampleStatAnalysisService { - + @Autowired + private SysDefaultNuclideMapper defaultNuclideMapper; public Result getSampleMonitorResult(String sampleType, Integer dataSource, Date startDate, Date endDate) { Result result = new Result(); @@ -133,7 +134,7 @@ public class SampleStatAnalysisService extends ServiceImpl> groupedByNuclideName = nuclideActConcIntvlList.stream() - .filter(p->p.getNuclideName()!=null) + .filter(p -> p.getNuclideName() != null) .collect(Collectors.groupingBy(NuclideActConcIntvl::getNuclideName)); //查询级别 getSample List nuclideNames = new ArrayList<>(groupedByNuclideName.keySet()); @@ -434,5 +435,21 @@ public class SampleStatAnalysisService extends ServiceImpl findStationListByMenuName() { + List gardsStations = new LinkedList<>(); + //获取台站信息 + gardsStations = this.baseMapper.findStationListByMenuName(); + return gardsStations; + } + @Override + @DS("master") + public List findNuclideList() { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDefaultNuclide::getUseType, 4); + List defaultNuclides = defaultNuclideMapper.selectList(queryWrapper); + return defaultNuclides; + } } From b1d3a0a09d2045de8728c8af1842764edefeda5f Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 19:16:09 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E6=A0=B8=E7=B4=A0=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E7=AD=9B=E9=80=89=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DataAnalysisController.java | 4 +-- .../java/org/jeecg/entity/SystemType.java | 27 +++++++++++++++++++ .../service/ISampleStatAnalysisService.java | 4 +-- .../impl/SampleStatAnalysisService.java | 11 ++++++-- 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SystemType.java diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java index 02c10ee..6cb90ef 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java @@ -135,7 +135,7 @@ public class DataAnalysisController { public Result findStationList(String systemType) { Result result = new Result(); try { - List gardsStations = sampleStatAnalysisService.findStationListByMenuName(); + List gardsStations = sampleStatAnalysisService.findStationListByMenuName(systemType); result.setCode(200); result.setSuccess(true); result.setResult(gardsStations); @@ -149,7 +149,7 @@ public class DataAnalysisController { public Result findNuclideList(String systemType) { Result result = new Result(); try { - List defaultNuclides = sampleStatAnalysisService.findNuclideList(); + List defaultNuclides = sampleStatAnalysisService.findNuclideList(systemType); result.setCode(200); result.setSuccess(true); result.setResult(defaultNuclides); diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SystemType.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SystemType.java new file mode 100644 index 0000000..5ef8098 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SystemType.java @@ -0,0 +1,27 @@ +package org.jeecg.entity; + +public enum SystemType { + /** + * 颗粒物 + */ + PARTICULATE("P"), + /** + * β-γ + */ + BETA("B"), + /** + * γ + */ + GAMMA("G"); + + private String type; + + SystemType(String type) { + this.type = type; + } + + public String getType(){ + return this.type; + } + +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java index 2920039..2c234a7 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java @@ -27,7 +27,7 @@ public interface ISampleStatAnalysisService extends IService { Result getNuclideActivityConcAnalyze(String sampleType, Integer[] stationIds, String nuclideName, Integer dataSource, Date startDate, Date endDate); - List findStationListByMenuName(); - List findNuclideList(); + List findStationListByMenuName(String systemType); + List findNuclideList(String systemType); } 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 a7d3257..16ba3b1 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 @@ -436,7 +436,7 @@ public class SampleStatAnalysisService extends ServiceImpl findStationListByMenuName() { + public List findStationListByMenuName(String systemType) { List gardsStations = new LinkedList<>(); //获取台站信息 gardsStations = this.baseMapper.findStationListByMenuName(); @@ -445,10 +445,17 @@ public class SampleStatAnalysisService extends ServiceImpl findNuclideList() { + public List findNuclideList(String systemType) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysDefaultNuclide::getUseType, 4); + if (systemType.equals("B")) { + queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.BETA.getType()); + } else if (systemType.equals("G")) { + queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.GAMMA.getType()); + } else if (systemType.equals("P")) { + queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.PARTICULATE.getType()); + } List defaultNuclides = defaultNuclideMapper.selectList(queryWrapper); return defaultNuclides; } From 1f22a04d5c0ea067926cac558f7b7f9559e7d011 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Fri, 17 Oct 2025 19:39:23 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=8F=B0=E7=AB=99=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E7=AD=9B=E9=80=89=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/mapper/GardsSampleStatAnalysisMapper.java | 2 +- .../jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml | 10 ++++++++++ .../jeecg/service/impl/SampleStatAnalysisService.java | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) 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 c2c267b..f5a6b53 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 @@ -215,7 +215,7 @@ public interface GardsSampleStatAnalysisMapper extends BaseMapper findStationListByMenuName(); + List findStationListByMenuName(@Param("systemType")String systemType); //endregion } 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 cd2c6f8..a640613 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 @@ -530,5 +530,15 @@ \ 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 16ba3b1..0ab8cb7 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 @@ -439,7 +439,7 @@ public class SampleStatAnalysisService extends ServiceImpl findStationListByMenuName(String systemType) { List gardsStations = new LinkedList<>(); //获取台站信息 - gardsStations = this.baseMapper.findStationListByMenuName(); + gardsStations = this.baseMapper.findStationListByMenuName(systemType); return gardsStations; } From 3b797f58c40e5058c7a9694b44becccf7126cbf9 Mon Sep 17 00:00:00 2001 From: duwenyuan <1351851645@qq.com> Date: Sat, 18 Oct 2025 12:46:39 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=A0=B7=E5=93=81=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E6=A0=B8?= =?UTF-8?q?=E7=B4=A0=E6=95=B0=E6=8D=AE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SampleStatAnalysisService.java | 621 +++++++++--------- 1 file changed, 325 insertions(+), 296 deletions(-) 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 0ab8cb7..bdcebba 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 @@ -4,6 +4,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; @@ -30,53 +31,54 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); - List StationInfoDataList = new ArrayList<>(); + try { + result.setCode(CommonConstant.SC_OK_200); + //声明返回用的结果map + Map resultMap = new HashMap<>(); + List StationInfoDataList = new ArrayList<>(); - //region 局部变量 - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); + //region 局部变量 + if (StringUtils.isBlank(sampleType)) { + result.error500("SampleType Code cannot be null"); + return result; + } + if (Objects.isNull(startDate)) { + result.error500("The start time cannot be empty"); + return result; + } + String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; + if (Objects.isNull(endDate)) { + result.error500("The end time cannot be empty"); + return result; + } + String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + //endregion + + switch (dataSource) { + case 1: + StationInfoDataList = this.baseMapper.getRnAutoSampleResult(sampleType, startTime, endTime); + + break; + case 2: + StationInfoDataList = this.baseMapper.getRnManSampleResult(sampleType, startTime, endTime); + + break; + } + //时间段内有多少和台站 + Map> groupedByMonth = StationInfoDataList.stream() + .collect(Collectors.groupingBy(station -> + station.getCollectStop().toInstant() + .atZone(ZoneId.of("UTC")) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + )); + resultMap.put("SampleMonitorResultList", groupedByMonth); + result.setSuccess(true); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("样品监测回放错误:" + e.getMessage()); return result; } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - //endregion - - switch (dataSource) { - case 1: - StationInfoDataList = this.baseMapper.getRnAutoSampleResult(sampleType, startTime, endTime); - - break; - case 2: - StationInfoDataList = this.baseMapper.getRnManSampleResult(sampleType, startTime, endTime); - - break; - } - //时间段内有多少和台站 - - Map> groupedByMonth = StationInfoDataList.stream() - .collect(Collectors.groupingBy(station -> - station.getCollectStop().toInstant() - .atZone(ZoneId.of("UTC")) - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) - )); - - - resultMap.put("SampleMonitorResultList", groupedByMonth); - - result.setSuccess(true); - result.setResult(resultMap); - return result; } @@ -98,56 +100,62 @@ public class SampleStatAnalysisService extends ServiceImpl> groupedByNuclideName = nuclideActConcIntvlList.stream() + .filter(p -> 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); + } + resultMap.put("nuclideActConcIntvlList", groupedByNuclideName); + resultMap.put("sampleLevelDataList", sampleLevelDataList); + resultMap.put("thresholdResultHisDataList", thresholdResultHisDataList); + result.setSuccess(true); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("样品统计分析错误:" + e.getMessage()); return result; } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - //endregion - switch (dataSource) { - //RNAUTO - case 1: - //获取样品中识别到的核素集合 - nuclideActConcIntvlList = this.baseMapper.getRnAutoIdentifiedNuclides(stationCode, startTime, endTime); - //核素等级时序分析 - sampleLevelDataList = this.baseMapper.getRnAutoNuclideTimeSeriesAnalysis(stationCode, startTime, endTime); - break; - //RNMAN - case 2: - //获取样品中识别到的核素集合 - nuclideActConcIntvlList = this.baseMapper.getRnManIdentifiedNuclides(stationCode, startTime, endTime); - - //核素等级时序分析 - sampleLevelDataList = this.baseMapper.getRnManNuclideTimeSeriesAnalysis(stationCode, startTime, endTime); - break; - } - //key=核素名称,value=获取样品中识别到的核素集合 - Map> groupedByNuclideName = nuclideActConcIntvlList.stream() - .filter(p -> p.getNuclideName() != null) - .collect(Collectors.groupingBy(NuclideActConcIntvl::getNuclideName)); - //查询级别 getSample - List nuclideNames = new ArrayList<>(groupedByNuclideName.keySet()); - //通过台站ID、核素名称查找阈值 - thresholdResultHisDataList = this.baseMapper.selectByStationAndNuclides(schemaName, Integer.valueOf(stationCode), nuclideNames, startTime, endTime); - - resultMap.put("nuclideActConcIntvlList", groupedByNuclideName); - resultMap.put("sampleLevelDataList", sampleLevelDataList); - resultMap.put("thresholdResultHisDataList", thresholdResultHisDataList); - result.setSuccess(true); - result.setResult(resultMap); - - return result; } /** @@ -163,43 +171,46 @@ public class SampleStatAnalysisService extends ServiceImpl sampleDataList = new ArrayList<>(); //region 局部变量 Result result = new Result(); - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); + try { + result.setCode(CommonConstant.SC_OK_200); + if (StringUtils.isBlank(sampleType)) { + result.error500("SampleType Code cannot be null"); + return result; + } + if (StringUtils.isBlank(station)) { + result.error500("Station Code cannot be null"); + return result; + } + if (Objects.isNull(startDate)) { + result.error500("The start time cannot be empty"); + return result; + } + String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; + if (Objects.isNull(endDate)) { + result.error500("The end time cannot be empty"); + return result; + } + String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + //endregion + switch (dataSource) { + case 1: + sampleDataList = this.baseMapper.getRnAutoSampleGradeAnalysis(sampleType, station, startTime, endTime); + + break; + case 2: + sampleDataList = this.baseMapper.getRnManSampleGradeAnalysis(sampleType, station, startTime, endTime); + break; + + } + + resultMap.put("sampleDataList", sampleDataList); + result.setSuccess(true); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("样品统计分析错误:" + e.getMessage()); return result; } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - //endregion - switch (dataSource) { - case 1: - sampleDataList = this.baseMapper.getRnAutoSampleGradeAnalysis(sampleType, station, startTime, endTime); - - break; - case 2: - sampleDataList = this.baseMapper.getRnManSampleGradeAnalysis(sampleType, station, startTime, endTime); - break; - - } - - resultMap.put("sampleDataList", sampleDataList); - result.setSuccess(true); - result.setResult(resultMap); - - - return result; } /*** 样品活度浓度区间频率分析 @@ -219,86 +230,92 @@ public class SampleStatAnalysisService extends ServiceImpl nuclideActConcIntvls = new ArrayList<>(); //region 局部变量 Result result = new Result(); - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); + try { + result.setCode(CommonConstant.SC_OK_200); + if (StringUtils.isBlank(sampleType)) { + result.error500("SampleType Code cannot be null"); + return result; + } + if (StringUtils.isBlank(nuclideName)) { + result.error500("nuclideName Code cannot be null"); + return result; + } + if (StringUtils.isBlank(station)) { + result.error500("Station Code cannot be null"); + return result; + } + if (Objects.isNull(startDate)) { + result.error500("The start time cannot be empty"); + return result; + } + String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; + if (Objects.isNull(endDate)) { + result.error500("The end time cannot be empty"); + return result; + } + String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + //endregion + + //根据数据源、样品类型查询样品的浓度 + switch (sampleType) { + case "P": + switch (dataSource) { + //RNAUTO + case 1: + nuclideActConcIntvls = this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); + break; + //RNMAN + case 2: + nuclideActConcIntvls = this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); + break; + } + break; + case "B": + switch (dataSource) { + case 1: + nuclideActConcIntvls = this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); + break; + case 2: + nuclideActConcIntvls = this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); + break; + + } + break; + + } + + //获取浓度出现的次数 + //获取浓度值集合 + List data = DistributionAnalysisToolkit.convertConcToDoubleList(nuclideActConcIntvls); + // 设置区间参数 + double start = 0; // 区间起始值 + double step = 200; // 区间步长(宽度) + + + // 1. 区间统计 + List stats = DistributionAnalysisToolkit.calculateIntervalStats(nuclideActConcIntvls, start, step); + // 3. 累积分布函数 + List cdfPoints = DistributionAnalysisToolkit.calculateCDF(data); + // 4. 核密度估计 + List kdePoints = DistributionAnalysisToolkit.autoKDE(data, DistributionAnalysisToolkit.GAUSSIAN_KERNEL); + //获取所有浓度的累积 + List cumulative = DistributionAnalysisToolkit.cumulativeSum(data); + //获取95%累积线 + double percentile95 = DistributionAnalysisToolkit.calculate95thPercentile(data); + + resultMap.put("stats", stats); + resultMap.put("cdfPoints", cdfPoints); + resultMap.put("kdePoints", kdePoints); + resultMap.put("cumulative", cumulative); + resultMap.put("percentile95", percentile95); + result.setSuccess(true); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("样品活度浓度区间频率分析错误:" + e.getMessage()); return result; } - if (StringUtils.isBlank(nuclideName)) { - result.error500("nuclideName Code cannot be null"); - return result; - } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - //endregion - //根据数据源、样品类型查询样品的浓度 - switch (sampleType) { - case "P": - switch (dataSource) { - //RNAUTO - case 1: - nuclideActConcIntvls = this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - break; - //RNMAN - case 2: - nuclideActConcIntvls = this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - break; - } - break; - case "B": - switch (dataSource) { - case 1: - nuclideActConcIntvls = this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - break; - case 2: - nuclideActConcIntvls = this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); - break; - - } - break; - - } - - //获取浓度出现的次数 - //获取浓度值集合 - List data = DistributionAnalysisToolkit.convertConcToDoubleList(nuclideActConcIntvls); - // 设置区间参数 - double start = 0; // 区间起始值 - double step = 200; // 区间步长(宽度) - - - // 1. 区间统计 - List stats = DistributionAnalysisToolkit.calculateIntervalStats(nuclideActConcIntvls, start, step); - // 3. 累积分布函数 - List cdfPoints = DistributionAnalysisToolkit.calculateCDF(data); - // 4. 核密度估计 - List kdePoints = DistributionAnalysisToolkit.autoKDE(data, DistributionAnalysisToolkit.GAUSSIAN_KERNEL); - //获取所有浓度的累积 - List cumulative = DistributionAnalysisToolkit.cumulativeSum(data); - //获取95%累积线 - double percentile95 = DistributionAnalysisToolkit.calculate95thPercentile(data); - - resultMap.put("stats", stats); - resultMap.put("cdfPoints", cdfPoints); - resultMap.put("kdePoints", kdePoints); - resultMap.put("cumulative", cumulative); - resultMap.put("percentile95", percentile95); - result.setSuccess(true); - result.setResult(resultMap); - return result; } /*** 核素活度浓度时序分析 @@ -314,75 +331,82 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); - //region 局部变量 + try { + result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); - return result; - } - if (StringUtils.isBlank(nuclideName)) { - result.error500("nuclideName Code cannot be null"); - return result; - } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - //endregion - //获取样品阈值级别和阈值 - List sampleDatas = new ArrayList<>(); - //核素的阈值 - List 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; - }; + //region 局部变量 + + if (StringUtils.isBlank(sampleType)) { + result.error500("SampleType Code cannot be null"); + return result; } - 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; - }; + if (StringUtils.isBlank(nuclideName)) { + result.error500("nuclideName Code cannot be null"); + return result; } - default -> nuclideActConcIntvls; - }; - String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; + if (StringUtils.isBlank(station)) { + result.error500("Station Code cannot be null"); + return result; + } + if (Objects.isNull(startDate)) { + result.error500("The start time cannot be empty"); + return result; + } + String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; + if (Objects.isNull(endDate)) { + result.error500("The end time cannot be empty"); + return result; + } + String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + //endregion + //获取样品阈值级别和阈值 + List sampleDatas = new ArrayList<>(); + //核素的阈值 + List 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; + }; + String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; - 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); + 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); + + result.setSuccess(true); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("核素活度浓度时序分析错误:" + e.getMessage()); + return result; + } - result.setSuccess(true); - result.setResult(resultMap); - return result; } /*** 核素活度浓度对比分析 @@ -396,43 +420,48 @@ public class SampleStatAnalysisService extends ServiceImpl resultMap = new HashMap<>(); List nuclideActConcIntvls = new ArrayList<>(); - //region 局部变量 - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - if (Objects.isNull(stationIds)) { + Result result = new Result(); + try { + result.setCode(CommonConstant.SC_OK_200); + + //region 局部变量 + if (Objects.isNull(startDate)) { + result.error500("The start time cannot be empty"); + return result; + } + String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; + if (Objects.isNull(endDate)) { + result.error500("The end time cannot be empty"); + return result; + } + String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + + if (Objects.isNull(stationIds)) { + result.setSuccess(true); + result.setResult(Collections.emptyList()); + return result; + } + //endregion + switch (dataSource) { + case 1: + nuclideActConcIntvls = this.baseMapper.getRnAutoAnalyzeNuclideActivityConc(sampleType, nuclideName, stationIds, startTime, endTime); + break; + case 2: + nuclideActConcIntvls = this.baseMapper.getRnManAnalyzeNuclideActivityConc(sampleType, nuclideName, stationIds, startTime, endTime); + break; + + } + resultMap.put("nuclideInfoList", nuclideActConcIntvls); result.setSuccess(true); - result.setResult(Collections.emptyList()); + result.setResult(resultMap); + return result; + } catch (Exception e) { + result.error500("核素活度浓度对比分析错误:" + e.getMessage()); return result; } - //endregion - switch (dataSource) { - case 1: - nuclideActConcIntvls = this.baseMapper.getRnAutoAnalyzeNuclideActivityConc(sampleType, nuclideName, stationIds, startTime, endTime); - break; - case 2: - nuclideActConcIntvls = this.baseMapper.getRnManAnalyzeNuclideActivityConc(sampleType, nuclideName, stationIds, startTime, endTime); - break; - - } - resultMap.put("nuclideInfoList", nuclideActConcIntvls); - result.setSuccess(true); - result.setResult(resultMap); - - return result; } @Override From 9fa131fe9c06b3a7c9b46d014ccc064e8002c1d3 Mon Sep 17 00:00:00 2001 From: panbaolin <13071138970@163.com> Date: Tue, 21 Oct 2025 13:45:14 +0800 Subject: [PATCH 9/9] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E6=BA=90=E9=A1=B9?= =?UTF-8?q?=E9=87=8D=E5=BB=BA=E5=8A=9F=E8=83=BD=E8=A7=82=E6=B5=8B=E5=80=BC?= =?UTF-8?q?=E4=B8=8E=E6=A8=A1=E6=8B=9F=E5=80=BC=E5=AF=B9=E6=AF=94=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=202.=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81=203.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=84=E6=9C=8D=E5=8A=A1logback=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=204.=E4=BF=AE=E6=94=B9=E5=A4=A9?= =?UTF-8?q?=E6=B0=94=E9=A2=84=E6=B5=8B=E5=8A=9F=E8=83=BD=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...um.java => PrometheusDBQueryTypeEnum.java} | 28 +- .../enums/PrometheusHostQueryTypeEnum.java | 72 ++++ .../PrometheusServerProperties.java | 30 ++ .../entity/SourceRebuildMonitoringData.java | 13 +- .../SourceRebuildTaskController.java | 5 +- .../TaskMonitoringDataController.java | 6 +- .../SourceRebuildMonitoringDataService.java | 3 +- ...ourceRebuildMonitoringDataServiceImpl.java | 14 +- .../impl/SourceRebuildTaskServiceImpl.java | 18 +- .../impl/TaskResultDataServiceImpl.java | 10 + .../jeecg/vo/ActivityConcComparResult.java | 11 + .../controller/DatabaseMonitorController.java | 135 +++--- .../controller/ServiceMonitorController.java | 8 +- .../monitor/mapper/DatabaseMonitorMapper.java | 2 +- .../service/DatabaseMonitorService.java | 33 +- .../monitor/service/HostMonitorService.java | 4 +- .../impl/DatabaseMonitorServiceImpl.java | 400 +++++++++++++++++- .../service/impl/HostMonitorServiceImpl.java | 36 +- .../system/service/impl/SysBaseApiImpl.java | 3 +- .../controller/WeatherDataController.java | 55 ++- .../org/jeecg/service/WeatherDataService.java | 2 +- .../service/impl/WeatherDataServiceImpl.java | 27 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/logback-spring.xml | 4 +- .../src/main/resources/logback-spring.xml | 44 ++ .../src/main/resources/logback-spring.xml | 37 +- .../src/main/resources/logback-spring.xml | 37 +- .../src/main/resources/logback-spring.xml | 37 +- .../src/main/resources/logback-spring.xml | 37 +- .../src/main/resources/application.yml | 2 +- .../src/main/resources/logback-spring.xml | 37 +- pom.xml | 6 +- 32 files changed, 803 insertions(+), 355 deletions(-) rename jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/{PrometheusQueryTypeEnum.java => PrometheusDBQueryTypeEnum.java} (53%) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusHostQueryTypeEnum.java create mode 100644 jeecg-server-cloud/jeecg-data-analyze-start/src/main/resources/logback-spring.xml diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusDBQueryTypeEnum.java similarity index 53% rename from jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java rename to jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusDBQueryTypeEnum.java index 23739a9..461ea19 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusDBQueryTypeEnum.java @@ -1,21 +1,19 @@ package org.jeecg.common.constant.enums; -import java.time.Instant; - /** * Prometheus 范围查询条件枚举 */ -public enum PrometheusQueryTypeEnum { +public enum PrometheusDBQueryTypeEnum { - FIVE_MIN("Last 5 minutes",(5*60),"15s"), - THIRTY_MIN("Last 30 minutes",(30*60),"15s"), - ONE_HOUR("Last 1 hour",(60*60),"15s"), - THREE_HOURS("Last 3 hours",(3*60*60),"15s"), - SIX_HOURS("Last 6 hours",(6*60*60),"15s"), - TWELVE_HOURS("Last 12 hours",(12*60*60),"1m0s"), - TWENTY_FOUR_HOURS("Last 24 hours",(24*60*60),"2m0s"), - TWO_DAYS("Last 2 days",(2*24*60*60),"5m0s"), - SEVEN_DAYS("Last 7 days",(7*24*60*60),"15m0s"); + FIVE_MIN("Last 5 minutes",(5*60),"30s"), + THIRTY_MIN("Last 30 minutes",(30*60),"30s"), + ONE_HOUR("Last 1 hour",(60*60),"30s"), + THREE_HOURS("Last 3 hours",(3*60*60),"40s"), + SIX_HOURS("Last 6 hours",(6*60*60),"2m0s"), + TWELVE_HOURS("Last 12 hours",(12*60*60),"4m0s"), + TWENTY_FOUR_HOURS("Last 24 hours",(24*60*60),"4m0s"), + TWO_DAYS("Last 2 days",(2*24*60*60),"10m0s"), + SEVEN_DAYS("Last 7 days",(7*24*60*60),"40m0s"); /** * Prometheus 范围查询条件 @@ -30,7 +28,7 @@ public enum PrometheusQueryTypeEnum { */ private String step; - PrometheusQueryTypeEnum(String conditions, Integer number, String step) { + PrometheusDBQueryTypeEnum(String conditions, Integer number, String step) { this.conditions = conditions; this.lastSecond = number; this.step = step; @@ -53,8 +51,8 @@ public enum PrometheusQueryTypeEnum { * @param conditions * @return */ - public static PrometheusQueryTypeEnum getQueryTypeEnum(String conditions) { - for (PrometheusQueryTypeEnum queryTypeEnum : PrometheusQueryTypeEnum.values()) { + public static PrometheusDBQueryTypeEnum getQueryTypeEnum(String conditions) { + for (PrometheusDBQueryTypeEnum queryTypeEnum : PrometheusDBQueryTypeEnum.values()) { if (queryTypeEnum.getConditions().equals(conditions)) { return queryTypeEnum; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusHostQueryTypeEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusHostQueryTypeEnum.java new file mode 100644 index 0000000..6ce532a --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusHostQueryTypeEnum.java @@ -0,0 +1,72 @@ +package org.jeecg.common.constant.enums; + +/** + * Prometheus 范围查询条件枚举 + */ +public enum PrometheusHostQueryTypeEnum { + + FIVE_MIN("Last 5 minutes",(5*60),"15s","1m0s"), + THIRTY_MIN("Last 30 minutes",(30*60),"15s","1m0s"), + ONE_HOUR("Last 1 hour",(60*60),"15s","1m0s"), + THREE_HOURS("Last 3 hours",(3*60*60),"15s","1m0s"), + SIX_HOURS("Last 6 hours",(6*60*60),"15s","1m0s"), + TWELVE_HOURS("Last 12 hours",(12*60*60),"1m0s","1m15s"), + TWENTY_FOUR_HOURS("Last 24 hours",(24*60*60),"2m0s","2m15s"), + TWO_DAYS("Last 2 days",(2*24*60*60),"5m0s","2m15s"), + SEVEN_DAYS("Last 7 days",(7*24*60*60),"15m0s","15m15s"); + + /** + * Prometheus 范围查询条件 + */ + private String conditions; + /** + * Prometheus 范围起始时间需要减的值(秒) + */ + private long lastSecond; + /** + * 间隔步长 + */ + private String step; + + /** + * 范围向量的时间窗口 + */ + private String exprTime; + + PrometheusHostQueryTypeEnum(String conditions, Integer number, String step,String exprTime) { + this.conditions = conditions; + this.lastSecond = number; + this.step = step; + this.exprTime = exprTime; + } + + public String getConditions() { + return conditions; + } + + public long getLastSecond() { + return lastSecond; + } + + public String getStep() { + return step; + } + + public String getExprTime() { + return exprTime; + } + + /** + * 返回对应枚 + * @param conditions + * @return + */ + public static PrometheusHostQueryTypeEnum getQueryTypeEnum(String conditions) { + for (PrometheusHostQueryTypeEnum queryTypeEnum : PrometheusHostQueryTypeEnum.values()) { + if (queryTypeEnum.getConditions().equals(conditions)) { + return queryTypeEnum; + } + } + return null; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java index 683cc2d..c848a15 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java @@ -23,4 +23,34 @@ public class PrometheusServerProperties { * 监测的网卡名称 */ private String networkCardName; + + /** + * pg数据库主机 + */ + private String pgHost; + + /** + * postgresql数据库端口 + */ + private Integer pgDBPort; + + /** + * postgresql管理员用户名称 + */ + private String pgAdmin; + + /** + * postgresql管理员用户密码 + */ + private String pgAdminPwd; + + /** + * 对于活跃连接数监控的哪些数据库 + */ + private String monitorDBNames; + + /** + * 数据库实例地址 + */ + private String dbInstance; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildMonitoringData.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildMonitoringData.java index fe1a7b8..90a29a0 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildMonitoringData.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildMonitoringData.java @@ -31,14 +31,13 @@ public class SourceRebuildMonitoringData implements Serializable { /** * 任务ID */ - @Excel(name = "任务主键", width = 10,height = 20,orderNum="0") @TableField(value = "task_id") private Integer taskId; /** * 台站名称 */ - @Excel(name = "台站名称", width = 20,height = 20,orderNum="1") + @Excel(name = "台站名称", width = 20,height = 20,orderNum="0") @NotBlank(message = "台站名称不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "station") private String station; @@ -46,7 +45,7 @@ public class SourceRebuildMonitoringData implements Serializable { /** * 核素名称 */ - @Excel(name = "核素名称", width = 20,height = 20,orderNum="2") + @Excel(name = "核素名称", width = 20,height = 20,orderNum="1") @NotBlank(message = "核素名称不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "nuclide") private String nuclide; @@ -54,7 +53,7 @@ public class SourceRebuildMonitoringData implements Serializable { /** * 测量停止时间 */ - @Excel(name = "测量停止时间", width = 25,height = 20,format = "yyyy-MM-dd HH:mm:ss",orderNum="3") + @Excel(name = "测量停止时间", width = 25,height = 20,format = "yyyy-MM-dd HH:mm:ss",orderNum="2") @NotNull(message = "测量停止时间不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "collect_stop") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @@ -63,7 +62,7 @@ public class SourceRebuildMonitoringData implements Serializable { /** * 活度浓度 */ - @Excel(name = "活度浓度", width = 25,height = 20,orderNum="4") + @Excel(name = "活度浓度", width = 25,height = 20,orderNum="3") @NotBlank(message = "活度浓度不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "activity") private String activity; @@ -71,7 +70,7 @@ public class SourceRebuildMonitoringData implements Serializable { /** * 不确定度 */ - @Excel(name = "不确定度", width = 25,height = 20,orderNum="5") + @Excel(name = "不确定度", width = 25,height = 20,orderNum="4") @NotBlank(message = "不确定度不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "uncertainty") private String uncertainty; @@ -79,7 +78,7 @@ public class SourceRebuildMonitoringData implements Serializable { /** * mdc */ - @Excel(name = "MDC", width = 25,height = 20,orderNum="6") + @Excel(name = "MDC", width = 25,height = 20,orderNum="5") @NotBlank(message = "mdc不能为空", groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "mdc") private String mdc; diff --git a/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/SourceRebuildTaskController.java b/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/SourceRebuildTaskController.java index aac99e9..30ddbee 100644 --- a/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/SourceRebuildTaskController.java +++ b/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/SourceRebuildTaskController.java @@ -83,8 +83,9 @@ public class SourceRebuildTaskController{ @AutoLog(value = "启动任务") @Operation(summary = "启动任务") @PutMapping("runTask") - public Result runTask(@NotNull(message = "任务ID不能为空") Integer taskId){ - sourceRebuildTaskService.runTask(taskId); + public Result runTask(@RequestBody @Validated(value = UpdateGroup.class) SourceRebuildTask sourceRebuildTask){ + sourceRebuildTaskService.update(sourceRebuildTask); + sourceRebuildTaskService.runTask(sourceRebuildTask.getId()); return Result.OK(); } } diff --git a/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/TaskMonitoringDataController.java b/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/TaskMonitoringDataController.java index 72047bd..2b76a52 100644 --- a/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/TaskMonitoringDataController.java +++ b/jeecg-module-source-rebuild/src/main/java/org/jeecg/controller/TaskMonitoringDataController.java @@ -63,7 +63,8 @@ public class TaskMonitoringDataController { @AutoLog(value = "导入源项重建监测数据") @Operation(summary = "导入源项重建监测数据") @PostMapping("importTaskMonitoringData") - public Result importTaskMonitoringData(HttpServletRequest request, HttpServletResponse response){ + public Result importTaskMonitoringData(HttpServletRequest request){ + Integer taskId = Integer.valueOf(request.getParameter("taskId")); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map fileMap = multipartRequest.getFileMap(); for (Map.Entry entity : fileMap.entrySet()) { @@ -76,8 +77,7 @@ public class TaskMonitoringDataController { try { ExcelImportCheckUtil.check(file.getInputStream(), SourceRebuildMonitoringData.class, params); List list = ExcelImportUtil.importExcel(file.getInputStream(), SourceRebuildMonitoringData.class, params); - System.out.println(list); - monitoringDataService.cteate(list); + monitoringDataService.cteate(taskId,list); return Result.ok("文件导入成功!"); } catch (Exception e) { log.error(e.getMessage(), e); diff --git a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/SourceRebuildMonitoringDataService.java b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/SourceRebuildMonitoringDataService.java index a2d574c..e6e102b 100644 --- a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/SourceRebuildMonitoringDataService.java +++ b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/SourceRebuildMonitoringDataService.java @@ -12,8 +12,9 @@ public interface SourceRebuildMonitoringDataService extends IService monitoringDatas); + void cteate(Integer taskId,List monitoringDatas); /** * 删除源项重建任务监测数据 diff --git a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildMonitoringDataServiceImpl.java b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildMonitoringDataServiceImpl.java index b65f509..ee80944 100644 --- a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildMonitoringDataServiceImpl.java +++ b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildMonitoringDataServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; @@ -19,12 +20,21 @@ public class SourceRebuildMonitoringDataServiceImpl extends ServiceImpl monitoringDatas) { + public void cteate(Integer taskId,List monitoringDatas) { + //先删除旧的,然后保存新的监测数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SourceRebuildMonitoringData::getTaskId, taskId); + this.remove(queryWrapper); + if(CollUtil.isNotEmpty(monitoringDatas)){ + for(SourceRebuildMonitoringData monitoringData : monitoringDatas){ + monitoringData.setTaskId(taskId); + } + } this.saveBatch(monitoringDatas); } diff --git a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildTaskServiceImpl.java b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildTaskServiceImpl.java index c292a70..5fa0001 100644 --- a/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildTaskServiceImpl.java +++ b/jeecg-module-source-rebuild/src/main/java/org/jeecg/service/impl/SourceRebuildTaskServiceImpl.java @@ -179,15 +179,15 @@ public class SourceRebuildTaskServiceImpl extends ServiceImpl getCpuInfo() { -// return Result.OK(databaseMonitorService.getCpuInfo()); -// } -// -// @AutoLog(value = "获取内存监测数据") -// @GetMapping("getMemoryInfo") -// public Result getMemoryInfo() { -// return Result.OK(databaseMonitorService.getMemoryInfo()); -// } -// -// @AutoLog(value = "获取表空间信息") -// @GetMapping("getTableSpaceInfo") -// public Result getNetworkInfo() { -// return Result.OK(databaseMonitorService.getTableSpaceInfo()); -// } -// -// @AutoLog(value = "获取活跃连接数信息") -// @GetMapping("getActiveSessionInfo") -// public Result getDiskInfo() { -// return Result.OK(databaseMonitorService.getActiveSessionInfo()); -// } -// -// @AutoLog(value = "获取死锁信息") -// @GetMapping("getDeadlocksInfo") -// public Result getDeadlocksInfo() { -// return Result.OK(databaseMonitorService.getDeadlocksInfo()); -// } -// -// @AutoLog(value = "获取数据库占比信息") -// @GetMapping("getDatabaseProportionInfo") -// public Result getDatabaseProportionInfo() { -// return Result.OK(databaseMonitorService.getDatabaseProportionInfo()); -// } -// -//} +package org.jeecg.modules.monitor.controller; + +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.modules.monitor.service.DatabaseMonitorService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RestController +@RequestMapping("monitor") +@RequiredArgsConstructor +public class DatabaseMonitorController { + + private final DatabaseMonitorService databaseMonitorService; + + @AutoLog(value = "查询当前时刻的CPU使用信息") + @GetMapping("getDBCpuInfo") + public Result getDBCpuInfo() { + return Result.OK(databaseMonitorService.getCpuInfo()); + } + + @AutoLog(value = "查询过去指定时间范围内的CPU使用信息") + @GetMapping("getDBCpuInfoList") + public Result getDBCpuInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(databaseMonitorService.getCpuInfoList(conditions)); + } + + @AutoLog(value = "查询当前时刻的内存使用信息") + @GetMapping("getDBMemoryInfo") + public Result getDBMemoryInfo() { + return Result.OK(databaseMonitorService.getDBMemoryInfo()); + } + + @AutoLog(value = "查询过去指定时间范围内的内存使用信息") + @GetMapping("getDBMemoryInfoList") + public Result getDBMemoryInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(databaseMonitorService.getMemoryInfoList(conditions)); + } + + @AutoLog(value = "查询数据库表空间信息") + @GetMapping("getDBTableSpaceInfo") + public Result getDBTableSpaceInfo() { + return Result.OK(databaseMonitorService.getTableSpaceInfo()); + } + + @AutoLog(value = "查询当前时刻的数据库活跃连接数使用信息") + @GetMapping("getDBActiveSessionInfo") + public Result getDBActiveSessionInfo() { + return Result.OK(databaseMonitorService.getActiveSessionInfo()); + } + + @AutoLog(value = "查询过去指定时间范围内的数据库活跃连接数信息") + @GetMapping("getDBActiveSessionInfoList") + public Result getDBActiveSessionInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(databaseMonitorService.getActiveSessionInfoList(conditions)); + } + + @AutoLog(value = "查询当前时刻的数据库死锁信息") + @GetMapping("getDBDeadlocksInfo") + public Result getDeadlocksInfo() { + return Result.OK(databaseMonitorService.getDeadlocksInfo()); + } + + @AutoLog(value = "查询过去指定时间范围内的数据库死锁信息") + @GetMapping("getDeadlocksInfoList") + public Result getDeadlocksInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(databaseMonitorService.getDeadlocksInfoList(conditions)); + } + + @AutoLog(value = "查询数据库占比信息") + @GetMapping("getDBProportionInfo") + public Result getDatabaseProportionInfo() { + return Result.OK(databaseMonitorService.getDatabaseProportionInfo()); + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java index 100341a..b6e8f25 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java @@ -20,8 +20,8 @@ public class ServiceMonitorController { @AutoLog(value = "查询当前时刻的CPU使用率") @GetMapping("getCpuInfo") - public Result getCpuInfo() { - return Result.OK(hostMonitorService.getCpuInfo()); + public Result getCpuInfo(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getCpuInfo(conditions)); } @AutoLog(value = "查询过去指定时间范围内的CPU使用率") @@ -56,8 +56,8 @@ public class ServiceMonitorController { @AutoLog(value = "获取网络带宽监测数据") @GetMapping("getNetworkInfo") - public Result getNetworkInfo() { - return Result.OK(hostMonitorService.getNetworkInfo()); + public Result getNetworkInfo(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getNetworkInfo(conditions)); } @AutoLog(value = "获取网络带宽监测数据") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/mapper/DatabaseMonitorMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/mapper/DatabaseMonitorMapper.java index 6bbcbc0..62b6e7e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/mapper/DatabaseMonitorMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/mapper/DatabaseMonitorMapper.java @@ -12,5 +12,5 @@ public interface DatabaseMonitorMapper extends BaseMapper { "pg_database_size(datname) AS dataSize " + "FROM pg_database " + "WHERE datistemplate = false") - List getActiveSessionInfo(); + List getDatabaseProportionInfo(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/DatabaseMonitorService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/DatabaseMonitorService.java index 835c44a..d4db5df 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/DatabaseMonitorService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/DatabaseMonitorService.java @@ -9,31 +9,54 @@ public interface DatabaseMonitorService { /** * 获取CPU信息 + * @return */ - Map getCpuInfo(); + Map getCpuInfo(); + + /** + * 获取CPU信息列表 + */ + List> getCpuInfoList(String conditions); /** * 获取内存信息 */ - Map getMemoryInfo(); + Map getDBMemoryInfo(); + + /** + * 获取内存信息列表 + */ + List> getMemoryInfoList(String conditions); /** * 获取表空间信息 * @return */ - Map getTableSpaceInfo(); + List> getTableSpaceInfo(); /** * 获取活跃连接数信息 * @return */ - Map getActiveSessionInfo(); + Map getActiveSessionInfo(); + + /** + * 获取活跃连接数信息列表 + * @return + */ + List> getActiveSessionInfoList(String conditions); /** * 获取死锁信息 * @return */ - Map getDeadlocksInfo(); + Map getDeadlocksInfo(); + + /** + * 获取死锁信息列表 + * @return + */ + List> getDeadlocksInfoList(String conditions); /** * 获取数据库占比信息 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java index daab3b0..bfe6ef2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java @@ -9,7 +9,7 @@ public interface HostMonitorService { /** * 获取CPU信息 */ - Map getCpuInfo(); + Map getCpuInfo(String conditions); /** * 获取CPU信息列表 @@ -40,7 +40,7 @@ public interface HostMonitorService { /** * 获取网络信息 */ - Map getNetworkInfo(); + Map getNetworkInfo(String conditions); /** * 获取网络信息列表 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/DatabaseMonitorServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/DatabaseMonitorServiceImpl.java index cfcda95..a3e8701 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/DatabaseMonitorServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/DatabaseMonitorServiceImpl.java @@ -1,33 +1,200 @@ package org.jeecg.modules.monitor.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.enums.PrometheusDBQueryTypeEnum; +import org.jeecg.common.constant.enums.PrometheusHostQueryTypeEnum; +import org.jeecg.common.properties.PrometheusServerProperties; import org.jeecg.modules.monitor.mapper.DatabaseMonitorMapper; import org.jeecg.modules.monitor.service.DatabaseMonitorService; import org.jeecg.modules.monitor.vo.DatabaseProportionInfo; +import org.jeecg.modules.monitor.vo.PrometheusResponse; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URI; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.time.Instant; +import java.util.*; +@Slf4j @Service @RequiredArgsConstructor public class DatabaseMonitorServiceImpl implements DatabaseMonitorService { + private final WebClient webClient; private final DatabaseMonitorMapper databaseMonitorMapper; + private final PrometheusServerProperties serverProperties; /** * 获取CPU信息 + * + * @return */ @Override public Map getCpuInfo() { - return Map.of(); + Map result = new HashMap<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询CPU使用时间 + String cpuQuery = "avg(rate(process_cpu_seconds_total{release=\"\", instance=\""+instance+"\"}[5m]) * 1000)"; + PrometheusResponse response = webClient.get() + .uri(buildUri(url,cpuQuery)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result cpuInfo = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(cpuInfo.getValue())) { + Date date = new Date(cpuInfo.getValue().get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(cpuInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + result.put("cpuTime", useRate); + } + } + }catch (Exception e){ + log.error("获取数据库CPU使用时间信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + + /** + * 获取CPU信息列表 + */ + @Override + public List> getCpuInfoList(String conditions) { + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询数据库CPU使用 + String cpuInfoQuery = "avg(rate(process_cpu_seconds_total{release=\"\", instance=\""+instance+"\"}[5m]) * 1000)"; + PrometheusDBQueryTypeEnum queryTypeEnum = PrometheusDBQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,cpuInfoQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result activeSessionInfoList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(activeSessionInfoList.getValues())) { + List> pointDatas = activeSessionInfoList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double cpuTime = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("cpuTime", cpuTime); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取数据库CPU使用时间信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; } /** * 获取内存信息 */ @Override - public Map getMemoryInfo() { - return Map.of(); + public Map getDBMemoryInfo() { + Map result = new HashMap<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询内存利用率 + String cpuQuery = "avg(rate(process_resident_memory_bytes{release=\"\", instance=\""+instance+"\"}[5m]))"; + PrometheusResponse response = webClient.get() + .uri(buildUri(url,cpuQuery)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result memInfo = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(memInfo.getValue())) { + Date date = new Date(memInfo.getValue().get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(memInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + result.put("memUsage", useRate); + } + } + }catch (Exception e){ + log.error("获取数据库内存使用情况信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + + /** + * 获取内存信息列表 + */ + @Override + public List> getMemoryInfoList(String conditions) { + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询数据库内存使用 + String cpuInfoQuery = "avg(rate(process_resident_memory_bytes{release=\"\", instance=\""+instance+"\"}[5m]))"; + PrometheusDBQueryTypeEnum queryTypeEnum = PrometheusDBQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,cpuInfoQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result activeSessionInfoList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(activeSessionInfoList.getValues())) { + List> pointDatas = activeSessionInfoList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double memUsage = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("memUsage", memUsage); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取数据库内存使用情况信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; } /** @@ -36,8 +203,31 @@ public class DatabaseMonitorServiceImpl implements DatabaseMonitorService { * @return */ @Override - public Map getTableSpaceInfo() { - return Map.of(); + public List> getTableSpaceInfo() { + List> results = new ArrayList<>(); + String url = "jdbc:postgresql://"+serverProperties.getPgHost()+":"+serverProperties.getPgDBPort()+"/"+serverProperties.getPgAdmin()+"?stringtype=unspecified&tcpKeepAlive=true&ApplicationName=YourAppName"; + String user = serverProperties.getPgAdmin(); + String password = serverProperties.getPgAdminPwd(); + String sql = "" + + "SELECT " + + " spcname AS tablespace_name," + + " pg_size_pretty(pg_tablespace_size(spcname)) AS size " + + "FROM pg_tablespace " + + "ORDER BY pg_tablespace_size(spcname) DESC"; + try (Connection conn = DriverManager.getConnection(url, user, password); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + + while (rs.next()) { + Map row = new HashMap<>(); + row.put("tablespaceName", rs.getString("tablespace_name")); + row.put("size", rs.getString("size")); + results.add(row); + } + } catch (Exception e) { + e.printStackTrace(); + } + return results; } /** @@ -47,7 +237,85 @@ public class DatabaseMonitorServiceImpl implements DatabaseMonitorService { */ @Override public Map getActiveSessionInfo() { - return Map.of(); + Map result = new HashMap<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //监测的数据库 + String monitorDBNames = serverProperties.getMonitorDBNames(); + //查询活跃连接数 + String activeSessionQuery = "pg_stat_activity_count{datname=~\"("+monitorDBNames+")\", instance=~\""+instance+"\", state=\"active\"} !=0"; + PrometheusResponse response = webClient.get() + .uri(buildUri(url,activeSessionQuery)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result activeSessionInfo = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(activeSessionInfo.getValue())) { + Date date = new Date(activeSessionInfo.getValue().get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(activeSessionInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + result.put("activeSessions", useRate); + } + } + }catch (Exception e){ + log.error("获取数据库活跃连接数信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + + /** + * 获取活跃连接数信息列表 + * @return + */ + @Override + public List> getActiveSessionInfoList(String conditions) { + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //监测的数据库 + String monitorDBNames = serverProperties.getMonitorDBNames(); + //查询数据库活跃连接数 + String activeSessionQuery = "pg_stat_activity_count{datname=~\"("+monitorDBNames+")\", instance=~\""+instance+"\", state=\"active\"} !=0"; + PrometheusDBQueryTypeEnum queryTypeEnum = PrometheusDBQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,activeSessionQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result activeSessionInfoList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(activeSessionInfoList.getValues())) { + List> pointDatas = activeSessionInfoList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("activeSessions", useRate); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取数据库活跃连接数信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; } /** @@ -57,8 +325,83 @@ public class DatabaseMonitorServiceImpl implements DatabaseMonitorService { */ @Override public Map getDeadlocksInfo() { - //irate(pg_stat_database_deadlocks{instance="192.168.186.143:9187", datname=~"postgres"}[5m]) - return Map.of(); + Map result = new HashMap<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询数据库死锁信息 + String deadlocksQuery = "irate(pg_stat_database_deadlocks{instance=\""+instance+"\", datname=~\"postgres\"}[5m])"; + PrometheusResponse response = webClient.get() + .uri(buildUri(url,deadlocksQuery)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result deadlocksInfo = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(deadlocksInfo.getValue())) { + Date date = new Date(deadlocksInfo.getValue().get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(deadlocksInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + result.put("count", useRate); + } + } + }catch (Exception e){ + log.error("获取数据库死锁信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + + /** + * 获取死锁信息 + * + * @return + */ + @Override + public List> getDeadlocksInfoList(String conditions) { + // + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getDbInstance(); + //查询数据库死锁信息 + String deadlocksQuery = "irate(pg_stat_database_deadlocks{instance=\""+instance+"\", datname=~\"postgres\"}[5m])"; + PrometheusDBQueryTypeEnum queryTypeEnum = PrometheusDBQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,deadlocksQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result activeSessionInfoList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(activeSessionInfoList.getValues())) { + List> pointDatas = activeSessionInfoList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double count = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("count", count); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取数据库死锁信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; } /** @@ -67,6 +410,41 @@ public class DatabaseMonitorServiceImpl implements DatabaseMonitorService { */ @Override public List getDatabaseProportionInfo() { - return databaseMonitorMapper.getActiveSessionInfo(); + return databaseMonitorMapper.getDatabaseProportionInfo(); + } + + /** + * 构建URI + * @param url + * @param query + * @return + */ + private URI buildUri(String url, String query){ + URI uri = UriComponentsBuilder.fromHttpUrl(url + "/api/v1/query") + .queryParam("query", query) + .build() + .toUri(); + return uri; + } + + /** + * 构建URI + * @param url + * @param query + * @return + */ + private URI buildUri(String url,String query,Long start,Long end,String step){ + String uriAddr = String.format( + "%s/api/v1/query_range?query=%s&start=%d&end=%d&step=%s", + url, + query, + start, + end, + step + ); + URI uri = UriComponentsBuilder.fromHttpUrl(uriAddr) + .build() + .toUri(); + return uri; } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java index 026cab0..0f94b7c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.constant.enums.PrometheusQueryTypeEnum; +import org.jeecg.common.constant.enums.PrometheusHostQueryTypeEnum; import org.jeecg.common.properties.PrometheusServerProperties; import org.jeecg.modules.monitor.service.HostMonitorService; import org.jeecg.modules.monitor.vo.PrometheusResponse; @@ -32,7 +32,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取CPU信息 */ @Override - public Map getCpuInfo() { + public Map getCpuInfo(String conditions) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 @@ -40,7 +40,9 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //查询CPU利用率 - String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}[15s])))"; + PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); + String exprTime = queryTypeEnum.getExprTime(); + String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}["+exprTime+"])))"; PrometheusResponse response = webClient.get() .uri(buildUri(url,cpuQuery)) .retrieve() @@ -76,11 +78,12 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //查询CPU利用率 - String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}[15s])))"; - PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); long end = Instant.now().getEpochSecond(); long start = end - queryTypeEnum.getLastSecond(); String step = queryTypeEnum.getStep(); + String exprTime = queryTypeEnum.getExprTime(); + String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}["+exprTime+"])))"; PrometheusResponse response = webClient.get() .uri(buildUri(url,cpuQuery,start,end,step)) .retrieve() @@ -228,7 +231,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { String instance = serverProperties.getInstance(); //使用率 String usageRateQuery = "(1 - (node_memory_MemAvailable_bytes{instance=\""+instance+"\"} / node_memory_MemTotal_bytes{instance=\""+instance+"\"})) * 100"; - PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); long end = Instant.now().getEpochSecond(); long start = end - queryTypeEnum.getLastSecond(); String step = queryTypeEnum.getStep(); @@ -296,15 +299,17 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取网络信息 */ @Override - public Map getNetworkInfo() { + public Map getNetworkInfo(String conditions) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); + PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); + String exprTime = queryTypeEnum.getExprTime(); //接收带宽 (Kbps) - String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}["+exprTime+"]) * 8 / 1000"; PrometheusResponse receiveKbpsResponse = webClient.get() .uri(buildUri(url,receiveKbpsQuery)) .retrieve() @@ -324,7 +329,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { } //发送带宽 (Kbps) - String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}["+exprTime+"]) * 8 / 1000"; PrometheusResponse transmitKbpsResponse = webClient.get() .uri(buildUri(url,transmitKbpsQuery)) .retrieve() @@ -362,12 +367,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //构建查询参数 - PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); long end = Instant.now().getEpochSecond(); long start = end - queryTypeEnum.getLastSecond(); String step = queryTypeEnum.getStep(); + String exprTime = queryTypeEnum.getExprTime(); //接收带宽 (Kbps) - String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}["+exprTime+"]) * 8 / 1000"; PrometheusResponse receiveKbpsResponse = webClient.get() .uri(buildUri(url,receiveKbpsQuery,start,end,step)) .retrieve() @@ -394,7 +400,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { } //发送带宽 (Kbps) - String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}["+exprTime+"]) * 8 / 1000"; PrometheusResponse transmitKbpsResponse = webClient.get() .uri(buildUri(url,transmitKbpsQuery,start,end,step)) .retrieve() @@ -493,10 +499,4 @@ public class HostMonitorServiceImpl implements HostMonitorService { .toUri(); return uri; } - - //&start=%d&end=%d&step=%s - public static void main(String[] args) { - Date date = new Date(1758868629*1000L); - System.out.println(DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); - } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index b67be6e..01507c1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -65,8 +65,7 @@ public class SysBaseApiImpl implements ISysBaseAPI { if (oConvertUtils.isEmpty(username)) { return null; } - LoginUser user = authUserService.getEncodeUserInfo(username); - return user; + return authUserService.getEncodeUserInfo(username); } @Override diff --git a/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java b/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java index 97068f0..2918a7a 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/controller/WeatherDataController.java @@ -43,7 +43,7 @@ public class WeatherDataController { @AutoLog(value = "分页查询气象文件数据") @Operation(summary = "分页查询气象文件数据") @GetMapping("page") - public Result page(PageRequest pageRequest, String fileExt, Integer dataSource, + public Result page(PageRequest pageRequest, String fileExt, String dataSource, @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) { IPage page = weatherDataService.page(pageRequest,fileExt,dataSource,startDate,endDate); @@ -67,9 +67,10 @@ public class WeatherDataController { public Result uploadFile(FileVo fileVo){ if (!fileVo.getFileExt().equals(WeatherFileSuffixEnum.GRIB.getValue()) && !fileVo.getFileExt().equals(WeatherFileSuffixEnum.GRIB2.getValue())){ throw new RuntimeException("不支持当前上传的文件类型!"); + }else{ + FileUploadResultVo resultVo = weatherDataService.uploadFile(fileVo); + return Result.ok(resultVo); } - FileUploadResultVo resultVo = weatherDataService.uploadFile(fileVo); - return Result.ok(resultVo); } /** @@ -113,36 +114,34 @@ public class WeatherDataController { public static void main(String[] args) { //reftime_ISO - String filePath = "F:\\工作\\五木\\放射性核素监测数据综合分析及氙本底源解析系统\\其他资料\\气象数据\\中国CRA40再分析数据\\CRA40\\20250524\\CRA40_AVO_2025052418_GLB_0P25_HOUR_V1_0_0.grib2"; - String filePath1 = "F:\\工作\\五木\\放射性核素监测数据综合分析及氙本底源解析系统\\其他资料\\气象数据\\中国CRA40再分析数据\\GRAPES\\2024110100\\Z_NAFP_C_BABJ_20241101000000_P_NWPC-GRAPES-GFS-HNEHE-00000.grib2"; - String filePath2 = "F:\\工作\\五木\\放射性核素监测数据综合分析及氙本底源解析系统\\其他资料\\气象数据\\盘古模型预测数据\\panguweather_2025073106.grib"; -// try { -// String md5 = calculateMD5(filePath); -// System.out.println("MD5: " + md5); -// } catch (IOException e) { -// e.printStackTrace(); -// } - try (NetcdfFile ncFile = NetcdfFile.open(filePath2)) { + String filePath = "F:\\工作\\五木\\放射性核素监测数据综合分析及氙本底源解析系统\\其他资料\\气象数据\\盘古模型预测数据\\panguweather_2025073118.grib"; + try { + String md5 = calculateMD5(filePath); + System.out.println("MD5: " + md5); + } catch (IOException e) { + e.printStackTrace(); + } +// try (NetcdfFile ncFile = NetcdfFile.open(filePath2)) { // Variable variable = ncFile.findVariable("reftime_ISO"); // if (variable != null) { // Array data = variable.read(); // System.out.println(variable.getFullName()); // System.out.println(data.getObject(0)); // } - int index = 0; - for (Variable variable : ncFile.getVariables()) { - if (variable != null) { - Array data = variable.read(); - System.out.println(variable.getFullName()); - System.out.println(data); - if (index == 7) { - break; - } - index++; - } - } - }catch (Exception e){ - - } +// int index = 0; +// for (Variable variable : ncFile.getVariables()) { +// if (variable != null) { +// Array data = variable.read(); +// System.out.println(variable.getFullName()); +// System.out.println(data); +// if (index == 7) { +// break; +// } +// index++; +// } +// } +// }catch (Exception e){ +// +// } } } diff --git a/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java b/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java index 2fe6b56..268ae94 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/service/WeatherDataService.java @@ -27,7 +27,7 @@ public interface WeatherDataService { * @param endDate * @return */ - IPage page(PageRequest pageRequest, String fileExt, Integer dataSource, LocalDate startDate, LocalDate endDate); + IPage page(PageRequest pageRequest, String fileExt, String dataSource, LocalDate startDate, LocalDate endDate); /** * 验证文件是否存在 diff --git a/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java b/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java index 5cccd4b..150e048 100644 --- a/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java +++ b/jeecg-module-weather/src/main/java/org/jeecg/service/impl/WeatherDataServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -46,6 +47,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.stream.Collectors; import static org.jeecg.common.constant.LatLonSizeConstants.*; @@ -161,7 +163,7 @@ public class WeatherDataServiceImpl extends ServiceImpl page(PageRequest pageRequest, String fileExt, Integer dataSource, LocalDate startDate, LocalDate endDate) { + public IPage page(PageRequest pageRequest, String fileExt, String dataSource, LocalDate startDate, LocalDate endDate) { LocalDateTime startTime = null; if(Objects.nonNull(startDate)){ startTime = LocalDateTime.of(startDate.getYear(), startDate.getMonth(), startDate.getDayOfMonth(), 0, 0, 0); @@ -171,7 +173,14 @@ public class WeatherDataServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Objects.nonNull(dataSource),WeatherData::getDataSource, dataSource); + List dataSources = null; + if (StringUtils.isNotBlank(dataSource)) { + dataSources = Arrays.stream(dataSource.split(",")).map(Integer::parseInt).collect(Collectors.toList()); + }else { + dataSources = new ArrayList<>(); + dataSources.add(Integer.parseInt(fileExt)); + } + queryWrapper.in(CollUtil.isNotEmpty(dataSources),WeatherData::getDataSource,dataSources); queryWrapper.between((Objects.nonNull(startTime) && Objects.nonNull(endTime)),WeatherData::getDataStartTime,startTime,endTime); queryWrapper.eq(StringUtils.isNotBlank(fileExt),WeatherData::getFileExt, fileExt); queryWrapper.select(WeatherData::getId,WeatherData::getFileName,WeatherData::getFileSize,WeatherData::getDataSource,WeatherData::getFileExt,WeatherData::getDataStartTime,WeatherData::getFilePath); @@ -249,6 +258,7 @@ public class WeatherDataServiceImpl extends ServiceImpl0){ //获取文件数据开始日期 - String reftime = NcUtil.getReftime(dataFile.getAbsolutePath()); - if(StringUtils.isBlank(reftime)) { - throw new JeecgFileUploadException("解析气象文件起始时间数据异常,此文件可能损坏"); - } - Instant instant = Instant.parse(reftime); - LocalDateTime utcDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("UTC")); +// String reftime = "2025-10-16 00:00:00";//NcUtil.getReftime(dataFile.getAbsolutePath()); +// if(StringUtils.isBlank(reftime)) { +// throw new JeecgFileUploadException("解析气象文件起始时间数据异常,此文件可能损坏"); +// } +// Instant instant = Instant.parse(reftime); +// LocalDateTime utcDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("UTC")); + LocalDateTime utcDateTime = LocalDateTime.now(); queryResult.setDataStartTime(utcDateTime); //计算文件大小M BigDecimal divideVal = new BigDecimal("1024"); diff --git a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml index bdc144f..b80a0dc 100644 --- a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml +++ b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml @@ -42,7 +42,7 @@ spring: #Sentinel配置 sentinel: transport: - dashboard: jeecg-boot-sentinel:9000 + dashboard: stas-sentinel:9000 # 支持链路限流 web-context-unify: false filter: diff --git a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/logback-spring.xml index 50b9921..ba9919d 100644 --- a/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-gateway-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-gateway-%d{yyyy-MM-dd}.%i.log 30 10MB diff --git a/jeecg-server-cloud/jeecg-data-analyze-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-data-analyze-start/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..bc6e647 --- /dev/null +++ b/jeecg-server-cloud/jeecg-data-analyze-start/src/main/resources/logback-spring.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n + + + + + + + + ${LOG_HOME}/stas-data-analyze-%d{yyyy-MM-dd}.%i.log + + 30 + 10MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-event-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-event-start/src/main/resources/logback-spring.xml index 60d4c7d..a77b6cf 100644 --- a/jeecg-server-cloud/jeecg-event-start/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-event-start/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-event-%d{yyyy-MM-dd}.%i.log 30 10MB @@ -28,37 +28,6 @@ - - - - - ERROR - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html - - 30 - 10MB - - - - %p%d%msg%M%F{32}%L - - - - @@ -70,8 +39,6 @@ - - \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-source-rebuild-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-source-rebuild-start/src/main/resources/logback-spring.xml index 60d4c7d..70b1aea 100644 --- a/jeecg-server-cloud/jeecg-source-rebuild-start/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-source-rebuild-start/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-source-build-%d{yyyy-MM-dd}.%i.log 30 10MB @@ -28,37 +28,6 @@ - - - - - ERROR - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html - - 30 - 10MB - - - - %p%d%msg%M%F{32}%L - - - - @@ -70,8 +39,6 @@ - - \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-sync-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-sync-start/src/main/resources/logback-spring.xml index 60d4c7d..5e425ae 100644 --- a/jeecg-server-cloud/jeecg-sync-start/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-sync-start/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-sync-%d{yyyy-MM-dd}.%i.log 30 10MB @@ -28,37 +28,6 @@ - - - - - ERROR - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html - - 30 - 10MB - - - - %p%d%msg%M%F{32}%L - - - - @@ -70,8 +39,6 @@ - - \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/logback-spring.xml index 60d4c7d..ea4848c 100644 --- a/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-system-%d{yyyy-MM-dd}.%i.log 30 10MB @@ -28,37 +28,6 @@ - - - - - ERROR - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html - - 30 - 10MB - - - - %p%d%msg%M%F{32}%L - - - - @@ -70,8 +39,6 @@ - - \ No newline at end of file diff --git a/jeecg-server-cloud/jeecg-weather-start/src/main/resources/application.yml b/jeecg-server-cloud/jeecg-weather-start/src/main/resources/application.yml index 829895b..43589f7 100644 --- a/jeecg-server-cloud/jeecg-weather-start/src/main/resources/application.yml +++ b/jeecg-server-cloud/jeecg-weather-start/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8002 + port: 8003 spring: application: diff --git a/jeecg-server-cloud/jeecg-weather-start/src/main/resources/logback-spring.xml b/jeecg-server-cloud/jeecg-weather-start/src/main/resources/logback-spring.xml index 60d4c7d..e6e7456 100644 --- a/jeecg-server-cloud/jeecg-weather-start/src/main/resources/logback-spring.xml +++ b/jeecg-server-cloud/jeecg-weather-start/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ - + @@ -17,7 +17,7 @@ - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log + ${LOG_HOME}/stas-weather-%d{yyyy-MM-dd}.%i.log 30 10MB @@ -28,37 +28,6 @@ - - - - - ERROR - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html - - 30 - 10MB - - - - %p%d%msg%M%F{32}%L - - - - @@ -70,8 +39,6 @@ - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0a15346..1a33da6 100644 --- a/pom.xml +++ b/pom.xml @@ -535,7 +535,7 @@ dev - jeecg-boot-nacos:8848 + stas-nacos:8848 @@ -565,7 +565,7 @@ test - jeecg-boot-nacos:8848 + stas-nacos:8848 @@ -583,7 +583,7 @@ prod - jeecg-boot-nacos:8848 + stas-nacos:8848