# 商品审核 — 测试用例

> **依据：** 《商品审核功能需求.md》v1.0、《商品审核技术方案.md》v1.0  
> **关联：** 《商品管理功能需求.md》v1.3.3、《商品管理测试用例.md》（平台审核部分与 GDS-* 可交叉执行，本册以 **商品审核** 菜单/GR 为索引）  
> **范围：** 平台端 `/agri/goods`（列表、检索、详情、审核、下架）；`GoodsServiceImpl.auditGoods` / `offShelfPlatform` / `selectPlatformList`；`IGoodsFacade.hasBlockingGoodsForShopDelete`；与商家 submit、**全局** `default_audit_pass` 的 **协作链路**  
> **排除：** 商家端发品表单全字段、订单 E2E、C 端商城页、多级审批、审核 SLA  
> **环境：** RuoYi v3.9.2；平台管理员 Token（`agri:goods:*`）；协作用例另需商家 Token + `X-Shop-Id`；UI 使用 **Playwright + Google Chrome（channel: chrome）**

---

## 用例编号说明

| 前缀 | 类型 | 工具 | 实现参考 |
|------|------|------|----------|
| GAU-UT-xxx | 单元测试 | JUnit 5 + Mockito | `GoodsServiceImplTest`、`GoodsFacadeImplTest` |
| GAU-API-xxx | 接口测试 | Apifox / MockMvc + 平台 Token | `GoodsControllerTest`、集成环境 |
| GAU-UI-xxx | 界面测试 | Playwright（Chrome） | 平台菜单「商品审核」或「商品管理」平台列表 |

---

## 一、单元测试

### GAU-UT-001 审核通过：待审核→出售中

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-001 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods(pass=true)` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit + Mockito |
| **测试目的** | 验证 GR2、GR6 |
| **前置条件** | `goods_status=1`；`goodsMapper.selectById` 返回待审商品 |
| **测试步骤** | 构造 `GoodsAuditDTO`：`goodsIds=[id]`，`pass=true` → 调用 `auditGoods(dto,"admin")` |
| **预期结果** | 调用 `updateAuditPass`；`goods_status=2`；写入 `audit_time` |

### GAU-UT-002 审核驳回：须填写驳回原因

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-002 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods` 驳回校验 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR4 |
| **前置条件** | `goods_status=1` |
| **测试步骤** | `pass=false`，`rejectReason` 为空 → `auditGoods` |
| **预期结果** | 抛出 `ServiceException`；msg 含「请填写驳回原因」；状态仍为 1 |

### GAU-UT-003 审核驳回：待审核→审核失败并落库原因

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-003 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods(pass=false)` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR6、§8.4 |
| **前置条件** | `goods_status=1` |
| **测试步骤** | `rejectReason="主图不清晰"` → `auditGoods` |
| **预期结果** | `updateAuditReject` 被调用；`goods_status=3`；`reject_reason` 已写入 |

### GAU-UT-004 对非待审核商品审核失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-004 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods` 状态校验 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR2、§3 不可执行表 |
| **前置条件** | 商品 `goods_status=2`（出售中） |
| **测试步骤** | `audit(pass=true)` |
| **预期结果** | `GoodsBatchOperationException` 或等价失败；`goods_status` 仍为 2 |

### GAU-UT-005 批量审核含非待审：整批失败零更新

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-005 |
| **测试模块** | 商品审核 |
| **测试项** | 批量 `auditGoods` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR5、§8.2 |
| **前置条件** | ID1 status=1，ID2 status=2 |
| **测试步骤** | `goodsIds=[ID1,ID2]`，`pass=true` |
| **预期结果** | `GoodsBatchOperationException`；`reasons` 含非待审 SN；两条状态 **均未变**；无 `updateAuditPass` |

### GAU-UT-006 批量审核通过：多条待审均变出售中

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-006 |
| **测试模块** | 商品审核 |
| **测试项** | 批量 `auditGoods` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §8.1 批量通过 |
| **前置条件** | 两条 `goods_status=1` |
| **测试步骤** | `goodsIds` 含两条，`pass=true` |
| **预期结果** | 两条均 `goods_status=2` |

### GAU-UT-007 批量驳回共用一条驳回原因

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-007 |
| **测试模块** | 商品审核 |
| **测试项** | 批量驳回 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR4 批量共用原因 |
| **前置条件** | 两条 `goods_status=1` |
| **测试步骤** | `pass=false`，`rejectReason="资料不全"` |
| **预期结果** | 两条均为 3；`reject_reason` 均为同一文案 |

