From 51396d6ed0747b1e909056ed72108b6b0c811667 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 13 十一月 2024 11:00:58 +0800
Subject: [PATCH] 离线检测优化

---
 ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java     |    5 +
 ycl-server/src/main/java/com/ycl/config/RedisConfig.java                          |    3 
 ycl-server/src/main/java/com/ycl/task/UYTask.java                                 |   63 +++++++++++---------
 ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java                        |   64 +++++++++++++++------
 ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java |   15 ++---
 ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java                    |    6 +-
 6 files changed, 95 insertions(+), 61 deletions(-)

diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
index 828af36..d3de595 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
@@ -29,12 +29,11 @@
     private String pingOnlineStr;
     /** 褰撴棩鐩戞祴娆℃暟 */
     private Integer checkCount;
-    /** 褰撴棩绂荤嚎 */
+    /** 褰撴棩绂荤嚎娆℃暟 */
     private Integer offLineCount;
     /**
      * 绂荤嚎鏃堕棿鐐�
      */
-    private List<Date> offLineTime;
     private List<String> offLineTimeStr;
     /** 璁惧绫诲瀷 */
     private String monitorType;
@@ -42,6 +41,8 @@
     private String name;
     private WorkOrder workOrder;
     private Integer pointId;
+    /** 鍙敤浣滃綋姝ゆ娴嬬粨鏋滃垽鏂紝涓嶄綔灞曠ず */
+    private Boolean createWorkOrder;
     /**
      * 鍔ㄦ�佸垪
      */
diff --git a/ycl-server/src/main/java/com/ycl/config/RedisConfig.java b/ycl-server/src/main/java/com/ycl/config/RedisConfig.java
index 86babf0..5e49ef0 100644
--- a/ycl-server/src/main/java/com/ycl/config/RedisConfig.java
+++ b/ycl-server/src/main/java/com/ycl/config/RedisConfig.java
@@ -11,7 +11,7 @@
 
 /**
  * redis閰嶇疆
- * 
+ *
  * @author ruoyi
  */
 @Configuration
@@ -36,6 +36,7 @@
         template.setHashValueSerializer(serializer);
 
         template.afterPropertiesSet();
+
         return template;
     }
 
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
index 9ea32fa..3813971 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -86,8 +86,11 @@
         if (params.getOption() != null) {
             query.addCriteria(Criteria.where("online").is(params.getOption()));
         }
+        Sort sort = Sort.by(
+                Sort.Order.asc("pingOnline") // 棣栧厛鎸夌収 pingOnline 鍗囧簭鎺掑簭
+        );
         // 閫氳繃pingOnline瀛楁鎺掑簭锛屼负false鐨勬帓鍦ㄥ墠闈�
-        query.with(Sort.by(Sort.Order.asc("pingOnline")));
+        query.with(sort);
         //鍒嗛〉鏁伴噺
         long total = mongoTemplate.count(query, TMonitorResult.class);
         MongoUtil.setPage(query, params, TIME_FIELD);
@@ -107,19 +110,13 @@
             } else {
                 item.setOnlineStr("鏈煡");
             }
-            List<Date> offLineTime = item.getOffLineTime();
+            List<String> offLineTime = item.getOffLineTimeStr();
             if(!CollectionUtils.isEmpty(offLineTime)) {
                 //鍚庣画鍙互鏀规垚閰嶇疆鐨勭绾挎鏁�(鎻愬彇鍓峮娆★紝n涓洪厤缃殑绂荤嚎娆℃暟)
-                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 if (offLineTime.size() > 1) {
                     offLineTime = offLineTime.subList(0, 2);
                 }
-                List<String> dateStr = new ArrayList<>();
-                for (Date date : offLineTime) {
-                    String formatDate = format.format(date);
-                    dateStr.add(formatDate);
-                }
-                item.setOffLineTimeStr(dateStr);
+                item.setOffLineTimeStr(offLineTime);
             }
         });
         params.setDeptTag(-1);
diff --git a/ycl-server/src/main/java/com/ycl/task/UYTask.java b/ycl-server/src/main/java/com/ycl/task/UYTask.java
index 0256642..f788121 100644
--- a/ycl-server/src/main/java/com/ycl/task/UYTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -195,7 +195,7 @@
         for (TMonitorResult result : monitorList) {
             TMonitorResult mongoData = mongoMap.get(result.getNo());
             if(mongoData!=null){
-                result.setOffLineTime(mongoData.getOffLineTime());
+                result.setOffLineTimeStr(mongoData.getOffLineTimeStr());
             }
         }
         List<TMonitorResult> dataList = new ArrayList<>(48);
@@ -206,37 +206,44 @@
                             return thread.call(); // 鍋囪 OnlineCheckThread 瀹炵幇浜� Callable 鎺ュ彛
                         }, executorService)
                         .orTimeout(60, TimeUnit.SECONDS)
