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> { @Resource private UavControlService uavControlService; @Resource private RedisCache redisCache; /** * 申请控制 */ public void sendControlRequest(Long controllerId, String boxSn, String type, Long requesterId) { SysUser requester = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + requesterId); UavControlMessage msg = new UavControlMessage(); msg.setBoxSn(boxSn); msg.setType(type); msg.setAction("request"); msg.setOperatorId(requesterId); msg.setOperator(requester); BaseMessage 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.getCacheObject(CacheConstants.SYS_USER_KEY + controllerId); UavControlMessage msg = new UavControlMessage(); msg.setBoxSn(boxSn); msg.setType(type); msg.setAction("approve"); msg.setApproved(true); msg.setController(controller); BaseMessage 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.getCacheObject(CacheConstants.SYS_USER_KEY + controllerId); UavControlMessage msg = new UavControlMessage(); msg.setBoxSn(boxSn); msg.setType(type); msg.setAction("reject"); msg.setApproved(false); msg.setController(controller); BaseMessage 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.getCacheObject(CacheConstants.SYS_USER_KEY + newControllerId); SysUser oldController = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + oldControllerId); // 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 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.getCacheObject(CacheConstants.SYS_USER_KEY + operatorId); UavControlMessage message = new UavControlMessage(); message.setBoxSn(boxSn); message.setType(type); message.setAction("release"); message.setOperatorId(operatorId); message.setOperator(operator); BaseMessage baseMessage = new BaseMessage<>("control", message); WebSocketUtil.sendMessageAll(JSON.toJSONString(baseMessage)); } /** * 获取指定设备的当前操作者信息 * 该方法重写自父类,用于获取无人机和载荷的当前控制者用户ID * * @param boxSn 设备序列号,用于标识特定的设备 * @return 返回一个映射,包含无人机(fly)和载荷(payload)的当前控制者用户ID */ @Override protected Map getData(String boxSn) { // 获取当前控制飞行的用户ID Long flyUserId = uavControlService.getCurrentController(boxSn, "fly"); // 获取当前控制载荷的用户ID Long payloadUserId = uavControlService.getCurrentController(boxSn, "payload"); // 创建一个映射,用于存储飞行和载荷的当前控制者用户ID Map map = new HashMap<>(); map.put("boxSn", boxSn); // 将飞行当前控制者用户ID添加到映射中 SysUser flyUser = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + flyUserId); map.put("flyController", flyUser); // 将载荷当前控制者用户ID添加到映射中 SysUser payloadUser = redisCache.getCacheObject(CacheConstants.SYS_USER_KEY + payloadUserId); map.put("payloadController", payloadUser); // 返回包含当前控制者信息的映射 return map; } @Override protected String getMessageType() { return "controller"; } }