# 全部订单 — 测试用例

> **依据：** 《全部订单功能需求.md》v1.0、《全部订单技术方案.md》v1.0.2  
> **关联：** 平台《订单管理测试用例.md》ORD-UT/ORD-API（同源状态机）、平台《店铺管理测试用例.md》O10、《商家端店铺上下文接口说明》  
> **范围：** 商家端 `/agri/seller/order/**`；`OrderServiceImpl`（带 shopId 履约）、`SellerOrderController`、`OrderSupport`  
> **代码落位（待实现）：** `baqing-shop/src/main/java/com/ruoyi/web/modules/order/`  
> **排除：** C 端下单/支付/确认收货主流程（见 ORD-API create/pay/confirm）、平台 close、O8 Job、分批发货/拆单、退款售后  
> **环境：** RuoYi v3.9.2-springboot2；MySQL 5.7.39；请求头 **`X-Shop-Id`** + 商家 Token；DDL [`sql/biz_order.sql`](../../../../sql/biz_order.sql)

---

## 用例编号说明

| 前缀 | 类型 | 工具 |
|------|------|------|
| SAO-UT-xxx | 单元测试 | JUnit 5 + Mockito |
| SAO-API-xxx | 接口测试 | MockMvc / Apifox |
| SAO-UI-xxx | 界面测试 | Playwright（**Google Chrome** 通道 `channel: 'chrome'`） |

> **命名区分：** 平台订单 **ORD-**；本模块 **SAO-**（Seller · All Orders · 全部订单）。

---

## 测试数据约定

| 实体 | 说明 |
|------|------|
| 商户 A | 经营账号 `13800001001`；店铺 **101**（最早）、**102** |
| 商户 B | 经营账号 `13800002001`；店铺 **201**（越权对照） |
| 店铺 101 订单 | O101-0 待支付；O101-1 待发货；O101-2 已发货；O101-3 已完成；O101-4 已关闭；O101-5 已删除 |
| 店铺 102 订单 | O102-1 待发货 1 笔（切换店铺用） |
| 店铺 201 订单 | O201-1 待发货（商户 B，用于越权） |
| Token 全权限 | 商户 A；`agri:seller:order:list/query/ship/remove`；`X-Shop-Id=101` |
| Token 只读 | 仅 `list`+`query`，无 `ship/remove` |
| Token 员工 | 商户 A 员工绑定 101；角色含/不含订单菜单 |
| 多商品单 | O101-1b 待发货含 2 行 item（整单发货展示） |

---

## 一、单元测试

### SAO-UT-001 商家列表仅返回当前 shopId

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-001 |
| **测试模块** | 全部订单 |
| **测试项** | selectSellerList |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO1：数据隔离 |
| **前置条件** | Mock Mapper；101 有 3 单、102 有 1 单 |
| **测试步骤** | `selectSellerList(101L, query)` |
| **预期结果** | SQL/参数 `shop_id=101`；结果 **不含** shop_id=102 |

### SAO-UT-002 全部页签含待支付排除已删除

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-002 |
| **测试模块** | 全部订单 |
| **测试项** | 页签 SQL orderStatus 空 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO3、§2.4 全部页签 |
| **前置条件** | query.orderStatus 为空 |
| **测试步骤** | 构建 SellerList 查询条件 |
| **预期结果** | 条件含 `order_status != '5'`；**可含** status=0 |

### SAO-UT-003 已删除页签仅 status=5

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-003 |
| **测试模块** | 全部订单 |
| **测试项** | 页签 orderStatus=5 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 §6.2 已删除页签 |
| **前置条件** | query.orderStatus=`5` |
| **测试步骤** | 调用列表查询 |
| **预期结果** | 仅 `order_status='5'` |

### SAO-UT-004 商品名称检索 EXISTS item

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-004 |
| **测试模块** | 全部订单 |
| **测试项** | goodsName 检索 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO11 |
| **前置条件** | goodsName=「尿素」 |
| **测试步骤** | `selectSellerList(101L, query)` |
| **预期结果** | Mapper 调用含 item 子查询/关联；命中任一行商品名即返回 |

