2021与蓝度共同重构项目,服务端
liuhaonan
2022-10-26 c7be2ef037c5aebb0cd8f1f33e5fa934389e6083
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,39 +15,49 @@
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.dto.DeviceStatus;
import com.sandu.ximon.admin.dto.WaterQualityDataDto;
import com.sandu.ximon.admin.manager.iot.frame.A1Frame;
import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5C3HeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A1TernaryCodeReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightResetReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.EmptyRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1DeviceMacRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1TernaryCodeRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.*;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.param.*;
import com.sandu.ximon.admin.param.PoleBindingParam;
import com.sandu.ximon.admin.param.PoleParam;
import com.sandu.ximon.admin.param.PoleStatesParam;
import com.sandu.ximon.admin.param.PushAirDataToNovaParam;
import com.sandu.ximon.admin.redis.DeviceRedisKey;
import com.sandu.ximon.admin.redis.LightKey;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.LightemitUtils;
import com.sandu.ximon.admin.utils.ListPagingUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.utils.*;
import com.sandu.ximon.admin.utils.response.VnnoxResult;
import com.sandu.ximon.admin.vo.DeviceOnLineCountVO;
import com.sandu.ximon.admin.vo.OnLineCountVO;
import com.sandu.ximon.admin.vo.PoleBindVO;
import com.sandu.ximon.admin.vo.RedisDeviceStatus;
import com.sandu.ximon.dao.bo.*;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.enums.OrderByEnums;
import com.sandu.ximon.dao.mapper.PoleMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
@@ -64,12 +75,15 @@
    private final PoleGroupRelationService groupRelationService;
    private final ClientService clientService;
    private final PoleMapper poleMapper;
    private final RedisUtils redisUtils;
    private final CountDownLatchUtil countDownLatchUtil;
    public boolean addPole(PoleParam param) {
        Pole pole = new Pole();
        BeanUtils.copyProperties(param, pole);
        pole.setPoleCode(generatePoleCode());
        pole.setDeviceType(-1);
        pole.setCentre(1);
        boolean save = save(pole);
        /**
@@ -98,6 +112,9 @@
        Pole update = new Pole();
        BeanUtils.copyProperties(param, update);
        update.setId(poleId);
        if (param.getIsCenter() != null) {
            update.setCentre(param.getIsCenter());
        }
        /**
         * 修改灯杆日志记录开始
         */
@@ -140,7 +157,7 @@
        StringBuilder sb = new StringBuilder();
        String date = new SimpleDateFormat("yyMMdd").format(new Date());
        sb.append(date);
        String key = LightKey.POLE_SN.key(null);
        String key = LightKey.POLE_SN.key(date);
        Long increment = redisService.incr(key, 1);
        String incrementStr = increment.toString();
        if (incrementStr.length() <= 4) {
@@ -157,9 +174,9 @@
     *
     * @return
     */
    public Map<String, Integer> poleCount() {
    public Map<String, Integer> poleCount1() {
        Map<String, Integer> result = new HashMap<>();
        LambdaQueryWrapper<Pole> wrapper = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<Pole> wrapper;
        if (SecurityUtils.getClientId() == null) {
            wrapper = Wrappers.lambdaQuery(Pole.class);
        } else {
@@ -167,137 +184,464 @@
                w.eq(Pole::getUserId, SecurityUtils.getUserId());
            });
        }
        //灯杆
        List<Pole> list = list(wrapper);
        List<Pole> poles = isOnLine(list);
        result.put("poleOnlineCount", poles.size());
        result.put("poleTotalCount", list.size());
        //诺瓦
        List<LedPlayerEntity> ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityList(null, null);
        int number = 0;
        for (LedPlayerEntity bean : ledPlayerEntities) {
            if (bean.getOnlineStatus() == 1) {
                number++;
            }
        }
        result.put("novaOnlineCount", number);
        List<LedPlayerEntity> ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityListOnHome();
        result.put("novaTotalCount", ledPlayerEntities.size());
        //ip音柱
        number = 0;
        BroadcastTerminalV2Param broadcastTerminalV2Param = new BroadcastTerminalV2Param();
        broadcastTerminalV2Param.setBindingState(2);
        broadcastTerminalV2Param.setWorkState(2);
        List<BroadcastTerminalV2EntityBo> broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalList(null, broadcastTerminalV2Param);
        for (BroadcastTerminalV2EntityBo bean : broadcastTerminalList) {
            if (bean.getStatus() == 1 || bean.getStatus() == 0) {
                number++;
            }
        }
        result.put("broadcastOnlineCount", number);
        List<BroadcastTerminalV2EntityBo> broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalListOnHome();
        result.put("broadcastTotalCount", broadcastTerminalList.size());
        //摄像头
        number = 0;
        MonitorParam monitorParam = new MonitorParam();
        monitorParam.setEquipmentState(2);
        monitorParam.setBindingState(2);
        List<MonitorBo> monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorByKeyword(null, monitorParam).getList();
        monitorParam.setEquipmentState(1);
        List<MonitorBo> online = SpringContextHolder.getBean(MonitorService.class).listMonitorByKeyword(null, monitorParam).getList();
        result.put("monitorOnlineCount", online.size());
        List<MonitorBo> monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorOnHome();
        result.put("monitorTotalCount", monitorBos.size());
        //单灯
        number = 0;
        List<Light> lights = SpringContextHolder.getBean(LightService.class).listLight();
        for (Light light : lights) {
            if (light.getOnlineStatus() == 1) {
                number++;
            }
        }
        result.put("LightOnlineCount", number);
        List<LightBo> lights = SpringContextHolder.getBean(LightService.class).listLightOnHome();
        result.put("LightTotalCount", lights.size());
        //充电桩
        number = 0;
        List<C3ChargingBo> c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingListByKeyword(null, null);
        for (C3ChargingBo c3ChargingBo : c3mChargings) {
            if (c3ChargingBo.getStatusBit() != 0) {
                number++;
            }
        }
        result.put("C3ChargingOnlineCount", number);
        List<C3ChargingBo> c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingList();
        result.put("C3ChargingTotalCount", c3mChargings.size());
        //大气
        number = 0;
        List<AirEquipmentBo> airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentByKeyword(null, null);
        for (AirEquipmentBo airEquipmentBo : airEquipments) {
            if (RedisUtils.getBean().get(AtmoFunctionCode.AIR_HEARTBEAT_STATE.getCode() + airEquipmentBo.getMac()) != null) {
                number++;
            }
        }
        result.put("AirEquipmentOnlineCount", number);
        List<AirEquipmentBo> airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentOnHome();
        result.put("AirEquipmentTotalCount", airEquipments.size());
        //大气(农耕)
        number = 0;
        List<AirEquipmentNongGengBo> airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentByKeyword(null, null);
        for (AirEquipmentNongGengBo airEquipmentNongGengBo : airEquipmentNongGengBos) {
            if (RedisUtils.getBean().get(AtmoFunctionCode.AIR_HEARTBEAT_NONG_GENG_STATE.getCode() + airEquipmentNongGengBo.getMac()) != null) {
                number++;
            }
        }
        result.put("AirEquipmentNongGengOnlineCount", number);
        List<AirEquipmentNongGengBo> airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentOnHome();
        result.put("AirEquipmentNongGengTotalCount", airEquipmentNongGengBos.size());
        //水质
        number = 0;
        List<WaterQualityEquipmentBo> waterQualityEquipments = SpringContextHolder.getBean(WaterQualityEquipmentService.class).listWaterQualityEquipmentByKeyword(null, null);
        for (WaterQualityEquipmentBo waterQualityEquipmentBo : waterQualityEquipments) {
            WaterQualityDataDto waterQualityDataDto = SpringContextHolder.getBean(WaterQualityDataService.class).getWaterQualityDataInfo(waterQualityEquipmentBo.getWaterQualityEquipmentCode());
            if (waterQualityDataDto != null) {
                number++;
            }
        }
        result.put("WaterQualityEquipmentOnlineCount", number);
        result.put("WaterQualityEquipmentTotalCount", waterQualityEquipments.size());
        //灯杆倾斜
        number = 0;
        List<LightPoleHeeling> lightPoleHeelings = SpringContextHolder.getBean(LightPoleHeelingService.class).listLightPoleHeelingByKeyword(null, null);
        for (LightPoleHeeling lightPoleHeeling : lightPoleHeelings) {
            if (RedisUtils.getBean().get(LightPoleHeelingEnum.LIGHT_POLE_HEELING_STATE.getCode() + lightPoleHeeling.getMac()) != null) {
                number++;
            }
        }
        result.put("LightPoleHeelingOnlineCount", number);
        result.put("LightPoleHeelingTotalCount", lightPoleHeelings.size());
        //灯杆倾斜
        List<LightPoleHeelingEquipmentBo> lightPoleHeelingEquipmentBos = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).LightPoleHeelingEquipmentListOnHome();
        result.put("LightPoleHeelingTotalCount", lightPoleHeelingEquipmentBos.size());
        //熙讯
        List<PoleLightemitEntity> poleLightemitEntities = SpringContextHolder.getBean(PoleLightemitService.class).listLed(null, false);
        List<PoleLightemitEntity> poleLightemitEntityOnlineList = SpringContextHolder.getBean(PoleLightemitService.class).listLed(null, true);
        result.put("XiXunOnlineCount", poleLightemitEntityOnlineList.size());
        List<PoleLightemitEntity> poleLightemitEntities = SpringContextHolder.getBean(PoleLightemitService.class).listLedOnHome();
        result.put("XiXunTotalCount", poleLightemitEntities.size());
        return result;
    }
    public CommonPage queryAllStatesAndList(Integer pageNo, Integer pageSize, PoleStatesParam param) {
    /**
     * 统计在线灯杆数量
     *
     * @return
     */
    public OnLineCountVO poleCount() {
        System.out.println("请求时间: " + LocalDateTime.now());
        OnLineCountVO onLineCountVO = new OnLineCountVO();
        CountDownLatch countDownLatch = new CountDownLatch(9);//todo
        //获取一个7位随机数
        String str = RandomStringUtils.randomAlphanumeric(7);
        countDownLatchUtil.push(str, countDownLatch);
        //诺瓦
        List<LedPlayerEntity> ledPlayerEntities = SpringContextHolder.getBean(LedPlayerEntityService.class).ledPlayerEntityListOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                //ip音柱
                DeviceOnLineCountVO ledNova = new DeviceOnLineCountVO();
                ledPlayerEntities.forEach(
                        Volume -> {
                            String s = redisUtils.get(DeviceRedisKey.NOVA + Volume.getId());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else {
                                    //离线
                                    offLine.getAndIncrement();
                                }
                            } else {
                                offLine.getAndIncrement();
                            }
                        }
                );
                ledNova.setTotalCount(ledPlayerEntities.size());
                ledNova.setOnlineCount(onLine.get());
                ledNova.setOfflineCount(offLine.get());
                onLineCountVO.setLedNova(ledNova);
                System.out.println("诺瓦执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //音柱
        List<BroadcastTerminalV2EntityBo> broadcastTerminalList = SpringContextHolder.getBean(IpVolumeService.class).getBroadcastTerminalListOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                //ip音柱
                DeviceOnLineCountVO ipVolume = new DeviceOnLineCountVO();
                broadcastTerminalList.forEach(
                        Volume -> {
                            String s = redisUtils.get(DeviceRedisKey.IP_BROADCAST + Volume.getId());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else {
                                    //离线
                                    offLine.getAndIncrement();
                                }
                            } else {
                                offLine.getAndIncrement();
                            }
                        }
                );
                ipVolume.setTotalCount(broadcastTerminalList.size());
                ipVolume.setOnlineCount(onLine.get());
                ipVolume.setOfflineCount(offLine.get());
                onLineCountVO.setBroadcast(ipVolume);
                System.out.println("音柱执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //摄像头
        List<MonitorBo> monitorBos = SpringContextHolder.getBean(MonitorService.class).listMonitorOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                DeviceOnLineCountVO Monitor = new DeviceOnLineCountVO();
                monitorBos.forEach(
                        device -> {
                            String s = redisUtils.get(DeviceRedisKey.MONITOR + device.getDeviceSerial());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else {
                                    //离线
                                    offLine.getAndIncrement();
                                }
                            } else {
                                offLine.getAndIncrement();
                            }
                        }
                );
                Monitor.setTotalCount(monitorBos.size());
                Monitor.setOnlineCount(onLine.get());
                Monitor.setOfflineCount(offLine.get());
                onLineCountVO.setMonitor(Monitor);
                System.out.println("摄像头执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //单灯
        List<LightBo> lights = SpringContextHolder.getBean(LightService.class).listLightOnHome();
        BaseConditionVO baseConditionVO = new BaseConditionVO();
        baseConditionVO.setPageNo(1);
        baseConditionVO.setPageSize(999);
        System.out.println("单灯故障统计时间: " + LocalDateTime.now());
        CommonPage commonPage = SpringContextHolder.getBean(LightReportErrorService.class).queryErrorCode(baseConditionVO);
        System.out.println("单灯故障统计时间: " + LocalDateTime.now());
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                AtomicInteger error = new AtomicInteger(commonPage.getList().size());
                DeviceOnLineCountVO light = new DeviceOnLineCountVO();
                lights.forEach(
                        device -> {
                            String s = redisUtils.get(DeviceRedisKey.LIGHT_DEVICE + device.getDeviceCode());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else {
                                    //离线
                                    offLine.getAndIncrement();
                                }
                            } else {
                                offLine.getAndIncrement();
                            }
                        }
                );
                light.setTotalCount(lights.size());
                light.setOnlineCount(onLine.get());
                light.setOfflineCount(offLine.get());
                light.setErrorCount(error.get());
                onLineCountVO.setLight(light);
                System.out.println("单灯执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //充电桩
        List<C3ChargingBo> c3mChargings = SpringContextHolder.getBean(C3ChargingService.class).getC3ChargingList();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                AtomicInteger error = new AtomicInteger(0);
                DeviceOnLineCountVO c3m = new DeviceOnLineCountVO();
                c3mChargings.forEach(
                        device -> {
                            String s = redisUtils.get(C3mRedisConstant.C3_STATUS.getCode() + device.getC3Mac());
                            RedisDeviceStatus redisDeviceStatus = new RedisDeviceStatus();
                            redisDeviceStatus.setDeviceId(device.getC3Id().toString());
                            if (s != null) {
                                A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage = JSON.parseObject(s, A5C3HeartbeatReportInnerFrame.HeartBeatDataPackage.class);
                                //  充电桩口状态位  1.空闲 2.充电中 3.充电中断,等待服务器确认 4.充电结束,等待服务器确认 5.有故障 6.与充电桩对接中
                                if ("5".equals(heartBeatDataPackage.getStatusBit())) {
                                    //故障
                                    onLine.getAndIncrement();
                                    error.getAndIncrement();
                                } else {
                                    //在线
                                    onLine.getAndIncrement();
                                }
                            } else {
                                //离线
                                offLine.getAndIncrement();
                            }
                        }
                );
                c3m.setTotalCount(c3mChargings.size());
                c3m.setOnlineCount(onLine.get());
                c3m.setOfflineCount(offLine.get());
                c3m.setErrorCount(error.get());
                onLineCountVO.setC3m(c3m);
                System.out.println("充电桩执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //大气
        List<AirEquipmentBo> airEquipments = SpringContextHolder.getBean(AirEquipmentService.class).listAirEquipmentOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                AtomicInteger error = new AtomicInteger(0);
                DeviceOnLineCountVO air = new DeviceOnLineCountVO();
                airEquipments.forEach(
                        device -> {
                            String s = redisUtils.get(DeviceRedisKey.AIR + device.getMac());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else if (redisDeviceStatus.getStatus() == 1) {
                                    //离线
                                    offLine.getAndIncrement();
                                } else {
                                    error.getAndIncrement();
                                }
                            } else {
                                error.getAndIncrement();
                            }
                        }
                );
                air.setTotalCount(airEquipments.size());
                air.setOnlineCount(onLine.get());
                air.setOfflineCount(offLine.get());
                air.setErrorCount(error.get());
                onLineCountVO.setAirEquipment(air);
                System.out.println("大气执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //大气(农耕)
//        List<AirEquipmentNongGengBo> airEquipmentNongGengBos = SpringContextHolder.getBean(AirEquipmentNongGengService.class).listAirEquipmentOnHome();
//        result.put("AirEquipmentNongGengTotalCount", airEquipmentNongGengBos.size());
        //水质
        List<WaterQualityEquipmentBo> waterQualityEquipments = SpringContextHolder.getBean(WaterQualityEquipmentService.class).listWaterQualityEquipmentByKeyword(null, null);
        new Thread(new Runnable() {
            @Override
            public void run() {
                DeviceOnLineCountVO water = new DeviceOnLineCountVO();
                water.setTotalCount(waterQualityEquipments.size());
                water.setOnlineCount(waterQualityEquipments.size());
                water.setOfflineCount(0);
                water.setErrorCount(0);
                onLineCountVO.setWaterEquipment(water);
                System.out.println("水质执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //灯杆倾斜
        List<LightPoleHeelingEquipmentBo> lightPoleHeelingEquipmentBos = SpringContextHolder.getBean(LightPoleHeelingEquipmentService.class).LightPoleHeelingEquipmentListOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                DeviceOnLineCountVO PoleHeeling = new DeviceOnLineCountVO();
                PoleHeeling.setTotalCount(lightPoleHeelingEquipmentBos.size());
                PoleHeeling.setOnlineCount(lightPoleHeelingEquipmentBos.size());
                PoleHeeling.setOfflineCount(0);
                PoleHeeling.setErrorCount(0);
                onLineCountVO.setLightPoleHeeling(PoleHeeling);
                System.out.println("灯杆倾斜执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        //熙讯
        List<PoleLightemitEntity> xiXuns = SpringContextHolder.getBean(PoleLightemitService.class).listLedOnHome();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                DeviceOnLineCountVO xixunLed = new DeviceOnLineCountVO();
                xiXuns.forEach(
                        device -> {
                            String s = redisUtils.get(DeviceRedisKey.XIXUN + device.getLightemitControlCode());
                            if (s != null) {
                                RedisDeviceStatus redisDeviceStatus = JSON.parseObject(s, RedisDeviceStatus.class);
                                if (redisDeviceStatus.getStatus() == 0) {
                                    //在线
                                    onLine.getAndIncrement();
                                } else {
                                    //离线
                                    offLine.getAndIncrement();
                                }
                            } else {
                                offLine.getAndIncrement();
                            }
                        }
                );
                xixunLed.setTotalCount(xiXuns.size());
                xixunLed.setOnlineCount(onLine.get());
                xixunLed.setOfflineCount(offLine.get());
                onLineCountVO.setLedXiXun(xixunLed);
                System.out.println("熙汛执行时间: " + LocalDateTime.now());
                countDownLatchUtil.countDown(str);
            }
        }).start();
        try {
            countDownLatch.await(20000, TimeUnit.MILLISECONDS);
            countDownLatchUtil.remove(str);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("响应时间: " + LocalDateTime.now());
        return onLineCountVO;
    }
    public CommonPage queryAllStatesAndList(Integer pageNo, Integer pageSize, PoleStatesParam param, Integer order, Integer seq) {
        if (param == null) {
            param = new PoleStatesParam();
        }
        System.out.println(param);
        //排序字段
        String orderByResult = OrderByEnums.POLE_ID.getCode();
        //正序、倒叙
        String orderBySeq = OrderByEnums.ASC.getCode();
        if (order != null) {
            switch (order) {
                case 1:
                    orderByResult = OrderByEnums.POLE_NAME.getCode();
                    break;
                case 2:
                    orderByResult = OrderByEnums.POLE_ID.getCode();
                    break;
                case 3:
                    orderByResult = OrderByEnums.POLE_CREATE_TIME.getCode();
                    break;
                default:
            }
        }
        if (seq != null) {
            switch (seq) {
                case 1:
                    orderBySeq = OrderByEnums.ASC.getCode();
                    break;
                case 2:
                    orderBySeq = OrderByEnums.DESC.getCode();
                    break;
                default:
                    break;
            }
        }
        //排序方式
        String orderBy = "t1." + orderByResult + " " + orderBySeq;
        List<Pole> poleList;
        Integer center = param.getCenter();
        if (SecurityUtils.getClientId() == null) {
            poleList = poleMapper.queryPoleOnLineStatesList(null, param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword());
            poleList = poleMapper.queryPoleOnLineStatesList(null, param.getIsTrue(),
                    param.getBingStates(), param.getGroupid(), param.getKeyword(), center, orderBy);
        } else {
            poleList = poleMapper.queryPoleOnLineStatesList(SecurityUtils.getUserId(), param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword());
            poleList = poleMapper.queryPoleOnLineStatesList(SecurityUtils.getUserId(),
                    param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword(), center, orderBy);
        }
        poleList.forEach(
                centre -> {
                    if (centre.getCentre() == 0) {
                        centre.setCenter(true);
                    }
                }
        );
        List<Pole> PoleResult = isOnLine(poleList, param);
        setCount(PoleResult);
@@ -339,6 +683,8 @@
        List<Pole> online = new ArrayList<>();//在线
        List<Pole> offline = new ArrayList<>();//离线
        list.forEach(onLinePole -> {
            System.out.println("online---------------------------------------------------" + ("ONLINE").equals(onLinePole.getOnLineState()));
            System.out.println("online---------------------------------------------------" + (onLinePole.getOnLineState()));
            if (("ONLINE").equals(onLinePole.getOnLineState())) {
                online.add(onLinePole);
            } else if (("OFFLINE").equals(onLinePole.getOnLineState())) {
@@ -381,25 +727,24 @@
     * @param param
     * @return
     */
    public List<Pole> isBind(List<Pole> list, PoleStatesParam param) {
        List<Pole> bindList = new ArrayList<>();//已绑定客户
        List<Pole> unbindList = new ArrayList<>();//未绑定客户
        list.forEach(bindwarpper -> {
//                Long clientId = bindwarpper.getClientId();
            if (bindwarpper.getClientId() == null) {//判断是否绑定
                unbindList.add(bindwarpper);
            } else {
                bindList.add(bindwarpper);
            }
        });
        if (param.getBingStates() == 0) {
            return bindList;
        } else if (param.getBingStates() == 1) {
            return unbindList;
        }
        return list;
    }
//    public List<Pole> isBind(List<Pole> list, PoleStatesParam param) {
//        List<Pole> bindList = new ArrayList<>();//已绑定客户
//        List<Pole> unbindList = new ArrayList<>();//未绑定客户
//        list.forEach(bindwarpper -> {
////                Long clientId = bindwarpper.getClientId();
//            if (bindwarpper.getClientId() == null) {//判断是否绑定
//                unbindList.add(bindwarpper);
//            } else {
//                bindList.add(bindwarpper);
//            }
//        });
//        if (param.getBingStates() == 0) {
//            return bindList;
//        } else if (param.getBingStates() == 1) {
//            return unbindList;
//        }
//        return list;
//    }
    public List<Pole> isTrue(List<Pole> list, PoleStatesParam param) {
        //实体灯杆
        List<Pole> isTrue = new ArrayList<>();
@@ -438,29 +783,20 @@
                MacCodes.add(post.getDeviceCode());
            }
        }
//
        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(MacCodes);
        if (deviceStatuses != null) {
            for (Pole post : list) {
                for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) {
        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses=null;
                    if (post.getDeviceCode() != null && post.getDeviceCode().equals(deviceStatus.getDeviceName())) {
                        post.setOnLineState(deviceStatus.getStatus());
        //拆分list
        List<List<String>> split = CollectionUtil.split(MacCodes, 50);
        for (List<String> splist : split) {
            deviceStatuses=MainBoardInvokeSyncService.getInstance().batchGetDeviceState(splist);
            if (deviceStatuses != null) {
                for (Pole post : list) {
                    for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) {
                        if (post.getDeviceCode() != null && post.getDeviceCode().equals(deviceStatus.getDeviceName())) {
                            post.setOnLineState(deviceStatus.getStatus());
                        }
                    }
                }
            }
        }
//        List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(MacCodes);
        return list;
    }
@@ -527,8 +863,8 @@
     *
     * @return 是否成功
     */
    public boolean unBindPole(Long poleId, String deviceCode) {
        return poleBindingService.unBindPole(poleId, deviceCode);
    public boolean unBindPole(Long poleId, String deviceCode,Integer deviceType) {
        return poleBindingService.unBindPole(poleId, deviceCode,deviceType);
    }
@@ -540,20 +876,21 @@
     */
    public boolean poleReset(Long id) {
        Pole byId = getById(id);
        String deviceName = byId.getDeviceCode();
        if (byId == null) {
            throw new BusinessException("未找到该灯杆");
        }
        String deviceName = byId.getDeviceCode();
        if (deviceName.isEmpty()) {
            throw new BusinessException("该灯杆Mca为空");
            throw new BusinessException("该灯杆Mac为空");
        }
        IRequestFrame build = FrameBuilder.builderA5().orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode()).innerFrame(new A5LightResetReqInnerFrame()).build();
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, build);
        StoreOperationRecordsUtils.storeInnerFrameData(deviceName, "灯杆恢复出厂设置", build, commonFrame);
        System.out.println(commonFrame.toString());
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build());
        IRequestFrame iRequestFrame = FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build();
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceName, iRequestFrame);
        StoreOperationRecordsUtils.storeInnerFrameData(deviceName, "灯杆重启", iRequestFrame, commonFrame);
        boolean b = false;
        if ("00".equals(rebootFrame.getPayload())) {
@@ -576,17 +913,13 @@
    /**
     * 给灯杆注册三元码
     */
    public boolean setMac(String baseMac) {
        // public boolean setMac() {
        //Pole pole = getById(poleId);
       /* if (pole == null) {
            throw new BusinessException("未找到该灯杆");
        }*/
    @Transactional(rollbackFor = Exception.class)
    public Map setMac(String baseMac) {
        boolean setMac = false;
        //String baseMac = "baseDevice";
        A1Frame a1Frame = new A1Frame(A1OrderEnum.REQUEST_READ_DEVICE_UNIQUE_MAC.getCode(), new EmptyRequestInnerFrame());
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, a1Frame);
        //存储振记录
        StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "注册三元码", a1Frame, commonFrame);
        if (commonFrame == null) {
            throw new BusinessException("读取设备唯一ID失败");
        }
@@ -611,34 +944,47 @@
        log.info(deviceDetail.toString());
        // 4   配置Mac①
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> productKeyResp = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(MainBoardInvokeSyncService.getInstance().getProductKey())).orderType(A1OrderEnum.REQUEST_SET_PRODUCT_KEY.getCode()).build(), A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame responseInnerFrame = productKeyResp.getResponseInnerFrame();
        IRequestFrame build1 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(MainBoardInvokeSyncService.getInstance().getProductKey())).orderType(A1OrderEnum.REQUEST_SET_PRODUCT_KEY.getCode()).build();
        CommonFrame commonFrame1 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build1);
        //存储振记录
        StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备配置ProductKey", build1, commonFrame1);
        A1TernaryCodeRespInnerFrame responseInnerFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame1.getPayload());
        if (!MainBoardInvokeSyncService.getInstance().getProductKey().equals(responseInnerFrame.getTernaryCode())) {
            throw new BusinessException("设备配置ProductKey失败");
        }
        // 5   配置Mac②
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(uniqueMac)).orderType(A1OrderEnum.REQUEST_SET_DEVICE_NAME.getCode()).build(), A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame deviceNameFrame = responseCommonFrame.getResponseInnerFrame();
        if (!uniqueMac.equals(deviceNameFrame.getTernaryCode())) {
        IRequestFrame build2 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(uniqueMac)).orderType(A1OrderEnum.REQUEST_SET_DEVICE_NAME.getCode()).build();
        CommonFrame commonFrame2 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build2);
        //存储振记录
        StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备配置名", build2, commonFrame2);
        A1TernaryCodeRespInnerFrame a1TernaryCodeRespInnerFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame2.getPayload());
        if (!uniqueMac.equals(a1TernaryCodeRespInnerFrame.getTernaryCode())) {
            throw new BusinessException("设备配置名失败");
        }
        // 6  配置Mac③
        WrapResponseCommonFrame<A1TernaryCodeRespInnerFrame> wrapResponseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(deviceDetail.getDeviceSecret())).orderType(A1OrderEnum.REQUEST_SET_DEVICE_SECRET.getCode()).build(), A1TernaryCodeRespInnerFrame.class);
        A1TernaryCodeRespInnerFrame deviceSecretFrame = wrapResponseCommonFrame.getResponseInnerFrame();
        IRequestFrame build3 = FrameBuilder.builderA1().innerFrame(new A1TernaryCodeReqInnerFrame(deviceDetail.getDeviceSecret())).orderType(A1OrderEnum.REQUEST_SET_DEVICE_SECRET.getCode()).build();
        CommonFrame commonFrame3 = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build3);
        //存储振记录
        StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "设备密钥", build3, commonFrame3);
        A1TernaryCodeRespInnerFrame deviceSecretFrame = new A1TernaryCodeRespInnerFrame().transformFrame(commonFrame3.getPayload());
        if (!deviceDetail.getDeviceSecret().equals(deviceSecretFrame.getTernaryCode())) {
            throw new BusinessException("设备密钥失败");
        }
        // 7  重启设备  并使用新的Mac
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build());
        IRequestFrame build4 = FrameBuilder.builderA2().innerFrame(new EmptyRequestInnerFrame()).orderType(A2OrderEnum.REQUEST_MAIN_BOARD_RESET.getCode()).build();
        CommonFrame rebootFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(baseMac, build4);
        //存储振记录
        StoreOperationRecordsUtils.storeInnerFrameData(baseMac, "重启设备", build4, rebootFrame);
        if ("00".equals(rebootFrame.getPayload())) {
            //  pole.setDeviceCode(uniqueMac);
            // setMac = updateById(pole);
            System.out.println("重启成功");
        }
