# 供应商结算管理 — 测试用例

> **依据**：`供应商结算管理功能需求.md`（v1.1）、`供应商结算管理技术方案.md`（v1.0）  
> **关联**：`../交易订单管理/交易订单管理测试用例.md`（结算单由订单「完成支付」生成）  
> **接口 Base Path**：`/tradeMarket/supplierSettlement`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块权限的账号已登录（`tradeMarket:supplierSettlement:list|query|settle`）。宜复用交易订单测试样本并预置结算数据：

| 类型 | 样本 | 要点 |
| --- | --- | --- |
| 供应商 | **S1** `id=1` 按头 `fee_method=2`，`fee_standard=10` | 与订单用例一致 |
| 供应商 | **S2** `id=2` 按额 `fee_method=3`，费率 1%+0.5% | 快照校验用 |
| 供应商 | **S3** `id=3` 按户 `fee_method=1` | 服务费=0 |
| 交易订单+结算 | **SS-PEND** | 订单已完成；`settlement_status=0`；`order_no` 已知 |
| 交易订单+结算 | **SS-DONE** | `settlement_status=1`；已有 `settle_voucher_url` |
| 交易订单 | **TO-PAY** | `order_status=0`；用于联调「支付→生成待结算」 |
| 凭证文件 | **V-OK** | `test.jpg` ≤10MB；**V-BAD** | `test.pdf` 或 >10MB |

**完成结算 Body 示例**：

```json
{
  "id": 1,
  "settleVoucherUrl": "http://localhost/profile/upload/2026/05/settle.jpg",
  "settleVoucherPath": "/profile/upload/2026/05/settle.jpg"
}
```

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。组件路径：`tradeMarket/supplierSettlement/index`。

