12 KiB
Shopee 3.2.13 部分更新销售订单接口测试用例
接口信息
- 接口:3.2.13 WMS -> WES 部分更新销售订单
- Shopee URL:
POST /api/v2/automation/tovendor/outbound/salesorder/update_order - WES 本地入口:
POST http://127.0.0.1:9001/api/wms/api/sync/in - Content-Type:
application/json - EDI 配置 key:
update_order - WMS API:
shopee.outbound.salesorder.updateOrder - XSLT:
edi-shopee/src/main/resources/xslt/out/3_2_13_update_order.xslt - 测试日期:2026-07-28
- 测试仓库:
PHIXP
测试范围
- EDI XSLT 将 Shopee 原始字段转换为 WES 请求字段。
- WES 必填字段校验和订单存在性校验。
single_attr_list单选属性解析、订单扩展字段更新和属性字典同步。multi_attr_list多选属性解析、订单扩展字段更新和属性字典同步。- 相同请求重复执行时,属性字典不产生重复记录。
- 测试数据清理和订单原值恢复。
本次请求格式以《Shopee Automation Vendor 接入协议手册出库模块映射WES字段V1.2.1》3.2.13 章节为准。协议请求使用 snake_case 字段;EDI XSLT 转换后,WES 内部请求使用 camelCase 字段。
本次未调用 Shopee 外部测试环境。测试按“协议请求 -> 本地 XSLT 转换 -> WES 9001 内部接口 -> 数据库核验”拆分执行,因此报告同时保留协议请求和 WES 实测响应。Shopee 对外响应协议需在 EDI 对外路由可用后另行联调。
前置条件
- WES 服务已在
9001端口启动。 - 数据库为
ttx-xwms-test,仓库为PHIXP。 - 成功路径测试订单:
OBSGD0002607281457。 config_detail已维护以下SHOPEE_ORDER_HEADER属性组:service_codeshop_idinner_packaging
- WES 内部接口使用请求头
X-DB: ttx-xwms-test。
字段转换说明
| Shopee 字段 | WES 字段 | 数据库字段 |
|---|---|---|
whs_id |
warehouseCode |
shipment_header.warehouseCode |
order_number |
orderNumber |
shipment_header.erpOrderCode |
single_attr_list.service_code |
serviceCode |
shipment_header_ext1.serviceCode |
multi_attr_list.shop_id |
shopId、shopIdStr |
shipment_header_ext1.shopId、shopIdStr |
multi_attr_list.inner_packaging |
innerPackaging、innerPackagingType |
shipment_header_ext1.innerPackaging、innerPackagingType |
single_attr_list |
singleAttrList |
config_detail 单选属性字典 |
multi_attr_list |
multiAttrList |
config_detail 多选属性字典 |
3.2.13 标准请求格式
以下结构依据 V1.2.1 协议 3.2.13 章节。whs_id、order_number 必填,其余字段按“有传则更新,未传不更新”处理。
{
"whs_id": "PHIXP",
"order_number": "OBSGD0002607281457",
"can_group_picking": 1,
"group_key": "standard_group",
"urgent_flag": 99,
"cut_off_time": 1767837541,
"ctime": 1767751167,
"ship_by_date": 1767751167,
"purchase_time": 1767751167,
"single_attr_list": [
{
"attr_key": "service_code",
"attr_value_id": "STANDARD",
"attr_value_type": "",
"attr_value_name": "STANDARD"
}
],
"multi_attr_list": [
{
"attr_key": "shop_id",
"attr_value_list": [
{
"attr_value_id": "12345678",
"attr_value_type": "",
"attr_value_name": "Electronics Store SG"
},
{
"attr_value_id": "87654321",
"attr_value_type": "",
"attr_value_name": "Fashion Store SG"
}
]
},
{
"attr_key": "inner_packaging",
"attr_value_list": [
{
"attr_value_id": "CONS-BUBBLE-S",
"attr_value_type": "3",
"attr_value_name": "Small Bubble Wrap"
},
{
"attr_value_id": "CONS-TAPE-01",
"attr_value_type": "3",
"attr_value_name": "Sealing Tape"
}
]
}
]
}
协议允许的单选属性包括 service_code、channel_id、fulfillment_chain_id、order_structure、order_size、shop_group、store_id、parcel_id、lm_tracking_no、pickup_region、delivery_region、sls_tracking_no、actual_weight、lane_code、handover、zone_code_id、outer_packaging。
协议允许的多选属性包括 shop_id、shopee_order_sn、inner_packaging。
测试结果汇总
| 用例 | 场景 | 预期结果 | 实测结果 |
|---|---|---|---|
| TC-01 | 空请求体 | 返回“无效的消息体” | 通过 |
| TC-02 | 订单不存在 | 按协议返回成功 | 不通过:WES 返回“出库单不存在” |
| TC-03 | 现有订单,不传更新字段 | 返回成功且不修改业务字段 | 通过 |
| TC-04 | XSLT 转换单选和多选属性 | 生成合法 JSON,字段和值完整 | 通过 |
| TC-05 | single_attr_list 使用现有字典值 |
更新 serviceCode,字典记录保持唯一 |
通过 |
| TC-06 | multi_attr_list 使用现有字典值 |
更新店铺和内包装字段,字典记录保持唯一 | 通过 |
| TC-07 | 新单选、多选枚举增量同步 | 新增 1 条单选、2 条多选字典记录 | 通过 |
| TC-08 | 相同属性请求重复执行 | 接口均成功,字典不重复 | 通过 |
| TC-09 | 测试数据恢复与清理 | 订单恢复原值,临时字典记录为 0 | 通过 |
TC-01 空请求体
协议请求:
POST /api/v2/automation/tovendor/outbound/salesorder/update_order
Content-Type: application/json
{}
协议预期:请求无效。
WES 内部实测结果:
{"code":"1","msg":"无效的消息体","notify":true,"error":true}
结论:必填字段校验生效。
TC-02 订单不存在
协议请求体:
{
"whs_id": "PHIXP",
"order_number": "CODEX-3-2-13-NOT-EXIST"
}
协议预期:订单不存在时返回成功。
WES 内部实测结果:
{"code":"1","msg":"出库单不存在","notify":true,"error":true}
结论:按仓库和订单号查询生效,但返回行为不符合 3.2.13 协议“若订单不存在返回成功即可”的要求,记录为待修复问题。
TC-03 现有订单无更新字段
协议请求体:
{
"whs_id": "PHIXP",
"order_number": "202607280002_0"
}
预期及实测结果:
{"code":"0","msg":"Success","notify":true,"error":false}
结论:订单存在时成功返回;未携带扩展字段和属性列表,不修改订单业务字段。
TC-04 EDI XSLT 属性转换
协议 JSON 进入 EDI 后转换成供 XSLT 处理的中间 XML;本次用于验证的关键中间 XML:
<o>
<order_number>OBSGD0002607281457</order_number>
<single_attr_list>
<e>
<attr_key>service_code</attr_key>
<attr_value_id>STANDARD</attr_value_id>
<attr_value_name>STANDARD</attr_value_name>
</e>
</single_attr_list>
<multi_attr_list>
<e>
<attr_key>shop_id</attr_key>
<attr_value_list>
<e><attr_value_id>12345678</attr_value_id><attr_value_name>Electronics Store SG</attr_value_name></e>
<e><attr_value_id>87654321</attr_value_id><attr_value_name>Fashion Store SG</attr_value_name></e>
</attr_value_list>
</e>
<e>
<attr_key>inner_packaging</attr_key>
<attr_value_list>
<e><attr_value_id>CONS-BUBBLE-S</attr_value_id><attr_value_type>3</attr_value_type></e>
<e><attr_value_id>CONS-TAPE-01</attr_value_id><attr_value_type>3</attr_value_type></e>
</attr_value_list>
</e>
</multi_attr_list>
</o>
实测转换结果摘要:
{
"serviceCode": "STANDARD",
"shopId": "[\"12345678\",\"87654321\"]",
"shopIdStr": "12345678,87654321",
"innerPackaging": "CONS-BUBBLE-S,CONS-TAPE-01",
"innerPackagingType": "3,3",
"singleAttrCount": 1,
"multiAttrCount": 2,
"shopValueCount": 2,
"innerValueCount": 2
}
结论:转换结果是合法 JSON,单选、多选列表及派生字段完整。
TC-05 single_attr_list 现有字典值
协议请求关键字段:
{
"whs_id": "PHIXP",
"order_number": "OBSGD0002607281457",
"single_attr_list": [
{
"attr_key": "service_code",
"attr_value_id": "STANDARD",
"attr_value_type": "",
"attr_value_name": "STANDARD"
}
]
}
实测结果:
- 接口返回
code=0。 shipment_header_ext1.serviceCode = STANDARD。config_detail中service_code / STANDARD数量为1。- 字典说明为
STANDARD。
TC-06 multi_attr_list 现有字典值
协议请求关键字段:
{
"whs_id": "PHIXP",
"order_number": "OBSGD0002607281457",
"multi_attr_list": [
{
"attr_key": "shop_id",
"attr_value_list": [
{"attr_value_id":"12345678","attr_value_type":"","attr_value_name":"Electronics Store SG"},
{"attr_value_id":"87654321","attr_value_type":"","attr_value_name":"Fashion Store SG"}
]
},
{
"attr_key": "inner_packaging",
"attr_value_list": [
{"attr_value_id":"CONS-BUBBLE-S","attr_value_type":"3","attr_value_name":"Small Bubble Wrap"},
{"attr_value_id":"CONS-TAPE-01","attr_value_type":"3","attr_value_name":"Sealing Tape"}
]
}
]
}
数据库实测结果:
{
"shopId": "[\"12345678\", \"87654321\"]",
"shopIdStr": "12345678,87654321",
"innerPackaging": "CONS-BUBBLE-S,CONS-TAPE-01",
"innerPackagingType": "3,3"
}
字典核验:4 个多选枚举的记录数量均为 1,名称和 attrValueType 正确。
TC-07 新枚举增量同步
测试值:
| 属性类型 | groupType | identifier | description | value1 |
|---|---|---|---|---|
| 单选 | service_code |
CODEX3213_SC_20260728 |
Codex 3.2.13 single test |
test |
| 多选 | shop_id |
CODEX3213_SHOP_A |
Codex 3.2.13 multi A |
test |
| 多选 | shop_id |
CODEX3213_SHOP_B |
Codex 3.2.13 multi B |
test |
实测结果:
- 接口返回
code=0。 - 订单
serviceCode、shopId、shopIdStr更新为请求值。 config_detail新增 3 条记录,字段内容与请求一致。
TC-08 重复请求幂等性
执行方式:连续两次发送 TC-07 的相同请求。
两次接口响应:
[
{"attempt":1,"http":200,"response":{"code":"0","msg":"Success","notify":true,"error":false}},
{"attempt":2,"http":200,"response":{"code":"0","msg":"Success","notify":true,"error":false}}
]
数据库核验:
CODEX3213_SC_20260728:count = 1CODEX3213_SHOP_A:count = 1CODEX3213_SHOP_B:count = 1
结论:重复请求不会生成重复属性字典记录。
TC-09 数据恢复和清理
清理动作:
- 通过 3.2.13 接口将订单字段恢复为测试前的值。
- 先按仓库、记录类型和测试 identifier 查询临时记录 ID。
- 仅按查询到的主键
2444、2445、2446删除临时测试记录。 - 再次查询订单字段和临时记录数量。
最终核验结果:
{
"restoreResponse": {"code":"0","msg":"Success","notify":true,"error":false},
"deleted": 3,
"remaining": 0,
"order": {
"serviceCode": "STANDARD",
"shopId": "[\"12345678\", \"87654321\"]",
"shopIdStr": "12345678,87654321",
"innerPackaging": "CONS-BUBBLE-S,CONS-TAPE-01",
"innerPackagingType": "3,3"
}
}
结论:测试订单已恢复,临时测试字典无残留。
测试结论
3.2.13 接口的 XSLT 转换、单选属性、多选属性、属性字典新增、已有字典复用和重复请求去重均通过。
发现 1 项协议偏差:V1.2.1 协议要求订单不存在时返回成功,当前 WES 实现返回“出库单不存在”。该场景 TC-02 判定为不通过,需调整实现后复测。
本次未执行 Gradle 静态编译或自动化测试任务;结论来自 2026-07-28 的实际 HTTP 调用、XSLT 转换和数据库核验结果。