From 1b4274e27a60892492195e7e3a4b820dcd2b6be5 Mon Sep 17 00:00:00 2001
From: liuhaonan <31457034@qq.com>
Date: 星期三, 28 九月 2022 14:16:15 +0800
Subject: [PATCH] changes

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/vo/OnLineCountVO.java                 |   62 ++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/DeviceStatusCountService.java |   33 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeService.java          |    5 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java              |  463 +++++++++++++++++++++++++++++++++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java           |   34 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/vo/DeviceOnLineCountVO.java           |   32 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java        |   16 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/redis/DeviceRedisKey.java             |   16 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java      |   25 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java        |    5 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java             |   18 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java     |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java             |   39 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java           |    2 
 14 files changed, 723 insertions(+), 31 deletions(-)

diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
index 21a7f9e..9bd92c3 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
@@ -14,6 +14,7 @@
 import com.sandu.ximon.admin.dto.DeviceStatusDto;
 import com.sandu.ximon.admin.param.*;
 import com.sandu.ximon.admin.security.PermissionConfig;
+import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.admin.service.AirEquipmentService;
 import com.sandu.ximon.admin.service.IpVolumeService;
 import com.sandu.ximon.admin.service.MonitorService;
@@ -119,6 +120,7 @@
     /**
      * 鍦ㄧ嚎鏁伴噺
      */