**自动化对照**：`SettlementNoGenerator`、`SettlementOnPayService`、`SettlementFeeCalculator`（订单包已有）；`BizSupplierSettlement*`（实现后 JUnit5 / MockMvc）。**本期后端结算 Controller 待实现**，API/UI 用例按技术方案编写。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GYSJSGL-UT-001 | 结算编号 | 当日首号 | 单元测试 | JUnit5 | §3.1 | 当日无未删结算单 | `SettlementNoGenerator.next()` | `JSD`+`yyyyMMdd`+`001` |
| ZCZX-GYSJSGL-UT-002 | 结算编号 | 递增与左补零 | 单元测试 | JUnit5 | §3.1 | 最大序号 `008` | `next()` | 末 3 位 `009`；总长 14 |
| ZCZX-GYSJSGL-UT-003 | 结算编号 | 超 999 拒绝 | 单元测试 | JUnit5 | §3.1 | 当日已满 999 | `next()` | 抛业务异常 |
| ZCZX-GYSJSGL-UT-004 | 结算编号 | 冲突重试 | 单元测试 | JUnit5+Mockito | 唯一键 | Mock `uk_settlement_no` 冲突一次 | 重试 `next()` | 第二次成功或明确失败 |
| ZCZX-GYSJSGL-UT-005 | 结算生成 | 按头快照写入 | 单元测试 | JUnit5+Mockito | §3.5、§5.1 | S1 订单 3 头总金额 10000 | `createFromOrder` | `fee_method=2`；`service_fee_amount=30.00`；`payable_amount=9970.00` |
| ZCZX-GYSJSGL-UT-006 | 结算生成 | 按额快照写入 | 单元测试 | JUnit5+Mockito | §3.5 | S2 订单总金额 10000 | `createFromOrder` | `fee_method=3`；费率字段与 S2 一致；`service_fee_amount=150.00` |
| ZCZX-GYSJSGL-UT-007 | 结算生成 | 按户服务费 0 | 单元测试 | JUnit5+Mockito | §3.5 | S3 订单 | `createFromOrder` | `service_fee_amount=0`；`payable=total_amount` |
| ZCZX-GYSJSGL-UT-008 | 结算生成 | 订单字段冗余一致 | 单元测试 | JUnit5+Mockito | §10.2 | 订单 `order_no`、头数、金额已知 | `createFromOrder` | `order_no`、`total_heads`、`total_amount`、`supplier_id` 与订单一致 |
| ZCZX-GYSJSGL-UT-009 | 结算生成 | 初始待结算 | 单元测试 | JUnit5+Mockito | §2.2 | 合法订单 | `createFromOrder` | `settlement_status=0`；凭证、完成时间为空 |
| ZCZX-GYSJSGL-UT-010 | 结算生成 | 幂等 uk_order_id | 单元测试 | JUnit5+Mockito | §4.1、§6.5 | 同 `order_id` 已有结算 | 再次 `createFromOrder` | 抛错；不插入第二条 |
| ZCZX-GYSJSGL-UT-011 | 凭证校验 | 缺 url/path | 单元测试 | JUnit5 | §3.7、§6.2 | 无 | `validateSettleVoucher` 缺字段 | 失败；请上传结算凭证 |
| ZCZX-GYSJSGL-UT-012 | 凭证校验 | 非法后缀 | 单元测试 | JUnit5 | §3.7 | 无 | `path` 为 `.pdf` | 失败；格式不符合 |
| ZCZX-GYSJSGL-UT-013 | 凭证校验 | 合法 png | 单元测试 | JUnit5 | §3.7 | 无 | `path` 以 `.png` 结尾 | 通过 |
| ZCZX-GYSJSGL-UT-014 | 完成结算 | 事务成功 | 单元测试 | JUnit5+Mockito | §6.3 | SS-PEND；合法凭证 | `completeSettle` | `settlement_status=1`；`settle_finish_time` 非空；凭证已存 |
| ZCZX-GYSJSGL-UT-015 | 完成结算 | 非待结算拒绝 | 单元测试 | JUnit5+Mockito | §6.4 | SS-DONE | `completeSettle` | 失败；仅待结算可操作 |
| ZCZX-GYSJSGL-UT-016 | 完成结算 | 关联订单非已完成 | 单元测试 | JUnit5+Mockito | §6.4 | Mock 订单 `order_status=0` | `completeSettle` | 失败；订单状态不满足 |
| ZCZX-GYSJSGL-UT-017 | 完成结算 | 不回写订单 | 单元测试 | JUnit5+Mockito | §6.6 | SS-PEND | `completeSettle` 成功 | 未调用订单 `update`；订单仍为已完成 |
| ZCZX-GYSJSGL-UT-018 | 完成结算 | 条件更新防并发 | 单元测试 | JUnit5+Mockito | §6.5 | Mock `update` 返回 0 | `completeSettle` | 失败；提示已完成或操作无效 |
| ZCZX-GYSJSGL-UT-019 | 列表查询 | 双模糊 AND | 单元测试 | JUnit5+Mockito | §5.1 | 多条样本 | `selectList(settlementNo, orderNo)` | SQL 同时 `LIKE` 两条件 |
| ZCZX-GYSJSGL-UT-020 | 列表查询 | 仅 del_flag=0 | 单元测试 | JUnit5 | §5.1 | 无 | 检查 `BizSupplierSettlementMapper.xml` 列表 SQL | `del_flag='0'`；`create_time DESC` |
| ZCZX-GYSJSGL-UT-021 | 详情 | 收费方式中文 | 单元测试 | JUnit5 | §3.5 | `fee_method=2` | 组装详情 | `feeMethodName=按头计费`（`SupplierRules`） |
| ZCZX-GYSJSGL-UT-022 | 费用计算 | 与订单共用公式 | 单元测试 | JUnit5 | §3.5 | S1/S2/S3 | `SettlementFeeCalculator` | 与订单 UT-018～020 结果一致（HALF_UP 2 位） |

