2021与蓝度共同重构项目,服务端
liuhaonan
2022-09-28 1b4274e27a60892492195e7e3a4b820dcd2b6be5
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;
@@ -33,25 +34,32 @@
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.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;
/**
@@ -69,6 +77,8 @@
    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();
@@ -166,7 +176,7 @@
     *
     * @return
     */
    public Map<String, Integer> poleCount() {
    public Map<String, Integer> poleCount1() {
        Map<String, Integer> result = new HashMap<>();
        LambdaQueryWrapper<Pole> wrapper;
        if (SecurityUtils.getClientId() == null) {
@@ -223,6 +233,351 @@
        return result;
    }
    /**
     * 统计在线灯杆数量
     *
     * @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.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();
                            }
                        }
                );
                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();
        new Thread(new Runnable() {
            @Override
            public void run() {
                AtomicInteger onLine = new AtomicInteger(0);
                AtomicInteger offLine = new AtomicInteger(0);
                AtomicInteger error = new AtomicInteger(0);
                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 {
                                error.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(DeviceRedisKey.C3M + device.getC3Id());
                            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();
                            }
                        }
                );
                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.getAirMac());
                            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(12000, 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) {
@@ -939,7 +1294,7 @@
     * 推送大气监测数据到novaLED
     */
    public VnnoxResult pushAirDataToNova(PushAirDataToNovaParam param) {
        Long poleId=param.getPoleId();
        Long poleId = param.getPoleId();
        Pole pole = getById(poleId);
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3));
        PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 1));
@@ -957,8 +1312,104 @@
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId);
        //推送数据
//        return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(),param.getDuration(), data);
        return SpringContextHolder.getBean(VnnoxService.class).WaterData(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);
        }
    }
}