From 2988d2670cf03ef1ab074b0c6cd54301570c8ba4 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 周四, 24 8月 2023 12:01:26 +0800
Subject: [PATCH] 修复引导过程中修改相机导致引导队列中止出队的问题 增加一键派警描述字段

---
 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java               |    2 
 ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/LoginResultCallBack.java |   10 ++-
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java                |    1 
 ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/GlobalAlarmServiceImpl.java  |   55 ++++++++++-------
 ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java                           |    3 +
 ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java   |   13 +--
 ard-work/src/main/resources/mapper/dispatch/ArdDispatchPoliceMapper.xml                 |    6 ++
 ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueManager.java            |   20 ++++--
 ard-work/src/main/java/com/ruoyi/dispatch/domain/ArdDispatchPolice.java                 |   12 ++++
 9 files changed, 81 insertions(+), 41 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 0529d64..4817868 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
@@ -49,6 +49,7 @@
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -679,7 +680,6 @@
                 log.info("相机:" + cameraId + "未开启报警引导功能");
                 return;
             }
-
             SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
             GuideTask guideTask = new GuideTask();
             //相机ID
@@ -737,31 +737,40 @@
      */
     private String getNearbyCamera(double[] targetPosition) {
         String minDistanceCameraId = "";
-        //获取所有大光电
-        List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
-        //统计所有大光电可视范围内与报警点的距离
-        Map<String, Double> distanceMap = new HashMap<>();
-        Map<String, Integer> guideMap = new HashMap<>();
-        for (ArdCameras camera : ardCamerasList) {
-            double[] camPosition = new double[]{camera.getLongitude(), camera.getLatitude()};
-            double distance = GisTool.getDistance(targetPosition, camPosition);
-            if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
-                distanceMap.put(camera.getId(), distance);
-                if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
-                    camera.setCamAlarmGuideEnable(0);
+        try {
+            //获取所有大光电
+            List<ArdCameras> ardCamerasList = ardCamerasMapper.selectArdCamerasList(new ArdCameras("1"));
+            //统计所有大光电可视范围内与报警点的距离
+            Map<String, Double> distanceMap = new HashMap<>();
+            Map<String, Integer> guideMap = new HashMap<>();
+            for (ArdCameras camera : ardCamerasList) {
+                if (camera.getCamMaxVisibleDistance() == null) {
+                    continue;
                 }
-                guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable());
+                double[] camPosition = new double[]{camera.getLongitude(), camera.getLatitude()};
+                double distance = GisTool.getDistance(targetPosition, camPosition);
+                if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
+                    distanceMap.put(camera.getId(), distance);
+                    if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
+                        camera.setCamAlarmGuideEnable(0);
+                    }
+                    guideMap.put(camera.getId(), camera.getCamAlarmGuideEnable());
+                }
+            }
+            if (distanceMap.size() > 0) {
+                log.debug("尝试查找最近光电");
+                //获取距离字典中最近的一个相机ID
+                minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
+                log.debug("查找到最近光电:" + minDistanceCameraId);
+                if (guideMap.get(minDistanceCameraId).equals(0)) {
+                    log.debug("该光电未开启报警引导");
+                    return " ";
+                }
             }
         }
-        if (distanceMap.size() > 0) {
-            log.debug("尝试查找最近光电");
-            //获取距离字典中最近的一个相机ID
-            minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
-            log.debug("查找到最近光电:" + minDistanceCameraId);
-            if (guideMap.get(minDistanceCameraId).equals(0)) {
-                log.debug("该光电未开启报警引导");
-                return " ";
-            }
+        catch (Exception ex)
+        {
+            log.error("获取附近开启报警引导功能光电异常:"+ex.getMessage());
         }
         return minDistanceCameraId;
     }
