# 畜牧医疗资源管理 — 测试用例

> 依据：`畜牧医疗资源管理功能需求.md`、`畜牧医疗资源管理技术方案.md`  
> **接口 Base Path**：`/diseaseTreatments/medicalResource`；鉴权与若依一致（Cookie / Token）。

**通用前置（无特殊说明）**：具备本模块全套权限的账号已登录（`diseaseTreatment:medicalResource:list|query|add|edit|remove|publish|offline|assignAccount`）。`biz_medical_resource` 宜预置（`del_flag=0`）：

| 样本 | 类型编码 | 名称 | 发布态要点 |
| --- | --- | --- | --- |
| **V1** | `004001` 兽医 | 张兽医 | 未发布；未分配账号 |
| **V2** | `004001` 兽医 | 李兽医 | 已发布 |
| **T1** | `004002` 团队 | 牧业专家组 | 未发布 |
| **O1** | `004003` 机构 | 县动物医院 | 已发布 |
| **O2** | `004003` 机构 | 乡镇诊所 | 已下架（`offline_time` 非空） |
| **E1** | `004004` 设备 | B超仪01 | 未发布 |

**兽医合法 Body 片段**：`resourceType=004001`，`resourceName=测试兽医`，`introduction=简介`，`contactPhone=13800138000`，`affiliatedUnit=县畜牧局`，`detailAddress=某某路1号`，`consultModes=[1,2]`，`serviceArea=全县`，`feeStandard=100`，`serviceStartTime=08:00`，`serviceEndTime=18:00`，`serviceWeekdays=[1,2,3,4,5]`，`photoFileUrl`/`photoFilePath` 来自上传接口（**不含** `maxDailyAppointments`）。

**机构合法 Body 片段**（`resourceType=004003`）：`resourceName`、`orgLevel` 必填；`personInCharge`、`maxDailyAppointments`、照片/介绍/地址/手机/服务时段等为选填。

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

---

## 一、单元测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-XMZYGL-UT-001 | 参数校验 | 兽医服务时段 | 单元测试 | JUnit5 | §5.4 | 无 | 结束早于开始；相等；合法 | 前两种失败；`08:00`～`18:00` 通过 |
| ZCZX-XMZYGL-UT-002 | 参数校验 | 手机号 | 单元测试 | JUnit5 | §5.2 | 无 | 非法号、合法 11 位 | 非法失败；`13800138000` 通过 |
| ZCZX-XMZYGL-UT-003 | 参数校验 | 名称/介绍长度 | 单元测试 | JUnit5 | §5.4～5.7 | 无 | 名称 0/11 字；介绍 501 字 | 超限失败；1～10/500 通过 |
| ZCZX-XMZYGL-UT-004 | 参数校验 | 收费标准 | 单元测试 | JUnit5 | §5.4 | 无 | 0、负数、正数 | 非正数失败；`100` 通过 |
| ZCZX-XMZYGL-UT-005 | 参数校验 | 接诊方式/服务周日 | 单元测试 | JUnit5 | §5.4 | 无 | 接诊方式空数组失败；`required=false` 时服务周日空通过 | 与必填开关一致 |
| ZCZX-XMZYGL-UT-005a | 参数校验 | 兽医资料选填 | 单元测试 | JUnit5 | §5.4 | 无 | 无照片/介绍/手机/单位/地址/服务区域/收费，保留接诊等必填 | 通过 |
| ZCZX-XMZYGL-UT-005c | 参数校验 | 兽医收费选填 | 单元测试 | JUnit5 | §5.4 | `feeStandard=null` | `validateRowForSave` | 通过；填 0 仍失败 |
| ZCZX-XMZYGL-UT-005b | 参数校验 | 兽医手机格式 | 单元测试 | JUnit5 | §5.4 | 填非法手机 | `validateRowForSave` | 失败 |
| ZCZX-XMZYGL-UT-006 | 参数校验 | 团队成立时间 | 单元测试 | JUnit5 | §5.5 | 无 | 未来日期；合法过去日期 | 未来失败（若填写）；未填通过 |
| ZCZX-XMZYGL-UT-006b | 参数校验 | 团队资料选填 | 单元测试 | JUnit5 | §5.5 | 无 | 仅团队名称，其余资料字段空 | 通过 |
| ZCZX-XMZYGL-UT-006c | 参数校验 | 机构资料选填 | 单元测试 | JUnit5 | §5.6 | 无 | 机构名称+机构级别；其余资料字段空 | 通过 |
| ZCZX-XMZYGL-UT-006d | 参数校验 | 机构单日接诊 | 单元测试 | JUnit5 | §5.6 | 无 | 填 0 或负数 | 失败；正整数或未填通过 |
| ZCZX-XMZYGL-UT-006e | 参数校验 | 设备资料选填 | 单元测试 | JUnit5 | §5.7 | 无 | 仅设备名称，照片/介绍/型号/隶属单位空 | 通过 |
| ZCZX-XMZYGL-UT-006f | 参数校验 | 设备型号长度 | 单元测试 | JUnit5 | §5.7 | 无 | 型号 11 字 | 失败 |
| ZCZX-XMZYGL-UT-007 | 参数校验 | 类型字段矩阵 | 单元测试 | JUnit5 | §5.3、§2.1 | 无 | 设备行带 `contactPhone`；兽医缺 `feeStandard` | 设备校验不要求手机；兽医缺收费失败 |
| ZCZX-XMZYGL-UT-007a | 参数校验 | 兽医单日接诊 | 单元测试 | JUnit5 | §5.3、草稿 §2 | 无 | 合法兽医不传 `maxDailyAppointments`；传入 20 后 `validateRowForSave` | 均通过；后者保存对象 `maxDailyAppointments` 为 `null` |
| ZCZX-XMZYGL-UT-008 | 参数校验 | 照片路径 | 单元测试 | JUnit5 | §5.2 | 无 | 非 `/profile` 前缀；jpg 路径 | 非法路径失败；合法通过 |
| ZCZX-XMZYGL-UT-009 | 发布态 | 已发布不可改 | 单元测试 | JUnit5 | §5.8、§6 | `publish_status=1` | `validateForUpdate` | 失败 |
| ZCZX-XMZYGL-UT-010 | 发布态 | 仅已发布可下架 | 单元测试 | JUnit5 | §5.11 | 未发布/已发布 | `validateOffline` | 仅 `publish_status=1` 通过 |
| ZCZX-XMZYGL-UT-011 | 发布态 | 三态解析 | 单元测试 | JUnit5 | §2.1 | 三组库记录 | 解析界面状态 | 未发布/已发布/已下架 与 `offline_time` 一致 |
| ZCZX-XMZYGL-UT-012 | 分配账号 | 类型与次数 | 单元测试 | JUnit5 | §5.12 | 团队 type=2；已分配 | `validateAssignAccount` | 团队失败；已分配失败 |
| ZCZX-XMZYGL-UT-013 | Service | 新增落库 | 单元测试 | JUnit5+Mockito | §5.2 | Mock Mapper | `insert` 合法兽医 | `publish_status=0`；`offline_time` 空；`account_assigned=0` |
| ZCZX-XMZYGL-UT-014 | Service | 发布 | 单元测试 | JUnit5+Mockito | §5.11 | 未发布 V1 | `publish(id)` | `publish_status=1`；`publish_time` 非空 |
| ZCZX-XMZYGL-UT-015 | Service | 下架保留发布时间 | 单元测试 | JUnit5+Mockito | §5.11 | 已发布 V2 | `offline(id)` | `publish_status=0`；`offline_time` 非空；`publish_time` 保留 |
| ZCZX-XMZYGL-UT-016 | Service | 逻辑删除 | 单元测试 | JUnit5+Mockito | §5.10 | 未发布 | `remove(id)` | `del_flag=2` |
| ZCZX-XMZYGL-UT-017 | Service | 删除有关联 | 单元测试 | JUnit5+Mockito | §2.5 | `hasReference=true` | `remove` | 抛 `ServiceException` |
| ZCZX-XMZYGL-UT-018 | Service | 分配账号成功 | 单元测试 | JUnit5+Mockito | §5.12 | 未发布兽医；Mock 用户服务 | `assignAccount(id)` | `account_assigned=1`；写 `sys_user_id`；绑定角色 **100** |
| ZCZX-XMZYGL-UT-019 | Service | 删除联动删账号 | 单元测试 | JUnit5+Mockito | §5.10、草稿 §10 | 未发布已分配；`sys_user_id=88` | `deleteByIds` | 调用 `deleteLinkedAccount`；`del_flag=2` |
| ZCZX-XMZYGL-UT-020 | 分配账号 | 机构角色 102 | 单元测试 | JUnit5 | §5.12、草稿 §11 | 无 | `defaultRoleId('004003')` | 返回 **102** |
| ZCZX-XMZYGL-UT-021 | Mapper | 列表筛选 SQL | 单元测试 | JUnit5 | §3.1 | 无 | 检查 XML | `del_flag=0`；`resource_type=`；`resource_name LIKE`；`create_time DESC` |
| ZCZX-XMZYGL-UT-022 | Mapper | 发布态筛选 | 单元测试 | JUnit5 | §2.1 | 无 | `publishStatus=2` 条件 | 含 `offline_time IS NOT NULL` |

---

## 二、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-XMZYGL-API-001 | 列表 | 默认分页 | 接口测试 | Postman | §5.1 | 有多条样本 | `GET /list?resourceType=004001` | `code=200`；`rows`≤20；`create_time` 倒序 |
| ZCZX-XMZYGL-API-002 | 列表 | 名称模糊 | 接口测试 | Postman | §2.6 | 有 V1「张兽医」 | `resourceName=张` | 含 V1；全名「张兽医」亦命中 |
| ZCZX-XMZYGL-API-003 | 列表 | 发布状态筛选 | 接口测试 | Postman | §2.6 | 有 V2 已发布 | `publishStatus=1` | 仅已发布记录 |
| ZCZX-XMZYGL-API-004 | 列表 | 已下架筛选 | 接口测试 | Postman | §2.4 | 有 O2 | `publishStatus=2` | 含 O2 |
| ZCZX-XMZYGL-API-005 | 列表 | 不含已删除 | 接口测试 | Postman | §2.5 | 某 id 已删 | `GET /list` | 无该 id |
| ZCZX-XMZYGL-API-006 | 列表 | 缺 resourceType | 接口测试 | Postman | §3.1 | 已登录 | 不传 `resourceType` | 参数错误或空列表（以实现为准） |
| ZCZX-XMZYGL-API-007 | 新增 | 兽医全字段 | 接口测试 | Postman | §5.4 | 已登录；已上传照片 | `POST` 合法兽医 Body | `code=200`；`publishStatus` 对应未发布 |
| ZCZX-XMZYGL-API-008 | 新增 | 专家团队 | 接口测试 | Postman | §5.5 | 已登录 | `POST` `resourceType=004002` 合法字段 | 成功；无兽医专属字段必填 |
| ZCZX-XMZYGL-API-009 | 新增 | 诊疗机构 | 接口测试 | Postman | §5.6 | 已登录 | `POST` `resourceType=004003`；机构名称+机构级别 | 成功；照片/介绍/服务时段等可省略 |
| ZCZX-XMZYGL-API-010 | 新增 | 医疗设备 | 接口测试 | Postman | §5.7 | 已登录 | `POST` `resourceType=004004`；仅设备名称 | 成功；照片/介绍/型号/隶属单位可省略 |
| ZCZX-XMZYGL-API-011 | 新增 | 手机号非法 | 接口测试 | Postman | §5.2 | 已登录 | `contactPhone=123` | `code≠200`；`msg` 含联系方式 |
| ZCZX-XMZYGL-API-012 | 新增 | 介绍仅空白 | 接口测试 | Postman | §5.2 | 已登录 | `introduction="   "` | 失败 |
| ZCZX-XMZYGL-API-013 | 新增 | 服务时段非法 | 接口测试 | Postman | §5.4 | 已登录 | `serviceEndTime` 早于 `serviceStartTime` | 失败 |
| ZCZX-XMZYGL-API-014 | 详情 | 有效 id | 接口测试 | Postman | §5.9 | 有 V1 | `GET /{id}` | 全字段；`consultModes` 为数组 |
| ZCZX-XMZYGL-API-015 | 详情 | 无效/已删 id | 接口测试 | Postman | 异常 | 已登录 | 不存在或已删 id | 失败或 `data` 空 |
| ZCZX-XMZYGL-API-016 | 修改 | 未发布改备注 | 接口测试 | Postman | §5.8 | 有 V1 | `PUT` 改 `introduction` | 成功；`resourceType` 不变 |
| ZCZX-XMZYGL-API-017 | 修改 | 已发布禁止 | 接口测试 | Postman | §5.8、§6 | 有 V2 已发布 | `PUT` 任意字段 | 失败；库不变 |
| ZCZX-XMZYGL-API-018 | 修改 | 改 resourceType 无效 | 接口测试 | Postman | §5.2 | 有 V1 | `PUT` 改 `resourceType=004003` | 失败或忽略；库仍为 `004001` |
| ZCZX-XMZYGL-API-019 | 发布 | 未发布发布 | 接口测试 | Postman | §5.11 | 有 V1 | `POST /publish/{id}` | `publish_status=1`；有 `publishTime` |
| ZCZX-XMZYGL-API-020 | 发布 | 重复发布 | 接口测试 | Postman | §5.11 | V2 已发布 | 再次 `publish` | 失败；「该资源已发布」 |
| ZCZX-XMZYGL-API-021 | 下架 | 已发布下架 | 接口测试 | Postman | §5.11 | 有 V2 | `POST /offline/{id}` | `publish_status=0`；`offline_time` 有值 |
| ZCZX-XMZYGL-API-022 | 下架 | 未发布不可下架 | 接口测试 | Postman | §5.11 | 有 V1 | `POST /offline/{id}` | 失败 |
| ZCZX-XMZYGL-API-023 | 删除 | 未发布逻辑删 | 接口测试 | Postman | §5.10 | 无关联新行 | `DELETE /{id}` | 成功；列表不可见 |
| ZCZX-XMZYGL-API-023a | 删除 | 已分配联动删账号 | 接口测试 | Postman | §5.10、草稿 §10 | 未发布兽医已 `assignAccount` | `DELETE /{id}` | 资源不可见；`sys_user` 对应用户已删 |
| ZCZX-XMZYGL-API-024 | 删除 | 已发布禁止 | 接口测试 | Postman | §5.10 | 有 V2 | `DELETE` | 失败 |
| ZCZX-XMZYGL-API-025 | 分配账号 | 兽医成功 | 接口测试 | Postman | §5.12 | V1 未分配 | `POST /assignAccount/{id}` | `accountAssigned=1`；登录名拼音+id；角色 **100** |
| ZCZX-XMZYGL-API-025a | 分配账号 | 机构成功 | 接口测试 | Postman | §5.12 | 未发布机构 | `POST /assignAccount/{id}` | `accountAssigned=1`；角色 **102** |
| ZCZX-XMZYGL-API-026 | 分配账号 | 重复分配 | 接口测试 | Postman | §5.12 | 已分配行 | 再次 `assignAccount` | 失败 |
| ZCZX-XMZYGL-API-027 | 分配账号 | 团队禁止 | 接口测试 | Postman | §5.12 | 有 T1 | `assignAccount` | 失败 |
| ZCZX-XMZYGL-API-028 | 分配账号 | 已发布禁止 | 接口测试 | Postman | §5.12 | 有 V2 | `assignAccount` | 失败 |
| ZCZX-XMZYGL-API-029 | 端到端 | 下架后编辑再发布 | 接口测试 | Postman | §4.2 | 有 O2 或新建机构 | `offline`→`PUT`→`publish` | 各步 `code=200`；最终已发布 |
| ZCZX-XMZYGL-API-030 | 端到端 | 全流程 | 接口测试 | Postman | §4 | 已登录 | `POST`→`list`→`GET`→`assignAccount`→`publish`→`offline`→`DELETE` | 关键步成功；删除前须下架 |
| ZCZX-XMZYGL-API-031 | 鉴权 | 未登录 | 接口测试 | curl | 安全 | 无 Token | `GET /list?resourceType=004001` | 401 或统一未登录 |
| ZCZX-XMZYGL-API-032 | 权限 | 无发布权限 | 接口测试 | Postman | §6 | 无 publish | `POST /publish/1` | 无权限失败 |
| ZCZX-XMZYGL-API-033 | 权限 | 无分配账号权限 | 接口测试 | Postman | §6 | 无 assignAccount | `POST /assignAccount/1` | 无权限失败 |
| ZCZX-XMZYGL-API-034 | 响应 | 失败可读 | 接口测试 | Postman | §8 | 已登录 | 触发已发布修改、重复分配 | `msg` 可区分场景 |

---

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

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

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ZCZX-XMZYGL-UI-001 | 列表 | 四 Tab 与列展示 | UI 测试 | Playwright+Chrome | §5.1、§2.3 | 已登录；有各类型数据 | 进入模块；切换四个 Tab | 每 Tab 仅本类型；列含名称、介绍摘要、发布状态、操作 |
| ZCZX-XMZYGL-UI-002 | 列表 | Tab 与下拉联动 | UI 测试 | Playwright+Chrome | §2.3 | 已登录 | 切换 Tab；改顶部资源类型下拉 | Tab 与下拉一致 |
| ZCZX-XMZYGL-UI-003 | 列表 | 名称模糊筛选 | UI 测试 | Playwright+Chrome | §2.6 | 有「张兽医」 | 填「张」→搜索 | 列表含匹配行 |
| ZCZX-XMZYGL-UI-004 | 列表 | 发布状态筛选 | UI 测试 | Playwright+Chrome | §2.6 | 有已发布样本 | 选「已发布」→搜索 | 仅已发布行 |
| ZCZX-XMZYGL-UI-005 | 列表 | 重置 | UI 测试 | Playwright+Chrome | §5.1 | 已筛选 | 搜索→重置 | 条件清空；列表恢复 |
| ZCZX-XMZYGL-UI-006 | 新增 | 动态表单-兽医 | UI 测试 | Playwright+Chrome | §5.4 | 有 add 权限 | 新增→选兽医→填必填→上传照片→确定 | 成功；列表未发布；含接诊方式等字段 |
| ZCZX-XMZYGL-UI-007 | 新增 | 动态表单-团队 | UI 测试 | Playwright+Chrome | §5.5 | 已登录 | 新增→选专家团队→填必填→确定 | 无接诊方式字段；成功 |
| ZCZX-XMZYGL-UI-008 | 新增 | 类型切换字段变化 | UI 测试 | Playwright+Chrome | §4.3 | 打开新增 | 选兽医→改选设备 | 表单字段集切换；无兽医专属项残留 |
| ZCZX-XMZYGL-UI-009 | 新增 | 必填校验 | UI 测试 | Playwright+Chrome | §5.2 | 新增弹窗 | 留空姓名→确定 | 校验失败；不关闭 |
| ZCZX-XMZYGL-UI-010 | 新增 | 照片格式/大小 | UI 测试 | Playwright+Chrome | §5.2 | 新增 | 上传非图或超 10MB（若可测） | 失败提示 |
| ZCZX-XMZYGL-UI-011 | 查看 | 只读详情 | UI 测试 | Playwright+Chrome | §5.9 | 任意行 | 点击查看 | 字段只读；含发布状态、审计信息 |
| ZCZX-XMZYGL-UI-012 | 操作列 | 未发布按钮集 | UI 测试 | Playwright+Chrome | §6 | 未发布行 | 查看操作列 | 有查看、编辑、删除、发布；兽医/机构有分配账号 |
| ZCZX-XMZYGL-UI-013 | 操作列 | 已发布按钮集 | UI 测试 | Playwright+Chrome | §6 | 已发布行 | 查看操作列 | 有查看、下架；无编辑、删除、分配账号 |
| ZCZX-XMZYGL-UI-014 | 编辑 | 未发布修改 | UI 测试 | Playwright+Chrome | §5.8 | 未发布行 | 编辑→改介绍→确定 | 列表已更新 |
| ZCZX-XMZYGL-UI-015 | 编辑 | 已发布不可进 | UI 测试 | Playwright+Chrome | §5.8 | 已发布行 | 尝试编辑 | 无编辑入口或提示先下架 |
| ZCZX-XMZYGL-UI-016 | 发布下架 | 发布确认 | UI 测试 | Playwright+Chrome | §5.11 | 未发布行 | 发布→确认 | 状态变已发布 |
| ZCZX-XMZYGL-UI-017 | 发布下架 | 下架确认 | UI 测试 | Playwright+Chrome | §5.11 | 已发布行 | 下架→确认 | 状态变已下架或未发布标签 |
| ZCZX-XMZYGL-UI-018 | 删除 | 确认删除 | UI 测试 | Playwright+Chrome | §5.10 | 未发布行 | 删除→确认 | 行消失；取消则不删 |
| ZCZX-XMZYGL-UI-018a | 删除 | 已分配联动删账号 | UI 测试 | Playwright+Chrome | §5.10、草稿 §10 | 未发布已分配兽医 | 删除→确认 | 列表无该行；该登录名不可再登录 |
| ZCZX-XMZYGL-UI-019 | 分配账号 | 兽医分配 | UI 测试 | Playwright+Chrome | §5.12 | 未发布未分配兽医 | 点分配账号→确认 | 成功提示；行显示已分配 |
| ZCZX-XMZYGL-UI-020 | 分配账号 | 团队无入口 | UI 测试 | Playwright+Chrome | §5.12 | 专家团队 Tab | 查看操作列 | 无分配账号 |
| ZCZX-XMZYGL-UI-021 | 地图标点 | 本期不展示 | UI 测试 | Playwright+Chrome | §5.13 | 机构/设备 Tab | 查看列表操作 | 无地图标点或置灰并说明 |
| ZCZX-XMZYGL-UI-022 | 权限 | 只读角色 | UI 测试 | Playwright+Chrome | §6 | 仅 list/query 角色 | 进入模块 | 无新增/编辑/删除/发布/下架/分配账号 |
| ZCZX-XMZYGL-UI-023 | 端到端 | 运营全流程 | UI 集成 | Playwright+Chrome | §4.2 | 权限齐备 | 新增机构→分配账号→发布→下架→编辑→再发布→删除 | 状态与按钮符合矩阵；无报错 |

---

## 四、覆盖对照

| 类别 | 单元 UT | 接口 API | 界面 UI |
| --- | --- | --- | --- |
| 正常流程 | UT-013～018 | API-007～010、016、019、023～030 | UI-006～011、014、016～019、023 |
| 异常/校验 | UT-001～008 | API-011～013、017～018、022～024 | UI-009～010、015 |
| 发布状态机 | UT-009～011 | API-003～004、019～022、029 | UI-004、012～017 |
| 分配账号 | UT-012、018 | API-025～028 | UI-019～020 |
| 四类资源 | UT-007 | API-007～010 | UI-006～008 |
| 列表筛选 | UT-019～020 | API-001～006 | UI-001～005 |
| 逻辑删除 | UT-016～017、019 | API-005、023～024、023a | UI-018、018a |
| 权限/鉴权 | — | API-031～033 | UI-022 |
| 地图标点（不做） | — | — | UI-021 |

---

## 五、功能需求追溯

| 需求章节 | 要点 | 主要用例 |
| --- | --- | --- |
| §5.1 列表 | Tab、模糊、发布状态筛选 | API-001～006；UI-001～005 |
| §5.2～5.7 新增/字段 | 四类表单、校验 | UT-001～008；API-007～013；UI-006～010 |
| §5.8 修改 | 仅未发布/已下架 | API-016～018；UI-014～015 |
| §5.9 查看 | 只读 | API-014～015；UI-011 |
| §5.10 删除 | 逻辑删 | UT-016～017；API-023～024；UI-018 |
| §5.11 发布下架 | 状态迁移 | UT-009～011、014～015；API-019～022、029；UI-016～017 |
| §5.12 分配账号 | 兽医/机构、一次 | UT-012、018；API-025～028；UI-019～020 |
| §5.13 地图标点 | 不做 | UI-021 |
| §6 权限 | 按钮级 | API-031～033；UI-022 |

---

## 六、Playwright 实施提示

- 安装：`npm i -D @playwright/test`；`npx playwright install chrome`。  
- 配置：`use: { channel: 'chrome', locale: 'zh-CN', baseURL: 'http://localhost:80' }`；`storageState` 复用登录态。  
- 路由：`page.goto('/diseaseTreatment/medicalResource')`（以菜单 `component` 为准）。  
- 定位示例：`page.getByRole('tab', { name: '兽医人员库' })`；`page.getByRole('button', { name: '新增' })`；`page.getByLabel('兽医姓名')`。

---

## 七、修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：单元 20、接口 34、UI 23；覆盖 CRUD、发布下架、分配账号、四类动态表单；Playwright+Chrome |
| 1.1 | 对齐草稿 §10/§11：删除联动删账号用例；分配角色 100/102 断言；UT/API/UI 编号顺延 |