**自动化已实现**：`SettlementFeeCalculatorTest`、`BizTradeOrderServiceImplTest`（含 `createFromOrder`）、`SettlementValidationTest`（UT-011～013）、`BizSupplierSettlementServiceImplTest`（UT-014～016、018、021）、`BizSupplierSettlementControllerApiTest`（API-001、007、010、011、013）。

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GYSJSGL-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §5.2 | 有结算数据 | `GET /list` | `code=200`；≤20 条；`createTime` 倒序 |
| ZCZX-GYSJSGL-API-002 | 列表 | 结算单编号模糊 | 接口测试 | Postman | §5.1 | 编号含 `JSD20260520` | `settlementNo=0520` | 命中对应行 |
| ZCZX-GYSJSGL-API-003 | 列表 | 关联订单编号模糊 | 接口测试 | Postman | §5.1 | 订单号片段已知 | `orderNo=0520` | 命中 `order_no` 匹配行 |
| ZCZX-GYSJSGL-API-004 | 列表 | 组合筛选 AND | 接口测试 | Postman | §5.1 | 同时传两条件 | `settlementNo`+`orderNo` | 同时满足才命中 |
| ZCZX-GYSJSGL-API-005 | 列表 | 不含逻辑删除 | 接口测试 | Postman | §5.1 | 某结算 `del_flag=2` | `GET /list` | 无该 id |
| ZCZX-GYSJSGL-API-006 | 列表 | 列字段完整 | 接口测试 | Postman | §5.2 | SS-PEND、SS-DONE 各一条 | `GET /list` | 行含编号、创建时间、订单号、供应商名、头数、金额、服务费、应付、状态、凭证、完成时间 |
| ZCZX-GYSJSGL-API-007 | 详情 | 待结算全字段 | 接口测试 | Postman | §7 | SS-PEND | `GET /{id}` | 含收费快照、`feeMethodName`；`settleVoucher` 为空；**无** `lineList` |
| ZCZX-GYSJSGL-API-008 | 详情 | 已完成含凭证 | 接口测试 | Postman | §7 | SS-DONE | `GET /{id}` | `settlementStatus=1`；`settleFinishTime` 有值；凭证 URL 可访问 |
| ZCZX-GYSJSGL-API-009 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 id | 失败或 `data` 空 |
| ZCZX-GYSJSGL-API-010 | 完成结算 | 合法待结算 | 接口测试 | Postman | §6 | SS-PEND；先 `POST /common/upload` | `PUT /completeSettle` Body 示例 | `code=200`；`settlementStatus=1`；`settleFinishTime` 非空 |
| ZCZX-GYSJSGL-API-011 | 完成结算 | 缺结算凭证 | 接口测试 | Postman | §3.7 | SS-PEND | 无 `settleVoucherUrl` | 失败；请上传结算凭证 |
| ZCZX-GYSJSGL-API-012 | 完成结算 | 非法文件后缀 | 接口测试 | Postman | §3.7 | SS-PEND | `settleVoucherPath` 为 `.pdf` | 失败；格式不符合 |
| ZCZX-GYSJSGL-API-013 | 完成结算 | 已完成拒绝 | 接口测试 | Postman | §6.5 | SS-DONE | `PUT /completeSettle` | 失败；已完成无需重复 |
| ZCZX-GYSJSGL-API-014 | 完成结算 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | `id=999999` | 失败 |
| ZCZX-GYSJSGL-API-015 | 完成结算 | 订单已删拒绝 | 接口测试 | Postman | §10.6 | 结算在但订单 `del_flag=2`（异常数据） | `completeSettle` | 失败 |
| ZCZX-GYSJSGL-API-016 | 约束 | 无新增接口 | 接口测试 | Postman | §4、§8.1 | 已登录 | `POST /` | 404 或方法不允许 |
| ZCZX-GYSJSGL-API-017 | 约束 | 无修改删除 | 接口测试 | Postman | §8.1 | 已登录 | `PUT /` 改金额；`DELETE /{id}` | 均不允许 |
| ZCZX-GYSJSGL-API-018 | 联调 | 支付生成待结算 | 接口测试 | Postman | §4.1 | TO-PAY；凭证齐备 | 订单 `PUT /tradeOrder/completePay` | 结算列表出现新行 `settlementStatus=0`；`uk_order_id` 唯一 |
| ZCZX-GYSJSGL-API-019 | 联调 | 一对一不重复 | 接口测试 | Postman | §4.1 | 已对 TO-DONE 完成支付 | 再次对该订单 `completePay` | 订单侧失败；结算仍 1 条 |
| ZCZX-GYSJSGL-API-020 | 快照 | 改供应商费率不重算 | 接口测试 | Postman | §3.5、§10.4 | SS-PEND 按头生成后 | 改 S1 `fee_standard`→99；`GET /{id}` | `service_fee_amount` 仍为生成时原值 |
| ZCZX-GYSJSGL-API-021 | 快照 | 按额费率字段 | 接口测试 | Postman | §3.5 | S2 支付生成结算 | `GET /{id}` | `transactionFeeRate`、`managementFeeRate` 与支付时 S2 一致 |
| ZCZX-GYSJSGL-API-022 | 约束 | 完成结算不回写订单 | 接口测试 | Postman | §6.6 | SS-PEND | `completeSettle` 后 `GET /tradeOrder/{orderId}` | 订单仍 `orderStatus=1`；支付凭证未变 |
| ZCZX-GYSJSGL-API-023 | 端到端 | 支付→结算→完成 | 接口测试 | Postman | §10.7 | TO-PAY 样本齐备 | `completePay`→`list`→`completeSettle` | 每步 `code=200`；最终 `settlementStatus=1` |
| ZCZX-GYSJSGL-API-024 | 端到端 | 平台闭环终点 | 接口测试 | Postman | §14 决策 9 | 上一步已完成结算 | 查本模块列表 | 无后续必办接口；状态已完成 |
| ZCZX-GYSJSGL-API-025 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或统一未登录 |
| ZCZX-GYSJSGL-API-026 | 权限 | 无 list 权限 | 接口测试 | Postman | §11 | 无 `list` | `GET /list` | 无权限失败 |
| ZCZX-GYSJSGL-API-027 | 权限 | 无 settle 权限 | 接口测试 | Postman | §11 | 仅 list/query | `PUT /completeSettle` | 无权限失败 |
| ZCZX-GYSJSGL-API-028 | 权限 | 无 query 详情 | 接口测试 | Postman | §11 | 仅 list | `GET /{id}` | 无权限失败 |
| ZCZX-GYSJSGL-API-029 | 响应 | 失败 msg 可读 | 接口测试 | Postman | §12 | 已登录 | 触发缺凭证、已完成重复 | `msg` 与需求 §12 示例可区分 |
| ZCZX-GYSJSGL-API-030 | 约束 | 详情无订单跳转字段 | 接口测试 | Postman | §3.2、§14 决策 10 | SS-PEND | `GET /{id}` JSON | **无** `orderDetailUrl`/`tradeOrderRoute` 等跳转字段 |

