package com.ard.tianyu.service.control; import com.ard.common.exception.NoPermissionException; import com.ard.common.utils.SecurityUtils; import com.ard.tianyu.websocket.domain.UavControlType; import com.ard.tianyu.websocket.handler.UavControlManager; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.concurrent.ConcurrentHashMap; /** * UAV控制服务类,负责管理对飞行和载荷的控制请求、释放和权限管理。 */ @Service public class UavControlService { @Resource private UavControlManager uavControlManager; /** * 记录当前获得飞行控制权限的用户 */ private final ConcurrentHashMap uavFlyControlMap = new ConcurrentHashMap<>(); /** * 记录当前获得载荷控制权限的用户 */ private final ConcurrentHashMap uavPayloadControlMap = new ConcurrentHashMap<>(); /** * 记录飞行控制请求 */ private final ConcurrentHashMap flyControlRequests = new ConcurrentHashMap<>(); /** * 记录载荷控制请求 */ private final ConcurrentHashMap payloadControlRequests = new ConcurrentHashMap<>(); /** * 请求获取 UAV 控制权限 * * @param boxSn 设备序列号 * @param type 控制类型("fly"、"payload") * @return 是否立即获得控制权限 */ public boolean requestControl(String boxSn, String type) { UavControlType controlType = UavControlType.fromString(type); Long requester = SecurityUtils.getUserId(); return requestSingleControl(boxSn, controlType, requester); } /** * 处理单个控制类型的请求 */ private boolean requestSingleControl(String boxSn, UavControlType controlType, Long requester) { ConcurrentHashMap controlMap = getControlMap(controlType); ConcurrentHashMap requestMap = getRequestMap(controlType); Long controller = controlMap.get(boxSn); if (controller == null) { controlMap.put(boxSn, requester); return true; } if (!controller.equals(requester)) { requestMap.put(boxSn, requester); uavControlManager.sendControlRequest(controller, boxSn, controlType.getType(), requester); } else { throw new NoPermissionException("当前已拥有控制权"); } return false; } /** * 处理 UAV 控制请求的响应(同意或拒绝) * * @param boxSn 设备序列号 * @param approve 是否同意 * @param type 控制类型 * @return 是否成功处理 */ public boolean handleControlResponse(String boxSn, boolean approve, String type) { UavControlType controlType = UavControlType.fromString(type); Long controller = SecurityUtils.getUserId(); return handleSingleControlResponse(boxSn, approve, controlType, controller); } /** * 处理单个控制类型的请求响应 */ private boolean handleSingleControlResponse(String boxSn, boolean approve, UavControlType controlType, Long controller) { ConcurrentHashMap requestMap = getRequestMap(controlType); Long requester = requestMap.get(boxSn); if (requester == null || requester.equals(controller)) { throw new NoPermissionException("无控制请求"); } if (approve) { getControlMap(controlType).put(boxSn, requester); uavControlManager.sendControlApproval(requester, boxSn, controlType.getType()); } else { uavControlManager.sendControlRejection(requester, boxSn, controlType.getType()); } requestMap.remove(boxSn); return true; } /** * 释放 UAV 控制权限 * * @param boxSn 设备序列号 * @param type 控制类型 * @return 是否成功释放控制 */ public boolean releaseControl(String boxSn, String type) { UavControlType controlType = UavControlType.fromString(type); Long controller = SecurityUtils.getUserId(); return releaseSingleControl(boxSn, controlType, controller); } /** * 释放单个控制类型的权限 */ private boolean releaseSingleControl(String boxSn, UavControlType controlType, Long controller) { ConcurrentHashMap controlMap = getControlMap(controlType); if (!controller.equals(controlMap.get(boxSn))) { throw new NoPermissionException("没有该设备的" + controlType.getType().toUpperCase() + "控制权"); } controlMap.remove(boxSn); uavControlManager.sendControlRelease(boxSn, controlType.getType()); return true; } /** * 释放用户所有 UAV 控制权 */ public void releaseAllControls(Long userId) { // 释放飞行控制 uavFlyControlMap.entrySet().removeIf(entry -> entry.getValue().equals(userId)); // 释放载荷控制 uavPayloadControlMap.entrySet().removeIf(entry -> entry.getValue().equals(userId)); } /** * 获取当前某设备的控制用户 * * @param boxSn 设备序列号 * @param type 控制类型 * @return 当前控制该设备的用户 ID */ public Long getCurrentController(String boxSn, String type) { UavControlType controlType = UavControlType.fromString(type); return getControlMap(controlType).get(boxSn); } /** * 根据控制类型获取对应的控制 Map */ private ConcurrentHashMap getControlMap(UavControlType controlType) { switch (controlType) { case FLY: return uavFlyControlMap; case PAYLOAD: return uavPayloadControlMap; default: throw new IllegalArgumentException("不支持的控制类型"); } } /** * 根据控制类型获取对应的请求 Map */ private ConcurrentHashMap getRequestMap(UavControlType controlType) { switch (controlType) { case FLY: return flyControlRequests; case PAYLOAD: return payloadControlRequests; default: throw new IllegalArgumentException("不支持的控制类型"); } } }