# 我的预约（兽医）— 测试用例

> 依据：`我的预约(兽医)功能需求.md`、`我的预约(兽医)技术方案.md`  
> **接口 Base Path**：`/diseaseTreatment/myAppointment/vet`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：兽医账号 **A** 已通过「畜牧医疗资源管理」为兽医 **R1**（`resource_type=1`、`account_assigned=1`、`sys_user_id=A`）分配账号并绑定角色 **100**；具备权限 `diseaseTreatment:vetMyAppointment:list|query|confirm|reject|complete`。`biz_service_appointment` 宜预置：

| 样本 | 归属 | 状态 | 要点 |
| --- | --- | --- | --- |
| **A0** | R1，`provider_type=1` | 待确认 `0` | 可操作确认/拒绝 |
| **A1** | R1 | 已确认 `1` | 可操作完成接诊；`canComplete=true` |
| **A2** | R1 | 已拒绝 `2` | `reject_reason` 非空 |
| **A3** | R1 | 已取消 `3` | 无确认/拒绝 |
| **A4** | R1 | 已完成 `4` | 无评价入口（§3.3） |
| **AX** | R2（另一兽医） | 待确认 `0` | 账号 A 不可见/不可操作 |
| **O1** | 机构 `provider_type=2` | 已预约 `5` | 兽医列表不可见 |
| **E1** | 专家 `provider_type=3` | 待确认 `0` | 兽医列表不可见 |