---

## 三、界面测试用例（UI）

**测试工具**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GYSJSGL-UI-001 | 列表 | 默认列展示 | UI 测试 | Playwright+Chrome | §5.2 | 已登录；有数据 | 进入「供应商结算管理」 | 列含结算单编号、创建时间、订单编号、供应商、头数、金额、服务费、应付、状态、凭证、完成时间、操作 |
| ZCZX-GYSJSGL-UI-002 | 列表 | 结算单编号筛选 | UI 测试 | Playwright+Chrome | §5.1 | 已知 `JSD` 片段 | 填编号→搜索 | 仅匹配行 |
| ZCZX-GYSJSGL-UI-003 | 列表 | 关联订单编号筛选 | UI 测试 | Playwright+Chrome | §5.1 | 已知订单号片段 | 填订单号→搜索 | 仅匹配行 |
| ZCZX-GYSJSGL-UI-004 | 列表 | 组合筛选 | UI 测试 | Playwright+Chrome | §5.1 | 两条件均有数据 | 同时填→搜索 | 同时满足才显示 |
| ZCZX-GYSJSGL-UI-005 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.1 | 已筛选 | 搜索→重置 | 条件清空；列表恢复 |
| ZCZX-GYSJSGL-UI-006 | 列表 | 无新增按钮 | UI 测试 | Playwright+Chrome | §4、§8.1 | 有 list 权限 | 看工具栏 | **无**「新增」；仅搜索、重置 |
| ZCZX-GYSJSGL-UI-007 | 列表 | 待结算操作按钮 | UI 测试 | Playwright+Chrome | §8.2 | SS-PEND 行 | 看操作列 | 含「完成结算」「查看」；**无**打印凭证 |
| ZCZX-GYSJSGL-UI-008 | 列表 | 已完成操作按钮 | UI 测试 | Playwright+Chrome | §8.2 | SS-DONE 行 | 看操作列 | 含「打印凭证」「查看」；**无**完成结算 |
| ZCZX-GYSJSGL-UI-009 | 列表 | 待结算凭证列空 | UI 测试 | Playwright+Chrome | §5.2 | SS-PEND | 看结算凭证列 | 为空或「—」 |
| ZCZX-GYSJSGL-UI-010 | 查看 | 只读含收费快照 | UI 测试 | Playwright+Chrome | §7 | SS-PEND | 点击查看 | 全字段只读；展示收费方式及费率快照；无编辑入口 |
| ZCZX-GYSJSGL-UI-011 | 查看 | 不跳转订单 | UI 测试 | Playwright+Chrome | §3.2、§7 | 任意行 | 打开详情 | **无**「查看订单」「跳转订单」链接；订单编号纯文本 |
| ZCZX-GYSJSGL-UI-012 | 查看 | 已完成凭证预览 | UI 测试 | Playwright+Chrome | §7 | SS-DONE | 查看详情 | 结算凭证图可预览；完成时间有值 |
| ZCZX-GYSJSGL-UI-013 | 完成结算 | 弹窗文案 | UI 测试 | Playwright+Chrome | §6.1 | SS-PEND | 点「完成结算」 | 标题为「完成结算支付」 |
| ZCZX-GYSJSGL-UI-014 | 完成结算 | 上传凭证成功 | UI 测试 | Playwright+Chrome | §6.2 | SS-PEND；V-OK | 上传 jpg→确定 | 成功提示；列表状态「已完成」；完成时间有值 |
| ZCZX-GYSJSGL-UI-015 | 完成结算 | 取消不变 | UI 测试 | Playwright+Chrome | §6.2 | SS-PEND | 完成结算→取消 | 仍为待结算 |
| ZCZX-GYSJSGL-UI-016 | 完成结算 | 缺凭证拦截 | UI 测试 | Playwright+Chrome | §3.7 | SS-PEND | 不上传直接确定 | 提示请上传结算凭证 |
| ZCZX-GYSJSGL-UI-017 | 完成结算 | 非法格式拦截 | UI 测试 | Playwright+Chrome | §3.7 | SS-PEND | 上传 V-BAD | 前端或提交失败 |
| ZCZX-GYSJSGL-UI-018 | 完成结算 | 二次确认（若有） | UI 测试 | Playwright+Chrome | §13 建议 | 前端已实现确认框 | 确定前弹窗 | 展示结算单号、供应商、实际应付（宜） |
| ZCZX-GYSJSGL-UI-019 | 完成结算 | 已完成不可再结 | UI 测试 | Playwright+Chrome | §6.5 | SS-DONE | 找「完成结算」按钮 | 无按钮或不可点 |
| ZCZX-GYSJSGL-UI-020 | 打印 | 仅已完成可打 | UI 测试 | Playwright+Chrome | §8.3 | SS-DONE | 打印凭证 | 预览含编号、订单号、供应商、头数、金额、服务费、应付、状态、创建/完成时间、**结算凭证图** |
| ZCZX-GYSJSGL-UI-021 | 打印 | 不含订单支付凭证 | UI 测试 | Playwright+Chrome | §8.3 | SS-DONE | 检查打印内容 | **无**订单支付凭证、无采购耳标明细 |
| ZCZX-GYSJSGL-UI-022 | 打印 | 待结算不可打 | UI 测试 | Playwright+Chrome | §8.3 | SS-PEND | 找打印按钮 | 无「打印凭证」 |
| ZCZX-GYSJSGL-UI-023 | 端到端 | 订单支付到结算完成 | UI 集成 | Playwright+Chrome | §10.7 | 权限齐备 | 订单模块完成支付→本模块完成结算 | 新待结算行出现→上传凭证→已完成；订单模块仍为已完成 |
| ZCZX-GYSJSGL-UI-024 | 端到端 | 闭环无后续引导 | UI 测试 | Playwright+Chrome | §14 决策 9 | 上一步已完成 | 完成后停留本模块 | **无**强制跳转订单页；无「下一步」必办 |
| ZCZX-GYSJSGL-UI-025 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §11 | 仅 list/query | 进入模块 | 无「完成结算」；可查看 |
| ZCZX-GYSJSGL-UI-026 | 权限 | 无 settle | UI 测试 | Playwright+Chrome | §11 | 无 settle | SS-PEND 行 | 无「完成结算」按钮 |
| ZCZX-GYSJSGL-UI-027 | 约束 | 金额不可编辑 | UI 测试 | Playwright+Chrome | §8.1 | 查看/列表 | 尝试改服务费、应付 | 无输入框；不可改 |

