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