**拒绝 Body 片段**：`{"rejectReason":"时段冲突无法接诊"}`（1～100 字，trim 后计数）。

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）；菜单示例「牧业疫病诊疗服务 → 我的预约（兽医）」。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-WDYYYS-UT-001 | 参数校验 | 拒绝理由空/空白 | 单元测试 | JUnit5 | §6.4、§9 | 无 | `validateRejectReason(null)`、`""`、`"   "` | 失败；msg 含「请填写拒绝理由」 |
| ZCZX-WDYYYS-UT-002 | 参数校验 | 拒绝理由长度 | 单元测试 | JUnit5 | §6.4 | 无 | 1 字、100 字、101 字（trim 后） | 1～100 通过；101 失败 |
| ZCZX-WDYYYS-UT-003 | 参数校验 | 预约日期范围 | 单元测试 | JUnit5 | §6.1、§9 | 无 | `startDate` 晚于 `endDate`；相等；合法区间 | 前者失败；后两者通过 |
| ZCZX-WDYYYS-UT-004 | 状态规则 | 可确认/可拒绝 | 单元测试 | JUnit5 | §4.1、§7 | 无 | `canConfirmOrReject(0～4)` | 仅 `status=0` 为 true |
| ZCZX-WDYYYS-UT-004a | 状态规则 | 可完成接诊 | 单元测试 | JUnit5 | §6.5、§7 | 无 | `canCompleteVetOrExpert(0～4)` | 仅 `status=1` 为 true |
| ZCZX-WDYYYS-UT-005 | 状态规则 | 兽医合法状态集 | 单元测试 | JUnit5 | §4.1、技术方案 §2.2 | 无 | 校验 `status=5` 对兽医模块 | 非法或映射为空；列表筛选项无「已预约」 |
| ZCZX-WDYYYS-UT-006 | 状态展示 | 状态标签解析 | 单元测试 | JUnit5 | §6.1 | 无 | `resolveLabel(0)`～`resolveLabel(4)` | 待确认/已确认/已拒绝/已取消/已完成 |
| ZCZX-WDYYYS-UT-007 | 范围解析 | 当前兽医 ID | 单元测试 | JUnit5+Mockito | §2.2、技术方案 §2.4 | Mock 用户 A；库有 R1 | `resolveProviderId(userId)` | 返回 R1.id |
| ZCZX-WDYYYS-UT-008 | 范围解析 | 未绑定兽医 | 单元测试 | JUnit5+Mockito | §9 | 用户无 `biz_medical_resource` 绑定 | `resolveProviderId` | 返回 null 或 Optional.empty |
| ZCZX-WDYYYS-UT-009 | Service | 列表 scope | 单元测试 | JUnit5+Mockito | §6.1 | Mock Mapper；有 A0、AX | `selectList` 账号 A | 查询条件含 `provider_type=1`、`provider_id=R1`；仅 A0 等 R1 记录 |
| ZCZX-WDYYYS-UT-010 | Service | 确认成功 | 单元测试 | JUnit5+Mockito | §6.3 | Mock A0（status=0） | `confirm(id)` | `status=1`；`confirm_time` 非空 |
| ZCZX-WDYYYS-UT-011 | Service | 拒绝成功 | 单元测试 | JUnit5+Mockito | §6.4 | Mock A0 | `reject(id, reason)` | `status=2`；`reject_reason`、`reject_time` 写入 |
| ZCZX-WDYYYS-UT-012 | Service | 非待确认确认 | 单元测试 | JUnit5+Mockito | §6.3、§4.3 | Mock A1 | `confirm` | 抛错；msg「当前状态不允许确认接诊」 |
| ZCZX-WDYYYS-UT-013 | Service | 非待确认拒绝 | 单元测试 | JUnit5+Mockito | §6.4 | Mock A3 | `reject` | 抛错；msg「当前状态不允许拒绝接诊」 |
| ZCZX-WDYYYS-UT-014 | Service | 越权-他兽医记录 | 单元测试 | JUnit5+Mockito | §2.2 | 账号 A；目标 AX（R2） | `getById`/`confirm` | 失败；msg「无权操作该预约记录」 |
| ZCZX-WDYYYS-UT-015 | Service | 未绑定无法操作 | 单元测试 | JUnit5+Mockito | §9 | 无 R1 绑定 | `confirm`/`reject` | 失败；msg「未绑定兽医资源，无法操作」 |
| ZCZX-WDYYYS-UT-016 | Service | 幂等-重复确认 | 单元测试 | JUnit5+Mockito | §4.3 | A0 已确认后再次 `confirm` | 第二次调用 | 失败；状态不允许 |
| ZCZX-WDYYYS-UT-017 | Service | 并发-已取消后确认 | 单元测试 | JUnit5+Mockito | §4.3、§9 | Mock 读库 status=3 | `confirm` | 失败；msg 含已取消或状态不允许 |
| ZCZX-WDYYYS-UT-018 | Mapper | 列表 SQL | 单元测试 | JUnit5 | §6.1、技术方案 §3.2 | 审阅 XML | 检查 `selectList` | `provider_type=1`；`provider_id=`；姓名 LIKE；日期区间；`status=`；`ORDER BY appoint_date DESC, create_time DESC` |
| ZCZX-WDYYYS-UT-019 | Mapper | 更新确认/拒绝 | 单元测试 | JUnit5 | §6.3～6.4 | 审阅 XML | `updateConfirm`/`updateReject` | 按 id+provider 条件更新；不写 `provider_id` 来自前端 |
| ZCZX-WDYYYS-UT-020 | Service | 完成接诊成功 | 单元测试 | JUnit5+Mockito | §6.5 | Mock A1 | `complete(id)` | `status=4`；`update_by` 写入 |
| ZCZX-WDYYYS-UT-021 | Service | 非已确认不可完成 | 单元测试 | JUnit5+Mockito | §6.5 | Mock A0 | `complete` | 失败；msg「当前状态不允许完成接诊」 |
| ZCZX-WDYYYS-UT-022 | Mapper | 完成接诊 SQL | 单元测试 | JUnit5 | 技术方案 §3.2 | 审阅 XML | `updateCompleteVetAppointment` | `provider_type=1`；`status=1`→`4` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-WDYYYS-API-001 | 列表 | 默认分页排序 | 接口测试 | Postman | §6.1 | 账号 A；有多条 R1 样本 | `GET /list` | `code=200`；`rows`≤20；`appoint_date` 倒序 |
| ZCZX-WDYYYS-API-002 | 列表 | 预约人模糊 | 接口测试 | Postman | §6.1 | A0 预约人含「扎西」 | `appointeeName=扎` | 含 A0；不含无关人 |
| ZCZX-WDYYYS-API-003 | 列表 | 预约日期区间 | 接口测试 | Postman | §6.1 | 样本日期已知 | `startDate`、`endDate` 含 A0 当天 | 含 A0；边界日包含 |
| ZCZX-WDYYYS-API-004 | 列表 | 状态精确筛选 | 接口测试 | Postman | §6.1 | 有 A2 已拒绝 | `status=2` | 均为已拒绝 |
| ZCZX-WDYYYS-API-005 | 列表 | 日期区间非法 | 接口测试 | Postman | §9 | 已登录 | `startDate` 晚于 `endDate` | `code≠200`；msg「结束日期不能早于开始日期」 |
| ZCZX-WDYYYS-API-006 | 列表 | 数据隔离-他兽医 | 接口测试 | Postman | §2.2 | 有 AX | 账号 A `GET /list` | 无 AX |
| ZCZX-WDYYYS-API-007 | 列表 | 数据隔离-机构/专家 | 接口测试 | Postman | §3.5 | 有 O1、E1 | 账号 A `GET /list` | 无 O1、E1 |
| ZCZX-WDYYYS-API-008 | 列表 | 未绑定兽医 | 接口测试 | Postman | §9 | 无绑定账号登录 | `GET /list` | 空列表或 msg「未绑定兽医资源，无法查询预约」 |
| ZCZX-WDYYYS-API-009 | 列表 | 禁止传 providerId | 接口测试 | Postman | 技术方案 §4.1 | 已登录 | `GET /list?providerId=伪造` | 仍以服务端 R1 为准；不可查他兽医数据 |
| ZCZX-WDYYYS-API-010 | 列表 | 状态 5 非法 | 接口测试 | Postman | §4.1 | 已登录 | `status=5` | 参数错误或空结果（以实现为准） |
| ZCZX-WDYYYS-API-011 | 详情 | 有效 id | 接口测试 | Postman | §6.2 | 有 A0 | `GET /{id}` | 含时段、地址、需求、`statusLabel` |
| ZCZX-WDYYYS-API-012 | 详情 | 已拒绝含理由 | 接口测试 | Postman | §6.2 | 有 A2 | `GET /{A2.id}` | `rejectReason` 非空 |
| ZCZX-WDYYYS-API-013 | 详情 | 已完成无评价字段 | 接口测试 | Postman | §3.3 | 有 A4 | `GET /{A4.id}` | 无星级/综合评价；无 `reviewList` 数据 |
| ZCZX-WDYYYS-API-014 | 详情 | 越权 id | 接口测试 | Postman | §2.2 | 有 AX | 账号 A `GET /{AX.id}` | 失败或无权 |
| ZCZX-WDYYYS-API-015 | 确认 | 待确认成功 | 接口测试 | Postman | §6.3 | 新建或 A0 | `POST /confirm/{id}` | `code=200`；库 `status=1` |
| ZCZX-WDYYYS-API-016 | 确认 | 已确认禁止 | 接口测试 | Postman | §6.3、§7 | 有 A1 | `POST /confirm/{A1.id}` | 失败；msg 不允许确认 |
| ZCZX-WDYYYS-API-017 | 确认 | 已取消禁止 | 接口测试 | Postman | §4.3、§9 | 有 A3 | `POST /confirm/{A3.id}` | 失败；msg 含取消或不允许 |
| ZCZX-WDYYYS-API-018 | 确认 | 幂等重复 | 接口测试 | Postman | §4.3 | A0 已确认 | 再次 `confirm` | 失败 |
| ZCZX-WDYYYS-API-019 | 拒绝 | 合法理由 | 接口测试 | Postman | §6.4 | 待确认新行 | `POST /reject/{id}` Body 合法 | `code=200`；`status=2`；理由落库 |
| ZCZX-WDYYYS-API-020 | 拒绝 | 理由为空 | 接口测试 | Postman | §6.4 | 待确认行 | Body `{}` 或 `rejectReason=""` | 失败；请填写拒绝理由 |
| ZCZX-WDYYYS-API-021 | 拒绝 | 理由超长 | 接口测试 | Postman | §6.4 | 待确认行 | 101 字 | 失败；不能超过 100 字 |
| ZCZX-WDYYYS-API-022 | 拒绝 | 非待确认 | 接口测试 | Postman | §6.4 | 有 A1 | `POST /reject/{A1.id}` | 失败；不允许拒绝 |
| ZCZX-WDYYYS-API-023 | 拒绝 | 越权 id | 接口测试 | Postman | §2.2 | 有 AX | 账号 A `reject` AX | 失败；无权 |
| ZCZX-WDYYYS-API-024 | 端到端 | 确认主流程 | 接口测试 | Postman | §8.1 | 新待确认行 | `list`→`GET`→`confirm`→`list` | 状态变已确认；操作列有完成接诊 |
| ZCZX-WDYYYS-API-033 | 完成接诊 | 已确认成功 | 接口测试 | Postman | §6.5 | 有 A1 | `POST /complete/{A1.id}` | `code=200`；库 `status=4` |
| ZCZX-WDYYYS-API-034 | 完成接诊 | 待确认禁止 | 接口测试 | Postman | §6.5 | 有 A0 | `POST /complete/{A0.id}` | 失败；不允许完成接诊 |
| ZCZX-WDYYYS-API-035 | 完成接诊 | 已取消禁止 | 接口测试 | Postman | §6.5 | 有 A3 | `POST /complete/{A3.id}` | 失败；含已取消或不允许 |
| ZCZX-WDYYYS-API-036 | 列表 | canComplete 字段 | 接口测试 | Postman | §6.1 | 有 A0、A1 | `GET /list` | A1 行 `canComplete=true`；A0 为 false |
| ZCZX-WDYYYS-API-037 | 权限 | 无 complete 权限 | 接口测试 | Postman | §7 | 无 complete | `POST /complete/{id}` | 无权限失败 |
| ZCZX-WDYYYS-API-038 | 端到端 | 完成接诊主流程 | 接口测试 | Postman | §8.1 | A1 | `complete`→`list` | 状态已完成；仅查看 |
| ZCZX-WDYYYS-API-025 | 端到端 | 拒绝主流程 | 接口测试 | Postman | §8.1 | 新待确认行 | `reject`→`GET`→`list` | 已拒绝；列表/详情可见拒绝理由 |
| ZCZX-WDYYYS-API-026 | 端到端 | 筛选组合 | 接口测试 | Postman | §6.1 | 多样本 | `appointeeName`+日期+`status=0` | 结果同时满足 |
| ZCZX-WDYYYS-API-027 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list` | 401 或未登录 |
| ZCZX-WDYYYS-API-028 | 权限 | 无 list 权限 | 接口测试 | Postman | §7 | 无 list 角色 | `GET /list` | 无权限失败 |
| ZCZX-WDYYYS-API-029 | 权限 | 无 confirm 权限 | 接口测试 | Postman | §7 | 仅 list/query | `POST /confirm/{id}` | 无权限失败 |
| ZCZX-WDYYYS-API-030 | 权限 | 无 reject 权限 | 接口测试 | Postman | §7 | 仅 list/query | `POST /reject/{id}` | 无权限失败 |
| ZCZX-WDYYYS-API-031 | 本期范围 | 无评价接口 | 接口测试 | Postman | §5.2、§3.3 | 有 A4 | `GET .../reviewList/{id}` 等 | 404 或未实现 |
| ZCZX-WDYYYS-API-032 | 响应 | 失败 msg 可读 | 接口测试 | Postman | §9 | 已登录 | 触发越权、非待确认、空理由 | `msg` 与 §9 语义一致 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-WDYYYS-UI-001 | 列表 | 页面与列展示 | UI 测试 | Playwright+Chrome | §6.1 | 账号 A 登录；有样本 | 进入「我的预约（兽医）」 | 列含预约人、日期、时段、电话、地址、需求、状态、拒绝理由、操作 |
| ZCZX-WDYYYS-UI-002 | 列表 | 时段格式 | UI 测试 | Playwright+Chrome | §6.1 | 有 A0 | 查看时段列 | 展示 `HH:mm~HH:mm` |
| ZCZX-WDYYYS-UI-003 | 列表 | 预约人筛选 | UI 测试 | Playwright+Chrome | §6.1 | 有 A0 | 填预约人关键字→搜索 | 含匹配行 |
| ZCZX-WDYYYS-UI-004 | 列表 | 日期与状态筛选 | UI 测试 | Playwright+Chrome | §6.1 | 有 A2 | 选日期区间+状态「已拒绝」→搜索 | 仅已拒绝行 |
| ZCZX-WDYYYS-UI-005 | 列表 | 日期非法提示 | UI 测试 | Playwright+Chrome | §9 | 已登录 | 结束日期早于开始→搜索 | 提示「结束日期不能早于开始日期」；不发起错误请求或列表不变 |
| ZCZX-WDYYYS-UI-006 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §6.1 | 已筛选 | 搜索→点「重置」 | 条件清空；列表恢复 |
| ZCZX-WDYYYS-UI-007 | 列表 | 默认分页 | UI 测试 | Playwright+Chrome | §6.1 | >20 条 R1 数据 | 进入列表 | 每页 20 条；可翻页 |
| ZCZX-WDYYYS-UI-008 | 操作列 | 待确认按钮集 | UI 测试 | Playwright+Chrome | §7 | 有 A0 | 查看 A0 操作列 | 有查看、确认接诊、拒绝接诊 |
| ZCZX-WDYYYS-UI-009 | 操作列 | 已确认可完成接诊 | UI 测试 | Playwright+Chrome | §7 | 有 A1 | 查看 A1 操作列 | 有查看、完成接诊；无确认/拒绝 |
| ZCZX-WDYYYS-UI-009a | 操作列 | 已取消/已完成仅查看 | UI 测试 | Playwright+Chrome | §7 | 有 A3/A4 | 查看操作列 | 仅有「查看」 |
| ZCZX-WDYYYS-UI-010 | 操作列 | 已拒绝展示理由 | UI 测试 | Playwright+Chrome | §6.1 | 有 A2 | 查看 A2 行 | 拒绝理由列有内容；非「—」 |
| ZCZX-WDYYYS-UI-011 | 详情 | 只读弹窗全字段 | UI 测试 | Playwright+Chrome | §6.2 | 有 A0 | 点击查看 | 弹窗含预约人、日期、时段、电话、地址、需求、状态；只读 |
| ZCZX-WDYYYS-UI-012 | 详情 | 已拒绝显示理由 | UI 测试 | Playwright+Chrome | §6.2 | 有 A2 | 查看 A2 详情 | 展示拒绝理由 |
| ZCZX-WDYYYS-UI-013 | 详情 | 已完成无评价区 | UI 测试 | Playwright+Chrome | §3.3、§5.2 | 有 A4 | 查看 A4 详情 | 无星级、综合评价、查看评价按钮 |
| ZCZX-WDYYYS-UI-014 | 确认 | 二次确认成功 | UI 测试 | Playwright+Chrome | §6.3 | 有 A0 | 确认接诊→确认框「确定」 | 成功提示；状态变已确认；按钮仅剩查看 |
| ZCZX-WDYYYS-UI-015 | 确认 | 取消二次确认 | UI 测试 | Playwright+Chrome | §6.3 | 有 A0 | 确认接诊→取消 | 状态仍为待确认 |
| ZCZX-WDYYYS-UI-016 | 拒绝 | 理由必填校验 | UI 测试 | Playwright+Chrome | §6.4 | 有 A0 | 拒绝接诊→留空→确定 | 提示请填写；不提交 |
| ZCZX-WDYYYS-UI-017 | 拒绝 | 理由超长校验 | UI 测试 | Playwright+Chrome | §6.4 | 有 A0 | 输入 101 字→确定 | 前端或提交后提示超长 |
| ZCZX-WDYYYS-UI-018 | 拒绝 | 合法提交成功 | UI 测试 | Playwright+Chrome | §6.4 | 新待确认行 | 填 1～100 字理由→确定 | 成功；状态已拒绝；列表可见理由 |
| ZCZX-WDYYYS-UI-019 | 拒绝 | 关闭弹窗不变态 | UI 测试 | Playwright+Chrome | §6.4 | 有 A0 | 打开拒绝弹窗→取消/关闭 | 仍为待确认 |
| ZCZX-WDYYYS-UI-020 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §7 | 仅 list/query 角色 | 进入页面；待确认行 | 无确认/拒绝按钮或点击无权限 |
| ZCZX-WDYYYS-UI-021 | 范围 | 未绑定账号 | UI 测试 | Playwright+Chrome | §9 | 无兽医绑定账号 | 进入菜单或列表 | 无菜单或列表空；无报错崩溃 |
| ZCZX-WDYYYS-UI-023 | 完成接诊 | 二次确认成功 | UI 测试 | Playwright+Chrome | §6.5 | 有 A1 | 完成接诊→确定 | 成功提示；状态变已完成 |
| ZCZX-WDYYYS-UI-024 | 完成接诊 | 取消二次确认 | UI 测试 | Playwright+Chrome | §6.5 | 有 A1 | 完成接诊→取消 | 仍为已确认 |
| ZCZX-WDYYYS-UI-025 | 权限 | 无 complete 按钮 | UI 测试 | Playwright+Chrome | §7 | 无 complete 权限 | 已确认行 | 无完成接诊或点击无权限 |
| ZCZX-WDYYYS-UI-022 | 端到端 | 接单处置流程 | UI 集成 | Playwright+Chrome | §8.1 | 权限齐备 | 确认→完成接诊（或另条拒绝） | 状态与按钮符合矩阵 |

---

## 四、覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-009～011 | API-001～004、011～012、015、019、024～026 | UI-001～004、007～008、011～014、018、022 |
| 异常/校验 | UT-001～003 | API-005、010、020～021 | UI-005、016～017 |
| 状态机/操作矩阵 | UT-004～006、012～013、016～017、020～021 | API-016～018、022、033～035 | UI-008～010、014～015、019、023～024 |
| 完成接诊 | UT-004a、020～022 | API-033～038 | UI-009、023～025 |
| 数据范围/隔离 | UT-007～009、014 | API-006～009、014、023 | UI-021 |
| 拒绝理由约束 | UT-001～002 | API-019～021 | UI-016～019 |
| 权限/鉴权 | UT-015 | API-027～030 | UI-020 |
| 本期不做（评价） | — | API-013、031 | UI-013 |
| 三端数据隔离 | UT-009 | API-007 | — |

---

## 五、功能需求追溯

| 需求章节 | 要点 | 主要用例 |
| --- | --- | --- |
| §6.1 列表 | 范围、筛选、分页、排序、列 | API-001～010；UI-001～007 |
| §6.2 详情 | 只读、拒绝理由、无评价 | API-011～013；UI-011～013 |
| §6.3 确认 | 仅待确认 | UT-004、010、012；API-015～018；UI-014～015 |
| §6.4 拒绝 | 必填理由 1～100 字 | UT-001～002、011；API-019～023；UI-016～019 |
| §6.5 完成接诊 | 仅已确认→已完成 | UT-004a、020～022；API-033～038；UI-009、023～025 |
| §4.3 并发幂等 | 重复操作、已取消 | UT-016～017；API-017～018 |
| §2.2 数据范围 | 仅当前兽医 | UT-009、014；API-006～009、014、023；UI-021 |
| §3.3 不做评价 | 无评价入口/接口 | API-013、031；UI-013 |
| §7 权限 | 按钮级 | API-028～030、037；UI-020、025 |
| §9 提示 | 文案一致 | API-005、032；UI-005、016～017 |

---

## 六、Playwright 实施提示

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用兽医账号 A 登录态。  
- 路由：`page.goto('/diseaseTreatment/myAppointment/vet')`（以菜单 `component` 为准）。  
- 定位示例：`page.getByPlaceholder('请输入预约人')`；`page.getByRole('button', { name: '搜索' })`；`page.getByRole('button', { name: '确认接诊' })`；`page.getByRole('button', { name: '拒绝接诊' })`；`page.getByRole('button', { name: '完成接诊' })`；`page.getByLabel('拒绝理由')`。  
- 数据准备：先走「畜牧医疗资源管理」为 R1 分配账号，再向 `biz_service_appointment` 插入 `provider_type=1` 各状态样本（或通过移动端预约接口造数）。

---

## 七、修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 19、接口 32、UI 22；覆盖列表/详情/确认/拒绝、范围隔离、状态机、权限、本期不做评价；Playwright+Chrome |
| 1.1 | 增补完成接诊：UT-004a/020～022、API-033～038、UI-009/023～025；修正 Base Path；权限含 `complete` |