---

## Playwright 与谷歌浏览器（实施提示）

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`await page.goto('/tradeMarket/supplierSettlement')`。  
- 筛选：`page.getByPlaceholder('结算单编号').fill('JSD')` → `getByRole('button', { name: '搜索' }).click()`。  
- 完成结算：`getByRole('button', { name: '完成结算' }).first().click()` → `locator('input[type=file]').setInputFiles('test.jpg')` → 对话框 `getByRole('button', { name: '确定' }).click()` → 断言列表状态「已完成」。  
- 无跳转：`await expect(page.getByRole('link', { name: '查看订单' })).toHaveCount(0)`。  
- 打印：`page.waitForEvent('popup')` 或断言打印 DOM 含 `settlementNo`、`payableAmount`，不含 `payVoucher`。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-005～009、014、021 | API-001～010、018、023～024 | UI-001～005、010、014、020、023～024 |
| 异常流程 | UT-010～013、015～016、018 | API-011～015、029 | UI-015～017、019 |
| 业务约束 | UT-010、017、019～020 | API-016～017、019～022、030 | UI-006、011、021～022、027 |
| 来源与 1:1 | UT-008、010 | API-018～019 | UI-023 |
| 费用快照 | UT-005～007、020、022 | API-020～021 | UI-010 |
| 凭证双轨 | UT-011～013 | API-011～012 | UI-014、016～017、021 |
| 状态与操作矩阵 | UT-009、015 | API-013 | UI-007～009、019、022 |
| 不回写订单 | UT-017 | API-022 | — |
| 不跳转订单 | — | API-030 | UI-011、024 |
| 闭环终点 | — | API-024 | UI-024 |
| 列表筛选 | UT-019～020 | API-002～005 | UI-002～005 |
| 权限/鉴权 | — | API-025～028 | UI-025～026 |
| 打印 §8.3 | — | — | UI-020～022 |
| 无 CRUD | — | API-016～017 | UI-006、027 |

