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<String, Long> uavFlyControlMap = new ConcurrentHashMap<>();
|
/**
|
* 记录当前获得载荷控制权限的用户
|
*/
|
private final ConcurrentHashMap<String, Long> uavPayloadControlMap = new ConcurrentHashMap<>();
|
|
/**
|
* 记录飞行控制请求
|
*/
|
private final ConcurrentHashMap<String, Long> flyControlRequests = new ConcurrentHashMap<>();
|
/**
|
* 记录载荷控制请求
|
*/
|
private final ConcurrentHashMap<String, Long> 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<String, Long> controlMap = getControlMap(controlType);
|
ConcurrentHashMap<String, Long> 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<String, Long> 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<String, Long> 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<String, Long> getControlMap(UavControlType controlType) {
|
switch (controlType) {
|
case FLY:
|
return uavFlyControlMap;
|
case PAYLOAD:
|
return uavPayloadControlMap;
|
default:
|
throw new IllegalArgumentException("不支持的控制类型");
|
}
|
}
|
|
/**
|
* 根据控制类型获取对应的请求 Map
|
*/
|
private ConcurrentHashMap<String, Long> getRequestMap(UavControlType controlType) {
|
switch (controlType) {
|
case FLY:
|
return flyControlRequests;
|
case PAYLOAD:
|
return payloadControlRequests;
|
default:
|
throw new IllegalArgumentException("不支持的控制类型");
|
}
|
}
|
}
|