liusuyi
2026-05-14 9958bc1501d0daee954d9bba383475e55e24ebab
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package com.ard.work.sdk.aspect;
 
import com.ard.common.core.constant.SecurityConstants;
import com.ard.common.core.domain.R;
import com.ard.common.core.exception.ServiceException;
import com.ard.common.core.utils.StringUtils;
import com.ard.common.core.web.domain.AjaxResult;
import com.ard.common.security.utils.DictUtils;
import com.ard.system.api.RemoteUserService;
import com.ard.system.api.domain.SysUser;
import com.ard.system.api.model.LoginUser;
import com.ard.work.api.domian.ArdCamera;
import com.ard.work.api.domian.CameraCmd;
import com.ard.work.device.camera.mapper.ArdCameraMapper;
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 jakarta.annotation.Resource;
import java.lang.reflect.Method;
import java.util.Date;
 
 
/**
 * SDK控制处理
 *
 * @author ruoyi
 */
@Aspect
@Component
@Slf4j
public class SdkOperateAspect {
 
    @Resource
    ArdCameraMapper ardCameraMapper;
    @Resource
    RemoteUserService remoteUserService;
 
    @Pointcut("@annotation(com.ard.work.sdk.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) {
            String message = "已获取相机控制权--" + method.getName();
            log.debug(message);
            // 执行目标方法
            return point.proceed();
        } else {
            String message = "未获取相机控制权--" + method.getName();
            Class<?> returnType = method.getReturnType();
            if (R.class.isAssignableFrom(returnType)) {
                // 这是Feign接口,返回R对象
                return R.fail(message);
            } else if (AjaxResult.class.isAssignableFrom(returnType)) {
                // 这是普通接口,返回AjaxResult
                return AjaxResult.error(message);
            }
            // 【新增】处理 Boolean 返回类型
            else if (Boolean.class.isAssignableFrom(returnType) || boolean.class == returnType) {
                log.error(message);
                return false;
            }else if (String.class.isAssignableFrom(returnType)) {
                // 【新增】处理 String 返回类型
                log.error(message);
                return "";
            } else if (byte[].class.isAssignableFrom(returnType)) {
                // 【新增】处理 byte[] 返回类型
                log.error(message);
                return new byte[0];
            } else if (void.class == returnType || Void.class.isAssignableFrom(returnType)) {
                // 处理 void 返回类型
                log.error(message);
                return null;
            }
            else {
                // 其他未知类型,为了安全还是返回 null,但最好记录错误
                log.error("未知返回类型:{}, 无法构造默认返回值,返回 null (可能导致 NPE)", returnType.getName());
                return null;
            }
        }
    }
 
    /**
     * 操控判断逻辑
     *
     * @param joinPoint 切点
     */
    public Boolean controlScopeFilter(ProceedingJoinPoint joinPoint) {
 
        // 获取请求控制相机的命令信息
        CameraCmd cmd = (CameraCmd) joinPoint.getArgs()[0];
        String operator = cmd.getOperator(); // 申请者
        ArdCamera ardCamera = ardCameraMapper.selectArdCameraById(cmd.getCameraId());
        // 如果相机不存在,返回 false
        if (StringUtils.isNull(ardCamera)) {
            return false;
        }
 
        Date currentExpired = ardCamera.getOperatorExpired(); // 当前相机的过期时间
        String currentOperator = ardCamera.getOperatorId(); // 当前相机的操作者
        // 如果申请者是当前操作者,或者未配置锁定时间或当前相机控制者为空,任何人可控制
        if (StringUtils.isNull(currentOperator) || StringUtils.isNull(currentExpired) || currentOperator.equals(operator)) {
            updateCameraOperator(ardCamera, operator);
            return true;
        }
 
        // 判断优先级
        int currentLevel = getOperatorPriority(currentOperator);
        int operatorLevel = getOperatorPriority(operator);
 
        // 申请者优先级更高,或者当前操作者的控制时间已过期,允许控制
        if (operatorLevel > currentLevel || new Date().after(currentExpired)) {
            updateCameraOperator(ardCamera, operator);
            return true;
        }
 
        // 时间未过期,且优先级不高,不可控制
        return false;
    }
 
    /**
     * 更新相机操作者信息
     */
    private void updateCameraOperator(ArdCamera ardCamera, String operator) {
        ardCamera.setOperatorId(operator);
        ardCamera.setOperatorName(getOperatorName(operator));
        ardCamera.setOperatorExpired(null);
        ardCameraMapper.updateArdCamera(ardCamera);
    }
 
    /**
     * 获取操作者的优先级
     */
    private int getOperatorPriority(String operator) {
        String camerasPriority = DictUtils.getDictValue("cameras_priority", operator);
        if (StringUtils.isNotEmpty(camerasPriority)) {
            // 系统报警用户的优先级
            return Integer.parseInt(camerasPriority);
        } else {
            // 普通用户的优先级
            R<SysUser> userResult = remoteUserService.getUserInfoByUserId(Long.parseLong(operator), SecurityConstants.INNER);
            SysUser sysUser = userResult.getData();
            if (sysUser == null) {
                return 0;
            }
            return sysUser.getCameraPriority() != null ? Integer.parseInt(sysUser.getCameraPriority()) : 0;
        }
    }
 
    /**
     * 获取操控者名称
     * 用户显示nick_name
     * 其他显示优先级字典备注
     */
    private String getOperatorName(String operator) {
        String camerasPriority = DictUtils.getDictValue("cameras_priority", operator);
        if (StringUtils.isNotEmpty(camerasPriority)) {
            // 系统报警用户的优先级
            return DictUtils.getDictRemark("cameras_priority", operator);
        } else {
            // 普通用户的优先级
            R<SysUser> userResult = remoteUserService.getUserInfoByUserId(Long.parseLong(operator), SecurityConstants.INNER);
            SysUser sysUser = userResult.getData();
            if (sysUser == null) {
                return "";
            }
            return sysUser.getNickName();
        }
    }
}