---

## 功能需求追溯（自查）

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §2 状态 | 待结算/已完成；不可逆 | UT-009、015；API-010、013；UI-007～009、019 |
| §3 字段 | 编号、快照、凭证、时间 | UT-001～008、011～013；API-006～008、020～021；UI-001、010、012 |
| §4 来源 | 仅支付生成；不可手工建 | UT-010；API-016～019；UI-006、023 |
| §5 列表 | 双模糊 AND；列 | API-001～006；UI-001～005 |
| §6 完成结算 | 凭证、事务、不回写 | UT-014～018；API-010～015、022；UI-013～019 |
| §7 查看 | 只读；无跳转 | API-007、030；UI-010～012 |
| §8 功能清单 | 无增删改；打印边界 | API-016～017；UI-006、020～022、027 |
| §10 关联订单 | 协同、异常 | API-015、018～019、023；UI-023 |
| §11 权限 | 分权 | API-025～028；UI-025～026 |
| §12 提示语 | 失败可读 | UT-011；API-029；UI-016 |
| §14 决策 | 闭环、不跳转 | API-024、030；UI-011、024 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 22、接口 30、UI 27；覆盖正常/异常/约束、单元+接口+UI；Playwright+Chrome；前缀 **ZCZX-GYSJSGL**；对齐需求 v1.1、技术方案 v1.0 |
| 1.1 | 标注后端已实现用例的自动化类名 |
