指挥中心接口文档(commandCenter)
基于 feat-dashboard-lianjd 分支对比 develop 的新增接口整理,模块 xp-robotaxi-admin-boot。
给前端的接口分两部分:**REST**(4 个 GET 接口) + Socket.IO(实时推送)。
一、基础信息
| 项 |
值 |
| 后端模块 |
xp-robotaxi-admin-boot |
| 网关前缀 |
管理后台域名 + /api/v1/commandCenter(与 cockpit 同套 SSO 鉴权) |
| 鉴权方式 |
管理后台 SSO Token(userType=system),由网关 AuthFilter 校验后注入 Header;REST 通过 @RequiresPermissions("commandCenter:view") 二次校验 |
| 统一响应包装 |
R<T> = { code: number, msg: string, data: T },code=200 表示成功 |
二、REST 接口
2.1 查询单车详情
- 路径:
GET /api/v1/commandCenter/vehicle/detail
- 权限:
commandCenter:view
- 入参(Query):
| 字段 |
类型 |
必填 |
说明 |
vehicleId |
Long |
是 |
车辆 ID |
- 返回:
R<CommandCenterVehicleDetailVo> — 见 4.1
- 示例:
GET /api/v1/commandCenter/vehicle/detail?vehicleId=10086
{
"code": 200,
"msg": "操作成功",
"data": {
"vehicleId": 10086,
"vin": "LXP****",
"plateNumber": "粤B-XXXXX",
"monitorGroup": "HAS_ORDER",
"monitorStatus": "接驾中",
"stateCode": "PICK_UP",
"currentElectricity": 76,
"todayCompletedOrders": 12,
"routeInfo": {
"startLon": 113.93,
"startLat": 22.53,
"endLon": 113.95,
"endLat": 22.55,
"startAddress": "XX 大厦",
"endAddress": "XX 公园",
"eta": 480
},
"currentLon": 113.94,
"currentLat": 22.54
}
}
2.2 查询城市电子围栏列表
- 路径:
GET /api/v1/commandCenter/fences
- 权限:
commandCenter:view
- 入参(Query):
| 字段 |
类型 |
必填 |
说明 |
cityCode |
String |
是 |
城市编码(与 xp_open_city.city_code 对应) |
- 返回:
R<List<CommandCenterFenceVo>> — 见 4.2
GET /api/v1/commandCenter/fences?cityCode=440300
2.3 查询城市场站列表
- 路径:
GET /api/v1/commandCenter/stations
- 权限:
commandCenter:view
- 入参(Query):
| 字段 |
类型 |
必填 |
说明 |
cityCode |
String |
是 |
城市编码 |
- 返回:
R<List<XpStation>> — 见 4.3
2.4 查询已开通城市列表
- 路径:
GET /api/v1/commandCenter/regions
- 权限:
commandCenter:view
- 入参:无
- 返回:
R<List<XpOpenCity>> — 见 4.4
GET /api/v1/commandCenter/regions
三、Socket.IO 接口
3.1 连接信息
| 项 |
值 |
| URL |
wss://<管理后台域名>/ws(或 ws:// for dev) |
| Namespace |
/commandCenter |
| 协议 |
Socket.IO v4(netty-socketio 2.0.11 服务端) |
| 默认命名空间 |
显式拒连,必须使用 /commandCenter |
| 心跳 |
服务端默认 pingInterval=25s, pingTimeout=60s |
前端示例(socket.io-client v4):
import { io } from "socket.io-client";
const socket = io("/commandCenter", {
path: "/ws",
transports: ["websocket"],
});
socket.on("connect", () => {
socket.emit("auth", { token: getSsoToken() });
});
3.2 客户端 → 服务端事件
auth — 鉴权(连接后**必须**第一时间发送)
入参:CommandCenterAuthDto
| 字段 |
类型 |
必填 |
说明 |
token |
String |
是 |
管理后台 SSO Token(同 REST 用) |
服务端会用 token 解析出运维登录用户,要求权限里包含 commandCenter:view,否则下发 auth_failed 并断开。
subscribe — 订阅城市/围栏
入参:CommandCenterSubscribeDto
| 字段 |
类型 |
必填 |
说明 |
cityCode |
String |
是 |
城市编码,加入房间 city_{cityCode} |
electronicId |
Long |
否 |
围栏 ID,传则同时加入 fence_{electronicId} |
前置条件:必须先收到 auth_success 后再调用,否则服务端回 auth_failed。
unsubscribe — 取消订阅
入参同 subscribe。**注意**:切换城市时前端必须先 unsubscribe 旧城市,再 subscribe 新城市,否则会收到多城市数据。
3.3 服务端 → 客户端事件
| 事件名 |
触发时机 |
推送频率 |
负载类型 |
auth_success |
auth 通过后立即推送一次 |
一次 |
{ userId: string } |
auth_failed |
token 为空 / 鉴权失败 / 未鉴权就 subscribe |
一次(随后断开) |
{ message: string } |
vehicles |
已订阅城市的车辆位置/状态聚合 |
每 2 秒 |
VehicleMonitorVo[] — 见 4.5 |
kpi |
城市维度 KPI 指标 |
每 5 秒(复用 2s 聚合结果) |
CommandCenterKpiVo — 见 4.6 |
passenger_calls |
待接单乘客呼单列表 |
每 5 秒 |
PassengerCallVo[] — 见 4.7 |
推送范围:以 Socket.IO Room 维度广播,仅推到加入了 city_{cityCode} 房间的客户端;前端可同时订阅多个城市但要自行去重。
四、数据结构
字段类型一栏使用 Java 类型,TS 对应:Long→number(如担心大数溢出可改为 string,由前端 JSON 解析时统一处理)、Double/Float/BigDecimal→number、LocalDateTime→ ISO 字符串 yyyy-MM-dd HH:mm:ss(+8)。
4.1 CommandCenterVehicleDetailVo
| 字段 |
类型 |
说明 |
vehicleId |
Long |
车辆 ID |
vin |
String |
车架号 |
plateNumber |
String |
车牌号 |
monitorGroup |
String |
监控分组,见 MonitorGroupEnum |
monitorStatus |
String |
监控状态文案(如"接驾中") |
stateCode |
String |
状态枚举 code,见 VehicleMonitorStateEnum |
currentElectricity |
Integer |
当前电量 0-100 |
todayCompletedOrders |
Integer |
今日已完成订单数 |
routeInfo |
CommandCenterRouteInfoVo |
当前订单路线信息,无进行中订单时为 null |
currentLon |
Double |
当前经度 |
currentLat |
Double |
当前纬度 |
4.2 CommandCenterFenceVo
| 字段 |
类型 |
说明 |
electronicId |
Long |
围栏 ID |
electronicName |
String |
围栏名称 |
cityCode |
String |
城市编码 |
status |
Integer |
围栏状态 |
areas |
List<XpElectronicFenceArea> |
围栏区域,含 fencePoints("经度*纬度,经度*纬度") |
XpElectronicFenceArea 关键字段:id electronicId areaName areaType(1=运营区 2=禁行区)areaStatus(1=启用 2=禁用)fencePoints。
4.3 XpStation(场站,精简)
前端用得到的字段:id stationName stationNumber status(0=草稿 1=待启用 2=启用中 3=已停用 4=失效)cityCode cityName electronicId centerLon centerLat fencePoints stationArea sortNo。完整字段见 XpStation.java。
4.4 XpOpenCity(开通城市)
| 字段 |
类型 |
说明 |
id |
Long |
主键 |
provinceName / provinceCode |
String |
省 |
cityName / cityCode |
String |
市(前端订阅时使用 cityCode) |
districtName / districtCode |
String |
区县 |
status |
Integer |
1=启用 0=禁用(接口只返回启用) |
4.5 VehicleMonitorVo
| 字段 |
类型 |
说明 |
vehicleId |
Long |
车辆 ID |
vin |
String |
车架号 |
plateNumber |
String |
车牌号 |
monitorGroup |
String |
监控分组 code,见 4.8 |
monitorStatus |
String |
监控状态文案 |
stateCode |
String |
状态 code,见 4.9 |
lon |
Double |
经度 |
lat |
Double |
纬度 |
course |
Double |
航向角 |
currentElectricity |
Integer |
当前电量 |
speed |
Float |
当前速度 km/h |
orderId |
Long |
进行中订单 ID(无单为 null) |
charging |
Boolean |
是否充电中 |
positionUpdateTime |
Long |
位置上报时间戳(毫秒) |
4.6 CommandCenterKpiVo
| 字段 |
类型 |
说明 |
cruisingCount |
Integer |
巡游中车辆数 |
hasOrderCount |
Integer |
有单车辆数(接驾+送驾) |
pickUpCount |
Integer |
接驾中 |
dropOffCount |
Integer |
送驾中 |
occupiedCount |
Integer |
占用中(充电+整备+回场) |
chargingCount |
Integer |
充电中 |
preparingCount |
Integer |
整备中 |
returningCount |
Integer |
回场中 |
abnormalCount |
Integer |
异常(含 ODD 越界) |
todayCompletedOrders |
Integer |
今日完单数 |
avgOrdersPerVehicle |
BigDecimal |
单车平均完单数 |
4.7 PassengerCallVo
| 字段 |
类型 |
说明 |
orderId |
Long |
订单 ID |
orderNumber |
String |
订单号 |
startLon / startLat |
Double |
起点 |
startAddress |
String |
起点地址 |
endLon / endLat |
Double |
终点 |
endAddress |
String |
终点地址 |
createTime |
String |
下单时间,yyyy-MM-dd HH:mm:ss(+8) |
waitingSeconds |
Long |
已等待秒数(用于呼单超时高亮) |
4.8 MonitorGroupEnum
| code |
desc |
CRUISING |
巡游中 |
HAS_ORDER |
有单 |
OCCUPIED |
占用中 |
ABNORMAL |
异常 |
4.9 VehicleMonitorStateEnum
| code |
desc |
所属分组 |
CRUISING |
巡游中 |
CRUISING |
PICK_UP |
接驾中 |
HAS_ORDER |
DROP_OFF |
送驾中 |
HAS_ORDER |
CHARGING |
充电中 |
OCCUPIED |
PREPARING |
整备中 |
OCCUPIED |
RETURNING |
回场中 |
OCCUPIED |
ABNORMAL |
车辆异常 |
ABNORMAL |
ODD_OUT |
ODD 越界 |
ABNORMAL |
五、前端接入要点(备忘)
- 登录态:复用现有管理后台 SSO,无需单独登录。
- 路由前缀:所有 REST 接口都在
/api/v1/commandCenter 下,与 cockpit 的 /cockpit/* 不冲突。
- Socket.IO 时序:
connect → emit('auth', { token }) → on('auth_success') → emit('subscribe', { cityCode }) → on('vehicles' | 'kpi' | 'passenger_calls')。
- 切换城市:先
unsubscribe 再 subscribe,避免多城市数据叠加。
- 断线重连:socket.io-client 自带重连;重连后需重新
auth 与 subscribe(服务端不保存订阅状态)。
- 大屏刷新频率:车辆 2s、KPI/呼单 5s;前端不要再做客户端拉取,纯被动接收推送。