‘liusuyi’
2023-05-25 c6eb731b0a70946e5ba265d9e5d427b8bb4537a6
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
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.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;
 
/**
 * SDK控制处理
 *
 * @author ruoyi
 */
@Aspect
@Component
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 {
        Boolean resultMap = dataScopeFilter(point);
        if (resultMap) {
            return point.proceed();
        } else {
            return false;//代替目标方法的返回值
        }
    }
 
    /**
     * 操控判断逻辑
     *
     * @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 currentExpired = ardCameras.getOperatorExpired();//当前相机的过期时间
        String currentOperator = ardCameras.getOperatorId();//当前相机的操作者
 
        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;
                        }
                    }
                }
            }
        }
    }
}