### SAO-UT-005 shipStatus 映射 order_status

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-005 |
| **测试模块** | 全部订单 |
| **测试项** | shipStatus 检索 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 §2.5 shipStatus |
| **前置条件** | shipStatus=`2` |
| **测试步骤** | 构建 query |
| **预期结果** | 等价 `order_status='2'` |

### SAO-UT-006 详情归属校验通过

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-006 |
| **测试模块** | 全部订单 |
| **测试项** | assertOrderBelongsToShop |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO1 详情 |
| **前置条件** | order.shop_id=101 |
| **测试步骤** | `selectSellerDetail(101L, orderId)` |
| **预期结果** | 正常返回 OrderDetailVO |

### SAO-UT-007 详情跨店拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-007 |
| **测试模块** | 全部订单 |
| **测试项** | assertOrderBelongsToShop 失败 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO1 越权 |
| **前置条件** | order.shop_id=201；当前 shopId=101 |
| **测试步骤** | `selectSellerDetail(101L, orderId)` |
| **预期结果** | 抛 `ServiceException`；msg 含「不存在或无权访问」 |

### SAO-UT-008 待发货整单发货成功

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-008 |
| **测试模块** | 全部订单 |
| **测试项** | shipOrder |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO4、O5 |
| **前置条件** | shop_id=101；status=1；deliveryType=1 合法 DTO |
| **测试步骤** | `shipOrder(101L, orderId, dto, "seller")` |
| **预期结果** | status→2；写 logistics 字段；insert trace_type=1；**不**调用 deductStock |

### SAO-UT-009 非待发货不可发货

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-009 |
| **测试模块** | 全部订单 |
| **测试项** | shipOrder 状态机 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 §4.3、SO4 |
| **前置条件** | status=0/2/3/4 各一单 |
| **测试步骤** | 分别调用 `shipOrder` |
| **预期结果** | 均失败；msg「当前状态不可发货」 |

### SAO-UT-010 物流配送缺快递单号拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-010 |
| **测试模块** | 全部订单 |
| **测试项** | ship 校验 deliveryType=1 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO13 |
| **前置条件** | status=1；trackingNo 空 |
| **测试步骤** | `shipOrder` deliveryType=1 |
| **预期结果** | 校验失败；不更新订单 |

### SAO-UT-011 商家配送缺配送员拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-011 |
| **测试模块** | 全部订单 |
| **测试项** | ship 校验 deliveryType=2 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO13 |
| **前置条件** | status=1；courierName 空 |
| **测试步骤** | `shipOrder` deliveryType=2 |
| **预期结果** | 校验失败 |

### SAO-UT-012 更新物流追加节点不改主状态

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-012 |
| **测试模块** | 全部订单 |
| **测试项** | appendLogistics |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO5、O6 |
| **前置条件** | status=2；shop_id=101 |
| **测试步骤** | 连续两次 `appendLogistics` |
| **预期结果** | status 仍为 2；trace 新增 2 条 type=2 |

### SAO-UT-013 非已发货不可更新物流

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-013 |
| **测试模块** | 全部订单 |
| **测试项** | appendLogistics 状态 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 §9 前置 |
| **前置条件** | status=1 |
| **测试步骤** | `appendLogistics` |
| **预期结果** | 失败；msg「当前状态不可更新物流」 |

### SAO-UT-014 登记送达不改为已完成

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-014 |
| **测试模块** | 全部订单 |
| **测试项** | registerDelivered |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 + Mockito |
| **测试目的** | 验证 SO6、O7 |
| **前置条件** | status=2 |
| **测试步骤** | `registerDelivered(101L, orderId, dto, "seller")` |
| **预期结果** | status=2；trace_type=3 一条；**不** 调 refreshConsumption |

### SAO-UT-015 仅已关闭可删除

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-015 |
| **测试模块** | 全部订单 |
| **测试项** | deleteClosedOrder |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO7、O9 |
| **前置条件** | status=4 与 status=1 各一单 |
| **测试步骤** | 分别 `deleteClosedOrder` |
| **预期结果** | status=4→5 成功；status=1 失败 |

