xiangpei
2024-08-30 10f65333417f064377b01a89064d2ce716603a07
ycl-server/src/main/java/com/ycl/task/OsdTask.java
@@ -7,6 +7,8 @@
import com.ycl.api.DH.module.LoginModule;
import com.ycl.api.DH.utils.DHApi;
import com.ycl.api.HK.HKApi;
import com.ycl.api.YS.YSApi;
import com.ycl.api.YS.YSInit;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.result.OSDResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
@@ -49,6 +51,10 @@
    public String DHUserName;
    @Value("${DH.password}")
    public String DHPassword;
    @Value("${YS.userName}")
    public String YSUserName;
    @Value("${YS.password}")
    public String YSPassword;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
@@ -72,6 +78,9 @@
     */
    public void getOSD() {
        log.info("开始获取OSD");
//            YSApi.getOsd("51.95.66.42",YSUserName,YSPassword);
        DHApi.getOsd("51.95.67.189",DHUserName,DHPassword);
        //批量修改海康品牌集合
        List<String> hkList = new ArrayList<>();
        //批量修改大华品牌集合
@@ -84,84 +93,84 @@
        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
        //需要考核的数据
        List<String> serialNumbers = oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList());
        List<TMonitor> monitors = monitorMapper.selectByNumbers(serialNumbers);
        monitors = monitors.stream().filter(monitor -> monitor.getId()<7000).collect(Collectors.toList());
        log.info("处理数据大小{}",monitors.size());
        for (TMonitor monitor : monitors) {
            executorService.submit(() -> {
                if (DeviceType.HK.getType().equals(monitor.getDeviceType())) {
                    //海康品牌
                    OSDResult osd = HKApi.getOsdByIP(monitor.getIp(), HKUserName, HKPassword);
                    if (checkSuccess(osdResultList, monitor, osd)){
                        log.info("海康调用成功"+osd);
                        return;
        if(!CollectionUtils.isEmpty(serialNumbers)) {
            List<TMonitor> monitors = monitorMapper.selectByNumbers(serialNumbers);
            monitors = monitors.stream().filter(monitor -> !StringUtils.isEmpty(monitor.getIp()) && !"127.0.0.1".equals(monitor.getIp())).collect(Collectors.toList());
//            monitors = monitors.stream().filter(monitor -> monitor.getId() < 7000).collect(Collectors.toList());
            log.info("处理数据大小{}", monitors.size());
            for (TMonitor monitor : monitors) {
                executorService.submit(() -> {
                    if (DeviceType.HK.getType().equals(monitor.getDeviceType())) {
                        //海康品牌
                        OSDResult osd = HKApi.getOsdByIP(monitor.getIp(), HKUserName, HKPassword);
                        if (checkSuccess(osdResultList, monitor, osd)) {
                            log.info("海康调用成功" + osd);
                            return;
                        }
                    } else if (DeviceType.DH.getType().equals(monitor.getDeviceType())) {
                        //大华品牌
                        OSDResult osd = DHApi.getOsd(monitor.getIp(), DHUserName, DHPassword);
                        if (checkSuccess(osdResultList, monitor, osd)) {
                            log.info("大华调用成功" + osd);
                            return;
                        }
                    } else if (DeviceType.YS.getType().equals(monitor.getDeviceType())) {
                        //TODO:宇视api
                    }
                } else if (DeviceType.DH.getType().equals(monitor.getDeviceType())) {
                    //大华品牌
                    OSDResult osd = DHApi.getOsd(monitor.getIp(), DHUserName, DHPassword);
                    if (checkSuccess(osdResultList, monitor, osd)) {
                        log.info("大华调用成功"+osd);
                        return;
                    //未知品牌或者api调用失败,挨个执行所有api
                    OSDResult osd = tryAllApi(monitor, hkList, dhList, ysList);
                    if (osd != null) {
                        synchronized (osdResultList) {
                            osdResultList.add(osd);
                        }
                    }
                } else if (DeviceType.YS.getType().equals(monitor.getDeviceType())) {
                    //TODO:宇视api
                });
            }
            executorService.shutdown();
            try {
                // 等待所有任务完成,最多等待10秒(可以根据需要调整)
                if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
                    // 如果超时,尝试停止当前正在执行的任务
                    executorService.shutdownNow();
                }
                //未知品牌或者api调用失败,挨个执行所有api
                OSDResult osd = tryAllApi(monitor, hkList, dhList, ysList);
                if (osd != null) {
                    synchronized (osdResultList) {
                        osdResultList.add(osd);
                    }
                }
            });
        }
        executorService.shutdown();
        try {
            // 等待所有任务完成,最多等待10秒(可以根据需要调整)
            if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
                // 如果超时,尝试停止当前正在执行的任务
            } catch (InterruptedException e) {
                // 当前线程在等待过程中被中断
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            // 当前线程在等待过程中被中断
            executorService.shutdownNow();
            // 处理中断,例如重新抛出异常或记录日志
            Thread.currentThread().interrupt(); // 保持中断状态
            //结束api执行,开始校验
            List<OsdCheckResult> checkResults = new ArrayList<>();
            Map<String, TMonitor> monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
            for (OSDResult osdResult : osdResultList) {
                TMonitor monitor = monitorMap.get(osdResult.getSerialNumber());
                //封装OsdCheckResult
                OsdCheckResult osdCheckResult = getOsdCheckResult(osdResult, monitor);
                checkCorrect(osdResult, monitor, osdCheckResult);
                checkResults.add(osdCheckResult);
            }
            log.info("结果数据大小:{}", checkResults.size());
            //结果存入mongo
            if (!CollectionUtils.isEmpty(checkResults)) {
                log.info("存入mongo");
                //如果今天存在之前的数据先删除
                Query pyQuery = new Query(Criteria
                        .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
                DeleteResult result = mongoTemplate.remove(pyQuery, OsdCheckResult.class);
                //存放在mongo中
                mongoTemplate.insertAll(checkResults);
                // 工单生成
                uyErrorTypeCheckService.osdCheck(checkResults);
            }
            //修改数据库品牌
            if (!CollectionUtils.isEmpty(hkList)) {
                log.info("修改品牌");
                monitorMapper.batchUpdateDeviceType(hkList, DeviceType.HK.getType());
            }
            if (!CollectionUtils.isEmpty(dhList)) {
                log.info("修改品牌");
                monitorMapper.batchUpdateDeviceType(dhList, DeviceType.DH.getType());
            }
            //TODO:宇视
        }
        //结束api执行,开始校验
        List<OsdCheckResult> checkResults = new ArrayList<>();
        Map<String, TMonitor> monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
        for (OSDResult osdResult : osdResultList) {
            TMonitor monitor = monitorMap.get(osdResult.getSerialNumber());
            //封装OsdCheckResult
            OsdCheckResult osdCheckResult = getOsdCheckResult(osdResult, monitor);
            checkCorrect(osdResult, monitor, osdCheckResult);
            checkResults.add(osdCheckResult);
        }
        log.info("结果数据大小:{}",checkResults.size());
        //结果存入mongo
        if(!CollectionUtils.isEmpty(checkResults)){
            log.info("存入mongo");
            //如果今天存在之前的数据先删除
            Query pyQuery = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
            DeleteResult result = mongoTemplate.remove(pyQuery, OsdCheckResult.class);
            //存放在mongo中
            mongoTemplate.insertAll(checkResults);
            // 工单生成
            uyErrorTypeCheckService.osdCheck(checkResults);
        }
        //修改数据库品牌
        if(!CollectionUtils.isEmpty(hkList)){
            log.info("修改品牌");
            monitorMapper.batchUpdateDeviceType(hkList,DeviceType.HK.getType());
        }
        if(!CollectionUtils.isEmpty(dhList)){
            log.info("修改品牌");
            monitorMapper.batchUpdateDeviceType(dhList,DeviceType.DH.getType());
        }
        //TODO:宇视
        log.info("结束获取OSD");
    }
@@ -244,6 +253,7 @@
        OSDResult hkosd = HKApi.getOsdByIP(monitor.getIp(), HKUserName, HKPassword);
        if (hkosd != null) {
            hkosd.setSerialNumber(monitor.getSerialNumber());
            log.info("海康调用成功"+hkosd);
            synchronized (hkList) {
                hkList.add(monitor.getSerialNumber());
            }
@@ -253,6 +263,7 @@
        OSDResult dhosd = DHApi.getOsd(monitor.getIp(), DHUserName, DHPassword);
        if (dhosd != null) {
            dhosd.setSerialNumber(monitor.getSerialNumber());
            log.info("大华调用成功"+dhosd);
            synchronized (dhList) {
                dhList.add(monitor.getSerialNumber());
            }