@@ -647,11 +993,8 @@
        if (pole == null) {
            pole = new Pole();
        }
      /*  String type = uniqueMac.substring(uniqueMac.length() - 2, uniqueMac.length());
        String Code = uniqueMac.substring(0, uniqueMac.length() - 2);*/
        pole.setDeviceCode(uniqueMac);
        pole.setPoleName(uniqueMac);
        /*  int i = Integer.parseInt(strm);*/
        if ("00".equals(a1DeviceMacRespInnerFrame.getType())) {
            pole.setDeviceType(0);
        } else if ("01".equals(a1DeviceMacRespInnerFrame.getType())) {
@@ -659,9 +1002,18 @@
        }
        pole.setPoleCode(generatePoleCode());
//        setMac = save(pole);
        boolean result = saveOrUpdate(pole);
        if (result) {
            Light light = SpringContextHolder.getBean(LightService.class).getOne(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, pole.getDeviceCode()).last("limit 1"));
            if (light == null) {
                light = new Light();
                light.setDeviceCode(uniqueMac);
                light.setLightCount(2);
                SpringContextHolder.getBean(LightService.class).save(light);
            }
        }
        /**
         * 实体灯杆注册日志记录开始
@@ -671,8 +1023,14 @@
        /**
         * 实体灯杆注册日志记录结束
         */
        Map map = new HashMap();
        if (true) {
            map.put("mac", uniqueMac);
        } else {
            map.put("mac", -1);
        }
        return result;
        return map;
    }
    public List<String> listDeviceCodeByIds(List<Long> poleIdList) {
@@ -721,10 +1079,40 @@
            if (pole == null) {
                throw new BusinessException("灯杆不存在");
            }
            pole.setUserId(clientId);
            if (!clientService.findClientId(clientId)) {
                pole.setClientId(clientService.getClientId(clientId));
            pole.setClientId(clientId);
            if (clientService.findClientId(clientId)) {
                pole.setUserId(clientService.getClientId(clientId));
            }
            r = updateById(pole);
            if (!r) {
                throw new BusinessException("灯杆ID为" + poleId + "设置失败,自动停止");
            }
        }
        return r;
    }
    /**
     * 用户解绑灯杆
     *
     * @param clientId
     * @param poleIds
     * @return
     */
    public boolean ClientUnBindingPole(long clientId, int[] poleIds) {
        boolean r = false;
        for (int poleId : poleIds) {
            Pole pole = getById(poleId);
            if (pole == null) {
                throw new BusinessException("灯杆不存在");
            }
            //一级客户   -1   userId
            //二级客户   上级客户id  userId
            pole.setClientId(-1L);
            pole.setUserId(-1L);
            r = updateById(pole);
            if (!r) {
@@ -738,22 +1126,15 @@
    public List<Pole> getOwnerPole(BaseConditionVO baseConditionVO, String keyword, Long cilentId) {
        LambdaQueryWrapper<Pole> eq;
//        if(SecurityUtils.getClientId()!=null){
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if (clientService.findClientId(cilentId)) {
            eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getUserId, cilentId);
            eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, cilentId);
        } else {
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            eq = Wrappers.lambdaQuery(Pole.class).eq(Pole::getClientId, cilentId).or(pole -> {
                pole.eq(Pole::getUserId, cilentId);
            });
        }
//        }else {
//            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
//            eq = Wrappers.lambdaQuery(Pole.class);
//        }
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        if (!keyword.isEmpty()) {
            eq.like(Pole::getPoleName, keyword).or(code -> {
                code.like(Pole::getPoleCode, keyword);
@@ -761,6 +1142,7 @@
                deviceCode.like(Pole::getDeviceCode, keyword);
            });
        }
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        List<Pole> list;
        list = list(eq);
        setCount(list);
@@ -907,32 +1289,132 @@
            throw new BusinessException("设备不存在");
        }
        //关闭推送
        SpringContextHolder.getBean(LightemitUtils.class).clear(xixun.getDeviceCode());
        String clear = SpringContextHolder.getBean(LightemitUtils.class).clear(xixun.getDeviceCode());
        if (clear.contains("is not") || clear.contains("does not")) {
            throw new BusinessException("设备不在线或设备未存在于服务器");
        }
    }
    /**
     * 推送大气监测数据到novaLED
     */
    public VnnoxResult pushAirDataToNova(Long poleId) {
    public VnnoxResult pushAirDataToNova(PushAirDataToNovaParam param) {
        Long poleId = param.getPoleId();
        Pole pole = getById(poleId);
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3));
        if (air == null) {
            throw new BusinessException("未绑定大气监测设备");
        }
        PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 1));
        if (nova == null) {
            throw new BusinessException("未绑定nova设备");
        }
        LedPlayerEntity LED = SpringContextHolder.getBean(LedPlayerEntityService.class).getOne(Wrappers.lambdaQuery(LedPlayerEntity.class).eq(LedPlayerEntity::getSn, nova.getDeviceCode()));
        if (pole == null) {
            throw new BusinessException("灯杆不存在");
        }
        if (air == null) {
            throw new BusinessException("未绑定大气监测设备");
        }
        if (nova == null) {
            throw new BusinessException("未绑定nova设备");
        }
        //获取大气监测数据
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId);
        //推送数据
        return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(), data);
