Files
xh-medical-sign-web/clinical-web/docs/documents-api-verification-2026-09-17.md
T

133 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 文档库管理 —— 真实接口验证报告
- 验证日期:2026-09-17
- 验证对象:`clinical-web` 文档库管理(`/management/documents`)
- 数据来源:MEDISIGN 后端 `https://ipad.shenynet.com`(真实接口,`VITE_MOCK_DOCUMENTS=false`)
- 验证方式:真实浏览器(Chrome headless + CDP)驱动真实页面,非静态审查
## 1. 结论
**文档库管理在真实接口下功能完整、闭环可用。**
从「新增文书」到「发布」再到「发起签署」的完整链路全部走通,
每一步后端均返回 200,页面运行时错误 0 条。
此前记录的「后端模板写接口作废(`POST /v1/templates` 稳定 500、列表恒 0 条)」**已不成立**,
写接口已恢复正常。
## 2. 只读功能验证
| 功能 | 结果 | 说明 |
|---|---|---|
| 列表加载 | 通过 | 真实模板正确渲染,科室三级分组(科室 → 分类 → 文书)正常 |
| 科室页签 | 通过 | 按实际科室归类,无科室的模板归入「未指定科室」 |
| 状态页签 | 通过 | 按后端原始状态过滤,`PENDING_REVIEW` 与 `REJECTED` 未合并 |
| 搜索 | 通过 | 按名称/编号/科室过滤正确 |
| 预览弹窗 | 通过 | **正文真实取回**(列表接口只给哈希,已正确补穿透版本详情) |
| 预览 - 签署预览页签 | 通过 | 占位符按演示患者填充,渲染正常 |
| 编辑弹窗 | 通过 | 名称/编号/说明/正文全部正确带出 |
| 新增弹窗 | 通过 | 空表单;院区取真实 UUID;版本号显示「由后端按 vN 自动生成」 |
| 加载态/错误态 | 通过 | 有独立加载态与错误态,未把失败降级成空态 |
## 3. 写操作与版本工作流验证
新建测试文书「【自动化测试】签署链路验证」(编号 `AUTO-TEST-800004`)后逐步执行:
| 步骤 | 卡片动作 | 后端接口 | 状态变化 |
|---|---|---|---|
| 1 | 保存文书 | `POST /v1/templates` + `POST /v1/templates/{id}/versions` | (新建)→ 草稿 |
| 2 | 提交审核 | `POST .../versions/{vid}/submit-review` | 草稿 → 待审核 |
| 3 | 驳回 | `POST .../versions/{vid}/reject` | 待审核 → 已驳回 |
| 4 | 重新提交 | `POST .../versions/{vid}/submit-review` | 已驳回 → 待审核 |
| 5 | 审核通过 | `POST .../versions/{vid}/approve` | 待审核 → 审核通过 |
| 6 | 发布 | `POST .../versions/{vid}/publish` | 审核通过 → 已发布 |
| 7 | 发起 | `GET .../versions/{vid}`(取真实正文) | 打开「新增签署任务」,模板已自动选中 |
驳回意见经 `reject` 的 `comment` 参数提交,用于留痕。
### 3.1 动作按钮文案随状态变化
前端按后端状态计算卡片主动作,文案**不是固定值**:
| 后端状态 | 卡片动作 |
|---|---|
| `DRAFT` | 提交审核 |
| `PENDING_REVIEW` | 审核通过 / 驳回 |
| `REJECTED` | 重新提交 |
| `APPROVED` | 发布 |
| `PUBLISHED` | 发起 |
| `DISABLED` | 重新启用 |
写自动化脚本或写测试用例时若写死「提交审核」,在后续步骤会全部点空。
### 3.2 工作流确认框的确认按钮文案
确认框的确认按钮文案**等于动作名本身**(「提交审核」「发布」「确认驳回」),
不是「确定」。按 `/确定|确认/` 匹配文字会点不到,应按 `.el-button--primary` 定位。
## 4. 接口调用清单(本次验证实际打到)
```
GET /api/v1/auth/me
GET /api/v1/campuses
GET /api/v1/departments
GET /api/v1/templates 列表(分页拉全量)
GET /api/v1/templates/{id} 模板详情
GET /api/v1/templates/{id}/versions 版本列表
GET /api/v1/templates/{id}/versions/{vid} 版本详情(正文来源)
POST /api/v1/templates 新建模板
POST /api/v1/templates/{id}/versions 新建版本
POST /api/v1/templates/{id}/versions/{vid}/submit-review
POST /api/v1/templates/{id}/versions/{vid}/reject
POST /api/v1/templates/{id}/versions/{vid}/approve
POST /api/v1/templates/{id}/versions/{vid}/publish
```
全部 200。
## 5. 已知限制与未覆盖项
### 5.1 入口未开放(既有设计,非本次回归)
- **版本历史**:`getTemplateVersions` 与 `DocumentVersionDialog` 均已实现,
但卡片上没有「版本」按钮(`DocumentTemplateCard` 中 `showVersionAction = false`),
用户无法从 UI 进入。
- **下架 / 归档**:同样没有按钮(`showRemoveAction = false`)。
因此本次测试创建的文书**无法通过 UI 清理**,只能走接口归档。
### 5.2 混合模式下的模板树
当前本地配置为「文档库真实 + 签署工作台演示数据」。此配置下点「发起」,
「新增签署任务」弹窗左侧的模板树**仍为演示数据**(含后端不存在的文书),
仅从文档库带入的那一份是真实的。
原因:该弹窗调用 `getSigningTemplates()`,它读的是 `mockFlags.signing`。
将签署端也切到真实接口后,该模板树才会只显示后端真实模板。
### 5.3 未验证项
- 手写板设备桥接、线上签署回调、打印服务(后端尚未提供,前端为占位)
- 模板包导出(`showExportMessage` 为占位提示,后端无对应接口)
## 6. 验证环境注意事项
供后续复现参考:
1. **请求头是 `X-Token`,不是 `Authorization: Bearer`**(见 `utils/request.ts`)。
用 curl 直连后端调试时写错会得到 `40100 请先登录`,容易误判成 token 失效。
2. **后端会话实际存活约 10 分钟**,而登录响应里的 `expiresAt` 声明 2 小时。
登录与验证必须串在同一条命令里执行(`node scripts/login.cjs <code> && node <verify>.cjs`),
否则必然被踢回 `/login`,表现为「页面上找不到按钮」。
3. 文档库的弹窗是自定义 `.dialog-mask`,**不是 Element Plus 的 `.el-dialog`**。
关闭要点 `.dialog-mask .close-button`(预览 / Word 编辑器)或 `.dialog-close`(版本弹窗)。
关不掉会导致下一个弹窗因 `visible` 未变化而不触发重置,造出「状态没重置」的假象。
## 7. 遗留测试数据
测试文书「【自动化测试】签署链路验证」(编号 `AUTO-TEST-800004`)当前为**已发布**状态,
保留在联调环境以便继续验证发起签署。不需要时归档即可:
```
POST /api/v1/templates/{templateId}/versions/{versionId}/archive
```