fuliqi
2025-02-14 c6976365d5bfb39a32db8b541b1fe3ceb30c7826
ycl-server/src/main/java/com/ycl/task/OsdTask.java
@@ -2,18 +2,28 @@
import com.mongodb.client.result.DeleteResult;
import com.ycl.api.DH.lib.NetSDKLib;
import com.ycl.api.DH.lib.structure.NET_CFG_GBMODE_INFO;
import com.ycl.api.DH.lib.structure.NET_GBMODE_CUSTOMTITLE_INFO;
import com.ycl.api.DH.lib.structure.NET_TITLE_OSD_INFO;
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.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.result.OSDResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OsdCheckResult;
import com.ycl.platform.domain.vo.OnlineThreadVO;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.service.UYErrorTypeCheckService;
import com.ycl.platform.service.YwPointService;
import com.ycl.thread.OSDCheckThread;
import com.ycl.utils.DateUtils;
import com.ycl.utils.StringUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import enumeration.DeviceType;
import enumeration.general.AreaDeptEnum;
import lombok.extern.slf4j.Slf4j;
@@ -25,20 +35,30 @@
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.ycl.api.DH.lib.enumeration.NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_GBMODE;
@Slf4j
@Component("OsdTask")
public class OsdTask {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private TMonitorMapper monitorMapper;
    @Autowired
    private UYErrorTypeCheckService uyErrorTypeCheckService;
    @Autowired
    private YwPointService pointService;
    @Value("${HK.userName}")
    public String HKUserName;
    @Value("${HK.password}")
@@ -51,29 +71,34 @@
    public String YSUserName;
    @Value("${YS.password}")
    public String YSPassword;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private TMonitorMapper monitorMapper;
    @Autowired
    private UYErrorTypeCheckService uyErrorTypeCheckService;
    /**
     * 通过查mongoDB每日一机一档数据获取设备ip
     * 筛选视频设备
     * 通过设备ip、品牌调用不同api获取osd信息
     * 比对mongoDB一机一档信息,整理成result存入mongo
     * 同步品牌到mysql
     */
    //TODO:大华动态库linux换位置
    public void getOSD() {
    public void getOSD() throws ExecutionException, InterruptedException {
        log.info("开始获取OSD");
        List<OSDResult> osdResultList = new ArrayList<>();
//        //海康设备测试
//        //全景
//        OSDResult osd1 = HKApi.getOsdByIP("51031140001320359101","51.95.99.112", HKUserName, HKPassword);
//        log.info("海康全景:{}",osd1);
//        //细节
//        OSDResult osd2 = HKApi.getOsdByIP("51031140001321359101","51.95.99.112", HKUserName, HKPassword);
//        log.info("海康细节:{}",osd2);
//        //大华设备测试
//        OSDResult osd3 = DHApi.getOsd("51030244001320120201","51.95.4.3", DHUserName, DHPassword);
//        log.info("大华全景:{}",osd3);
//        OSDResult osd4 = DHApi.getOsd("51030244001321120201","51.95.4.3", DHUserName, DHPassword);
//        log.info("大华细节:{}",osd4);
        //查一机一档monitor
        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
        //需要考核的数据
        List<String> serialNumbers = oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(serialNumbers)) {
        if (!CollectionUtils.isEmpty(serialNumbers)) {
            ExecutorService executorService = new ThreadPoolExecutor(16,
                    128,
                    5000,
@@ -82,63 +107,34 @@
                    new ThreadPoolExecutor.CallerRunsPolicy()
            );
            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());
//            log.info("处理数据大小{}", monitors.size());
            //过滤掉无效ip并筛选出视频设备
            monitors = monitors.stream()
                    .filter(monitor -> !StringUtils.isEmpty(monitor.getIp()) &&
                            !"127.0.0.1".equals(monitor.getIp()))
                    .collect(Collectors.toList());
            List<Future<OSDResult>> futureList = new ArrayList<>(48);
            List<OSDResult> osdResultList = new ArrayList<>();
            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())) {
                        //宇视
                        OSDResult osd = YSApi.getOsd(monitor.getIp(), YSUserName, YSPassword);
                        if (checkSuccess(osdResultList, monitor, osd)) {
                            log.info("宇视调用成功" + osd);
                            return;
                        }
                    }
                    //未知品牌或者api调用失败,挨个执行所有api
                    OSDResult osd = tryAllApi(monitor);
                    if (osd != null) {
                        synchronized (osdResultList) {
                            osdResultList.add(osd);
                        }
                    }
                });
                OSDCheckThread thread = new OSDCheckThread(monitor);
                Future<OSDResult> future = executorService.submit(thread);
                futureList.add(future);
            }
            //不再接收新任务
            for (Future<OSDResult> future : futureList) {
                osdResultList.add(future.get());
            }
            executorService.shutdown();
            try {
                // 等待所有任务完成,最多等待10秒(可以根据需要调整)
                if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
                    // 如果超时,尝试停止当前正在执行的任务
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                // 当前线程在等待过程中被中断
                executorService.shutdownNow();
            }
            //结束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);
                log.info("校验结果:{}",osdCheckResult);
                checkResults.add(osdCheckResult);
                if (osdResult != null) {
                    TMonitor monitor = monitorMap.get(osdResult.getSerialNumber());
                    //封装OsdCheckResult
                    OsdCheckResult osdCheckResult = getOsdCheckResult(osdResult, monitor);
                    checkCorrect(osdResult, monitor, osdCheckResult);
                    checkResults.add(osdCheckResult);
                }
            }
            log.info("结果数据大小:{}", checkResults.size());
            //结果存入mongo