+//    @AnonymousAccess
     @GetMapping("/online")
     public ResponseVO<Object> online() {
         return ResponseUtil.success(poleService.poleCount());
@@ -296,9 +298,9 @@
     @AnonymousAccess
     @PostMapping("/isRegisterByCode")
     public ResponseVO<Object> getStatusByCode() {
-/*//        if (!permissionConfig.check(MenuEnum.GET_STATE_BY_DEVICECODE.getCode())) {
-//            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
-//        }*/
+        if (!permissionConfig.check(MenuEnum.GET_STATE_BY_DEVICECODE.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
         ArrayList<String> deviceCodeList = new ArrayList<>();
         deviceCodeList.add("baseDevice01");
         deviceCodeList.add("baseDevice02");
@@ -414,4 +416,12 @@
         return ResponseUtil.success(poleService.pushAirDataToXiXun(poleId));
     }
 
+
+    @AnonymousAccess
+    @PostMapping("/setRedis")
+    public ResponseVO<Object> pushAirDataToXiXun() {
+        poleService.setRedis();
+        return ResponseUtil.success("鏇存柊鐘舵�佸畬鎴�");
+    }
+
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/DeviceRedisKey.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/DeviceRedisKey.java
index 0af4832..dd59d62 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/DeviceRedisKey.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/DeviceRedisKey.java
@@ -9,40 +9,40 @@
     /**
      * 闊虫煴
      */
-    public static final String IP_BROADCAST = "volume.";
+    public static final String IP_BROADCAST = "volume:";
 
     /**
      * 鎽勫儚澶�
      */
-    public static final String MONITOR = "monitor.";
+    public static final String MONITOR = "monitor:";
 
     /**
      * 鍗曠伅
      */
-    public static final String LIGHT_DEVICE = "lightDevice.";
+    public static final String LIGHT_DEVICE = "lightDevice:";
 
     /**
      * 鍏呯數妗�
      */
-    public static final String C3M = "c3m.";
+    public static final String C3M = "c3m:";
 
     /**
      * 澶ф皵
      */
-    public static final String AIR = "air.";
+    public static final String AIR = "air:";
 
     /**
      * 鍐滆��
      */
-    public static final String AIR_NONGGENG = "airNongGeng.";
+    public static final String AIR_NONGGENG = "airNongGeng:";
 
     /**
      * 鐔欐睕
      */
-    public static final String XIXUN = "led_xixun.";
+    public static final String XIXUN = "led_xixun:";
 
     /**
      * 璇虹摝
      */
-    public static final String NOVA = "led_nova.";
+    public static final String NOVA = "led_nova:";
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
index 1352524..d85bf94 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
@@ -82,7 +82,7 @@
         if (loginUserInfo == null) {
             return null;
         }
-        if (AdministratorEnums.NORMAL.getCode().equals(loginUserInfo.getAdministratorType())) {
+        if (!AdministratorEnums.ADMIN.getCode().equals(loginUserInfo.getAdministratorType())) {
             return loginUserInfo.getUserId();
         }
         return null;
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java
index a9b9dec..ba65362 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java
@@ -1,5 +1,6 @@
 package com.sandu.ximon.admin.service;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
 import com.sandu.common.execption.BusinessException;
@@ -16,11 +17,13 @@
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.AtmoFunctionCode;
 import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
+import com.sandu.ximon.admin.redis.DeviceRedisKey;
 import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.admin.utils.RedisUtils;
 import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
 import com.sandu.ximon.admin.utils.StringUtil;
 import com.sandu.ximon.admin.vo.EquipmentInfomation;
+import com.sandu.ximon.admin.vo.RedisDeviceStatus;
 import com.sandu.ximon.dao.bo.AirEquipmentBo;
 import com.sandu.ximon.dao.domain.AirEquipment;
 import com.sandu.ximon.dao.mapper.AirEquipmentMapper;
@@ -35,6 +38,7 @@
 public class AirEquipmentService extends BaseServiceImpl<AirEquipmentMapper, AirEquipment> {
 
     private final AirEquipmentMapper airEquipmentMapper;
+    private final RedisUtils redisUtils;
 
 
     /**
@@ -352,4 +356,25 @@
             throw new BusinessException("鏁版嵁鏍¢獙寮傚父锛�");
         }
     }
+
+
+    /**
+     * 鍚慠edis涓瓨鍏ヨ澶囩姸鎬�
+     */
+    public void setCacheData() {
+        list().forEach(
+                device -> {
+                    RedisDeviceStatus deviceStatus = new RedisDeviceStatus();
+                    deviceStatus.setDeviceId(device.getAirMac());
+
+                    if (RedisUtils.getBean().get(AtmoFunctionCode.AIR_HEARTBEAT_STATE.getCode() + device.getAirMac()) != null) {
+                        deviceStatus.setStatus(0);
+                    } else {
+                        deviceStatus.setStatus(1);
+                    }
+                    redisUtils.set(DeviceRedisKey.AIR + device.getAirMac(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.AIR + device.getAirMac());
+                }
+        );
+    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
index 1506376..ec079ff 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3ChargingService.java
@@ -1178,7 +1178,7 @@
                         A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage beatDataPackage = ReadTheHeartbeatPackage(device.getC3Id(), false);
                         if (beatDataPackage != null) {
                             //鍦ㄧ嚎鐘舵�� 1.绌洪棽 2.鍏呯數涓� 3.鍏呯數涓柇锛岀瓑寰呮湇鍔″櫒纭 4.鍏呯數缁撴潫锛岀瓑寰呮湇鍔″櫒纭 5.鏈夋晠闅� 6.涓庡厖鐢垫々瀵规帴涓�
-                            if (Integer.valueOf(beatDataPackage.getStatusBit()) != 5) {
+                            if (Integer.valueOf(beatDataPackage.getStatusBit()) == 5) {
                                 deviceStatus.setStatus(2);
                             } else {
                                 deviceStatus.setStatus(0);
@@ -1188,7 +1188,8 @@
                             deviceStatus.setStatus(1);
                         }
                     }
-                    redisUtils.set(DeviceRedisKey.IP_BROADCAST + device.getC3Id(), deviceStatus);
+                    redisUtils.set(DeviceRedisKey.C3M + device.getC3Id(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.C3M + device.getC3Id());
                 }
         );
 
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/DeviceStatusCountService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/DeviceStatusCountService.java
new file mode 100644
index 0000000..caf3acd
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/DeviceStatusCountService.java
@@ -0,0 +1,33 @@
+package com.sandu.ximon.admin.service;
+
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/9/27
+ */
+@Service
+@AllArgsConstructor
+public class DeviceStatusCountService implements Runnable {
+
+    private final WaterQualityEquipmentService waterQualityEquipmentService;
+    private final AirEquipmentNongGengService airEquipmentNongGengService;
+    private final LightPoleHeelingService poleHeelingService;
+    private final AirEquipmentService airEquipmentService;
+    private final LedPlayerEntityService ledNovaService;
+    private final PoleLightemitService ledXixunService;
+    private final C3ChargingService c3ChargingService;
+    private final IpVolumeService ipVolumeService;
+    private final MonitorService monitorService;
+    private final LightService lightService;
+
+
+    @Override
+    public void run() {
+
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeService.java
index 93102fc..f8cf860 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeService.java
@@ -1,5 +1,6 @@
 package com.sandu.ximon.admin.service;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
 import com.sandu.common.execption.BusinessException;
@@ -179,7 +180,6 @@
      */
     public List<BroadcastTerminalV2EntityBo> getBroadcastTerminalListOnHome() {
         List<BroadcastTerminalV2EntityBo> broadcastTerminalV2EntityBos;
-        List<BroadcastTerminalV2EntityBo> broadcastTerminalV2EntityBos_final = new ArrayList<>();
 
         if (SecurityUtils.getClientId() == null) {
             broadcastTerminalV2EntityBos = broadcastTerminalV2EntityMapper.getBroadcastTerminalList(null, null, 2);
@@ -372,7 +372,8 @@
 
                         }
                     }
-                    redisUtils.set(DeviceRedisKey.IP_BROADCAST + device.getId(), deviceStatus);
+                    redisUtils.set(DeviceRedisKey.IP_BROADCAST + device.getId(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.IP_BROADCAST + device.getId());
                 }
         );
 
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
index be5a2c2..cdad378 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
@@ -3,6 +3,7 @@
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.HexUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -932,10 +933,15 @@
     public void setCacheData() {
 
         List<String> collect = list().stream().map(Light::getDeviceCode).collect(Collectors.toList());
+//        collect.forEach(
+//                code -> {
+//                    redisUtils.delete(DeviceRedisKey.LIGHT_DEVICE + code);
+//                }
+//        );
         List<List<String>> split = CollectionUtil.split(collect, 100);
 
-        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = null;
-        List<RedisDeviceStatus> statusList = null;
+        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = new ArrayList<>();
+        List<RedisDeviceStatus> statusList = new ArrayList<>();
         for (List<String> splist : split) {
             deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(splist);
             if (deviceStatuses != null) {
@@ -946,6 +952,10 @@
                         device.setStatus(0);
                     } else if ("OFFLINE".equals(deviceStatus.getStatus())) {
                         device.setStatus(1);
+                    } else if ("UNACTIVE".equals(deviceStatus.getStatus())) {
+                        device.setStatus(0);
+                    } else if ("DISABLE".equals(deviceStatus.getStatus())) {
+                        device.setStatus(0);
                     } else {
                         device.setStatus(2);
                     }
@@ -956,7 +966,7 @@
         }
 
         statusList.forEach(status -> {
-            redisUtils.set(DeviceRedisKey.LIGHT_DEVICE + status.getDeviceId(), status);
+            redisUtils.set(DeviceRedisKey.LIGHT_DEVICE + status.getDeviceId(), JSON.toJSONString(status));
         });
 
     }
@@ -987,7 +997,7 @@
         }
 
         A5LightSetCalendarReqInnerFrame setCalendarReqInnerFrame =
-                new A5LightSetCalendarReqInnerFrame(address, year % 100, month+1, day, hour, min, sec);
+                new A5LightSetCalendarReqInnerFrame(address, year % 100, month + 1, day, hour, min, sec);
 
         A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), setCalendarReqInnerFrame);
         System.out.println(a5Frame + "            -----a5Frame");
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java
index 4b162fe..0b67404 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MonitorService.java
@@ -12,10 +12,13 @@
 import com.sandu.ximon.admin.dto.YSY_AccessTokenDto;
 import com.sandu.ximon.admin.dto.YSY_MonitorDto;
 import com.sandu.ximon.admin.param.MonitorParam;
+import com.sandu.ximon.admin.redis.DeviceRedisKey;
 import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.admin.utils.ListPagingUtils;
+import com.sandu.ximon.admin.utils.RedisUtils;
 import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
 import com.sandu.ximon.admin.vo.EquipmentInfomation;
+import com.sandu.ximon.admin.vo.RedisDeviceStatus;
 import com.sandu.ximon.dao.bo.MonitorBo;
 import com.sandu.ximon.dao.domain.Monitor;
 import com.sandu.ximon.dao.domain.PoleBinding;
@@ -55,6 +58,8 @@
 
 
     private final PoleBindingService poleBindingService;
+
+    private final RedisUtils redisUtils;
 
     /**
      * 鎽勫儚澶村垪琛ㄦā绯婃煡璇�
@@ -460,4 +465,33 @@
     }
 
 
+    /**
+     * 鍚慠edis涓瓨鍏ヨ澶囩姸鎬�
+     */
+    public void setCacheData() {
+        list().forEach(
+                device -> {
+                    RedisDeviceStatus deviceStatus = new RedisDeviceStatus();
+                    deviceStatus.setDeviceId(device.getDeviceSerial());
+                    if (device != null) {
+                        EquipmentInfomation monitorInfo = getMonitorInfo(device.getDeviceSerial());
+                        if (monitorInfo != null) {
+                            if ("鍦ㄧ嚎".equals(monitorInfo.getEquipmentState())) {
+                                deviceStatus.setStatus(0);
+                            } else {
+                                deviceStatus.setStatus(1);
+                            }
+
+                        } else {
+                            deviceStatus.setStatus(1);
+                        }
+                    }
+                    redisUtils.set(DeviceRedisKey.MONITOR + device.getDeviceSerial(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.MONITOR + device.getDeviceSerial());
+                }
+        );
+
+    }
+
+
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java
index 3fa00cb..922431b 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java
@@ -576,13 +576,15 @@
         list().forEach(
                 xiXun -> {
                     RedisDeviceStatus deviceStatus = new RedisDeviceStatus();
+                    deviceStatus.setDeviceId(xiXun.getLightemitControlCode());
                     boolean ledOnLine = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode());
                     if (ledOnLine) {
                         deviceStatus.setStatus(0);
                     } else {
                         deviceStatus.setStatus(1);
                     }
-                    redisUtils.set(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode(), deviceStatus);
+                    redisUtils.set(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode());
                 }
         );
     }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
index fb5656d..c591d87 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
 import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -33,25 +34,32 @@
 import com.sandu.ximon.admin.param.PoleParam;
 import com.sandu.ximon.admin.param.PoleStatesParam;
 import com.sandu.ximon.admin.param.PushAirDataToNovaParam;
+import com.sandu.ximon.admin.redis.DeviceRedisKey;
 import com.sandu.ximon.admin.redis.LightKey;
 import com.sandu.ximon.admin.security.SecurityUtils;
-import com.sandu.ximon.admin.utils.LightemitUtils;
-import com.sandu.ximon.admin.utils.ListPagingUtils;
-import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
+import com.sandu.ximon.admin.utils.*;
 import com.sandu.ximon.admin.utils.response.VnnoxResult;
+import com.sandu.ximon.admin.vo.DeviceOnLineCountVO;
+import com.sandu.ximon.admin.vo.OnLineCountVO;
 import com.sandu.ximon.admin.vo.PoleBindVO;
+import com.sandu.ximon.admin.vo.RedisDeviceStatus;
 import com.sandu.ximon.dao.bo.*;
 import com.sandu.ximon.dao.domain.*;
 import com.sandu.ximon.dao.enums.OrderByEnums;
 import com.sandu.ximon.dao.mapper.PoleMapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.RandomStringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -69,6 +77,8 @@
     private final PoleGroupRelationService groupRelationService;
     private final ClientService clientService;
     private final PoleMapper poleMapper;
+    private final RedisUtils redisUtils;
+    private final CountDownLatchUtil countDownLatchUtil;
 
     public boolean addPole(PoleParam param) {
         Pole pole = new Pole();
@@ -166,7 +176,7 @@
      *
      * @return
      */
-    public Map<String, Integer> poleCount() {
+    public Map<String, Integer> poleCount1() {
         Map<String, Integer> result = new HashMap<>();
         LambdaQueryWrapper<Pole> wrapper;
         if (SecurityUtils.getClientId() == null) {
@@ -223,6 +233,351 @@
 
         return result;
     }
+
+
+    /**
+     * 缁熻鍦ㄧ嚎鐏潌鏁伴噺
+     *
+     * @return
+     */
+    public OnLineCountVO poleCount() {
+        System.out.println("璇锋眰鏃堕棿: " + LocalDateTime.now());
+        OnLineCountVO onLineCountVO = new OnLineCountVO();
+        CountDownLatch countDownLatch = new CountDownLatch(9);//todo
+        //鑾峰彇涓�涓�7浣嶉殢鏈烘暟
+        String str = RandomStringUtils.randomAlphanumeric(7);
+        countDownLatchUtil.push(str, countDownLatch);
+        //璇虹摝
+        List<LedPlayerEntity> ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityListOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+
+
+                //ip闊虫煴
+
+                DeviceOnLineCountVO ledNova = new DeviceOnLineCountVO();
+                ledPlayerEntities.forEach(
+                        Volume -> {
+                            String s = redisUtils.get(DeviceRedisKey.IP_BROADCAST + Volume.getId());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                }
+                            } else {
+                                offLine.getAndIncrement();
+                            }
+                        }
+                );
+
+                ledNova.setTotalCount(ledPlayerEntities.size());
+                ledNova.setOnlineCount(onLine.get());
+                ledNova.setOfflineCount(offLine.get());
+
+                onLineCountVO.setLedNova(ledNova);
+                System.out.println("璇虹摝鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+        //闊虫煴
+        List<BroadcastTerminalV2EntityBo> broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalListOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+
+
+                //ip闊虫煴
+
+                DeviceOnLineCountVO ipVolume = new DeviceOnLineCountVO();
+                broadcastTerminalList.forEach(
+                        Volume -> {
+                            String s = redisUtils.get(DeviceRedisKey.IP_BROADCAST + Volume.getId());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                }
+                            } else {
+                                offLine.getAndIncrement();
+                            }
+                        }
+                );
+
+                ipVolume.setTotalCount(broadcastTerminalList.size());
+                ipVolume.setOnlineCount(onLine.get());
+                ipVolume.setOfflineCount(offLine.get());
+
+                onLineCountVO.setBroadcast(ipVolume);
+                System.out.println("闊虫煴鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+        //鎽勫儚澶�
+        List<MonitorBo> monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+
+                DeviceOnLineCountVO Monitor = new DeviceOnLineCountVO();
+                monitorBos.forEach(
+                        device -> {
+                            String s = redisUtils.get(DeviceRedisKey.MONITOR + device.getDeviceSerial());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                }
+                            } else {
+                                offLine.getAndIncrement();
+                            }
+                        }
+                );
+
+                Monitor.setTotalCount(monitorBos.size());
+                Monitor.setOnlineCount(onLine.get());
+                Monitor.setOfflineCount(offLine.get());
+
+                onLineCountVO.setMonitor(Monitor);
+                System.out.println("鎽勫儚澶存墽琛屾椂闂�: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+
+        //鍗曠伅
+        List<LightBo> lights = SpringContextHolder.getBean(LightService.class).listLightOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+                AtomicInteger error = new AtomicInteger(0);
+
+
+                DeviceOnLineCountVO light = new DeviceOnLineCountVO();
+                lights.forEach(
+                        device -> {
+                            String s = redisUtils.get(DeviceRedisKey.LIGHT_DEVICE + device.getDeviceCode());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                }
+                            } else {
+                                error.getAndIncrement();
+                            }
+                        }
+                );
+
+                light.setTotalCount(lights.size());
+                light.setOnlineCount(onLine.get());
+                light.setOfflineCount(offLine.get());
+                light.setErrorCount(error.get());
+
+                onLineCountVO.setLight(light);
+                System.out.println("鍗曠伅鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+
+        //鍏呯數妗�
+        List<C3ChargingBo> c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingList();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+                AtomicInteger error = new AtomicInteger(0);
+
+
+                DeviceOnLineCountVO c3m = new DeviceOnLineCountVO();
+                c3mChargings.forEach(
+                        device -> {
+                            String s = redisUtils.get(DeviceRedisKey.C3M + device.getC3Id());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else if (redisDeviceStatus.getStatus() == 1) {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                } else {
+                                    error.getAndIncrement();
+                                }
+                            } else {
+                                error.getAndIncrement();
+                            }
+                        }
+                );
+
+                c3m.setTotalCount(c3mChargings.size());
+                c3m.setOnlineCount(onLine.get());
+                c3m.setOfflineCount(offLine.get());
+                c3m.setErrorCount(error.get());
+
+                onLineCountVO.setC3m(c3m);
+                System.out.println("鍏呯數妗╂墽琛屾椂闂�: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+
+        //澶ф皵
+        List<AirEquipmentBo> airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+                AtomicInteger error = new AtomicInteger(0);
+
+
+                DeviceOnLineCountVO air = new DeviceOnLineCountVO();
+                airEquipments.forEach(
+                        device -> {
+                            String s = redisUtils.get(DeviceRedisKey.AIR + device.getAirMac());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else if (redisDeviceStatus.getStatus() == 1) {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                } else {
+                                    error.getAndIncrement();
+                                }
+                            } else {
+                                error.getAndIncrement();
+                            }
+                        }
+                );
+
+                air.setTotalCount(airEquipments.size());
+                air.setOnlineCount(onLine.get());
+                air.setOfflineCount(offLine.get());
+                air.setErrorCount(error.get());
+
+                onLineCountVO.setAirEquipment(air);
+                System.out.println("澶ф皵鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+
+        //澶ф皵(鍐滆��)
+//        List<AirEquipmentNongGengBo> airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentOnHome();
+//        result.put("AirEquipmentNongGengTotalCount", airEquipmentNongGengBos.size());
+
+        //姘磋川
+        List<WaterQualityEquipmentBo> waterQualityEquipments = SpringContextHolder.getBean(WaterQualityEquipmentService.class).listWaterQualityEquipmentByKeyword(null, null);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                DeviceOnLineCountVO water = new DeviceOnLineCountVO();
+                water.setTotalCount(waterQualityEquipments.size());
+                water.setOnlineCount(waterQualityEquipments.size());
+                water.setOfflineCount(0);
+                water.setErrorCount(0);
+                onLineCountVO.setWaterEquipment(water);
+                System.out.println("姘磋川鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+
+        //鐏潌鍊炬枩
+        List<LightPoleHeelingEquipmentBo> lightPoleHeelingEquipmentBos = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).LightPoleHeelingEquipmentListOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                DeviceOnLineCountVO PoleHeeling = new DeviceOnLineCountVO();
+                PoleHeeling.setTotalCount(lightPoleHeelingEquipmentBos.size());
+                PoleHeeling.setOnlineCount(lightPoleHeelingEquipmentBos.size());
+                PoleHeeling.setOfflineCount(0);
+                PoleHeeling.setErrorCount(0);
+                onLineCountVO.setLightPoleHeeling(PoleHeeling);
+                System.out.println("鐏潌鍊炬枩鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+
+        //鐔欒
+        List<PoleLightemitEntity> xiXuns = SpringContextHolder.getBean(PoleLightemitService.class).listLedOnHome();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                AtomicInteger onLine = new AtomicInteger(0);
+                AtomicInteger offLine = new AtomicInteger(0);
+
+                DeviceOnLineCountVO xixunLed = new DeviceOnLineCountVO();
+                xiXuns.forEach(
+                        device -> {
+                            String s = redisUtils.get(DeviceRedisKey.XIXUN + device.getLightemitControlCode());
+                            if (s != null) {
+                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
+                                if (redisDeviceStatus.getStatus() == 0) {
+                                    //鍦ㄧ嚎
+                                    onLine.getAndIncrement();
+                                } else {
+                                    //绂荤嚎
+                                    offLine.getAndIncrement();
+                                }
+                            } else {
+                                offLine.getAndIncrement();
+                            }
+                        }
+                );
+
+                xixunLed.setTotalCount(xiXuns.size());
+                xixunLed.setOnlineCount(onLine.get());
+                xixunLed.setOfflineCount(offLine.get());
+
+                onLineCountVO.setLedXiXun(xixunLed);
+                System.out.println("鐔欐睕鎵ц鏃堕棿: " + LocalDateTime.now());
+                countDownLatchUtil.countDown(str);
+            }
+        }).start();
+        try {
+            countDownLatch.await(12000, TimeUnit.MILLISECONDS);
+            countDownLatchUtil.remove(str);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("鍝嶅簲鏃堕棿: " + LocalDateTime.now());
+        return onLineCountVO;
+    }
+
 
     public CommonPage queryAllStatesAndList(Integer pageNo, Integer pageSize, PoleStatesParam param, Integer order, Integer seq) {
         if (param == null) {
@@ -939,7 +1294,7 @@
      * 鎺ㄩ�佸ぇ姘旂洃娴嬫暟鎹埌novaLED
      */
     public VnnoxResult pushAirDataToNova(PushAirDataToNovaParam param) {
-        Long poleId=param.getPoleId();
+        Long poleId = param.getPoleId();
         Pole pole = getById(poleId);
         PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3));
         PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 1));
@@ -957,8 +1312,104 @@
         A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId);
         //鎺ㄩ�佹暟鎹�
 //        return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(),param.getDuration(), data);