### GAU-UT-008 审核 goodsIds 为空

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-008 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods` 入参 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §8.2 未勾选 |
| **前置条件** | — |
| **测试步骤** | `goodsIds=null` 或 `[]` |
| **预期结果** | `ServiceException`；msg「请选择要审核的商品」 |

### GAU-UT-009 审核商品不存在

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-009 |
| **测试模块** | 商品审核 |
| **测试项** | `auditGoods` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 异常：不存在 ID |
| **前置条件** | `selectById` 返回 null |
| **测试步骤** | `goodsIds=[99999]`，`pass=true` |
| **预期结果** | 整批失败；`reasons` 含「商品不存在」 |

### GAU-UT-010 平台下架：出售中→已下架

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-010 |
| **测试模块** | 商品审核 |
| **测试项** | `offShelfPlatform` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR3、GR7 |
| **前置条件** | `goods_status=2` |
| **测试步骤** | `offShelfPlatform(dto,"admin")` |
| **预期结果** | `goods_status=4`；`off_shelf_time` 有值 |

### GAU-UT-011 对非出售中下架失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-011 |
| **测试模块** | 商品审核 |
| **测试项** | `offShelfPlatform` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §9.2；待审不可下架 |
| **前置条件** | `goods_status=1` |
| **测试步骤** | `offShelfPlatform` |
| **预期结果** | 失败；status 仍为 1 |

### GAU-UT-012 批量下架含非出售中：整批失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-012 |
| **测试模块** | 商品审核 |
| **测试项** | 批量下架 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR5、§9.2 |
| **前置条件** | ID1 status=2，ID2 status=4 |
| **测试步骤** | `goodsIds=[ID1,ID2]` |
| **预期结果** | 整批失败；两条状态均未变 |

### GAU-UT-013 下架 goodsIds 为空

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-013 |
| **测试模块** | 商品审核 |
| **测试项** | `offShelfPlatform` 入参 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 异常：未选择商品 |
| **前置条件** | — |
| **测试步骤** | `goodsIds=[]` |
| **预期结果** | msg「请选择要下架的商品」 |

### GAU-UT-014 平台列表排除未上架（GR1）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-014 |
| **测试模块** | 商品审核 |
| **测试项** | `selectPlatformList` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR1 |
| **前置条件** | 同店存在 status=0 与 status=1 各一条 |
| **测试步骤** | 调用 `selectPlatformList`（无 status 筛选） |
| **预期结果** | 结果集 **不含** `goods_status=0` |

### GAU-UT-015 平台详情任意监管状态可查（GR8）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-015 |
| **测试模块** | 商品审核 |
| **测试项** | `selectPlatformDetail` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR8 |
| **前置条件** | 分别准备 status=1/2/3/4 商品 |
| **测试步骤** | 对各 ID 调用 `selectPlatformDetail` |
| **预期结果** | 均返回非空 VO；含 `goodsStatusLabel` |

### GAU-UT-016 删店阻塞：存在待审或出售中（GR14）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-016 |
| **测试模块** | 商品审核 |
| **测试项** | `IGoodsFacade.hasBlockingGoodsForShopDelete` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR14、§11.2 |
| **前置条件** | 店铺下有 status=1 或 2 商品 |
| **测试步骤** | `hasBlockingGoodsForShopDelete(shopId)` |
| **预期结果** | 返回 `true` |

### GAU-UT-017 删店不阻塞：仅失败/已下架（GR14）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-017 |
| **测试模块** | 商品审核 |
| **测试项** | `hasBlockingGoodsForShopDelete` |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 §11.2 负向 |
| **前置条件** | 店内仅有 status=3、4 |
| **测试步骤** | `hasBlockingGoodsForShopDelete` |
| **预期结果** | 返回 `false` |

### GAU-UT-018 商户冻结不改变商品状态（GR13）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UT-018 |
| **测试模块** | 商品审核 |
| **测试项** | 状态联动 |
| **测试类型** | 单元测试 |
| **测试工具** | JUnit |
| **测试目的** | 验证 GR13 |
| **前置条件** | 商品 `goods_status=2` |
| **测试步骤** | 模拟仅更新商户冻结标志，**不调用** `IGoodsService` |
| **预期结果** | 商品 `goods_status` 仍为 2 |

---

## 二、接口测试

### GAU-API-001 平台列表不含未上架

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-001 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /agri/goods/list` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR1 |
| **前置条件** | 平台 Token `agri:goods:list`；库中存在 status=0 与 status=1 |
| **测试步骤** | `GET /agri/goods/list?pageNum=1&pageSize=50` |
| **预期结果** | `code=200`；`rows` 中无 `goodsStatus=0` |

