From 43f0ba7057c5ec375f5d175d66dabdc8eb6b2169 Mon Sep 17 00:00:00 2001 From: iven Date: Wed, 6 May 2026 22:29:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E4=BF=AE=E5=A4=8D=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=B5=8B=E8=AF=95=E5=8F=91=E7=8E=B0=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=AE=88=E5=8D=AB=E3=80=81API=20500=E3=80=81=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=85=8D=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. CRITICAL: 前端路由权限守卫 — routePermissions 从 3 条扩展到 31 条, 覆盖全部 /health/* 路由;匹配逻辑从宽松模块级前缀改为精确权限码匹配 2. HIGH: health-data API 500 — jsonb_array_elements() 添加 CASE WHEN 类型守卫, 防止 items 字段为非数组 JSON 时崩溃 3. MEDIUM: Doctor 补充 ai.prompt.list、ai.usage.list、follow-up-templates 权限 4. Operator 清理 AI 分析、统计报表菜单关联 5. 更新 5 角色测试计划文档 --- apps/web/src/App.tsx | 30 ++- .../src/service/stats_service/health.rs | 2 +- crates/erp-server/migration/src/lib.rs | 2 + ...506_000126_fix_role_permissions_cleanup.rs | 105 ++++++++++ docs/qa/role-test-plans/R01-admin.md | 180 +++++++++++------- docs/qa/role-test-plans/R02-doctor.md | 152 +++++++++------ docs/qa/role-test-plans/R03-nurse.md | 141 ++++++++------ docs/qa/role-test-plans/R04-health-manager.md | 158 +++++++++------ docs/qa/role-test-plans/R05-operator.md | 140 +++++++++----- 9 files changed, 608 insertions(+), 302 deletions(-) create mode 100644 crates/erp-server/migration/src/m20260506_000126_fix_role_permissions_cleanup.rs diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 2ad653e..6fcf9e7 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -96,11 +96,39 @@ function PrivateRoute({ children }: { children: React.ReactNode }) { '/users': ['user.list', 'user.manage'], '/roles': ['role.list', 'role.manage'], '/organizations': ['organization.list', 'organization.manage'], + '/workflow': ['workflow.list', 'workflow.read'], + '/messages': ['message.list'], + '/settings': ['config.settings.list', 'config.settings.manage'], + '/plugins/admin': ['plugin.list', 'plugin.manage'], + '/health/patients': ['health.patient.list', 'health.patient.manage'], + '/health/doctors': ['health.doctor.list', 'health.doctor.manage'], + '/health/follow-up-tasks': ['health.follow-up.list', 'health.follow-up.manage'], + '/health/consultations': ['health.consultation.list', 'health.consultation.manage'], + '/health/action-inbox': ['health.action-inbox.list', 'health.action-inbox.manage'], + '/health/follow-up-templates': ['health.follow-up-templates.list', 'health.follow-up-templates.manage'], + '/health/diagnoses': ['health.health-data.list', 'health.health-data.manage'], + '/health/consents': ['health.consent.list', 'health.consent.manage'], + '/health/realtime-monitor': ['health.device-readings.list', 'health.device-readings.manage'], + '/health/alert-dashboard': ['health.alerts.list', 'health.alerts.manage'], + '/health/devices': ['health.devices.list', 'health.devices.manage'], + '/health/ble-gateways': ['health.ble-gateways.list', 'health.ble-gateways.manage'], + '/health/critical-value-thresholds': ['health.critical-value-thresholds.list', 'health.critical-value-thresholds.manage'], + '/health/articles': ['health.articles.list', 'health.articles.manage'], + '/health/points-rules': ['health.points.list', 'health.points.manage'], + '/health/points-products': ['health.points.list', 'health.points.manage'], + '/health/points-orders': ['health.points.list', 'health.points.manage'], + '/health/offline-events': ['health.points.list', 'health.points.manage'], + '/health/ai-prompts': ['ai.prompt.list', 'ai.prompt.manage'], + '/health/ai-analysis': ['ai.analysis.list', 'ai.analysis.manage'], + '/health/ai-usage': ['ai.usage.list'], + '/health/oauth-clients': ['health.oauth.list', 'health.oauth.manage'], + '/health/statistics': ['health.health-data.list', 'health.dashboard.manage'], + '/health/tags': ['health.patient.list', 'health.patient.manage'], }; const matchedPrefix = Object.keys(routePermissions).find((prefix) => path.startsWith(prefix)); if (matchedPrefix) { const required = routePermissions[matchedPrefix]; - const hasAccess = permissions.some((p) => required.some((r) => p === r || p.startsWith(r.split('.')[0] + '.'))); + const hasAccess = required.some((r) => permissions.includes(r)); if (!hasAccess) return ; } diff --git a/crates/erp-health/src/service/stats_service/health.rs b/crates/erp-health/src/service/stats_service/health.rs index 6f1ee7f..0ce72c1 100644 --- a/crates/erp-health/src/service/stats_service/health.rs +++ b/crates/erp-health/src/service/stats_service/health.rs @@ -213,7 +213,7 @@ async fn count_abnormal_lab_items( let sql = r#" SELECT COALESCE(SUM(jsonb_array_length( COALESCE( - (SELECT jsonb_agg(elem) FROM jsonb_array_elements(items) elem WHERE elem->>'is_abnormal' = 'true'), + (SELECT jsonb_agg(elem) FROM jsonb_array_elements(CASE WHEN jsonb_typeof(items) = 'array' THEN items ELSE '[]'::jsonb END) elem WHERE elem->>'is_abnormal' = 'true'), '[]'::jsonb ) )), 0::bigint) AS total diff --git a/crates/erp-server/migration/src/lib.rs b/crates/erp-server/migration/src/lib.rs index 57fdf99..f3f600b 100644 --- a/crates/erp-server/migration/src/lib.rs +++ b/crates/erp-server/migration/src/lib.rs @@ -125,6 +125,7 @@ mod m20260505_000122_create_ai_knowledge_guides; mod m20260505_000123_update_ai_prompts_system_instruction; mod m20260505_000124_freeze_deferred_menus; mod m20260506_000125_restructure_menus_and_roles; +mod m20260506_000126_fix_role_permissions_cleanup; pub struct Migrator; @@ -257,6 +258,7 @@ impl MigratorTrait for Migrator { Box::new(m20260505_000123_update_ai_prompts_system_instruction::Migration), Box::new(m20260505_000124_freeze_deferred_menus::Migration), Box::new(m20260506_000125_restructure_menus_and_roles::Migration), + Box::new(m20260506_000126_fix_role_permissions_cleanup::Migration), ] } } diff --git a/crates/erp-server/migration/src/m20260506_000126_fix_role_permissions_cleanup.rs b/crates/erp-server/migration/src/m20260506_000126_fix_role_permissions_cleanup.rs new file mode 100644 index 0000000..80193f9 --- /dev/null +++ b/crates/erp-server/migration/src/m20260506_000126_fix_role_permissions_cleanup.rs @@ -0,0 +1,105 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let db = manager.get_connection(); + + // === Doctor 角色权限修复 === + let doctor_add = vec![ + "health.follow-up-templates.list", + "health.follow-up-templates.manage", + "ai.usage.list", + "ai.prompt.list", + ]; + for code in &doctor_add { + db.execute(sea_orm::Statement::from_string( + sea_orm::DatabaseBackend::Postgres, + format!( + "INSERT INTO role_permissions (role_id, permission_id, tenant_id, data_scope, created_at, updated_at, created_by, updated_by, deleted_at, version) \ + SELECT r.id, p.id, r.tenant_id, 'all', NOW(), NOW(), r.id, r.id, NULL, 1 \ + FROM roles r \ + JOIN permissions p ON p.tenant_id = r.tenant_id AND p.code = '{code}' AND p.deleted_at IS NULL \ + WHERE r.code = 'doctor' AND r.deleted_at IS NULL \ + ON CONFLICT (role_id, permission_id) DO NOTHING", + ), + )).await?; + } + + // Doctor 移除多余权限 + let doctor_remove = vec![ + "health.articles.list", + "health.articles.manage", + "health.articles.review", + "health.points.list", + "health.points.manage", + ]; + for code in &doctor_remove { + db.execute(sea_orm::Statement::from_string( + sea_orm::DatabaseBackend::Postgres, + format!( + "UPDATE role_permissions SET deleted_at = NOW() \ + FROM roles r, permissions p \ + WHERE role_permissions.role_id = r.id AND role_permissions.permission_id = p.id \ + AND r.code = 'doctor' AND p.code = '{code}' AND role_permissions.deleted_at IS NULL", + ), + )).await?; + } + + // === Nurse 角色权限清理 === + let nurse_remove = vec![ + "health.doctor.list", + "health.alerts.manage", + ]; + for code in &nurse_remove { + db.execute(sea_orm::Statement::from_string( + sea_orm::DatabaseBackend::Postgres, + format!( + "UPDATE role_permissions SET deleted_at = NOW() \ + FROM roles r, permissions p \ + WHERE role_permissions.role_id = r.id AND role_permissions.permission_id = p.id \ + AND r.code = 'nurse' AND p.code = '{code}' AND role_permissions.deleted_at IS NULL", + ), + )).await?; + } + + // === Operator 角色 menu_roles 清理 === + // menus 表的标题字段是 title 不是 name + let operator_menu_remove = vec![ + "随访管理", + "咨询管理", + "行动收件箱", + "诊断记录", + "知情同意", + "医护管理", + "实时监控", + "BLE 网关", + "危急值阈值", + "AI 分析", + "AI Prompt 管理", + "随访模板管理", + "AI 分析历史", + "统计报表", + ]; + for title in &operator_menu_remove { + db.execute(sea_orm::Statement::from_string( + sea_orm::DatabaseBackend::Postgres, + format!( + "DELETE FROM menu_roles \ + USING roles r, menus m \ + WHERE menu_roles.role_id = r.id AND menu_roles.menu_id = m.id \ + AND r.code = 'operator' AND m.title = '{title}'", + ), + )).await?; + } + + Ok(()) + } + + async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> { + Ok(()) + } +} diff --git a/docs/qa/role-test-plans/R01-admin.md b/docs/qa/role-test-plans/R01-admin.md index 79ecaf5..bb1cc13 100644 --- a/docs/qa/role-test-plans/R01-admin.md +++ b/docs/qa/role-test-plans/R01-admin.md @@ -1,110 +1,142 @@ -# R01 — Admin(系统管理员)测试计划 +# R01 — Admin(系统管理员)业务场景测试计划 -> 角色: admin | 测试账号: admin / Admin@2026 | 范围: 全部功能 +> 角色: admin | 测试账号: admin / Admin@2026 | 菜单数: 45 | 范围: 全部功能 -## 1. 登录 & 工作台 +## 1. 登录 & 仪表盘 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 1.1 | 登录 | 输入 admin / Admin@2026,点击登录 | 跳转到工作台页面,左侧菜单显示 45 个可见菜单项 | ☐ | -| 1.2 | 工作台仪表盘 | 查看首页数据卡片 | 显示:注册用户数、业务模块数、今日操作、本周活跃;所有模块状态为"运行中" | ☐ | -| 1.3 | 最近操作记录 | 查看操作日志列表 | 显示最近登录和操作记录,按时间倒序 | ☐ | -| 1.4 | 用户活跃度 | 查看角色分布 | 显示按角色分组的用户数(医生、护士、运营等) | ☐ | +| 1.1 | 登录 | 输入 admin / Admin@2026 | 成功登录,左侧菜单 45 项 | ☐ | +| 1.2 | 工作台仪表盘 | 查看首页 | 显示:注册用户数、业务模块数、今日操作、本周活跃;模块状态"运行中" | ☐ | +| 1.3 | 最近操作记录 | 查看操作日志 | 按时间倒序显示登录/操作记录 | ☐ | -## 2. 系统管理(工作台目录) +## 2. 场景 A — 患者建档全链路 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 2.1 | 用户管理 | /users | 打开列表 → 搜索用户 → 查看详情 | 显示用户列表,支持搜索、分页,可查看/编辑用户信息 | ☐ | -| 2.2 | 统计报表 | /health/statistics | 打开页面 | 显示健康业务统计图表(患者数、随访数、咨询数等) | ☐ | -| 2.3 | 权限管理 | /roles | 打开列表 → 查看角色详情 | 显示所有角色(含 doctor/nurse/health_manager/operator),可查看权限码分配 | ☐ | -| 2.4 | 组织架构 | /organizations | 打开列表 → 查看树形结构 | 显示组织树,支持展开/折叠,可管理组织/部门/岗位 | ☐ | +> **业务链**: 创建患者 → 打标签 → 绑定设备 → 签署知情同意 → 验证建档完整性 -## 3. 系统管理目录 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| A.1 | 创建患者 | /health/patients → 新增 → 填写姓名/身份证/手机/出生日期 → 保存 | 患者出现在列表,状态 active | ☐ | +| A.2 | 患者详情 | 点击新患者卡片 | 显示基本信息、体征数据 Tab、操作记录 | ☐ | +| A.3 | 打标签 | /health/tags → 新增标签"高血压高危"(红色)→ 回到患者详情 → 分配标签 | 标签显示在患者卡片和详情页 | ☐ | +| A.4 | 绑定设备 | /health/devices → 查看设备列表 → 记录设备绑定状态 | 设备列表显示绑定关系 | ☐ | +| A.5 | 知情同意 | /health/consents → 查看记录 | 知情同意书列表可查看 | ☐ | +| A.6 | 验证完整性 | 回到患者列表 → 搜索新患者 | 患者信息完整(姓名+标签+设备状态) | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 3.1 | 工作流 | /workflow | 打开流程定义列表 | 显示已定义的流程,可查看流程图 | ☐ | -| 3.2 | 消息中心 | /messages | 打开消息列表 | 显示消息列表,支持已读/未读标记 | ☐ | -| 3.3 | 系统设置 | /settings | 打开设置页面 | 显示系统配置项,可编辑保存 | ☐ | -| 3.4 | 插件管理 | /plugins/admin | 打开插件列表 | 显示已安装插件,可启用/禁用 | ☐ | +**交接点**: 患者建档完成后,doctor/nurse/health_manager 可在各自视图中看到该患者。 -## 4. 健康业务 +## 3. 场景 B — 随访闭环(管理视角) -### 4.1 患者医护 +> **业务链**: 查看 admin 创建的随访 → 确认状态流转 → 验证行动收件箱联动 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.1.1 | 患者管理 | /health/patients | 列表 → 搜索 → 新增 → 编辑 → 查看详情 | 完整 CRUD,列表支持搜索和标签筛选 | ☐ | -| 4.1.2 | 医护管理 | /health/doctors | 列表 → 查看 | 显示医护列表,含科室、职称信息 | ☐ | -| 4.1.3 | 标签管理 | /health/tags | 列表 → 新增 → 编辑 → 删除 | 标签 CRUD,支持颜色设置 | ☐ | -| 4.1.4 | 诊断记录 | /health/diagnoses | 列表 → 查看详情 | 显示诊断记录列表,可查看详情 | ☐ | +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| B.1 | 创建随访 | /health/follow-up-tasks → 新增 → 选患者+随访类型+计划日期 → 保存 | 随访任务创建成功,状态 pending | ☐ | +| B.2 | 随访列表 | 按状态筛选:待办/进行中/已完成 | 筛选正确,数据一致 | ☐ | +| B.3 | 查看模板 | /health/follow-up-templates → 查看模板内容 | 模板列表显示结构和字段 | ☐ | +| B.4 | 行动收件箱 | /health/action-inbox → 筛选类型 | 显示 AI 建议/告警/随访等行动项 | ☐ | -### 4.2 随访咨询 +## 4. 场景 C — 咨询流转(管理视角) -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.2.1 | 随访管理 | /health/follow-up-tasks | 列表 → 查看详情 → 创建随访 | 显示待办/已完成随访,支持创建新随访任务 | ☐ | -| 4.2.2 | 咨询管理 | /health/consultations | 列表 → 查看对话 | 显示咨询列表,可查看对话详情 | ☐ | -| 4.2.3 | 行动收件箱 | /health/action-inbox | 列表 → 处理行动项 | 显示待办行动项,支持按类型筛选 | ☐ | -| 4.2.4 | 随访模板 | /health/follow-up-templates | 列表 → 查看/编辑 | 显示随访模板列表,可编辑模板内容 | ☐ | +> **业务链**: 查看咨询列表 → 查看对话详情 -### 4.3 监测 & 知情同意 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| C.1 | 咨询列表 | /health/consultations → 按状态筛选 | 显示 waiting/active/closed 状态的咨询 | ☐ | +| C.2 | 对话详情 | 点击某条咨询 → 查看对话 | 显示完整消息历史 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.3.1 | 知情同意 | /health/consents | 列表 → 查看 | 显示知情同意书记录 | ☐ | -| 4.3.2 | 实时监控 | /health/realtime-monitor | 打开页面 | 显示实时体征监控面板 | ☐ | +## 5. 场景 D — 告警处理链 -### 4.4 告警 & 设备 +> **业务链**: 配置危急值阈值 → 查看告警仪表盘 → 处理告警 → 验证状态变更 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.4.1 | 告警仪表盘 | /health/alert-dashboard | 打开页面 | 显示告警统计和列表,支持按严重程度筛选 | ☐ | -| 4.4.2 | 设备管理 | /health/devices | 列表 → 查看 | 显示设备列表和绑定状态 | ☐ | -| 4.4.3 | BLE 网关 | /health/ble-gateways | 列表 → 查看 | 显示 BLE 网关列表 | ☐ | -| 4.4.4 | 危急值阈值 | /health/critical-value-thresholds | 列表 → 查看 | 显示阈值配置列表 | ☐ | +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| D.1 | 危急值阈值 | /health/critical-value-thresholds → 查看配置 | 显示各体征指标的阈值范围 | ☐ | +| D.2 | 告警仪表盘 | /health/alert-dashboard → 查看统计 | 按严重程度分类显示告警 | ☐ | +| D.3 | 告警处理 | 点击某条告警 → 标记已确认/已处理 | 告警状态从 pending → acknowledged/resolved | ☐ | +| D.4 | 实时监控 | /health/realtime-monitor → 查看面板 | 显示实时体征数据流 | ☐ | +| D.5 | BLE 网关 | /health/ble-gateways → 查看 | 网关列表显示连接状态 | ☐ | -### 4.5 运营 +## 6. 场景 E — AI 分析链 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.5.1 | 内容管理 | /health/articles | 列表 → 新增 → 发布 | 文章 CRUD,支持发布/下架 | ☐ | -| 4.5.2 | 积分规则 | /health/points-rules | 列表 → 查看 | 显示积分规则列表 | ☐ | -| 4.5.3 | 商品管理 | /health/points-products | 列表 → 查看 | 显示积分商品列表 | ☐ | -| 4.5.4 | 订单管理 | /health/points-orders | 列表 → 查看 | 显示积分兑换订单列表 | ☐ | -| 4.5.5 | 线下活动 | /health/offline-events | 列表 → 查看 | 显示线下活动列表 | ☐ | +> **业务链**: 配置 Prompt 模板 → 触发分析 → 查看结果 → 查看用量 -### 4.6 AI 分析 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| E.1 | Prompt 管理 | /health/ai-prompts → 查看模板列表 | 显示 Prompt 模板,可编辑 | ☐ | +| E.2 | 触发分析 | /health/ai-analysis → 查看历史记录 | 显示分析记录和结果 | ☐ | +| E.3 | AI 用量 | /health/ai-usage → 查看统计 | 显示调用次数、token 消耗统计 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.6.1 | AI Prompt | /health/ai-prompts | 列表 → 查看 | 显示 Prompt 模板列表 | ☐ | -| 4.6.2 | AI 分析历史 | /health/ai-analysis | 列表 → 查看详情 | 显示 AI 分析记录和结果 | ☐ | -| 4.6.3 | AI 用量统计 | /health/ai-usage | 打开页面 | 显示 AI 调用量统计 | ☐ | +## 7. 场景 F — 内容发布链 -### 4.7 其他 +> **业务链**: 创建文章 → 编辑内容 → 发布 → 验证已发布状态 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.7.1 | OAuth 合作方 | /health/oauth-clients | 列表 → 查看 | 显示 OAuth 客户端列表 | ☐ | +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| F.1 | 创建文章 | /health/articles → 新增 → 填写标题/内容 → 保存草稿 | 文章状态为 draft | ☐ | +| F.2 | 编辑文章 | 点击草稿 → 修改内容 → 保存 | 内容更新成功 | ☐ | +| F.3 | 发布文章 | 点击发布 | 状态从 draft → published | ☐ | +| F.4 | 下架文章 | 点击已发布文章 → 下架 | 状态变回 draft | ☐ | -## 5. 权限验证 +## 8. 场景 G — 积分商城链 + +> **业务链**: 配置积分规则 → 添加商品 → 查看订单 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| G.1 | 积分规则 | /health/points-rules → 查看规则列表 | 显示积分获取/消费规则 | ☐ | +| G.2 | 商品管理 | /health/points-products → 新增商品 → 保存 | 商品出现在列表 | ☐ | +| G.3 | 订单管理 | /health/points-orders → 查看订单 | 显示兑换订单列表 | ☐ | + +## 9. 场景 H — 线下活动链 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| H.1 | 创建活动 | /health/offline-events → 新增 → 填写信息 → 保存 | 活动创建成功 | ☐ | +| H.2 | 查看活动 | 列表中查看活动详情 | 显示报名人数、活动状态 | ☐ | + +## 10. 场景 I — 系统管理全链路 + +> **业务链**: 用户 → 角色 → 组织 → 工作流 → 消息 → 设置 → 插件 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| I.1 | 用户管理 | /users → 搜索用户 → 查看详情 | 用户列表可搜索/分页/查看角色分配 | ☐ | +| I.2 | 角色管理 | /roles → 查看角色详情 | 显示 doctor/nurse/health_manager/operator 角色及权限码 | ☐ | +| I.3 | 组织架构 | /organizations → 展开树形结构 | 显示组织/部门/岗位层级 | ☐ | +| I.4 | 统计报表 | /health/statistics → 查看 | 显示患者数/随访数/咨询数等图表 | ☐ | +| I.5 | 工作流 | /workflow → 查看流程定义 | 显示已定义流程,可查看流程图 | ☐ | +| I.6 | 消息中心 | /messages → 查看 | 消息列表,支持已读/未读标记 | ☐ | +| I.7 | 系统设置 | /settings → 编辑 → 保存 | 配置项可编辑保存 | ☐ | +| I.8 | 插件管理 | /plugins/admin → 查看插件列表 | 显示已安装插件,可启用/禁用 | ☐ | +| I.9 | OAuth | /health/oauth-clients → 查看 | 显示 OAuth 客户端列表 | ☐ | + +## 11. 跨角色协作验证 + +> admin 作为系统管理员,验证以下跨角色协作点 + +| # | 协作场景 | 操作 | 预期结果 | 通过 | +|---|----------|------|----------|------| +| X.1 | 医护管理 | /health/doctors → 查看医护列表 | 显示科室、职称信息(doctor 角色也能看到) | ☐ | +| X.2 | 角色分配 | /users → 编辑某用户 → 分配角色 | 角色变更后该用户菜单立即更新 | ☐ | +| X.3 | 标签管理 | /health/tags → 新增/编辑/删除 | 标签变更同步到患者筛选器和医护视图 | ☐ | + +## 12. 权限验证 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 5.1 | 所有页面可访问 | 逐一点击左侧菜单 | 每个菜单路径都能正常打开,不出现 403 | ☐ | -| 5.2 | 所有按钮可见 | 进入各页面 | 新增/编辑/删除等操作按钮均可见 | ☐ | +| 12.1 | 全页面可访问 | 逐一点击左侧 45 个菜单 | 每个路径正常打开,无 403 | ☐ | +| 12.2 | 全按钮可见 | 进入各页面 | 新增/编辑/删除按钮均可见 | ☐ | -## 6. 小程序端(admin 以普通用户身份使用) +## 13. 小程序端 -> admin 角色在小程序端按"普通用户"处理(isMedicalStaff=false 因为 code 是 admin) +> admin 以普通用户身份使用小程序(isMedicalStaff=false) | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 6.1 | 登录跳转 | 登录后 | 跳转到患者首页(非医护工作台) | ☐ | -| 6.2 | 首页体征 | 查看体征完成度 | 显示今日体征 4 指标完成度 | ☐ | -| 6.3 | 体征录入 | 切到健康 Tab → 录入体征 | 可录入血压/心率/血糖/体重 | ☐ | +| 13.1 | 登录跳转 | admin 登录小程序 | 跳转到患者首页(非医护工作台) | ☐ | +| 13.2 | 体征完成度 | 查看首页 | 显示今日体征 4 指标完成度 | ☐ | +| 13.3 | 体征录入 | 健康页 → 录入体征 | 可录入血压/心率/血糖/体重 | ☐ | ## 测试结果 diff --git a/docs/qa/role-test-plans/R02-doctor.md b/docs/qa/role-test-plans/R02-doctor.md index e1a9bad..d4dcd12 100644 --- a/docs/qa/role-test-plans/R02-doctor.md +++ b/docs/qa/role-test-plans/R02-doctor.md @@ -1,89 +1,119 @@ -# R02 — Doctor(医生)测试计划 +# R02 — Doctor(医生)业务场景测试计划 -> 角色: doctor | 测试账号: doctor_test / Admin@2026 | 菜单数: 24 +> 角色: doctor | 测试账号: doctor_test / Admin@2026 | 菜单数: 24 | 重点: 临床诊疗 ## 1. 登录 & 仪表盘 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 1.1 | 登录 | 输入 doctor_test / Admin@2026 | 成功登录,左侧菜单显示 24 个菜单项 | ☐ | -| 1.2 | 菜单过滤 | 检查左侧菜单 | **有**: 工作台、统计报表、消息中心、患者管理、医护管理、随访管理、咨询管理、行动收件箱、随访模板、诊断记录、知情同意、告警仪表盘、AI分析历史、AI用量 | ☐ | -| 1.3 | 菜单排除 | 检查左侧菜单 | **没有**: 用户管理、权限管理、组织架构、工作流、系统设置、插件管理、标签管理、积分运营、内容运营、BLE网关、实时监控、危急值阈值、OAuth | ☐ | -| 1.4 | 医生仪表盘 | 查看首页 | 显示"下午好,测试医生",包含:AI建议待审、重点关注患者、今日日程、未回复咨询、快捷操作 | ☐ | -| 1.5 | AI 建议卡片 | 查看建议列表 | 按风险排序显示 AI 建议,可"采纳"或"拒绝" | ☐ | -| 1.6 | 快捷操作 | 查看底部快捷入口 | 显示:AI分析中心、告警中心、患者查询 | ☐ | +| 1.1 | 登录 | 输入 doctor_test / Admin@2026 | 成功登录,左侧菜单 24 项 | ☐ | +| 1.2 | 医生仪表盘 | 查看首页 | 显示"测试医生"问候语,含 AI 建议待审、重点关注患者、今日日程、未回复咨询 | ☐ | +| 1.3 | AI 建议卡片 | 查看建议列表 | 按风险排序,可"采纳"或"拒绝" | ☐ | +| 1.4 | 快捷操作 | 查看底部 | 显示:AI分析中心、告警中心、患者查询 | ☐ | -## 2. 患者医护 +## 2. 场景 A — 患者建档与诊疗 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 2.1 | 患者列表 | /health/patients | 打开列表 → 搜索 → 标签筛选 | 显示患者列表,支持搜索和标签筛选 | ☐ | -| 2.2 | 患者详情 | /health/patients | 点击患者卡片 | 显示患者基本信息、标签、体征数据 | ☐ | -| 2.3 | 新增患者 | /health/patients | 点击新增按钮 | 弹出新增表单,可填写姓名、身份证、手机号等 | ☐ | -| 2.4 | 医护管理 | /health/doctors | 打开列表 | 显示医护列表,含科室和职称 | ☐ | -| 2.5 | 诊断记录 | /health/diagnoses | 打开列表 → 查看详情 | 显示诊断记录,可查看诊断详情 | ☐ | +> **业务链**: 接收患者 → 查看档案 → 添加诊断 → 开随访任务 -## 3. 随访咨询 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| A.1 | 患者列表 | /health/patients → 搜索/标签筛选 | 显示患者列表,支持搜索和标签过滤 | ☐ | +| A.2 | 患者详情 | 点击患者卡片 | 显示基本信息、标签、体征数据、操作记录 | ☐ | +| A.3 | 新增患者 | 点击新增 → 填写姓名/身份证/手机号 → 保存 | 患者创建成功,状态 active | ☐ | +| A.4 | 医护管理 | /health/doctors → 查看医护列表 | 显示医护列表,含科室和职称 | ☐ | +| A.5 | 诊断记录 | /health/diagnoses → 查看列表 → 点击详情 | 显示诊断记录,可查看诊断详情 | ☐ | +| A.6 | 知情同意 | /health/consents → 查看列表 | 显示知情同意书记录 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 3.1 | 随访管理 | /health/follow-up-tasks | 打开列表 → 切换状态筛选 | 显示待办/进行中/已完成随访任务 | ☐ | -| 3.2 | 创建随访 | /health/follow-up-tasks | 点击新增 | 弹出创建表单,可选随访类型、患者、计划日期 | ☐ | -| 3.3 | 随访详情 | /health/follow-up-tasks | 点击某条随访 | 显示随访详情,可录入随访记录 | ☐ | -| 3.4 | 咨询管理 | /health/consultations | 打开列表 | 显示咨询会话列表,支持按状态筛选 | ☐ | -| 3.5 | 咨询回复 | /health/consultations | 进入对话 → 输入回复 | 可发送文字回复,消息实时显示 | ☐ | -| 3.6 | 行动收件箱 | /health/action-inbox | 打开列表 → 筛选类型 | 显示 AI 建议/告警/随访等行动项 | ☐ | -| 3.7 | 随访模板 | /health/follow-up-templates | 打开列表 → 查看 | 显示随访模板列表,可查看模板内容 | ☐ | +**交接点**: 诊断记录完成后,随访管理中可基于诊断创建随访任务。 -## 4. 监测 & 知情同意 +## 3. 场景 B — 随访闭环(医生端) -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.1 | 知情同意 | /health/consents | 打开列表 | 显示知情同意书记录 | ☐ | -| 4.2 | 日常监测 | (通过患者详情进入) | 查看患者体征趋势 | 可查看体征趋势图 | ☐ | +> **业务链**: 创建随访任务 → 查看执行情况 → 审核 AI 建议 -## 5. 告警 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| B.1 | 创建随访 | /health/follow-up-tasks → 新增 → 选患者/随访类型/计划日期 → 保存 | 随访任务创建,状态 pending | ☐ | +| B.2 | 随访列表 | 切换状态筛选:待办/进行中/已完成 | 正确显示各状态随访 | ☐ | +| B.3 | 随访详情 | 点击某条随访 → 查看录入内容 | 显示随访记录详情(护士录入的数据) | ☐ | +| B.4 | 随访模板 | /health/follow-up-templates → 查看模板 | 显示模板列表和内容 | ☐ | +| B.5 | 行动收件箱 | /health/action-inbox → 筛选类型 | 显示 AI 建议/告警/随访等行动项 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 5.1 | 告警仪表盘 | /health/alert-dashboard | 打开页面 | 显示告警统计,按严重程度分类 | ☐ | -| 5.2 | 告警处理 | /health/alert-dashboard | 点击某条告警 → 处理 | 可标记告警为已处理/已确认 | ☐ | +**交接点**: 医生创建随访后,护士可执行并录入;AI 生成的建议出现在行动收件箱。 -## 6. AI 分析 +## 4. 场景 C — 咨询接诊闭环 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 6.1 | AI 分析历史 | /health/ai-analysis | 打开列表 | 显示 AI 分析记录 | ☐ | -| 6.2 | AI 分析详情 | /health/ai-analysis | 点击某条分析 | 显示分析结果和建议 | ☐ | -| 6.3 | AI 用量 | /health/ai-usage | 打开页面 | 显示 AI 调用量统计 | ☐ | +> **业务链**: 查看待回复咨询 → 接诊 → 回复消息 → 关闭咨询 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| C.1 | 咨询列表 | /health/consultations → 按状态筛选 | 显示 waiting/active/closed 咨询 | ☐ | +| C.2 | 接诊 | 点击 waiting 状态咨询 → 进入对话 | 咨询状态变为 active | ☐ | +| C.3 | 回复消息 | 在对话中输入文字 → 发送 | 消息实时显示,患者端可收到 | ☐ | +| C.4 | 关闭咨询 | 点击结束咨询 | 咨询状态变为 closed | ☐ | + +**交接点**: 咨询中发现的健康问题可触发随访任务。 + +## 5. 场景 D — 告警处理 + +> **业务链**: 查看告警仪表盘 → 评估告警 → 处理/确认 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| D.1 | 告警仪表盘 | /health/alert-dashboard → 查看统计 | 按严重程度分类显示告警 | ☐ | +| D.2 | 处理告警 | 点击某条告警 → 标记已确认/已处理 | 状态 pending → acknowledged/resolved | ☐ | +| D.3 | 告警关联 | 查看告警关联的患者 | 可跳转到患者详情 | ☐ | + +## 6. 场景 E — AI 分析链 + +> **业务链**: 触发 AI 分析 → 查看结果 → 采纳/拒绝建议 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| E.1 | AI 分析历史 | /health/ai-analysis → 查看列表 | 显示分析记录 | ☐ | +| E.2 | 查看分析详情 | 点击某条分析 | 显示分析结果和 AI 建议 | ☐ | +| E.3 | 处理建议 | 在行动收件箱中 → 采纳/拒绝 AI 建议 | 建议状态变更:pending → approved/rejected | ☐ | +| E.4 | AI 用量 | /health/ai-usage → 查看 | 显示 AI 调用量统计 | ☐ | ## 7. 消息 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 7.1 | 消息列表 | /messages | 打开消息中心 | 显示消息列表(只读),可标记已读 | ☐ | +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 7.1 | 消息列表 | /messages → 查看 | 只读消息列表,可标记已读 | ☐ | ## 8. 权限边界验证 -| # | 测试项 | 操作 | 预期结果 | 通过 | -|---|--------|------|----------|------| -| 8.1 | 无权页面 403 | 浏览器地址栏输入 /users | 返回 403 或重定向 | ☐ | -| 8.2 | 无权页面 403 | 浏览器地址栏输入 /roles | 返回 403 或重定向 | ☐ | -| 8.3 | 无权页面 403 | 浏览器地址栏输入 /health/points-rules | 返回 403 或重定向 | ☐ | -| 8.4 | 无权页面 403 | 浏览器地址栏输入 /health/articles | 返回 403 或重定向 | ☐ | - -## 9. 小程序端 +> doctor 不应访问的模块 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 9.1 | 登录跳转 | doctor 角色登录 | 跳转到 `/pages/doctor/index`(医护工作台) | ☐ | -| 9.2 | 工作台标题 | 查看页面顶部 | 显示"医护工作台" | ☐ | -| 9.3 | 问候语 | 查看问候 | 显示"{display_name},您好" | ☐ | -| 9.4 | 工作概览卡片 | 查看 4 个数据卡片 | 显示:我的患者、未读消息、待处理随访、今日咨询 | ☐ | -| 9.5 | 健康审核区 | 查看健康审核卡片 | 显示:待审化验、今日预约(doctor 专属) | ☐ | -| 9.6 | 快捷操作 | 查看快捷操作 | 显示 7 个按钮:化验审核、患者查询、随访记录、告警中心、透析管理、处方管理、行动收件箱 | ☐ | -| 9.7 | 透析管理 | 点击"透析管理" | 跳转到 `/pages/doctor/dialysis/index` | ☐ | -| 9.8 | 处方管理 | 点击"处方管理" | 跳转到 `/pages/doctor/prescription/index` | ☐ | +| 8.1 | 无用户管理 | 地址栏输入 /users | 403 | ☐ | +| 8.2 | 无权限管理 | 地址栏输入 /roles | 403 | ☐ | +| 8.3 | 无积分管理 | 地址栏输入 /health/points-rules | 403 | ☐ | +| 8.4 | 无内容管理 | 地址栏输入 /health/articles | 403 | ☐ | +| 8.5 | 无系统设置 | 地址栏输入 /settings | 403 | ☐ | +| 8.6 | 无 BLE 网关 | 地址栏输入 /health/ble-gateways | 403 | ☐ | +| 8.7 | 无标签管理 | 地址栏输入 /health/tags | 403 | ☐ | + +## 9. 跨角色协作验证 + +| # | 协作场景 | 操作 | 预期结果 | 通过 | +|---|----------|------|----------|------| +| X.1 | 随访执行查看 | 查看护士已录入的随访记录 | 可查看完整录入内容 | ☐ | +| X.2 | AI 建议联动 | 行动收件箱中有 AI 生成的建议 | 建议来自 AI 分析结果 | ☐ | +| X.3 | 咨询转随访 | 咨询中发现问题 → 创建随访 | 随访任务出现在护士待办列表 | ☐ | + +## 10. 小程序端(医护工作台) + +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 10.1 | 登录跳转 | doctor_test 登录小程序 | 跳转到 `/pages/doctor/index`(医护工作台) | ☐ | +| 10.2 | 工作台标题 | 查看顶部 | 显示"医护工作台" | ☐ | +| 10.3 | 问候语 | 查看问候 | 显示"测试医生,您好" | ☐ | +| 10.4 | 工作概览 | 查看 4 个数据卡片 | 我的患者、未读消息、待处理随访、今日咨询 | ☐ | +| 10.5 | 健康审核区 | 查看健康审核卡片 | 显示:待审化验、今日预约(doctor 专属) | ☐ | +| 10.6 | 快捷操作 | 查看 7 个按钮 | 化验审核、患者查询、随访记录、告警中心、透析管理、处方管理、行动收件箱 | ☐ | +| 10.7 | 透析管理 | 点击"透析管理" | 跳转到 `/pages/doctor/dialysis/index` | ☐ | +| 10.8 | 处方管理 | 点击"处方管理" | 跳转到 `/pages/doctor/prescription/index` | ☐ | ## 测试结果 diff --git a/docs/qa/role-test-plans/R03-nurse.md b/docs/qa/role-test-plans/R03-nurse.md index dfaace3..34506c6 100644 --- a/docs/qa/role-test-plans/R03-nurse.md +++ b/docs/qa/role-test-plans/R03-nurse.md @@ -1,82 +1,117 @@ -# R03 — Nurse(护士)测试计划 +# R03 — Nurse(护士)业务场景测试计划 -> 角色: nurse | 测试账号: nurse_test / Admin@2026 | 菜单数: 20 +> 角色: nurse | 测试账号: nurse_test / Admin@2026 | 菜单数: 20 | 重点: 随访执行与体征录入 ## 1. 登录 & 仪表盘 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 1.1 | 登录 | 输入 nurse_test / Admin@2026 | 成功登录,左侧菜单显示 20 个菜单项 | ☐ | -| 1.2 | 菜单过滤 | 检查左侧菜单 | **有**: 工作台、统计报表、消息中心、患者管理、随访管理、咨询管理、行动收件箱、诊断记录、知情同意、告警仪表盘 | ☐ | -| 1.3 | 菜单排除 | 检查左侧菜单 | **没有**: 医护管理、用户管理、权限管理、组织架构、工作流、系统设置、插件管理、标签管理、随访模板、积分运营、内容运营、AI分析、BLE网关、实时监控、设备管理、透析、处方 | ☐ | -| 1.4 | 随访监控台 | 查看首页 | 显示"随访监控台"仪表盘,包含:今日随访数、逾期随访数、体征上报率、待办事项 | ☐ | -| 1.5 | 待办列表 | 查看待办区域 | 按 Tab 筛选(全部/AI建议/告警/随访/数据异常),显示具体待办项 | ☐ | -| 1.6 | 快捷操作 | 查看底部快捷入口 | 显示:开始随访、录入体征、查看AI分析、联系患者 | ☐ | +| 1.1 | 登录 | 输入 nurse_test / Admin@2026 | 成功登录,左侧菜单 20 项 | ☐ | +| 1.2 | 随访监控台 | 查看首页 | 显示"随访监控台":今日随访数、逾期随访数、体征上报率、待办事项 | ☐ | +| 1.3 | 待办列表 | 查看待办区域 | Tab 筛选(全部/AI建议/告警/随访/数据异常),显示具体待办项 | ☐ | +| 1.4 | 快捷操作 | 查看底部入口 | 开始随访、录入体征、查看AI分析、联系患者 | ☐ | -## 2. 患者管理 +## 2. 场景 A — 患者管理 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 2.1 | 患者列表 | /health/patients | 打开列表 → 搜索 | 显示患者列表,支持搜索 | ☐ | -| 2.2 | 患者详情 | /health/patients | 点击患者卡片 | 显示患者基本信息、体征数据 | ☐ | -| 2.3 | 新增患者 | /health/patients | 点击新增 | 可新增患者(有 health.patient.manage 权限) | ☐ | +> **业务链**: 查看患者列表 → 查看详情 → 新增患者 → 录入体征 -## 3. 随访管理 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| A.1 | 患者列表 | /health/patients → 搜索 | 显示患者列表,支持搜索 | ☐ | +| A.2 | 患者详情 | 点击患者卡片 | 显示基本信息、体征数据 | ☐ | +| A.3 | 新增患者 | 点击新增 → 填写信息 → 保存 | 可新增患者(有 patient.manage 权限) | ☐ | +| A.4 | 体征查看 | 患者详情 → 体征 Tab | 显示体征趋势图 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 3.1 | 随访列表 | /health/follow-up-tasks | 打开列表 → 按状态筛选 | 显示待办/进行中/已完成随访 | ☐ | -| 3.2 | 创建随访 | /health/follow-up-tasks | 点击新增 | 可创建随访任务 | ☐ | -| 3.3 | 录入随访 | /health/follow-up-tasks | 点击某条随访 → 录入 | 可录入随访记录内容 | ☐ | -| 3.4 | 咨询管理(只读) | /health/consultations | 打开列表 | 可查看咨询列表(无 health.consultation.manage 权限,确认按钮状态) | ☐ | +**交接点**: 护士新增/管理的患者,医生和健康管理师可同步看到。 -## 4. 日常监测 & 诊断 +## 3. 场景 B — 随访执行闭环 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.1 | 诊断记录(只读) | /health/diagnoses | 打开列表 | 可查看诊断记录(无 manage 权限) | ☐ | -| 4.2 | 知情同意 | /health/consents | 打开列表 → 查看 | 可查看和管理知情同意书 | ☐ | +> **业务链**: 接收随访任务(医生创建)→ 执行随访 → 录入结果 → 标记完成 -## 5. 行动收件箱 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| B.1 | 随访列表 | /health/follow-up-tasks → 按状态筛选 | 显示待办/进行中/已完成随访 | ☐ | +| B.2 | 接收任务 | 查看 pending 状态的随访(医生创建的) | 显示随访类型、患者、计划日期 | ☐ | +| B.3 | 创建随访 | 点击新增 → 选患者/类型/日期 → 保存 | 护士也可自主创建随访任务 | ☐ | +| B.4 | 执行录入 | 点击某条随访 → 录入 → 填写随访记录 → 保存 | 随访状态 pending → in_progress → completed | ☐ | +| B.5 | 验证完成 | 回到随访列表 → 筛选已完成 | 已录入的随访出现在已完成列表 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 5.1 | 行动列表 | /health/action-inbox | 打开列表 → 筛选 | 显示 AI 建议/告警/随访等行动项 | ☐ | -| 5.2 | 处理行动 | /health/action-inbox | 点击处理按钮 | 可处理/完成行动项 | ☐ | +**交接点**: 护士完成的随访记录,医生可在详情中查看录入内容。 -## 6. 告警 +## 4. 场景 C — 咨询查看 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 6.1 | 告警仪表盘 | /health/alert-dashboard | 打开页面 | 显示告警统计(只有 alerts.list 权限,无 manage,确认操作按钮) | ☐ | -| 6.2 | 危急告警 | 告警列表中 | 查看危急告警 | 显示危急告警标记 | ☐ | +> **业务链**: 查看咨询列表 → 了解患者沟通情况 -## 7. 消息 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| C.1 | 咨询列表 | /health/consultations → 查看列表 | 可查看咨询列表(只读) | ☐ | +| C.2 | 无管理权限 | 检查回复/关闭按钮 | 回复和关闭按钮不可见或禁用(无 consultation.manage) | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 7.1 | 消息列表 | /messages | 打开消息中心 | 只读消息列表,可标记已读 | ☐ | +## 5. 场景 D — 告警处理 -## 8. 权限边界验证 +> **业务链**: 查看告警 → 确认危急告警 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| D.1 | 告警仪表盘 | /health/alert-dashboard → 查看 | 显示告警统计(只有 alerts.list,无 manage) | ☐ | +| D.2 | 告警详情 | 查看某条告警 | 可查看告警详情和关联患者 | ☐ | +| D.3 | 操作按钮 | 检查确认/处理按钮 | 确认按钮是否可用(取决于 alerts.list vs alerts.manage) | ☐ | + +## 6. 场景 E — 诊断与知情同意 + +> **业务链**: 查看诊断记录 → 管理知情同意书 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| E.1 | 诊断记录 | /health/diagnoses → 查看列表 | 只读查看,无编辑/新增按钮(无 manage 权限) | ☐ | +| E.2 | 知情同意 | /health/consents → 查看 | 可查看和管理知情同意书 | ☐ | + +## 7. 场景 F — 行动收件箱 + +> **业务链**: 接收 AI 建议/告警通知 → 处理行动项 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| F.1 | 行动列表 | /health/action-inbox → 筛选类型 | 显示 AI 建议/告警/随访等行动项 | ☐ | +| F.2 | 处理行动 | 点击处理按钮 → 标记完成 | 行动项状态变更 | ☐ | + +## 8. 消息 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 8.1 | 无医护管理 | 输入 /health/doctors | 403 或不可见 | ☐ | -| 8.2 | 无标签管理 | 输入 /health/tags | 403 或不可见 | ☐ | -| 8.3 | 无积分 | 输入 /health/points-rules | 403 或不可见 | ☐ | -| 8.4 | 无内容管理 | 输入 /health/articles | 403 或不可见 | ☐ | -| 8.5 | 无 AI 管理 | 输入 /health/ai-analysis | 403 或不可见 | ☐ | -| 8.6 | 无随访模板 | 输入 /health/follow-up-templates | 403 或不可见 | ☐ | -| 8.7 | 无用户管理 | 输入 /users | 403 或不可见 | ☐ | +| 8.1 | 消息列表 | /messages → 查看 | 只读消息列表,可标记已读 | ☐ | -## 9. 小程序端 +## 9. 权限边界验证 + +> nurse 不应访问的模块 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 9.1 | 登录跳转 | nurse 角色登录 | 跳转到 `/pages/doctor/index`(isMedicalStaff=true) | ☐ | -| 9.2 | 工作概览 | 查看数据卡片 | 显示:我的患者、未读消息、待处理随访、今日咨询 | ☐ | -| 9.3 | 无健康审核区 | 查看页面 | **不显示**"健康审核"区域(无待审化验权限) | ☐ | -| 9.4 | 快捷操作 | 查看快捷操作 | 显示 4 个按钮:患者查询、随访记录、告警中心、行动收件箱(**没有**: 化验审核、透析管理、处方管理) | ☐ | +| 9.1 | 无医护管理 | 地址栏输入 /health/doctors | 403 或不可见 | ☐ | +| 9.2 | 无标签管理 | 地址栏输入 /health/tags | 403 或不可见 | ☐ | +| 9.3 | 无积分管理 | 地址栏输入 /health/points-rules | 403 或不可见 | ☐ | +| 9.4 | 无内容管理 | 地址栏输入 /health/articles | 403 或不可见 | ☐ | +| 9.5 | 无 AI 分析 | 地址栏输入 /health/ai-analysis | 403 或不可见 | ☐ | +| 9.6 | 无随访模板 | 地址栏输入 /health/follow-up-templates | 403 或不可见 | ☐ | +| 9.7 | 无用户管理 | 地址栏输入 /users | 403 或不可见 | ☐ | + +## 10. 跨角色协作验证 + +| # | 协作场景 | 操作 | 预期结果 | 通过 | +|---|----------|------|----------|------| +| X.1 | 医生随访转护士 | 查看医生创建的随访任务 | 任务出现在待办列表,可执行 | ☐ | +| X.2 | 录入后医生可查 | 完成随访录入 → 用 doctor 账号验证 | 医生可看到护士录入的随访内容 | ☐ | +| X.3 | 告警联动 | 患者体征异常 → 告警出现 | 告警出现在行动收件箱 | ☐ | + +## 11. 小程序端(医护工作台) + +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 11.1 | 登录跳转 | nurse_test 登录小程序 | 跳转到 `/pages/doctor/index`(isMedicalStaff=true) | ☐ | +| 11.2 | 问候语 | 查看问候 | 显示角色对应的问候 | ☐ | +| 11.3 | 工作概览 | 查看 4 个数据卡片 | 我的患者、未读消息、待处理随访、今日咨询 | ☐ | +| 11.4 | 无健康审核区 | 查看页面 | **不显示**"健康审核"区域 | ☐ | +| 11.5 | 快捷操作 | 查看 4 个按钮 | 患者查询、随访记录、告警中心、行动收件箱(**没有**: 化验审核、透析管理、处方管理) | ☐ | ## 测试结果 diff --git a/docs/qa/role-test-plans/R04-health-manager.md b/docs/qa/role-test-plans/R04-health-manager.md index 1c58aa5..5d213e2 100644 --- a/docs/qa/role-test-plans/R04-health-manager.md +++ b/docs/qa/role-test-plans/R04-health-manager.md @@ -1,93 +1,129 @@ -# R04 — Health Manager(健康管理师)测试计划 +# R04 — Health Manager(健康管理师)业务场景测试计划 -> 角色: health_manager | 测试账号: 需手动创建或复用 | 菜单数: 29 +> 角色: health_manager | 测试账号: 需手动创建或复用 | 菜单数: 29 | 重点: 健康协调与 AI 分析 -> **注意**: 当前数据库中暂无 health_manager 角色的测试用户。如需测试,先以 admin 登录,在用户管理中给某用户分配"健康管理师"角色。 +> **注意**: 当前数据库中暂无 health_manager 角色的测试用户。先以 admin 登录,在用户管理中给某用户分配"健康管理师"角色后再测试。 ## 1. 登录 & 仪表盘 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 1.1 | 登录 | 使用 health_manager 角色账号登录 | 成功登录,左侧菜单显示 29 个菜单项 | ☐ | -| 1.2 | 菜单过滤 | 检查左侧菜单 | **有**: 工作台、统计报表、消息中心、患者管理、医护管理(只读)、标签管理、随访管理、咨询管理、行动收件箱、随访模板、诊断记录、知情同意、告警仪表盘、设备管理、危急值阈值、AI分析历史、AI Prompt、AI用量、实时监控 | ☐ | -| 1.3 | 菜单排除 | 检查左侧菜单 | **没有**: 用户管理、权限管理、组织架构、工作流、系统设置、插件管理、积分运营、内容运营、BLE网关、OAuth | ☐ | -| 1.4 | 仪表盘视图 | 查看首页 | 应显示管理员/综合仪表盘(含统计概览和运营数据) | ☐ | +| 1.1 | 登录 | 使用 health_manager 角色账号登录 | 成功登录,左侧菜单 29 项 | ☐ | +| 1.2 | 仪表盘 | 查看首页 | 显示综合仪表盘(含统计概览和运营数据) | ☐ | -## 2. 患者医护 +## 2. 场景 A — 患者建档与标签管理 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 2.1 | 患者管理 | /health/patients | 列表 → 搜索 → 新增 → 编辑 | 完整 CRUD | ☐ | -| 2.2 | 医护管理(只读) | /health/doctors | 打开列表 | 可查看医护列表(无 doctor.manage 权限) | ☐ | -| 2.3 | 标签管理 | /health/tags | 列表 → 新增 → 编辑 | 标签 CRUD(有 tags.manage 权限) | ☐ | -| 2.4 | 诊断记录 | /health/diagnoses | 列表 → 查看 | 可查看和管理诊断记录 | ☐ | +> **业务链**: 管理标签 → 创建患者 → 分配标签 → 查看患者 -## 3. 随访咨询 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| A.1 | 标签管理 | /health/tags → 新增"慢性病管理"标签(绿色)→ 编辑颜色 → 保存 | 标签 CRUD 正常 | ☐ | +| A.2 | 患者管理 | /health/patients → 新增患者 → 分配标签 → 保存 | 患者创建成功,标签显示在卡片上 | ☐ | +| A.3 | 患者搜索 | 搜索框输入姓名 → 标签筛选 | 搜索和筛选结果正确 | ☐ | +| A.4 | 医护列表 | /health/doctors → 查看(只读) | 显示医护列表,无编辑/新增按钮(无 doctor.manage) | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 3.1 | 随访管理 | /health/follow-up-tasks | 列表 → 创建 → 录入 | 完整随访管理 | ☐ | -| 3.2 | 咨询管理 | /health/consultations | 列表 → 回复 | 可管理咨询(有 consultation.manage 权限) | ☐ | -| 3.3 | 行动收件箱 | /health/action-inbox | 列表 → 处理 → 团队视图 | 支持个人和团队视图(有 action-inbox.team 权限) | ☐ | -| 3.4 | 随访模板 | /health/follow-up-templates | 列表 → 新增 → 编辑 | 可管理随访模板 | ☐ | +**交接点**: 标签创建后,doctor/nurse 可在患者筛选器中使用。 -## 4. 监测 & 知情同意 +## 3. 场景 B — 随访管理闭环 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.1 | 知情同意 | /health/consents | 列表 → 管理 | 可查看和管理知情同意书 | ☐ | -| 4.2 | 日常监测 | /health/daily-monitoring | 查看监测数据 | 可查看和管理日常监测 | ☐ | -| 4.3 | 实时监控 | /health/realtime-monitor | 打开页面 | 显示实时体征监控面板 | ☐ | +> **业务链**: 创建随访任务 → 查看执行情况 → 管理团队行动 -## 5. 告警 & 设备 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| B.1 | 创建随访 | /health/follow-up-tasks → 新增 → 选患者/类型/日期 → 保存 | 随访任务创建成功 | ☐ | +| B.2 | 随访列表 | 按状态筛选 | 正确显示各状态随访 | ☐ | +| B.3 | 随访录入 | 点击某条随访 → 录入 → 保存 | 可录入随访记录 | ☐ | +| B.4 | 随访模板 | /health/follow-up-templates → 查看/编辑 | 可管理随访模板 | ☐ | +| B.5 | 团队视图 | 行动收件箱 → 切换团队视图 | 支持个人和团队视图(有 action-inbox.team 权限) | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 5.1 | 告警仪表盘 | /health/alert-dashboard | 打开页面 | 显示告警统计,可管理告警 | ☐ | -| 5.2 | 告警规则 | (通过告警仪表盘进入) | 查看/编辑规则 | 可查看和管理告警规则(有 alert-rules.manage 权限) | ☐ | -| 5.3 | 危急值阈值 | /health/critical-value-thresholds | 列表 → 查看 | 可查看危急值阈值配置 | ☐ | -| 5.4 | 设备管理 | /health/devices | 列表 → 查看 | 可查看设备列表(只读,无 devices.manage) | ☐ | +**交接点**: 健康管理师创建的随访任务,护士可执行录入。 -## 6. AI 分析 +## 4. 场景 C — 咨询管理 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 6.1 | AI 分析历史 | /health/ai-analysis | 列表 → 触发新分析 | 可查看和触发 AI 分析(有 ai.analysis.manage 权限) | ☐ | -| 6.2 | AI Prompt | /health/ai-prompts | 列表 → 查看 | 可查看 Prompt 模板(只读,有 ai.prompt.list) | ☐ | -| 6.3 | AI 建议 | (通过行动收件箱) | 查看 AI 建议 | 可查看和管理 AI 建议(有 ai.suggestion.manage 权限) | ☐ | -| 6.4 | AI 用量 | /health/ai-usage | 打开页面 | 显示 AI 调用量统计 | ☐ | +> **业务链**: 查看待处理咨询 → 回复 → 关闭 -## 7. 消息 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| C.1 | 咨询列表 | /health/consultations → 按状态筛选 | 显示 waiting/active/closed 咨询 | ☐ | +| C.2 | 回复咨询 | 进入对话 → 输入回复 → 发送 | 可回复(有 consultation.manage 权限) | ☐ | +| C.3 | 关闭咨询 | 点击结束咨询 | 咨询状态变为 closed | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 7.1 | 消息列表 | /messages | 打开消息中心 | 只读消息列表 | ☐ | +## 5. 场景 D — 告警与监测 -## 8. 工作流 +> **业务链**: 管理告警规则 → 查看告警 → 处理 → 监测数据 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 8.1 | 工作流只读 | (通过 API 或菜单) | 查看流程 | 可查看工作流(有 workflow.read 权限),可启动流程(有 workflow.start) | ☐ | +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| D.1 | 告警仪表盘 | /health/alert-dashboard → 查看 | 显示告警统计,可管理告警 | ☐ | +| D.2 | 告警规则 | 通过告警仪表盘进入 → 查看/编辑规则 | 可管理告警规则(有 alert-rules.manage) | ☐ | +| D.3 | 处理告警 | 点击某条告警 → 确认/处理 | 告警状态变更 | ☐ | +| D.4 | 危急值阈值 | /health/critical-value-thresholds → 查看 | 可查看阈值配置 | ☐ | +| D.5 | 设备管理 | /health/devices → 查看(只读) | 设备列表可查看,无编辑按钮(无 devices.manage) | ☐ | +| D.6 | 日常监测 | /health/daily-monitoring → 查看数据 | 可查看和管理日常监测数据 | ☐ | +| D.7 | 实时监控 | /health/realtime-monitor → 查看 | 显示实时体征监控面板 | ☐ | -## 9. 权限边界验证 +## 6. 场景 E — AI 分析与建议 + +> **业务链**: 触发 AI 分析 → 查看 Prompt → 管理 AI 建议 → 查看用量 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| E.1 | AI 分析 | /health/ai-analysis → 触发新分析 → 查看结果 | 可触发和管理 AI 分析(有 ai.analysis.manage) | ☐ | +| E.2 | AI Prompt | /health/ai-prompts → 查看模板 | 只读查看 Prompt(有 ai.prompt.list,无 manage) | ☐ | +| E.3 | AI 建议 | 行动收件箱 → 查看 AI 建议 → 采纳/拒绝 | 可管理 AI 建议(有 ai.suggestion.manage) | ☐ | +| E.4 | AI 用量 | /health/ai-usage → 查看 | 显示 AI 调用量统计 | ☐ | + +## 7. 场景 F — 诊断与知情同意 + +> **业务链**: 查看诊断 → 管理知情同意 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| F.1 | 诊断记录 | /health/diagnoses → 查看 | 可查看和管理诊断记录 | ☐ | +| F.2 | 知情同意 | /health/consents → 管理 | 可查看和管理知情同意书 | ☐ | + +## 8. 消息 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 9.1 | 无用户管理 | 输入 /users | 403 | ☐ | -| 9.2 | 无积分管理 | 输入 /health/points-rules | 403 | ☐ | -| 9.3 | 无内容管理 | 输入 /health/articles | 403 | ☐ | -| 9.4 | 无系统设置 | 输入 /settings | 403 | ☐ | -| 9.5 | 无插件管理 | 输入 /plugins/admin | 403 | ☐ | -| 9.6 | 无 BLE 网关 | 输入 /health/ble-gateways | 403 | ☐ | +| 8.1 | 消息列表 | /messages → 查看 | 只读消息列表 | ☐ | -## 10. 小程序端 +## 9. 工作流 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 10.1 | 登录跳转 | health_manager 角色登录 | 跳转到 `/pages/doctor/index`(isMedicalStaff 现在包含 health_manager) | ☐ | -| 10.2 | 工作概览 | 查看数据卡片 | 显示:我的患者、未读消息、待处理随访、今日咨询 | ☐ | -| 10.3 | 无健康审核区 | 查看页面 | **不显示**"健康审核"区域(无待审化验权限) | ☐ | -| 10.4 | 快捷操作 | 查看快捷操作 | 显示 4 个按钮:患者查询、随访记录、告警中心、行动收件箱(**没有**: 化验审核、透析管理、处方管理) | ☐ | +| 9.1 | 工作流 | 查看/启动流程 | 可查看(workflow.read)和启动(workflow.start),不可编辑 | ☐ | + +## 10. 权限边界验证 + +> health_manager 不应访问的模块 + +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 10.1 | 无用户管理 | 地址栏输入 /users | 403 | ☐ | +| 10.2 | 无积分管理 | 地址栏输入 /health/points-rules | 403 | ☐ | +| 10.3 | 无内容管理 | 地址栏输入 /health/articles | 403 | ☐ | +| 10.4 | 无系统设置 | 地址栏输入 /settings | 403 | ☐ | +| 10.5 | 无插件管理 | 地址栏输入 /plugins/admin | 403 | ☐ | +| 10.6 | 无 BLE 网关 | 地址栏输入 /health/ble-gateways | 403 | ☐ | + +## 11. 跨角色协作验证 + +| # | 协作场景 | 操作 | 预期结果 | 通过 | +|---|----------|------|----------|------| +| X.1 | 标签共享 | 新建标签 → 用 doctor 账号验证 | doctor 可在患者筛选中使用新标签 | ☐ | +| X.2 | 随访指派 | 创建随访 → 用 nurse 账号验证 | 护士可看到并执行该随访 | ☐ | +| X.3 | 团队行动 | 切换团队视图 → 查看全团队行动 | 显示所有团队成员的待办行动 | ☐ | +| X.4 | AI 建议协同 | 查看 AI 建议 → 采纳 → 验证医生可见 | 采纳的建议同步到医生视图 | ☐ | + +## 12. 小程序端(医护工作台) + +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 12.1 | 登录跳转 | health_manager 登录小程序 | 跳转到 `/pages/doctor/index`(isMedicalStaff 包含 health_manager) | ☐ | +| 12.2 | 工作概览 | 查看 4 个数据卡片 | 我的患者、未读消息、待处理随访、今日咨询 | ☐ | +| 12.3 | 无健康审核区 | 查看页面 | **不显示**"健康审核"区域 | ☐ | +| 12.4 | 快捷操作 | 查看 4 个按钮 | 患者查询、随访记录、告警中心、行动收件箱(**没有**: 化验审核、透析管理、处方管理) | ☐ | ## 测试结果 diff --git a/docs/qa/role-test-plans/R05-operator.md b/docs/qa/role-test-plans/R05-operator.md index ba2c118..bbf33a6 100644 --- a/docs/qa/role-test-plans/R05-operator.md +++ b/docs/qa/role-test-plans/R05-operator.md @@ -1,80 +1,118 @@ -# R05 — Operator(运营人员)测试计划 +# R05 — Operator(运营人员)业务场景测试计划 -> 角色: operator | 测试账号: operator_test / Admin@2026 | 菜单数: 24 +> 角色: operator | 测试账号: operator_test / Admin@2026 | 菜单数: 24 | 重点: 内容运营与积分商城 ## 1. 登录 & 仪表盘 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 1.1 | 登录 | 输入 operator_test / Admin@2026 | 成功登录,左侧菜单显示 24 个菜单项 | ☐ | -| 1.2 | 菜单过滤 | 检查左侧菜单 | **有**: 工作台、统计报表、消息中心、患者管理、标签管理、积分规则、商品管理、订单管理、线下活动、内容管理、设备管理、告警仪表盘、AI用量 | ☐ | -| 1.3 | 菜单排除 | 检查左侧菜单 | **没有**: 用户管理、权限管理、组织架构、工作流、系统设置、插件管理、医护管理、随访管理、咨询管理、行动收件箱、随访模板、诊断记录、知情同意、实时监控、BLE网关、危急值阈值、AI分析、AI Prompt、OAuth | ☐ | -| 1.4 | 运营仪表盘 | 查看首页 | 显示"运营仪表盘",包含:运营洞察、积分动态(今日发放/消费)、内容矩阵(已发布/草稿)、今日待办 | ☐ | -| 1.5 | 运营 AI 摘要 | 查看顶部 AI 摘要 | 显示 AI 生成的运营重点摘要 | ☐ | -| 1.6 | 快捷操作 | 查看按钮 | 显示:审核积分订单、发布新文章、推送活动提醒 | ☐ | +| 1.1 | 登录 | 输入 operator_test / Admin@2026 | 成功登录,左侧菜单 24 项 | ☐ | +| 1.2 | 运营仪表盘 | 查看首页 | 显示"运营仪表盘":运营洞察、积分动态(今日发放/消费)、内容矩阵(已发布/草稿)、今日待办 | ☐ | +| 1.3 | AI 摘要 | 查看顶部 AI 摘要 | 显示 AI 生成的运营重点摘要 | ☐ | +| 1.4 | 快捷操作 | 查看按钮 | 审核积分订单、发布新文章、推送活动提醒 | ☐ | -## 2. 患者管理 +## 2. 场景 A — 患者与标签管理 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 2.1 | 患者列表(只读) | /health/patients | 打开列表 | 可查看患者列表(有 patient.list 权限,无 manage,确认新增按钮是否隐藏) | ☐ | -| 2.2 | 标签管理 | /health/tags | 列表 → 新增 → 编辑 | 可管理标签(有 tags.manage 权限) | ☐ | +> **业务链**: 管理标签 → 查看患者(只读) -## 3. 积分运营 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| A.1 | 标签管理 | /health/tags → 新增"术后康复"标签 → 编辑 → 保存 | 标签 CRUD 正常(有 tags.manage) | ☐ | +| A.2 | 患者列表 | /health/patients → 查看列表 | 只读查看,确认新增按钮是否隐藏(有 patient.list 无 manage) | ☐ | +| A.3 | 患者搜索 | 搜索框输入 → 标签筛选 | 搜索和筛选正常 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 3.1 | 积分规则 | /health/points-rules | 打开列表 → 查看 | 显示积分规则列表,可管理规则 | ☐ | -| 3.2 | 商品管理 | /health/points-products | 打开列表 → 新增 | 可管理积分商品 | ☐ | -| 3.3 | 订单管理 | /health/points-orders | 打开列表 → 查看 | 显示兑换订单列表 | ☐ | -| 3.4 | 线下活动 | /health/offline-events | 打开列表 → 查看 | 显示线下活动列表 | ☐ | +**交接点**: 标签创建后,医护角色可在患者筛选中使用。 -## 4. 内容运营 +## 3. 场景 B — 内容发布链 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 4.1 | 内容管理 | /health/articles | 列表 → 新增 → 编辑 → 发布 | 可管理文章(有 articles.manage 和 articles.review 权限) | ☐ | -| 4.2 | 文章发布 | /health/articles | 编辑文章 → 点击发布 | 文章状态变为已发布 | ☐ | +> **业务链**: 创建文章 → 编辑 → 提交审核 → 发布 → 验证已发布 -## 5. 设备 & 告警 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| B.1 | 创建文章 | /health/articles → 新增 → 填写标题/内容 → 保存草稿 | 文章状态 draft | ☐ | +| B.2 | 编辑文章 | 点击草稿 → 修改内容 → 保存 | 内容更新 | ☐ | +| B.3 | 发布文章 | 点击发布 | 状态 draft → published(有 articles.manage 和 articles.review) | ☐ | +| B.4 | 内容矩阵 | 回到运营仪表盘 → 查看内容矩阵 | 已发布/草稿数量更新 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 5.1 | 设备管理(只读) | /health/devices | 打开列表 | 可查看设备列表(只读,无 devices.manage) | ☐ | -| 5.2 | 告警仪表盘 | /health/alert-dashboard | 打开页面 | 可查看告警统计(只有 alerts.list,无 manage,确认操作按钮) | ☐ | +**交接点**: 已发布文章患者端小程序可见。 -## 6. AI 用量 +## 4. 场景 C — 积分商城链 -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 6.1 | AI 用量统计 | /health/ai-usage | 打开页面 | 可查看 AI 调用量(只读) | ☐ | +> **业务链**: 配置积分规则 → 上架商品 → 查看订单 -## 7. 消息 +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| C.1 | 积分规则 | /health/points-rules → 查看 → 编辑规则 | 可管理积分规则 | ☐ | +| C.2 | 新增商品 | /health/points-products → 新增 → 填写名称/积分/库存 → 保存 | 商品出现在列表 | ☐ | +| C.3 | 订单管理 | /health/points-orders → 查看订单列表 | 显示兑换订单 | ☐ | +| C.4 | 积分动态 | 回到运营仪表盘 → 查看积分动态 | 今日发放/消费数据更新 | ☐ | -| # | 测试项 | 路径 | 操作 | 预期结果 | 通过 | -|---|--------|------|------|----------|------| -| 7.1 | 消息列表 | /messages | 打开消息中心 | 只读消息列表 | ☐ | +**交接点**: 商品上架后,患者端小程序积分商城可见可兑换。 -## 8. 权限边界验证 +## 5. 场景 D — 线下活动链 + +> **业务链**: 创建活动 → 查看报名 → 管理 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| D.1 | 创建活动 | /health/offline-events → 新增 → 填写名称/时间/地点 → 保存 | 活动创建成功 | ☐ | +| D.2 | 查看活动 | 列表查看活动详情 | 显示报名人数、活动状态 | ☐ | + +## 6. 场景 E — 设备与告警查看 + +> **业务链**: 查看设备状态 → 查看告警统计 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| E.1 | 设备管理 | /health/devices → 查看列表 | 只读查看(无 devices.manage) | ☐ | +| E.2 | 告警仪表盘 | /health/alert-dashboard → 查看 | 只读查看(只有 alerts.list,确认操作按钮不可用) | ☐ | + +## 7. 场景 F — AI 用量 + +> **业务链**: 查看 AI 调用统计 + +| # | 步骤 | 操作 | 预期结果 | 通过 | +|---|------|------|----------|------| +| F.1 | AI 用量 | /health/ai-usage → 查看 | 只读查看 AI 调用量 | ☐ | + +## 8. 消息 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 8.1 | 无用户管理 | 输入 /users | 403 | ☐ | -| 8.2 | 无医护管理 | 输入 /health/doctors | 403 | ☐ | -| 8.3 | 无随访管理 | 输入 /health/follow-up-tasks | 403 | ☐ | -| 8.4 | 无咨询管理 | 输入 /health/consultations | 403 | ☐ | -| 8.5 | 无诊断记录 | 输入 /health/diagnoses | 403 | ☐ | -| 8.6 | 无行动收件箱 | 输入 /health/action-inbox | 403 | ☐ | -| 8.7 | 无知情同意 | 输入 /health/consents | 403 | ☐ | -| 8.8 | 无 AI 分析 | 输入 /health/ai-analysis | 403 | ☐ | -| 8.9 | 无系统设置 | 输入 /settings | 403 | ☐ | +| 8.1 | 消息列表 | /messages → 查看 | 只读消息列表 | ☐ | -## 9. 小程序端 +## 9. 权限边界验证 + +> operator 不应访问的模块 | # | 测试项 | 操作 | 预期结果 | 通过 | |---|--------|------|----------|------| -| 9.1 | 登录跳转 | operator 角色登录 | 跳转到患者首页(isMedicalStaff=false,因为 operator 不在医护列表中) | ☐ | -| 9.2 | 患者首页 | 查看首页 | 显示体征完成度、今日待办、快捷操作(普通患者视图) | ☐ | +| 9.1 | 无用户管理 | 地址栏输入 /users | 403 | ☐ | +| 9.2 | 无医护管理 | 地址栏输入 /health/doctors | 403 | ☐ | +| 9.3 | 无随访管理 | 地址栏输入 /health/follow-up-tasks | 403 | ☐ | +| 9.4 | 无咨询管理 | 地址栏输入 /health/consultations | 403 | ☐ | +| 9.5 | 无诊断记录 | 地址栏输入 /health/diagnoses | 403 | ☐ | +| 9.6 | 无行动收件箱 | 地址栏输入 /health/action-inbox | 403 | ☐ | +| 9.7 | 无知情同意 | 地址栏输入 /health/consents | 403 | ☐ | +| 9.8 | 无 AI 分析 | 地址栏输入 /health/ai-analysis | 403 | ☐ | +| 9.9 | 无系统设置 | 地址栏输入 /settings | 403 | ☐ | + +## 10. 跨角色协作验证 + +| # | 协作场景 | 操作 | 预期结果 | 通过 | +|---|----------|------|----------|------| +| X.1 | 标签共享 | 新建标签 → 用 doctor 账号验证 | doctor 可在患者筛选中使用新标签 | ☐ | +| X.2 | 内容发布同步 | 发布文章 → 验证患者端可见 | 小程序患者端可见已发布内容 | ☐ | +| X.3 | 积分订单联动 | 患者兑换商品 → 查看订单 | 订单出现在积分订单列表 | ☐ | + +## 11. 小程序端(患者视角) + +> operator 不在医护列表中,以普通患者身份使用小程序 + +| # | 测试项 | 操作 | 预期结果 | 通过 | +|---|--------|------|----------|------| +| 11.1 | 登录跳转 | operator_test 登录小程序 | 跳转到患者首页(isMedicalStaff=false) | ☐ | +| 11.2 | 患者首页 | 查看首页 | 显示体征完成度、今日待办、快捷操作(普通患者视图) | ☐ | ## 测试结果