//        return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(),param.getDuration(), data);
        return SpringContextHolder.getBean(VnnoxService.class).WaterData(LED.getPlayerId(), param.getDuration(), data);
    }
    /**
     * 统计设备状态存入redis
     */
    public void setRedis() {
        //  redisStatusKeyTimeout为空  代表上次调用在15分钟前
        if (redisUtils.get("redisStatusKeyTimeout") != null) {
            //不为空  说明短时间内调用过  直接返回
            System.out.println("15分钟内已经更新过数据");
            return;
        }
        //设置触发条件    存入Redis  15分钟超时   15分钟内再次调用直接返回
        redisUtils.set("redisStatusKeyTimeout", System.currentTimeMillis(), 60 * 15);
        CountDownLatch countDownLatch = new CountDownLatch(7);//todo
        //获取一个7位随机数
        String str = RandomStringUtils.randomAlphanumeric(7);
        countDownLatchUtil.push(str, countDownLatch);
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(IpVolumeService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("音柱执行");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(MonitorService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("摄像头执行");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(LightService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("单灯执行");
            }
        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                SpringContextHolder.getBean(C3ChargingService.class).setCacheData();
//                countDownLatchUtil.countDown(str);
//                System.out.println("充电桩执行");
//            }
//        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(AirEquipmentService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("大气执行");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(PoleLightemitService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("熙汛执行");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(VnnoxService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("诺瓦执行");        //todo 诺瓦故障暂无
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringContextHolder.getBean(PoleLightemitService.class).setCacheData();
                countDownLatchUtil.countDown(str);
                System.out.println("熙汛执行");
            }
        }).start();
        try {
            countDownLatch.await(12000, TimeUnit.MILLISECONDS);
            countDownLatchUtil.remove(str);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}