### GAU-API-002 按商品状态筛选待审核

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-002 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /list?goodsStatus=1` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §6、待审工作台 |
| **前置条件** | 存在多种状态商品 |
| **测试步骤** | `goodsStatus=1` 查询 |
| **预期结果** | 全部 `goodsStatus=1`；建议按 `submitTime` 升序 |

### GAU-API-003 高级检索：编号/名称/店铺/分类

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-003 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /list` 组合条件 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §6 |
| **前置条件** | 种子数据含已知 `goodsSn`、`goodsName`、`shopName`、`categoryId` |
| **测试步骤** | 分别单独传 `goodsSn`、`goodsName`、`shopName`、`categoryId` 查询 |
| **预期结果** | 每条结果均满足对应条件；含 `shopName`、`categoryPath` |

### GAU-API-004 商品详情：待审核含可审标志

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-004 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /agri/goods/{goodsId}` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR8、GR9、§7 |
| **前置条件** | `agri:goods:query`；待审商品含服务快照 |
| **测试步骤** | `GET /agri/goods/{id}` |
| **预期结果** | 含 `submitTime`、`serviceSnapshots`；`canAudit=true`（或前端等价逻辑）；`canOffShelf=false` |

### GAU-API-005 商品详情：出售中含可下架标志

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-005 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /agri/goods/{goodsId}` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR9 |
| **前置条件** | `goods_status=2` |
| **测试步骤** | `GET` 详情 |
| **预期结果** | `canAudit=false`；`canOffShelf=true` |

### GAU-API-006 商品详情：审核失败展示驳回原因

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-006 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /agri/goods/{goodsId}` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §7.1 |
| **前置条件** | `goods_status=3`；`reject_reason` 已存 |
| **测试步骤** | `GET` 详情 |
| **预期结果** | 响应含 `rejectReason`、`auditTime`；无审核/下架写操作字段 |

### GAU-API-007 审核通过主流程

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-007 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /agri/goods/audit` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §8.3 主流程 |
| **前置条件** | `agri:goods:audit`；目标 status=1 |
| **测试步骤** | Body：`{"goodsIds":[id],"pass":true}` |
| **预期结果** | `code=200`；再查详情 `goodsStatus=2` |

### GAU-API-008 审核驳回缺原因失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-008 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /audit` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR4 |
| **前置条件** | status=1 |
| **测试步骤** | `pass=false`，不传 `rejectReason` |
| **预期结果** | 失败；商品仍为待审核 |

### GAU-API-009 审核驳回成功

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-009 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /audit` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §8.4 |
| **前置条件** | status=1 |
| **测试步骤** | `pass=false`，`rejectReason="图片违规"` |
| **预期结果** | `goodsStatus=3`；`rejectReason` 与入参一致 |

### GAU-API-010 批量审核含非法状态整批失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-010 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /audit` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR5 |
| **前置条件** | 一条待审、一条出售中 |
| **测试步骤** | `goodsIds` 含两条，`pass=true` |
| **预期结果** | `code=500`；msg 含「操作已取消」；`data.reasons` 非空；两条状态 **均未变** |

### GAU-API-011 对出售中执行审核失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-011 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /audit` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR2 |
| **前置条件** | `goods_status=2` |
| **测试步骤** | 单条 `pass=true` |
| **预期结果** | 失败；仍为出售中 |

### GAU-API-012 平台下架出售中

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-012 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /agri/goods/offShelf` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §9 主流程 |
| **前置条件** | `agri:goods:offshelf`；status=2 |
| **测试步骤** | `{"goodsIds":[id]}` |
| **预期结果** | `code=200`；`goodsStatus=4` |

### GAU-API-013 对待审核执行下架失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-013 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /offShelf` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §9.2（待审应驳回非下架） |
| **前置条件** | `goods_status=1` |
| **测试步骤** | `PUT /offShelf` |
| **预期结果** | 失败；仍为待审核 |