@@ -147,6 +143,18 @@
                //如果今天存在之前的数据先删除
                Query pyQuery = new Query(Criteria
                        .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
                List<OsdCheckResult> osdCheckResults = mongoTemplate.find(pyQuery, OsdCheckResult.class);
                pointService.setDeviceTagByGB(checkResults, CheckConstants.Rule_Category_Video);
                //添加旧数据进去
                List<String> resultNos = checkResults.stream().map(BaseResult::getNo).collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(osdCheckResults)) {
                    for (OsdCheckResult mongoResult : osdCheckResults) {
                        //如果新的结果中没有旧数据那么加进去
                        if (!resultNos.contains(mongoResult.getNo())) {
                            checkResults.add(mongoResult);
                        }
                    }
                }
                DeleteResult result = mongoTemplate.remove(pyQuery, OsdCheckResult.class);
                //存放在mongo中
                mongoTemplate.insertAll(checkResults);
@@ -160,6 +168,7 @@
    private OsdCheckResult getOsdCheckResult(OSDResult osdResult, TMonitor monitor) {
        OsdCheckResult osdCheckResult = new OsdCheckResult();
        osdCheckResult.setDeviceNo(osdResult.getSerialNumber());
        osdCheckResult.setNo(osdResult.getSerialNumber());
        osdCheckResult.setIp(monitor.getIp());
        osdCheckResult.setDeviceType(monitor.getCameraFunType());
        osdCheckResult.setCheckTime(osdResult.getCheckTime());
@@ -178,22 +187,25 @@
        if (osdResult.getCheckTime() != null && osdResult.getOsdTime() != null) {
            long checkTime = osdResult.getCheckTime().getTime();
            long osdTime = osdResult.getOsdTime().getTime();
            long timeDiff = (checkTime - osdTime) / 1000;
            long timeDiff = Math.abs((checkTime - osdTime) / 1000);
            if (timeDiff <= 60) {
                osdCheckResult.setOsdTimeCorrect(ApiConstants.OSD_Correct);
            } else {
                osdCheckResult.setOsdTimeCorrect(ApiConstants.OSD_Error);
            }
        } else {
            osdCheckResult.setOsdTimeCorrect(ApiConstants.OSD_Unknown);
        }
        //检查通道名是否正确
        //校验规则,这里暂时不比较全景和细节两字。
        if (!StringUtils.isEmpty(osdResult.getName()) && !StringUtils.isEmpty(monitor.getName())) {
            if (monitor.getName().equals(osdResult.getName()) || monitor.getName().replace("全景", "细节").equals(osdResult.getName()) || monitor.getName().replace("细节", "全景").equals(osdResult.getName())) {
            if (monitor.getName().equals(osdResult.getName())) {
                osdCheckResult.setOsdNameCorrect(ApiConstants.OSD_Correct);
                osdCheckResult.setOsdName(osdResult.getName());
            } else {
                osdCheckResult.setOsdNameCorrect(ApiConstants.OSD_Error);
            }
        } else {
            osdCheckResult.setOsdNameCorrect(ApiConstants.OSD_Unknown);
        }
        //检查省是否正确
        if (!StringUtils.isEmpty(osdResult.getOSD1())) {
@@ -202,6 +214,8 @@
            } else {
                osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Error);
            }
        } else {
            osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Unknown);
        }
        //检查市是否正确
        if (!StringUtils.isEmpty(osdResult.getOSD2())) {
@@ -210,52 +224,28 @@
            } else {
                osdCheckResult.setOsdCityCorrect(ApiConstants.OSD_Error);
            }
        } else {
            osdCheckResult.setOsdCityCorrect(ApiConstants.OSD_Unknown);
        }
        //检查区县是否正确
        if (!StringUtils.isEmpty(osdResult.getOSD3())) {
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(monitor.getSerialNumber().substring(0, 6));
            if (areaDeptEnum != null && osdResult.getOSD3().equals(areaDeptEnum.getName())) {
            if (areaDeptEnum != null && osdResult.getOSD3().equals(areaDeptEnum.getOsdName())) {
                osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Correct);
            } else {
                osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Error);
            }
        }
    }
    private boolean checkSuccess(List<OSDResult> osdResultList, TMonitor monitor, OSDResult osd) {
        if (osd != null) {
            osd.setSerialNumber(monitor.getSerialNumber());
            synchronized (osdResultList) {
                osdResultList.add(osd);
            }
            return true;
        } else {
            return false;
            osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Unknown);
        }
    }
    private OSDResult tryAllApi(TMonitor monitor) {
        //尝试海康的api
        OSDResult hkosd = HKApi.getOsdByIP(monitor.getIp(), HKUserName, HKPassword);
        if (hkosd != null) {
            hkosd.setSerialNumber(monitor.getSerialNumber());
            log.info("海康调用成功" + hkosd);
            return hkosd;
        }
        //尝试大华的api
        OSDResult dhosd = DHApi.getOsd(monitor.getIp(), DHUserName, DHPassword);
        if (dhosd != null) {
            dhosd.setSerialNumber(monitor.getSerialNumber());
            log.info("大华调用成功" + dhosd);
            return dhosd;
        }
        //宇视api
        OSDResult ysosd = YSApi.getOsd(monitor.getIp(), YSUserName, YSPassword);
        if (ysosd != null) {
            ysosd.setSerialNumber(monitor.getSerialNumber());
            log.info("宇视调用成功" + ysosd);
            return ysosd;
        }
        return null;
    public void test() throws ExecutionException, InterruptedException {
        log.info("测试获取OSD");
        OSDResult osd3 = DHApi.getOsdOld("51030340001320207201", "51.95.34.20", DHUserName, DHPassword);
        log.info("osd3:{}", osd3);
        OSDResult osd4 = DHApi.getOsdOld("51030342001320173201", "51.95.33.174", DHUserName, DHPassword);
        log.info("osd4:{}", osd4);
    }
}