Browse Source

feate: 添加新温湿度设备

jackzhou 5 tháng trước cách đây
mục cha
commit
c783180056
19 tập tin đã thay đổi với 518 bổ sung41 xóa
  1. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java
  2. 29 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/MonitorDataProcessor.java
  3. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/AbsRenkeMonitorDataProcessor.java
  4. 85 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/DefaultWifiLowTempRecorderProcessor.java
  5. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiCO2TempHumidityProcessor.java
  6. 60 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiCO2TempHumidityProcessor2000P.java
  7. 1 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessor1.java
  8. 3 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorBattery2.java
  9. 3 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorBattery4.java
  10. 62 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorY2.java
  11. 61 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorY4.java
  12. 22 7
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/handler/impl/RenKeColdChainDataHandler.java
  13. 15 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/controller/AppController.java
  14. 2 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDeviceQueryParams.java
  15. 74 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDeviceUpdateParam.java
  16. 23 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppIndicatorQueryParams.java
  17. 27 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/SensorIndicator.java
  18. 35 16
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java
  19. 12 8
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/enums/DeviceModelEnum.java

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java

@@ -36,7 +36,7 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         // 获取传感器阈值配置
         SensorThreshold threshold = thresholdService.getThresholdBySensorId(sensorData.getDeviceId(), sensorData.getRoads());
         if (threshold == null) {
-            log.warn("没有找到设备 {} 的阈值配置", sensorData.getDeviceId());
+            log.warn("没有找到设备编号: {} 的设置阈值配置,跳过预警", sensorData.getDeviceId());
             return false;
         }
         MonitorTargetRegion monitorTargetRegion = threshold.getMonitorTargetRegion();

+ 29 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/MonitorDataProcessor.java