-        return SpringContextHolder.getBean(VnnoxService.class).WaterData(LED.getPlayerId(),param.getDuration(), data);
+        return SpringContextHolder.getBean(VnnoxService.class).WaterData(LED.getPlayerId(), param.getDuration(), data);
     }
 
 
+    /**
+     * 缁熻璁惧鐘舵�佸瓨鍏edis
+     */
+    public void setRedis() {
+
+        //  redisStatusKeyTimeout涓虹┖  浠h〃涓婃璋冪敤鍦�15鍒嗛挓鍓�
+        if (redisUtils.get("redisStatusKeyTimeout") != null) {
+            //涓嶄负绌�  璇存槑鐭椂闂村唴璋冪敤杩�  鐩存帴杩斿洖
+            System.out.println("15鍒嗛挓鍐呭凡缁忔洿鏂拌繃鏁版嵁");
+            return;
+        }
+
+        //璁剧疆瑙﹀彂鏉′欢    瀛樺叆Redis  15鍒嗛挓瓒呮椂   15鍒嗛挓鍐呭啀娆¤皟鐢ㄧ洿鎺ヨ繑鍥�
+        redisUtils.set("redisStatusKeyTimeout", System.currentTimeMillis(), 60*15);
+
+        CountDownLatch countDownLatch = new CountDownLatch(7);//todo
+        //鑾峰彇涓�涓�7浣嶉殢鏈烘暟
+        String str = RandomStringUtils.randomAlphanumeric(7);
+        countDownLatchUtil.push(str, countDownLatch);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(IpVolumeService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("闊虫煴鎵ц");
+
+            }
+        }).start();
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(MonitorService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("鎽勫儚澶存墽琛�");
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(LightService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("鍗曠伅鎵ц");
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(C3ChargingService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("鍏呯數妗╂墽琛�");
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(AirEquipmentService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("澶ф皵鎵ц");
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(PoleLightemitService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("鐔欐睕鎵ц");
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(VnnoxService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("璇虹摝鎵ц");        //todo 璇虹摝鏁呴殰鏆傛棤
+            }
+        }).start();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                SpringContextHolder.getBean(PoleLightemitService.class).setCacheData();
+                countDownLatchUtil.countDown(str);
+                System.out.println("鐔欐睕鎵ц");
+            }
+        }).start();
+
+
+        try {
+            countDownLatch.await(12000, TimeUnit.MILLISECONDS);
+            countDownLatchUtil.remove(str);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
 }
