- T40 UI 审计计划和结果文档(docs/qa/) - wiki 更新:miniprogram 设计系统合规审计记录 + index 关键数字更新 - 审计 V2 完整报告(docs/audits/v2/) - 讨论记录文档(docs/discussions/) - 设计规格和实施计划(docs/superpowers/) - 角色测试计划和结果(docs/qa/role-test-*) - Docker 生产部署配置
123 lines
4.9 KiB
Markdown
123 lines
4.9 KiB
Markdown
# 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 拼接问题。
|