### SAO-UT-016 列表收货手机脱敏

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-016 |
| **测试模块** | 全部订单 |
| **测试项** | 列表 VO 脱敏 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO9 |
| **前置条件** | consignee_mobile=13800138000 |
| **测试步骤** | `selectSellerList` 转 VO |
| **预期结果** | 列表 consigneeMobile 含 `*`；**非** 完整 11 位 |

### SAO-UT-017 平台已发货商家重复发货拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-017 |
| **测试模块** | 全部订单 |
| **测试项** | ship 并发/双端 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO14 |
| **前置条件** | 订单已被平台发为 status=2 |
| **测试步骤** | 商家 `shipOrder` |
| **预期结果** | 失败；msg「当前状态不可发货」 |

### SAO-UT-018 详情 traceList 时间倒序

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-018 |
| **测试模块** | 全部订单 |
| **测试项** | selectSellerDetail trace 排序 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 SO12 |
| **前置条件** | 3 条 trace 不同 trace_time |
| **测试步骤** | 调用详情 |
| **预期结果** | traceList 按 trace_time **降序** |

### SAO-UT-019 页签与检索组合 AND

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-019 |
| **测试模块** | 全部订单 |
| **测试项** | orderStatus + orderNo |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5 |
| **测试目的** | 验证 §6.3 组合 |
| **前置条件** | orderStatus=1；orderNo 指定 |
| **测试步骤** | `selectSellerList` |
| **预期结果** | 同时满足两条件；不满足任一则空 |

### SAO-UT-020 商家无 closeOrder 方法暴露

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UT-020 |
| **测试模块** | 全部订单 |
| **测试项** | SellerOrderController 契约 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit 5（反射/编译期） |
| **测试目的** | 验证 §12 商家不可关闭 |
| **前置条件** | — |
| **测试步骤** | 检查 `SellerOrderController` 无 close 映射 |
| **预期结果** | **无** `PUT .../close`；关闭仅平台/C 端/Job |

---

## 二、接口测试

### SAO-API-001 列表无 X-Shop-Id 拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-001 |
| **测试模块** | 全部订单 |
| **测试项** | GET /list 上下文 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO10、requireShopId |
| **前置条件** | 有效 Token；**不传** X-Shop-Id |
| **测试步骤** | GET `/agri/seller/order/list` |
| **预期结果** | 失败；msg「请先选择当前店铺」 |

### SAO-API-002 列表默认排除已删除含待支付

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-002 |
| **测试模块** | 全部订单 |
| **测试项** | GET /list 全部页签 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc / Apifox |
| **测试目的** | 验证 SO3 |
| **前置条件** | 101 含 status 0/1/5 各至少 1 单；X-Shop-Id=101 |
| **测试步骤** | GET `/list` 不传 orderStatus |
| **预期结果** | 含 status=0；**不含** status=5 |

### SAO-API-003 页签待发货/已发货/已完成/已关闭/已删除

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-003 |
| **测试模块** | 全部订单 |
| **测试项** | GET /list orderStatus |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 §6.2、SO2 |
| **前置条件** | 各状态样本齐全 |
| **测试步骤** | orderStatus=1～5 各请求 |
| **预期结果** | 每次仅对应状态 |

### SAO-API-004 列表仅当前店铺订单

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-004 |
| **测试模块** | 全部订单 |
| **测试项** | GET /list shop 隔离 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO1 |
| **前置条件** | 101、102 各有订单；X-Shop-Id=101 |
| **测试步骤** | GET `/list` |
| **预期结果** | rows 全部 shopId=101 |

### SAO-API-005 按订单编号检索

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-005 |
| **测试模块** | 全部订单 |
| **测试项** | orderNo 检索 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO11 |
| **前置条件** | 已知 O101-1 orderNo |
| **测试步骤** | GET `/list?orderNo=...` |
| **预期结果** | 命中该单 |

### SAO-API-006 按商品名称检索

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-006 |
| **测试模块** | 全部订单 |
| **测试项** | goodsName 检索 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO11 |
| **前置条件** | 订单 item 含「复合肥」 |
| **测试步骤** | goodsName=复合肥 |
| **预期结果** | 命中 |

