package com.ard.tianyu.service.impl; import com.alibaba.fastjson2.JSON; import com.ard.common.exception.NoPermissionException; import com.ard.common.utils.SecurityUtils; import com.ard.tianyu.websocket.domain.ControlRequestMessage; import com.ard.tianyu.websocket.domain.WsMessage; import com.ard.tianyu.websocket.utils.WebSocketUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.concurrent.ConcurrentHashMap; @Service @Slf4j public class UavControlManager { // 存储每个无人机的当前控制者 public static final ConcurrentHashMap droneControlMap = new ConcurrentHashMap<>(); // 存储无人机的控制请求(用于判断哪个控制者正在等待) public static final ConcurrentHashMap controlRequestMap = new ConcurrentHashMap<>(); // 发送通知(通过 WebSocket推送) public void notifyMessage(String boxSn, String action, Long controller, Long requester) { ControlRequestMessage controlRequestMessage = ControlRequestMessage.builder() .boxSn(boxSn) .requester(requester) .action(action) .build(); WsMessage wsMessage = new WsMessage<>("controlRequest", controlRequestMessage); WebSocketUtil.sendMessage(controller.toString(), JSON.toJSONString(wsMessage)); } // 申请控制 public boolean requestControl(String boxSn) { Long requester = SecurityUtils.getUserId(); // 如果无人机没有控制者,直接控制 if (droneControlMap.get(boxSn) == null) { droneControlMap.put(boxSn, requester); return true; // 控制成功 } // 如果无人机已经有控制者,则发送申请给当前控制者 Long controller = droneControlMap.get(boxSn); if(!controller.equals(requester)) { // 则将控制请求加入请求队列 controlRequestMap.put(boxSn, requester); // 通知当前控制者,有新的控制请求 notifyMessage(boxSn, "request", controller, requester); } return false; // 等待当前控制者的同意 } // 处理控制请求的同意或拒绝 public boolean handleControlResponse(String boxSn, boolean approve) { Long controller = SecurityUtils.getUserId(); Long requester = controlRequestMap.get(boxSn); // 确保请求者是当前的控制者 if (requester != null && !requester.equals(controller)) { if (approve) { // 同意控制,将控制权赋予请求者 droneControlMap.put(boxSn, requester); notifyMessage(boxSn, "approve", requester, controller); } else { notifyMessage(boxSn, "reject", requester, controller); } // 无论同意还是拒绝,都移除控制请求 controlRequestMap.remove(boxSn); return true; } return false; } // 释放控制 public boolean releaseControl(String boxSn) { Long controller = droneControlMap.get(boxSn); if (controller != null) { if (controller.equals(SecurityUtils.getUserId())) { droneControlMap.remove(boxSn); return true; } else { // 当前控制者不匹配,可以记录日志或者抛出异常 log.warn("无权限释放控制, 实际控制者是 {}", controller); throw new NoPermissionException("无权限释放控制, 实际控制者是 " + controller); } } else { // 说明无人机没有控制者 log.warn("无人机当前 {} 没有控制者,无需释放", boxSn); throw new NoPermissionException("无人机" + boxSn + "当前没有控制者,无需释放"); } } }