Jelajahi Sumber

fix:修复环境设备数据导出异常
fix:修复环境设备趋势图显示数据返回异常
fix:修复设施监控没有数据
fix:修复环境设备实时数据缺失

黄渊昊 3 minggu lalu
induk
melakukan
7404de3290
25 mengubah file dengan 1843 tambahan dan 109 penghapusan
  1. 20 15
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/bean/influxdb/SensorData.java
  2. 130 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/JfcloudSensorDataService.java
  3. 67 28
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiEvnSevenInOne.java
  4. 38 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/SensorDataTransformer.java
  5. 28 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/SensorEchartDataResult.java
  6. 871 7
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java
  7. 6 5
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/controller/BiController.java
  8. 12 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/mapper/BiMapper.java
  9. 291 4
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/service/BiService.java
  10. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java
  11. 104 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/entity/Trend.java
  12. 200 41
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/service/impl/MonitorNoticeServiceImpl.java
  13. 3 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/MonitorTargetMapper.java
  14. 16 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/mapping/MonitorTargetMapper.xml
  15. 6 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetPageParam.java
  16. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java
  17. 16 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java
  18. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java
  19. 8 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java
  20. 3 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/entity/TargetRoom.java
  21. 3 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/param/TargetRoomAddParam.java
  22. 3 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/param/TargetRoomEditParam.java
  23. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/TargetRoomService.java
  24. 9 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/impl/TargetRoomServiceImpl.java
  25. 2 0
      snowy-web-app/src/main/resources/application.properties

+ 20 - 15
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/bean/influxdb/SensorData.java