### SAO-API-007 按收货人/地址/手机号检索

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-007 |
| **测试模块** | 全部订单 |
| **测试项** | consignee* 检索 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO11 |
| **前置条件** | 收货人「李四」、手机 139、地址含「城关区」 |
| **测试步骤** | 分别 consigneeName/Mobile/Address |
| **预期结果** | 各条件均可命中 |

### SAO-API-008 按下单时间与配送方式检索

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-008 |
| **测试模块** | 全部订单 |
| **测试项** | beginTime/endTime、deliveryType |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO11 |
| **前置条件** | 已发货单 deliveryType=1 |
| **测试步骤** | 时间区间 + deliveryType=1 |
| **预期结果** | 结果在区间内且配送方式匹配 |

### SAO-API-009 列表手机号脱敏

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-009 |
| **测试模块** | 全部订单 |
| **测试项** | GET /list 脱敏 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO9 |
| **前置条件** | 列表有订单 |
| **测试步骤** | GET `/list` |
| **预期结果** | consigneeMobile 脱敏；详情 GET 可完整（按权限） |

### SAO-API-010 详情含分区与 trace 倒序

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-010 |
| **测试模块** | 全部订单 |
| **测试项** | GET /{orderId} |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO12、§7 |
| **前置条件** | O101-2 已发货多 trace；权限 query |
| **测试步骤** | GET `/agri/seller/order/{id}` |
| **预期结果** | 含 base/items/consignee/logistics/traceList；trace 倒序 |

### SAO-API-011 详情跨店 403/业务错

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-011 |
| **测试模块** | 全部订单 |
| **测试项** | GET 越权 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO1 |
| **前置条件** | O201-1；X-Shop-Id=101 |
| **测试步骤** | GET 该 orderId |
| **预期结果** | 失败；msg「订单不存在或无权访问」 |

### SAO-API-012 待支付详情只读无写接口

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-012 |
| **测试模块** | 全部订单 |
| **测试项** | O101-0 操作边界 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO3、§4.3 |
| **前置条件** | status=0 |
| **测试步骤** | GET 详情成功；POST ship |
| **预期结果** | 详情 200；ship 失败「不可发货」 |

### SAO-API-013 物流配送发货成功

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-013 |
| **测试模块** | 全部订单 |
| **测试项** | POST /{id}/ship |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO4、§8 |
| **前置条件** | O101-1 status=1；权限 ship |
| **测试步骤** | POST 顺丰+单号 Body |
| **预期结果** | code=200；再 GET status=2；trace type=1 |

### SAO-API-014 商家配送发货成功

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-014 |
| **测试模块** | 全部订单 |
| **测试项** | POST ship deliveryType=2 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO13 |
| **前置条件** | 另一待发货单 |
| **测试步骤** | POST 车辆+配送员 Body |
| **预期结果** | status=2；logistics 字段为配送员信息 |

### SAO-API-015 发货缺必填字段 400

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-015 |
| **测试模块** | 全部订单 |
| **测试项** | POST ship 校验 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO13 |
| **前置条件** | status=1 |
| **测试步骤** | deliveryType=1 无 trackingNo |
| **预期结果** | 失败；订单仍为 1 |

### SAO-API-016 更新物流成功

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-016 |
| **测试模块** | 全部订单 |
| **测试项** | POST /{id}/logistics |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO5 |
| **前置条件** | O101-2 status=2 |
| **测试步骤** | POST content；再 POST 第二次 |
| **预期结果** | status 仍 2；trace type=2 共 2 条 |

### SAO-API-017 登记送达不完成

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-017 |
| **测试模块** | 全部订单 |
| **测试项** | POST /{id}/delivered |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO6 |
| **前置条件** | status=2 |
| **测试步骤** | POST delivered Body |
| **预期结果** | status=2；trace type=3 |

### SAO-API-018 删除已关闭订单

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-018 |
| **测试模块** | 全部订单 |
| **测试项** | DELETE /{id} |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO7 |
| **前置条件** | O101-4 status=4；权限 remove |
| **测试步骤** | DELETE；GET list 全部；GET list orderStatus=5 |
| **预期结果** | 成功；全部不含；已删除页签可见 status=5 |