\ No newline at end of file
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java
index 36b829e..b4d7107 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java
@@ -1,10 +1,12 @@
 package com.sandu.ximon.admin.service;
 
 import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSON;
 import com.sandu.common.execption.BusinessException;
 import com.sandu.common.util.SpringContextHolder;
 import com.sandu.ximon.admin.config.VnnoxConstant;
 import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
+import com.sandu.ximon.admin.redis.DeviceRedisKey;
 import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.admin.utils.*;
 import com.sandu.ximon.admin.utils.request.VnnoxScreenStatusType;
@@ -12,10 +14,7 @@
 import com.sandu.ximon.admin.utils.response.VnnoxPlayerResponse;
 import com.sandu.ximon.admin.utils.response.VnnoxResult;
 import com.sandu.ximon.admin.utils.response.VnnoxResultResponse;
-import com.sandu.ximon.admin.vo.NovaAStateInfoVO;
-import com.sandu.ximon.admin.vo.NovaPushResultVO;
-import com.sandu.ximon.admin.vo.NovaScreenShorUrlVO;
-import com.sandu.ximon.admin.vo.NovaWeatherVO;
+import com.sandu.ximon.admin.vo.*;
 import com.sandu.ximon.dao.domain.LedPlayerEntity;
 import com.sandu.ximon.dao.domain.LedPlayerInfoEntity;
 import com.sandu.ximon.dao.domain.LedV2RegisterResultEntity;
