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.classBinary files differ
ard-work/target/classes/com/ruoyi/device/hiksdk/service/impl/hikClientServiceImpl.classBinary 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.classBinary files differ