### SAO-API-019 非已关闭删除失败

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-019 |
| **测试模块** | 全部订单 |
| **测试项** | DELETE 状态约束 |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO7 |
| **前置条件** | status=1 |
| **测试步骤** | DELETE |
| **预期结果** | 失败「仅已关闭订单可删除」 |

### SAO-API-020 无 ship 权限发货 403

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-020 |
| **测试模块** | 全部订单 |
| **测试项** | @PreAuthorize ship |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO15 |
| **前置条件** | 只读 Token |
| **测试步骤** | POST ship |
| **预期结果** | HTTP 403 |

### SAO-API-021 无 remove 权限删除 403

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-021 |
| **测试模块** | 全部订单 |
| **测试项** | @PreAuthorize remove |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 SO15 |
| **前置条件** | Token 无 remove |
| **测试步骤** | DELETE 已关闭单 |
| **预期结果** | HTTP 403 |

### SAO-API-022 商家端无 close 接口

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-022 |
| **测试模块** | 全部订单 |
| **测试项** | 无 PUT /close |
| **测试类型** | 接口测试 |
| **测试工具** | MockMvc |
| **测试目的** | 验证 §12 |
| **前置条件** | 全权限 Token |
| **测试步骤** | PUT `/agri/seller/order/{id}/close` |
| **预期结果** | 404 或路由不存在 |

### SAO-API-023 平台发货后商家列表同步

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-023 |
| **测试模块** | 全部订单 |
| **测试项** | SO14 双端协作 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO14 |
| **前置条件** | 平台 POST `/agri/order/{id}/ship` 成功 |
| **测试步骤** | 商家 GET `/agri/seller/order/{id}` X-Shop-Id 匹配 |
| **预期结果** | status=2；物流字段一致 |

### SAO-API-024 切换店铺后列表变化

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-024 |
| **测试模块** | 全部订单 |
| **测试项** | X-Shop-Id 切换 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 SO10 |
| **前置条件** | 101、102 各有订单 |
| **测试步骤** | GET list Shop-Id=101 → 改 102 再 GET |
| **预期结果** | 两次 rows **不同**；102 含 O102-1 不含 101 独占单 |

### SAO-API-025 C 端确认收货后商家见已完成

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-API-025 |
| **测试模块** | 全部订单 |
| **测试项** | 协作 O7 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §10.2 |
| **前置条件** | 已发货单；C 端 confirmReceive 成功 |
| **测试步骤** | 商家 GET 详情/列表 orderStatus=3 |
| **预期结果** | status=3；finish_time 非空；商家 **无** 代确认接口 |

---

## 三、界面测试

> **工具配置：** Playwright `browserType.launch({ channel: 'chrome' })`；baseURL=商家端 ruoyi-ui；登录商户 A 后 Navbar 写入当前店铺。

### SAO-UI-001 菜单进入全部订单页

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-001 |
| **测试模块** | 全部订单 |
| **测试项** | 菜单路由 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证菜单与路由 |
| **前置条件** | 角色含「全部订单」菜单；已登录 |
| **测试步骤** | 点击「订单管理→全部订单」 |
| **预期结果** | 进入 `/agri/seller/order`；页头显示当前店铺名 |

### SAO-UI-002 列表展示字段与默认排序

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-002 |
| **测试模块** | 全部订单 |
| **测试项** | 列表字段 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §6.1 |
| **前置条件** | 101 有多笔订单 |
| **测试步骤** | 打开全部订单默认页签 |
| **预期结果** | 列含订单号、商品摘要、金额、会员名、收货信息、状态、操作；**下单时间降序** |

### SAO-UI-003 状态页签切换筛选

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-003 |
| **测试模块** | 全部订单 |
| **测试项** | 页签 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §6.2 |
| **前置条件** | 各状态均有数据 |
| **测试步骤** | 依次点击 全部/待发货/已发货/已完成/已关闭/已删除 |
| **预期结果** | 列表随页签变化；**全部** 含待支付、不含已删除 |

### SAO-UI-004 高级检索与重置

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-004 |
| **测试模块** | 全部订单 |
| **测试项** | 检索表单 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO11、§6.3 |
| **前置条件** | 已知订单号、商品名 |
| **测试步骤** | 填 orderNo → 查询 → 重置 → 填 goodsName → 查询 |
| **预期结果** | 结果正确；重置后条件清空、列表恢复 |

