From 4d8177d07e14f6fc3a3a2d5f0973f2d4828e434d Mon Sep 17 00:00:00 2001 From: zch Date: Wed, 15 Apr 2026 14:32:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BD=8D=E7=A7=BB=E4=B8=93=E5=B1=9E):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BD=8D=E7=A7=BB=E8=B4=A8=E9=87=8F=E9=A1=B5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VibrationQualityPageVo.java | 12 ++ .../report/mapper/VibrationBoardMapper.java | 22 ++++ .../ems/report/VibrationBoardMapper.xml | 108 ++++++++++++++++++ 3 files changed, 142 insertions(+) diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/vo/vibrationboard/VibrationQualityPageVo.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/vo/vibrationboard/VibrationQualityPageVo.java index 0cc4cc4..3df18f4 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/vo/vibrationboard/VibrationQualityPageVo.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/vo/vibrationboard/VibrationQualityPageVo.java @@ -24,6 +24,18 @@ public class VibrationQualityPageVo { /** 总覆盖率,与总览页复用同一计算逻辑保证数值一致 */ private BigDecimal coverageRate; + /** 位移有效样本数,供位移专属质量页直接展示 */ + private Integer validCount; + + /** 位移无效样本数,便于快速识别缺采规模 */ + private Integer invalidCount; + + /** 位移有效率,本轮与 coverageRate 保持同一口径 */ + private BigDecimal validRate; + + /** 位移无效率 = invalidCount / sampleCount */ + private BigDecimal invalidRate; + /** 各振动指标的独立有效采集率,拆到每个维度便于发现“某类传感器批量失效” */ private List metricQualityItems; diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/mapper/VibrationBoardMapper.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/mapper/VibrationBoardMapper.java index 6e2ab2c..002c92b 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/mapper/VibrationBoardMapper.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/mapper/VibrationBoardMapper.java @@ -41,4 +41,26 @@ public interface VibrationBoardMapper { */ List selectSampledData(@Param("tableNames") List tableNames, @Param("query") VibrationBoardQueryBo query); + + /** + * 查询位移质量页原始样本。 + *

与分析类页面不同,这里不能提前按位移有效值过滤, + * 否则 sampleCount 会被错误缩小,导致质量页覆盖率虚高。

+ * + * @param tableNames 已经通过白名单正则校验的日分表名列表 + * @param query 查询参数(时间范围、设备列表、抽样间隔) + */ + List selectQualityRawData(@Param("tableNames") List tableNames, + @Param("query") VibrationBoardQueryBo query); + + /** + * 查询位移质量页抽样样本。 + *

当抽样间隔 > 1 时仍在 DB 层完成降采样,但不会提前按位移有效值过滤, + * 以保证质量页分母口径稳定。

+ * + * @param tableNames 已经通过白名单正则校验的日分表名列表 + * @param query 查询参数(时间范围、设备列表、抽样间隔) + */ + List selectQualitySampledData(@Param("tableNames") List tableNames, + @Param("query") VibrationBoardQueryBo query); } diff --git a/ruoyi-ems/src/main/resources/mapper/ems/report/VibrationBoardMapper.xml b/ruoyi-ems/src/main/resources/mapper/ems/report/VibrationBoardMapper.xml index 4dc7a88..c8f8ec1 100644 --- a/ruoyi-ems/src/main/resources/mapper/ems/report/VibrationBoardMapper.xml +++ b/ruoyi-ems/src/main/resources/mapper/ems/report/VibrationBoardMapper.xml @@ -100,6 +100,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + t.recodeTime >= #{query.beginRecordTime} + AND t.recodeTime <= #{query.endRecordTime} + + + AND t.monitorId = #{query.monitorId} + + + AND t.monitorId IN + + #{monitorId} + + + + + + + SELECT * + FROM ( + + SELECT + + FROM ${tableName} t + INNER JOIN ems_base_monitor_info ebmi + ON t.monitorId = ebmi.monitor_code + AND ebmi.monitor_type = 10 + + + + + ) vibration_quality_data + ORDER BY vibration_quality_data.monitorId ASC, vibration_quality_data.recodeTime ASC, vibration_quality_data.objid ASC + + + + + WITH sampled AS ( + + SELECT + , + ROW_NUMBER() OVER ( + PARTITION BY t.monitorId, + + + CAST(TIMESTAMPDIFF(MINUTE, '2000-01-01 00:00:00', t.recodeTime) / #{query.samplingInterval} AS SIGNED) + + + CAST(EXTRACT(EPOCH FROM (t.recodeTime - TIMESTAMP '2000-01-01 00:00:00')) / 60 / #{query.samplingInterval} AS BIGINT) + + + CAST(DATEDIFF(MINUTE, '2000-01-01 00:00:00', t.recodeTime) / #{query.samplingInterval} AS BIGINT) + + + ORDER BY t.recodeTime DESC, t.objid DESC + ) AS rn + FROM ${tableName} t + INNER JOIN ems_base_monitor_info ebmi + ON t.monitorId = ebmi.monitor_code + AND ebmi.monitor_type = 10 + + + + + ) + SELECT + objid, + monitorId, + monitor_code, + monitor_name, + temperature, + humidity, + illuminance, + noise, + concentration, + vibration_speed, + vibration_displacement, + vibration_acceleration, + vibration_temp, + collectTime, + recodeTime + FROM sampled + WHERE rn = 1 + ORDER BY monitorId ASC, recodeTime ASC, objid ASC + + + + + + + +