fuliqi
2024-09-10 2a2885f45160b4048a27e75d5be03ba9232c7363
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
19个文件已修改
4个文件已添加
580 ■■■■ 已修改文件
ycl-common/src/main/java/constant/RedisConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderDetailVO.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/ReportController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/WorkOrderController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/ReportMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderErrorTypeMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/ReportService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/ReportServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ClearRedisTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/ReportMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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";
    /** 点位在线,hash的key */
    public final static String ONLINE_KEY = "ONLINE_";
}
ycl-pojo/src/main/java/com/ycl/platform/domain/query/WorkOrderQuery.java
@@ -24,7 +24,7 @@
    /**
     * 工单号
     */
    private String workOrderNo;
    private String keyword;
    /**
     * 运维处理时间
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java
New file
@@ -0,0 +1,21 @@
package com.ycl.platform.domain.vo;
import com.ycl.platform.domain.entity.WorkOrder;
import lombok.Data;
/**
 * 监测在线的线程返回对象
 *
 * @author:xp
 * @date:2024/9/10 11:44
 */
@Data
public class OnlineThreadVO {
    private Boolean online;
    private String ip;
    private WorkOrder workOrder;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderDetailVO.java
New file
@@ -0,0 +1,79 @@
package com.ycl.platform.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.platform.base.AbsVo;
import com.ycl.platform.domain.entity.WorkOrder;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.lang.NonNull;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * 工单展示
 *
 * @author xp
 * @since 2024-03-05
 */
@Data
public class WorkOrderDetailVO extends AbsVo {
    /** 工单号 */
    private String workOrderNo;
    /** 状态 */
    private String status;
    /** 运维单位 */
    private Integer unitId;
    private String unitName;
    private String unitContact;
    private String unitContactPhone;
    /** 工单来源/设备名称 */
    private String source;
    /**
     * 设备编号
     */
    private String serialNumber;
    /**
     * 处理时限
     */
    private Integer processingPeriod;
    /**
     * 是否重点点位
     */
    private Boolean important;
    /** 故障类型 */
    private List<String> errorTypeList;
    /** 故障类型 */
    private String errorType;
    /** 0未超时 1超时 */
    private Integer overtime;
    /** 下发时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date distributeTime;
    /**
     * 是否报备
     */
    private Boolean hasReport;
    public static WorkOrderDetailVO getVoByEntity(@NonNull WorkOrder entity, WorkOrderDetailVO vo) {
        if(vo == null) {
            vo = new WorkOrderDetailVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -7,6 +7,8 @@
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import enumeration.general.WorkOrderStatusEnum;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
@@ -27,7 +29,7 @@
    private String workOrderNo;
    /** 状态 */
    private String status;
    private WorkOrderStatusEnum status;
    /** 运维单位 */
    private Integer unitId;
ycl-server/src/main/java/com/ycl/platform/controller/ReportController.java
@@ -127,4 +127,11 @@
        ExcelUtil<ReportVO> util = new ExcelUtil<>(ReportVO.class);
        util.exportExcel(response, list, "运维单位");
    }
    @GetMapping("/list/{gb}")
    @ApiOperation(value = "根据国标码查报备", notes = "根据国标码查报备")
    public Result getListByGb(@PathVariable("gb") String gb)
    {
        return reportService.getListByGb(gb);
    }
}
ycl-server/src/main/java/com/ycl/platform/controller/WorkOrderController.java
@@ -1,9 +1,11 @@
package com.ycl.platform.controller;
import com.ycl.platform.domain.entity.WorkOrderAuditingRecord;
import com.ycl.platform.domain.form.*;
import com.ycl.platform.domain.query.DistributeWorkOrderQuery;
import com.ycl.platform.domain.query.WorkOrderQuery;
import com.ycl.platform.domain.vo.DistributeWorkOrderVO;
import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO;
import com.ycl.platform.service.WorkOrderService;
import com.ycl.system.Result;
import com.ycl.system.domain.group.Add;
@@ -143,4 +145,27 @@
    public Result list() {
        return workOrderService.all();
    }
    @GetMapping("/detail/info/{workOrderNo}")
    @ApiOperation(value = "详情", notes = "详情")
    @PreAuthorize("@ss.hasPermi('work:order:detail')")
    public Result detailByNo(@PathVariable("workOrderNo") String workOrderNo) {
        return workOrderService.detailByNo(workOrderNo);
    }
    @GetMapping("/yw-condition-list/{workOrderNo}")
    @ApiOperation(value = "运维情况记录列表", notes = "运维情况记录列表")
    public Result ywCondition(@PathVariable String workOrderNo) {
        List<WorkOrderYwConditionRecordVO> data = workOrderService.selectYwConditionByYwId(workOrderNo);
        return Result.ok().data(data);
    }
    @GetMapping("/yw-auditing-list/{workOrderNo}")
    @ApiOperation(value = "运维审核记录", notes = "运维审核记录")
    public Result ywAuditingByYwId(@PathVariable String workOrderNo) {
        List<WorkOrderAuditingRecord> data = workOrderService.selectYwAuditingListByYwId(workOrderNo);
        return Result.ok().data(data);
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/ReportMapper.java
@@ -49,4 +49,12 @@
     * @return
     */
    List<Report> getTogether(@Param("pid") String pid);
    /**
     * 国标码查设备
     *
     * @param gb
     * @return
     */
    List<ReportVO> getListByGb(@Param("gb") String gb);
}
ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -156,13 +156,14 @@
     *
     * @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);
    /**
     * 点位在线率
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderErrorTypeMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.platform.domain.entity.WorkOrderErrorType;
import com.ycl.system.entity.SysDictData;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Repository;
@@ -87,4 +88,11 @@
     */
    int addMany(@Param("errorTypeList") List<WorkOrderErrorType> errorTypeList);
    /**
     * 获取故障类型,连表字典
     *
     * @param workOrderNo
     * @return
     */
    List<SysDictData> getErrorList(@Param("workOrderNo") String workOrderNo);
}
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -5,6 +5,7 @@
import com.ycl.platform.domain.entity.WorkOrder;
import com.ycl.platform.domain.query.*;
import com.ycl.platform.domain.vo.DeviceInfoVO;
import com.ycl.platform.domain.vo.WorkOrderDetailVO;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.domain.vo.YwPointJobVO;
import com.ycl.platform.domain.vo.screen.ScreenWorkOrderVO;
@@ -92,4 +93,12 @@
     * @return
     */
    List<WorkOrder> getNotFinishedWorkOrders(@Param("list") List<String> serialNumberList);
    /**
     * 工单号查详情
     *
     * @param workOrderNo
     * @return
     */
    WorkOrderDetailVO detailByNo(@Param("workOrderNo") String workOrderNo);
}
ycl-server/src/main/java/com/ycl/platform/service/ReportService.java
@@ -109,4 +109,12 @@
     * @return
     */
    Result getTogether(String pid);
    /**
     * 国标码查报备记录
     *
     * @param gb
     * @return
     */
    Result getListByGb(String gb);
}
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);
    /**
     * 添加
@@ -216,4 +215,12 @@
     * @return
     */
    Result processImg(String workOrderNo);
    /**
     * 工单详情
     *
     * @param workOrderNo
     * @return
     */
    Result detailByNo(String workOrderNo);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/ReportServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.platform.domain.dto.ReportImportDTO;
