‘liusuyi’
2023-08-07 be65526c48eaa674afe2601e2c53556d5797f2f3
优化雷达报警
已修改1个文件
149 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java
@@ -97,6 +97,8 @@
    @Resource
    private QueueManager queueManager;
    //endregion
    //每个点位未引导次数
    private Map<String, Integer> unGuideCountMap = new HashMap<>();
    /**
     * @描述 查询所有报警的当前数量
@@ -432,7 +434,6 @@
        }
    }
    private  Map<String,Integer> guideCountMap=new HashMap<>();
    /**
     * @描述 异步处理接收的报警
     * @参数 [topic, message]
@@ -544,81 +545,45 @@
                        }
                        double[] coordinate = new double[]{ardAlarmRadar.getLongitude(), ardAlarmRadar.getLatitude()};//报警坐标
                        //判断当前报警点5分钟内是否已引导
                        ardAlarmRadar.setGuideFlag(1);
                       // ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar);
                        ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:"+ardAlarmRadar.getName());//从redis中取出最新引导的报警数据
                        if (AlarmRadar==null) {
                            //5分钟内未引导直接入库
                            ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            redisCache.setCacheObject("global_alarm:"+ardAlarmRadar.getName(),ardAlarmRadar,5, TimeUnit.MINUTES);//引导数据写入redis
                            guideCountMap.put(ardAlarmRadar.getName(),0);
                            //获取雷达所在塔上的大光电
                            String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                            if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
                                //如果雷达塔上有光电
                                messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getCreateTime(), 1, 1, coordinate);
                            }
                            //获取报警点关联的大光电
                            ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
                            if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
                                String cameraId = ardAlarmpointsWell.getCameraId();
                                if (cameraId.equals(cameraIdWithTower)) {
                                    return;
                                }
                                log.info("获取到报警点关联的光电:" + cameraId);
                                //如果报警点关联了光电
                                messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), 1, 2, coordinate);
                            }
                        } else {
                            //获取当前报警点的未引导次数
                            Integer count = guideCountMap.get(ardAlarmRadar.getName());
                            if(count!=null)
                            {
                                if(count>2)
                                {
                                    ardAlarmRadar.setGuideFlag(1);
                                    redisCache.setCacheObject("global_alarm:"+ardAlarmRadar.getName(),ardAlarmRadar,5, TimeUnit.MINUTES);//引导数据写入redis
                                    count=0;
                        //从redis中取出当前报警点的5分钟内是否有引导
                        ArdAlarmRadar AlarmRadar = redisCache.getCacheObject("global_alarm:" + ardAlarmRadar.getName());//从redis中取出最新引导的报警数据
                        if (AlarmRadar == null) {
                            //5分钟内redis中没有数据,说明5分钟内没有引导数据
                            ardAlarmRadar.setGuideFlag(1);
                            //将引导数据写入redis 设置5分钟过期
                            redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES);//引导数据写入redis
                            unGuideCountMap.put(ardAlarmRadar.getName(), 0);
                            //引导入队
                            radarGuide(radarAlarmData.getRadarId(), alarmpointName, alarmType, ardAlarmRadar.getCreateTime(), coordinate);
                                    //获取雷达所在塔上的大光电
                                    String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarAlarmData.getRadarId());
                                    if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
                                        log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
                                        //如果雷达塔上有光电
                                        messagesEnqueued(cameraIdWithTower, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 1, coordinate);
                                    }
                                    //获取报警点关联的大光电
                                    ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
                                    if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
                                        String cameraId = ardAlarmpointsWell.getCameraId();
                                        if (cameraId.equals(cameraIdWithTower)) {
                                            return;
                                        }
                                        log.info("获取到报警点关联的光电:" + cameraId);
                                        //如果报警点关联了光电
                                        messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 2, coordinate);
                                    }
                                }
                                else
                                {
                        } else {
                            //5分钟内redis中有数据,说明5分钟内有引导数据,获取当前报警点的未引导次数
                            Integer count = unGuideCountMap.get(ardAlarmRadar.getName());
                            if (count != null) {
                                if (count > 2) {
                                    //未引导次数3次后进行引导
                                    ardAlarmRadar.setGuideFlag(1);
                                    //将引导数据写入redis 设置5分钟过期
                                    redisCache.setCacheObject("global_alarm:" + ardAlarmRadar.getName(), ardAlarmRadar, 5, TimeUnit.MINUTES);
                                    count = 0;
                                    //引导入队
                                    radarGuide(radarAlarmData.getRadarId(), alarmpointName, alarmType, ardAlarmRadar.getCreateTime(), coordinate);
                                } else {
                                    ardAlarmRadar.setGuideFlag(0);
                                    count++;
                                }
                            }
                            else
                            {
                            } else {
                                ardAlarmRadar.setGuideFlag(0);
                                count=0;
                                count = 0;
                            }
                            guideCountMap.put(ardAlarmRadar.getName(),count);
                            ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                            unGuideCountMap.put(ardAlarmRadar.getName(), count);
                        }
                        //入库
                        ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
                        // 结束时间
                        long etime = System.currentTimeMillis();
                        // 计算执行时间
                        log.info("雷达报警处理时长:"+(etime-stime)+"毫秒");
                        log.info("雷达报警处理时长:" + (etime - stime) + "毫秒");
                    }
                    //endregion
@@ -754,7 +719,7 @@
    private Boolean IsEnableGuide(String cameraId) {
        boolean enabled = false;
        ArdCameras ardCameras = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
        if(ardCameras!=null) {
        if (ardCameras != null) {
            if (ardCameras.getCamAlarmGuideEnable().equals(1)) {
                enabled = true;
            }
@@ -796,37 +761,29 @@
        return minDistanceCameraId;
    }
    public static void main(String[] args) {
        Comparator<Obj> PriorityDescCom = Comparator.comparingInt(Obj::getPriority).reversed();
        Comparator<Obj> NumDescCom = Comparator.comparingInt(Obj::getNum).reversed();
        Comparator<Obj> receiveTimeAscCom = Comparator.comparing(Obj::getAlarmTime);
        Comparator<Obj> comparator = PriorityDescCom.thenComparing(NumDescCom).thenComparing(receiveTimeAscCom);
        PriorityBlockingQueue<Obj> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
        priorityQueue.add(new Obj(999, 1, "2023-07-01 16:00:01"));
        priorityQueue.add(new Obj(999, 2, "2023-07-01 16:00:01"));
        priorityQueue.add(new Obj(999, 3, "2023-07-01 16:00:01"));
        List<Obj> elements = new ArrayList<>(priorityQueue);
        elements.sort(priorityQueue.comparator());  // 使用队列的比较器进行排序
        for (Obj task : elements) {
            log.info("正在排队【priority】" + task.getPriority() + "【num】" + task.getNum() + "【alarmTime】" + task.getAlarmTime());
    /**
     * 雷达引导入队
     */
    private void radarGuide(String radarId, String alarmpointName, String alarmType, Date createTime, double[] coordinate) {
        String uuid = IdUtils.simpleUUID();
        //获取雷达所在塔上的大光电
        String cameraIdWithTower = ardAlarmRadarMapper.getCameraByRadar(radarId);
        if (StringUtils.isNotNull(cameraIdWithTower) && StringUtils.isNotEmpty(cameraIdWithTower)) {
            log.info("获取到雷达塔上的光电:" + cameraIdWithTower);
            //如果雷达塔上有光电
            messagesEnqueued(cameraIdWithTower, uuid, alarmType, createTime, 1, 1, coordinate);
        }
        log.info("===================================================================");
        priorityQueue.add(new Obj(999, 5, "2023-07-01 16:00:01"));
        PriorityBlockingQueue queue = new PriorityBlockingQueue<>(priorityQueue);
        while (queue.size() > 0) {
            Obj task = (Obj) queue.poll();
            log.info("正在排队【priority】" + task.getPriority() + "【num】" + task.getNum() + "【alarmTime】" + task.getAlarmTime());
        //获取报警点关联的大光电
        ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(alarmpointName);
        if (StringUtils.isNotNull(ardAlarmpointsWell) && StringUtils.isNotEmpty(ardAlarmpointsWell.getCameraId())) {
            String cameraId = ardAlarmpointsWell.getCameraId();
            if (cameraId.equals(cameraIdWithTower)) {
                return;
            }
            log.info("获取到报警点关联的光电:" + cameraId);
            //如果报警点关联了光电
            messagesEnqueued(cameraId, uuid, alarmType, createTime, 1, 2, coordinate);
        }
    }
    @Data
    @AllArgsConstructor
    static class Obj {
        Integer priority;
        Integer num;
        String alarmTime;
    }
}