liusuyi
2026-01-19 3c8d6b8e60f02b9a40fc5acd4dc6c34a6b594eb6
ard-work/src/main/java/com/ard/work/service/control/UavControlService.java
@@ -2,8 +2,9 @@
import com.ard.common.exception.ControlException;
import com.ard.common.utils.SecurityUtils;
import com.ard.work.domain.message.UavControlType;
import com.ard.system.service.ISysUserService;
import com.ard.work.component.websocket.handler.UavControlManager;
import com.ard.work.domain.message.UavControlType;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -12,7 +13,8 @@
import java.util.concurrent.ConcurrentHashMap;
/**
 * UAV控制服务类,负责管理对飞行和载荷的控制请求、释放和权限管理。
 * UAV控制服务类,负责管理对飞行和载荷的控制请求、释放和权限管理
 * 支持优先级抢占
 */
@Service
public class UavControlService {
@@ -20,30 +22,23 @@
    @Resource
    private UavControlManager uavControlManager;
    /**
     * 记录当前获得飞行控制权限的用户
     */
    @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<>();
    /**
     * 记录载荷控制请求
     */
    /** 载荷控制请求 */
    private final ConcurrentHashMap<String, Long> payloadControlRequests = new ConcurrentHashMap<>();
    /**
     * 请求获取 UAV 控制权限
     *
     * @param boxSn 设备序列号
     * @param type  控制类型("fly"、"payload")
     * @return 是否立即获得控制权限
     */
    public boolean requestControl(String boxSn, String type) {
        UavControlType controlType = UavControlType.fromString(type);
@@ -55,31 +50,46 @@
     * 处理单个控制类型的请求
     */
    private boolean requestSingleControl(String boxSn, UavControlType controlType, Long requester) {
        ConcurrentHashMap<String, Long> controlMap = getControlMap(controlType);
        ConcurrentHashMap<String, Long> requestMap = getRequestMap(controlType);
        Long controller = controlMap.get(boxSn);
        // 无人控制 → 直接获取
        if (controller == null) {
            controlMap.put(boxSn, requester);
            uavControlManager.sendControlApproval(requester, boxSn, controlType.getType(), requester);
            return true;
        }
        if (!controller.equals(requester)) {
            requestMap.put(boxSn, requester);
            uavControlManager.sendControlRequest(controller, boxSn, controlType.getType(), requester);
        } else {
        // 已是控制者
        if (controller.equals(requester)) {
            throw new ControlException("当前已拥有控制权");
        }
        int requesterPriority = getUserPriority(requester);
        int controllerPriority = getUserPriority(controller);
        // 优先级高 → 直接接管
        if (requesterPriority > controllerPriority) {
            controlMap.put(boxSn, requester);
            // 通知原控制者被抢占
            uavControlManager.sendControlTakeover(controller, requester, boxSn, controlType.getType());
            // 通知新控制者获得控制
            uavControlManager.sendControlApproval(requester, boxSn, controlType.getType(), requester);
            return true;
        }
        // 优先级相同或更低 → 申请流程
        requestMap.put(boxSn, requester);
        uavControlManager.sendControlRequest(controller, boxSn, controlType.getType(), requester);
        return false;
    }
    /**
     * 处理 UAV 控制请求的响应(同意或拒绝)
     *
     * @param boxSn   设备序列号
     * @param approve 是否同意
     * @param type    控制类型
     * @return 是否成功处理
     * 处理 UAV 控制请求的响应
     */
    public boolean handleControlResponse(String boxSn, boolean approve, String type) {
        UavControlType controlType = UavControlType.fromString(type);
@@ -88,7 +98,7 @@
    }
    /**
     * 处理单个控制类型的请求响应
     * 处理单个控制类型请求响应
     */
    private boolean handleSingleControlResponse(String boxSn, boolean approve, UavControlType controlType,
                                                Long controller) {
@@ -101,9 +111,9 @@
        if (approve) {
            getControlMap(controlType).put(boxSn, requester);
            uavControlManager.sendControlApproval(requester, boxSn, controlType.getType());
            uavControlManager.sendControlApproval(requester, boxSn, controlType.getType(), controller);
        } else {
            uavControlManager.sendControlRejection(requester, boxSn, controlType.getType());
            uavControlManager.sendControlRejection(requester, boxSn, controlType.getType(), controller);
        }
        requestMap.remove(boxSn);
@@ -112,10 +122,6 @@
    /**
     * 释放 UAV 控制权限
     *
     * @param boxSn 设备序列号
     * @param type  控制类型
     * @return 是否成功释放控制
     */
    public boolean releaseControl(String boxSn, String type) {
        UavControlType controlType = UavControlType.fromString(type);
@@ -124,7 +130,7 @@
    }
    /**
     * 释放单个控制类型的权限
     * 释放单个控制类型权限
     */
    private boolean releaseSingleControl(String boxSn, UavControlType controlType, Long controller) {
        ConcurrentHashMap<String, Long> controlMap = getControlMap(controlType);
@@ -134,42 +140,35 @@
        }
        controlMap.remove(boxSn);
        uavControlManager.sendControlRelease(boxSn, controlType.getType());
        uavControlManager.sendControlRelease(boxSn, controlType.getType(), controller);
        return true;
    }
    /**
     * 释放用户所有 UAV 控制权
     * 释放用户所有控制权限
     */
    public void releaseAllControls(Long userId) {
        // 释放飞行控制
        uavFlyControlMap.entrySet().removeIf(entry -> entry.getValue().equals(userId));
        // 释放载荷控制
        uavPayloadControlMap.entrySet().removeIf(entry -> entry.getValue().equals(userId));
    }
    /**
     * 获取当前某设备的控制用户
     *
     * @param boxSn 设备序列号
     * @param type  控制类型
     * @return 当前控制该设备的用户 ID
     */
    public Long getCurrentController(String boxSn, String type) {
        UavControlType controlType = UavControlType.fromString(type);
        return getControlMap(controlType).get(boxSn);
    }
    public Map<String,Long> getCurrentController(String boxSn) {
        Long flyController = uavFlyControlMap.get(boxSn);
        Map<String,Long> map=new HashMap<>();
        map.put("flyController",flyController);
        Long payloadController = uavPayloadControlMap.get(boxSn);
        map.put("payloadController",payloadController);
        map.put("flyController", uavFlyControlMap.get(boxSn));
        map.put("payloadController", uavPayloadControlMap.get(boxSn));
        return map;
    }
    /**
     * 根据控制类型获取对应的控制 Map
     * 根据控制类型获取对应控制 Map
     */
    private ConcurrentHashMap<String, Long> getControlMap(UavControlType controlType) {
        switch (controlType) {
@@ -183,7 +182,7 @@
    }
    /**
     * 根据控制类型获取对应的请求 Map
     * 根据控制类型获取对应请求 Map
     */
    private ConcurrentHashMap<String, Long> getRequestMap(UavControlType controlType) {
        switch (controlType) {
@@ -195,4 +194,11 @@
                throw new IllegalArgumentException("不支持的控制类型");
        }
    }
    /**
     * 获取用户优先级
     */
    private int getUserPriority(Long userId) {
        return sysUserService.selectUserById(userId).getPriority();
    }
}