Open Warehouse Execution Management System API 文档
版本:v1.0
最后更新:2025-08-01
本文档描述了客户端系统如何主动调用 WES,以发出入库、出库等关键任务,以及容器任务回调的处理方式。
🔐 认证
所有 API 请求必须在请求头中包含 API 密钥:
X-API-KEY: <your_api_key>
认证错误
| 状态码 | 描述 | 解决方法 |
|---|---|---|
| 401 | 无效的 API 密钥 | 获取正确的 API 密钥 |
🌐 基本信息
基础 URL:https://${url}:${port}/api-platform/api
接口地址:POST /execute
Content-Type:application/json
📝 请求格式
通用请求头
Content-Type: application/json
X-Tenant-Id: <your_tenant_id> // SaaS 服务必填
X-API-KEY: <your_api_key>
X-Request-ID: <unique_request_id>
通用参数
| 参数名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| apiType | String | ✅ | API 类型标识符 |
| body | JSON | ✅ | 请求体(根据 apiType 变化) |
上游调用 API(WMS/ERP/MES → WES)
SKU 管理
apiType: SKU_CREATE
创建新的 SKU(库存单位)
请求体结构:
[
{
"skuCode": "SKU-2023-001",
"warehouseCode": "WH-EAST-01",
"ownerCode": "ACME_CORP",
"skuName": "Premium Laptop",
"color": "Space Gray",
"brand": "OpenWES",
"volumeDTO": {
"volume": 1500000,
"height": 150,
"width": 100,
"length": 100
},
"skuAttribute": {
"imageUrl": "https://storage.example.com/sku123.jpg",
"skuFirstCategory": "Electronics",
"skuSecondCategory": "Computers"
},
"skuPackage": {
"skuPackageDetails": [
{
"level": 1,
"packageCode": "LP-BOX-01",
"unit": "box",
"height": 200,
"width": 300,
"length": 400,
"weight": 1500
}
]
},
"skuBarcode": {
"barcodes": [
"1234567890123",
"2345678901234"
]
}
}
]
字段说明
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| skuCode | string | 是 | SKU 编码,最大长度 64 |
| warehouseCode | string | 是 | 仓库编码,最大长度 64 |
| ownerCode | string | 是 | 货主编码,最大长度 64 |
| skuName | string | 是 | SKU 名称,最大长度 128 |
| style | string | 否 | SKU 款式 |
| color | string | 否 | SKU 颜色 |
| size | string | 否 | SKU 尺码 |
| brand | string | 否 | SKU 品牌 |
| weight | object | 否 | 重量信息 |
| volumeDTO | object | 否 | 体积信息 |
| skuAttribute | object | 否 | SKU 属性 |
| skuConfig | object | 否 | SKU 配置 |
| skuPackage | object | 否 | SKU 包装 |
| skuBarcode | object | 否 | SKU 条码 |
体积信息(VolumeDTO)
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| volume | long | 是 | 体积,单位:立方毫米,≥0 |
| height | long | 是 | 高度,单位:毫米,≥0 |
| width | long | 是 | 宽度,单位:毫米,≥0 |
| length | long | 是 | 长度,单位:毫米,≥0 |
SKU 属性(SkuAttributeDTO)
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| imageUrl | string | 否 | SKU 图片地址 |
| unit | string | 否 | SKU 单位 |
| skuFirstCategory | string | 否 | 一级分类 |
| skuSecondCategory | string | 否 | 二级分类 |
| skuThirdCategory | string | 否 | 三级分类 |
| skuAttributeCategory | string | 否 | 属性分类 |
| skuAttributeSubCategory | string | 否 | 属性子分类 |
SKU 包装(SkuPackageDTO)
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| skuPackageDetails | array | 否 | 包装明细列表 |
包装明细
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| level | integer | 是 | 包装层级 |
| packageCode | string | 是 | 包装编码 |
| unit | string | 是 | 包装单位 |
| enableSplit | boolean | 否 | 是否允许拆分 |
| height | long | 是 | 包装高度(毫米)≥0 |
| width | long | 是 | 包装宽度(毫米)≥0 |
| length | long | 是 | 包装长度(毫米)≥0 |
| weight | integer | 是 | 包装重量(毫克)≥0 |
SKU 条码(BarcodeDTO)
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| barcodes | array | 否 | 条码列表(需唯一) |
成功响应:
{
"code": "0",
"msg": "success"
}
入库管理
apiType: ORDER_INBOUND_CREATE
请求体结构:
[
{
"customerOrderNo": "CUST-ORDER-001",
"lpnCode": "LPN123456",
"warehouseCode": "WH01",
"customerOrderType": "PURCHASE|RETURN|TRANSFER",
"storageType": "STORAGE|OVERSTOCK|IN_TRANSIT",
"sender": "供应商 A",
"carrier": "顺丰速运",
"shippingMethod": "陆运",
"trackingNumber": "SF123456789",
"estimatedArrivalDate": 1672531200000,
"remark": "易碎品,轻拿轻放",
"extendFields": {
"customField1": "value1",
"customField2": 100
},
"details": [
{
"ownerCode": "OWNER01",
"boxNo": "BOX001",
"qtyRestocked": 100,
"skuCode": "SKU001",
"skuName": "产品 A",
"style": "2023 新款",
"color": "红色",
"size": "XL",
"brand": "品牌 A",
"batchAttributes": {
"batchNo": "BATCH2023",
"productionDate": "2023-01-01"
},
"extendFields": {
"qualityGrade": "A"
}
}
]
}
]
字段说明
主订单字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| customerOrderNo | string | 是 | 客户订单号,最大长度 64 |
| lpnCode | string | 否 | LPN 编码,最大长度 64 |
| warehouseCode | string | 是 | 仓库编码,最大长度 64 |
| customerOrderType | string | 是 | 入库订单计划类型 |
| storageType | string | 是 | 存储类型(STORAGE/OVERSTOCK/IN_TRANSIT) |
| sender | string | 否 | 发货方,最大长度 128 |
| carrier | string | 否 | 物流公司,最大长度 128 |
| shippingMethod | string | 否 | 运输方式,最大长度 128 |
| trackingNumber | string | 否 | 物流单号,最大长度 128 |
| estimatedArrivalDate | long | 否 | 预计到达时间(时间戳) |
| remark | string | 否 | 备注,最大长度 255 |
| extendFields | object | 否 | 扩展字段(键值对格式) |
| details | array | 是 | 入库明细列表 |
明细字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| ownerCode | string | 是 | 货主编码,最大长度 64 |
| boxNo | string | 否 | 箱号,最大长度 64 |
| qtyRestocked | integer | 是 | 入库数量(≥1) |
| skuCode | string | 是 | SKU 编码,最大长度 64 |
| skuName | string | 否 | 商品名称 |
| style | string | 否 | 商品款式 |
| color | string | 否 | 商品颜色 |
| size | string | 否 | 商品尺码 |
| brand | string | 否 | 商品品牌 |
| batchAttributes | object | 否 | 批次属性(键值对) |
| extendFields | object | 否 | 扩展属性(键值对) |
存储类型枚举
| 值 | 描述 |
|---|---|
| STORAGE | 存储 |
| OVERSTOCK | 越库 |
| IN_TRANSIT | 在途 |
成功响应:
{
"code": "0",
"msg": "success"
}
apiType: ORDER_INBOUND_CANCEL
请求体结构:
{
"identifyNos": [
"INB-2023001",
"INB-2023002"
],
"warehouseCode": "WH01"
}
字段说明
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| identifyNos | array | 是 | 要取消的入库订单号列表(支持批量) |
| warehouseCode | string | 是 | 仓库编码(用于权限校验) |
成功响应
{
"code": "0",
"msg": "success"
}
出库管理
apiType: ORDER_OUTBOUND_CREATE
创建一个或多个出库计划订单
请求体结构:
[
{
"warehouseCode": "WH-EAST-01",
"customerWaveNo": "WAVE-2023-001",
"customerOrderNo": "CUST-ORDER-001",
"customerOrderType": "SALES",
"carrierCode": "SF-EXPRESS",
"waybillNo": "SF123456789",
"origPlatformCode": "TMALL",
"expiredTime": 1672531200000,
"priority": 100,
"shortOutbound": false,
"shortWaiting": false,
"orderNo": "ORD-2023-001",
"destinations": ["SHELF-A1", "SHELF-A2"],
"extendFields": {
"deliveryType": "express",
"specialInstructions": "轻拿轻放"
},
"details": [
{
"ownerCode": "ACME_CORP",
"skuCode": "SKU-2023-001",
"skuName": "Premium Laptop",
"batchAttributes": {
"batchNo": "BATCH2023",
"productionDate": "2023-01-01",
"expirationDate": "2025-01-01"
},
"qtyRequired": 10,
"qtyAllocated": 0,
"qtyActual": 0,
"extendFields": {
"qualityGrade": "A",
"remark": "易碎"
}
}
]
}
]
字段说明
主订单字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| warehouseCode | string | 是 | 仓库编码,最大长度 64 |
| customerWaveNo | string | 否 | 外部波次号 |
| customerOrderNo | string | 是 | 客户订单号,最大长度 64 |
| customerOrderType | string | 否 | 出库订单类型 |
| carrierCode | string | 否 | 承运商编码 |
| waybillNo | string | 否 | 运单号 |
| origPlatformCode | string | 否 | 原始平台编码 |
| expiredTime | long | 否 | 截止时间(时间戳) |
| priority | integer | 否 | 优先级,值越高优先级越高 |
| shortOutbound | boolean | 否 | 是否允许缺量出库,默认 false |
| shortWaiting | boolean | 否 | 是否允许等待补货,默认 false |
| orderNo | string | 是 | 订单号,按系统规则生成 |
| destinations | array | 否 | 容器目的地列表 |
| extendFields | object | 否 | 扩展字段(键值对格式) |
| details | array | 是 | 出库计划订单明细列表 |
明细字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| ownerCode | string | 是 | 货主编码,最大长度 64 |
| skuCode | string | 是 | SKU 编码,最大长度 64 |
| skuName | string | 否 | SKU 名称,最大长度 128 |
| batchAttributes | object | 否 | 批次属性(键值对) |
| qtyRequired | integer | 是 | 需求出库数量(≥1) |
| qtyAllocated | integer | 否 | 预分配批次库存数量 |
| qtyActual | integer | 否 | 实际出库数量 |
| extendFields | object | 否 | 扩展字段(键值对) |
成功响应:
{
"code": "0",
"msg": "success"
}
apiType: ORDER_OUTBOUND_CANCEL
根据客户订单号取消出库计划订单
请求体结构:
{
"customerOrderNos": [
"CUST-ORDER-001",
"CUST-ORDER-002"
]
}
字段说明
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| customerOrderNos | array | 是 | 要取消的客户订单号列表(支持批量) |
成功响应
{
"code": "0",
"msg": "success"
}
RCS -> WES
容器任务管理
apiType: CONTAINER_ARRIVE
通知系统容器已到达工作站,以触发后续操作。
请求体结构:
[
{
"workLocationCode": "WS-001-A",
"workLocationType": "STATION",
"workStationId": 1001,
"warehouseAreaId": 2001,
"containerDetails": [
{
"containerCode": "C-2023-001",
"face": "A",
"robotCode": "RBT-001",
"robotType": "KIVA",
"level": 2,
"bay": 3,
"locationCode": "LOC-A-01",
"forwardFace": "FRONT",
"groupCode": "GRP-001",
"containerAttributes": {
"weight": "10.5",
"fragile": true,
"priority": "high"
},
"taskCodes": ["TASK-001", "TASK-002"]
}
]
}
]
字段说明
主字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| workLocationCode | string | 是 | 工作位置编码(如工作站、拣货位) |
| workLocationType | enum | 否 | 工作位置类型(见枚举) |
| workStationId | long | 否 | 工作站 ID |
| warehouseAreaId | long | 否 | 库区 ID |
| containerDetails | array | 是 | 容器详情列表 |
容器详情字段
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| containerCode | string | 是 | 容器编码(如周转箱、托盘) |
| face | string | 否 | 容器面(如 KIVA 货架面 A/B/C/D) |
| robotCode | string | 否 | 机器人编码(如 AGV 编号) |
| robotType | string | 否 | 机器人类型(如 KIVA、AGV、AMR) |
| level | integer | 否 | 容器在货架中的层 |
| bay | integer | 否 | 容器在货架中的列 |
| locationCode | string | 是 | 容器当前位置编码(库位、工作站) |
| forwardFace | string | 否 | 容器朝向(A/B 表示周转箱朝向) |
| groupCode | string | 是 | 容器组编码(如波次、任务组) |
| containerAttributes | object | 否 | 容器扩展属性(重量、易碎、优先级等) |
| taskCodes | array | 否 | 与此容器关联的任务编码列表 |
工作位置类型枚举(WorkLocationTypeEnum)
| 值 | 描述 |
|---|---|
| BUFFER_SHELVING | 缓冲上架工作站 |
| ROBOT | 机器人 |
| CONVEYOR | 输送线 |
成功响应:
{
"code": "0",
"msg": "success"
}
apiType: CONTAINER_TASK_STATUS_UPDATE
更新容器任务执行状态,供 WCS/RCS 等外部系统上报任务进度。
请求体结构:
[
{
"taskCode": "TASK-2023-001",
"taskStatus": "EXECUTING",
"robotCode": "RBT-AGV-01",
"containerCode": "C-2023-001",
"workStationId": 1001,
"locationCode": "LOC-A-01"
}
]
字段说明
| 字段名 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| taskCode | string | 是 | 任务编码,全局唯一 |
| taskStatus | ContainerTaskStatusEnum | 是 | 当前任务状态,见下表 |
| robotCode | string | 否 | 执行任务的机器人编码(AGV/KIVA 编号) |
| containerCode | string | 否 | 与任务绑定的容器编码(周转箱、托盘) |
| workStationId | long | 否 | 任务工作站或目标工作站 ID |
| locationCode | string | 否 | 任务或目标位置编码(库位、拣货位、月台等) |
任务状态枚举(ContainerTaskStatusEnum)
| 值 | 描述 |
|---|---|
| NEW | 新建 |
| PROCESSING | 进行中 |
| WCS_SUCCEEDED | 已完成 |
| WCS_FAILED | 失败 |
成功响应:
{
"code": "0",
"msg": "success"
}
⚠️ 错误处理
常见错误码
| 状态码 | 描述 | 说明 |
|---|---|---|
| 200 | 成功 | 请求处理成功 |
| 400 | 请求错误 | 参数无效或请求体错误 |
| 401 | 未授权 | 认证失败或缺失 |
| 403 | 禁止访问 | 权限不足 |
| 404 | 未找到 | 资源不存在 |
| 429 | 请求过多 | 超过频率限制 |
| 500 | 服务器错误 | 服务端异常 |
错误响应示例
{
"code": "400",
"msg": "请求参数无效"
}
📈 频率限制
API 对每个 token 实施频率限制:
- 每个 IP 每分钟最多 1000 次请求
- 每个 token 每小时最多 500000 次请求
当超出频率限制时,API 返回:
{
"success": false,
"code": "429",
"message": "频率超限,请 60 秒后重试",
"requestId": "req-123456",
"timestamp": "2024-02-11T10:30:00Z"
}