### SAO-UI-005 待支付行仅详情按钮

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-005 |
| **测试模块** | 全部订单 |
| **测试项** | 待支付操作列 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO3、§14 |
| **前置条件** | 全部页签有待支付单 |
| **测试步骤** | 定位 status=待支付行 |
| **预期结果** | 仅有「查看详情」；**无** 去发货/删除 |

### SAO-UI-006 查看详情弹窗/页分区

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-006 |
| **测试模块** | 全部订单 |
| **测试项** | 详情 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §7 |
| **前置条件** | 已发货单有多 trace |
| **测试步骤** | 点击「查看详情」 |
| **预期结果** | 展示基本信息、商品明细、收货、物流、时间轴；快照字段 **不可编辑** |

### SAO-UI-007 去发货弹窗整单商品与配送切换

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-007 |
| **测试模块** | 全部订单 |
| **测试项** | 发货表单 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §8、§14 |
| **前置条件** | 待发货单 O101-1b 两行商品 |
| **测试步骤** | 点「去发货」→ 切换物流配送/商家配送 |
| **预期结果** | 展示 **全部商品行只读**；切换时显隐 快递单号/配送员字段 |

### SAO-UI-008 物流配送发货成功刷新列表

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-008 |
| **测试模块** | 全部订单 |
| **测试项** | 发货提交 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §8.3 主路径 |
| **前置条件** | 待发货单 |
| **测试步骤** | 填顺丰+单号 → 确定 |
| **预期结果** | 成功提示；该行消失于待发货；已发货页签可见 |

### SAO-UI-009 更新物流多次追加

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-009 |
| **测试模块** | 全部订单 |
| **测试项** | 更新物流 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO5 |
| **前置条件** | 已发货单 |
| **测试步骤** | 点「更新物流」两次提交不同描述 |
| **预期结果** | 详情时间轴新增 2 条；订单仍为已发货 |

### SAO-UI-010 商品到货登记不变已完成

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-010 |
| **测试模块** | 全部订单 |
| **测试项** | 登记送达 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO6 |
| **前置条件** | 已发货单 |
| **测试步骤** | 点「商品到货」→ 填送达时间 → 提交 |
| **预期结果** | 成功；状态 **仍已发货**；时间轴含「已送达」 |

### SAO-UI-011 删除已关闭二次确认

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-011 |
| **测试模块** | 全部订单 |
| **测试项** | 删除 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §11、§14 |
| **前置条件** | 已关闭页签有订单 |
| **测试步骤** | 点「删除」→ 取消 → 再点删除 → 确认 |
| **预期结果** | 取消无变化；确认后从列表消失；已删除页签可查 |

### SAO-UI-012 无权限隐藏发货删除按钮

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-012 |
| **测试模块** | 全部订单 |
| **测试项** | 按钮权限 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO15 |
| **前置条件** | 只读角色登录 |
| **测试步骤** | 打开待发货/已关闭列表 |
| **预期结果** | **无** 去发货/删除按钮；可看详情 |

### SAO-UI-013 切换店铺整页刷新订单

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-013 |
| **测试模块** | 全部订单 |
| **测试项** | Navbar 切店 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO10 |
| **前置条件** | 经营账号；101/102 均有订单 |
| **测试步骤** | 在 101 记下首行 orderNo → Navbar 切 102 |
| **预期结果** | 页面刷新；列表数据变为 102 订单 |

### SAO-UI-014 列表手机号脱敏详情完整

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-014 |
| **测试模块** | 全部订单 |
| **测试项** | 脱敏 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 SO9 |
| **前置条件** | 有收货手机订单 |
| **测试步骤** | 看列表手机 → 打开详情收货手机 |
| **预期结果** | 列表含 `*`；详情展示完整号（有 query 权限） |

### SAO-UI-015 检索无结果空状态

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-015 |
| **测试模块** | 全部订单 |
| **测试项** | 空状态 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §14 |
| **前置条件** | — |
| **测试步骤** | orderNo 填不存在值 → 查询 |
| **预期结果** | 展示「暂无数据」类空状态；非报错页 |

