fuliqi
2024-11-13 51396d6ed0747b1e909056ed72108b6b0c811667
离线检测优化
6个文件已修改
156 ■■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/config/RedisConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    /**
     * 动态列
     */
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;
    }
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次,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);
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);
        }
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<>();
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<>();
        // 从Redis获取数据时进行类型安全的转换
        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("检测web异常"+e.getMessage());
            log.info("检测web异常" + 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访问正常;";
        }
        if (! pingReachable) {
        if (!pingReachable) {
            status += "设备ip未ping通;";
        }else if(pingReachable){
        } else if (pingReachable) {
            status += "设备ipPing正常;";
        }
        if (StringUtils.isEmpty(imgUrl)) {
            status += "未获取到图片";
        }else {
        } else {
            status += "获取图片正常";
        }
        result.setStatus(status);
@@ -198,9 +226,9 @@
            e.printStackTrace();
        }
        String status = "";
        if (! pingReachable) {
        if (!pingReachable) {
            status += "ip未ping通;";
        }else {
        } else {
            status += "成功";
        }
        result.setStatus(status);