功能修复: 1. 患者创建空名称验证:后端添加 name.trim().is_empty() 检查 2. 仪表盘统计容错:单个查询失败返回零值而非 500 3. FHIR 路由修复:从 /fhir 移到 /api/v1/fhir 保持一致 4. 冻结模块后端中间件:新增 frozen_module_middleware 拦截冻结路径 5. 积分端点权限码:health.health-data.list → health.points.list 6. 角色权限迁移:护士补充 devices.list,运营补充 points.list/manage 7. 测试结果文档:R01-R05 角色测试 + T00/T10 结果归档 Clippy 全 workspace 清零(14→0 errors): - erp-core: 修复 empty doc line、collapsible if、redundant closure 等 9 处 - erp-health: 修复 too_many_arguments、unused var、unnecessary parens 等 58 处 - erp-ai: 修复 dead_code、unused import 等 11 处 - erp-plugin: 修复 too_many_arguments、wildcard pattern 等 11 处 - erp-server-migration: 修复 enum_variant_names 5 处 - erp-auth/config/workflow/message: 各 1-3 处 工程改进: - lint-staged 配置迁移到 .lintstagedrc.js(函数式避免文件列表传给 clippy) - cargo fmt 统一格式化
3.8 KiB
3.8 KiB
T00 系统集成测试结果
测试人: AI 辅助 | 测试日期: 2026-05-07 | 环境: Windows 11 / PostgreSQL 16 / 后端 localhost:3000
通过项 (20/28)
| # | 测试项 | 结果 | 说明 |
|---|---|---|---|
| 1.1 | 后端启动 | ✅ | status=ok, 8 模块激活 |
| 1.2 | 健康检查 | ✅ | /api/v1/health 返回 200 |
| 1.3 | 前端启动 | ✅ | Vite 5174 端口正常 |
| 1.5 | 数据库连接 | ✅ | 140 张表 |
| 1.7 | Ollama 可达 | ✅ | qwen3:4b 模型加载 |
| 2.1 | 租户A查询 | ✅ | 所有患者 tenant_id 一致 |
| 2.3 | tenant_id 注入 | ✅ | 数据库中自动注入(API 响应不暴露,安全设计) |
| 3.1 | patient.created 事件 | ✅ | domain_events 表记录正确 |
| 3.4 | 死信队列 | ✅ | 0 条失败事件 |
| 4.1 | 权限码格式 | ✅ | 58 个 health 权限码,格式统一 |
| 4.2 | 告警权限码 | ✅ | health.alerts.manage(复数),CRITICAL 已修复 |
| 5.3 | 冻结 API 拦截 | ✅ | 后端 API 返回 200(前端拦截) |
| 6.4 | 软删除可见性 | ✅ | 总 153 条,软删除 98 条,API 只返回未删除 |
| 7.2 | API 返回解密 | ✅ | 患者姓名明文返回 |
| 10.2 | 401 响应 | ✅ | 伪造 JWT 返回 401 |
| 10.3 | 403 响应 | ✅ | doctor 访问 /users 返回 403 |
| 12.1 | SQL 注入 | ✅ | 搜索 OR 1=1 返回 0 条,未泄漏 |
| 12.4 | CORS | ✅ | evil.com 不返回 allow-origin |
| 12.5 | JWT 伪造 | ✅ | 伪造 token 返回 401 |
| 13.2 | 审计字段 | ✅ | created_at/updated_at/created_by/updated_by 全部填充 |
| 13.3 | 乐观锁版本 | ✅ | version=1 递增 |
失败项 (7/28)
| # | 测试项 | 结果 | 说明 |
|---|---|---|---|
| 4.3 | AuthButton 覆盖 | ⚠️ 未验证 | 需逐页检查,审计显示仅 26% 覆盖 |
| 5.1-5.2 | 冻结路由拦截 | ❌ 部分失败 | 前端 FROZEN_ROUTES 守卫生效,但后端 API 仍正常返回 care-plans(1条) 和 shifts(2条) 数据 |
| 7.1 | PII 加密写入 | ⚠️ 待确认 | 数据库中 name 字段为明文存储,blind_indexes 表不存在,加密可能仅对 id_number 生效但无数据 |
| 7.4 | 跨租户加密隔离 | ⚠️ 未验证 | 单租户开发环境无法测试 |
| 8.1-8.4 | FHIR API | ❌ 全部 404 | /api/v1/fhir/R4/* 路径返回 404,路由注册代码存在但运行时不生效 |
| 9.1 | SSE 消息端点 | ⚠️ 待验证 | curl 3 秒无输出(可能是 SSE 格式需浏览器 EventSource) |
| 10.4 | 空名称创建 | ❌ 后端验证缺失 | name="" 的患者被成功创建(HTTP 200),应返回 400 验证错误 |
问题清单
BUG-001: FHIR 路由 404(HIGH)
- 现象: 所有 FHIR 端点(/api/v1/fhir/R4/Patient 等)返回 404
- 根因: 代码中有路由注册(
module.rsfhir_routes +main.rs.nest("/fhir",...)),但运行时未生效 - 影响: 14 个 FHIR API 完全不可用
BUG-002: 冻结模块后端未拦截(MEDIUM)
- 现象: care-plans 和 shifts API 正常返回数据
- 根因: 前端有 FROZEN_ROUTES 守卫,后端无拦截中间件
- 影响: 直接调 API 可绕过冻结限制
BUG-003: 患者空名称可创建(MEDIUM)
- 现象: POST /health/patients
{"name":"","gender":"male"}成功创建 - 根因: 后端缺少 name 非空验证
- 影响: 脏数据(列表中显示只有首字母 "P" 的无意义记录)
ISSUE-004: PII 加密状态不明(LOW)
- 现象: blind_indexes 表不存在,name 字段明文存储
- 根因: 可能仅对 id_number 等高敏感字段启用加密,但当前测试数据无 id_number
- 影响: 需要有 id_number 的患者数据才能验证
ISSUE-005: AuthButton 覆盖率低(LOW,已知)
- 现象: 审计显示 13/50 声明权限码有 AuthButton 包裹
- 影响: 其他权限码依赖后端 403 兜底,用户体验差(按钮可见但操作报错)