zhaowenyu
2026-03-11 2acf49278129e5870d8b775519a2bc1461294fb8
ard-work/src/main/java/com/ard/work/component/websocket/handler/UavControlManager.java
@@ -4,10 +4,9 @@
import com.ard.common.constant.CacheConstants;
import com.ard.common.core.domain.entity.SysUser;
import com.ard.common.core.redis.RedisCache;
import com.ard.work.service.control.UavControlService;
import com.ard.work.domain.message.BaseMessage;
import com.ard.work.domain.message.UavControlMessage;
import com.ard.work.component.websocket.utils.WebSocketUtil;
import com.ard.work.domain.message.*;
import com.ard.work.service.control.UavControlService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -23,39 +22,118 @@
    private RedisCache redisCache;
    /**
     * 发送控制请求
     * 申请控制
     */
    public void sendControlRequest(Long controllerId, String boxSn, String type, Long requester) {
        UavControlMessage message = new UavControlMessage(boxSn, type, requester, null);
        SysUser sysUser = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + requester);
        message.setRequester(sysUser);
        BaseMessage<UavControlMessage> baseMessage = new BaseMessage<>("control", message);
        WebSocketUtil.sendMessage(controllerId, JSON.toJSONString(baseMessage));
    public void sendControlRequest(Long controllerId, String boxSn, String type, Long requesterId) {
        SysUser requester = redisCache.getCacheMapValue(CacheConstants.SYS_USER, requesterId.toString());
        UavControlMessage msg = new UavControlMessage();
        msg.setBoxSn(boxSn);
        msg.setType(type);
        msg.setAction("request");
        msg.setOperatorId(requesterId);
        msg.setOperator(requester);
        BaseMessage<UavControlMessage> base = new BaseMessage<>("control", msg);
        WebSocketUtil.sendMessage(controllerId, JSON.toJSONString(base));
    }
    /**
     * 发送控制同意通知
     * 同意控制
     */
    public void sendControlApproval(Long requesterId, String boxSn, String type) {
        UavControlMessage message = new UavControlMessage(boxSn, type, null, true);
        BaseMessage<UavControlMessage> baseMessage = new BaseMessage<>("control", message);
        WebSocketUtil.sendMessage(requesterId, JSON.toJSONString(baseMessage));
    public void sendControlApproval(Long requesterId, String boxSn, String type, Long controllerId) {
        SysUser controller = redisCache.getCacheMapValue(CacheConstants.SYS_USER, controllerId.toString());
        UavControlMessage msg = new UavControlMessage();
        msg.setBoxSn(boxSn);
        msg.setType(type);
        msg.setAction("approve");
        msg.setApproved(true);
        msg.setController(controller);
        BaseMessage<UavControlMessage> base = new BaseMessage<>("control", msg);
        WebSocketUtil.sendMessage(requesterId, JSON.toJSONString(base));
    }
    /**
     * 发送控制拒绝通知
     * 拒绝控制
     */
    public void sendControlRejection(Long requesterId, String boxSn, String type) {
        UavControlMessage message = new UavControlMessage(boxSn, type, null, false);
        BaseMessage<UavControlMessage> baseMessage = new BaseMessage<>("control", message);
        WebSocketUtil.sendMessage(requesterId, JSON.toJSONString(baseMessage));
    public void sendControlRejection(Long requesterId, String boxSn, String type, Long controllerId) {
        SysUser controller = redisCache.getCacheMapValue(CacheConstants.SYS_USER, controllerId.toString());
        UavControlMessage msg = new UavControlMessage();
        msg.setBoxSn(boxSn);
        msg.setType(type);
        msg.setAction("reject");
        msg.setApproved(false);
        msg.setController(controller);
        BaseMessage<UavControlMessage> base = new BaseMessage<>("control", msg);
        WebSocketUtil.sendMessage(requesterId, JSON.toJSONString(base));
    }
    /**
     * 发送控制释放通知
     * 控制权接管
     */
    public void sendControlRelease(String boxSn, String type) {
        UavControlMessage message = new UavControlMessage(boxSn, type, null, null);
    public void sendControlTakeover(Long oldControllerId, Long newControllerId, String boxSn, String type) {
        SysUser newController = redisCache.getCacheMapValue(CacheConstants.SYS_USER, newControllerId.toString());
        SysUser oldController = redisCache.getCacheMapValue(CacheConstants.SYS_USER, oldControllerId.toString());
        // 1️⃣ 通知原控制者:你被抢占了
        UavControlMessage msgOld = new UavControlMessage();
        msgOld.setBoxSn(boxSn);
        msgOld.setType(type);
        msgOld.setAction("takeover");
        msgOld.setOperatorId(newControllerId);
        msgOld.setOperator(newController);
        msgOld.setControllerId(oldControllerId);
        msgOld.setController(oldController);
        BaseMessage<UavControlMessage> baseMessage = new BaseMessage<>("control", msgOld);
        WebSocketUtil.sendMessage(oldControllerId, JSON.toJSONString(baseMessage));
        // 2️⃣ 通知新控制者:你已获得控制权
        UavControlMessage msgNew = new UavControlMessage();
        msgNew.setBoxSn(boxSn);
        msgNew.setType(type);
        msgNew.setAction("approve");  // 或 "takeover" 也可
        msgNew.setOperatorId(newControllerId);
        msgNew.setOperator(newController);
        baseMessage = new BaseMessage<>("control", msgNew);
        WebSocketUtil.sendMessage(newControllerId, JSON.toJSONString(baseMessage));
        // 3️⃣ 广播给观战用户(可选)
        UavControlMessage msgBroadcast = new UavControlMessage();
        msgBroadcast.setBoxSn(boxSn);
        msgBroadcast.setType(type);
        msgBroadcast.setAction("takeover");
        msgBroadcast.setOperatorId(newControllerId);
        msgBroadcast.setOperator(newController);
        msgBroadcast.setControllerId(oldControllerId);
        msgBroadcast.setController(oldController);
        baseMessage = new BaseMessage<>("control", msgBroadcast);
        WebSocketUtil.sendMessageAll(JSON.toJSONString(baseMessage));
    }
    /**
     * 控制权释放
     */
    public void sendControlRelease(String boxSn, String type, Long operatorId) {
        SysUser operator = redisCache.getCacheMapValue(CacheConstants.SYS_USER, operatorId.toString());
        UavControlMessage message = new UavControlMessage();
        message.setBoxSn(boxSn);
        message.setType(type);
        message.setAction("release");
        message.setOperatorId(operatorId);
        message.setOperator(operator);
        BaseMessage<UavControlMessage> baseMessage = new BaseMessage<>("control", message);
        WebSocketUtil.sendMessageAll(JSON.toJSONString(baseMessage));
    }
@@ -77,10 +155,10 @@
        Map<String, Object> map = new HashMap<>();
        map.put("boxSn", boxSn);
        // 将飞行当前控制者用户ID添加到映射中
        SysUser flyUser = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + flyUserId);
        SysUser flyUser = redisCache.getCacheMapValue(CacheConstants.SYS_USER, flyUserId.toString());
        map.put("flyController", flyUser);
        // 将载荷当前控制者用户ID添加到映射中
        SysUser payloadUser = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + payloadUserId);
        SysUser payloadUser = redisCache.getCacheMapValue(CacheConstants.SYS_USER, payloadUserId.toString());
        map.put("payloadController", payloadUser);
        // 返回包含当前控制者信息的映射
        return map;