跨平台ERP系统核心数据模型设计
1. 数据模型概述
本设计文档详细描述了跨平台ERP系统的核心数据模型,包括客户、供应商、分包商、项目、合同、付款节点、财务记录、商品、汇率管理等数据模型,确保数据模型之间的关系正确,支持财务串通管理和多币种功能。
2. 核心数据模型设计
2.1 基础数据模型
2.1.1 用户表 (users)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
用户ID |
username |
VARCHAR(255) |
UNIQUE NOT NULL |
用户名 |
password |
VARCHAR(255) |
NOT NULL |
密码哈希 |
name |
VARCHAR(255) |
NOT NULL |
姓名 |
email |
VARCHAR(255) |
UNIQUE NOT NULL |
邮箱 |
role_id |
UUID |
REFERENCES roles(id) |
角色ID |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.1.2 角色表 (roles)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
角色ID |
name |
VARCHAR(255) |
UNIQUE NOT NULL |
角色名称 |
description |
TEXT |
|
角色描述 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.1.3 权限表 (permissions)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
权限ID |
name |
VARCHAR(255) |
UNIQUE NOT NULL |
权限名称 |
description |
TEXT |
|
权限描述 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.1.4 角色权限关联表 (role_permissions)
| 字段名 |
数据类型 |
约束 |
描述 |
role_id |
UUID |
REFERENCES roles(id) |
角色ID |
permission_id |
UUID |
REFERENCES permissions(id) |
权限ID |
PRIMARY KEY |
|
(role_id, permission_id) |
复合主键 |
2.2 业务数据模型
2.2.1 客户表 (customers)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
客户ID |
name |
VARCHAR(255) |
NOT NULL |
客户名称 |
contact_person |
VARCHAR(255) |
|
联系人 |
phone |
VARCHAR(50) |
|
电话 |
email |
VARCHAR(255) |
|
邮箱 |
address |
TEXT |
|
地址 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.2 供应商表 (suppliers)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
供应商ID |
name |
VARCHAR(255) |
NOT NULL |
供应商名称 |
contact_person |
VARCHAR(255) |
|
联系人 |
phone |
VARCHAR(50) |
|
电话 |
email |
VARCHAR(255) |
|
邮箱 |
address |
TEXT |
|
地址 |
type |
VARCHAR(50) |
|
类型: 本地/中国 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.3 分包商表 (subcontractors)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
分包商ID |
name |
VARCHAR(255) |
NOT NULL |
分包商名称 |
contact_person |
VARCHAR(255) |
|
联系人 |
phone |
VARCHAR(50) |
|
电话 |
email |
VARCHAR(255) |
|
邮箱 |
address |
TEXT |
|
地址 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.4 项目表 (projects)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
项目ID |
name |
VARCHAR(255) |
NOT NULL |
项目名称 |
customer_id |
UUID |
REFERENCES customers(id) |
客户ID |
contract_number |
VARCHAR(100) |
UNIQUE NOT NULL |
合同编号 |
contract_amount |
DECIMAL(18,2) |
NOT NULL |
合同金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
start_date |
DATE |
|
开始日期 |
end_date |
DATE |
|
结束日期 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.5 合同表 (contracts)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
合同ID |
project_id |
UUID |
REFERENCES projects(id) |
项目ID |
type |
VARCHAR(50) |
NOT NULL |
合同类型: 主合同/分包合同/采购合同 |
contract_number |
VARCHAR(100) |
UNIQUE NOT NULL |
合同编号 |
contract_amount |
DECIMAL(18,2) |
NOT NULL |
合同金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
start_date |
DATE |
|
开始日期 |
end_date |
DATE |
|
结束日期 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.6 付款节点表 (payment_terms)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
付款节点ID |
contract_id |
UUID |
REFERENCES contracts(id) |
合同ID |
sequence |
INTEGER |
NOT NULL |
付款顺序 |
description |
TEXT |
NOT NULL |
付款描述 |
percentage |
DECIMAL(5,2) |
NOT NULL |
付款比例 |
amount |
DECIMAL(18,2) |
NOT NULL |
付款金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
due_date |
DATE |
|
到期日期 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.7 商品分类表 (product_categories)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
分类ID |
name |
VARCHAR(255) |
NOT NULL |
分类名称 |
parent_id |
UUID |
REFERENCES product_categories(id) |
父分类ID |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.8 商品表 (products)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
商品ID |
name |
VARCHAR(255) |
NOT NULL |
商品名称 |
category_id |
UUID |
REFERENCES product_categories(id) |
分类ID |
unit |
VARCHAR(50) |
NOT NULL |
单位 |
cost_price |
DECIMAL(18,2) |
|
成本价 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.9 采购表 (purchases)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
采购ID |
project_id |
UUID |
REFERENCES projects(id) |
项目ID |
supplier_id |
UUID |
REFERENCES suppliers(id) |
供应商ID |
contract_id |
UUID |
REFERENCES contracts(id) |
合同ID |
total_amount |
DECIMAL(18,2) |
NOT NULL |
总金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
expected_delivery_date |
DATE |
|
预计发货日期 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.10 采购商品表 (purchase_items)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
采购商品ID |
purchase_id |
UUID |
REFERENCES purchases(id) |
采购ID |
product_id |
UUID |
REFERENCES products(id) |
商品ID |
quantity |
DECIMAL(18,2) |
NOT NULL |
数量 |
unit_price |
DECIMAL(18,2) |
NOT NULL |
单价 |
total_price |
DECIMAL(18,2) |
NOT NULL |
总价 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
2.2.11 分包表 (subcontracts)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
分包ID |
project_id |
UUID |
REFERENCES projects(id) |
项目ID |
subcontractor_id |
UUID |
REFERENCES subcontractors(id) |
分包商ID |
contract_id |
UUID |
REFERENCES contracts(id) |
合同ID |
total_amount |
DECIMAL(18,2) |
NOT NULL |
总金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.12 预算报价表 (quotations)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
预算报价ID |
customer_id |
UUID |
REFERENCES customers(id) |
客户ID |
project_name |
VARCHAR(255) |
NOT NULL |
项目名称 |
total_amount |
DECIMAL(18,2) |
NOT NULL |
总金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
status |
VARCHAR(50) |
NOT NULL |
状态 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.2.13 预算报价项目表 (quotation_items)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
预算报价项目ID |
quotation_id |
UUID |
REFERENCES quotations(id) |
预算报价ID |
product_id |
UUID |
REFERENCES products(id) |
商品ID |
quantity |
DECIMAL(18,2) |
NOT NULL |
数量 |
unit_price |
DECIMAL(18,2) |
NOT NULL |
单价 |
total_price |
DECIMAL(18,2) |
NOT NULL |
总价 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
2.3 财务数据模型
2.3.1 汇率表 (exchange_rates)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
汇率ID |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rate |
DECIMAL(18,6) |
NOT NULL |
汇率(1单位外币兑人民币) |
reverse_rate |
DECIMAL(18,6) |
NOT NULL |
反向汇率(1人民币兑外币) |
effective_date |
DATE |
NOT NULL |
生效日期 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.3.2 财务记录表 (financial_records)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
财务记录ID |
type |
VARCHAR(50) |
NOT NULL |
类型: 收入/支出 |
amount |
DECIMAL(18,2) |
NOT NULL |
金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
rmb_equivalent |
DECIMAL(18,2) |
NOT NULL |
人民币等价金额 |
project_id |
UUID |
REFERENCES projects(id) |
项目ID(可为空) |
related_id |
UUID |
|
关联ID(关联具体业务) |
related_type |
VARCHAR(50) |
|
关联类型 |
payment_term_id |
UUID |
REFERENCES payment_terms(id) |
付款节点ID |
status |
VARCHAR(50) |
NOT NULL |
状态 |
description |
TEXT |
|
描述 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.3.3 银行账户表 (bank_accounts)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
银行账户ID |
name |
VARCHAR(255) |
NOT NULL |
账户名称 |
bank_name |
VARCHAR(255) |
NOT NULL |
银行名称 |
account_number |
VARCHAR(100) |
UNIQUE NOT NULL |
账号 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
balance |
DECIMAL(18,2) |
DEFAULT 0 |
余额 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
2.3.4 财务交易表 (financial_transactions)
| 字段名 |
数据类型 |
约束 |
描述 |
id |
UUID |
PRIMARY KEY |
交易ID |
financial_record_id |
UUID |
REFERENCES financial_records(id) |
财务记录ID |
bank_account_id |
UUID |
REFERENCES bank_accounts(id) |
银行账户ID |
amount |
DECIMAL(18,2) |
NOT NULL |
交易金额 |
currency |
VARCHAR(10) |
NOT NULL |
币种 |
transaction_date |
DATE |
NOT NULL |
交易日期 |
transaction_type |
VARCHAR(50) |
NOT NULL |
交易类型: 转入/转出 |
created_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
创建时间 |
updated_at |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
更新时间 |
3. 数据模型关系图
4. 数据模型设计说明
4.1 多币种支持
- 汇率管理: 通过
exchange_rates表管理不同币种的汇率,支持人民币、老挝基普、泰铢、美元等多种币种。
- 币种字段: 所有涉及金额的表都包含
currency字段,记录交易的原始币种。
- 人民币等价金额: 所有金额字段都包含
rmb_equivalent字段,记录该金额按照当时汇率换算成人民币的等价金额,便于财务统计和分析。
- 汇率换算: 系统在创建财务记录时,会根据
exchange_rates表中的最新汇率自动计算人民币等价金额。
4.2 财务串通管理
- 统一财务视图: 通过
financial_records表集中管理所有财务交易,确保所有收入支出既能从单个项目查看,又能从公司总账目中查看。
- 关联关系: 通过
related_id和related_type字段关联具体业务,如合同、付款节点等。
- 项目维度: 通过
project_id字段实现项目级财务视图,便于项目成本核算和利润分析。
- 公司维度: 不设置
project_id的记录为公司级财务,如日常办公支出等。
- 银行账户管理: 通过
bank_accounts和financial_transactions表管理银行账户和具体交易,实现资金流向的跟踪。
4.3 数据一致性
- 外键约束: 所有关联关系都通过外键约束确保数据一致性。
- 事务管理: 重要业务操作(如财务交易)使用事务确保数据一致性。
- 数据验证: 在应用层实现数据验证,确保数据的完整性和准确性。
4.4 性能优化
- 索引设计: 对常用查询字段(如
project_id、customer_id、created_at等)创建索引,提高查询性能。
- 分区策略: 对于大型表(如
financial_records),考虑使用分区策略,按时间或项目进行分区。
- 缓存机制: 对于频繁访问的数据(如汇率),使用缓存机制提高访问速度。
5. 总结
本数据模型设计涵盖了跨平台ERP系统的核心数据模型,包括客户、供应商、分包商、项目、合同、付款节点、财务记录、商品、汇率管理等数据模型。通过合理的关系设计和字段定义,确保了数据模型之间的关系正确,支持财务串通管理和多币种功能。
该设计考虑了系统的可扩展性和性能优化,为后续功能扩展预留了接口,能够满足企业的业务需求,并为企业的财务管理提供有力支持。