package com.ycl.task; 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; import org.springframework.beans.factory.annotation.Autowired; 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.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.*; 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}") public String HKPassword; @Value("${DH.userName}") public String DHUserName; @Value("${DH.password}") public String DHPassword; @Value("${YS.userName}") public String YSUserName; @Value("${YS.password}") public String YSPassword; /** * 通过查mongoDB每日一机一档数据获取设备ip * 筛选视频设备 * 通过设备ip、品牌调用不同api获取osd信息 * 比对mongoDB一机一档信息,整理成result存入mongo * 同步品牌到mysql */ public void getOSD() throws ExecutionException, InterruptedException { log.info("开始获取OSD"); // //海康设备测试 // //全景 // 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 oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class); //需要考核的数据 List serialNumbers = oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(serialNumbers)) { ExecutorService executorService = new ThreadPoolExecutor(16, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), new ThreadPoolExecutor.CallerRunsPolicy() ); List monitors = monitorMapper.selectByNumbers(serialNumbers); //过滤掉无效ip并筛选出视频设备 monitors = monitors.stream() .filter(monitor -> !StringUtils.isEmpty(monitor.getIp()) && !"127.0.0.1".equals(monitor.getIp())) .collect(Collectors.toList()); List> futureList = new ArrayList<>(48); List osdResultList = new ArrayList<>(); for (TMonitor monitor : monitors) { OSDCheckThread thread = new OSDCheckThread(monitor); Future future = executorService.submit(thread); futureList.add(future); } for (Future future : futureList) { osdResultList.add(future.get()); } executorService.shutdown(); //结束api执行,开始校验 List checkResults = new ArrayList<>(); Map monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); for (OSDResult osdResult : osdResultList) { 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 if (!CollectionUtils.isEmpty(checkResults)) { log.info("存入mongo"); //如果今天存在之前的数据先删除 Query pyQuery = new Query(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); List osdCheckResults = mongoTemplate.find(pyQuery, OsdCheckResult.class); pointService.setDeviceTagByGB(checkResults, CheckConstants.Rule_Category_Video); //添加旧数据进去 List 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); // 工单生成 uyErrorTypeCheckService.osdCheck(checkResults); } } log.info("结束获取OSD"); } 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()); osdCheckResult.setSetTime(osdResult.getOsdTime()); osdCheckResult.setOsdProvince(osdResult.getOSD1()); osdCheckResult.setOsdCity(osdResult.getOSD2()); osdCheckResult.setOsdPart(osdResult.getOSD3()); osdCheckResult.setOsdLB(osdResult.getOSD4()); osdCheckResult.setOsdName(osdResult.getName()); osdCheckResult.setDeviceBrand(osdResult.getDeviceBrand()); return osdCheckResult; } private void checkCorrect(OSDResult osdResult, TMonitor monitor, OsdCheckResult osdCheckResult) { //检查时间是否正确 if (osdResult.getCheckTime() != null && osdResult.getOsdTime() != null) { long checkTime = osdResult.getCheckTime().getTime(); long osdTime = osdResult.getOsdTime().getTime(); 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())) { 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())) { if ("四川".equals(osdResult.getOSD1())) { osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Correct); } else { osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Error); } } else { osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Unknown); } //检查市是否正确 if (!StringUtils.isEmpty(osdResult.getOSD2())) { if ("自贡".equals(osdResult.getOSD2())) { osdCheckResult.setOsdCityCorrect(ApiConstants.OSD_Correct); } 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.getOsdName())) { osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Correct); } else { osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Error); } } else { osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Unknown); } } 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); } }