From c6eb731b0a70946e5ba265d9e5d427b8bb4537a6 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 周四, 25 5月 2023 16:36:50 +0800
Subject: [PATCH] 修改云台可控优先级策略

---
 ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java                              |    8 +
 ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java   |  102 +++++++++++--------------
 ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class       |    0 
 ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java                    |    8 +
 ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java            |    4 +
 ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class          |    0 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java             |    6 
 ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class |    0 
 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java         |   80 ++++++++++++++++---
 9 files changed, 132 insertions(+), 76 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java b/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java
index e144862..9a271b0 100644
--- a/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java
+++ b/ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java
@@ -1,5 +1,8 @@
 package com.ruoyi.constant;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @Description: sdk控制优先级
  * @ClassName: sdkPriority
@@ -8,5 +11,8 @@
  * @Version: 1.0
  **/
 public class sdkPriority {
-    static Integer radar_fire = 999;
+    public static Map<String,Object> priorityMap=new HashMap<>();
+    static {
+        priorityMap.put("sys_radar_fire",999);
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
index c96576a..712d915 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -8,6 +8,7 @@
 @Data
 @ApiModel(description = "sdk命令实体类")
 public class CameraCmd {
+
     /*相机ID*/
     String cameraId;
     /*相机通道号*/
@@ -24,10 +25,13 @@
     Integer dwFocusPos;
     /*PTZ值*/
     Map<String,Double>ptzMap;
-    /*过期间隔(分钟)*/
-    Integer expired;
+
     /*相机经纬度*/
     String camPosition;
     /*目标经纬度*/
     String targetPosition;
+    /*当前操作者*/
+    String operator;
+    /*过期间隔(分钟)*/
+    Integer expired;
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
index 37d47f1..c75e097 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -3,7 +3,9 @@
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.camera.domain.ArdCameras;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.camera.service.IArdCamerasService;
@@ -93,6 +95,7 @@
     @Log(title = "云台控制", businessType = BusinessType.CONTROL)
     public @ResponseBody
     AjaxResult PTZControlWithSpeed(@RequestBody CameraCmd cmd) {
+        cmd.setOperator(SecurityUtils.getUserId());
         return toAjax(sdk.PTZControlWithSpeed(cmd));
     }
 
@@ -188,6 +191,7 @@
     @Log(title = "设置锁定", businessType = BusinessType.CONTROL)
     public @ResponseBody
     AjaxResult setPTZLock(@RequestBody CameraCmd cmd) {
+        cmd.setOperator(SecurityUtils.getUserId());
         return toAjax(sdk.controlLock(cmd));
 
     }
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 f1121bb..92e8124 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
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.constant.sdkPriority;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
 import com.ruoyi.device.hiksdk.common.global.globalVariable;
@@ -233,7 +234,7 @@
      * @修改人和其它信息
      */
     @Override
-   // @SdkOperate
+    @SdkOperate
     public boolean PTZControlWithSpeed(CameraCmd cmd) {
         String cameraId = cmd.getCameraId();
         boolean enable = cmd.isEnable();
@@ -630,77 +631,66 @@
      */
     @Override
     public boolean controlLock(CameraCmd cmd) {
-        String cameraId = cmd.getCameraId();
-        Integer expired = cmd.getExpired();
+        String cameraId = cmd.getCameraId();//申请锁的相机
         ArdCameras ardCameras = ardCamerasMapper.selectArdCamerasById(cameraId);
         if (StringUtils.isNull(ardCameras)) {
             return false;//找不到相机拒绝操控
         }
-        String operatorId = ardCameras.getOperatorId();
-        if (StringUtils.isEmpty(operatorId)) {
-            //如果该相机无人锁定,直接锁定
-            LoginUser loginUser = SecurityUtils.getLoginUser();
-            if (StringUtils.isNull(loginUser)) {
-                return false;//当前登录用户为空不可以控制
-            }
-            SysUser user = loginUser.getUser();
-            if (StringUtils.isNull(user.getCameraPriority())) {
-                return false;//未配置优先级的用户不可以控制
-            }
+        Integer expired = cmd.getExpired();//申请控制时长
+        String operator=cmd.getOperator();//申请者
+        String currentOperator = ardCameras.getOperatorId();//相机当前控制者
+        Date currentExpired = ardCameras.getOperatorExpired();//相机当前过期时间
+        if(currentExpired==null)
+        {
             //设置当前操作用户ID
-            ardCameras.setOperatorId(user.getUserId());
+            ardCameras.setOperatorId(operator);
             //设置当前过期时间
             Date now = new Date();
-            now.setTime(now.getTime() + expired * 1000);
+            now.setTime(now.getTime() + expired * 1000*60);
             ardCameras.setOperatorExpired(now);
             ardCamerasMapper.updateArdCameras(ardCameras);
-        } else {
-            //如果该相机有人锁定,判断优先级
-            SysUser operatorUser = sysUserMapper.selectUserById(operatorId);
-            if (StringUtils.isNull(operatorUser)) {
-                return false;
-            }
-            if (StringUtils.isEmpty(operatorUser.getCameraPriority())) {
-                return false;
-            }
-            Integer operatorPriority = Integer.parseInt(operatorUser.getCameraPriority());//相机已操作用户优先级
-
-            LoginUser loginUser = SecurityUtils.getLoginUser();
-            if (StringUtils.isNull(loginUser)) {
-                return false;//当前登录用户为空不可以控制
-            }
-            SysUser user = loginUser.getUser();
-            if (StringUtils.isEmpty(user.getCameraPriority())) {
-                return false;//未配置优先级的用户不可以控制
-            }
-            Integer loginUserCameraPriority = Integer.parseInt(user.getCameraPriority());//当前登录用户优先级
-            if (user.getUserId().equals(operatorUser.getUserId())) {
-                //如果当前用户已经操控,直接更新过期时间
+        }
+         else {
+            //如果过期时间有值
+            //如果是本人直接修改
+            if(currentOperator.equals(operator))
+            {
+                //设置当前过期时间
                 Date now = new Date();
-                now.setTime(now.getTime() + expired * 60 * 1000);
-                ardCameras.setOperatorExpired(now);//设置当前过期时间
+                now.setTime(now.getTime() + expired * 1000*60);
+                ardCameras.setOperatorExpired(now);
                 ardCamerasMapper.updateArdCameras(ardCameras);
-            } else {
-                if (loginUserCameraPriority > operatorPriority) {
-                    //如果登录用户优先级高于已操作用户,覆盖更新
-                    ardCameras.setOperatorId(user.getUserId());//设置当前操作用户ID
+            }
+            else {
+                //如果非本人比较优先级
+                Integer currentLevel = 0;//当前操作者的优先级
+                if (sdkPriority.priorityMap.containsKey(currentOperator)) {
+                    /*当前控制者为系统报警用户*/
+                    currentLevel = (Integer) sdkPriority.priorityMap.get(currentOperator);
+                } else {
+                    /*当前控制者为普通用户*/
+                    SysUser sysUser = sysUserMapper.selectUserById(currentOperator);
+                    currentLevel = sysUser.getCameraPriority();
+                }
+                Integer operatorLevel = 0;//获取申请者的优先级
+                if (sdkPriority.priorityMap.containsKey(operator)) {
+                    /*包含说明当前申请控制者为系统报警用户*/
+                    operatorLevel = (Integer) sdkPriority.priorityMap.get(operator);
+                } else {
+                    /*否则申请控制者为当前登录用户*/
+                    LoginUser loginUser = SecurityUtils.getLoginUser();
+                    SysUser user = loginUser.getUser();//获取登录用户的信息
+                    operatorLevel = user.getCameraPriority();
+                }
+                //判断优先级
+                if (operatorLevel > currentLevel) {
                     Date now = new Date();
                     now.setTime(now.getTime() + expired * 60 * 1000);
                     ardCameras.setOperatorExpired(now);//设置当前过期时间
+                    ardCameras.setOperatorId(operator);//设置当前用户
                     ardCamerasMapper.updateArdCameras(ardCameras);
                 } else {
-                    //如果登录用户优先级低于等于已操作用户,判断是否过期
-                    Date now = new Date();
-                    Date operatorExpired = ardCameras.getOperatorExpired();
-                    if (now.after(operatorExpired)) {
-                        //已过期
-                        ardCameras.setOperatorId(user.getUserId());//设置当前操作用户ID
-                        now.setTime(now.getTime() + expired * 60 * 1000);
-                        ardCameras.setOperatorExpired(now);//设置当前过期时间
-                        ardCamerasMapper.updateArdCameras(ardCameras);
-                    } else {
-                        return false;//未过期不可控
-                    }
+                    return false;//优先级低无法上锁
                 }
             }
         }
diff --git a/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class b/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class
index d484177..b442fd2 100644
--- a/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class
+++ b/ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class
Binary files differ
diff --git a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class
index dc7b4af..1993ea6 100644
--- a/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class
+++ b/ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class
Binary files differ
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
index dd4b35d..2f3b193 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -94,17 +94,17 @@
     private Long roleId;
 
     /** 相机操控优先级 */
-    private String cameraPriority;
+    private Integer cameraPriority;
     public SysUser()
     {
 
     }
 
-    public String getCameraPriority() {
+    public Integer getCameraPriority() {
         return cameraPriority;
     }
 
-    public void setCameraPriority(String cameraPriority) {
+    public void setCameraPriority(Integer cameraPriority) {
         this.cameraPriority = cameraPriority;
     }
 
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
index 6f27a17..447bc7b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
@@ -4,14 +4,17 @@
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.constant.sdkPriority;
 import com.ruoyi.device.camera.domain.ArdCameras;
 import com.ruoyi.device.camera.domain.CameraCmd;
 import com.ruoyi.device.camera.service.IArdCamerasService;
+import com.ruoyi.system.service.ISysUserService;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
 import org.springframework.stereotype.Component;
+
 import javax.annotation.Resource;
 import java.util.Date;
 
@@ -26,6 +29,8 @@
 
     @Resource
     IArdCamerasService ardCamerasService;
+    @Resource
+    ISysUserService sysUserService;
 
     @Pointcut("@annotation(com.ruoyi.common.annotation.SdkOperate)")
     public void dsPointCut() {
@@ -48,27 +53,74 @@
      * @param joinPoint 切点
      */
     public Boolean dataScopeFilter(ProceedingJoinPoint joinPoint) {
-        //获取请求控制相机的信息
+        //获取请求控制相机的命令信息
         CameraCmd cmd = (CameraCmd) joinPoint.getArgs()[0];
+        String operator = cmd.getOperator();//申请者
+        /*获取相机当前的被控信息*/
         ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cmd.getCameraId());
         if (StringUtils.isNull(ardCameras)) {
             return false;
         }
-        //优先级比对
-        Date operatorExpired = ardCameras.getOperatorExpired();
-        Date now = new Date();
-        if (now.before(operatorExpired)) {
-            //未过期
+        Date currentExpired = ardCameras.getOperatorExpired();//当前相机的过期时间
+        String currentOperator = ardCameras.getOperatorId();//当前相机的操作者
 
-            LoginUser loginUser = SecurityUtils.getLoginUser();
-            if (StringUtils.isNull(loginUser)) {
-                return false;//当前登录用户为空不可以控制
-            }
-            SysUser user = loginUser.getUser();
-            if (!user.getUserId().equals(ardCameras.getOperatorId())) {
-                return false;//未过期并且不是当前用户则不可控
+        if (StringUtils.isEmpty(currentOperator)) {
+            /*当前相机控制者为空时,直接更新控制者,并允许*/
+            ardCameras.setOperatorId(operator);
+            ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
+            return true;
+        } else {
+            if (operator.equals(currentOperator)) {
+                /*判断申请者已经在控,直接允许*/
+                return true;
+            } else {
+                Integer currentLevel = 0;//当前相机的操作者的优先级
+                if (sdkPriority.priorityMap.containsKey(currentOperator)) {
+                    /*当前控制者为系统报警用户*/
+                    currentLevel = (Integer) sdkPriority.priorityMap.get(currentOperator);
+                } else {
+                    /*当前控制者为普通用户*/
+                    SysUser sysUser = sysUserService.selectUserById(currentOperator);
+                    currentLevel = sysUser.getCameraPriority();
+                }
+                Integer operatorLevel = 0;//获取申请者的优先级
+                if (sdkPriority.priorityMap.containsKey(operator)) {
+                    /*包含说明当前申请控制者为系统报警用户*/
+                    operatorLevel = (Integer) sdkPriority.priorityMap.get(operator);
+                } else {
+                    /*否则申请控制者为当前登录用户*/
+                    LoginUser loginUser = SecurityUtils.getLoginUser();
+                    SysUser user = loginUser.getUser();//获取登录用户的信息
+                    operatorLevel = user.getCameraPriority();
+                }
+                /*申请者未控则判断优先级*/
+                if (operatorLevel > currentLevel) {
+                    /*如果申请者优先级高,允许控制*/
+                    ardCameras.setOperatorId(operator);
+                    ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
+                    return true;
+                } else {
+                    /*如果申请者优先级低,则判断过期时间*/
+                    Date now = new Date();
+                    if (currentExpired == null) {
+                        /*当前相机未配置过期时间,可控*/
+                        ardCameras.setOperatorId(operator);
+                        ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
+                        return true;
+                    }
+                    else {
+                        if (now.before(currentExpired)) {
+                            /*时间未过期,不可控*/
+                            return false;
+                        } else {
+                            /*时间过期,可以控制,更新控制者*/
+                            ardCameras.setOperatorId(operator);
+                            ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
+                            return true;
+                        }
+                    }
+                }
             }
         }
-        return true;
     }
 }
diff --git a/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class b/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class
index b9019ef..60d7f20 100644
--- a/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class
+++ b/ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class
Binary files differ

--
Gitblit v1.9.3