-                        //鍑虹幇寮傚父
                         .exceptionally(ex -> {
                             if (ex instanceof TimeoutException) {
                                 log.error("浠诲姟鎵ц瓒呮椂:"+monitor.getIp());
                             } else {
-                                log.error("浠诲姟鎵ц寮傚父:"+monitor.getIp() + ex);
+                                log.error("浠诲姟鎵ц寮傚父:"+monitor.getIp() +ex);
+                                ex.printStackTrace();
                             }
-                            int checkTimes = 1;
-                            int offLineTimes = 1;
-                            Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getIp());
-                            if (!CollectionUtils.isEmpty(map)) {
-                                checkTimes = (Integer) map.get("checkTimes") + 1;
-                                offLineTimes = (Integer) map.get("offLineTimes");
-                            }
-                            monitor.setPingOnline(Boolean.FALSE);
-                            monitor.setCheckCount(checkTimes);
-                            monitor.setOffLineCount(offLineTimes);
-                            List<Date> offLineTime = monitor.getOffLineTime();
-                            if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>();
-                            offLineTime.add(new Date());
-                            monitor.setOffLineTime(offLineTime);
-                            if (monitor.getOffLineCount() >= time) {
-                                WorkOrder workOrder = new WorkOrder();
-                                workOrder.setSerialNumber(monitor.getNo());
-                                List<String> errList = new ArrayList<>();
-                                errList.add(ErrorType.DEVICE_OFFLINE.getValue());
-                                workOrder.setErrorTypeList(errList);
-                                workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
-                                monitor.setWorkOrder(workOrder);
-                            }
-                            return monitor; // 杩斿洖澶辫触鐨勭粨鏋�
+                            return null;
+//                            int checkTimes = 1;
+//                            int offLineTimes = 1;
+//                            Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getNo());
+//                            if (!CollectionUtils.isEmpty(map)) {
+//                                checkTimes = (Integer) map.get("checkTimes") + 1;
+//                                offLineTimes = (Integer) map.get("offLineTimes");
+//                            }else {
+//                                map = new HashMap<>();
+//                            }
+//                            monitor.setPingOnline(Boolean.FALSE);
+//                            monitor.setCheckCount(checkTimes);
+//                            monitor.setOffLineCount(offLineTimes);
+//                            List<Date> offLineTime = monitor.getOffLineTime();
+//                            if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>();
+//                            offLineTime.add(new Date());
+//                            monitor.setOffLineTime(offLineTime);
+//                            if (monitor.getOffLineCount() >= time) {
+//                                WorkOrder workOrder = new WorkOrder();
+//                                workOrder.setSerialNumber(monitor.getNo());
+//                                List<String> errList = new ArrayList<>();
+//                                errList.add(ErrorType.DEVICE_OFFLINE.getValue());
+//                                workOrder.setErrorTypeList(errList);
+//                                workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
+//                                monitor.setWorkOrder(workOrder);
+//                            }
+//                            map.put("checkTimes", checkTimes);
+//                            map.put("offLineTimes", offLineTimes);
+//                            redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getNo(), map);
+//                            return monitor; // 杩斿洖澶辫触鐨勭粨鏋�
+
                         }))
                 .collect(Collectors.toList());
 
@@ -247,7 +254,7 @@
         try {
             allOf.get(60, TimeUnit.SECONDS); // 缁欎簣棰濆鐨�5绉掓潵鏀堕泦缁撴灉
         } catch (TimeoutException e) {
-            log.warn("閮ㄥ垎浠诲姟鏈湪鎸囧畾鏃堕棿鍐呭畬鎴�");
+            log.error("閮ㄥ垎浠诲姟鏈湪鎸囧畾鏃堕棿鍐呭畬鎴�");
         } catch (Exception e2){
             log.error("鏁版嵁鏀堕泦寮傚父"+e2);
         }
