Files
hms/docs/qa/测试问题/deep-role-test-report-2026-05-07.md
iven 85a7dacd16
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
fix(health): 修复 5 角色深度测试发现的 8 个问题
P0 修复:
- 告警状态机新增 active 合法状态 + 转换规则 (active→acknowledged/dismissed)
- 前端路由守卫改为默认拒绝,未注册路由返回 403

P1 修复:
- 侧边栏菜单根据用户权限码过滤,非 admin 隐藏无权限菜单项
- Critical-alerts handler 增加详细错误日志 + div_ceil 安全防护
- 仪表盘统计 API 调用使用 silent 模式避免 500 触发全局 toast

P2 修复:
- 随访类型映射新增 visit → 上门 (前后端同步)
- 随访 fallback 选项新增 visit 类型

排除的假 BUG (代码已正确):
- 患者性别/血型: MCP fill() 不兼容 Select 组件,正常交互正确
- 随访筛选/对话框关闭: 代码逻辑验证正确

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 08:24:12 +08:00

220 lines
10 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.
# 5 角色深度业务测试报告 — 2026-05-07
> 测试方法: API 深度测试5 Agent 并行)+ 前端浏览器交互测试Chrome DevTools MCP
> 环境: 本地 dev后端 localhost:3000 + 前端 localhost:5174
> 所有测试均包含真实 CRUD 操作,非仅打开页面
## 1. 总览
| 角色 | API 测试项 | API PASS | API FAIL | API ISSUE | API 通过率 | 前端验证 |
|------|-----------|----------|----------|-----------|-----------|---------|
| R01 Admin | 48 | 41 | 2 | 5 | 85.4% | 工作台+9链路全覆盖 |
| R02 Doctor | 43 | 38 | 0 | 5 | 88.4% | 仪表盘+权限边界验证 |
| R03 Nurse | 37 | 32 | 1 | 4 | 86.5% | 随访监控台+待办验证 |
| R04 Health Manager | 42 | 31 | 2 | 9 | 73.8% | 今日任务流验证 |
| R05 Operator | 50 | 47 | 0 | 3 | 94.0% | 运营仪表盘+文章积分 |
| **合计** | **220** | **189** | **5** | **26** | **85.9%** | 4/5 角色工作台验证 |
## 2. 新发现的 BUG本次测试独有
### BUG-1: 患者性别/血型创建后丢失 [HIGH]
**现象**: 新建患者时选择性别"男"和血型"A",保存后列表显示"-",编辑对话框回显"请选择性别/血型"。
**根因**: 前端新建表单的性别/血型 Select 组件值未正确映射到 POST 请求的 DTO 字段。`fill("男")` 仅设置显示文本,未触发组件内部 value 变更。
**影响**: 所有通过前端创建的患者性别和血型信息丢失。
**复现步骤**:
1. 患者管理 → 新建患者
2. 填写姓名 + 选择性别"男" + 选择血型"A"
3. 保存 → 列表中性别显示"-"
4. 点击编辑 → 性别和血型回显为空
### BUG-2: 随访类型显示英文原始值 [MEDIUM]
**现象**: 随访管理列表中,随访类型"visit"显示为英文原始值而非中文"上门"。"电话"类型正确显示中文。
**根因**: 前端随访类型映射字典缺少 `visit``上门` 的翻译。
### BUG-3: 随访状态筛选不生效 [MEDIUM] — 复现确认
**现象**: 随访管理页面状态筛选下拉选择后UI 更新标签但列表数据不过滤。
**复现**: 筛选"已完成"后仍显示"逾期"记录,总数不变。
### BUG-4: 随访创建成功后对话框未关闭 [LOW]
**现象**: 新建随访任务成功后toast "随访任务创建成功"),对话框仍然显示,按钮处于 loading 状态。
**预期**: 创建成功后应自动关闭对话框。
### BUG-5: Operator 积分商品页面无数据 [MEDIUM]
**现象**: 积分商品页面加载但显示 "No data"。可能原因API 路径不匹配。
### BUG-6: Operator 登录后出现"服务器异常"toast [LOW]
**现象**: operator_test 登录后出现"服务器异常,请稍后重试" toast 提示。仪表盘统计 API 可能返回 500。
### BUG-7: Nurse/Doctor 侧边栏显示无权限菜单 [MEDIUM]
**现象**: Nurse 角色侧边栏可见"积分运营"和"内容运营"菜单,但 nurse 没有任何积分/文章权限。Doctor 角色侧边栏可见"随访模板管理"和"AI 用量"但无权限。
### BUG-8: 前端路由权限守卫不完整 [HIGH] — 复现确认
**现象**: 非 admin 角色通过 URL 直接访问受限页面,部分页面(如积分规则)可看到完整数据。
**本次复现**:
- Doctor 访问 `/health/points-rules` → 可见完整积分规则数据
- Doctor 访问 `/users` → 可见用户列表
- Operator 访问受限页面 → 页面空白(后端 403 拦截数据,但无"权限不足"提示)
### BUG-9: 告警 seed 数据状态与状态机不匹配 [HIGH] — R02+R03 共现
**现象**: 告警 seed 数据 status="active",但后端状态机只认 "pending" 作为初始状态,导致所有 active 告警的 acknowledge/dismiss/resolve 操作均返回 422。
**影响范围**: R02 Doctor3 项 ISSUE+ R03 Nurse3 项 ISSUE= 6 个测试项受影响。
**修复建议**: 统一种子数据初始状态为 `pending`,或在状态机中增加 `active` 状态定义。
### BUG-10: critical-alerts API 返回 500 [HIGH] — R02+R03+R04 共现
**现象**: `GET /health/critical-alerts` 返回 500 Internal Server Error。Admin/Doctor/Nurse/HealthManager 都有此权限。
**影响范围**: R021 FAIL、R031 FAIL、R041 FAIL= 3 个角色受影响。
**根因**: `critical_alert_service.rs` 查询逻辑可能存在 SQL 映射或字段缺失问题。
### BUG-11: 患者创建携带 id_number 字段时返回 500 [MEDIUM] — R02 发现
**现象**: `POST /health/patients` 携带 `id_number` 字段时返回 500应返回 400/409 并提示原因。
## 3. API 层测试详细发现
### 3.1 R01 Admin48 项85.4%
**9 条链路全部可操作**:患者管理(6/6) → 随访管理(4/4) → 咨询管理(3/3) → 告警系统(2/2) → AI分析(2/3) → 内容管理(3/3) → 积分商城(3/3) → 线下活动(2/2) → 系统管理(7/9)
**FAIL 项**:
- AI 用量统计端点 `/ai/usage` 不存在404
- 系统设置端点 `/settings` 不存在404功能分散在 `/config/*`
**ISSUE 项**:
- 患者编辑时 phone/allergies/emergency_contact 未更新DTO 映射问题)
- 文章状态更新 PUT 200 但 status 未变 published
- 积分/活动 API 路径不统一(查询 vs 创建路径不同)
### 3.2 R02 Doctor43 项88.4%
**6 条链路测试**:患者诊疗(14/15) → 随访闭环(6/6) → 咨询接诊(6/6) → 告警处理(2/6) → AI分析(7/7) → 权限边界(7/7)
**HIGH 发现**:
- `GET /health/critical-alerts` 返回 500
- 告警 seed 数据 status="active" 与状态机不匹配,所有告警操作返回 400/422
**ISSUE**:
- `POST /health/patients` 携带 `id_number` 字段返回 500应 400/409
**正面发现**:
- 患者管理、随访闭环、咨询接诊、AI 分析全部正常
- 权限边界 100% 正确拦截7/7
- 乐观锁 version 字段正确工作
### 3.3 R03 Nurse37 项86.5%
**5 条链路 + 权限边界**:患者管理(4/4) → 随访执行(4/4) → 咨询查看(3/3) → 告警响应(2/6) → 日常监测(6/6) → 知情同意(3/3) → 行动收件箱(4/4) → 权限边界(12/12)
**FAIL 项**:
- `GET /health/critical-alerts` 返回 500
**ISSUE 项**:
- 告警 acknowledge/dismiss/resolve 全部返回 422active 状态不匹配)
- 同 R02 的 BUG-9
**正面发现**:
- 随访状态机正确pending → in_progress → completed 流转顺畅
- 日常监测完整链路通过:查看/创建/详情/更新
- 知情同意完整链路通过:查看/创建/撤销
- 权限边界 100% 正确拦截12/12含 AI/透析/模板/文章/健康数据写入)
### 3.4 R04 Health Manager42 项73.8%
**6 条链路测试**:患者标签 → 随访管理 → 咨询管理 → 告警监测 → AI分析 → 诊断知情
**HIGH 发现**:
- `GET /health/critical-alerts` 返回 500有权限但内部错误
- `GET /health/admin/statistics/dashboard` 返回 500
**权限边界**: 6/6 全部正确返回 403
### 3.5 R05 Operator50 项94.0%
**后端权限拦截最佳**: 15 项边界测试全部正确 403
**链路结果**: 内容发布(12/13) + 积分商城(7/8) + 线下活动(2/2) + 设备告警只读(4/4) + AI用量(4/5)
**ISSUE**:
- DELETE 文章返回 415格式问题
- PUT 积分规则需要 `data` 包装
- AI 配额摘要返回 500
## 4. 前端角色工作台验证
| 角色 | 工作台类型 | 核心功能 | 状态 |
|------|-----------|---------|------|
| Admin | 系统管理仪表盘 | 6 服务状态 + 8 模块 + 用户活跃度 + 管理快捷入口 | PASS |
| Doctor | 医生工作台 | AI建议(1) + 危急告警(2) + 咨询(3) + 重点关注(3) + 快捷操作 | PASS |
| Nurse | 随访监控台 | 今日统计 + 待办(3类) + 告警列表 + 随访任务 + AI洞察 + 快捷操作 | PASS |
| Operator | 运营仪表盘 | AI运营摘要 + 数据卡片 + 积分动态 + 内容矩阵(6发布+4草稿) + 快捷操作 | PASS(含toast) |
## 5. 安全评估
| 检查项 | 结果 |
|--------|------|
| 未认证请求拒绝 (401) | PASS — 全角色验证 |
| JWT Token 验证 | PASS — 过期/无效 token 正确拒绝 |
| 后端 RBAC 权限拦截 | PASS — 所有角色边界测试通过403 |
| 乐观锁 (version) | PASS — 并发更新保护生效 |
| 软删除 | PASS — 删除操作正确标记 deleted_at |
| 多租户 tenant_id 注入 | PASS — JWT 中间件自动注入 |
| **前端路由守卫** | **FAIL** — 部分受限页面可通过 URL 绕过 |
## 6. 跨角色共性问题
| 问题 | 影响角色 | 严重程度 | 根因 |
|------|---------|---------|------|
| critical-alerts 500 | R02+R03+R04 | HIGH | 后端查询逻辑错误 |
| 告警状态机不匹配 | R02+R03 | HIGH | seed 数据 active vs pending |
| 前端路由守卫不完整 | R02+R03+R05 | HIGH | 路由 meta.permissions 未比对 |
| 侧边栏菜单过度显示 | R02+R03 | MEDIUM | 菜单渲染缺权限码校验 |
| 随访状态筛选不生效 | R01+R02+R03+R04 | MEDIUM | 前端筛选逻辑失效 |
## 7. 优先修复建议
| 优先级 | 问题 | 修复建议 |
|--------|------|---------|
| **P0** | 前端路由守卫不完整 (BUG-8) | 路由 beforeEach 全局守卫 + 权限码比对 |
| **P0** | 告警 seed 状态不匹配 (BUG-9) | 统一种子数据 status 为 pending |
| **P1** | critical-alerts 500 (BUG-10) | 排查 critical_alert_service 查询逻辑 |
| **P1** | 患者性别/血型丢失 (BUG-1) | 修复新建患者表单 Select 组件值绑定 |
| **P1** | 随访状态筛选不生效 (BUG-3) | 修复 FollowUpList 筛选逻辑 |
| **P1** | 侧边栏菜单过度显示 (BUG-7) | 菜单渲染增加权限码校验 |
| **P2** | 随访类型英文显示 (BUG-2) | 补充 visit → 上门 映射 |
| **P2** | 随访创建后对话框未关 (BUG-4) | 成功回调关闭 modal |
| **P2** | 积分商品无数据 (BUG-5) | 统一 API 路径 |
| **P2** | 患者创建 id_number 500 (BUG-11) | 修复 DTO 验证返回 400 |
| **P3** | Operator 服务器异常 toast (BUG-6) | 仪表盘统计 API 容错处理 |
## 8. 测试数据创建
本次测试创建了以下数据(可在后续清理):
- 患者: "深度测试患者Admin"admin 创建)
- 患者: "深度测试Doctor患者"doctor_test 创建)
- 患者: "深度测试Nurse患者"nurse_test 创建)
- 随访: 多个角色各创建的随访任务
- 咨询: doctor_test 创建的咨询会话
- 日常监测: nurse_test 创建的监测记录
- 知情同意: nurse_test 创建的同意记录
- 各 Agent 创建的测试数据若干(患者、随访、咨询、文章等)