1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.ruoyi.framework.aspectj;
 
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 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.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;
 
 
/**
 * SDK控制处理
 *
 * @author ruoyi
 */
@Aspect
@Component
@Slf4j(topic = "sdk")
public class SdkOperateAspect {
 
    @Resource
    IArdCamerasService ardCamerasService;
    @Resource
    ISysUserService sysUserService;
 
    @Pointcut("@annotation(com.ruoyi.common.annotation.SdkOperate)")
    public void dsPointCut() {
 
    }
 
    @Around("dsPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        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;//代替目标方法的返回值
        }
    }
 
    /**
     * 操控判断逻辑
     *
     * @param 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 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;
                            }
                        }
                    }
                }
            }
        }
    }
}