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 + + + + + + + +