From 04c8dbe6d9d4887bb9b9b4969e4f879e584ad717 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Thu, 29 Jan 2026 14:51:32 +0800
Subject: [PATCH] 优化
---
ard-work/src/main/java/com/ard/work/service/control/UavControlService.java | 80 +++++++++++++++++++++++++++++----------
ard-admin/src/main/java/com/ard/web/controller/work/UavControlController.java | 7 ++-
2 files changed, 64 insertions(+), 23 deletions(-)
diff --git a/ard-admin/src/main/java/com/ard/web/controller/work/UavControlController.java b/ard-admin/src/main/java/com/ard/web/controller/work/UavControlController.java
index 12cd1de..92ba714 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/work/UavControlController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/work/UavControlController.java
@@ -35,8 +35,10 @@
public AjaxResult handleControlRequest(
@RequestParam String boxSn,
@RequestParam String type,
- @RequestParam boolean approve) {
- return AjaxResult.success(uavControlService.handleControlResponse(boxSn, approve, type));
+ @RequestParam boolean approve,
+ @RequestParam Long requesterId
+ ) {
+ return AjaxResult.success(uavControlService.handleControlResponse(boxSn, approve, type, requesterId));
}
/**
@@ -56,6 +58,7 @@
public AjaxResult getCurrentController(@RequestParam String boxSn, @RequestParam String type) {
return AjaxResult.success(uavControlService.getCurrentController(boxSn, type));
}
+
/**
* 获取全部类型当前控制者
*/
diff --git a/ard-work/src/main/java/com/ard/work/service/control/UavControlService.java b/ard-work/src/main/java/com/ard/work/service/control/UavControlService.java
index 3014fe2..8907a70 100644
--- a/ard-work/src/main/java/com/ard/work/service/control/UavControlService.java
+++ b/ard-work/src/main/java/com/ard/work/service/control/UavControlService.java
@@ -10,6 +10,7 @@
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -25,17 +26,26 @@
@Resource
private ISysUserService sysUserService;
- /** 当前飞行控制权限用户 */
+ /**
+ * 当前飞行控制权限用户
+ */
private final ConcurrentHashMap<String, Long> uavFlyControlMap = new ConcurrentHashMap<>();
- /** 当前载荷控制权限用户 */
+ /**
+ * 当前载荷控制权限用户
+ */
private final ConcurrentHashMap<String, Long> uavPayloadControlMap = new ConcurrentHashMap<>();
- /** 飞行控制请求 */
- private final ConcurrentHashMap<String, Long> flyControlRequests = new ConcurrentHashMap<>();
+ /**
+ * 飞行控制请求:boxSn -> 多个请求者
+ */
+ private final ConcurrentHashMap<String, Set<Long>> flyControlRequests = new ConcurrentHashMap<>();
- /** 载荷控制请求 */
- private final ConcurrentHashMap<String, Long> payloadControlRequests = new ConcurrentHashMap<>();
+ /**
+ * 载荷控制请求
+ */
+ private final ConcurrentHashMap<String, Set<Long>> payloadControlRequests = new ConcurrentHashMap<>();
+
/**
* 请求获取 UAV 控制权限
@@ -49,9 +59,13 @@
/**
* 处理单个控制类型的请求
*/
+ /**
+ * 处理单个控制类型的请求(支持多请求者)
+ */
private boolean requestSingleControl(String boxSn, UavControlType controlType, Long requester) {
+
ConcurrentHashMap<String, Long> controlMap = getControlMap(controlType);
- ConcurrentHashMap<String, Long> requestMap = getRequestMap(controlType);
+ ConcurrentHashMap<String, Set<Long>> requestMap = getRequestMap(controlType);
Long controller = controlMap.get(boxSn);
@@ -76,49 +90,72 @@
// 通知原控制者被抢占
uavControlManager.sendControlTakeover(controller, requester, boxSn, controlType.getType());
-
- // 通知新控制者获得控制
- uavControlManager.sendControlApproval(requester, boxSn, controlType.getType(), requester);
return true;
}
- // 优先级相同或更低 → 申请流程
- requestMap.put(boxSn, requester);
+ // ===== 以下是关键改动点 =====
+
+ // 优先级相同或更低 → 加入请求集合(不覆盖)
+ Set<Long> requesters = requestMap.computeIfAbsent(boxSn, k -> ConcurrentHashMap.newKeySet());
+ requesters.add(requester);
+
+ // 通知当前控制者:有新的请求者
uavControlManager.sendControlRequest(controller, boxSn, controlType.getType(), requester);
+
return false;
}
+
/**
* 处理 UAV 控制请求的响应
*/
- public boolean handleControlResponse(String boxSn, boolean approve, String type) {
+ public boolean handleControlResponse(String boxSn, boolean approve, String type, Long requester) {
UavControlType controlType = UavControlType.fromString(type);
Long controller = SecurityUtils.getUserId();
- return handleSingleControlResponse(boxSn, approve, controlType, controller);
+ return handleSingleControlResponse(boxSn, approve, controlType, controller, requester);
}
+
/**
* 处理单个控制类型请求响应
*/
- private boolean handleSingleControlResponse(String boxSn, boolean approve, UavControlType controlType,
- Long controller) {
- ConcurrentHashMap<String, Long> requestMap = getRequestMap(controlType);
- Long requester = requestMap.get(boxSn);
+ private boolean handleSingleControlResponse(String boxSn,
+ boolean approve,
+ UavControlType controlType,
+ Long controller,
+ Long requester) {
- if (requester == null || requester.equals(controller)) {
+ ConcurrentHashMap<String, Set<Long>> requestMap = getRequestMap(controlType);
+ Set<Long> requesters = requestMap.get(boxSn);
+
+ if (requesters == null || !requesters.contains(requester)) {
throw new ControlException("无控制请求");
}
if (approve) {
getControlMap(controlType).put(boxSn, requester);
+
+ // 通知被批准者
uavControlManager.sendControlApproval(requester, boxSn, controlType.getType(), controller);
+
+ // 🚨 其他请求者自动拒绝(强烈建议)
+ for (Long other : requesters) {
+ if (!other.equals(requester)) {
+ uavControlManager.sendControlRejection(other, boxSn, controlType.getType(), controller);
+ }
+ }
} else {
uavControlManager.sendControlRejection(requester, boxSn, controlType.getType(), controller);
}
- requestMap.remove(boxSn);
+ requesters.remove(requester);
+ if (requesters.isEmpty()) {
+ requestMap.remove(boxSn);
+ }
+
return true;
}
+
/**
* 释放 UAV 控制权限
@@ -184,7 +221,7 @@
/**
* 根据控制类型获取对应请求 Map
*/
- private ConcurrentHashMap<String, Long> getRequestMap(UavControlType controlType) {
+ private ConcurrentHashMap<String, Set<Long>> getRequestMap(UavControlType controlType) {
switch (controlType) {
case FLY:
return flyControlRequests;
@@ -195,6 +232,7 @@
}
}
+
/**
* 获取用户优先级
*/
--
Gitblit v1.9.3