From ba1e219d97e123b91657dc424f13a2fdeaa85d21 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: Mon, 21 Aug 2023 13:37:01 +0800
Subject: [PATCH] 修改兴趣点列表井号模糊查询

---
 ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java |  168 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 79 insertions(+), 89 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java
index 64818b7..0529d64 100644
--- a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java
@@ -30,8 +30,8 @@
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.constant.CamPriority;
 import com.ruoyi.device.external.domain.ArdEquipExternal;
 import com.ruoyi.device.external.mapper.ArdEquipExternalMapper;
 import com.ruoyi.utils.tools.ArdTool;
@@ -42,8 +42,6 @@
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.utils.tube.GeoPoint;
 import com.ruoyi.utils.tube.TubeTools;
-import lombok.AllArgsConstructor;
-import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -51,8 +49,9 @@
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.concurrent.PriorityBlockingQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+
 
 /**
  * @Description: 全局报警业务
@@ -96,6 +95,8 @@
     @Resource
     private QueueManager queueManager;
     //endregion
+    //每个点位未引导次数
+    private Map<String, Integer> unGuideCountMap = new HashMap<>();
 
     /**
      * @描述 查询所有报警的当前数量
@@ -500,6 +501,7 @@
                     //region 处理通用光电报警
                     ArdAlarmCamera ardAlarmCamera = JSONObject.parseObject(message, ArdAlarmCamera.class);
                     ardAlarmCamera.setId(IdUtils.simpleUUID());
+                    ardAlarmCamera.setCreateTime(new Date());
                     int aac = ardAlarmCameraMapper.insertArdAlarmCamera(ardAlarmCamera);
                     if (aac > 0) {
                         log.debug("camera入库成功:" + ardAlarmCamera);
@@ -518,10 +520,9 @@
                         ardAlarmRadar.setName(ardAlarmRadar.getName() + "(" + radarAlarmData.getRadarName() + ")");//报警点名称
                         ardAlarmRadar.setCreateTime(new Date());//接收时间
 
-                        String alarmType = "";
                         switch (ardAlarmRadar.getAlarmType()) {
                             case "运动目标检测":
-                                alarmType = "sys_radar_move";
+                                String alarmType = "sys_radar_move";
                                 break;
                             case "热源检测":
                                 alarmType = "sys_radar_fire";
@@ -535,64 +536,55 @@
                                 }
                                 break;
                         }
+                        //入库
+                        ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
+
+                    }
+                    //按兴趣点去重,然后按引导逻辑进行引导入队
+                    ardAlarmRadars = ardAlarmRadars.stream()
+                    .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new java.util.TreeSet<>(java.util.Comparator.comparing(ArdAlarmRadar::getName))), ArrayList::new));
+                    for(ArdAlarmRadar ardAlarmRadar : ardAlarmRadars)
+                    {
+                        //遍历报警数据进行引导
                         if (StringUtils.isNull(ardAlarmRadar.getLongitude()) || StringUtils.isNull(ardAlarmRadar.getLatitude())) {
+                            //坐标为空不引导
                             continue;
                         }
                         double[] coordinate = new double[]{ardAlarmRadar.getLongitude(), ardAlarmRadar.getLatitude()};//报警坐标
-                        //判断当前报警点5分钟内是否已引导
-                        ardAlarmRadar.setGuideFlag(1);
-                        ArdAlarmRadar AlarmRadar = ardAlarmRadarMapper.getArdAlarmRadarWithGuide(ardAlarmRadar);
-                        if (StringUtils.isNull(AlarmRadar)) {
-                            //5分钟内未引导直接入库
-                            ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
-                            //获取雷达所在塔上的大光电
-                            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 (cameraIdWithTower.equals(cameraId)) {
-                                    return;
-                                }
-                                log.info("获取到报警点关联的光电:" + cameraId);
-                                //如果报警点关联了光电
-                                messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), 1, 2, coordinate);
-                            }
+                        //从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(), ardAlarmRadar.getName(), ardAlarmRadar.getAlarmType(), ardAlarmRadar.getCreateTime(), coordinate);
+
                         } else {
-                            //5分钟内有引导
-                            ardAlarmRadar.setGuideFlag(0);
-                            int count = ardAlarmRadarMapper.getArdAlarmRadarWithNotGuide(ardAlarmRadar, AlarmRadar.getCreateTime());
-                            //未引导超过3次,直接入库入队
-                            if (count >= 3) {
-                                ardAlarmRadar.setGuideFlag(1);
-                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
-                                //获取雷达所在塔上的大光电
-                                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 (cameraIdWithTower.equals(cameraId)) {
-                                        return;
-                                    }
-                                    log.info("获取到报警点关联的光电:" + cameraId);
-                                    //如果报警点关联了光电
-                                    messagesEnqueued(cameraId, uuid, alarmType, ardAlarmRadar.getCreateTime(), count, 2, coordinate);
+                            //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(), ardAlarmRadar.getName(), ardAlarmRadar.getAlarmType(), ardAlarmRadar.getCreateTime(), coordinate);
+                                } else {
+                                    ardAlarmRadar.setGuideFlag(0);
+                                    count++;
                                 }
                             } else {
-                                //未引导未超过3次,直接入库
-                                ardAlarmRadarMapper.insertArdAlarmRadar(ardAlarmRadar);
+                                ardAlarmRadar.setGuideFlag(0);
+                                count = 0;
                             }
+                            unGuideCountMap.put(ardAlarmRadar.getName(), count);
+                            //更新
+                            ardAlarmRadarMapper.updateArdAlarmRadar(ardAlarmRadar);
                         }
                     }
                     //endregion
@@ -703,8 +695,12 @@
             //接收时间
             guideTask.setReceiveTime(fmt.format(receiveTime));
             //报警优先级(通过优先级字典)
-            Integer priority = CamPriority.priorityMap.get(alarmType);
-            guideTask.setPriority(priority);
+            String priority = DictUtils.getDictValue("cameras_priority", alarmType);
+            if (StringUtils.isEmpty(priority)) {
+                log.debug("未匹配到优先级,请检查优先级字典配置");
+                return;
+            }
+            guideTask.setPriority(Integer.valueOf(priority));
             //报警次数
             guideTask.setNum(num);
             //录像存储位置
@@ -728,8 +724,10 @@
     private Boolean IsEnableGuide(String cameraId) {
         boolean enabled = false;
         ArdCameras ardCameras = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
-        if (ardCameras.getCamAlarmGuideEnable().equals(1)) {
-            enabled = true;
+        if (ardCameras != null) {
+            if (ardCameras.getCamAlarmGuideEnable().equals(1)) {
+                enabled = true;
+            }
         }
         return enabled;
     }
@@ -768,37 +766,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;
-    }
 }

--
Gitblit v1.9.3