@@ -48,7 +48,7 @@ public class SensorData extends JfcloudInFluxEntity {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float co2;
 
-    @Column(name = "pm2.5")
+    @Column(name = "pm25")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float pm25;
@@ -67,62 +67,62 @@ public class SensorData extends JfcloudInFluxEntity {
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     private Integer illuminance;
 
-    @Column(name = "TVOC")
+    @Column(name = "tvoc")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float tvoc;
 
-    @Column(name = "CH4O")
+    @Column(name = "ch2o")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
-    private Float ch4o;
+    private Float ch2o;
 
-    @Column(name = "O3")
+    @Column(name = "o3")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float o3;
 
-    @Column(name = "O2")
+    @Column(name = "o2")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float o2;
 
-    @Column(name = "H2S")
+    @Column(name = "h2s")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float h2s;
 
-    @Column(name = "CH4")
+    @Column(name = "ch4")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float ch4;
 
-    @Column(name = "CO")
+    @Column(name = "co")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float co;
 
-    @Column(name = "NO2")
+    @Column(name = "no2")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float no2;
 
-    @Column(name = "SO2")
+    @Column(name = "so2")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float so2;
 
-    @Column(name = "H2")
+    @Column(name = "h2")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float h2;
 
-    @Column(name = "NH3")
+    @Column(name = "nh3")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float nh3;
 
-    @Column(name = "dB")
+    @Column(name = "db")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float dB;
@@ -132,7 +132,7 @@ public class SensorData extends JfcloudInFluxEntity {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float odor;
 
-    @Column(name = "TPS")
+    @Column(name = "tsp")
     @JsonSerialize(using = FloatNullToDashSerializer.class)
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float tsp;
@@ -142,6 +142,11 @@ public class SensorData extends JfcloudInFluxEntity {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float smoke;
 
+    @Column(name = "n2")
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float n2;
+
     @Column(name = "battery")
     @JsonSerialize(using = FloatNullToDashSerializer.class)  // 使用自定义序列化器
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")

+ 130 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/JfcloudSensorDataService.java

@@ -57,7 +57,134 @@ public class JfcloudSensorDataService extends JfcloudFluxDataService<SensorData>
     }
 
     public String buildLatestSensorDataQuery(String bucketName, String deviceId, String roads) {
-        return String.format("temperature = from(bucket: \"%s\")\n" + "  |> range(start: -1h)  // Hardcoded time range for the last hour\n" + "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"temperature\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" + "  |> last()\n" + "humidity = from(bucket: \"%s\")\n" + "  |> range(start: -1h)\n" + "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"humidity\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" + "  |> last()\n" + "co2 = from(bucket: \"%s\")\n" + "  |> range(start: -1h)\n" + "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"co2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" + "  |> last()\n" + "plugInStatus = from(bucket: \"%s\")\n" + "  |> range(start: -1h)\n" + "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"plugInStatus\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" + "  |> last()\n" + "battery = from(bucket: \"%s\")\n" + "  |> range(start: -1h)\n" + "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"battery\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" + "  |> last()\n" + "union(tables: [temperature, humidity, co2, plugInStatus, battery])\n" + "  |> pivot(rowKey: [\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\")\n" + "  |> yield(name: \"latest_data\")", bucketName, deviceId, roads, bucketName, deviceId, roads, bucketName, deviceId, roads, bucketName, deviceId, roads, bucketName, deviceId, roads);
+        return String.format("temperature = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)  // Hardcoded time range for the last hour\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"temperature\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "humidity = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"humidity\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "co2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"co2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "pm25 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"pm25\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "pm10 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"pm10\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "no2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"no2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "o3 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"o3\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "o2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"o2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "so2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"so2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "tvoc = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"tvoc\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "co = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"co\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "h2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"h2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "ch2o = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"ch2o\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "h2s = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"h2s\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "db = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"db\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "pressure = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"pressure\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "illuminance = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"illuminance\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "ch4 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"ch4\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "nh3 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"nh3\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "odor = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"odor\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "tsp = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"tsp\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "smoke = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"smoke\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "n2 = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"n2\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "plugInStatus = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"plugInStatus\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "battery = from(bucket: \"%s\")\n" +
+                        "  |> range(start: -1h)\n" +
+                        "  |> filter(fn: (r) => r[\"_measurement\"] == \"sensor_data\" and r[\"_field\"] == \"battery\" and r[\"device_id\"] == \"%s\" and r[\"roads\"] == \"%s\")\n" +
+                        "  |> last()\n" +
+                        "union(tables: [temperature, humidity, co2, pm25, pm10, no2, o3,  o2, so2, tvoc, co, h2, ch2o, h2s, db, pressure, illuminance, ch4, nh3, odor, tsp, smoke, n2, plugInStatus, battery])" +
+                        "  |> pivot(rowKey: [\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\")\n" +
+                        "  |> yield(name: \"latest_data\")",
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads,
+                bucketName, deviceId, roads);
     }
 
 
@@ -142,7 +269,6 @@ public class JfcloudSensorDataService extends JfcloudFluxDataService<SensorData>
     }
 
 
-
     /**
      * Converts a time string in "yyyy-MM-dd HH:mm:ss" format to ISO 8601 format.
      *
@@ -303,7 +429,8 @@ public class JfcloudSensorDataService extends JfcloudFluxDataService<SensorData>
     public long getCurrentMonthOfflineCount(String sensorCode, String sensorRoute) {
         long l = getAlarmCount(sensorCode, sensorRoute, SensorAlarmType.SENSOR_OFF_LINE, false)
                 + getAlarmCount(sensorCode, sensorRoute, SensorAlarmType.SENSOR_ON_LINE, false);
-        return l;    }
+        return l;
+    }
 
     public long getLastMonthOfflineCount(String sensorCode, String sensorRoute) {
         long l = getAlarmCount(sensorCode, sensorRoute, SensorAlarmType.SENSOR_OFF_LINE, true)

+ 67 - 28
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/service/dataprocess/dataclean/impl/WifiEvnSevenInOne.java

@@ -14,7 +14,7 @@ import java.util.List;
 
 @Slf4j
 @Component(MonitorDataProcessor.RS_MG111_WIFI_1)
-public class WifiEvnSevenInOne extends AbsRenkeMonitorDataProcessor{
+public class WifiEvnSevenInOne extends AbsRenkeMonitorDataProcessor {
     public WifiEvnSevenInOne(ApplicationEventPublisher applicationEventPublisher) {
         super(applicationEventPublisher);
     }
@@ -22,34 +22,73 @@ public class WifiEvnSevenInOne extends AbsRenkeMonitorDataProcessor{
     @Override
     List<SensorData> transRealTimeData2SensorDatas(RealTimeData data) {
         List<NodeData> nodeList = data.getNodeList();
-        final int numNodes = nodeList.size();
-        if (numNodes < 7) {
-            log.error("数据节点数量不够,需要7个节点,但只有{}个", nodeList.size());
-            return null;
-        }
         SensorData sensorData = defaultSensorData(data);
-        sensorData.setPm10(floatValue(nodeList.get(0).getTem()));
-        sensorData.setPm25(floatValue(nodeList.get(0).getHum()));
-        sensorData.setHumidity(floatValue(nodeList.get(1).getHum() / 10));
-        sensorData.setTemperature(floatValue(nodeList.get(1).getTem() / 10));
-        sensorData.setPressure(floatValue(nodeList.get(2).getTem() / 10));
-        sensorData.setIlluminance((nodeList.get(3).getSignedInt32Value()));
-        sensorData.setTvoc(floatValue(nodeList.get(4).getHum()));
-        sensorData.setCo2(floatValue(nodeList.get(5).getTem()));
-        sensorData.setCh4o(floatValue(nodeList.get(6).getTem() / 100));
-        sensorData.setO3(floatValue(nodeList.get(7).getTem()));
-        sensorData.setO2(floatValue(nodeList.get(8).getTem()));
-        sensorData.setSo2(floatValue(nodeList.get(9).getTem()));
-        sensorData.setCh4(floatValue(nodeList.get(10).getTem()));
-        sensorData.setCo(floatValue(nodeList.get(11).getTem()));
-        sensorData.setNo2(floatValue(nodeList.get(12).getTem()));
-        sensorData.setSo2(floatValue(nodeList.get(13).getTem()));
-        sensorData.setH2(floatValue(nodeList.get(14).getTem()));
-        sensorData.setNh3(floatValue(nodeList.get(15).getTem()));
-        sensorData.setDB(floatValue(nodeList.get(16).getTem()));
-        sensorData.setOdor(floatValue(nodeList.get(17).getTem()));
-        sensorData.setTsp(floatValue(nodeList.get(18).getTem()));
-        sensorData.setSmoke(floatValue(nodeList.get(19).getTem()));
+        for (NodeData nodeData : nodeList) {
+            switch (nodeData.getNodeId()) {
+                case 1:
+                    sensorData.setPm10(floatValue(nodeData.getTem()));
+                    sensorData.setPm25(floatValue(nodeData.getHum()));
+                    break;
+                case 2:
+                    sensorData.setHumidity(floatValue(nodeData.getHum()));
+                    sensorData.setTemperature(floatValue(nodeData.getTem()));
+                    break;
+                case 3:
+                    sensorData.setPressure(floatValue(nodeData.getTem() / 10));
+                    break;
+                case 4:
+                    sensorData.setIlluminance((nodeData.getSignedInt32Value()));
+                    break;
+                case 5:
+                    sensorData.setTvoc(floatValue(nodeData.getHum()));
+                    break;
+                case 6:
+                    sensorData.setCo2(floatValue(nodeData.getTem()));
+                    break;
+                case 7:
+                    sensorData.setCh2o(floatValue(nodeData.getTem() / 100));
+                    break;
+                case 8:
+                    sensorData.setO3(floatValue(nodeData.getTem()));
+                    break;
+                case 9:
+                    sensorData.setO2(floatValue(nodeData.getTem()));
+                    break;
+                case 10:
+                    sensorData.setH2s(floatValue(nodeData.getTem()));
+                    break;
+                case 11:
+                    sensorData.setCh4(floatValue(nodeData.getTem()));
+                    break;
+                case 12:
+                    sensorData.setCo(floatValue(nodeData.getTem()));
+                    break;
+                case 13:
+                    sensorData.setNo2(floatValue(nodeData.getTem()));
+                    break;
+                case 14:
+                    sensorData.setSo2(floatValue(nodeData.getTem()));
+                    break;
+                case 15:
+                    sensorData.setH2(floatValue(nodeData.getTem()));
+                    break;
+                case 16:
+                    sensorData.setNh3(floatValue(nodeData.getTem()));
+                    break;
+                case 17:
+                    sensorData.setDB(floatValue(nodeData.getTem()));
+                    break;
+                case 18:
+                    sensorData.setOdor(floatValue(nodeData.getTem()));
+                    break;
+                case 19:
+                    sensorData.setTsp(floatValue(nodeData.getTem()));
+                    break;
+                case 20:
+                    sensorData.setSmoke(floatValue(nodeData.getTem()));
+                    break;
+            }
+        }
         return Lists.newArrayList(sensorData);
     }
 

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

@@ -102,6 +102,25 @@ public class SensorDataTransformer {
         if ("temperature".equals(dataType)) return data.getTemperature() != null;
         if ("humidity".equals(dataType)) return data.getHumidity() != null;
         if ("co2".equals(dataType)) return data.getCo2() != null;
+        if ("pm25".equals(dataType)) return data.getPm25() != null;
+        if ("pm10".equals(dataType)) return data.getPm10() != null;
+        if ("no2".equals(dataType)) return data.getNo2() != null;
+        if ("o3".equals(dataType)) return data.getO3() != null;
+        if ("o2".equals(dataType)) return data.getO2() != null;
+        if ("so2".equals(dataType)) return data.getSo2() != null;
+        if ("tvoc".equals(dataType)) return data.getTvoc() != null;
+        if ("co".equals(dataType)) return data.getCo() != null;
+        if ("h2".equals(dataType)) return data.getH2() != null;
+        if ("ch2o".equals(dataType)) return data.getCh2o() != null;
+        if ("h2s".equals(dataType)) return data.getH2s() != null;
+        if ("db".equals(dataType)) return data.getDB() != null;
+        if ("pressure".equals(dataType)) return data.getPressure() != null;
+        if ("illuminance".equals(dataType)) return data.getIlluminance() != null;
+        if ("ch4".equals(dataType)) return data.getCh4() != null;
+        if ("nh3".equals(dataType)) return data.getNh3() != null;
+        if ("odor".equals(dataType)) return data.getOdor() != null;
+        if ("tsp".equals(dataType)) return data.getTsp() != null;
+        if ("smoke".equals(dataType)) return data.getSmoke() != null;
         return false;
     }
 
@@ -110,6 +129,25 @@ public class SensorDataTransformer {
         if ("temperature".equals(dataType)) return data.getTemperature();
         if ("humidity".equals(dataType)) return data.getHumidity();
         if ("co2".equals(dataType)) return data.getCo2();
+        if ("pm25".equals(dataType)) return data.getPm25();
+        if ("pm10".equals(dataType)) return data.getPm10();
+        if ("no2".equals(dataType)) return data.getNo2();
+        if ("o3".equals(dataType)) return data.getO3();
+        if ("o2".equals(dataType)) return data.getO2();
+        if ("so2".equals(dataType)) return data.getSo2();
+        if ("tvoc".equals(dataType)) return data.getTvoc();
+        if ("co".equals(dataType)) return data.getCo();
+        if ("h2".equals(dataType)) return data.getH2();
+        if ("ch2o".equals(dataType)) return data.getCh2o();
+        if ("h2s".equals(dataType)) return data.getH2s();
+        if ("db".equals(dataType)) return data.getDB();
+        if ("pressure".equals(dataType)) return data.getPressure();
+        if ("illuminance".equals(dataType)) return Float.valueOf(data.getIlluminance());
+        if ("ch4".equals(dataType)) return data.getCh4();
+        if ("nh3".equals(dataType)) return data.getNh3();
+        if ("odor".equals(dataType)) return data.getOdor();
+        if ("tsp".equals(dataType)) return data.getTsp();
+        if ("smoke".equals(dataType)) return data.getSmoke();
         return null;
     }
 }

+ 28 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/SensorEchartDataResult.java

@@ -11,7 +11,32 @@ import lombok.Data;
  */
 @Data
 public class SensorEchartDataResult {
-    private SensorEchartData temperature = new SensorEchartData();
-    private SensorEchartData humidity = new SensorEchartData();
-    private SensorEchartData co2 = new SensorEchartData();
+    // 环境类传感器
+    private SensorEchartData temperature = new SensorEchartData();  // 温度 (w)
+    private SensorEchartData humidity = new SensorEchartData();     // 湿度 (s)
+    private SensorEchartData co2 = new SensorEchartData();          // 二氧化碳 (c)
+    private SensorEchartData pm25 = new SensorEchartData();         // PM2.5 (pm25)
+    private SensorEchartData pm10 = new SensorEchartData();         // PM10 (pm10)
+
+    // 气体类传感器
+    private SensorEchartData no2 = new SensorEchartData();         // 二氧化氮 (no2)
+    private SensorEchartData o3 = new SensorEchartData();           // 臭氧 (o3)
+    private SensorEchartData o2 = new SensorEchartData();          // 氧气 (o2)
+    private SensorEchartData so2 = new SensorEchartData();         // 二氧化硫 (so2)
+    private SensorEchartData tvoc = new SensorEchartData();        // 挥发性有机物 (tvoc)
+    private SensorEchartData co = new SensorEchartData();          // 一氧化碳 (co)
+    private SensorEchartData h2 = new SensorEchartData();          // 氢气 (h2)
+    private SensorEchartData ch2o = new SensorEchartData();        // 甲醛 (ch2o)
+    private SensorEchartData h2s = new SensorEchartData();         // 硫化氢 (h2s)
+    private SensorEchartData ch4 = new SensorEchartData();         // 甲烷 (ch4)
+    private SensorEchartData nh3 = new SensorEchartData();         // 氨 (nh3)
+    private SensorEchartData n2 = new SensorEchartData();           //氮气
+
+    // 其他环境指标
+    private SensorEchartData db = new SensorEchartData();      // 噪声 (db)
+    private SensorEchartData pressure = new SensorEchartData();   // 气压 (p)
+    private SensorEchartData illuminance = new SensorEchartData(); // 光照 (i)
+    private SensorEchartData odor = new SensorEchartData();        // 异味 (odor)
+    private SensorEchartData tsp = new SensorEchartData();         // 细颗粒物 (tsp)
+    private SensorEchartData smoke = new SensorEchartData();       // 烟雾 (smoke)
 }

File diff ditekan karena terlalu besar
+ 871 - 7
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java


+ 6 - 5
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/controller/BiController.java

@@ -43,8 +43,8 @@ public class BiController {
     @Operation(summary = "获取大屏的房间列表")
     @SaCheckPermission("/coldchain/targetroom/page")
     @GetMapping("/coldchain/bi/targetroom/list")
-    public CommonResult<List<TargetRoomBiDTO>> listTargetRoom() {
-        return CommonResult.data(biService.listTargetRoom());
+    public CommonResult<List<TargetRoomBiDTO>> listTargetRoom(TargetRoomPageParam targetRoomPageParam) {
+        return CommonResult.data(biService.listTargetRoom(targetRoomPageParam));
     }
 
     /**
@@ -56,10 +56,11 @@ public class BiController {
     @Operation(summary = "获取大屏的房间下设备")
     @SaCheckPermission("/coldchain/monitortarget/page")
     @GetMapping("/coldchain/bi/monitortarget/list")
-    public CommonResult<List<MonitorTargetBiDTO>> listMonitorTarget(@RequestParam String roomId) {
-        MonitorTargetPageParam monitorTargetPageParam = new MonitorTargetPageParam();
+    public CommonResult<Page<MonitorTargetBiDTO>> listMonitorTarget(MonitorTargetPageParam monitorTargetPageParam) {
+/*        MonitorTargetPageParam monitorTargetPageParam = new MonitorTargetPageParam();
         monitorTargetPageParam.setRoomId(roomId);
-        return CommonResult.data(biService.pageMonitorTarget(monitorTargetPageParam).getRecords());
+        monitorTargetPageParam.set*/
+        return CommonResult.data(biService.pageMonitorTargetDevice(monitorTargetPageParam));
     }
 
 

+ 12 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/mapper/BiMapper.java

@@ -0,0 +1,12 @@
+package vip.xiaonuo.coldchain.modular.bi.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+
+import java.util.List;
+
+public interface BiMapper {
+
+
+}

+ 291 - 4
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/service/BiService.java

@@ -12,6 +12,7 @@ import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
 import vip.xiaonuo.coldchain.modular.bi.dto.MonitorTargetBiDTO;
 import vip.xiaonuo.coldchain.modular.bi.dto.MonitorTargetRegionBiDTO;
 import vip.xiaonuo.coldchain.modular.bi.dto.TargetRoomBiDTO;
@@ -22,11 +23,13 @@ import vip.xiaonuo.coldchain.modular.monitornotice.param.RealtimeParam;
 import vip.xiaonuo.coldchain.modular.monitornotice.service.MonitorNoticeService;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
 import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
+import vip.xiaonuo.coldchain.modular.monitortarget.mapper.MonitorTargetMapper;
 import vip.xiaonuo.coldchain.modular.monitortarget.param.MonitorTargetPageParam;
 import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.service.MonitorTargetRegionService;
 import vip.xiaonuo.coldchain.modular.targetroom.entity.TargetRoom;
+import vip.xiaonuo.coldchain.modular.targetroom.param.TargetRoomPageParam;
 import vip.xiaonuo.coldchain.modular.targetroom.service.TargetRoomService;
 import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
@@ -57,13 +60,19 @@ public class BiService {
     @Resource
     private SysOrgService sysOrgService;
 
+    @Resource
+    private MonitorTargetMapper monitorTargetMapper;
+
 
-    public List<TargetRoomBiDTO> listTargetRoom() {
+    public List<TargetRoomBiDTO> listTargetRoom(TargetRoomPageParam targetRoomPageParam) {
         SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
         QueryWrapper<TargetRoom> queryWrapper = new QueryWrapper<TargetRoom>().checkSqlInjection();
+        if (StrUtil.isNotBlank(targetRoomPageParam.getName())) {
+            queryWrapper.lambda().like(TargetRoom::getName, targetRoomPageParam.getName());
+        }
         queryWrapper.lambda().eq(TargetRoom::getCreateOrg, loginUser.getOrgId()).eq(TargetRoom::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
         queryWrapper.lambda().orderByAsc(TargetRoom::getSortCode).orderByAsc(TargetRoom::getId);
-        List<TargetRoom> targetRooms = targetRoomService.list(CommonPageRequest.defaultPage(), queryWrapper);
+        List<TargetRoom> targetRooms = targetRoomService.list(queryWrapper);
         List<TargetRoomBiDTO> targetRoomBiDTOS = BeanUtil.copyToList(targetRooms, TargetRoomBiDTO.class);
         targetRoomBiDTOS.stream().parallel().forEach(r -> {
             //统计在线 离线 总数
@@ -76,8 +85,7 @@ public class BiService {
         return targetRoomBiDTOS;
     }
 
-
-    public Page<MonitorTargetBiDTO> pageMonitorTarget(MonitorTargetPageParam monitorTargetPageParam) {
+    public Page<MonitorTargetBiDTO> pageMonitorTargetDevice(MonitorTargetPageParam monitorTargetPageParam) {
         SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
         QueryWrapper<MonitorTarget> queryWrapper = new QueryWrapper<MonitorTarget>().checkSqlInjection();
         if (StrUtil.isNotBlank(monitorTargetPageParam.getName())) {
@@ -147,6 +155,285 @@ public class BiService {
         return monitorTargetBiDTOPage;
     }
 
+    public Page<MonitorTargetBiDTO> pageMonitorTarget(MonitorTargetPageParam monitorTargetPageParam) {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        Page<MonitorTarget> monitorTargets = new Page<>(monitorTargetPageParam.getCurrent(), monitorTargetPageParam.getSize());
+        List<MonitorTarget> records = new ArrayList<>();
+
+        // 获取原始分页数据
+
+        records = monitorTargetService.getEvnTarget(loginUser.getOrgId(), monitorTargetPageParam.getName(), monitorTargetPageParam.getRoomId());
+
+
+        List<MonitorTargetBiDTO> monitorTargetBiDTOS = BeanUtil.copyToList(records, MonitorTargetBiDTO.class);
+
+        // 按房间ID分组,确保每个房间只保留一个MonitorTargetBiDTO
+        Map<String, MonitorTargetBiDTO> roomTargetMap = new LinkedHashMap<>();
+        for (MonitorTargetBiDTO target : monitorTargetBiDTOS) {
+            String roomId = target.getRoomId();
+            if (!roomTargetMap.containsKey(roomId)) {
+                // 处理合并region的逻辑
+                List<MonitorTargetRegion> regions = monitorTargetRegionService.getRegionListByTargetId(target.getId().toString());
+
+                // 创建一个合并后的region
+                MonitorTargetRegionBiDTO mergedRegion = new MonitorTargetRegionBiDTO();
+                mergedRegion.setName(target.getName());
+                List<Realtime> mergedRealtimes = new ArrayList<>();
+                Realtime mergedRealtime = new Realtime();
+                boolean hasData = false;
+                int onlineNum = 0;
+
+                // 合并所有region的数据
+                for (MonitorTargetRegion region : regions) {
+                    Realtime realtime = monitorNoticeService.getRealtime(new RealtimeParam(region.getMonitorDeviceId(), region.getSensorRoute()));
+
+                    if (realtime != null) {
+                        // 只设置第一个非空值
+                        if (mergedRealtime.getRegionName() == null) {
+                            mergedRealtime.setRegionName(target.getName());
+                            mergedRealtime.setUpdateTime(realtime.getUpdateTime());
+
+                            // 设置阈值信息
+                            mergedRealtime.setTemperatureUp(region.getTemperatureUp());
+                            mergedRealtime.setTemperatureDown(region.getTemperatureDown());
+                            mergedRealtime.setHumidityUp(region.getHumidityUp());
+                            mergedRealtime.setHumidityDown(region.getHumidityDown());
+                            mergedRealtime.setCo2Up(region.getCo2Up());
+                            mergedRealtime.setCo2Down(region.getCo2Down());
+                        }
+
+                        // 合并传感器数据(只设置第一个非空值)
+                        if (mergedRealtime.getSensorData() == null && realtime.getSensorData() != null) {
+                            // 合并各个指标(如果当前mergedRealtime中该指标为null且realtime中有值)
+                            SensorData sensorData = new SensorData();
+                            if (realtime.getSensorData().getTemperature() != null) {
+                                sensorData.setTemperature(realtime.getSensorData().getTemperature());
+                            }
+                            if (realtime.getSensorData().getHumidity() != null) {
+                                sensorData.setHumidity(realtime.getSensorData().getHumidity());
+                            }
+                            if (realtime.getSensorData().getCo2() != null) {
+                                sensorData.setCo2(realtime.getSensorData().getCo2());
+                            }
+                            if (realtime.getSensorData().getPm25() != null) {
+                                sensorData.setPm25(realtime.getSensorData().getPm25());
+                            }
+                            if (realtime.getSensorData().getPm10() != null) {
+                                sensorData.setPm10(realtime.getSensorData().getPm10());
+                            }
+                            if (realtime.getSensorData().getPressure() != null) {
+                                sensorData.setPressure(realtime.getSensorData().getPressure());
+                            }
+                            if (realtime.getSensorData().getIlluminance() != null) {
+                                sensorData.setIlluminance(realtime.getSensorData().getIlluminance());
+                            }
+                            if (realtime.getSensorData().getTvoc() != null) {
+                                sensorData.setTvoc(realtime.getSensorData().getTvoc());
+                            }
+                            if (realtime.getSensorData().getCh2o() != null) {
+                                sensorData.setCh2o(realtime.getSensorData().getCh2o());
+                            }
+                            if (realtime.getSensorData().getO3() != null) {
+                                sensorData.setO3(realtime.getSensorData().getO3());
+                            }
+                            if (realtime.getSensorData().getO2() != null) {
+                                sensorData.setO2(realtime.getSensorData().getO2());
+                            }
+                            if (realtime.getSensorData().getH2s() != null) {
+                                sensorData.setH2s(realtime.getSensorData().getH2s());
+                            }
+                            if (realtime.getSensorData().getCh4() != null) {
+                                sensorData.setCh4(realtime.getSensorData().getCh4());
+                            }
+                            if (realtime.getSensorData().getCo() != null) {
+                                sensorData.setCo(realtime.getSensorData().getCo());
+                            }
+                            if (realtime.getSensorData().getNo2() != null) {
+                                sensorData.setNo2(realtime.getSensorData().getNo2());
+                            }
+                            if (realtime.getSensorData().getSo2() != null) {
+                                sensorData.setSo2(realtime.getSensorData().getSo2());
+                            }
+                            if (realtime.getSensorData().getH2() != null) {
+                                sensorData.setH2s(realtime.getSensorData().getH2());
+                            }
+                            if (realtime.getSensorData().getNh3() != null) {
+                                sensorData.setNh3(realtime.getSensorData().getNh3());
+                            }
+                            if (realtime.getSensorData().getDB() != null) {
+                                sensorData.setDB(realtime.getSensorData().getDB());
+                            }
+                            if (realtime.getSensorData().getOdor() != null) {
+                                sensorData.setOdor(realtime.getSensorData().getOdor());
+                            }
+                            if (realtime.getSensorData().getTsp() != null) {
+                                sensorData.setTsp(realtime.getSensorData().getTsp());
+                            }
+                            if (realtime.getSensorData().getSmoke() != null) {
+                                sensorData.setSmoke(realtime.getSensorData().getSmoke());
+                            }
+                            if (realtime.getSensorData().getBattery() != null) {
+                                sensorData.setBattery(realtime.getSensorData().getBattery());
+                            }
+                            if (realtime.getSensorData().getN2() != null) {
+                                sensorData.setN2(realtime.getSensorData().getN2());
+                            }
+                            mergedRealtime.setSensorData(sensorData);
+                        } else if (mergedRealtime.getSensorData() != null && realtime.getSensorData() != null) {
+                            if (mergedRealtime.getSensorData().getTemperature() == null && realtime.getSensorData().getTemperature() != null) {
+                                mergedRealtime.getSensorData().setTemperature(realtime.getSensorData().getTemperature());
+                            }
+                            if (mergedRealtime.getSensorData().getHumidity() == null && realtime.getSensorData().getHumidity() != null) {
+                                mergedRealtime.getSensorData().setHumidity(realtime.getSensorData().getHumidity());
+                            }
+                            if (mergedRealtime.getSensorData().getCo2() == null && realtime.getSensorData().getCo2() != null) {
+                                mergedRealtime.getSensorData().setCo2(realtime.getSensorData().getCo2());
+                            }
+                            if (mergedRealtime.getSensorData().getPm25() == null && realtime.getSensorData().getPm25() != null) {
+                                mergedRealtime.getSensorData().setPm25(realtime.getSensorData().getPm25());
+                            }
+                            if (mergedRealtime.getSensorData().getPm10() == null && realtime.getSensorData().getPm10() != null) {
+                                mergedRealtime.getSensorData().setPm10(realtime.getSensorData().getPm10());
+                            }
+                            if (mergedRealtime.getSensorData().getPressure() == null && realtime.getSensorData().getPressure() != null) {
+                                mergedRealtime.getSensorData().setPressure(realtime.getSensorData().getPressure());
+                            }
+                            if (mergedRealtime.getSensorData().getIlluminance() == null && realtime.getSensorData().getIlluminance() != null) {
+                                mergedRealtime.getSensorData().setIlluminance(realtime.getSensorData().getIlluminance());
+                            }
+                            if (mergedRealtime.getSensorData().getTvoc() == null && realtime.getSensorData().getTvoc() != null) {
+                                mergedRealtime.getSensorData().setTvoc(realtime.getSensorData().getTvoc());
+                            }
+                            if (mergedRealtime.getSensorData().getCh2o() == null && realtime.getSensorData().getCh2o() != null) {
+                                mergedRealtime.getSensorData().setCh2o(realtime.getSensorData().getCh2o());
+                            }
+                            if (mergedRealtime.getSensorData().getO3() == null && realtime.getSensorData().getO3() != null) {
+                                mergedRealtime.getSensorData().setO3(realtime.getSensorData().getO3());
+                            }
+                            if (mergedRealtime.getSensorData().getO2() == null && realtime.getSensorData().getO2() != null) {
+                                mergedRealtime.getSensorData().setO2(realtime.getSensorData().getO2());
+                            }
+                            if (mergedRealtime.getSensorData().getH2s() == null && realtime.getSensorData().getH2s() != null) {
+                                mergedRealtime.getSensorData().setH2s(realtime.getSensorData().getH2s());
+                            }
+                            if (mergedRealtime.getSensorData().getCh4() == null && realtime.getSensorData().getCh4() != null) {
+                                mergedRealtime.getSensorData().setCh4(realtime.getSensorData().getCh4());
+                            }
+                            if (mergedRealtime.getSensorData().getCo() == null && realtime.getSensorData().getCo() != null) {
+                                mergedRealtime.getSensorData().setCo(realtime.getSensorData().getCo());
+                            }
+                            if (mergedRealtime.getSensorData().getNo2() == null && realtime.getSensorData().getNo2() != null) {
+                                mergedRealtime.getSensorData().setNo2(realtime.getSensorData().getNo2());
+                            }
+                            if (mergedRealtime.getSensorData().getSo2() == null && realtime.getSensorData().getSo2() != null) {
+                                mergedRealtime.getSensorData().setSo2(realtime.getSensorData().getSo2());
+                            }
+                            if (mergedRealtime.getSensorData().getH2() == null && realtime.getSensorData().getH2() != null) {
+                                mergedRealtime.getSensorData().setH2s(realtime.getSensorData().getH2());
+                            }
+                            if (mergedRealtime.getSensorData().getNh3() == null && realtime.getSensorData().getNh3() != null) {
+                                mergedRealtime.getSensorData().setNh3(realtime.getSensorData().getNh3());
+                            }
+                            if (mergedRealtime.getSensorData().getDB() == null && realtime.getSensorData().getDB() != null) {
+                                mergedRealtime.getSensorData().setDB(realtime.getSensorData().getDB());
+                            }
+                            if (mergedRealtime.getSensorData().getOdor() == null && realtime.getSensorData().getOdor() != null) {
+                                mergedRealtime.getSensorData().setOdor(realtime.getSensorData().getOdor());
+                            }
+                            if (mergedRealtime.getSensorData().getTsp() == null && realtime.getSensorData().getTsp() != null) {
+                                mergedRealtime.getSensorData().setTsp(realtime.getSensorData().getTsp());
+                            }
+                            if (mergedRealtime.getSensorData().getSmoke() == null && realtime.getSensorData().getSmoke() != null) {
+                                mergedRealtime.getSensorData().setSmoke(realtime.getSensorData().getSmoke());
+                            }
+                            if (mergedRealtime.getSensorData().getBattery() == null && realtime.getSensorData().getBattery() != null) {
+                                mergedRealtime.getSensorData().setBattery(realtime.getSensorData().getBattery());
+                            }
+                            if (mergedRealtime.getSensorData().getN2() == null && realtime.getSensorData().getN2() != null) {
+                                mergedRealtime.getSensorData().setN2(realtime.getSensorData().getN2());
+                            }
+                        }
+                        if (realtime.getSensorData() != null) {
+                            hasData = true;
+                        }
+                    }
+                }
+
+                if (hasData) {
+                    onlineNum++;
+                }
+
+                mergedRealtimes.add(mergedRealtime);
+                mergedRegion.setRealtimes(mergedRealtimes);
+                mergedRegion.setUpdateTime(mergedRealtime.getUpdateTime());
+
+                // 设置房间信息
+                TargetRoom targetRoom = targetRoomService.getById(target.getRoomId());
+                target.setRoomName(targetRoom.getName());
+
+                // 设置合并后的region
+                target.setRegions(Collections.singletonList(mergedRegion));
+
+                // 设置组织信息
+                SysOrg sysOrg = sysOrgService.getById(target.getCreateOrg());
+                target.setCreateOrgName(Optional.ofNullable(sysOrg).orElse(new SysOrg()).getName());
+
+                // 统计信息
+                target.setAllNum(regions.size());
+                target.setOnlineNum(onlineNum);
+                target.setOfflineNum(target.getAllNum() - target.getOnlineNum());
+
+                // 锁状态
+                String cloudSensorData = CloudApiService.getCloudSensorData(target.getLockNo());
+                target.setLockStatus(cloudSensorData);
+
+                roomTargetMap.put(roomId, target);
+            }
+        }
+
+        List<MonitorTargetBiDTO> mergedList = new ArrayList<>(roomTargetMap.values());
+        Page<MonitorTargetBiDTO> monitorTargetBiDTOPage = convertListToPage(mergedList, monitorTargets);
+
+       /* // 获取合并后的实际记录数
+        int mergedTotal = roomTargetMap.size();
+
+        // 创建分页结果(使用合并后的记录数)
+        Page<MonitorTargetBiDTO> monitorTargetBiDTOPage = new Page<>(monitorTargets.getCurrent(), monitorTargets.getSize(), mergedTotal);
+
+        // 获取当前页的数据(需要考虑分页参数)
+        List<MonitorTargetBiDTO> mergedRecords = new ArrayList<>(roomTargetMap.values());
+        long start = (monitorTargets.getCurrent() - 1) * monitorTargets.getSize();
+        long end = Math.min(start + monitorTargets.getSize(), mergedRecords.size());
+        if (start <= end) {
+            monitorTargetBiDTOPage.setRecords(mergedRecords.subList((int) start, (int) end));
+        } else {
+            monitorTargetBiDTOPage.setRecords(Collections.emptyList());
+        }*/
+
+        return monitorTargetBiDTOPage;
+    }
+
+    public Page<MonitorTargetBiDTO> convertListToPage(List<MonitorTargetBiDTO> fullList, Page<?> sourcePage) {
+        // 计算分页参数
+        int total = fullList.size();
+        long size = sourcePage.getSize();
+        long current = sourcePage.getCurrent();
+
+        // 计算当前页的数据范围
+        int start = (int) ((current - 1) * size);
+        int end = (int) Math.min(start + size, total);
+
+        // 获取当前页的数据子集
+        List<MonitorTargetBiDTO> pageRecords = new ArrayList<>();
+        if (start <= end && start < total) {
+            pageRecords = fullList.subList(start, end);
+        }
+
+        // 构建分页结果对象
+        Page<MonitorTargetBiDTO> resultPage = new Page<>(current, size, total);
+        resultPage.setRecords(pageRecords);
+        return resultPage;
+    }
 
 //    public Page<MonitorTargetBiDTO> pageMonitorTargetSensor(MonitorTargetPageParam monitorTargetPageParam) {
 //        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -624,7 +624,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
 
     private List<Map<String, Object>> getExportData() {
         List<Map<String, Object>> dataList = monitorDeviceMapper.selectDeviceWithRegion();
-        // 动态处理空值(参考网页1[1](@ref))
+        // 动态处理空值
         return dataList.stream().map(map -> {
             map.replaceAll((k, v) -> v == null ? "" : v);
             return map;

+ 104 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/entity/Trend.java

@@ -32,13 +32,117 @@ public class Trend {
     private Float tMax;
     private Float tMin;
     private Float tAvg;
+
+    // 湿度相关统计
     private Float hMax;
     private Float hMin;
     private Float hAvg;
+
+    // 二氧化碳相关统计
     private Float cMax;
     private Float cMin;
     private Float cAvg;
 
+    // PM2.5相关统计
+    private Float pm25Max;
+    private Float pm25Min;
+    private Float pm25Avg;
+
+    // PM10相关统计
+    private Float pm10Max;
+    private Float pm10Min;
+    private Float pm10Avg;
+
+    // 二氧化氮相关统计
+    private Float no2Max;
+    private Float no2Min;
+    private Float no2Avg;
+
+    // 臭氧相关统计
+    private Float o3Max;
+    private Float o3Min;
+    private Float o3Avg;
+
+    // 氧气相关统计
+    private Float o2Max;
+    private Float o2Min;
+    private Float o2Avg;
+
+    // 二氧化硫相关统计
+    private Float so2Max;
+    private Float so2Min;
+    private Float so2Avg;
+
+    // 挥发性有机物相关统计
+    private Float tvocMax;
+    private Float tvocMin;
+    private Float tvocAvg;
+
+    // 一氧化碳相关统计
+    private Float coMax;
+    private Float coMin;
+    private Float coAvg;
+
+    // 氢气相关统计
+    private Float h2Max;
+    private Float h2Min;
+    private Float h2Avg;
+
+    // 甲醛相关统计
+    private Float ch2oMax;
+    private Float ch2oMin;
+    private Float ch2oAvg;
+
+    // 硫化氢相关统计
+    private Float h2sMax;
+    private Float h2sMin;
+    private Float h2sAvg;
+
+    // 噪声相关统计
+    private Float dbMax;
+    private Float dbMin;
+    private Float dbAvg;
+
+    // 气压相关统计
+    private Float pressureMax;
+    private Float pressureMin;
+    private Float pressureAvg;
+
+    // 光照相关统计
+    private Float illuminanceMax;
+    private Float illuminanceMin;
+    private Float illuminanceAvg;
+
+    // 甲烷相关统计
+    private Float ch4Max;
+    private Float ch4Min;
+    private Float ch4Avg;
+
+    // 氨相关统计
+    private Float nh3Max;
+    private Float nh3Min;
+    private Float nh3Avg;
+
+    // 异味相关统计
+    private Float odorMax;
+    private Float odorMin;
+    private Float odorAvg;
+
+    // 细颗粒物相关统计
+    private Float tspMax;
+    private Float tspMin;
+    private Float tspAvg;
+
+    // 烟雾相关统计
+    private Float smokeMax;
+    private Float smokeMin;
+    private Float smokeAvg;
+
+    // 烟雾相关统计
+    private Float n2Max;
+    private Float n2Min;
+    private Float n2Avg;
+
     /**
      * 湿度报警上限 temperature humidity co2
      */

+ 200 - 41
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/service/impl/MonitorNoticeServiceImpl.java

@@ -37,6 +37,8 @@ import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalTime;
 import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -91,7 +93,7 @@ public class MonitorNoticeServiceImpl extends ServiceImpl<MonitorNoticeMapper, M
     public CountWithTime yesterday(String orgId) {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
-        calendar.add(Calendar.DAY_OF_MONTH,-1);
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
         String day = dateFormat.format(calendar.getTime());
         List<String> timePeriodList = new ArrayList<>();
         List<Integer> countList = new ArrayList<>();
@@ -115,7 +117,7 @@ public class MonitorNoticeServiceImpl extends ServiceImpl<MonitorNoticeMapper, M
     public CountWithTime dayBeforeYesterday(String orgId) {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
-        calendar.add(Calendar.DAY_OF_MONTH,-2);
+        calendar.add(Calendar.DAY_OF_MONTH, -2);
         String day = dateFormat.format(calendar.getTime());
         List<String> timePeriodList = new ArrayList<>();
         List<Integer> countList = new ArrayList<>();
@@ -173,57 +175,214 @@ public class MonitorNoticeServiceImpl extends ServiceImpl<MonitorNoticeMapper, M
         appDeviceQueryParams.setSensorRoute(trendParam.getRoads());
         appDeviceQueryParams.setAggregationWindow(trendParam.getAggregationWindow());
         SensorEchartDataResult sensorEchartDataResult = appDeviceService.queryDataByDeviceIdAndRoads(appDeviceQueryParams);
-        List<Float> tList = sensorEchartDataResult.getTemperature().getY();
-        List<Float> hList = sensorEchartDataResult.getHumidity().getY();
-        List<Float> cList = sensorEchartDataResult.getCo2().getY();
+        // 获取各传感器数据列表
+        List<Float> tList = sensorEchartDataResult.getTemperature().getY();    // 温度
+        List<Float> hList = sensorEchartDataResult.getHumidity().getY();       // 湿度
+        List<Float> cList = sensorEchartDataResult.getCo2().getY();            // 二氧化碳
+        List<Float> pm25List = sensorEchartDataResult.getPm25().getY();        // PM2.5
+        List<Float> pm10List = sensorEchartDataResult.getPm10().getY();        // PM10
+        List<Float> no2List = sensorEchartDataResult.getNo2().getY();         // 二氧化氮
+        List<Float> o3List = sensorEchartDataResult.getO3().getY();           // 臭氧
+        List<Float> o2List = sensorEchartDataResult.getO2().getY();           // 氧气
+        List<Float> so2List = sensorEchartDataResult.getSo2().getY();         // 二氧化硫
+        List<Float> vocList = sensorEchartDataResult.getTvoc().getY();         // 挥发性有机物
+        List<Float> coList = sensorEchartDataResult.getCo().getY();           // 一氧化碳
+        List<Float> h2List = sensorEchartDataResult.getH2().getY();           // 氢气
+        List<Float> ch2oList = sensorEchartDataResult.getCh2o().getY();       // 甲醛
+        List<Float> h2sList = sensorEchartDataResult.getH2s().getY();          // 硫化氢
+        List<Float> noiseList = sensorEchartDataResult.getDb().getY();     // 噪声
+        List<Float> pressureList = sensorEchartDataResult.getPressure().getY(); // 气压
+        List<Float> illuminanceList = sensorEchartDataResult.getIlluminance().getY(); // 光照
+        List<Float> ch4List = sensorEchartDataResult.getCh4().getY();         // 甲烷
+        List<Float> nh3List = sensorEchartDataResult.getNh3().getY();         // 氨
+        List<Float> odorList = sensorEchartDataResult.getOdor().getY();       // 异味
+        List<Float> tspList = sensorEchartDataResult.getTsp().getY();         // 细颗粒物
+        List<Float> smokeList = sensorEchartDataResult.getSmoke().getY();     // 烟雾
+        List<Float> n2List = sensorEchartDataResult.getN2().getY();
         Trend trend = BeanUtil.copyProperties(oneByDeviceCodeAndSensorNo, Trend.class);
         DecimalFormat df = new DecimalFormat("#.00");
+        // 处理温度数据
         if (!tList.isEmpty()) {
-            double tMax = tList.stream().mapToDouble(Number::floatValue).max().getAsDouble();
-            double tMin = tList.stream().mapToDouble(Number::floatValue).min().getAsDouble();
-            double tAvg = tList.stream().mapToDouble(Number::floatValue).average().getAsDouble();
-            trend.setTMax((float) tMax);
-            trend.setTMin((float) tMin);
-            trend.setTAvg(Float.parseFloat(df.format(tAvg)));
-            LinkedHashSet<String> x = sensorEchartDataResult.getTemperature().getX();
-            LinkedHashSet<String> newX = new LinkedHashSet<>();
-            x.forEach(xData -> {
-                newX.add(formatTime(xData));
-            });
-            sensorEchartDataResult.setTemperature(new SensorEchartData(newX, tList));
+            processSensorData(tList, sensorEchartDataResult.getTemperature(),
+                    trend::setTMax, trend::setTMin, trend::setTAvg,
+                    (x, y) -> sensorEchartDataResult.setTemperature(new SensorEchartData(x, y)));
         }
+
+        // 处理湿度数据
         if (!hList.isEmpty()) {
-            double hMax = hList.stream().mapToDouble(Number::floatValue).max().getAsDouble();
-            double hMin = hList.stream().mapToDouble(Number::floatValue).min().getAsDouble();
-            double hAvg = hList.stream().mapToDouble(Number::floatValue).average().getAsDouble();
-            trend.setHMax((float) hMax);
-            trend.setHMin((float) hMin);
-            trend.setHAvg((float) hAvg);
-            LinkedHashSet<String> x = sensorEchartDataResult.getHumidity().getX();
-            LinkedHashSet<String> newX = new LinkedHashSet<>();
-            x.forEach(xData -> {
-                newX.add(formatTime(xData));
-            });
-            sensorEchartDataResult.setHumidity(new SensorEchartData(newX, hList));
+            processSensorData(hList, sensorEchartDataResult.getHumidity(),
+                    trend::setHMax, trend::setHMin, trend::setHAvg,
+                    (x, y) -> sensorEchartDataResult.setHumidity(new SensorEchartData(x, y)));
         }
+
+        // 处理CO2数据
         if (!cList.isEmpty()) {
-            double cMax = cList.stream().mapToDouble(Number::floatValue).max().getAsDouble();
-            double cMin = cList.stream().mapToDouble(Number::floatValue).min().getAsDouble();
-            double cAvg = cList.stream().mapToDouble(Number::floatValue).average().getAsDouble();
-            trend.setCMax((float) cMax);
-            trend.setCMin((float) cMin);
-            trend.setCAvg((float) cAvg);
-            LinkedHashSet<String> x = sensorEchartDataResult.getCo2().getX();
-            LinkedHashSet<String> newX = new LinkedHashSet<>();
-            x.forEach(xData -> {
-                newX.add(formatTime(xData));
-            });
-            sensorEchartDataResult.setCo2(new SensorEchartData(newX, cList));
+            processSensorData(cList, sensorEchartDataResult.getCo2(),
+                    trend::setCMax, trend::setCMin, trend::setCAvg,
+                    (x, y) -> sensorEchartDataResult.setCo2(new SensorEchartData(x, y)));
+        }
+
+        // 处理PM2.5数据
+        if (!pm25List.isEmpty()) {
+            processSensorData(pm25List, sensorEchartDataResult.getPm25(),
+                    trend::setPm25Max, trend::setPm25Min, trend::setPm25Avg,
+                    (x, y) -> sensorEchartDataResult.setPm25(new SensorEchartData(x, y)));
+        }
+
+        // 处理PM10数据
+        if (!pm10List.isEmpty()) {
+            processSensorData(pm10List, sensorEchartDataResult.getPm10(),
+                    trend::setPm10Max, trend::setPm10Min, trend::setPm10Avg,
+                    (x, y) -> sensorEchartDataResult.setPm10(new SensorEchartData(x, y)));
+        }
+
+        // 处理NO2数据
+        if (!no2List.isEmpty()) {
+            processSensorData(no2List, sensorEchartDataResult.getNo2(),
+                    trend::setNo2Max, trend::setNo2Min, trend::setNo2Avg,
+                    (x, y) -> sensorEchartDataResult.setNo2(new SensorEchartData(x, y)));
+        }
+
+        // 处理O3数据
+        if (!o3List.isEmpty()) {
+            processSensorData(o3List, sensorEchartDataResult.getO3(),
+                    trend::setO3Max, trend::setO3Min, trend::setO3Avg,
+                    (x, y) -> sensorEchartDataResult.setO3(new SensorEchartData(x, y)));
+        }
+
+        // 处理O2数据
+        if (!o2List.isEmpty()) {
+            processSensorData(o2List, sensorEchartDataResult.getO2(),
+                    trend::setO2Max, trend::setO2Min, trend::setO2Avg,
+                    (x, y) -> sensorEchartDataResult.setO2(new SensorEchartData(x, y)));
+        }
+
+        // 处理SO2数据
+        if (!so2List.isEmpty()) {
+            processSensorData(so2List, sensorEchartDataResult.getSo2(),
+                    trend::setSo2Max, trend::setSo2Min, trend::setSo2Avg,
+                    (x, y) -> sensorEchartDataResult.setSo2(new SensorEchartData(x, y)));
+        }
+
+        // 处理VOC数据
+        if (!vocList.isEmpty()) {
+            processSensorData(vocList, sensorEchartDataResult.getTvoc(),
+                    trend::setTvocMax, trend::setTvocMin, trend::setTvocAvg,
+                    (x, y) -> sensorEchartDataResult.setTvoc(new SensorEchartData(x, y)));
+        }
+
+        // 处理CO数据
+        if (!coList.isEmpty()) {
+            processSensorData(coList, sensorEchartDataResult.getCo(),
+                    trend::setCoMax, trend::setCoMin, trend::setCoAvg,
+                    (x, y) -> sensorEchartDataResult.setCo(new SensorEchartData(x, y)));
+        }
+
+        // 处理H2数据
+        if (!h2List.isEmpty()) {
+            processSensorData(h2List, sensorEchartDataResult.getH2(),
+                    trend::setH2Max, trend::setH2Min, trend::setH2Avg,
+                    (x, y) -> sensorEchartDataResult.setH2(new SensorEchartData(x, y)));
+        }
+
+        // 处理甲醛数据
+        if (!ch2oList.isEmpty()) {
+            processSensorData(ch2oList, sensorEchartDataResult.getCh2o(),
+                    trend::setCh2oMax, trend::setCh2oMin, trend::setCh2oAvg,
+                    (x, y) -> sensorEchartDataResult.setCh2o(new SensorEchartData(x, y)));
+        }
+
+        // 处理H2S数据
+        if (!h2sList.isEmpty()) {
+            processSensorData(h2sList, sensorEchartDataResult.getH2s(),
+                    trend::setH2sMax, trend::setH2sMin, trend::setH2sAvg,
+                    (x, y) -> sensorEchartDataResult.setH2s(new SensorEchartData(x, y)));
         }
+
+        // 处理噪声数据
+        if (!noiseList.isEmpty()) {
+            processSensorData(noiseList, sensorEchartDataResult.getDb(),
+                    trend::setDbMax, trend::setDbMin, trend::setDbAvg,
+                    (x, y) -> sensorEchartDataResult.setDb(new SensorEchartData(x, y)));
+        }
+
+        // 处理气压数据
+        if (!pressureList.isEmpty()) {
+            processSensorData(pressureList, sensorEchartDataResult.getPressure(),
+                    trend::setPressureMax, trend::setPressureMin, trend::setPressureAvg,
+                    (x, y) -> sensorEchartDataResult.setPressure(new SensorEchartData(x, y)));
+        }
+
+        // 处理光照数据
+        if (!illuminanceList.isEmpty()) {
+            processSensorData(illuminanceList, sensorEchartDataResult.getIlluminance(),
+                    trend::setIlluminanceMax, trend::setIlluminanceMin, trend::setIlluminanceAvg,
+                    (x, y) -> sensorEchartDataResult.setIlluminance(new SensorEchartData(x, y)));
+        }
+
+        // 处理甲烷数据
+        if (!ch4List.isEmpty()) {
+            processSensorData(ch4List, sensorEchartDataResult.getCh4(),
+                    trend::setCh4Max, trend::setCh4Min, trend::setCh4Avg,
+                    (x, y) -> sensorEchartDataResult.setCh4(new SensorEchartData(x, y)));
+        }
+
+        // 处理氨数据
+        if (!nh3List.isEmpty()) {
+            processSensorData(nh3List, sensorEchartDataResult.getNh3(),
+                    trend::setNh3Max, trend::setNh3Min, trend::setNh3Avg,
+                    (x, y) -> sensorEchartDataResult.setNh3(new SensorEchartData(x, y)));
+        }
+
+        // 处理异味数据
+        if (!odorList.isEmpty()) {
+            processSensorData(odorList, sensorEchartDataResult.getOdor(),
+                    trend::setOdorMax, trend::setOdorMin, trend::setOdorAvg,
+                    (x, y) -> sensorEchartDataResult.setOdor(new SensorEchartData(x, y)));
+        }
+
+        // 处理TSP数据
+        if (!tspList.isEmpty()) {
+            processSensorData(tspList, sensorEchartDataResult.getTsp(),
+                    trend::setTspMax, trend::setTspMin, trend::setTspAvg,
+                    (x, y) -> sensorEchartDataResult.setTsp(new SensorEchartData(x, y)));
+        }
+
+        // 处理烟雾数据
+        if (!smokeList.isEmpty()) {
+            processSensorData(smokeList, sensorEchartDataResult.getSmoke(),
+                    trend::setSmokeMax, trend::setSmokeMin, trend::setSmokeAvg,
+                    (x, y) -> sensorEchartDataResult.setSmoke(new SensorEchartData(x, y)));
+        }
+
+        if (!n2List.isEmpty()) {
+            processSensorData(n2List, sensorEchartDataResult.getN2(),
+                    trend::setN2Max, trend::setN2Min, trend::setN2Avg,
+                    (x, y) -> sensorEchartDataResult.setN2(new SensorEchartData(x, y)));
+        }
+
+
         trend.setSensorEchartDataResult(sensorEchartDataResult);
         return trend;
     }
 
+    // 通用处理方法
+    private void processSensorData(List<Float> dataList, SensorEchartData sensorData,
+                                   Consumer<Float> setMax, Consumer<Float> setMin, Consumer<Float> setAvg,
+                                   BiConsumer<LinkedHashSet<String>, List<Float>> setResult) {
+        double max = dataList.stream().mapToDouble(Number::floatValue).max().getAsDouble();
+        double min = dataList.stream().mapToDouble(Number::floatValue).min().getAsDouble();
+        double avg = dataList.stream().mapToDouble(Number::floatValue).average().getAsDouble();
+
+        setMax.accept((float) max);
+        setMin.accept((float) min);
+        setAvg.accept((float) avg);
+
+        LinkedHashSet<String> newX = new LinkedHashSet<>();
+        sensorData.getX().forEach(xData -> newX.add(formatTime(xData)));
+        setResult.accept(newX, dataList);
+    }
+
     private String formatTime(String time) {
         String[] split = time.split(" ");
         String regex = "[\u4e00-\u9fa5]";

+ 3 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/MonitorTargetMapper.java

@@ -38,4 +38,7 @@ public interface MonitorTargetMapper extends BaseMapper<MonitorTarget> {
      * @return MonitorTarget 列表
      */
     IPage<MonitorTarget> selectMonitorTargetByPage(Page<MonitorTarget> page, @Param("param") MonitorTargetPageParam monitorTargetPageParam, String searchFlag);
+
+
+    List<MonitorTarget> getEvnTarget(@Param("createOrg") String createOrg, @Param("name") String name, @Param("roomId") String roomId);
 }

+ 16 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/mapping/MonitorTargetMapper.xml

@@ -87,7 +87,21 @@
         </choose>
     </select>
 
-
-
+    <select id="getEvnTarget" resultMap="MonitorTargetResultMap">
+        select t.* from target_room r
+        LEFT JOIN monitor_target t on t.room_Id = r.id
+        LEFT JOIN monitor_target_region tr ON tr.monitor_target_id = t.id
+        WHERE (r.TYPE = '2' or r.TYPE = '3') AND tr.sensor_type = 'D' AND t.create_org = #{createOrg}
+        and tr.create_org = #{createOrg} and r.create_org = #{createOrg}
+        and t.delete_flag = 'NOT_DELETE' and tr.delete_flag = 'NOT_DELETE'
+        and r.delete_flag = 'NOT_DELETE'
+        <if test="name != null and name.trim() != ''">
+            and t.name like concat('%',#{name},'%')
+        </if>
+        <if test="roomId != null and roomId.trim() != ''">
+            and t.room_id = #{roomId}
+        </if>
+        order by t.id asc
+    </select>
 
 </mapper>

+ 6 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetPageParam.java

@@ -86,6 +86,12 @@ public class MonitorTargetPageParam {
     @Schema(description = "冰箱状态")
     private String status;
 
+    /**
+     * 监控设备编码
+     */
+    @Schema(description = "监控设备编码")
+    private String sensorCode;
+
     private String type;
 
     // 计算分页偏移量

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java

@@ -171,4 +171,6 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
      * @return
      */
     void importMonitorDevice(MultipartFile file);
+
+    List<MonitorTarget> getEvnTarget(String orgId, String name, String roomId);
 }

+ 16 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java

@@ -22,6 +22,7 @@ import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
@@ -93,6 +94,14 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         if (StrUtil.isNotBlank(monitorTargetPageParam.getRoomId())) {
             queryWrapper.lambda().eq(MonitorTarget::getRoomId, monitorTargetPageParam.getRoomId());
         }
+        if (StrUtil.isNotBlank(monitorTargetPageParam.getStatus())) {
+            queryWrapper.lambda().eq(MonitorTarget::getStatus, monitorTargetPageParam.getStatus());
+        }
+        if (StrUtil.isNotBlank(monitorTargetPageParam.getSensorCode())) {
+            List<MonitorTargetRegion> regionList = monitorTargetRegionService.getBySensorCode(monitorTargetPageParam.getSensorCode());
+            List<String> list = regionList.stream().map(MonitorTargetRegion::getMonitorTargetId).toList();
+            queryWrapper.lambda().in(MonitorTarget::getId, list);
+        }
         if (ObjectUtil.isAllNotEmpty(monitorTargetPageParam.getSortField(), monitorTargetPageParam.getSortOrder())) {
             CommonSortOrderEnum.validate(monitorTargetPageParam.getSortOrder());
             queryWrapper.orderBy(true, monitorTargetPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), StrUtil.toUnderlineCase(monitorTargetPageParam.getSortField()));
@@ -496,4 +505,11 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         // 入库操作
         monitorTargetAddParamList.forEach(this::addWithRoom);
     }
+
+    @Override
+    public List<MonitorTarget> getEvnTarget(String orgId, String name, String roomId) {
+        return monitorTargetMapper.getEvnTarget(orgId, name, roomId);
+    }
+
+
 }

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java

@@ -118,4 +118,6 @@ public interface MonitorTargetRegionService extends IService<MonitorTargetRegion
     List<String> listByDeviceCodeByTargetId(String targetId);
 
     List<MonitorTargetRegion> myList();
+
+    List<MonitorTargetRegion> getBySensorCode(String sensorCode);
 }

+ 8 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java

@@ -294,6 +294,14 @@ public class MonitorTargetRegionServiceImpl extends ServiceImpl<MonitorTargetReg
         return list(queryWrapper);
     }
 
+    @Override
+    public List<MonitorTargetRegion> getBySensorCode(String sensorCode) {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        LambdaQueryWrapper<MonitorTargetRegion> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(MonitorTargetRegion::getSensorCode, sensorCode).eq(MonitorTargetRegion::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE).eq(MonitorTargetRegion::getCreateOrg, loginUser.getOrgId());
+        return list(queryWrapper);
+    }
+
     private void fillParentLocationInfo(List<MonitorTargetRegion> resourceList) {
         if (CollUtil.isNotEmpty(resourceList)) {
             List<MonitorTargetRegion> locationTypes = resourceList.stream().filter(distinctByKey(MonitorTargetRegion::getParentId)).collect(Collectors.toList());

+ 3 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/entity/TargetRoom.java

@@ -82,4 +82,7 @@ public class TargetRoom extends OrgEntity {
     /** 点位数量 */
     @TableField(exist = false)
     private Long regionCount;
+
+    /** 房间类型1冷链2环境3都有 */
+    private String type;
 }

+ 3 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/param/TargetRoomAddParam.java

@@ -42,6 +42,9 @@ public class TargetRoomAddParam {
     @Schema(description = "背景图")
     private String bgImg;
 
+    /** 房间类型1冷链2环境3都有 */
+    private String type;
+
     /** 组织id */
     @Schema(description = "组织id")
     private String createOrg;

+ 3 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/param/TargetRoomEditParam.java

@@ -47,6 +47,9 @@ public class TargetRoomEditParam {
     @Schema(description = "背景图")
     private String bgImg;
 
+    /** 房间类型1冷链2环境3都有 */
+    private String type;
+
     /** 组织id */
     @Schema(description = "组织id")
     private String createOrg;

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/TargetRoomService.java

@@ -94,4 +94,6 @@ public interface TargetRoomService extends IService<TargetRoom> {
 
 
     void addWithOrg(TargetRoomAddParam param);
+
+    List<TargetRoom> evnList();
 }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/impl/TargetRoomServiceImpl.java

@@ -162,4 +162,13 @@ public class TargetRoomServiceImpl extends ServiceImpl<TargetRoomMapper, TargetR
         TargetRoom targetRoom = BeanUtil.toBean(param, TargetRoom.class);
         this.save(targetRoom);
     }
+
+    @Override
+    public List<TargetRoom> evnList() {
+        LambdaQueryWrapper<TargetRoom> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TargetRoom::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
+                .eq(TargetRoom::getCreateOrg, StpLoginUserUtil.getLoginUser().getOrgId())
+                .ne(TargetRoom::getType, "1");
+        return list(queryWrapper);
+    }
 }

+ 2 - 0
snowy-web-app/src/main/resources/application.properties

@@ -22,6 +22,7 @@ spring.servlet.multipart.max-file-size=100MB
 # mysql
 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
 spring.datasource.dynamic.datasource.master.url=jdbc:mysql://jfcloud-k6-mysql-coldchain:3306/coldchain?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
+#spring.datasource.dynamic.datasource.master.url=jdbc:mysql://129.211.229.136:43306/coldchain?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
 spring.datasource.dynamic.datasource.master.username=root
 spring.datasource.dynamic.datasource.master.password=Root123...
 spring.datasource.dynamic.strict=true
@@ -36,6 +37,7 @@ PUBLISH_TOPIC=coldchain/airnow/set
 
 # influxdb
 spring.data.influxdb.url=${INFLUXDB_URL:http://jfcloud-k6-influxdb:8086}
+#spring.data.influxdb.url=${INFLUXDB_URL:http://129.211.229.136:48086}
 ## 10.0.1.200
 #spring.data.influxdb.token=${INFLUXDB_TOKEN:1NdDyN3LCKIEBFkQ1AqAmRSitZGfdCs0nuF11nLQbTcnN_5mp_asnfFnmAXTvDDQXGr83llxuXJu5wNTPtrsIw==}
 # \u516C\u7F51\u7684

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini