# 我的预约（专家）— 测试用例

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

**通用前置（无特殊说明）**：专家账号 **C** 已通过「畜牧科技资源管理」为专家 **Z1**（`resource_type=1`、`account_assigned=1`、`sys_user_id=C`）分配账号并绑定角色 **101**；具备权限 `techService:expertMyAppointment:list|query|confirm|reject|complete|reviewList`。`biz_service_appointment` 宜预置：

| 样本 | 归属 | 状态 | 要点 |
| --- | --- | --- | --- |
| **E0** | Z1，`provider_type=3` | 待确认 `0` | 可操作确认/拒绝 |
| **E1** | Z1 | 已确认 `1` | 可操作完成接诊；`canComplete=true` |
| **E2** | Z1 | 已拒绝 `2` | `reject_reason` 非空 |
| **E3** | Z1 | 已取消 `3` | 无确认/拒绝 |
| **E4** | Z1 | 已完成 `4` | 有关联评价记录 |
| **E4n** | Z1 | 已完成 `4` | **无**评价（测空态） |
| **EX** | Z2（另一专家） | 待确认 `0` | 账号 C 不可见/不可操作 |
| **V0** | 兽医 `provider_type=1` | 待确认 `0` | 专家列表不可见 |
| **O1** | 机构 `provider_type=2` | 已预约 `5` | 专家列表不可见 |

**评价样本（`biz_service_appointment_review`，挂 E4）**：`reviewer_name=才让`、`punctuality_score=5`、`attitude_score=5`、`guidance_score=4`、`summary` 非空。

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

**界面（UI）测试**：**Playwright** + **Chromium**（`channel: 'chrome'` 使用本机 **Google Chrome**）；菜单示例「牧业养殖科技服务 → 我的预约（专家）」。

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-WDYYZJ-UT-001 | 参数校验 | 拒绝理由空/空白 | 单元测试 | JUnit5 | §6.4、§9 | 无 | `validateRejectReason(null)`、`""`、`"   "` | 失败；msg 含「请填写拒绝理由」 |
| ZCZX-WDYYZJ-UT-002 | 参数校验 | 拒绝理由长度 | 单元测试 | JUnit5 | §6.4 | 无 | 1 字、100 字、101 字（trim 后） | 1～100 通过；101 失败 |
| ZCZX-WDYYZJ-UT-003 | 参数校验 | 预约日期范围 | 单元测试 | JUnit5 | §6.1、§9 | 无 | `startDate` 晚于 `endDate`；相等；合法区间 | 前者失败；后两者通过 |
| ZCZX-WDYYZJ-UT-004 | 状态规则 | 可确认/可拒绝 | 单元测试 | JUnit5 | §4.1、§7 | 无 | `canConfirmOrReject(0～4)` | 仅 `status=0` 为 true |
| ZCZX-WDYYZJ-UT-004a | 状态规则 | 可完成接诊 | 单元测试 | JUnit5 | §6.5、§7 | 无 | `canCompleteVetOrExpert(0～4)` | 仅 `status=1` 为 true |
| ZCZX-WDYYZJ-UT-005 | 状态规则 | 专家合法状态集 | 单元测试 | JUnit5 | §4.1、技术方案 §2.2 | 无 | `status=5` 对专家模块 | 列表筛选非法；不出现「已预约」标签 |
| ZCZX-WDYYZJ-UT-006 | 状态展示 | 五态标签解析 | 单元测试 | JUnit5 | §6.1 | 无 | `resolveLabel(0～4)` | 待确认/已确认/已拒绝/已取消/已完成 |
| ZCZX-WDYYZJ-UT-007 | 范围解析 | 当前专家 ID | 单元测试 | JUnit5+Mockito | 技术方案 §2.4 | Mock 用户 C；库有 Z1 | `ExpertProviderResolver.resolveProviderId` | 返回 Z1.id |
| ZCZX-WDYYZJ-UT-008 | 范围解析 | 未绑定专家 | 单元测试 | JUnit5+Mockito | §9 | 无 `biz_tech_resource` 绑定 | `resolveProviderId` | 返回 null |
| ZCZX-WDYYZJ-UT-009 | Service | 列表 scope | 单元测试 | JUnit5+Mockito | §6.1 | Mock；有 E0、EX | `selectList` 账号 C | 含 `provider_type=3`、`provider_id=Z1`；无 EX |
| ZCZX-WDYYZJ-UT-010 | Service | 确认成功 | 单元测试 | JUnit5+Mockito | §6.3 | Mock E0 | `confirm` | `status=1`；`confirm_time` 非空 |
| ZCZX-WDYYZJ-UT-011 | Service | 拒绝成功 | 单元测试 | JUnit5+Mockito | §6.4 | Mock E0 | `reject(id, reason)` | `status=2`；理由与时间写入 |
| ZCZX-WDYYZJ-UT-012 | Service | 非待确认确认 | 单元测试 | JUnit5+Mockito | §6.3 | Mock E1 | `confirm` | 失败；不允许确认接诊 |
| ZCZX-WDYYZJ-UT-013 | Service | 已取消不可确认 | 单元测试 | JUnit5+Mockito | §4.3 | Mock E3 | `confirm` | 失败；msg 含已取消或不允许 |
| ZCZX-WDYYZJ-UT-014 | Service | 越权-他专家 | 单元测试 | JUnit5+Mockito | §2.2 | 目标 EX | `getById`/`confirm` | 失败；无权操作 |
| ZCZX-WDYYZJ-UT-015 | Service | 未绑定无法操作 | 单元测试 | JUnit5+Mockito | §9 | 无 Z1 绑定 | `confirm`/`reject` | 失败；未绑定专家资源 |
| ZCZX-WDYYZJ-UT-016 | Service | 详情已完成含评价 | 单元测试 | JUnit5+Mockito | §6.2 | Mock E4+评价 | `getById` | 含三维度分与 `summary` |
| ZCZX-WDYYZJ-UT-017 | Service | 详情已完成无评价 | 单元测试 | JUnit5+Mockito | §6.2、§10 | Mock E4n | `getById` | 无星级/综合评价或空 |
| ZCZX-WDYYZJ-UT-018 | Service | 评价列表 scope | 单元测试 | JUnit5+Mockito | §6.5 | E4 已完成；EX 预约 | `reviewList(E4.id)` | 仅 E4 评价；非已完成失败 |
| ZCZX-WDYYZJ-UT-019 | Service | 评价列表空 | 单元测试 | JUnit5+Mockito | §6.5 | E4n 无评价行 | `reviewList` | 空列表或友好提示，不抛未处理异常 |
| ZCZX-WDYYZJ-UT-020 | Mapper | 专家列表/更新 SQL | 单元测试 | JUnit5 | 技术方案 §3.3 | 审阅 XML | `selectExpert*`/`updateConfirm*`/`updateReject*`/`updateComplete*` | `provider_type=3`；完成 `status=1`→`4` |
| ZCZX-WDYYZJ-UT-022 | Service | 完成接诊成功 | 单元测试 | JUnit5+Mockito | §6.5 | Mock E1 | `complete` | `status=4` |
| ZCZX-WDYYZJ-UT-023 | Service | 待确认不可完成 | 单元测试 | JUnit5+Mockito | §6.5 | Mock E0 | `complete` | 失败；不允许完成接诊 |
| ZCZX-WDYYZJ-UT-021 | Mapper | 评价查询 SQL | 单元测试 | JUnit5 | 技术方案 §3.2 | 审阅 XML | `selectReviewByAppointmentId` | 按 `appointment_id`；含三维度与 `summary` |

---

## 二、接口测试用例

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

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-WDYYZJ-UI-001 | 列表 | 页面与完整列 | UI 测试 | Playwright+Chrome | §6.1 | 账号 C；有样本 | 进入「我的预约（专家）」 | 列含预约人、日期、时段、电话、地址、需求、状态、拒绝理由、操作 |
| ZCZX-WDYYZJ-UI-002 | 列表 | 时段格式 | UI 测试 | Playwright+Chrome | §6.1 | 有 E0 | 查看时段列 | `HH:mm~HH:mm` |
| ZCZX-WDYYZJ-UI-003 | 列表 | 预约人/日期/状态筛选 | UI 测试 | Playwright+Chrome | §6.1 | 有 E2 | 填条件→搜索 | 仅匹配行 |
| ZCZX-WDYYZJ-UI-004 | 列表 | 状态下拉五态 | UI 测试 | Playwright+Chrome | §4.1 | 已登录 | 打开状态下拉 | 待确认/已确认/已拒绝/已取消/已完成；**无**已预约 |
| ZCZX-WDYYZJ-UI-005 | 列表 | 日期非法提示 | UI 测试 | Playwright+Chrome | §9 | 已登录 | 结束早于开始→搜索 | 提示日期错误 |
| ZCZX-WDYYZJ-UI-006 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §6.1 | 已筛选 | 搜索→重置 | 条件清空 |
| ZCZX-WDYYZJ-UI-007 | 列表 | 默认分页 | UI 测试 | Playwright+Chrome | §6.1 | >20 条 | 进入列表 | 每页 20 条 |
| ZCZX-WDYYZJ-UI-008 | 操作列 | 待确认按钮集 | UI 测试 | Playwright+Chrome | §7 | 有 E0 | 查看操作列 | 查看、确认接诊、拒绝接诊 |
| ZCZX-WDYYZJ-UI-009 | 操作列 | 已确认可完成 | UI 测试 | Playwright+Chrome | §7 | 有 E1 | 查看操作列 | 有查看、完成接诊 |
| ZCZX-WDYYZJ-UI-009a | 操作列 | 已取消仅查看 | UI 测试 | Playwright+Chrome | §7 | E3 | 查看操作列 | 仅有「查看」 |
| ZCZX-WDYYZJ-UI-010 | 操作列 | 已完成含查看评价 | UI 测试 | Playwright+Chrome | §7 | 有 E4 | 查看 E4 操作列 | 有「查看」「查看评价」；无确认/拒绝 |
| ZCZX-WDYYZJ-UI-011 | 操作列 | 已拒绝展示理由 | UI 测试 | Playwright+Chrome | §6.1 | 有 E2 | 查看 E2 行 | 拒绝理由列有内容 |
| ZCZX-WDYYZJ-UI-012 | 详情 | 只读弹窗全字段 | UI 测试 | Playwright+Chrome | §6.2 | 有 E0 | 点击查看 | 基础字段只读；无评价区 |
| ZCZX-WDYYZJ-UI-013 | 详情 | 已拒绝显示理由 | UI 测试 | Playwright+Chrome | §6.2 | 有 E2 | 查看详情 | 展示拒绝理由 |
| ZCZX-WDYYZJ-UI-014 | 详情 | 已完成评价区 | UI 测试 | Playwright+Chrome | §6.2 | 有 E4 | 查看详情 | 展示三维度星与综合评价 |
| ZCZX-WDYYZJ-UI-015 | 详情 | 已完成无评价空态 | UI 测试 | Playwright+Chrome | §10 | 有 E4n | 查看详情 | 「暂无评价」或等价；无补评按钮 |
| ZCZX-WDYYZJ-UI-016 | 确认 | 二次确认成功 | UI 测试 | Playwright+Chrome | §6.3 | 有 E0 | 确认接诊→确定 | 成功提示；状态已确认 |
| ZCZX-WDYYZJ-UI-017 | 确认 | 取消二次确认 | UI 测试 | Playwright+Chrome | §6.3 | 有 E0 | 确认→取消 | 仍为待确认 |
| ZCZX-WDYYZJ-UI-018 | 拒绝 | 理由必填与超长 | UI 测试 | Playwright+Chrome | §6.4 | 有 E0 | 空理由提交；101 字提交 | 前端或提交后提示 |
| ZCZX-WDYYZJ-UI-019 | 拒绝 | 合法提交成功 | UI 测试 | Playwright+Chrome | §6.4 | 待确认行 | 填 1～100 字→确定 | 已拒绝；列表可见理由 |
| ZCZX-WDYYZJ-UI-020 | 评价 | 查看评价弹窗 | UI 测试 | Playwright+Chrome | §6.5 | 有 E4 | 点击查看评价 | 列表含评价人、评价时间、综合评价 |
| ZCZX-WDYYZJ-UI-021 | 评价 | 无评价空态 | UI 测试 | Playwright+Chrome | §6.5 | 有 E4n | 点击查看评价 | 「暂无评价」；不崩溃 |
| ZCZX-WDYYZJ-UI-022 | 评价 | 非已完成无入口 | UI 测试 | Playwright+Chrome | §7 | 有 E0 | 查看操作列 | 无「查看评价」 |
| ZCZX-WDYYZJ-UI-023 | 权限 | 只读/缺按钮角色 | UI 测试 | Playwright+Chrome | §7 | 仅 list/query | 待确认行 | 无确认/拒绝或点击无权限 |
| ZCZX-WDYYZJ-UI-024 | 范围 | 未绑定账号 | UI 测试 | Playwright+Chrome | §9 | 无专家绑定 | 进入菜单 | 无菜单或列表空 |
| ZCZX-WDYYZJ-UI-026 | 完成接诊 | 成功 | UI 测试 | Playwright+Chrome | §6.5 | 有 E1 | 完成接诊→确定 | 状态已完成 |
| ZCZX-WDYYZJ-UI-027 | 权限 | 无 complete | UI 测试 | Playwright+Chrome | §7 | 无 complete | E1 行 | 无完成接诊按钮 |
| ZCZX-WDYYZJ-UI-025 | 端到端 | 接单+完成+评价 | UI 集成 | Playwright+Chrome | §8.1 | 权限齐备 | 确认→完成接诊→查评价 | 状态与按钮符合矩阵 |