import com.ycl.platform.domain.entity.*;
@@ -386,4 +387,18 @@
        }
        return Result.ok("操作成功");
    }
    @Override
    public Result getListByGb(String gb) {
        List<ReportVO> list = baseMapper.getListByGb(gb);
        for (ReportVO report : list) {
            List<ReportErrorType> errors = new LambdaQueryChainWrapper<>(reportErrorTypeService.getBaseMapper())
                    .eq(ReportErrorType::getReportId, report.getId())
                    .orderByDesc(ReportErrorType::getCreateTime)
                    .list();
            String err = errors.stream().map(ReportErrorType::getErrorType).collect(Collectors.joining(","));
            report.setErrorType(err);
        }
        return Result.ok().data(list);
    }
}
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -26,6 +26,7 @@
import com.ycl.platform.wvp.WVPResult;
import com.ycl.system.Result;
import com.ycl.system.domain.SysConfig;
import com.ycl.system.entity.SysDictData;
import com.ycl.system.mapper.SysConfigMapper;
import com.ycl.system.mapper.SysDictDataMapper;
import com.ycl.system.model.LoginUser;
@@ -55,11 +56,6 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
@@ -782,4 +778,19 @@
        }
        return Result.ok().data(process);
    }
    @Override
    public Result detailByNo(String workOrderNo) {
        WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo);
        // 是否报备
        boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper)
                .eq(Report::getSerialNumber, workOrder.getSerialNumber())
                .exists();
        workOrder.setHasReport(hasReport);
        // 故障类型
        List<SysDictData> errorList = workOrderErrorTypeService.getBaseMapper().getErrorList(workOrder.getWorkOrderNo());
        List<String> errList = errorList.stream().map(SysDictData::getDictLabel).collect(Collectors.toList());
        workOrder.setErrorTypeList(errList);
        return Result.ok().data(workOrder);
    }
}
ycl-server/src/main/java/com/ycl/task/ClearRedisTask.java
New file
@@ -0,0 +1,28 @@
package com.ycl.task;
import constant.RedisConstant;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
 * 定时清理redis中的数据
 *
 * @author:xp
 * @date:2024/9/10 15:26
 */