@@ -718,6 +717,38 @@
                     vnnoxAPIUtil.getAsyncStatus(playerIdList, stateValue);
                 }
         );
+    }
+
+
+    /**
+     * 鍚慠edis涓瓨鍏ヨ澶囩姸鎬�
+     */
+    public void setCacheData() {
+
+        List<List<LedPlayerEntity>> split = CollectionUtil.split(ledPlayerEntityService.list(), 100);
+        List<LedPlayerEntity> ledList = new ArrayList<>();
+        split.forEach(
+                list -> {
+                    List<LedPlayerEntity> ledPlayerEntities = vnnoxAPIUtil.syncCurrentInfo(list);
+                    ledList.addAll(ledPlayerEntities);
+                }
+        );
+
+        ledList.forEach(
+                device -> {
+                    RedisDeviceStatus deviceStatus = new RedisDeviceStatus();
+                    deviceStatus.setDeviceId(device.getPlayerId());
+                    if (device.getOnlineStatus() == 0) {
+                        deviceStatus.setStatus(1);
+                    } else if (device.getOnlineStatus() == 1) {
+                        deviceStatus.setStatus(0);
+                    } else {
+                        deviceStatus.setStatus(1);
+                    }
+                    redisUtils.set(DeviceRedisKey.NOVA + device.getPlayerId(), JSON.toJSONString(deviceStatus));
+//                    redisUtils.delete(DeviceRedisKey.IP_BROADCAST + device.getId());
+                }
+        );
 
     }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/DeviceOnLineCountVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/DeviceOnLineCountVO.java