### GAU-API-014 批量下架含非法状态整批失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-014 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /offShelf` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR5 |
| **前置条件** | 出售中 + 已下架各一条 |
| **测试步骤** | 批量 `goodsIds` |
| **预期结果** | 整批失败；状态均未变 |

### GAU-API-015 无审核权限 403

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-015 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /audit` 权限 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §13 权限 |
| **前置条件** | Token 仅有 `agri:goods:list`，无 `audit` |
| **测试步骤** | `PUT /audit` |
| **预期结果** | HTTP 403 或业务无权限 |

### GAU-API-016 无下架权限 403

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-016 |
| **测试模块** | 商品审核 |
| **测试项** | `PUT /offShelf` 权限 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §13 |
| **前置条件** | Token 无 `agri:goods:offshelf` |
| **测试步骤** | `PUT /offShelf` |
| **预期结果** | 403 |

### GAU-API-017 未登录访问列表 401

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-017 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /list` 鉴权 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 安全：须登录 |
| **前置条件** | 无 Authorization |
| **测试步骤** | `GET /agri/goods/list` |
| **预期结果** | 401 |

### GAU-API-018 分类筛选项协作

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-018 |
| **测试模块** | 商品审核 |
| **测试项** | `GET /agri/goods/categoryOptions` |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §6 分类检索 |
| **前置条件** | `agri:goods:query`；店铺有二级分类 |
| **测试步骤** | `GET ?shopId={shopId}` |
| **预期结果** | 返回该店二级分类列表 |

### GAU-API-019 协作：商家提交→平台待审（GR11 关）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-019 |
| **测试模块** | 商品审核 |
| **测试项** | submit + list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §10、**全局** `default_audit_pass=0` |
| **前置条件** | 店铺免审 **关闭**；商家 Token + `X-Shop-Id` |
| **测试步骤** | 商家 `POST` 商品 → `PUT .../submit` → 平台 `list?goodsStatus=1` |
| **预期结果** | 新商品出现在待审列表；`goodsStatus=1` |

### GAU-API-020 协作：免审店提交不进待审（GR11）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-020 |
| **测试模块** | 商品审核 |
| **测试项** | submit + list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 §10 免审 |
| **前置条件** | **全局** `default_audit_pass=1` |
| **测试步骤** | 商家 submit → 平台 `list?goodsStatus=1` 搜编号 |
| **预期结果** | **不在** 待审列表；`goodsStatus=2`；平台 `list?goodsStatus=2` 可查到 |

### GAU-API-021 协作：待审期间商家编辑仍为待审（GR10）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-021 |
| **测试模块** | 商品审核 |
| **测试项** | 商家 PUT + 平台详情 |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR10、§8.6 |
| **前置条件** | 待审商品；记录原 `goodsName`、`submitTime` |
| **测试步骤** | 商家修改名称保存 → 平台 `GET` 详情 |
| **预期结果** | `goodsStatus=1`；`goodsName` 为最新；`submitTime` **不变** |

### GAU-API-022 协作：草稿不进平台列表

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-API-022 |
| **测试模块** | 商品审核 |
| **测试项** | 商家草稿 + 平台 list |
| **测试类型** | 接口测试 |
| **测试工具** | Apifox |
| **测试目的** | 验证 GR1、§2.1 |
| **前置条件** | 商家仅保存未 submit（status=0） |
| **测试步骤** | 平台按 `goodsSn` 检索 |
| **预期结果** | `total=0` 或不在 `rows` |

---

## 三、界面测试（Playwright · Chrome）

> **配置示例：** `npx playwright test --project=chrome` 或 `browserName: 'chromium', channel: 'chrome'`  
> **环境变量：** `PLATFORM_BASE_URL`、`PLATFORM_USER`、`PLATFORM_PASS`  
> **菜单路径：** 农资商城 → **商品审核**（或与商品管理共用平台商品页）

### GAU-UI-001 商品审核列表首屏加载

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-001 |
| **测试模块** | 商品审核 |
| **测试项** | 列表页 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §5 列表字段 |
| **前置条件** | 平台账号已登录；存在待审/出售中数据 |
| **测试步骤** | 进入「商品审核」菜单；等待表格加载 |
| **预期结果** | 表格含店铺名称、商品编号、主图、名称、售价、销量、状态、操作列；**无** 未上架状态行 |

