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