# 隔离巡查登记 — 测试用例

> 依据：`隔离巡查登记功能需求.md`、`隔离巡查登记技术方案.md`  
> **接口 Base Path**：`/tradeMarket/isolationPatrol`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块权限的账号已登录（`tradeMarket:isolationPatrol:list|query|add|edit|remove`）。关联数据宜预置：

| 类型 | 样本 | 要点 |
| --- | --- | --- |
| 圈位 `biz_isolation_pen` | **P1** `id=1` `pen_code=01`、**P2** `id=2` `02` | `del_flag=0` |
| 入场登记 `biz_entry_isolation` | **E1** | `del_flag=0`；`expected_release_date >= 今天` |
| 分圈 `biz_entry_isolation_alloc` | P1：`E001,E002`；P2：`E003` | 对应 `entry_id=E1` |
| 已过期在栏（异常样本） | **E2** | `expected_release_date < 今天`（用于在栏判定负例） |

**合法新增 Body 示例**

- 正常（数量 0）：

```json
{
  "patrolTime": "2026-05-20 14:00:00",
  "penId": 1,
  "sickDeadQty": 0,
  "contentDesc": "巡查结果正常",
  "handleDesc": "无需处理"
}
```

- 异常（数量 2）：

```json
{
  "patrolTime": "2026-05-20 15:00:00",
  "penId": 1,
  "sickDeadQty": 2,
  "contentDesc": "巡查结果异常",
  "handleDesc": "需要处理",
  "earTagList": ["E001", "E002"]
}
```

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLXCDJ-UT-001 | 耳标解析 | 英文逗号拆分 | 单元测试 | JUnit5 | §2.5 复用 | 无 | `EarTagCodec.parse("A,B")` | `["A","B"]` |
| ZCZX-GLXCDJ-UT-002 | 耳标解析 | 去重拒绝 | 单元测试 | JUnit5 | §2.7 | 无 | `parse("E1,E1")` | 校验失败或抛异常 |
| ZCZX-GLXCDJ-UT-003 | 一致性 | P1 数量为 0 无耳标 | 单元测试 | JUnit5 | §2.8 P1 | 无 | `sickDeadQty=0`，`earTagList=["E1"]` | 失败 |
| ZCZX-GLXCDJ-UT-004 | 一致性 | P1 数量为 0 通过 | 单元测试 | JUnit5 | §2.8 P1 | 无 | `sickDeadQty=0`，`earTagList=[]` | 通过 |
| ZCZX-GLXCDJ-UT-005 | 一致性 | P2 数量与耳标不等 | 单元测试 | JUnit5 | §2.8 P2 | 无 | `sickDeadQty=2`，耳标 1 个 | 失败 |
| ZCZX-GLXCDJ-UT-006 | 一致性 | P2 数量与耳标相等 | 单元测试 | JUnit5 | §2.8 P2 | 无 | `sickDeadQty=2`，2 个耳标 | 通过 |
| ZCZX-GLXCDJ-UT-007 | 一致性 | P3 耳标不在栏 | 单元测试 | JUnit5+Mockito | §2.8 P3 | 在栏仅 E001 | 提交 E009 | 失败 |
| ZCZX-GLXCDJ-UT-008 | 一致性 | P3 耳标重复 | 单元测试 | JUnit5 | §2.8 P3 | 无 | `earTagList=["E1","E1"]` | 失败 |
| ZCZX-GLXCDJ-UT-009 | 在栏圈位 | 过期登记不计入 | 单元测试 | JUnit5+Mockito | §2.4 | E2 已过期 | `isPenInStock(penId)` | false |
| ZCZX-GLXCDJ-UT-010 | 在栏圈位 | 有效登记计入 | 单元测试 | JUnit5+Mockito | §2.4 | E1 在栏 | `isPenInStock(1)` | true |
| ZCZX-GLXCDJ-UT-011 | 在栏耳标 | 合并分圈耳标 | 单元测试 | JUnit5+Mockito | §2.4 | P1 两行 alloc | `listEarTags(1)` | 含 E001、E002 去重 |
| ZCZX-GLXCDJ-UT-012 | 巡查时间 | 晚于当前 | 单元测试 | JUnit5 | §2.2 | 无 | `patrolTime=明天` | 失败 |
| ZCZX-GLXCDJ-UT-013 | 巡查时间 | 等于当前 | 单元测试 | JUnit5 | §2.2 | Mock now | `patrolTime=now` | 通过 |
| ZCZX-GLXCDJ-UT-014 | 字段校验 | 文案长度 | 单元测试 | JUnit5 | §2.5/2.6 | 无 | 空、201 字、200 字 | 空/201 失败；200 通过 |
| ZCZX-GLXCDJ-UT-015 | 字段校验 | 病死数量 | 单元测试 | JUnit5 | §2.4 | 无 | `-1`、`0`、`99`、小数 | -1/小数失败；0/99 通过 |
| ZCZX-GLXCDJ-UT-016 | 文件校验 | 照片后缀 | 单元测试 | JUnit5 | §2.9 | 无 | `.exe`、`.png`、`.JPG` | exe 失败；png/jpg 通过 |
| ZCZX-GLXCDJ-UT-017 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | §3.3 | Mock Mapper | `insert` 正常样本 | `del_flag=0`；`pen_code` 写入；`ear_tags` 按规则 |
| ZCZX-GLXCDJ-UT-018 | Service | 数量为 0 耳标空 | 单元测试 | JUnit5+Mockito | §2.5 | Mock | `insert` qty=0 | `ear_tags` 为 null |
| ZCZX-GLXCDJ-UT-019 | Service | 修改全字段 | 单元测试 | JUnit5+Mockito | §5.3 | 已有记录 | `update` 改圈位/数量/耳标 | 字段更新；再校验 P1～P3 |
| ZCZX-GLXCDJ-UT-020 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §3.4 | Mock | `remove(id)` | `del_flag=2` |
| ZCZX-GLXCDJ-UT-021 | Mapper | 列表日期区间 | 单元测试 | JUnit5 | §3.1 | 测试库 3 条不同日 | `selectList(start,end)` | 仅闭区间内记录 |
| ZCZX-GLXCDJ-UT-022 | Mapper | 圈位编号模糊 | 单元测试 | JUnit5 | §3.1 | 有 01、02 | `penCode=1` | 命中 01、11 等含 1 的编号 |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLXCDJ-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §3.1 | 有巡查数据 | `GET /list` | `code=200`；≤20 条；`patrolTime` 倒序 |
| ZCZX-GLXCDJ-API-002 | 列表 | 巡查日期区间 | 接口测试 | Postman | §5.2.1 | 已知巡查日 | `patrolDateStart/End` 含该日 | 命中；区间外不出现 |
| ZCZX-GLXCDJ-API-003 | 列表 | 圈位编号模糊 | 接口测试 | Postman | §5.2.1 | 有 01、02 | `penCode=1` | 含 `01` 等片段行 |
| ZCZX-GLXCDJ-API-004 | 列表 | 组合筛选 | 接口测试 | Postman | 多条件 | 已登录 | 日期+圈位 | 同时满足才命中 |
| ZCZX-GLXCDJ-API-005 | 列表 | 日期起止倒置 | 接口测试 | Postman | §3.1 | 已登录 | `Start>End` | 400 或失败提示 |
| ZCZX-GLXCDJ-API-006 | 列表 | 不含已删除 | 接口测试 | Postman | 逻辑删除 | 某 id 已删 | `GET /list` | 无该 id |
| ZCZX-GLXCDJ-API-007 | 在栏下拉 | penOptions | 接口测试 | Postman | §3.5 | E1 在栏 | `GET /penOptions` | `data` 含 P1、P2；按 `penCode` 升序 |
| ZCZX-GLXCDJ-API-008 | 在栏下拉 | 无在栏空数组 | 接口测试 | Postman | §2.3 | 全部登记已过期 | `GET /penOptions` | `data=[]` |
| ZCZX-GLXCDJ-API-009 | 在栏耳标 | penEarTags | 接口测试 | Postman | §3.6 | P1 有 E001,E002 | `GET /penEarTags?penId=1` | 数组含两耳标 |
| ZCZX-GLXCDJ-API-010 | 在栏耳标 | 缺 penId | 接口测试 | Postman | 异常 | 已登录 | 无 `penId` | 400 或失败 |
| ZCZX-GLXCDJ-API-011 | 在栏耳标 | 非在栏圈位 | 接口测试 | Postman | §2.4 | 圈位无在栏 | `penId` 无效 | `[]` 或 400 |
| ZCZX-GLXCDJ-API-012 | 新增 | 正常 qty=0 | 接口测试 | Postman | §5.1 | P1 在栏 | `POST` 正常 Body | `code=200`；`earTags` 空 |
| ZCZX-GLXCDJ-API-013 | 新增 | 异常 qty=2 | 接口测试 | Postman | §5.1 | P1 在栏 | `POST` 异常 Body | 成功；`earTagList` 2 个 |
| ZCZX-GLXCDJ-API-014 | 新增 | 含巡查照片 | 接口测试 | Postman | §2.9 | 已 upload png | Body 带 `photoUrl/Path` | 成功；详情有图 |
| ZCZX-GLXCDJ-API-015 | 新增 | 缺巡查时间 | 接口测试 | Postman | 异常 | 已登录 | 无 `patrolTime` | 失败 |
| ZCZX-GLXCDJ-API-016 | 新增 | 巡查时间未来 | 接口测试 | Postman | §2.2 | 已登录 | `patrolTime` 明天 | 失败 |
| ZCZX-GLXCDJ-API-017 | 新增 | 缺圈位 | 接口测试 | Postman | 异常 | 已登录 | 无 `penId` | 失败 |
| ZCZX-GLXCDJ-API-018 | 新增 | 圈位非在栏 | 接口测试 | Postman | §2.3 | 无在栏 penId | `POST` | 失败 |
| ZCZX-GLXCDJ-API-019 | 新增 | P1 数量>0 无耳标 | 接口测试 | Postman | §2.8 P1/P2 | 已登录 | `sickDeadQty=1`，无耳标 | 失败 |
| ZCZX-GLXCDJ-API-020 | 新增 | P2 耳标数不等 | 接口测试 | Postman | §2.8 P2 | 已登录 | `sickDeadQty=2`，1 耳标 | 失败；msg 含数量不一致 |
| ZCZX-GLXCDJ-API-021 | 新增 | P3 耳标超范围 | 接口测试 | Postman | §2.8 P3 | P1 仅 E001 | `earTagList=["E009"]` | 失败 |
| ZCZX-GLXCDJ-API-022 | 新增 | P1 数量0 带耳标 | 接口测试 | Postman | §2.8 P1 | 已登录 | `sickDeadQty=0` 带耳标 | 失败 |
| ZCZX-GLXCDJ-API-023 | 新增 | 文案超长 | 接口测试 | Postman | §2.5 | 已登录 | `contentDesc` 201 字 | 失败 |
| ZCZX-GLXCDJ-API-024 | 新增 | 照片后缀非法 | 接口测试 | Postman | §2.9 | 已登录 | `photoPath` 为 `.exe` | 失败 |
| ZCZX-GLXCDJ-API-025 | 新增 | 病死数量为负 | 接口测试 | Postman | §2.4 | 已登录 | `sickDeadQty=-1` | 失败 |
| ZCZX-GLXCDJ-API-026 | 详情 | 有效 id | 接口测试 | Postman | §5.4 | 有记录 R1 | `GET /{id}` | 含 `earTagList`、`photoUrl` |
| ZCZX-GLXCDJ-API-027 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 | 失败或 `data` 空 |
| ZCZX-GLXCDJ-API-028 | 修改 | 改数量与耳标 | 接口测试 | Postman | §5.3 | 有 R1 qty=0 | `PUT` 改 qty=1+耳标 | 成功；详情已更新 |
| ZCZX-GLXCDJ-API-029 | 修改 | 改圈位清空耳标 | 接口测试 | Postman | §5.1.2 | R1 在 P1 | `PUT` 改 P2；耳标须重选 | 未选在栏耳标则失败 |
| ZCZX-GLXCDJ-API-030 | 修改 | 违反 P2 | 接口测试 | Postman | §2.8 | 有 R1 | `PUT` 数量与耳标不一致 | 失败 |
| ZCZX-GLXCDJ-API-031 | 修改 | 清空照片 | 接口测试 | Postman | §3.3 | 有图记录 | `PUT` `photoUrl/Path=""` | 成功；详情无图 |
| ZCZX-GLXCDJ-API-032 | 修改 | 不存在 id | 接口测试 | Postman | 异常 | 已登录 | 伪造 id `PUT` | 失败 |
| ZCZX-GLXCDJ-API-033 | 删除 | 单条逻辑删 | 接口测试 | Postman | §5.5 | 有 R1 | `DELETE /{id}` | 成功；列表不可见 |
| ZCZX-GLXCDJ-API-034 | 删除 | 重复删除 | 接口测试 | Postman | 幂等 | 已删 id | 再次 `DELETE` | 失败或不存在 |
| ZCZX-GLXCDJ-API-035 | 端到端 | CRUD 串联 | 接口测试 | Postman | §4 | 在栏数据齐备 | `POST`→`list`→`GET`→`PUT`→`DELETE` | 每步 `code=200` |
| ZCZX-GLXCDJ-API-036 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或统一未登录 |
| ZCZX-GLXCDJ-API-037 | 权限 | 无新增权限 | 接口测试 | Postman | §6 | 仅 list | `POST` | 无权限失败 |
| ZCZX-GLXCDJ-API-038 | 权限 | 无删除权限 | 接口测试 | Postman | §6 | 无 remove | `DELETE` | 无权限失败 |
| ZCZX-GLXCDJ-API-039 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发 P2、非在栏圈位 | `msg` 可区分场景 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-GLXCDJ-UI-001 | 列表 | 默认展示列 | UI 测试 | Playwright+Chrome | §5.2.3 | 已登录；有数据 | 进入「隔离巡查登记」 | 含巡查时间、圈位编号、巡查照片、巡查内容描述、处理情况、病死病害数量、耳标号、操作 |
| ZCZX-GLXCDJ-UI-002 | 列表 | 巡查日期筛选 | UI 测试 | Playwright+Chrome | §5.2.1 | 已知日期记录 | 选日期范围→搜索 | 仅范围内记录 |
| ZCZX-GLXCDJ-UI-003 | 列表 | 圈位编号模糊 | UI 测试 | Playwright+Chrome | §5.2.1 | 有 01 圈位记录 | 填 `1`→搜索 | 命中含 01 行 |
| ZCZX-GLXCDJ-UI-004 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.2 | 已筛选 | 搜索→重置 | 条件清空；列表恢复 |
| ZCZX-GLXCDJ-UI-005 | 列表 | 照片缩略/查看 | UI 测试 | Playwright+Chrome | §5.2.3 | 有图记录 | 查看照片列 | 缩略图或查看可预览 |
| ZCZX-GLXCDJ-UI-006 | 列表 | 数量0耳标列 | UI 测试 | Playwright+Chrome | §2.7 | 有 qty=0 行 | 查看耳标列 | 显示「—」或空 |
| ZCZX-GLXCDJ-UI-007 | 新增 | 巡查时间默认 | UI 测试 | Playwright+Chrome | §5.1 | 有 add 权限 | 打开新增弹窗 | 巡查时间≈当前时刻 |
| ZCZX-GLXCDJ-UI-008 | 新增 | 圈位下拉在栏 | UI 测试 | Playwright+Chrome | §2.3 | E1 在栏 | 打开圈位下拉 | 仅 P1、P2 等；无已删/空圈 |
| ZCZX-GLXCDJ-UI-009 | 新增 | 无在栏提示 | UI 测试 | Playwright+Chrome | §2.3 | 无在栏登记 | 打开新增 | 提示「暂无在栏圈位…」或下拉空 |
| ZCZX-GLXCDJ-UI-010 | 新增 | 数量默认0联动文案 | UI 测试 | Playwright+Chrome | §5.1.2 | 新增弹窗 | 保持数量 0 | 内容「巡查结果正常」；处理「无需处理」；无耳标区 |
| ZCZX-GLXCDJ-UI-011 | 新增 | 数量>0联动文案 | UI 测试 | Playwright+Chrome | §5.1.2 | 新增；选 P1 | 数量改 2 | 内容「巡查结果异常」；处理「需要处理」；显示耳标多选 |
| ZCZX-GLXCDJ-UI-012 | 新增 | 耳标选项范围 | UI 测试 | Playwright+Chrome | §2.7 | P1 在栏 E001,E002 | 数量 1→选耳标 | 下拉仅 E001、E002 |
| ZCZX-GLXCDJ-UI-013 | 新增 | 耳标个数校验 | UI 测试 | Playwright+Chrome | §2.8 P2 | 新增 | 数量 2、只选 1 耳标→确定 | 提示数量不一致；不提交 |
| ZCZX-GLXCDJ-UI-014 | 新增 | 换圈位清空耳标 | UI 测试 | Playwright+Chrome | §5.1.2 | 已选 P1 与耳标 | 改选 P2 | 耳标清空；选项变为 P2 在栏耳标 |
| ZCZX-GLXCDJ-UI-015 | 新增 | 数量改0隐藏耳标 | UI 测试 | Playwright+Chrome | §5.1.2 | 已选 2 耳标 | 数量改 0 | 耳标区隐藏；已选清空 |
| ZCZX-GLXCDJ-UI-016 | 新增 | 上传照片合法 | UI 测试 | Playwright+Chrome | §2.9 | png≤10MB | 上传 png | 成功；列表/详情可见 |
| ZCZX-GLXCDJ-UI-017 | 新增 | 上传非法 | UI 测试 | Playwright+Chrome | §2.9 | exe 或>10MB | 选择上传 | 提示格式或大小限制 |
| ZCZX-GLXCDJ-UI-018 | 新增 | 保存正常全流程 | UI 测试 | Playwright+Chrome | §4.2 | 在栏+权限 | qty=0 填全→确定 | 成功；列表新行正确 |
| ZCZX-GLXCDJ-UI-019 | 新增 | 保存异常全流程 | UI 测试 | Playwright+Chrome | §4.2 | P1 两耳标 | qty=2 选 E001,E002→确定 | 成功；耳标列展示两号 |
| ZCZX-GLXCDJ-UI-020 | 新增 | 巡查时间未来 | UI 测试 | Playwright+Chrome | §2.2 | 新增 | 选未来时间→保存 | 前端或提交失败提示 |
| ZCZX-GLXCDJ-UI-021 | 新增 | 取消 | UI 测试 | Playwright+Chrome | §5.1.3 | 新增 | 填数据→取消 | 弹窗关；无新行 |
| ZCZX-GLXCDJ-UI-022 | 查看 | 只读全字段 | UI 测试 | Playwright+Chrome | §5.4 | 有记录 | 点击查看 | 各字段只读；照片可预览 |
| ZCZX-GLXCDJ-UI-023 | 编辑 | 改数量与耳标 | UI 测试 | Playwright+Chrome | §5.3 | qty=0 记录 | 编辑→改 qty=1→选耳标→确定 | 列表/详情已更新 |
| ZCZX-GLXCDJ-UI-024 | 编辑 | 清除照片 | UI 测试 | Playwright+Chrome | §5.3 | 有图记录 | 编辑→删除照片→确定 | 详情无图 |
| ZCZX-GLXCDJ-UI-025 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→确认 | 行消失 |
| ZCZX-GLXCDJ-UI-026 | 删除 | 取消删除 | UI 测试 | Playwright+Chrome | §5.5 | 任意行 | 删除→取消 | 行仍在 |
| ZCZX-GLXCDJ-UI-027 | 端到端 | 全流程 | UI 集成 | Playwright+Chrome | §4 | 权限+在栏 | 新增正常→筛选→查看→编辑异常→删除 | 无报错；数据一致 |
| ZCZX-GLXCDJ-UI-028 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 仅 list/query | 进入模块 | 无新增/编辑/删除按钮 |
| ZCZX-GLXCDJ-UI-029 | 查看 | 详情进编辑 | UI 测试 | Playwright+Chrome | §5.4 | 查看弹窗 | 点「编辑」 | 编辑弹窗回显数据 |

