From e3eebc41e9b1e5c92fc6212fe51dcce8da366306 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 10 九月 2024 15:26:06 +0800
Subject: [PATCH] 监测点位在线完善

---
 ycl-common/src/main/java/constant/RedisConstant.java                    |    4 
 ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java    |    6 
 ycl-server/src/main/java/com/ycl/task/UYTask.java                       |  103 +++++++++++--------
 ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java |    3 
 ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java          |  129 +++++++++++++++++++++++++
 ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml            |   16 ++-
 ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java   |   21 ++++
 7 files changed, 228 insertions(+), 54 deletions(-)

diff --git a/ycl-common/src/main/java/constant/RedisConstant.java b/ycl-common/src/main/java/constant/RedisConstant.java
index b576a18..b6a9361 100644
--- a/ycl-common/src/main/java/constant/RedisConstant.java
+++ b/ycl-common/src/main/java/constant/RedisConstant.java
@@ -6,4 +6,8 @@
     //杞﹁締銆佷汉鑴稿湪绾跨巼  Redis 姣忔湀鏁版嵁涓柇娆℃暟 Hash key
     public final static String Check_Car_ViewConnect = "CarViewConnectNoData";
     public final static String Check_Face_ViewConnect = "FaceViewConnectNoData";
+
+    /** 鐐逛綅鍦ㄧ嚎锛宧ash鐨刱ey */
+    public final static String ONLINE_PREFIX = "ONLINE_";
+
 }
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java
new file mode 100644
index 0000000..c952333
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java
@@ -0,0 +1,21 @@
+package com.ycl.platform.domain.vo;
+
+import com.ycl.platform.domain.entity.WorkOrder;
+import lombok.Data;
+
+/**
+ * 鐩戞祴鍦ㄧ嚎鐨勭嚎绋嬭繑鍥炲璞�
+ *
+ * @author锛歺p
+ * @date锛�2024/9/10 11:44
+ */
+@Data
+public class OnlineThreadVO {
+
+    private Boolean online;
+
+    private String ip;
+
+    private WorkOrder workOrder;
+
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
index c870cd6..96507b0 100644
--- a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -155,11 +155,11 @@
      *
      * @return
      */
-    List<String> getDistinctIP();
+    List<TMonitor> getDistinctIP();
 
     /**
      * 鏍规嵁ip淇敼鐐逛綅琛ㄧ殑鏄惁鍦ㄧ嚎瀛楁
-     * @param online
+     * @param onlineList
      */
-    void updateOnline(@Param("online") UpdateOnlineVO online);
+    void updateOnline(@Param("onlineList") List<UpdateOnlineVO> onlineList);
 }
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java b/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
index 0c54687..e968d6d 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -26,13 +26,12 @@
 public interface WorkOrderService extends IService<WorkOrder> {
 
     /**
-     * 绯荤粺鍐呴儴鐨勬坊鍔狅紝涓嬪彂
+     * 绯荤粺鍐呴儴鐨勬坊鍔�
      *
      * @param workOrderList
      * @return
      */
     Boolean innerAddWorkOrder(List<WorkOrder> workOrderList);
-
 
     /**
      * 娣诲姞
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 2c3ae39..c070048 100644
--- a/ycl-server/src/main/java/com/ycl/task/UYTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -3,24 +3,33 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.mongodb.client.result.DeleteResult;
 import com.ycl.feign.UYClient;
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.entity.WorkOrder;
 import com.ycl.platform.domain.entity.YwPoint;
 import com.ycl.platform.domain.param.UY.*;
 import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
 import com.ycl.platform.domain.result.UY.*;
+import com.ycl.platform.domain.vo.OnlineThreadVO;
 import com.ycl.platform.domain.vo.UpdateOnlineVO;
 import com.ycl.platform.mapper.TMonitorMapper;
 import com.ycl.platform.service.UYErrorTypeCheckService;
+import com.ycl.platform.service.WorkOrderService;
 import com.ycl.platform.service.YwPointService;
+import com.ycl.system.domain.SysConfig;
+import com.ycl.system.mapper.SysConfigMapper;
+import com.ycl.thread.OnlineCheckThread;
 import com.ycl.utils.DateUtils;
 import com.ycl.utils.http.HttpUtils;
 import com.ycl.utils.http.SelfHttpUtil;
 import constant.ApiConstants;
+import constant.RedisConstant;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatusCode;
 import org.springframework.http.ResponseEntity;
@@ -30,14 +39,10 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 //浼樹簯瀵规帴鏁版嵁浠诲姟
 @Slf4j
@@ -51,6 +56,9 @@
     private final YwPointService pointService;
     private final TMonitorMapper monitorMapper;
     private final SelfHttpUtil selfHttpUtil;
+    private final RedisTemplate redisTemplate;
+    private final WorkOrderService workOrderService;
+    private final SysConfigMapper sysConfigMapper;
 
     @Value("${youYun.tenantId}")
     private String tenantId;
@@ -170,44 +178,51 @@
     /**
      * 鐐逛綅鍦ㄧ嚎妫�娴�
      */
-    public void pointOnline() {
+    public void pointOnline() throws ExecutionException, InterruptedException {
         log.info("寮�濮嬫娴嬬偣浣嶅湪绾�");
-        // 鍏堟煡鍑鸿澶嘔P闆嗗悎
-        List<String> ipList = monitorMapper.getDistinctIP();
-        String prefix = "http://";
-        Date now = new Date();
-        for (String ip : ipList) {
-            executorService.submit(() -> {
-                // 鍏堟娴嬭兘鍚﹁闂ip鐨勭綉椤�
-                ResponseEntity<Object> res = null;
-                UpdateOnlineVO online = new UpdateOnlineVO();
-                online.setIp(ip);
-                if ("127.0.0.1".equals(ip)) {
-                    online.setOnline(Boolean.FALSE);
-                    monitorMapper.updateOnline(online);
-                    return;
-                }
-                try {
-                    res = selfHttpUtil.get(prefix + ip, null, null);
-                    online.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode());
-                } catch (Exception e) {
-                    online.setOnline(Boolean.FALSE);
-                }
-                online.setUpdateTime(now);
-
-                // 濡傛灉http寰楀埌鐨勪笉鍦ㄧ嚎锛岄偅涔堝啀ping涓�涓�
-                boolean reachable = false;
-                if (! online.getOnline()) {
-                    try {
-                        reachable = InetAddress.getByName(ip).isReachable(3000);
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                    }
-                    online.setOnline(reachable);
-                }
-                monitorMapper.updateOnline(online);
-            });
+        Integer times = 2;
+        SysConfig config = new SysConfig();
+        config.setConfigKey("DAY_OF_POINT_OUTLINE_TIMES");
+        SysConfig sysConfig = sysConfigMapper.selectConfig(config);
+        if (Objects.nonNull(sysConfig)) {
+            times = Integer.valueOf(sysConfig.getConfigValue());
+        } else {
+            log.error("璇烽厤缃绾挎鏁帮紝姝ゆ璁剧疆涓洪粯璁ゅ��2");
         }
+        // 鍏堟煡鍑鸿澶嘔P闆嗗悎
+        List<TMonitor> monitorList = monitorMapper.getDistinctIP();
+        List<Future<OnlineThreadVO>> futureList = new ArrayList<>(48);
+        List<OnlineThreadVO> dataList = new ArrayList<>(48);
+        for (TMonitor monitor : monitorList) {
+            OnlineCheckThread thread = new OnlineCheckThread(monitor, redisTemplate, selfHttpUtil, times);
+            Future<OnlineThreadVO> future = executorService.submit(thread);
+            futureList.add(future);
+        }
+        for (Future<OnlineThreadVO> future : futureList) {
+            dataList.add(future.get()); // get鏂规硶浼氶樆濉烇紝鐭ラ亾鎷垮埌缁撴灉鎵嶇户缁墽琛宖or
+        }
+
+        // 鏇存柊point琛ㄧ殑鍦ㄧ嚎鏍囪瘑
+        Date now = new Date();
+        List<UpdateOnlineVO> willUpdateList = dataList.stream().map(item -> {
+            UpdateOnlineVO vo = new UpdateOnlineVO();
+            vo.setOnline(item.getOnline());
+            vo.setIp(item.getIp());
+            vo.setUpdateTime(now);
+            return vo;
+        }).collect(Collectors.toList());
+        monitorMapper.updateOnline(willUpdateList);
+
+        // 宸ュ崟
+        List<WorkOrder> workOrderList = dataList.stream()
+                .filter(item -> Objects.nonNull(item.getWorkOrder()))
+                .map(OnlineThreadVO::getWorkOrder)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(workOrderList)) {
+            return;
+        }
+        workOrderService.innerAddWorkOrder(workOrderList);
+        log.info("鐐逛綅鍦ㄧ嚎鐩戞祴瀹屾垚");
     }
 
     //鐐逛綅鍦ㄧ嚎鐜�
diff --git a/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
new file mode 100644
index 0000000..4003e46
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
@@ -0,0 +1,129 @@
+package com.ycl.thread;
+
+import com.ycl.platform.domain.entity.TMonitor;
+import com.ycl.platform.domain.entity.WorkOrder;
+import com.ycl.platform.domain.vo.OnlineThreadVO;
+import com.ycl.platform.domain.vo.UpdateOnlineVO;
+import com.ycl.utils.http.SelfHttpUtil;
+import constant.RedisConstant;
+import enumeration.ErrorType;
+import enumeration.general.WorkOrderStatusEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/9/10 11:43
+ */
+@Slf4j
+public class OnlineCheckThread implements Callable<OnlineThreadVO> {
+
+    private TMonitor monitor;
+
+    private RedisTemplate redisTemplate;
+
+    private SelfHttpUtil selfHttpUtil;
+
+    private Integer times;
+
+    public OnlineCheckThread(TMonitor monitor, RedisTemplate redisTemplate, SelfHttpUtil selfHttpUtil, Integer times) {
+        this.monitor = monitor;
+        this.redisTemplate = redisTemplate;
+        this.selfHttpUtil = selfHttpUtil;
+        this.times = times;
+    }
+
+    public Integer getTimes() {
+        return times;
+    }
+
+    public void setTimes(Integer times) {
+        this.times = times;
+    }
+
+    public SelfHttpUtil getSelfHttpUtil() {
+        return selfHttpUtil;
+    }
+
+    public void setSelfHttpUtil(SelfHttpUtil selfHttpUtil) {
+        this.selfHttpUtil = selfHttpUtil;
+    }
+
+    public TMonitor getMonitor() {
+        return monitor;
+    }
+
+    public void setMonitor(TMonitor monitor) {
+        this.monitor = monitor;
+    }
+
+    public RedisTemplate getRedisTemplate() {
+        return redisTemplate;
+    }
+
+    public void setRedisTemplate(RedisTemplate redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    @Override
+    public OnlineThreadVO call() throws Exception {
+        // 鍏堟娴嬭兘鍚﹁闂ip鐨勭綉椤�
+        ResponseEntity<Object> res = null;
+        OnlineThreadVO vo = new OnlineThreadVO();
+        vo.setIp(monitor.getIp());
+        log.info("鐩戞祴IP锛�" + monitor.getIp());
+        String prefix = "http://";
+        if ("127.0.0.1".equals(monitor.getIp())) {
+            vo.setOnline(Boolean.FALSE);
+            return vo;
+        }
+        try {
+            res = selfHttpUtil.get(prefix + monitor.getIp(), null, null);
+            vo.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode());
+        } catch (Exception e) {
+            vo.setOnline(Boolean.FALSE);
+        }
+
+        // 濡傛灉http寰楀埌鐨勪笉鍦ㄧ嚎锛岄偅涔堝啀ping涓�涓�
+        boolean reachable = false;
+        if (!vo.getOnline()) {
+            try {
+                reachable = InetAddress.getByName(monitor.getIp()).isReachable(3000);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            vo.setOnline(reachable);
+        }
+        if (!vo.getOnline()) {
+            Integer outLineTimes = (Integer) redisTemplate.opsForHash().get(RedisConstant.ONLINE_PREFIX, monitor.getIp());
+            if (Objects.isNull(outLineTimes)) {
+                outLineTimes = 1;
+            } else {
+                outLineTimes += 1;
+            }
+            redisTemplate.opsForHash().put(RedisConstant.ONLINE_PREFIX, monitor.getIp(), outLineTimes);
+            // 涓�澶╁唴鐩戞祴鍒扮绾�1娆′互涓婏紝鐢熸垚宸ュ崟
+            if (outLineTimes >= times) {
+                WorkOrder workOrder = new WorkOrder();
+                workOrder.setSerialNumber(monitor.getSerialNumber());
+                List<String> errList = new ArrayList<>();
+                errList.add(ErrorType.DEVICE_OFFLINE.getValue());
+                workOrder.setErrorTypeList(errList);
+                workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
+                vo.setWorkOrder(workOrder);
+            }
+        }
+        return vo;
+    }
+
+}
diff --git a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
index 7c7aef2..9bb7416 100644
--- a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
+++ b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -583,16 +583,22 @@
               serial_number in <foreach collection="gbList" open="(" separator="," close=")" item="no">#{no}</foreach>
     </select>
 
-    <select id="getDistinctIP" resultType="string">
+    <select id="getDistinctIP" resultType="com.ycl.platform.domain.entity.TMonitor">
         SELECT
-            DISTINCT ip
+            DISTINCT ip, serial_number
         FROM
             t_monitor
     </select>
 
     <update id="updateOnline">
-        update t_yw_ponit set online = #{online.online}, update_time = #{online.updateTime} WHERE EXISTS (
-                                                                                                          SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number
-                                                                                                      );
+        <foreach collection="onlineList" item="online" separator=";">
+            UPDATE
+                t_yw_point
+            SET
+                online = #{online.online},
+                update_time = #{online.updateTime}
+            WHERE
+                EXISTS (SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number)
+        </foreach>
     </update>
 </mapper>

--
Gitblit v1.8.0