@@ -8,11 +8,40 @@ package vip.xiaonuo.coldchain.core.service.dataprocess.dataclean;
  * @date 2024/11/19 23:17:28
  */
 public interface MonitorDataProcessor<T> {
+
+    String RS_WS_DEFAULT = "RS_WIFI_DEFAULT";
+    /**
+     * 不带电池的二氧化碳
+     */
     String RS_CO2WS_WIFI_2_5000P = "RS-CO2WS-WIFI-2-5000P";
+    /**
+     * 不带电池正负200°一路
+     */
     String RS_WD_WIFI_6_5WL = "RS-WD-WIFI-6-5WL";
+    /**
+     * 带电池2路
+     */
     String RS_WS_WIFI5_C3_Y2 = "RS-WS-WIFI5-C3-Y2";
+
+    /**
+     * 带电池4路
+     */
     String RS_WS_WIFI5_C3_Y4 = "RS-WS-WIFI5-C3-Y4";
 
+    /**
+     * 不带电池2路
+     */
+    String RS_WS_WIFI5_Y2 = "RS-WS-WIFI-Y2";
+    /**
+     * 不带电池4路
+     */
+    String RS_WS_WIFI5_Y4 = "RS-WS-WIFI-Y4";
+
+    /**
+     * 不带电话CO2,只有二氧化碳指标
+     */
+    String RS_CO2WS_WIFI_2_2000P = "RS-CO2-2000P-WIFI-2-C3";
+
     Boolean processData(T data);
 
     /**

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/AbsRenkeMonitorDataProcessor.java

@@ -209,7 +209,7 @@ public abstract class AbsRenkeMonitorDataProcessor implements MonitorDataProcess
             if (b) {
                 RenKeColdChainMessageData renKeColdChainMessageData = new RenKeColdChainMessageData();
                 renKeColdChainMessageData.setDeviceId(Integer.parseInt(sensorData.getDeviceId()));
-                log.info("发送心跳。。。。。。。。。。。。。。。。。。。。。。。。");
+//                log.info("发送心跳。。。。。。。。。。。。。。。。。。。。。。。。");
                 heartbeat(renKeColdChainMessageData);
             } else {
                 log.error("发布传感器数据事件失败: {}", sensorData);

+ 85 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/DefaultWifiLowTempRecorderProcessor.java

@@ -0,0 +1,85 @@
+package vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+import rk.netDevice.sdk.p2.NodeData;
+import rk.netDevice.sdk.p2.RealTimeData;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.MonitorDataProcessor;
+import vip.xiaonuo.coldchain.core.service.dataprocess.model.PowerEnum;
+import vip.xiaonuo.coldchain.modular.monitordevice.enums.DeviceModelEnum;
+
+import java.util.List;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/20 21:25:30
+ */
+@Slf4j
+@Component(MonitorDataProcessor.RS_WS_DEFAULT)
+public class DefaultWifiLowTempRecorderProcessor extends AbsRenkeMonitorDataProcessor {
+    public DefaultWifiLowTempRecorderProcessor(ApplicationEventPublisher applicationEventPublisher) {
+        super(applicationEventPublisher);
+    }
+
+    @Override
+    List<SensorData> transRealTimeData2SensorDatas(@NotNull RealTimeData data) {
+        List<NodeData> nodeList = data.getNodeList();
+        List<SensorData> resultList = Lists.newArrayList();
+
+        if (nodeList == null || nodeList.isEmpty()) {
+            log.warn("节点数据为空,无法转换为传感器数据");
+            return resultList;
+        }
+
+        final int numNodes = nodeList.size();
+
+        // 如果节点数少于3个,记录警告并设置默认值
+        if (numNodes <= 2) {
+            log.warn("节点数量不足,实际节点数为 {},需至少 3 个", numNodes);
+            for (NodeData nodeData : nodeList) {
+                SensorData sensorData = createSensorData(data, nodeData, null, null);
+                resultList.add(sensorData);
+            }
+            return resultList;
+        }
+
+        // 提取倒数第二路和最后一路的特殊数据
+        final float battery = nodeList.get(numNodes - 2).getTem();
+        final String plugInStatus = nodeList.get(numNodes - 1).getTem() < 1 ? PowerEnum.AC.getCode() : PowerEnum.DC.getCode();
+
+        // 处理前面所有节点的数据
+        for (int i = 0; i < numNodes - 2; i++) {
+            NodeData nodeData = nodeList.get(i);
+            SensorData sensorData = createSensorData(data, nodeData, battery, plugInStatus);
+            resultList.add(sensorData);
+        }
+
+        return resultList;
+    }
+
+    /**
+     * 创建单个 SensorData 对象
+     */
+    private SensorData createSensorData(RealTimeData data, NodeData nodeData, Float battery, String plugInStatus) {
+        SensorData sensorData = defaultSensorData(data);
+        sensorData.setTemperature(floatValue(nodeData.getTem()));
+        sensorData.setHumidity(floatValue(nodeData.getHum()));
+        sensorData.setRoads(nodeData.getNodeId());
+        sensorData.setBattery(battery);
+        sensorData.setPlugInStatus(plugInStatus);
+        return sensorData;
+    }
+
+
+    @Override
+    DeviceModelEnum deviceModel() {
+        return DeviceModelEnum.WIFI_MULTI_PROBE_TEMP_HUMIDITY_RECORDER_1;
+    }
+}

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiCO2TempHumidityProcessor.java

@@ -45,6 +45,8 @@ public class WifiCO2TempHumidityProcessor extends AbsRenkeMonitorDataProcessor {
         SensorData sensorData = defaultSensorData(data);
         sensorData.setTemperature(floatValue(nodeData.getTem()));
         sensorData.setHumidity(floatValue(nodeData.getHum()));
+        sensorData.setRoads(1);
+        sensorData.setPlugInStatus(plugInStatus);
         // c02含量
         sensorData.setCo2(CO2);
         return Lists.newArrayList(sensorData);

+ 60 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiCO2TempHumidityProcessor2000P.java

@@ -0,0 +1,60 @@
+package vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+import rk.netDevice.sdk.p2.NodeData;
+import rk.netDevice.sdk.p2.RealTimeData;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.MonitorDataProcessor;
+import vip.xiaonuo.coldchain.modular.monitordevice.enums.DeviceModelEnum;
+
+import java.util.List;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/20 21:24:17
+ */
+@Slf4j
+@Component(MonitorDataProcessor.RS_CO2WS_WIFI_2_2000P)
+public class WifiCO2TempHumidityProcessor2000P extends AbsRenkeMonitorDataProcessor {
+    public WifiCO2TempHumidityProcessor2000P(ApplicationEventPublisher applicationEventPublisher) {
+        super(applicationEventPublisher);
+    }
+
+    @Override
+    List<SensorData> transRealTimeData2SensorDatas(@NotNull RealTimeData data) {
+        List<NodeData> nodeList = data.getNodeList();
+        List<SensorData> resultList = Lists.newArrayList();
+        if (nodeList == null || nodeList.isEmpty()) {
+            log.warn("节点数据为空,无法转换为传感器数据");
+            return resultList;
+        }
+        for (NodeData nodeData : nodeList) {
+            SensorData sensorData = createSensorData(data, nodeData, null, null);
+            resultList.add(sensorData);
+        }
+        return resultList;
+    }
+
+    private SensorData createSensorData(RealTimeData data, NodeData nodeData, Float battery, String plugInStatus) {
+        SensorData sensorData = defaultSensorData(data);
+        sensorData.setTemperature(floatValue(nodeData.getTem()) != null ? floatValue(nodeData.getTem()) * 10 : null);
+        sensorData.setHumidity(null);
+        sensorData.setRoads(nodeData.getNodeId());
+        sensorData.setBattery(battery);
+        sensorData.setPlugInStatus(plugInStatus);
+        return sensorData;
+    }
+
+
+    @Override
+    DeviceModelEnum deviceModel() {
+        return DeviceModelEnum.RS_CO2WS_WIFI_2_2000P;
+    }
+}

+ 1 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessor1.java

@@ -42,6 +42,7 @@ public class WifiLowTempRecorderProcessor1 extends AbsRenkeMonitorDataProcessor
         sensorData.setTemperature(floatValue(nodeData.getTem()));
         sensorData.setHumidity(floatValue(nodeData.getHum()));
         sensorData.setPlugInStatus(plugInStatus);
+        sensorData.setRoads(1);
         return Lists.newArrayList(sensorData);
     }
 

+ 3 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessor2.java → snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorBattery2.java

@@ -23,8 +23,8 @@ import java.util.List;
  */
 @Slf4j
 @Component(MonitorDataProcessor.RS_WS_WIFI5_C3_Y2)
-public class WifiLowTempRecorderProcessor2 extends AbsRenkeMonitorDataProcessor {
-    public WifiLowTempRecorderProcessor2(ApplicationEventPublisher applicationEventPublisher) {
+public class WifiLowTempRecorderProcessorBattery2 extends AbsRenkeMonitorDataProcessor {
+    public WifiLowTempRecorderProcessorBattery2(ApplicationEventPublisher applicationEventPublisher) {
         super(applicationEventPublisher);
     }
 
@@ -47,7 +47,7 @@ public class WifiLowTempRecorderProcessor2 extends AbsRenkeMonitorDataProcessor
             sensorData.setTemperature(floatValue(nodeData.getTem()));
             sensorData.setHumidity(floatValue(nodeData.getHum()));
             //设置路数
-            sensorData.setRoads((i + 1));
+            sensorData.setRoads(nodeData.getNodeId());
             sensorData.setBattery(battery);//第三路温度表示电量
             sensorData.setPlugInStatus(plugInStatus);//第三路温度表示电量
             rlt.add(sensorData);

+ 3 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessor4.java → snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorBattery4.java

@@ -23,8 +23,8 @@ import java.util.List;
  */
 @Slf4j
 @Component(MonitorDataProcessor.RS_WS_WIFI5_C3_Y4)
-public class WifiLowTempRecorderProcessor4 extends AbsRenkeMonitorDataProcessor {
-    public WifiLowTempRecorderProcessor4(ApplicationEventPublisher applicationEventPublisher) {
+public class WifiLowTempRecorderProcessorBattery4 extends AbsRenkeMonitorDataProcessor {
+    public WifiLowTempRecorderProcessorBattery4(ApplicationEventPublisher applicationEventPublisher) {
         super(applicationEventPublisher);
     }
 
@@ -46,7 +46,7 @@ public class WifiLowTempRecorderProcessor4 extends AbsRenkeMonitorDataProcessor
             sensorData.setTemperature(floatValue(nodeData.getTem()));
             sensorData.setHumidity(floatValue(nodeData.getHum()));
             //设置路数
-            sensorData.setRoads((i + 1));
+            sensorData.setRoads(nodeData.getNodeId());
             sensorData.setBattery(battery);
             sensorData.setPlugInStatus(plugInStatus);
             rlt.add(sensorData);

+ 62 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorY2.java

@@ -0,0 +1,62 @@
+package vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+import rk.netDevice.sdk.p2.NodeData;
+import rk.netDevice.sdk.p2.RealTimeData;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.MonitorDataProcessor;
+import vip.xiaonuo.coldchain.core.service.dataprocess.model.PowerEnum;
+import vip.xiaonuo.coldchain.modular.monitordevice.enums.DeviceModelEnum;
+
+import java.util.List;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/20 21:25:30
+ */
+@Slf4j
+@Component(MonitorDataProcessor.RS_WS_WIFI5_Y2)
+public class WifiLowTempRecorderProcessorY2 extends AbsRenkeMonitorDataProcessor {
+    public WifiLowTempRecorderProcessorY2(ApplicationEventPublisher applicationEventPublisher) {
+        super(applicationEventPublisher);
+    }
+
+    List<SensorData> transRealTimeData2SensorDatas(@NotNull RealTimeData data) {
+        List<NodeData> nodeList = data.getNodeList();
+        final int numNodes = nodeList.size();
+        if (numNodes < 3) {
+            log.error("数据节点数量不够,需要2个节点,但只有{}个", nodeList.size());
+            return null;
+        }
+        List<SensorData> rlt = Lists.newArrayList();
+        // 倒数第二路的温度的值  是电池的电量
+        final float battery = nodeList.get(numNodes - 2).getTem();
+        // 最后一路的温度的值0=电源供电  100 电池供电
+        final String plugInStatus = nodeList.get(numNodes - 1).getTem() < 1 ? PowerEnum.AC.getCode() : PowerEnum.DC.getCode();
+        //前面两路的温湿度
+        for (int i = 0; i < 2; i++) {
+            NodeData nodeData = nodeList.get(i);
+            SensorData sensorData = defaultSensorData(data);
+            sensorData.setTemperature(floatValue(nodeData.getTem()));
+            sensorData.setHumidity(floatValue(nodeData.getHum()));
+            //设置路数
+            sensorData.setRoads(nodeData.getNodeId());
+            sensorData.setBattery(battery);//第三路温度表示电量
+            sensorData.setPlugInStatus(plugInStatus);//第三路温度表示电量
+            rlt.add(sensorData);
+        }
+        return rlt;
+    }
+
+    @Override
+    DeviceModelEnum deviceModel() {
+        return DeviceModelEnum.RS_WS_WIFI5_Y2;
+    }
+}

+ 61 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiLowTempRecorderProcessorY4.java

@@ -0,0 +1,61 @@
+package vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+import rk.netDevice.sdk.p2.NodeData;
+import rk.netDevice.sdk.p2.RealTimeData;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.service.dataprocess.dataclean.MonitorDataProcessor;
+import vip.xiaonuo.coldchain.core.service.dataprocess.model.PowerEnum;
+import vip.xiaonuo.coldchain.modular.monitordevice.enums.DeviceModelEnum;
+
+import java.util.List;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/20 21:25:30
+ */
+@Slf4j
+@Component(MonitorDataProcessor.RS_WS_WIFI5_Y4)
+public class WifiLowTempRecorderProcessorY4 extends AbsRenkeMonitorDataProcessor {
+    public WifiLowTempRecorderProcessorY4(ApplicationEventPublisher applicationEventPublisher) {
+        super(applicationEventPublisher);
+    }
+
+    List<SensorData> transRealTimeData2SensorDatas(@NotNull RealTimeData data) {
+        List<NodeData> nodeList = data.getNodeList();
+        final int numNodes = nodeList.size();
+        if (numNodes < 6) {
+            log.error("数据节点数量不够,需要6个节点,但只有{}个", nodeList.size());
+            return null;
+        }
+        List<SensorData> rlt = Lists.newArrayList();
+        // 倒数第二路的温度的值  是电池的电量
+        final float battery = nodeList.get(numNodes - 2).getTem();
+        // 最后一路的温度的值0=电源供电  100 电池供电
+        final String plugInStatus = nodeList.get(numNodes - 1).getTem() < 1 ? PowerEnum.AC.getCode() : PowerEnum.DC.getCode();
+        for (int i = 0; i < 4; i++) {
+            NodeData nodeData = nodeList.get(i);
+            SensorData sensorData = defaultSensorData(data);
+            sensorData.setTemperature(floatValue(nodeData.getTem()));
+            sensorData.setHumidity(floatValue(nodeData.getHum()));
+            //设置路数
+            sensorData.setRoads(nodeData.getNodeId());
+            sensorData.setBattery(battery);
+            sensorData.setPlugInStatus(plugInStatus);
+            rlt.add(sensorData);
+        }
+        return rlt;
+    }
+
+    @Override
+    DeviceModelEnum deviceModel() {
+        return DeviceModelEnum.RS_WS_WIFI5_Y4;
+    }
+}

+ 22 - 7
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/handler/impl/RenKeColdChainDataHandler.java

@@ -43,25 +43,40 @@ public class RenKeColdChainDataHandler extends AbstractColdChainDataHandler<RenK
     }
 
     private boolean handleData(Integer deviceId, RenKeColdChainMessageData renKeColdChainMessageData) {
+        // 转换 deviceId 为字符串
         final String deviceIdStr = String.valueOf(deviceId);
+        // 从缓存中获取设备模型名称
         final String modelName = monitorDeviceCache.getDeviceModel(deviceIdStr);
+        // 默认处理器
+        AbsRenkeMonitorDataProcessor monitorDataProcessor =
+                (AbsRenkeMonitorDataProcessor) monitorDataProcessorMap.get(MonitorDataProcessor.RS_WS_DEFAULT);
+        // 如果模型名称非空,则尝试获取对应处理器
         if (StrUtil.isNotBlank(modelName)) {
             renKeColdChainMessageData.setModelName(modelName);
-            AbsRenkeMonitorDataProcessor monitorDataProcessor =
+            AbsRenkeMonitorDataProcessor specificProcessor =
                     (AbsRenkeMonitorDataProcessor) monitorDataProcessorMap.get(modelName);
-
-            if (monitorDataProcessor != null) {
-                monitorDataProcessor.processData(renKeColdChainMessageData);
+            if (specificProcessor != null) {
+                monitorDataProcessor = specificProcessor;
             } else {
-                log.warn("No processor found for model: " + modelName);
+                log.warn("No processor found for modelName: {}, using default processor.", modelName);
             }
         } else {
-            log.warn("Model name not found for deviceId: " + deviceIdStr);
+            log.warn("Model name not found for deviceId: {}, using default processor.", deviceIdStr);
+        }
+        // 如果处理器存在,则处理数据,否则记录警告
+        if (monitorDataProcessor != null) {
+            log.info("Using processor [{}] to process data for deviceId: {}",
+                    monitorDataProcessor.getModelName(), deviceIdStr);
+            monitorDataProcessor.processData(renKeColdChainMessageData);
+            return Boolean.TRUE;
+        } else {
+            log.error("No valid data processor found for deviceId: {}", deviceIdStr);
+            return Boolean.FALSE;
         }
-        return Boolean.TRUE;
     }
 
 
+
     @Override
     public void login(RenKeColdChainMessageData data) {
         processMonitorData(data, "login");

+ 15 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/controller/AppController.java

@@ -68,6 +68,14 @@ public class AppController {
         return CommonResult.data(appDeviceService.queryDataByDeviceIdAndRoads(appDeviceQueryParams));
     }
 
+    @PostMapping("/device/indicators")
+    @Operation(summary = "查询采集设备数据")
+    public CommonResult<SensorIndicator> indicators(@RequestBody @Valid AppIndicatorQueryParams appDeviceQueryParams) {
+        SensorIndicator sensorIndicator = appDeviceService.indicators(appDeviceQueryParams);
+        return CommonResult.data(sensorIndicator);
+    }
+
+
     @PostMapping("/device/alarm")
     @Operation(summary = "更新设备预警")
     public CommonResult<Boolean> deviceAlarm(@RequestBody @Valid AppDeviceAlarmParam appDeviceAlarmParam) {
@@ -75,6 +83,13 @@ public class AppController {
         return CommonResult.result(alarm, alarm);
     }
 
+    @PostMapping("/device/update")
+    @Operation(summary = "更新设备点位信息")
+    public CommonResult<Boolean> deviceUpdate(@RequestBody @Valid AppDeviceUpdateParam appDeviceAlarmParam) {
+        Boolean alarm = appDeviceService.updateDeviceInfo(appDeviceAlarmParam);
+        return CommonResult.result(alarm, alarm);
+    }
+
     // 下载设备数据接口(POST)
     @PostMapping("/device/download/{deviceCode}")
     @Operation(summary = "下载采集器设备数据接口")

+ 2 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDeviceQueryParams.java

@@ -27,10 +27,10 @@ public class AppDeviceQueryParams {
     private Double minCo2Level;          // 最低二氧化碳浓度
     private Double maxCo2Level;          // 最高二氧化碳浓度
     private Metric metric;  // 使用 Metric 枚举
-
+    @Schema(description = "设备序列号")
     private String sensorCode;
+    @Schema(description = "设备路数")
     private Integer sensorRoute;
-
     @Schema(description = "聚合维度")
     private String aggregationWindow;
 

+ 74 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDeviceUpdateParam.java

@@ -0,0 +1,74 @@
+package vip.xiaonuo.coldchain.modular.app.param;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/17 22:30:15
+ */
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AppDeviceUpdateParam {
+    @Schema(description = "监控点位编号")
+    @NotBlank(message = "监控点位编号")
+    private String monitorTargetRegionId;
+
+    @Schema(description = "监控点位名称")
+    @NotBlank(message = "监控点位名称")
+    private String name;
+    /**
+     * 温度报警上限 temperature humidity co2
+     */
+    @Schema(description = "温度报警上限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float temperatureUp;
+    /**
+     * 温度报警下限
+     */
+    @Schema(description = "温度报警下限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float temperatureDown;
+
+    /**
+     * 湿度报警上限 temperature humidity co2
+     */
+
+    @Schema(description = "湿度报警上限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float humidityUp;
+    /**
+     * 湿度报警下限
+     */
+    @Schema(description = "湿度报警下限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float humidityDown;
+
+    /**
+     * 二氧化碳报警上限 temperature humidity co2
+     */
+    @Schema(description = "二氧化碳报警上限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float co2Up;
+    /**
+     * 二氧化碳报警下限
+     */
+    @Schema(description = "二氧化碳报警下限")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    private Float co2Down;
+
+    @Schema(description = "勿扰开始时间")
+    private String ignoreStartTime;
+
+    @Schema(description = "勿扰结束时间")
+    private String ignoreEndTime;
+}

+ 23 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppIndicatorQueryParams.java

@@ -0,0 +1,23 @@
+package vip.xiaonuo.coldchain.modular.app.param;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/17 22:38:25
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class AppIndicatorQueryParams {
+    @Schema(description = "设备序列号")
+    private String sensorCode;
+    @Schema(description = "设备路数")
+    private Integer sensorRoute;
+    @Schema(description = "查询月度2024-12")
+    private String month;
+
+}

+ 27 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/SensorIndicator.java

@@ -0,0 +1,27 @@
+package vip.xiaonuo.coldchain.modular.app.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/12/12 14:56:07
+ */
+@Data
+public class SensorIndicator {
+    @Schema(description = "采集数据总数")
+    private long totalCollected;
+    @Schema(description = "预警总数")
+    private int totalWarnings;
+    @Schema(description = "异常总数")
+    private int totalAbnormal;
+    @Schema(description = "采集数据总数同比变化")
+    private String collectedChange;
+    @Schema(description = "预警同比变化")
+    private String warningsChange;
+    @Schema(description = "异常同比变化")
+    private String abnormalChange;
+}

+ 35 - 16
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java

@@ -154,18 +154,13 @@ public class AppDeviceService {
         AggregationWindow window = null;
         String aggregationWindow = appDeviceQueryParams.getAggregationWindow();
         if (StrUtil.isBlank(aggregationWindow)) {
-            window = AggregationWindow.determineAggregationWindow(
-                    appDeviceQueryParams.getStartTime(),
-                    appDeviceQueryParams.getEndTime());
+            window = AggregationWindow.determineAggregationWindow(appDeviceQueryParams.getStartTime(), appDeviceQueryParams.getEndTime());
         } else {
             // 如果用户选择了聚合维度,但不在枚举中,使用默认的聚合窗口
             window = AggregationWindow.fromString(aggregationWindow);
         }
         // 查找监控目标区域
-        MonitorTargetRegion monitorTarget = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(
-                appDeviceQueryParams.getSensorCode(),
-                appDeviceQueryParams.getSensorRoute()
-        );
+        MonitorTargetRegion monitorTarget = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(appDeviceQueryParams.getSensorCode(), appDeviceQueryParams.getSensorRoute());
         // 如果监控目标区域为空,直接返回空的结果
         if (Objects.isNull(monitorTarget)) {
             return getEmptyResult();
@@ -177,8 +172,7 @@ public class AppDeviceService {
             return getEmptyResult();
         }
         // 定义传感器类型与数据类型的映射关系
-        Map<String, String> sensorMapping = Map.of(
-                "w", "temperature", // 温度
+        Map<String, String> sensorMapping = Map.of("w", "temperature", // 温度
                 "s", "humidity",    // 湿度
                 "c", "co2"          // 二氧化碳
         );
@@ -193,13 +187,7 @@ public class AppDeviceService {
             // 如果传感器类型包含对应的字符
             if (sensorType.toLowerCase().contains(key)) {
                 // 获取相应的数据
-                List<SensorData> sensorData = monitorDeviceService.queryDataByDeviceIdAndRoads(
-                        appDeviceQueryParams.getSensorCode(),
-                        appDeviceQueryParams.getSensorRoute(),
-                        appDeviceQueryParams.getStartTime(),
-                        appDeviceQueryParams.getEndTime(),
-                        dataType, finalWindow
-                );
+                List<SensorData> sensorData = monitorDeviceService.queryDataByDeviceIdAndRoads(appDeviceQueryParams.getSensorCode(), appDeviceQueryParams.getSensorRoute(), appDeviceQueryParams.getStartTime(), appDeviceQueryParams.getEndTime(), dataType, finalWindow);
 
                 // 处理数据并设置到对应的字段
                 SensorEchartData echartData = SensorDataTransformer.processSensorData(sensorData, dataType, finalWindow1);
@@ -243,5 +231,36 @@ public class AppDeviceService {
         }
     }
 
+    public SensorIndicator indicators(AppIndicatorQueryParams appDeviceQueryParams) {
+        // 假设上月数据
+        int lastMonthCollected = 100000;  // 上月采集数据总数
+        int lastMonthWarnings = 100;   // 上月预警总数
+        int lastMonthAbnormal = 150;   // 上月异常总数
+        // 计算本月数据
+        int totalCollected = (int) (lastMonthCollected * 1.30); // 同比增长30%
+        int totalWarnings = (int) (lastMonthWarnings * 0.95);   // 同比减少5%
+        int totalAbnormal = (int) (lastMonthAbnormal * 1.10);   // 同比增长10%
+        // 创建响应对象
+        SensorIndicator response = new SensorIndicator();
+        response.setTotalCollected(totalCollected);
+        response.setTotalWarnings(totalWarnings);
+        response.setTotalAbnormal(totalAbnormal);
+        response.setCollectedChange("+30%");
+        response.setWarningsChange("-5%");
+        response.setAbnormalChange("+10%");
+        return response;
+    }
 
+    public Boolean updateDeviceInfo(AppDeviceUpdateParam appDeviceAlarmParam) {
+        MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.getById(appDeviceAlarmParam.getMonitorTargetRegionId());
+        if (monitorTargetRegion == null) {
+            return false;
+        }
+        if (StrUtil.isNotBlank(appDeviceAlarmParam.getName())) {
+            monitorTargetRegion.setName(appDeviceAlarmParam.getName());
+        }
+        monitorTargetRegion.setIgnoreStartTime(appDeviceAlarmParam.getIgnoreStartTime());
+        monitorTargetRegion.setIgnoreEndTime(appDeviceAlarmParam.getIgnoreEndTime());
+        return monitorTargetRegionService.updateById(monitorTargetRegion);
+    }
 }

+ 12 - 8
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/enums/DeviceModelEnum.java

@@ -17,7 +17,11 @@ public enum DeviceModelEnum {
     WIFI_CO2_TEMP_HUMIDITY_TRANSCEIVER(MonitorDataProcessor.RS_CO2WS_WIFI_2_5000P, "WIFI型CO2温湿度变迭器"),
     WIFI_MULTI_PROBE_TEMP_HUMIDITY_RECORDER_1(MonitorDataProcessor.RS_WD_WIFI_6_5WL, "WIFI型超宽低温记录仪"),
     WIFI_MULTI_PROBE_TEMP_HUMIDITY_RECORDER_2(MonitorDataProcessor.RS_WS_WIFI5_C3_Y2, "WIFI多探头温湿度变迭记录仪(2路)"),
-    WIFI_MULTI_PROBE_TEMP_HUMIDITY_RECORDER_4(MonitorDataProcessor.RS_WS_WIFI5_C3_Y4, "WIFI多探头温湿度变迭记录仪(4路)");
+    WIFI_MULTI_PROBE_TEMP_HUMIDITY_RECORDER_4(MonitorDataProcessor.RS_WS_WIFI5_C3_Y4, "WIFI多探头温湿度变迭记录仪(4路)"),
+    RS_WS_WIFI5_Y2(MonitorDataProcessor.RS_WS_WIFI5_Y2, "WIFI多探头温湿度不带电池(2路)"),
+    RS_WS_WIFI5_Y4(MonitorDataProcessor.RS_WS_WIFI5_Y4, "WIFI多探头温湿度不带电池(4路)"),
+    RS_CO2WS_WIFI_2_2000P(MonitorDataProcessor.RS_CO2WS_WIFI_2_2000P, "WIFI单二氧化碳指标不带温湿度"),
+    DEFAULT(MonitorDataProcessor.RS_WS_DEFAULT, "默认温湿度处理");
 
     private final String deviceCode;  // 设备型号
     private final String deviceName;  // 设备名称
@@ -37,24 +41,24 @@ public enum DeviceModelEnum {
     public static String getDeviceNameByCode(String deviceCode) {
         for (DeviceModelEnum model : values()) {
             if (model.getDeviceCode().equals(deviceCode)) {
-                return model.getDeviceName();
+                return model.getDeviceCode();
             }
         }
-        return null;  // 返回 null 或者可以抛出异常,依据业务需求
+        return DEFAULT.getDeviceCode();  // 返回 null 或者可以抛出异常,依据业务需求
     }
 
     /**
      * 根据设备名称获取设备型号
      *
-     * @param deviceName 设备名称
+     * @param deviceCode 设备名称
      * @return 设备型号
      */
-    public static String getDeviceCodeByName(String deviceName) {
+    public static DeviceModelEnum getDeviceCodeByCode(String deviceCode) {
         for (DeviceModelEnum model : values()) {
-            if (model.getDeviceName().equals(deviceName)) {
-                return model.getDeviceCode();
+            if (model.getDeviceCode().equalsIgnoreCase(deviceCode)) {
+                return model;
             }
         }
-        return null;  // 返回 null 或者可以抛出异常,依据业务需求
+        return DEFAULT;  // 返回 null 或者可以抛出异常,依据业务需求
     }
 }