zhaowenyu
2026-03-11 2acf49278129e5870d8b775519a2bc1461294fb8
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,73 @@
            // 通知原控制者被抢占
            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)) {
                    requesters.remove(other);
                    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 +222,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 +233,7 @@
        }
    }
    /**
     * 获取用户优先级
     */