---

## 四、覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-009～011、016～018 | API-001～004、011～013、016、020、025～032 | UI-001～004、007～010、012～016、019～020、025 |
| 异常/校验 | UT-001～003 | API-005～006、021～022 | UI-005、018 |
| 状态机/操作矩阵 | UT-004～006、012～013、022～023 | API-017～019、023、027、039～040 | UI-008～009、009a、026 |
| 完成接诊 | UT-004a、022～023 | API-039～042 | UI-009、026～027 |
| 数据范围/隔离 | UT-007～009、014 | API-007～010、015、024、028 | UI-024 |
| 拒绝理由 | UT-001～002 | API-020～024 | UI-018～019 |
| 评价（专家独有） | UT-016～019、021 | API-013～014、025～029 | UI-010、014～015、020～022 |
| 权限/鉴权 | UT-015 | API-034～037 | UI-023 |
| 与兽医差异 | UT-005 | API-029 | UI-010、014（兽医无） |
| 与机构差异 | UT-005 | API-008 | UI-004（无已预约） |

---

## 五、功能需求追溯

| 需求章节 | 要点 | 主要用例 |
| --- | --- | --- |
| §6.1 列表 | 范围、筛选、完整列 | API-001～010；UI-001～007 |
| §6.2 详情 | 只读、拒绝理由、已完成评价区 | API-011～014；UI-012～015 |
| §6.3 确认 | 仅待确认 | UT-010、012；API-016～019；UI-016～017 |
| §6.4 拒绝 | 理由 1～100 字 | UT-001～002、011；API-020～024；UI-018～019 |
| §6.5 完成接诊 | 仅已确认→已完成 | UT-004a、022～023；API-039～042；UI-009、026～027 |
| §6.5 查看评价 | 仅已完成、三列列表 | UT-018～019；API-025～028；UI-020～022 |
| §4.3 并发幂等 | 重复操作、已取消 | API-018～019 | UI-017 |
| §2.2 数据范围 | 仅当前专家 | UT-009、014；API-007～010、015；UI-024 |
| §5.2 不做代评 | 无写评价接口 | API-029 | — |
| §7 权限 | 六类按钮含 complete | API-035～037、041；UI-023、027 |
| §9 提示 | 文案一致 | API-005、038；UI-005、018、021 |

---

## 六、Playwright 实施提示

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用专家账号 C 登录态。  
- 路由：`page.goto('/techService/myAppointment/expert')`（以菜单 `component` 为准）。  
- 定位示例：`page.getByPlaceholder('请输入预约人')`；`page.getByRole('button', { name: '确认接诊' })`；`page.getByRole('button', { name: '拒绝接诊' })`；`page.getByRole('button', { name: '完成接诊' })`；`page.getByRole('button', { name: '查看评价' })`。  
- 数据准备：「畜牧科技资源管理」为 Z1 分配账号；插入 `provider_type=3` 各状态样本；E4 配套 `biz_service_appointment_review` 行。

---

## 七、修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 21、接口 38、UI 25；覆盖列表/详情/确认/拒绝/评价、五态、三端隔离、与兽医/机构差异；Playwright+Chrome |
| 1.1 | 增补完成接诊 UT/API/UI；权限含 `complete`；修正 Base Path |
