docs: 架构反思讨论记录 + CLAUDE.md 事件消费者制度约束
Some checks failed
CI / frontend-build (push) Has been cancelled
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- 讨论结论:WASM 插件积极使用(评估量表)、积分/透析拆独立 crate、事件驱动制度化
- CLAUDE.md §3.4 新增铁律:每个事件必须有至少一个消费者,否则功能不算完成
This commit is contained in:
iven
2026-04-28 11:46:31 +08:00
parent e03a2be1b6
commit 10755cde0e
2 changed files with 92 additions and 0 deletions

View File

@@ -158,6 +158,7 @@
- 事件必须持久化到 `domain_events` 表outbox 模式)
- 事件处理失败记录到 dead-letter 存储
- 事件类型命名:`{模块}.{动作}` 如 `user.created`, `workflow.task.completed`
- **铁律:每个事件必须有至少一个消费者,否则功能不算完成。** 新增事件发布时必须同步实现消费者和对应测试。详见 `docs/discussions/2026-04-28-architecture-retrospective.md` §4。
### 3.5 Rust 代码规范

View File

@@ -0,0 +1,91 @@
# 架构反思讨论 — 17 天后审视设计决策
> 日期: 2026-04-28 | 参与者: 用户 + Claude
## 背景
HMS 健康管理平台经过 17 天密集开发301+ 次提交63k 行 Rust15 crate67 表),功能层面已建成完整的医疗 SaaS 骨架。技术债清理策略已在另一次讨论中确定(安全→事件→测试三批次),本次聚焦于架构层面的反思和调整。
## 讨论要点
### 1. 架构做对的事
- **模块隔离** — ErpModule trait + EventBus + 事件驱动,模块间零直接依赖,撑住了 15 crate 的复杂度
- **多租户从第一天设计** — tenant_id 在所有表、所有查询、中间件层统一处理
- **UUID v7 主键** — 时间排序 + 分布式友好
- **软删除 + 乐观锁** — 医疗数据不可丢失,审计追溯需要
### 2. 插件系统WASM的价值
**现状:** erp-plugin 运行时 + 动态表引擎 + 4 个示例插件CRM/inventory/freelance/itops约 5k-8k 行 Rust 投入,但 HMS 核心业务erp-health 34 实体)使用原生模块。
**结论:积极使用,而非冻结或移除。**
适合 WASM 插件的医疗场景:
- **标准化评估量表**PHQ-9、GAD-7、SF-36— 动态表定义 + CRUD + 评分逻辑 + 事件触发,最契合 WASM 能力
- **医院自定义表单** — 不同医院的自定义入院问诊表、满意度问卷,多租户天然支持
落地路径:
- Phase 1标准化评估量表插件PHQ-9 先行)
- Phase 2医院自定义表单需要插件生成器
### 3. health 模块边界
**问题:** erp-health 承载 34 个实体,部分业务不属于"健康管理核心"。
**结论:**
| 模块 | 去向 | 理由 |
|------|------|------|
| 积分商城6 实体) | → 独立 erp-points | 通用积分能力,不应耦合在健康模块 |
| 透析管理2-3 实体) | → 独立 erp-dialysis | 专科模块化,未来可扩展其他专科(慢病、康复) |
| 内容管理 | → 留在 health | 作为"健康宣教"功能的一部分,与患者教育紧密 |
| 线下活动 | → 留在 health | 社区义诊、体检活动是健康管理的一部分 |
| 危急值告警 | → 留在 health | 与体征数据强关联 |
**erp-dialysis 的意义:** 专科模块化模式。未来可能有 erp-chronic慢病、erp-rehab康复通过事件与 health 核心交互。
### 4. 事件驱动架构的定位
**问题:** 13 种事件只消费了 3 个。事件驱动被当作"锦上添花"而非"核心机制"。
**根因分析:**
- 开发顺序是"API → 顺手发事件 → 消费者以后再写"
- 应该是"定义事件契约 → 实现消费者 → 实现发布者 → 测试闭环"
- 功能完成标准只有"API 返回 200",缺少"事件已被消费"
**结论:建立制度约束。**
规则:**每个事件必须有至少一个消费者,否则功能不算完成。**
执行方式:
- PR 检查清单:新增事件发布必须同时实现消费者
- event.rs 注册检查:每个常量必须有对应订阅
- 测试覆盖:消费者必须有集成测试
- 文档同步:事件契约在 wiki 维护
**旧事件补全优先级:**
| 优先级 | 事件 | 消费者 |
|--------|------|--------|
| P0 | `health_data.critical_alert` | 危急值告警(已在技术债计划中) |
| P1 | `patient.created` | 欢迎消息 + 默认随访 |
| P1 | `appointment.confirmed` | 通知医护 + 通知患者 |
| P1 | `appointment.cancelled` | 释放号源 + 通知排队 |
| P1 | `follow_up.overdue` | 升级通知 |
| P2 | `lab_report.uploaded` | AI 解读 + 积分 |
| P2 | `article.published` | 推送通知 |
| P2 | `points.earned` | 余额变动通知 |
## 结论 / 待定
**已决策:**
1. WASM 插件系统积极使用,评估量表作为第一个业务插件
2. 积分拆 erp-points已启动透析拆 erp-dialysis后续任务
3. 事件驱动制度约束写入 CLAUDE.md
**待定:**
- erp-dialysis 的拆分时机(建议在技术债清理完成后)
- 评估量表插件的详细设计(需单独讨论)
- 前后端是否需要 BFF 层(未展开讨论)
- 小程序技术选型Taro 跨端能力未被利用)是否需要调整