liusuyi
2025-02-20 ab55c60112c72fcfe7836a91a278f316cddd7c00
添加无人机控制权申请、处理、释放
4 files modified
1 files renamed
41 ■■■■■ changed files
ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java 24 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java 3 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/exception/NoPermissionException.java
@@ -1,5 +1,10 @@
package com.ard.common.exception;
/**
 * 无人机权限异常
 *
 * @author ruoyi
 */
public class NoPermissionException extends RuntimeException {
    public NoPermissionException(String message) {
        super(message);
ard-work/src/main/java/com/ard/tianyu/aspect/ControlAuthorityAspect.java
@@ -57,8 +57,8 @@
            String boxSn = getBoxSn(arg);
            if (boxSn != null) {
                //判断无人机控制者是否为当前登录用户
                Long currentControllerId = UavControlManager.droneControlMap.get(boxSn);
                if (currentControllerId != null && currentControllerId.equals(SecurityUtils.getUserId())) {
                Long controller = UavControlManager.droneControlMap.get(boxSn);
                if (controller != null && controller.equals(SecurityUtils.getUserId())) {
                    return true;
                }
            }
ard-work/src/main/java/com/ard/tianyu/service/impl/UavControlManager.java
@@ -3,7 +3,7 @@
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.ControlMessage;
import com.ard.tianyu.websocket.domain.WsMessage;
import com.ard.tianyu.websocket.utils.WebSocketUtil;
import lombok.extern.slf4j.Slf4j;
@@ -22,14 +22,14 @@
    public static final ConcurrentHashMap<String, Long> controlRequestMap = new ConcurrentHashMap<>();
    // 发送通知(通过 WebSocket推送)
    public void notifyMessage(String boxSn, String action, Long controller, Long requester) {
        ControlRequestMessage controlRequestMessage = ControlRequestMessage.builder()
    public void notifyMessage(String boxSn, String action, Long source, Long target) {
        ControlMessage controlMessage = ControlMessage.builder()
                .boxSn(boxSn)
                .requester(requester)
                .userId(source)
                .action(action)
                .build();
        WsMessage<ControlRequestMessage> wsMessage = new WsMessage<>("controlRequest", controlRequestMessage);
        WebSocketUtil.sendMessage(controller.toString(), JSON.toJSONString(wsMessage));
        WsMessage<ControlMessage> wsMessage = new WsMessage<>("controlRequest", controlMessage);
        WebSocketUtil.sendMessage(target.toString(), JSON.toJSONString(wsMessage));
    }
    // 申请控制
@@ -46,7 +46,9 @@
            // 则将控制请求加入请求队列
            controlRequestMap.put(boxSn, requester);
            // 通知当前控制者,有新的控制请求
            notifyMessage(boxSn, "request", controller, requester);
            notifyMessage(boxSn, "request", requester, controller);
        } else {
            throw new NoPermissionException("当前已经获取控制权,无需重复申请");
        }
        return false; // 等待当前控制者的同意
    }
@@ -60,15 +62,17 @@
            if (approve) {
                // 同意控制,将控制权赋予请求者
                droneControlMap.put(boxSn, requester);
                notifyMessage(boxSn, "approve", requester, controller);
                notifyMessage(boxSn, "approve", controller, requester);
            } else {
                notifyMessage(boxSn, "reject", requester, controller);
                notifyMessage(boxSn, "reject", controller, requester);
            }
            // 无论同意还是拒绝,都移除控制请求
            controlRequestMap.remove(boxSn);
            return true;
        }
        return false;
        else {
            throw new NoPermissionException("无申请不需要处理控制权");
        }
    }
    // 释放控制
ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlMessage.java
File was renamed from ard-work/src/main/java/com/ard/tianyu/websocket/domain/ControlRequestMessage.java
@@ -9,11 +9,10 @@
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ControlRequestMessage {
public class ControlMessage {
    private String boxSn;       // 盒子编号
    private Long controller;    // 当前控制者ID
    private Long requester;     // 请求控制者ID
    private Long userId;        // 消息发送者
    private String action;      // 操作类型:request(请求),approve(同意),reject(拒绝)
}
ard-work/src/main/java/com/ard/tianyu/websocket/handler/TyMessageHandler.java
@@ -1,9 +1,6 @@
package com.ard.tianyu.websocket.handler;
import com.ard.tianyu.websocket.domain.ControlRequestMessage;
import com.ard.tianyu.websocket.domain.WsMessage;
import com.ard.tianyu.websocket.utils.WebSocketUtil;
import com.ard.tianyu.websocket.utils.WsMessageConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;