- erp-core: error types, shared types, event bus, ErpModule trait - erp-server: config loading, database/Redis connections, migrations - erp-server/migration: tenants table with SeaORM - apps/web: Vite + React 18 + TypeScript + Ant Design 5 + TailwindCSS - Web frontend: main layout with sidebar, header, routing - Docker: PostgreSQL 16 + Redis 7 development environment - All workspace crates compile successfully (cargo check passes)
69 lines
2.9 KiB
Markdown
69 lines
2.9 KiB
Markdown
# erp-core
|
||
|
||
## 设计思想
|
||
|
||
`erp-core` 是整个 ERP 平台的 L1 基础层,所有业务模块的唯一共同依赖。它的职责是定义**跨模块共享的契约**,而非实现业务逻辑。
|
||
|
||
核心设计决策:
|
||
- **AppError 统一错误体系** — 6 种错误变体映射到 HTTP 状态码,业务 crate 只需 `?` 传播错误,由 Axum `IntoResponse` 自动转换
|
||
- **EventBus 进程内广播** — 用 `tokio::sync::broadcast` 实现发布/订阅,模块间零耦合通信
|
||
- **ErpModule 插件 trait** — 每个业务模块实现此 trait,由 `ModuleRegistry` 统一注册路由和事件处理器
|
||
- **BaseFields 强制多租户** — 所有实体的基础字段模板,确保 `tenant_id` 从第一天就存在
|
||
|
||
## 代码逻辑
|
||
|
||
### 错误处理链
|
||
```
|
||
业务 crate (thiserror) → AppError → IntoResponse → HTTP JSON 响应
|
||
数据库 (sea_orm::DbErr) → From 转换 → AppError (自动识别 duplicate key → Conflict)
|
||
```
|
||
|
||
错误响应统一格式:`{ "error": "not_found", "message": "资源不存在", "details": null }`
|
||
|
||
### 事件总线
|
||
```
|
||
发布者: EventBus::publish(DomainEvent) → broadcast channel
|
||
订阅者: EventBus::subscribe() → Receiver<DomainEvent>
|
||
事件字段: id(UUIDv7), event_type("user.created"), tenant_id, payload(JSON), timestamp, correlation_id
|
||
```
|
||
|
||
事件类型命名规则:`{模块}.{动作}` 如 `user.created`, `workflow.task.completed`
|
||
|
||
### 模块注册
|
||
```
|
||
业务模块实现 ErpModule trait → ModuleRegistry::register() →
|
||
build_router(): 折叠所有模块的 register_routes() → Axum Router
|
||
register_handlers(): 注册所有模块的事件处理器 → EventBus
|
||
```
|
||
|
||
### 共享类型
|
||
- `TenantContext` — 中间件注入的租户上下文(tenant_id, user_id, roles, permissions)
|
||
- `Pagination` / `PaginatedResponse<T>` — 分页查询标准化(每页上限 100)
|
||
- `ApiResponse<T>` — API 统一信封 `{ success, data, message }`
|
||
|
||
## 关联模块
|
||
|
||
- **[[erp-server]]** — 消费所有 erp-core 类型和 trait,是唯一组装点
|
||
- **[[erp-auth]]** — 实现 `ErpModule` trait,发布认证事件
|
||
- **[[erp-workflow]]** — 实现 `ErpModule` trait,订阅业务事件
|
||
- **[[erp-message]]** — 实现 `ErpModule` trait,订阅通知事件
|
||
- **[[erp-config]]** — 实现 `ErpModule` trait
|
||
- **[[database]]** — 迁移表结构必须与 `BaseFields` 对齐
|
||
|
||
## 关键文件
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `crates/erp-core/src/error.rs` | AppError 定义、HTTP 映射、From 转换 |
|
||
| `crates/erp-core/src/events.rs` | DomainEvent、EventBus、EventHandler trait |
|
||
| `crates/erp-core/src/module.rs` | ErpModule trait、ModuleRegistry |
|
||
| `crates/erp-core/src/types.rs` | BaseFields、Pagination、ApiResponse、TenantContext |
|
||
| `crates/erp-core/src/lib.rs` | 模块导出入口 |
|
||
|
||
## 当前状态
|
||
|
||
**已实现,Phase 1 可用。** 但以下部分尚未被 erp-server 集成:
|
||
- `ModuleRegistry` 未在 `main.rs` 中使用
|
||
- `EventBus` 未创建实例
|
||
- `TenantContext` 未通过中间件注入
|