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

10 KiB
Raw Blame History

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 创建的测试数据若干(患者、随访、咨询、文章等)