‘liusuyi’
2023-05-25 c6eb731b0a70946e5ba265d9e5d427b8bb4537a6
修改云台可控优先级策略
已修改9个文件
208 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/constant/sdkPriority.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.java 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
}
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;
}
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));
    }
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;//优先级低无法上锁
                }
            }
        }
ard-work/target/classes/com/ruoyi/device/hiksdk/controller/SdkController.class
Binary files differ
ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.class
Binary files differ
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;
    }
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;
    }
}
ruoyi-framework/target/classes/com/ruoyi/framework/aspectj/SdkOperateAspect.class
Binary files differ