zhangnaisong
2024-01-26 638c705c6a23974ff6aea3229bc297aad0683acc
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SdkOperateAspect.java
@@ -1,27 +1,26 @@
package com.ruoyi.framework.aspectj;
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
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.JoinPoint;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * SDK控制处理
@@ -30,10 +29,13 @@
 */
@Aspect
@Component
@Slf4j(topic = "sdk")
public class SdkOperateAspect {
    @Resource
    IArdCamerasService ardCamerasService;
    @Resource
    ISysUserService sysUserService;
    @Pointcut("@annotation(com.ruoyi.common.annotation.SdkOperate)")
    public void dsPointCut() {
@@ -42,11 +44,14 @@
    @Around("dsPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        Boolean resultMap = dataScopeFilter(point);
        if (resultMap) {
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        Boolean result = controlScopeFilter(point);
        if (result) {
            log.debug("已获取相机控制权--" + method.getName());
            return point.proceed();
        } else {
            log.debug("未获取相机控制权--" + method.getName());
            return false;//代替目标方法的返回值
        }
    }
@@ -56,26 +61,91 @@
     *
     * @param joinPoint 切点
     */
    public Boolean dataScopeFilter(ProceedingJoinPoint joinPoint) {
    public Boolean controlScopeFilter(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)) {
            LoginUser loginUser = SecurityUtils.getLoginUser();
            if (StringUtils.isNull(loginUser)) {
                return false;//当前登录用户为空不可以控制
            }
            SysUser user = loginUser.getUser();
            if (!user.getUserId().equals(ardCameras.getOperatorId())) {
                return false;//未过期并且不是当前用户则不可控
        Date currentExpired = ardCameras.getOperatorExpired();//当前相机的过期时间
        String currentOperator = ardCameras.getOperatorId();//当前相机的操作者
        /*先判断锁定时间*/
        if (currentExpired == null) {
            /*如果未配置锁定时间,任何人可控制*/
            ardCameras.setOperatorId(operator);
            ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
            return true;
        } else {
            /*锁定时间配置了,判断当前操作者*/
            if (StringUtils.isEmpty(currentOperator)) {
                /*当前相机控制者为空时,任何人可控*/
                ardCameras.setOperatorId(operator);
                ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
                return true;
            } else {
                /*判断是否本人继续控制*/
                if (currentOperator.equals(operator)) {
                    return true;
                } else {
                    /*当前相机有人控制并且配置了过期时间,先判断优先级,优先级高允许控制*/
                    Integer currentLevel = 0;//当前相机的操作者的优先级
                    String camerasPriority = DictUtils.getDictValue("cameras_priority", currentOperator);
                    if(StringUtils.isNotEmpty(camerasPriority)) {
                        /*当前控制者为系统报警用户*/
                        currentLevel = Integer.valueOf(camerasPriority);
                    } else {
                        /*当前控制者为普通用户*/
                        SysUser sysUser = sysUserService.selectUserById(currentOperator);
                        if(StringUtils.isNull(sysUser))
                        {
                            return true;
                        }
                        currentLevel = Integer.valueOf(sysUser.getCameraPriority());
                    }
                    Integer operatorLevel = 0;//获取申请者的优先级
                    String operatorPriority = DictUtils.getDictValue("cameras_priority", operator);
                    if (StringUtils.isNotEmpty(operatorPriority)) {
                        /*包含说明当前申请控制者为系统报警用户*/
                        operatorLevel = Integer.valueOf(operatorPriority);
                    } else {
                        /*否则申请控制者为当前登录用户*/
                        LoginUser loginUser = SecurityUtils.getLoginUser();
                        SysUser user = loginUser.getUser();//获取登录用户的信息
                        operatorLevel = Integer.valueOf(user.getCameraPriority());
                    }
                    /*申请者未控则判断优先级*/
                    if (operatorLevel > currentLevel) {
                        /*如果申请者优先级高,允许控制*/
                        ardCameras.setOperatorId(operator);
                        ardCameras.setOperatorExpired(null);
                        ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
                        return true;
                    } else {
                        /*如果申请者优先级低,则判断过期时间*/
                        if (currentExpired == null) {
                            /*当前相机未配置过期时间,可控*/
                            ardCameras.setOperatorId(operator);
                            ardCameras.setOperatorExpired(null);
                            ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
                            return true;
                        } else {
                            if (new Date().before(currentExpired)) {
                                /*时间未过期,不可控*/
                                return false;
                            } else {
                                /*时间过期,可以控制,更新控制者*/
                                ardCameras.setOperatorId(operator);
                                ardCamerasService.updateArdCameras(ardCameras);//更新相机当前控制者
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return true;
    }
}