package com.ard.work.component.websocket.handler;
|
|
import com.alibaba.fastjson2.JSON;
|
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.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;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
@Service
|
public class UavControlManager extends BaseSubscriptionManager<Map<String, Object>> {
|
|
@Resource
|
private UavControlService uavControlService;
|
@Resource
|
private RedisCache redisCache;
|
|
/**
|
* 申请控制
|
*/
|
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, 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, 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 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));
|
}
|
|
/**
|
* 获取指定设备的当前操作者信息
|
* 该方法重写自父类,用于获取无人机和载荷的当前控制者用户ID
|
*
|
* @param boxSn 设备序列号,用于标识特定的设备
|
* @return 返回一个映射,包含无人机(fly)和载荷(payload)的当前控制者用户ID
|
*/
|
@Override
|
protected Map<String, Object> getData(String boxSn) {
|
// 获取当前控制飞行的用户ID
|
Long flyUserId = uavControlService.getCurrentController(boxSn, "fly");
|
// 获取当前控制载荷的用户ID
|
Long payloadUserId = uavControlService.getCurrentController(boxSn, "payload");
|
// 创建一个映射,用于存储飞行和载荷的当前控制者用户ID
|
Map<String, Object> map = new HashMap<>();
|
map.put("boxSn", boxSn);
|
// 将飞行当前控制者用户ID添加到映射中
|
SysUser flyUser = redisCache.getCacheMapValue(CacheConstants.SYS_USER, flyUserId.toString());
|
map.put("flyController", flyUser);
|
// 将载荷当前控制者用户ID添加到映射中
|
SysUser payloadUser = redisCache.getCacheMapValue(CacheConstants.SYS_USER, payloadUserId.toString());
|
map.put("payloadController", payloadUser);
|
// 返回包含当前控制者信息的映射
|
return map;
|
}
|
|
@Override
|
protected String getMessageType() {
|
return "controller";
|
}
|
}
|