### SAO-UI-016 已完成行无履约按钮

| 要素 | 内容 |
|------|------|
| **用例编号** | SAO-UI-016 |
| **测试模块** | 全部订单 |
| **测试项** | 已完成操作列 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §4.3 |
| **前置条件** | 已完成页签有数据 |
| **测试步骤** | 查看操作列 |
| **预期结果** | 仅「查看详情」 |

---

## 四、用例统计

| 类型 | 数量 | 编号段 |
|------|------|--------|
| 单元测试 | 20 | SAO-UT-001～020 |
| 接口测试 | 25 | SAO-API-001～025 |
| 界面测试 | 16 | SAO-UI-001～016 |
| **合计** | **61** | — |

---

## 五、业务规则覆盖索引

| 规则 | 对应用例（示例） |
|------|------------------|
| SO1 当前店铺 | SAO-UT-001/006/007，SAO-API-004/011，SAO-UI-013 |
| SO2 状态机同源 | SAO-UT-009，SAO-API-003，SAO-UI-003 |
| SO3 待支付只读 | SAO-UT-002，SAO-API-002/012，SAO-UI-005 |
| SO4 整单发货 | SAO-UT-008，SAO-API-013/014，SAO-UI-007/008 |
| SO5 多次物流 | SAO-UT-012，SAO-API-016，SAO-UI-009 |
| SO6 送达≠完成 | SAO-UT-014，SAO-API-017，SAO-UI-010 |
| SO7 仅关闭可删 | SAO-UT-015，SAO-API-018/019，SAO-UI-011 |
| SO8 O10（Facade） | 删店协作见 ORD-UT-013/014 + 店铺 SHP |
| SO9 脱敏 | SAO-UT-016，SAO-API-009，SAO-UI-014 |
| SO10 切店刷新 | SAO-API-001/024，SAO-UI-013 |
| SO11 检索字段 | SAO-UT-004/005，SAO-API-005～008，SAO-UI-004 |
| SO12 物流轴 | SAO-UT-018，SAO-API-010，SAO-UI-006 |
| SO13 配送字段 | SAO-UT-010/011，SAO-API-015，SAO-UI-007 |
| SO14 双端同步 | SAO-UT-017，SAO-API-023 |
| SO15 权限 | SAO-API-020/021，SAO-UI-012 |
| 商家不可 close | SAO-UT-020，SAO-API-022 |
| O7 C 端完成 | SAO-API-025 |

---

## 六、测试数据建议

| 数据 | 用途 |
|------|------|
| 101 六态各 1 单 + 1 待支付 | 页签/操作矩阵 |
| 101 多商品待发货 | 整单展示 SAO-UI-007 |
| 102 至少 1 待发货 | 切店 SAO-UI-013 |
| 201 订单 | 越权 SAO-API-011 |
| 只读/全权限/无菜单 三角色 | SAO-UI-012、SAO-API-020/021 |
| 平台先发货同一单 | SAO-API-023 |

---

## 七、自动化映射（待实现）

| 用例 | 建议代码位置 |
|------|--------------|
| SAO-UT-001～020 | `OrderServiceImplTest`（seller shopId 场景） |
| SAO-API-001～025 | `SellerOrderControllerTest` |
| SAO-UI-001～016 | `e2e/seller/order-all.spec.ts`（Playwright + Chrome） |

**测试类路径（规划）：** `baqing-shop/src/test/java/com/ruoyi/web/modules/order/service/OrderServiceImplTest.java`、`.../controller/SellerOrderControllerTest.java`

---

## 八、修订记录

| 版本 | 说明 |
|------|------|
| **v1.0** | 首版；61 用例（SAO-UT/SAO-API/SAO-UI）；覆盖 SO1～SO15 与平台同源状态机 |
| **v1.0.1** | 对齐技术方案 v1.0.2；§7 自动化映射标注 **待实现**（order 包尚未创建） |

---

*文档版本：v1.0.1 · 关联《全部订单功能需求.md》v1.0、《全部订单技术方案.md》v1.0.2 · 平台侧见《订单管理测试用例.md》· 代码落位 **待实现***
