# 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 拼接问题。