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 = "hikSdk") 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); 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; } } } } } } } }