new file mode 100644
index 0000000..13346b5
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/DeviceOnLineCountVO.java
@@ -0,0 +1,32 @@
+package com.sandu.ximon.admin.vo;
+
+import lombok.Data;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/9/27
+ * 璁惧鏁伴噺缁熻
+ */
+@Data
+public class DeviceOnLineCountVO {
+
+    /**
+     * 璁惧鎬绘暟閲�
+     */
+    private Integer totalCount;
+
+    /**
+     * 鍦ㄧ嚎鏁伴噺
+     */
+    private Integer onlineCount;
+
+    /**
+     * 绂荤嚎鏁伴噺
+     */
+    private Integer offlineCount = 0;
+
+    /**
+     * 鏁呴殰鏁伴噺
+     */
+    private Integer errorCount = 0;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/OnLineCountVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/OnLineCountVO.java
new file mode 100644
index 0000000..bdf9590
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/vo/OnLineCountVO.java
@@ -0,0 +1,62 @@
+package com.sandu.ximon.admin.vo;
+
+import lombok.Data;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/9/27
+ * 棣栭〉鏁伴噺缁熻瀹炰綋
+ */
+@Data
+public class OnLineCountVO {
+
+    /**
+     * 璇虹摝
+     */
+    private DeviceOnLineCountVO ledNova;
+
+    /**
+     * 闊虫煴
+     */
+    private DeviceOnLineCountVO broadcast;
+
+    /**
+     * 鎽勫儚澶�
+     */
+    private DeviceOnLineCountVO monitor;
+
+    /**
+     * 鍗曠伅
+     */
+    private DeviceOnLineCountVO light;
+
+    /**
+     * 鍏呯數妗�
+     */
+    private DeviceOnLineCountVO c3m;
+
+    /**
+     * 澶ф皵
+     */
+    private DeviceOnLineCountVO airEquipment;
+
+    /**
+     * 鍐滆��
+     */
+    private DeviceOnLineCountVO airEquipmentNongGeng;
+
+    /**
+     * 姘磋川
+     */
+    private DeviceOnLineCountVO waterEquipment;
+
+    /**
+     * 鐏潌鍊炬枩
+     */
+    private DeviceOnLineCountVO LightPoleHeeling;
+
+    /**
+     * 鐔欐睕
+     */
+    private DeviceOnLineCountVO ledXiXun;
+}

--
Gitblit v1.9.3