diff --git a/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
index c00ca77..fffb50e 100644
--- a/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
+++ b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
@@ -62,9 +62,9 @@
 
     @Override
     public TMonitorResult call() {
-        TMonitorResult result = checkPointUtil.check(monitor);
-        // 杩欐涓嶅湪绾夸笖涓�澶╁唴鐩戞祴鍒扮绾�2娆″強浠ヤ笂锛岀敓鎴愬伐鍗�
-        if (!result.getPingOnline() && result.getOffLineCount() >= times) {
+        TMonitorResult result = checkPointUtil.check(monitor,times);
+
+        if (result.getCreateWorkOrder()!=null && result.getCreateWorkOrder()) {
             WorkOrder workOrder = new WorkOrder();
             workOrder.setSerialNumber(result.getNo());
             List<String> errList = new ArrayList<>();
diff --git a/ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java b/ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
index cc5fa17..9f873da 100644
--- a/ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
+++ b/ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
@@ -25,6 +25,7 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -44,9 +45,10 @@
 
     /**
      * 鐩戞祴鐐逛綅鍦ㄧ嚎宸ュ叿绫�
+     *
      * @return
      */
-    public TMonitorResult check(TMonitorResult monitor) {
+    public TMonitorResult check(TMonitorResult monitor,Integer times) {
         // 鍏堟娴嬭兘鍚﹁闂ip鐨勭綉椤�
         ResponseEntity<String> res = null;
         String prefix = "http://";
@@ -64,14 +66,23 @@
         boolean reachable = false;
         Integer checkTimes = 1;
         Integer offLineTimes = 0;
-        Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getIp());
-        if (!CollectionUtils.isEmpty(map)) {
+        Integer continueOffTimes = 0;
+        List<String> offTimeList = new ArrayList<>();
+        // 浠嶳edis鑾峰彇鏁版嵁鏃惰繘琛岀被鍨嬪畨鍏ㄧ殑杞崲
+        Map<String, Object> map = null;
+        Object mapObj = redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getNo());
+        if (mapObj != null) {
+            map = (Map<String, Object>) mapObj;
             checkTimes = (Integer) map.get("checkTimes") + 1;
             offLineTimes = (Integer) map.get("offLineTimes");
+            continueOffTimes = (Integer) map.get("continueOffTimes");
+            Object offTimeListObj = map.get("offTimeList");
+            if (offTimeListObj instanceof List) {
+                offTimeList = new ArrayList<>((List<String>) offTimeListObj);
+            }
         } else {
             map = new HashMap<>();
         }
-
         if (!monitor.getPingOnline()) {
             try {
                 reachable = InetAddress.getByName(monitor.getIp()).isReachable(5000);
@@ -82,14 +93,30 @@
         }
         if (!monitor.getPingOnline()) {
             offLineTimes++;
-            List<Date> offLineTime = monitor.getOffLineTime();
-            if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>();
-            offLineTime.add(new Date());
-            monitor.setOffLineTime(offLineTime);
+            continueOffTimes++;
+            //璁板綍绂荤嚎鏃堕棿
+            Date now = new Date();
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            offTimeList.add(dateFormat.format(now));
+            //鍒拌揪浜х敓宸ュ崟鐨勯槇鍊兼鏁�
+            if (continueOffTimes>=times) {
+                //浜х敓浜嗗伐鍗曟墠浼氬瓨鍌ㄧ绾挎椂闂�,瀛樺偍鏈�杩戜竴娆′骇鐢熷伐鍗曠殑杩欏嚑涓绾挎椂闂寸偣
+                monitor.setOffLineTimeStr(offTimeList);
+                monitor.setCreateWorkOrder(Boolean.TRUE);
+                //浜х敓浜嗕竴娆″伐鍗曞垯娓呴櫎
+                continueOffTimes = 0;
+                offTimeList = new ArrayList<>();
+            }
+        }else {
+            //濡傛灉鍦ㄧ嚎浜嗭紝娓呯┖杩炵画绂荤嚎娆℃暟锛屾竻绌虹绾挎椂闂�
+            continueOffTimes = 0;
+            offTimeList = new ArrayList<>();
         }
         map.put("checkTimes", checkTimes);
         map.put("offLineTimes", offLineTimes);
-        redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getIp(), map);
+        map.put("continueOffTimes", continueOffTimes);
+        map.put("offTimeList", offTimeList);
+        redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getNo(), map);
         monitor.setCheckCount(checkTimes);
         monitor.setOffLineCount(offLineTimes);
         return monitor;
@@ -98,6 +125,7 @@
 
     /**
      * 鐩戞祴鐐逛綅鍦ㄧ嚎
+     *
      * @return
      */
     public CheckResult webCheck(CheckUtil checkUtil) {
@@ -122,7 +150,7 @@
             ResponseEntity<String> res = selfHttpUtil.get(prefix + checkUtil.getIp(), null, null);
             webReachable = Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode();
         } catch (Exception e) {
-            log.info("妫�娴媤eb寮傚父"+e.getMessage());
+            log.info("妫�娴媤eb寮傚父" + e.getMessage());
             webReachable = Boolean.FALSE;
         }
         // ping
@@ -136,7 +164,7 @@
             e.printStackTrace();
         }
         String imgUrl = "";
-        if(pingReachable || webReachable) {
+        if (pingReachable || webReachable) {
             // 鏌ュ嚭鍥芥爣璁惧锛屽氨涓�鏉℃暟鎹�
             List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper)
                     .orderByDesc(DeviceInfo::getUpdateTime)
@@ -152,21 +180,21 @@
             }
         }
         String status = "";
-        if (! webReachable) {
+        if (!webReachable) {
             status += "璁惧web璁块棶澶辫触锛�";
-        }else if(webReachable){
+        } else if (webReachable) {
             status += "璁惧web璁块棶姝e父锛�";
         }
 
-        if (! pingReachable) {
+        if (!pingReachable) {
             status += "璁惧ip鏈猵ing閫氾紱";
-        }else if(pingReachable){
+        } else if (pingReachable) {
             status += "璁惧ipPing姝e父锛�";
         }
 
         if (StringUtils.isEmpty(imgUrl)) {
             status += "鏈幏鍙栧埌鍥剧墖";
-        }else {
+        } else {
             status += "鑾峰彇鍥剧墖姝e父";
         }
         result.setStatus(status);
@@ -198,9 +226,9 @@
             e.printStackTrace();
         }
         String status = "";
-        if (! pingReachable) {
+        if (!pingReachable) {
             status += "ip鏈猵ing閫氾紱";
-        }else {
+        } else {
             status += "鎴愬姛";
         }
         result.setStatus(status);

--
Gitblit v1.8.0