diff --git a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueManager.java b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueManager.java
index 21c8772..0497e66 100644
--- a/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueManager.java
+++ b/ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueManager.java
@@ -58,21 +58,27 @@
     public void addTaskToQueue(String cameraId, GuideTask task) {
         /*通过相机ID获取引导队列,并将引导任务加入队列*/
         PriorityBlockingQueue<GuideTask> guideTaskQueue = GuidePriorityQueue.cameraQueueMap.get(cameraId);
-        if(StringUtils.isNull(guideTaskQueue))
-        {
+        if (StringUtils.isNull(guideTaskQueue)) {
             log.info("相机未登录,没有队列,无法入队引导");
             return;
         }
-        log.debug("新任务入队:"+task.getAlarmId());
+        log.debug("新任务入队:" + task.getAlarmId());
         guideTaskQueue.add(task);
         /*获取该相机的当前执行线程*/
         TaskThread currentTaskThread = threadMap.get(cameraId);
         //如果队列当前线程正在运行,若入队任务优先级大于当前任务优先级,则终止当前线程
-        if (currentTaskThread != null && task.getPriority() > currentTaskThread.getCurrentTask().getPriority()) {
-            currentTaskThread.getThread().interrupt();
+        if (currentTaskThread != null){
+            if (task.getPriority() > currentTaskThread.getCurrentTask().getPriority()) {
+                currentTaskThread.getThread().interrupt();
+            }
+            if (!currentTaskThread.getThread().isAlive()) {
+                Thread newThread = createThread(cameraId, guideTaskQueue);
+                threadMap.put(cameraId, new TaskThread(newThread, task));
+                newThread.start();
+            }
         }
         //如果队列当前没有线程正在运行,则启动新线程
-        if (currentTaskThread == null || !currentTaskThread.getThread().isAlive()) {
+        else {
             Thread newThread = createThread(cameraId, guideTaskQueue);
             threadMap.put(cameraId, new TaskThread(newThread, task));
             newThread.start();
@@ -90,7 +96,7 @@
             while (!Thread.currentThread().isInterrupted()) {
                 try {
                     GuideTask task = queue.take();
-                    log.debug("取出队列数据:"+task.getAlarmId());
+                    log.debug("取出队列数据:" + task.getAlarmId());
                     taskExecutor.processTask(task);
                     // 更新线程的当前任务
                     TaskThread currentTaskThread = threadMap.get(queueName);
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
index 771c21f..4ed6415 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.common.annotation.SdkOperate;
 import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.common.utils.file.MimeTypeUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.camera.service.IArdCamerasService;
@@ -1151,11 +1152,10 @@
             //存储到minio
             String BucketName = "pic";
             String ObjectName = "capture/" + IdUtils.simpleUUID() + ".jpeg";
-            String ContentType = "image/JPEG";
             InputStream input = new ByteArrayInputStream(array);
             String url = "";
             try {
-                boolean b = minioUtil.uploadObject(BucketName, ObjectName, input, input.available(), ContentType);
+                boolean b = minioUtil.uploadObject(BucketName, ObjectName, input, input.available(), MimeTypeUtils.IMAGE_JPEG);
                 if (b) {
                     url = minioUtil.getBucketObjectUrl(BucketName, ObjectName);
                     log.debug("上传文件成功!" + url);
@@ -1336,14 +1336,11 @@
             log.debug("录像停止");
             //存入minio
             String BucketName = cmd.getRecordBucketName();
-            String ObjectName = cmd.getRecordObjectName();
-            String ContentType = "video/MP4";
+            String ObjectName = cmd.getRecordObjectName()+".mp4";
             FileInputStream stream = new FileInputStream(path);
-            String time = new SimpleDateFormat("yyyyMMdd").format(new Date());
-            String recordName = cameraId + "/" + time + "/" + ObjectName + ".mp4";
-            boolean b = minioUtil.uploadObject(BucketName, recordName, stream, stream.available(), ContentType);
+            boolean b = minioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
             if (b) {
-                url = endpoint + "/" + BucketName + "/" + recordName;
+                url = minioUtil.getBucketObjectUrl(BucketName, ObjectName);
                 log.debug("上传文件成功!" + url);
             }
             return url;
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/LoginResultCallBack.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/LoginResultCallBack.java
index bbe9c52..d879397 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/LoginResultCallBack.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/util/hikSdkUtil/LoginResultCallBack.java
@@ -59,9 +59,13 @@
                 }
             }
             //创建引导队列
-            Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
-            PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
-            GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
+            if(!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId()))
+            {
+                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
+                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
+                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
+            }
+
         } else {
             log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
             camera.setChanNum(0);
diff --git a/ard-work/src/main/java/com/ruoyi/dispatch/domain/ArdDispatchPolice.java b/ard-work/src/main/java/com/ruoyi/dispatch/domain/ArdDispatchPolice.java
index 64d3dab..f6cdfce 100644
--- a/ard-work/src/main/java/com/ruoyi/dispatch/domain/ArdDispatchPolice.java
+++ b/ard-work/src/main/java/com/ruoyi/dispatch/domain/ArdDispatchPolice.java
@@ -25,6 +25,10 @@
     @Excel(name = "派警名称")
     private String name;
 
+    /** 描述 */
+    @Excel(name = "描述")
+    private String text;
+
     /** 经度 */
     @Excel(name = "经度")
     private Double longitude;
@@ -106,4 +110,12 @@
     public void setArdDispatchPoliceUserList(List<String> ardDispatchPoliceUserList) {
         this.ardDispatchPoliceUserList = ardDispatchPoliceUserList;
     }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java b/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
index 2d48af9..4a93637 100644
--- a/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
+++ b/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
@@ -10,6 +10,8 @@
 
 import com.ruoyi.common.utils.ConfigUtils;
 import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.file.ImageUtils;
+import com.sun.imageio.plugins.common.ImageUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -25,6 +27,7 @@
 public class ReadAccessDatabase {
 
     public static void main(String[] args) {
+
         // 多个数据库文件路径
         String[] dbPaths = {
                 "D:\\Workspaces\\ard\\安瑞达工作资料\\mdb\\道路中心线.mdb"
diff --git a/ard-work/src/main/resources/mapper/dispatch/ArdDispatchPoliceMapper.xml b/ard-work/src/main/resources/mapper/dispatch/ArdDispatchPoliceMapper.xml
index 7056376..6b0882c 100644
--- a/ard-work/src/main/resources/mapper/dispatch/ArdDispatchPoliceMapper.xml
+++ b/ard-work/src/main/resources/mapper/dispatch/ArdDispatchPoliceMapper.xml
@@ -7,6 +7,7 @@
     <resultMap type="ArdDispatchPolice" id="ArdDispatchPoliceResult">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
+        <result property="text" column="text"/>
         <result property="longitude" column="longitude"/>
         <result property="latitude" column="latitude"/>
         <result property="deptId" column="dept_id"/>
@@ -38,6 +39,7 @@
     <sql id="selectArdDispatchPoliceVo">
         SELECT ID,
                NAME,
+               text,
                longitude,
                latitude,
                dept_id,
@@ -64,6 +66,7 @@
             resultMap="ArdDispatchPoliceArdDispatchPoliceUserResult">
         select a.id,
                a.name,
+               a.text,
                a.longitude,
                a.latitude,
                a.dept_id,
@@ -84,6 +87,7 @@
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="id != null">id,</if>
             <if test="name != null">name,</if>
+            <if test="text != null">text,</if>
             <if test="longitude != null">longitude,</if>
             <if test="latitude != null">latitude,</if>
             <if test="deptId != null">dept_id,</if>
@@ -96,6 +100,7 @@
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
             <if test="name != null">#{name},</if>
+            <if test="text != null">#{text},</if>
             <if test="longitude != null">#{longitude},</if>
             <if test="latitude != null">#{latitude},</if>
             <if test="deptId != null">#{deptId},</if>
@@ -111,6 +116,7 @@
         update ard_dispatch_police
         <trim prefix="SET" suffixOverrides=",">
             <if test="name != null">name = #{name},</if>
+            <if test="text != null">text = #{text},</if>
             <if test="longitude != null">longitude = #{longitude},</if>
             <if test="latitude != null">latitude = #{latitude},</if>
             <if test="deptId != null">dept_id = #{deptId},</if>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
index f968f1a..7b654af 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
@@ -16,6 +16,8 @@
     public static final String IMAGE_BMP = "image/bmp";
 
     public static final String IMAGE_GIF = "image/gif";
+
+    public static final String Video_MP4 = "video/mp4";
     
     public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
 
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
index 63b03da..6529aa8 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.Properties;
 import com.ruoyi.common.utils.Arith;
+import com.ruoyi.common.utils.file.ImageUtils;
 import com.ruoyi.common.utils.ip.IpUtils;
 import com.ruoyi.framework.web.domain.server.Cpu;
 import com.ruoyi.framework.web.domain.server.Jvm;

--
Gitblit v1.9.3