Files
hms/wiki/database.md
iven ca50d32f6e
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
feat(health): 添加 erp-health 健康管理模块骨架
新建 erp-health 原生 Rust crate,覆盖设计规格中定义的 5 大业务域:

- 16 个 SeaORM Entity(患者/家属/标签/医生/健康档案/体征/化验单/预约/排班/随访/咨询等)
- 16 表数据库迁移(含索引、外键、默认值、可回滚)
- 40+ API 路由骨架(患者管理/健康数据/预约排班/随访/咨询/医生管理)
- 12 个权限声明(health.patient/health-data/appointment/follow-up/consultation/doctor 各 .list/.manage)
- DTO / Service / Handler / Event 四层架构,Service 使用 todo!() 占位
- erp-server 集成:模块注册 + AppState FromRef 桥接 + 路由挂载

同步更新 CLAUDE.md 项目进度、wiki 知识库、设计规格文档。
2026-04-23 19:59:22 +08:00

3.2 KiB
Raw Blame History

title, updated, status, tags
title updated status tags
数据库迁移与模式 2026-04-23 stable
database
seaorm
migration
multi-tenant

数据库迁移与模式

index 导航。关联: erp-core erp-server infrastructure

1. 设计决策

  • SeaORM Migration — 异步、类型安全、幂等(if_not_exists),每个迁移必须实现 down() 可回滚
  • 所有表必须含标准字段id(UUIDv7), tenant_id, created_at, updated_at, created_by, updated_by, deleted_at, version
  • 软删除 — 不硬删除,设置 deleted_at 时间戳
  • 乐观锁 — 更新时检查 version 字段
  • 多租户 — 所有业务表含 tenant_id,中间件自动过滤

2. 关键文件 + 数据流

核心文件

文件 职责
crates/erp-server/migration/src/lib.rs Migrator 注册所有迁移
crates/erp-server/migration/src/m*.rs 41 个迁移文件
crates/erp-core/src/types.rs BaseFields 标准字段定义

迁移命名规则

m{YYYYMMDD}_{6位序号}_{描述}.rs
例: m20260410_000001_create_tenant.rs

当前表概览30 张)

模块
基础 tenant
认证 (auth) users, user_credentials, user_tokens, roles, permissions, role_permissions, user_roles, organizations, departments, positions, user_departments
配置 (config) dictionaries, dictionary_items, menus, menu_roles, settings, numbering_rules
工作流 (workflow) process_definitions, process_instances, tokens, tasks, process_variables
消息 (message) message_templates, messages, message_subscriptions
审计 audit_logs, domain_events
插件 (plugin) plugins, entity_registry, plugin_market, plugin_user_views

集成契约

方向 模块 触发时机
消费 ← erp-server 启动时自动运行 Migrator::up()
依赖 ← erp-core BaseFields 定义标准字段规范
提供 → 所有业务模块 表结构供 SeaORM Entity 使用

3. 代码逻辑

不变量: 所有业务表必须含 tenant_id 列 — 多租户是核心能力,不可事后补

不变量: 迁移必须幂等 — 使用 if_not_exists,可重复执行

不变量: 迁移执行由 erp-server 启动自动触发,不手动执行 SQL

关键结构变更迁移

迁移 变更
m000027 修复唯一索引 + 软删除冲突
m000034 种子插件权限
m000035 pg_trgm 扩展 + entity 列
m000036 role_permissions 添加 data_scope行级数据权限
m000038 修复 CRM 权限码
m000039 entity_registry 列
m000041 plugin_user_views

4. 活跃问题 + 陷阱

历史教训

  • 唯一索引 + 软删除冲突 — 已删除记录的 unique key 阻止新建m000027 修复)
  • tenant 表缺少 created_by/updated_by/version 字段 — 首个迁移早于 BaseFields 规范

⚠️ settings 表的唯一索引曾需修复m000032 ⚠️ 新增表时务必对齐 crates/erp-core/src/types.rs 中的 BaseFields

5. 变更记录

日期 变更
2026-04-23 重构为 5 节结构,更新表清单至 41 个迁移
2026-04-19 CRM 权限码修复迁移 (m000038)