Files
hms/docs/audits/v2/04-backend-integrity.md
iven df1d85bfde docs: T40 UI 审计报告 + wiki 更新 + Docker 配置
- T40 UI 审计计划和结果文档(docs/qa/)
- wiki 更新:miniprogram 设计系统合规审计记录 + index 关键数字更新
- 审计 V2 完整报告(docs/audits/v2/)
- 讨论记录文档(docs/discussions/)
- 设计规格和实施计划(docs/superpowers/)
- 角色测试计划和结果(docs/qa/role-test-*)
- Docker 生产部署配置
2026-05-13 23:29:42 +08:00

123 lines
4.9 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.
# HMS 后端完整性审计
> 审计范围: `crates/erp-health/src/`
> 审计日期: 2026-05-04
---
## 1. Handler → Service 覆盖率
Handler 目录共 29 个业务文件(不含 mod.rs。逐一比对 service/ 目录:
| Handler 文件 | 对应 Service | 状态 |
|---|---|---|
| action_inbox_handler.rs | action_inbox_service.rs | OK |
| alert_handler.rs | alert_service.rs | OK |
| alert_rule_handler.rs | alert_rule_service.rs | OK |
| appointment_handler.rs | appointment_service.rs | OK |
| article_category_handler.rs | article_category_service.rs | OK |
| article_handler.rs | article_service.rs | OK |
| article_tag_handler.rs | article_tag_service.rs | OK |
| ble_gateway_handler.rs | ble_gateway_service.rs | OK |
| care_plan_handler.rs | care_plan_service.rs | OK |
| consent_handler.rs | consent_service.rs | OK |
| consultation_handler.rs | consultation_service.rs | OK |
| critical_alert_handler.rs | critical_alert_service.rs | OK |
| critical_value_threshold_handler.rs | critical_value_threshold_service.rs | OK |
| daily_monitoring_handler.rs | daily_monitoring_service.rs | OK |
| device_handler.rs | device_service.rs | OK |
| device_reading_handler.rs | device_reading_service.rs | OK |
| diagnosis_handler.rs | diagnosis_service.rs | OK |
| doctor_handler.rs | doctor_service.rs | OK |
| family_proxy_handler.rs | family_proxy_service.rs | OK |
| follow_up_handler.rs | follow_up_service.rs | OK |
| follow_up_template_handler.rs | follow_up_template_service.rs | OK |
| health_data_handler.rs | health_data_service/ | OK |
| medication_record_handler.rs | medication_record_service.rs | OK |
| medication_reminder_handler.rs | medication_reminder_service.rs | OK |
| patient_handler.rs | patient_service/ | OK |
| points_handler.rs | points_service/ | OK |
| shift_handler.rs | shift_service.rs | OK |
| stats_handler.rs | stats_service/ | OK |
| vital_signs_daily_handler.rs | vital_signs_daily_service.rs | OK |
**缺失: 0** — 所有 handler 均有对应 service。
> 注: FHIR handler 位于独立模块 `src/fhir/handler.rs`,不经过 service 层,直接调用
> `fhir/converter.rs` 转换后查询。此为合理架构,不视为缺失。
---
## 2. 冗余代码统计
| 指标 | 数量 | 详情 |
|---|---|---|
| `#[allow(dead_code)]` | **4** | action_inbox_service.rs (3), stats_service/health.rs (1) |
| `#[allow(unused...)]` | **0** | — |
| `todo!()` | **0** | — |
| `unimplemented!()` | **0** | — |
| `TODO` / `FIXME` / `HACK` 注释 | **1** | `src/event.rs:51` — TODO: 患者认证和死亡记录流程待后续迭代 |
**结论**: 冗余代码极少,代码库健康。建议清理 4 处 `dead_code` 标注。
---
## 3. unwrap() 风险分析
service/ 目录共 16 处 `.unwrap()`,按上下文分类:
### 生产代码中的 unwrap (高风险)
| 文件 | 行号 | 代码 | 风险 |
|---|---|---|---|
| action_inbox_service.rs | L306 | `user_id.unwrap()` | **高** — SQL 注入 + panic 风险 |
| vital_signs_daily_service.rs | L14, L92 | `date.and_hms_opt(0,0,0).unwrap()` | **低** — 固定参数不会失败,但应改用 `expect()` |
| vital_signs_daily_service.rs | L15, L93 | `date.and_hms_opt(23,59,59).unwrap()` | **低** — 同上 |
| vital_signs_daily_service.rs | L115 | `.partial_cmp(b).unwrap()` | **中** — NaN 时 panic |
### 测试代码中的 unwrap (可接受)
| 文件 | 数量 |
|---|---|
| alert_service.rs | 3 处 |
| trend_stats.rs | 6 处 |
**建议优先修复**:
1. `action_inbox_service.rs:306``user_id.unwrap()` 同时存在 SQL 注入风险
(直接拼接 SQL 字符串),应改用参数化查询 + `ok_or(AppError)` 模式
2. `vital_signs_daily_service.rs:115` — 浮点比较改用 `unwrap_or(Ordering::Equal)`
---
## 4. DTO 覆盖检查
针对 5 个新增模块逐一检查:
| 模块 | Handler 位置 | DTO 文件 | 状态 |
|---|---|---|---|
| care_plan | handler/care_plan_handler.rs | dto/care_plan_dto.rs | **有** |
| shift | handler/shift_handler.rs | dto/shift_dto.rs | **有** |
| ble_gateway | handler/ble_gateway_handler.rs | dto/ble_gateway_dto.rs | **有** |
| action_inbox | handler/action_inbox_handler.rs | 内嵌于 service (ActionItem 等 12 个结构体) | **无独立 DTO** |
| fhir | fhir/handler.rs + fhir/types.rs | fhir/types.rs | **有** (模块内自带) |
**说明**:
- `action_inbox` 的 DTO 类型 (ActionItem, ThreadResponse, ActionInboxQuery 等)
定义在 `action_inbox_service.rs` 中而非独立 dto 文件。建议抽取到
`dto/action_inbox_dto.rs` 以保持一致性。
- `fhir` 模块在 `fhir/types.rs` 中定义了自己的 FHIR 资源类型,无需在 dto/ 目录
重复定义。
---
## 汇总
| 检查项 | 结果 | 严重度 |
|---|---|---|
| Handler→Service 覆盖 | 29/29 完整 | — |
| 冗余代码 | 4 dead_code + 1 TODO | 低 |
| unwrap 风险 | 5 处生产代码 | action_inbox **高**, 其余低 |
| DTO 覆盖 | 5/5 模块均已有定义 | action_inbox 建议抽取 |
**最高优先级修复**: `action_inbox_service.rs:306``unwrap()` + SQL 拼接问题。