448 lines
12 KiB
Markdown
448 lines
12 KiB
Markdown
# FMS 新系统核心架构实施计划 V1.0
|
||
|
||
> 文档版本:V1.0
|
||
> 编制日期:2026-09-30
|
||
> 适用范围:FMS/ERP 新系统第一阶段核心架构重构
|
||
> 执行方式:由多个 AI 按任务卡顺序执行,人负责最终取舍和验收
|
||
|
||
## 1. 计划目标
|
||
|
||
本计划用于指导其他 AI 实现 FMS 新系统第一阶段核心架构。
|
||
|
||
第一阶段只解决以下问题:
|
||
|
||
- SQL Server 数据库如何迁移和版本化;
|
||
- 租户数据库如何连接和路由;
|
||
- 用户、公司、组织、仓库和账簿如何形成统一上下文;
|
||
- 业务域如何组织自己的表、SQL、服务、接口和页面;
|
||
- SQL 如何成为查询、报表和数据处理的主要实现;
|
||
- 简单基础资料如何使用通用 CRUD;
|
||
- 核心业务如何使用专用 SQL 和业务处理器;
|
||
- 如何用一个完整业务域验证架构。
|
||
|
||
第一阶段不实现完整 ERP,也不建设通用低代码平台。
|
||
|
||
## 2. 已确定的架构约束
|
||
|
||
其他 AI 执行所有任务时必须遵守以下约束:
|
||
|
||
1. SQL Server 是第一阶段唯一数据库目标。
|
||
2. 一个租户对应一个数据库,租户库内不使用 `tenant_id` 做日常业务过滤。
|
||
3. 业务域代码包是代码组织中心。
|
||
4. 真实业务表和 SQL 视图是事实来源。
|
||
5. SQL 文件是查询、报表和数据处理的主要实现。
|
||
6. 业务代码负责业务动作、事务和复杂业务规则。
|
||
7. 页面配置只负责表现和少量参数。
|
||
8. 不做全量 EAV,不做运行时任意生成业务表。
|
||
9. 通用 CRUD 只用于简单基础资料,不作为核心业务默认实现。
|
||
10. 工作流负责流程编排,库存、财务和结算动作必须由业务处理器完成。
|
||
11. 第一阶段不引入通用配置版本引擎、通用公式引擎和通用规则解释器。
|
||
12. 内部开发人员可以直接维护 SQL,不增加 SQL 安全沙箱、ORM 替代层或复杂 SQL DSL。
|
||
13. 所有新代码必须遵守统一目录、命名和 SQL 文件风格。
|
||
|
||
## 3. 阶段依赖
|
||
|
||
```text
|
||
T0 架构基线和代码规范
|
||
↓
|
||
T1 SQL Migration 和数据库运行时
|
||
↓
|
||
T2 租户路由和业务上下文
|
||
↓
|
||
T3 系统基础数据和权限
|
||
↓
|
||
T4 业务域模板和 SQL 调用约定
|
||
↓
|
||
T5 客户或产品示例业务域
|
||
↓
|
||
T6 工作流、审计和多语言接入
|
||
↓
|
||
T7 第一阶段验收和旧设计迁移清单
|
||
```
|
||
|
||
T0 到 T4 必须顺序完成。T5 完成后,T6 可以拆分给不同 AI,但最终必须统一接口和风格。
|
||
|
||
## 4. 任务 T0:架构基线和代码规范
|
||
|
||
### 4.1 目标
|
||
|
||
把新架构的原则转成开发人员和 AI 都能执行的规则。
|
||
|
||
### 4.2 工作内容
|
||
|
||
- 阅读并理解以下文档:
|
||
- `ERP动态配置多租户多公司多语言需求分析.md`;
|
||
- `FMS新系统核心表结构设计.md`;
|
||
- `FMS新系统核心架构设计.md`。
|
||
- 确定 SQL Server 版本和连接方式;
|
||
- 确定数据库迁移目录和文件命名;
|
||
- 确定业务域目录结构;
|
||
- 确定表名、字段名、索引、主键和时间字段规范;
|
||
- 确定 SQL 文件参数和返回结果规范;
|
||
- 明确哪些旧设计暂时不迁移。
|
||
|
||
### 4.3 输出物
|
||
|
||
```text
|
||
开发规范补充文档
|
||
SQL Migration 目录
|
||
业务域目录模板
|
||
SQL 文件示例
|
||
架构决策记录
|
||
```
|
||
|
||
### 4.4 验收标准
|
||
|
||
- 新增一个业务域时不需要重新发明目录结构;
|
||
- SQL 文件可以被数据库工具独立执行和验证;
|
||
- 不存在同时使用两套字段命名和 SQL 组织方式的说明;
|
||
- 其他 AI 可以只读本阶段输出物开始后续工作。
|
||
|
||
## 5. 任务 T1:SQL Migration 和数据库运行时
|
||
|
||
### 5.1 目标
|
||
|
||
让每个租户数据库可以可靠地初始化、升级和记录结构版本。
|
||
|
||
### 5.2 工作内容
|
||
|
||
- 创建迁移记录表;
|
||
- 实现迁移文件扫描和顺序执行;
|
||
- 实现重复执行判断;
|
||
- 记录迁移名称、版本、checksum、执行时间和结果;
|
||
- 支持初始化新租户数据库;
|
||
- 支持租户数据库版本查询;
|
||
- 补充失败迁移的人工处理方式。
|
||
|
||
### 5.3 Migration 规则
|
||
|
||
```text
|
||
V001__create_core_tables.sql
|
||
V002__create_company_tables.sql
|
||
V003__create_audit_tables.sql
|
||
```
|
||
|
||
Migration 可以包含建表、改表、索引、视图、约束和必要的数据回填。
|
||
|
||
Migration 不负责页面布局和用户偏好,也不作为通用配置表使用。
|
||
|
||
### 5.4 验收标准
|
||
|
||
- 空数据库可以从零初始化;
|
||
- 已执行的迁移不会重复执行;
|
||
- 迁移失败时可以明确定位文件和错误;
|
||
- 两个租户数据库可以独立升级;
|
||
- 应用启动时可以读取数据库结构版本。
|
||
|
||
## 6. 任务 T2:租户路由和业务上下文
|
||
|
||
### 6.1 目标
|
||
|
||
建立统一的数据库连接、租户识别和请求上下文,不让业务域自行处理这些基础问题。
|
||
|
||
### 6.2 工作内容
|
||
|
||
- 定义 `TenantRegistry` 接口;
|
||
- 首期使用配置文件实现租户注册;
|
||
- 实现租户数据库连接创建和复用;
|
||
- 实现请求级数据库连接选择;
|
||
- 实现请求级业务上下文;
|
||
- 请求结束后清理上下文;
|
||
- 记录当前租户、用户、公司和请求编号。
|
||
|
||
### 6.3 上下文结构
|
||
|
||
```text
|
||
tenant_code
|
||
user_id
|
||
company_id
|
||
organization_id
|
||
warehouse_id
|
||
ledger_id
|
||
language
|
||
timezone
|
||
currency
|
||
request_id
|
||
```
|
||
|
||
### 6.4 验收标准
|
||
|
||
- 同一个请求内所有业务 SQL 使用同一个租户数据库;
|
||
- 业务域不需要自己读取租户配置文件;
|
||
- 用户可以切换授权公司并重新建立上下文;
|
||
- 上下文不会泄漏到下一个请求;
|
||
- 日志可以定位租户、用户、公司和请求。
|
||
|
||
## 7. 任务 T3:系统基础数据和权限
|
||
|
||
### 7.1 目标
|
||
|
||
建立所有业务域依赖的用户、角色、公司、组织、仓库和账簿。
|
||
|
||
### 7.2 第一批表
|
||
|
||
```text
|
||
s_user
|
||
s_role
|
||
s_user_role
|
||
s_role_permission
|
||
s_role_data_scope
|
||
s_company
|
||
s_organization
|
||
s_warehouse
|
||
s_ledger
|
||
s_user_company
|
||
s_user_organization
|
||
s_user_warehouse
|
||
s_user_ledger
|
||
```
|
||
|
||
### 7.3 权限范围
|
||
|
||
首期只实现:
|
||
|
||
- 用户可用公司;
|
||
- 用户可用组织;
|
||
- 用户可用仓库;
|
||
- 模块访问权限;
|
||
- 业务动作权限;
|
||
- 全部、指定公司、本组织、本组织及下级、本人和指定仓库等简单数据范围。
|
||
|
||
不实现角色继承、拒绝权限和通用权限表达式。
|
||
|
||
### 7.4 验收标准
|
||
|
||
- 一个用户可以属于多个公司;
|
||
- 一个用户可以在不同公司拥有不同角色;
|
||
- 公司、组织、仓库和账簿不会混用编码;
|
||
- 权限查询可以使用 SQL 完成;
|
||
- 所有业务查询可以取得当前公司上下文。
|
||
|
||
## 8. 任务 T4:业务域模板和 SQL 调用约定
|
||
|
||
### 8.1 目标
|
||
|
||
建立所有业务域共同遵守的实现模板,解决“一个文件一个风格”的问题。
|
||
|
||
### 8.2 业务域模板
|
||
|
||
```text
|
||
domains/<domain_code>/
|
||
├── migration/
|
||
├── sql/
|
||
├── repository/
|
||
├── service/
|
||
├── api/
|
||
├── page/
|
||
└── i18n/
|
||
```
|
||
|
||
### 8.3 SQL 文件命名
|
||
|
||
```text
|
||
<object>_list.sql
|
||
<object>_detail.sql
|
||
<object>_save.sql
|
||
<object>_<action>.sql
|
||
<object>_report.sql
|
||
```
|
||
|
||
### 8.4 访问约定
|
||
|
||
- 查询由 repository 调用 SQL;
|
||
- 保存由 repository 调用保存 SQL或 service 组织多条 SQL;
|
||
- 业务动作由 service 作为唯一入口;
|
||
- 页面只调用 API;
|
||
- 业务域不直接修改另一个业务域的内部表;
|
||
- 复杂业务必须有明确事务边界;
|
||
- 简单资料才允许使用通用 CRUD。
|
||
|
||
### 8.5 验收标准
|
||
|
||
- 创建新业务域只需复制模板并替换业务名称;
|
||
- list、detail、save、action 的代码结构统一;
|
||
- SQL 不散落在页面、控制器和配置数据库中;
|
||
- 通用 CRUD 的适用范围有明确示例。
|
||
|
||
## 9. 任务 T5:客户或产品示例业务域
|
||
|
||
### 9.1 目标
|
||
|
||
用一条完整业务链路验证新架构,而不是先建设一个空的通用引擎。
|
||
|
||
### 9.2 推荐对象
|
||
|
||
优先选择客户或产品,不要一开始选择库存或财务。
|
||
|
||
### 9.3 工作内容
|
||
|
||
```text
|
||
SQL Migration
|
||
→ b_customer 或 b_product
|
||
→ 查询 SQL
|
||
→ 保存 SQL
|
||
→ 业务域 service
|
||
→ API
|
||
→ 页面
|
||
→ 公司范围
|
||
→ 审计
|
||
→ 多语言名称
|
||
```
|
||
|
||
### 9.4 验收标准
|
||
|
||
- 可以在 SQL Server 中直接执行列表和详情查询;
|
||
- 页面不需要通用模块解释器才能运行;
|
||
- 保存过程经过明确的 repository/service;
|
||
- 公司范围可以生效;
|
||
- 关键变更有审计记录;
|
||
- 新增字段可以通过 Migration 完成;
|
||
- 业务域目录、SQL 命名和代码风格符合 T4。
|
||
|
||
## 10. 任务 T6:工作流、审计和多语言接入
|
||
|
||
### 10.1 工作流
|
||
|
||
保留 `wf_*` 工作流子系统,但绑定业务动作,不绑定任意页面配置:
|
||
|
||
```text
|
||
sales_order.submit
|
||
sales_order.approve
|
||
purchase_order.submit
|
||
expense.approve
|
||
```
|
||
|
||
工作流实例固定流程版本,真正的库存、财务和结算动作由业务域 service 执行。
|
||
|
||
### 10.2 审计
|
||
|
||
审计至少记录:
|
||
|
||
```text
|
||
user_id
|
||
company_id
|
||
domain_code
|
||
business_id
|
||
operation
|
||
before_value
|
||
after_value
|
||
request_id
|
||
occurred_at
|
||
```
|
||
|
||
### 10.3 多语言
|
||
|
||
第一阶段只实现:
|
||
|
||
```text
|
||
s_i18n_type
|
||
s_i18n
|
||
```
|
||
|
||
业务主数据按业务域使用翻译表。暂不实现多层 overlay、翻译变更集和运行时语言管理。
|
||
|
||
### 10.4 验收标准
|
||
|
||
- 工作流可以调用一个业务域动作;
|
||
- 流程实例记录固定的流程版本;
|
||
- 业务动作和审批动作有审计记录;
|
||
- 系统文案和主数据翻译可以按语言读取;
|
||
- 翻译读取不影响业务 SQL 查询。
|
||
|
||
## 11. 任务 T7:第一阶段验收和旧设计迁移清单
|
||
|
||
### 11.1 验收重点
|
||
|
||
第一阶段不是验收页面数量,而是验收架构是否成立:
|
||
|
||
- SQL 是事实来源;
|
||
- 业务域可以独立拥有表、SQL、服务和页面;
|
||
- 不依赖通用模块解释器才能运行;
|
||
- 简单对象可以使用通用 CRUD;
|
||
- 核心动作使用专用 service 和 SQL;
|
||
- 多公司上下文贯通查询、保存、权限和审计;
|
||
- 数据库结构变更通过 Migration 管理;
|
||
- 代码目录和 SQL 风格统一。
|
||
|
||
### 11.2 旧设计迁移分类
|
||
|
||
```text
|
||
保留:真实业务表、成熟 SQL、工作流运行表
|
||
迁移:散落 SQL、通用保存调用、模块页面配置
|
||
降级:s_module、s_field、s_module_schema 只做登记和表现
|
||
后置:全局配置版本、通用规则引擎、多层配置覆盖
|
||
删除:以元数据解释器为中心的核心业务运行时
|
||
```
|
||
|
||
## 12. 给其他 AI 的执行规则
|
||
|
||
每个 AI 接任务时必须先阅读:
|
||
|
||
1. `FMS新系统核心架构设计.md`;
|
||
2. `FMS新系统核心架构实施计划.md`;
|
||
3. 与当前任务直接相关的旧设计文档。
|
||
|
||
每个 AI 的任务输出必须包含:
|
||
|
||
```text
|
||
完成内容
|
||
修改文件
|
||
数据库变更
|
||
验证方式
|
||
未完成事项
|
||
风险或需要人工决策的地方
|
||
```
|
||
|
||
执行限制:
|
||
|
||
- 不得自行增加通用配置引擎;
|
||
- 不得把业务逻辑放进页面 JSON;
|
||
- 不得为一个业务对象创建第二套 SQL 调用方式;
|
||
- 不得修改无关业务域;
|
||
- 不得为了“以后可能需要”提前抽象;
|
||
- 不得删除旧表或旧接口,除非任务明确要求迁移;
|
||
- 不得把 SQL 改写成 ORM 查询作为默认方案;
|
||
- 不得只提交页面而没有 SQL、服务和验收说明。
|
||
|
||
## 13. 第一张任务卡
|
||
|
||
可以把下面内容直接交给第一个 AI:
|
||
|
||
```text
|
||
你负责 FMS 新系统核心架构实施计划的 T0 任务:架构基线和代码规范。
|
||
|
||
请先阅读:
|
||
1. FMS新系统核心架构设计.md
|
||
2. FMS新系统核心架构实施计划.md
|
||
3. FMS新系统核心表结构设计.md
|
||
4. 开发规范.md
|
||
|
||
你的目标是确定 SQL Server、Migration、业务域目录、SQL 文件命名、数据库命名和业务动作入口规范。
|
||
|
||
要求:
|
||
- 不实现业务模块;
|
||
- 不新增通用低代码引擎;
|
||
- 不修改无关文件;
|
||
- 不把 SQL 改写成 ORM 查询;
|
||
- 输出一份开发规范补充文档;
|
||
- 提供一个客户或产品业务域的空目录模板;
|
||
- 提供至少三个 SQL 文件示例;
|
||
- 最后报告修改文件、验证方式和未决问题。
|
||
```
|
||
|
||
## 14. 计划结论
|
||
|
||
第一阶段的正确顺序不是先做一个“万能模块引擎”,而是:
|
||
|
||
```text
|
||
统一规范
|
||
→ 数据库迁移
|
||
→ 租户和公司上下文
|
||
→ 系统基础数据
|
||
→ 业务域模板
|
||
→ 一个完整业务域
|
||
→ 工作流和通用能力
|
||
```
|
||
|
||
先用一个真实业务域验证架构,再决定哪些能力值得抽象。所有通用能力都必须来自实际重复,而不是来自对未来场景的猜测。
|