---

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

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/tradeMarket/isolationPatrol')`（以菜单 `component` 为准）。  
- 新增：`page.getByRole('button', { name: '新增' }).click()` → 选圈位 → 填病死病害数量 → 按需选耳标 → 确定。  
- 日期筛选：`page.getByLabel('巡查日期')` 使用 `daterange`；`page.getByRole('button', { name: '搜索' }).click()`。  
- 耳标：`page.getByLabel('耳标号')` 多选；数量改 0 时断言耳标区域 `hidden` 或不可见。

---

## 覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-004、006、010～013、017～019 | API-007～014、026、028、035 | UI-007～012、018～019、022～023、027 |
| 异常流程 | UT-002、003、005、007、012、015 | API-005、010～011、015～025、027、032、034 | UI-009、013、017、020～021、025～026 |
| 业务约束 P1～P3 | UT-003～008 | API-019～022 | UI-010～015、013、019 |
| 在栏圈位/耳标 | UT-009～011 | API-007～011、018 | UI-008～009、012、014 |
| 数量联动文案 | — | — | UI-010～011、015 |
| 巡查时间 | UT-012～013 | API-016 | UI-007、020 |
| 列表筛选 | UT-021～022 | API-002～004 | UI-002～004 |
| 巡查照片 | UT-016 | API-014、024 | UI-005、016～017、024 |
| 逻辑删除 | UT-020 | API-006、033～034 | UI-025～026 |
| 权限/鉴权 | — | API-036～038 | UI-028 |

---

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

| 需求章节 | 要点 | 主要对应用例 |
| --- | --- | --- |
| §5.1 新增 | 字段、联动、P1～P3 | UT-003～008、017～018；API-012～025；UI-007～021 |
| §5.2 列表 | 日期区间、圈位模糊 | UT-021～022；API-001～006；UI-001～006 |
| §5.3 修改 | 全字段可改 | UT-019；API-028～032；UI-023～024 |
| §5.4 查看 | 只读 | API-026；UI-022、029 |
| §5.5 删除 | 逻辑删 | UT-020；API-033～034；UI-025～026 |
| §2.3～2.4 在栏 | penOptions/penEarTags | UT-009～011；API-007～011、018；UI-008～009、012 |
| §2.8 P1～P3 | 数量与耳标 | UT-003～008；API-019～022；UI-010～015、013 |
| §2.9 照片 | jpg/png≤10MB | UT-016；API-014、024；UI-016～017 |
| §6 权限 | 按钮权限 | API-037～038；UI-028 |

---

## 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：UT/API/UI 全表；覆盖正常/异常/P1～P3/在栏/筛选/权限；Playwright+Chrome |
