| | |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | |
| | | @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 控制权限 |
| | |
| | | /** |
| | | * 处理单个控制类型的请求 |
| | | */ |
| | | /** |
| | | * 处理单个控制类型的请求(支持多请求者) |
| | | */ |
| | | 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); |
| | | |
| | |
| | | |
| | | // 通知原控制者被抢占 |
| | | 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(requester); |
| | | uavControlManager.sendControlRejection(other, boxSn, controlType.getType(), controller); |
| | | } |
| | | } |
| | | } else { |
| | | uavControlManager.sendControlRejection(requester, boxSn, controlType.getType(), controller); |
| | | } |
| | | |
| | | requesters.remove(requester); |
| | | if (requesters.isEmpty()) { |
| | | requestMap.remove(boxSn); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 释放 UAV 控制权限 |
| | |
| | | /** |
| | | * 根据控制类型获取对应请求 Map |
| | | */ |
| | | private ConcurrentHashMap<String, Long> getRequestMap(UavControlType controlType) { |
| | | private ConcurrentHashMap<String, Set<Long>> getRequestMap(UavControlType controlType) { |
| | | switch (controlType) { |
| | | case FLY: |
| | | return flyControlRequests; |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取用户优先级 |
| | | */ |