@RequiredArgsConstructor
@Component("clearRedisTask")
public class ClearRedisTask {
    private final RedisTemplate redisTemplate;
    /**
     * 清除在线监测的redis计离线次数
     *
     */
    public void clearOnlineData() {
        redisTemplate.delete(RedisConstant.ONLINE_KEY);
    }
}
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("开始检测点位在线");
        // 先查出设备IP集合
        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");
        }
        // 先查出设备IP集合
        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方法会阻塞,知道拿到结果才继续执行for
        }
        // 更新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("点位在线监测完成");
    }
    //点位在线率
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
New file
@@ -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:xp
 * @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_KEY, monitor.getIp());
            if (Objects.isNull(outLineTimes)) {
                outLineTimes = 1;
            } else {
                outLineTimes += 1;
            }
            redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, 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;
    }
}
ycl-server/src/main/resources/application-dev.yml
@@ -37,9 +37,9 @@
spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://localhost:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true
    url: jdbc:mysql://101.35.247.188:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true
    username: root
    password: 1234
    password: ycl@202466
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
ycl-server/src/main/resources/mapper/zgyw/ReportMapper.xml
@@ -61,6 +61,34 @@
        ORDER BY r.update_time DESC
    </select>
    <select id="getListByGb"  resultType="com.ycl.platform.domain.vo.ReportVO">
        SELECT
           DISTINCT
            r.id,
            r.report_materials,
            r.create_time,
            r.report_type,
            r.report_content,
            r.status,
            r.serial_number as pointId,
            r.begin_create_time,
            r.end_create_time,
            r.import_batch_number,
            r.update_time,
            u.unit_name,
            p.yw_person_name as peopleName,
            pt.point_name
        FROM
            t_report r
                INNER JOIN t_report_error_type ret ON ret.report_id = r.id and ret.deleted = 0
                LEFT JOIN t_yw_unit u ON r.unit_id = u.id and u.deleted = 0
                LEFT JOIN t_yw_people p ON r.people_id = p.id and p.deleted = 0
                LEFT JOIN t_yw_point pt ON r.serial_number = pt.serial_number and pt.deleted = 0
        WHERE
            r.serial_number = #{gb} AND r.deleted = 0
        ORDER BY r.update_time DESC
    </select>
    <select id="examineRecord" resultMap="BaseResultMap">
        SELECT
            r.*, u.unit_name, p.yw_person_name as peopleName, pt.point_name, ar.result, ar.result_remark, ar.create_time as auditing_time
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -594,16 +594,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>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderErrorTypeMapper.xml
@@ -97,4 +97,8 @@
        </foreach>
    </insert>
    <select id="getErrorList" resultType="com.ycl.system.entity.SysDictData">
        SELECT da.dict_value, da.dict_label FROM t_work_order_error_type oer INNER JOIN sys_dict_data da ON oer.error_name = da.dict_value WHERE oer.work_order_no = #{workOrderNo}
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -32,7 +32,17 @@
    <select id="page" resultMap="BaseResultMap">
        SELECT
        wo.id,wo.status, wo.work_order_no, wo.serial_number,wo.create_time, wo.unit_id, wo.yw_people_id, wo.yw_handle_time, wo.yw_result, wo.yw_check_result, wo.overtime, wo.deduct,
        wo.id,wo.status,
        wo.work_order_no,
        wo.serial_number,
        wo.create_time,
        wo.unit_id,
        wo.yw_people_id,
        wo.yw_handle_time,
        wo.yw_result,
        wo.yw_check_result,
        wo.overtime,
        wo.deduct,
        u.unit_name,
        p.yw_person_name,
        tm.name as source,
@@ -52,14 +62,11 @@
        <if test="query.unitId != null">
            AND wo.unit_id = #{query.unitId}
        </if>
        <if test="query.workOrderNo != null and query.workOrderNo != ''">
            AND wo.work_order_no = #{query.workOrderNo}
        <if test="query.keyword != null and query.keyword != ''">
            AND (wo.work_order_no like concat('%', #{query.keyword}, '%') or tm.name like concat('%', #{query.keyword}, '%'))
        </if>
        <if test="query.status != null and query.status != ''">
            AND wo.status = #{query.status}
        </if>
        <if test="query.status == null or query.status == ''">
            AND wo.status = 'DISTRIBUTED'
        </if>
        <if test="query.start != null">
            AND wo.yw_handle_time BETWEEN #{query.start} AND #{query.end}
@@ -289,4 +296,24 @@
        <result column="status" property="status" typeHandler="com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler"/>
        <result column="error_names" property="errorType"/>
    </resultMap>
    <select id="detailByNo" resultType="com.ycl.platform.domain.vo.WorkOrderDetailVO">
        SELECT
            wo.id,
            wo.work_order_no,
            wo.serial_number,
            dr.create_time as distributeTime,
            m.name as source,
            yw.unit_name,
            yw.unit_contact,
            yw.unit_contact_phone,
            wo.overtime,
            wo.processing_period,
            wo.status
        FROM
          t_work_order wo
              INNER JOIN t_work_order_distribute_record dr ON wo.work_order_no = dr.work_order_no AND dr.deleted = 0 AND wo.work_order_no = #{workOrderNo}
              INNER JOIN t_monitor m ON m.serial_number = wo.serial_number
              LEFT JOIN t_yw_unit yw ON yw.id = wo.unit_id AND yw.deleted = 0
    </select>
</mapper>