### GAU-UI-002 待审核 Tab/筛选与角标

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-002 |
| **测试模块** | 商品审核 |
| **测试项** | 状态 Tab |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §4、§13 待审工作台 |
| **前置条件** | 库中待审 N 条 |
| **测试步骤** | 点击「待审核」Tab 或筛选 `goodsStatus=待审核` |
| **预期结果** | 仅待审核行；角标/总数与 N 一致（若实现角标） |

### GAU-UI-003 高级检索与重置

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-003 |
| **测试模块** | 商品审核 |
| **测试项** | 检索表单 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §6 |
| **前置条件** | 已知编号、店铺名 |
| **测试步骤** | 输入商品编号 → 查询 → 点击重置 |
| **预期结果** | 查询后仅匹配行；重置后条件清空并恢复默认列表 |

### GAU-UI-004 待审核为空空态

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-004 |
| **测试模块** | 商品审核 |
| **测试项** | 空态 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §13 空态 |
| **前置条件** | 待审数据为 0（或测试库清空待审） |
| **测试步骤** | 筛选待审核 |
| **预期结果** | 展示「暂无待审核商品」或等价空态文案 |

### GAU-UI-005 列表行审核通过

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-005 |
| **测试模块** | 商品审核 |
| **测试项** | 单独审核通过 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §8.1、§8.3 |
| **前置条件** | 一条待审核商品 |
| **测试步骤** | 行内点击「审核」→ 选择「通过」→ 确认 |
| **预期结果** | 提示成功；该行状态变为「出售中」 |

### GAU-UI-006 审核驳回未填原因阻断

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-006 |
| **测试模块** | 商品审核 |
| **测试项** | 驳回弹窗 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 GR4、§13 |
| **前置条件** | 待审核商品 |
| **测试步骤** | 审核 → 驳回 → 原因留空 → 确定 |
| **预期结果** | 前端校验或接口错误提示；弹窗不关闭或状态不变 |

### GAU-UI-007 审核驳回填写原因成功

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-007 |
| **测试模块** | 商品审核 |
| **测试项** | 驳回流程 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §8.4 |
| **前置条件** | 待审核商品 |
| **测试步骤** | 驳回并输入原因 → 确定 |
| **预期结果** | 状态变为「审核失败」；详情可见驳回原因 |

### GAU-UI-008 批量审核整批失败提示

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-008 |
| **测试模块** | 商品审核 |
| **测试项** | 批量审核 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 GR5、§8.2 |
| **前置条件** | 勾选一条待审 + 一条出售中 |
| **测试步骤** | 批量「审核通过」 |
| **预期结果** | 错误提示含非待审说明；两条状态均未变 |

### GAU-UI-009 批量审核通过

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-009 |
| **测试模块** | 商品审核 |
| **测试项** | 批量通过 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §8.1 批量 |
| **前置条件** | 勾选 ≥2 条待审 |
| **测试步骤** | 批量通过 → 确认 |
| **预期结果** | 所选行均变为出售中 |

### GAU-UI-010 出售中下架二次确认

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-010 |
| **测试模块** | 商品审核 |
| **测试项** | 下架确认 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §9.2、§13 |
| **前置条件** | 出售中商品 |
| **测试步骤** | 点击「下架」→ 阅读确认框 → 确定 |
| **预期结果** | 确认文案含 C 端不可购类提示；成功后状态「已下架」 |

### GAU-UI-011 批量下架含非法状态失败

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-011 |
| **测试模块** | 商品审核 |
| **测试项** | 批量下架 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 GR5 |
| **前置条件** | 勾选出售中 + 已下架 |
| **测试步骤** | 批量下架 |
| **预期结果** | 失败提示；均无状态变更 |

### GAU-UI-012 行操作按状态显隐（GR9）

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-012 |
| **测试模块** | 商品审核 |
| **测试项** | 操作按钮 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §5.3 |
| **前置条件** | 列表同时含待审、出售中、审核失败行 |
| **测试步骤** | 分别查看各行操作列 |
| **预期结果** | 待审：审核+详情；出售中：下架+详情；失败/已下架：仅详情 |

### GAU-UI-013 详情页操作与列表一致

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-013 |
| **测试模块** | 商品审核 |
| **测试项** | 详情页 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 GR9、§7 |
| **前置条件** | 待审商品 |
| **测试步骤** | 点击「查看详情」→ 在详情页执行审核通过 |
| **预期结果** | 详情含分类路径、服务快照、提交时间；审核成功后返回或刷新为出售中 |

