From a82c9a2633c519d5d7d868d3ec89832f77849700 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Mon, 17 Mar 2025 09:35:58 +0800
Subject: [PATCH] 增加飞行高度控制切面
---
ard-work/src/main/java/com/ard/tianyu/aspect/UavControlAspect.java | 44 +++++++++++++++++++++++++++++++++++++-------
1 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/ard-work/src/main/java/com/ard/tianyu/aspect/UavControlAspect.java b/ard-work/src/main/java/com/ard/tianyu/aspect/UavControlAspect.java
index ed9eae0..1d6f2f1 100644
--- a/ard-work/src/main/java/com/ard/tianyu/aspect/UavControlAspect.java
+++ b/ard-work/src/main/java/com/ard/tianyu/aspect/UavControlAspect.java
@@ -1,8 +1,11 @@
package com.ard.tianyu.aspect;
-import com.ard.common.exception.NoPermissionException;
+import com.ard.common.exception.ControlException;
import com.ard.common.utils.SecurityUtils;
-import com.ard.tianyu.aspect.annotation.RequireUavControl;
+import com.ard.tianyu.aspect.annotation.CheckTakeoffAltitude;
+import com.ard.tianyu.aspect.annotation.CheckControlRight;
+import com.ard.tianyu.domain.cache.UavTelemetryDataCache;
+import com.ard.tianyu.domain.dto.telemetry.TelemetryData;
import com.ard.tianyu.service.control.UavControlService;
import com.ard.tianyu.websocket.domain.UavControlType;
import org.aspectj.lang.JoinPoint;
@@ -15,6 +18,8 @@
/**
* AOP 切面:拦截 @RequireUavControl,检查用户是否拥有 UAV 控制权限
+ *
+ * 注意切面顺序:同类方法注解按字母ABCD顺序,不同类注解按order(1)顺序 越小优先级越高
*/
@Aspect
@Component
@@ -24,15 +29,15 @@
private UavControlService uavControlService;
/**
- * 拦截 @RequireUavControl 注解的方法
+ * 前置通知:控制权检测
*/
- @Before("@annotation(requireUavControl)")
- public void checkUavControl(JoinPoint joinPoint, RequireUavControl requireUavControl) {
+ @Before("@annotation(checkControlRight)")
+ public void checkUavControl(JoinPoint joinPoint, CheckControlRight checkControlRight) {
// 获取当前用户 ID
Long userId = SecurityUtils.getUserId();
// 获取控制类型
- UavControlType controlType = requireUavControl.value();
+ UavControlType controlType = checkControlRight.value();
// 获取方法参数
Object[] args = joinPoint.getArgs();
@@ -45,12 +50,37 @@
Long currentController = uavControlService.getCurrentController(boxSn,
controlType.name().toLowerCase());
if (currentController == null || !currentController.equals(userId)) {
- throw new NoPermissionException("无权执行该操作,需要 " + controlType + " 控制权限");
+ throw new ControlException("无权执行该操作,需要 " + controlType + " 控制权限");
}
}
}
}
+ /**
+ * 前置通知:高度检查
+ */
+ @Before("@annotation(checkTakeoffAltitude)")
+ public void takeoffAltitudeCheck(JoinPoint joinPoint, CheckTakeoffAltitude checkTakeoffAltitude) {
+ // 获取最小高度
+ double minAltitude = checkTakeoffAltitude.minAltitude();
+ // 获取方法参数
+ Object[] args = joinPoint.getArgs();
+
+ // 遍历参数,使用反射获取每个参数中的 boxSn
+ for (Object arg : args) {
+ String boxSn = getBoxSn(arg); // 调用之前实现的 getBoxSn 方法
+ if (boxSn != null) {
+ TelemetryData uavTelemetryData = UavTelemetryDataCache.getUavTelemetryData(boxSn);
+ if (uavTelemetryData == null) {
+ throw new ControlException("遥测数据异常,无法执行!");
+ }
+ // 检查高度
+ if (uavTelemetryData.getAltitude() < minAltitude) {
+ throw new ControlException("高度太低,无法执行!最低高度: " + minAltitude);
+ }
+ }
+ }
+ }
/**
* 通过反射获取对象中的 boxSn 字段
--
Gitblit v1.9.3