### GAU-UI-014 无审核权限隐藏操作

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-014 |
| **测试模块** | 商品审核 |
| **测试项** | 权限 UI |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §13 |
| **前置条件** | 仅 `list`+`query` 角色登录 |
| **测试步骤** | 打开商品审核列表 |
| **预期结果** | 无「审核」「下架」按钮；可查看详情 |

### GAU-UI-015 免审店商品无待审按钮仍可下架

| 要素 | 内容 |
|------|------|
| **用例编号** | GAU-UI-015 |
| **测试模块** | 商品审核 |
| **测试项** | 免审监管 |
| **测试类型** | 界面测试 |
| **测试工具** | Playwright（Chrome） |
| **测试目的** | 验证 §10 免审店 |
| **前置条件** | 免审店下直接出售中商品 |
| **测试步骤** | 筛选出售中 → 对该行下架 |
| **预期结果** | 无审核入口；下架成功 |

---

## 四、用例统计与规则追溯

| 类型 | 数量 | 编号范围 |
|------|------|----------|
| 单元测试 | 18 | GAU-UT-001～018 |
| 接口测试 | 22 | GAU-API-001～022 |
| 界面测试 | 15 | GAU-UI-001～015 |
| **合计** | **55** | — |

### GR1～GR15 追溯

| 规则 | 对应用例 |
|------|----------|
| GR1 | GAU-UT-014, GAU-API-001/022, GAU-UI-001 |
| GR2 | GAU-UT-004, GAU-API-011, GAU-UI-012 |
| GR3 | GAU-UT-010/011, GAU-API-012/013 |
| GR4 | GAU-UT-002/007, GAU-API-008/009, GAU-UI-006/007 |
| GR5 | GAU-UT-005/012, GAU-API-010/014, GAU-UI-008/011 |
| GR6 | GAU-UT-001/003, GAU-API-007/009 |
| GR7 | GAU-UT-010, GAU-API-012, GAU-UI-010 |
| GR8 | GAU-UT-015, GAU-API-004/005/006 |
| GR9 | GAU-API-004/005, GAU-UI-012/013 |
| GR10 | GAU-API-021 |
| GR11 | GAU-API-019/020, GAU-UI-015 |
| GR12 | （无直改 status 接口；由商品管理 P17 保障，本模块不重复 UT） |
| GR13 | GAU-UT-018 |
| GR14 | GAU-UT-016/017 |
| GR15 | 全册复用 `/agri/goods` 与 `IGoodsService`，与 GDS 平台用例一致 |

### 流程覆盖矩阵

| 流程 | 正常 | 异常/约束 |
|------|------|-----------|
| 列表/检索 | API-001～003, UI-001～003 | API-022, UI-001（无未上架） |
| 详情 | API-004～006, UI-013 | — |
| 审核通过 | UT-001/006, API-007, UI-005/009 | UT-004/005/008/009, API-010/011, UI-008 |
| 审核驳回 | UT-002/003/007, API-008/009, UI-006/007 | UT-002, API-008 |
| 下架 | UT-010, API-012, UI-010 | UT-011/012/013, API-013/014, UI-011 |
| 权限 | API-015/016/017, UI-014 | — |
| 店铺免审/协作 | API-019/020, UI-015 | API-021（待审编辑） |
| 删店前置 | UT-016/017 | — |

---

## 五、Playwright 执行说明（摘要）

```typescript
// playwright.config.ts 片段
projects: [{ name: 'chrome', use: { channel: 'chrome', baseURL: process.env.PLATFORM_BASE_URL } }];

// 登录 fixture 后示例
await page.goto('/agri/goods'); // 或商品审核路由
await page.getByRole('tab', { name: '待审核' }).click();
await page.getByPlaceholder('商品编号').fill('G202605260001');
await page.getByRole('button', { name: '搜索' }).click();
```

| 场景 | 建议定位 |
|------|----------|
| 审核通过 | `getByRole('button', { name: '审核' })` → `通过` |
| 驳回 | 对话框 `getByLabel('驳回原因')` |
| 下架确认 | `getByRole('dialog')` 内 `确定` |

> 选择器以实际前端 DOM 为准；菜单名「商品审核」与「商品管理-平台」二选一配置 `MENU_PATH`。

---

*文档版本：v1.0 · 关联《商品审核功能需求.md》v1.0、《商品审核技术方案.md》v1.0*
