资金服务平台数据库设计文档
版本: v1.1
更新日期: 2026-02-22
作者: zhangjf
数据库: MySQL 8.0
字符集: utf8mb4
一、数据库概览
1.1 数据库信息
| 项目 |
值 |
| 数据库名 |
fund_platform |
| 字符集 |
utf8mb4 |
| 排序规则 |
utf8mb4_unicode_ci |
| 存储引擎 |
InnoDB |
| 时区 |
+08:00 |
1.2 表清单
| 模块 |
表名 |
说明 |
记录数 |
| 系统管理 |
sys_tenant |
租户表 |
2 |
|
sys_dept |
部门表 |
7 |
|
sys_user |
用户表 |
6 |
|
sys_role |
角色表 |
7 |
|
sys_menu |
菜单表 |
38 |
|
sys_user_role |
用户角色关联表 |
6 |
|
sys_role_menu |
角色菜单关联表 |
动态 |
|
sys_operation_log |
操作日志表 |
动态 |
| 客户管理 |
customer |
客户表 |
3 |
|
customer_contact |
客户联系人表 |
0 |
| 项目管理 |
project |
项目表 |
3 |
|
project_member |
项目成员表 |
6 |
| 需求工单 |
requirement |
需求工单表 |
0 |
| 支出管理 |
expense_type |
支出类型表 |
12 |
|
expense |
支出表 |
0 |
| 应收款管理 |
receivable |
应收款表 |
0 |
|
receipt |
收款记录表 |
0 |
二、ER 图
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ 资金服务平台数据库 ER 图 │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ sys_tenant │ │ sys_user │ │ sys_role │ │
│ │ (租户表) │ │ (用户表) │ │ (角色表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK tenant_id │◄────────┤ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK user_id │◄───────►│ PK role_id │ │
│ │ name │ │ username │ │ code │ │
│ │ type │ │ password │ │ name │ │
│ │ status │ │ real_name │ │ type │ │
│ └──────────────┘ │ dept_id │────────►│ scope │ │
│ │ status │ └──────────────┘ │
│ └──────────────┘ ▲ │
│ ▲ │ │
│ │ │ │
│ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ sys_dept │ │sys_user_role│ │
│ │ (部门表) │ │(用户角色关联)│ │
│ ├─────────────┤ ├─────────────┤ │
│ │ PK dept_id │ │ PK id │ │
│ │ FK tenant_id│ │ FK user_id │ │
│ │ name │ │ FK role_id │ │
│ │ parent_id │ └─────────────┘ │
│ └─────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ customer │ │ project │ │ requirement │ │
│ │ (客户表) │ │ (项目表) │ │ (需求工单表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK customer_id│◄───────┤ FK customer_id│◄───────┤ FK customer_id│ │
│ │ FK tenant_id │ │ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK project_id│◄───────┤ FK project_id│ │
│ │ name │ │ code │ │ PK req_id │ │
│ │ type │ │ name │ │ code │ │
│ │ level │ │ manager_id│ │ name │ │
│ └──────────────┘ │ status │ │ amount │ │
│ │ └──────────────┘ │ status │ │
│ │ ▲ └──────────────┘ │
│ │ │ │
│ │ ┌──────┴──────┐ │
│ │ │project_member│ │
│ │ │(项目成员表) │ │
│ │ ├─────────────┤ │
│ │ │ PK member_id│ │
│ │ │ FK project_id│ │
│ │ │ FK user_id │ │
│ │ │ role │ │
│ │ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │customer_contact│ │
│ │(客户联系人表) │ │
│ ├──────────────┤ │
│ │ PK contact_id │ │
│ │ FK customer_id│ │
│ │ name │ │
│ │ phone │ │
│ │ is_primary │ │
│ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ expense_type │ │ expense │ │ receivable │ │
│ │ (支出类型表) │ │ (支出表) │ │ (应收款表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK type_id │◄────────┤ FK type_id │ │ PK receiv_id │ │
│ │ FK tenant_id │ │ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK expense_id│ │ FK project_id│ │
│ │ name │ │ code │ │ FK customer_id│ │
│ │ parent_id │ │ amount │ │ FK req_id │ │
│ └──────────────┘ │ date │ │ amount │ │
│ │ status │ │ status │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ receipt │ │
│ │ (收款记录表) │ │
│ ├─────────────┤ │
│ │ PK receipt_id│ │
│ │ FK receiv_id │ │
│ │ amount │ │
│ │ date │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
三、表结构详细说明
3.1 系统管理模块
3.1.1 sys_tenant(租户表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| tenant_id |
BIGINT |
- |
是 |
自增 |
主键,租户ID |
| tenant_code |
VARCHAR |
50 |
是 |
- |
租户编码(唯一) |
| tenant_name |
VARCHAR |
100 |
是 |
- |
租户名称 |
| tenant_type |
TINYINT |
- |
否 |
1 |
租户类型:1-一库多租户,2-一库一租户 |
| contact_name |
VARCHAR |
50 |
否 |
- |
联系人姓名 |
| contact_phone |
VARCHAR |
20 |
否 |
- |
联系人电话 |
| contact_email |
VARCHAR |
100 |
否 |
- |
联系人邮箱 |
| db_config |
JSON |
- |
否 |
- |
数据库配置(一库一租户模式使用) |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| expire_time |
DATETIME |
- |
否 |
- |
过期时间 |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
索引:
- PRIMARY KEY (
tenant_id)
- UNIQUE KEY
uk_code (tenant_code)
- INDEX
idx_status (status)
3.1.2 sys_dept(部门表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| dept_id |
BIGINT |
- |
是 |
自增 |
主键,部门ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| dept_name |
VARCHAR |
100 |
是 |
- |
部门名称 |
| parent_id |
BIGINT |
- |
否 |
0 |
父部门ID(0表示顶级部门) |
| dept_code |
VARCHAR |
50 |
否 |
- |
部门编码 |
| dept_level |
INT |
- |
否 |
1 |
部门层级 |
| sort_order |
INT |
- |
否 |
0 |
排序顺序 |
| leader |
VARCHAR |
50 |
否 |
- |
部门负责人 |
| leader_phone |
VARCHAR |
20 |
否 |
- |
负责人电话 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
dept_id)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_parent (parent_id)
- INDEX
idx_status (status)
3.1.3 sys_user(用户表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| user_id |
BIGINT |
- |
是 |
自增 |
主键,用户ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| username |
VARCHAR |
50 |
是 |
- |
用户名(登录账号) |
| password |
VARCHAR |
100 |
是 |
- |
密码(BCrypt加密存储) |
| real_name |
VARCHAR |
50 |
是 |
- |
真实姓名 |
| gender |
TINYINT |
- |
否 |
0 |
性别:0-未知,1-男,2-女 |
| phone |
VARCHAR |
20 |
否 |
- |
手机号码 |
| email |
VARCHAR |
100 |
否 |
- |
邮箱地址 |
| dept_id |
BIGINT |
- |
否 |
- |
所属部门ID(外键) |
| position |
VARCHAR |
50 |
否 |
- |
岗位/职位 |
| avatar |
VARCHAR |
255 |
否 |
- |
头像URL |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| last_login_time |
DATETIME |
- |
否 |
- |
最后登录时间 |
| last_login_ip |
VARCHAR |
50 |
否 |
- |
最后登录IP |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
user_id)
- UNIQUE KEY
uk_tenant_username (tenant_id, username)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_dept (dept_id)
- INDEX
idx_status (status)
3.1.4 sys_role(角色表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| role_id |
BIGINT |
- |
是 |
自增 |
主键,角色ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| role_code |
VARCHAR |
50 |
是 |
- |
角色编码 |
| role_name |
VARCHAR |
100 |
是 |
- |
角色名称 |
| role_type |
VARCHAR |
20 |
否 |
custom |
角色类型:system-系统角色,custom-自定义角色 |
| data_scope |
VARCHAR |
20 |
否 |
self |
数据范围:all-全部,dept-本部门,self-本人 |
| sort_order |
INT |
- |
否 |
0 |
排序顺序 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
role_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, role_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_status (status)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| menu_id |
BIGINT |
- |
是 |
自增 |
主键,菜单ID |
| tenant_id |
BIGINT |
- |
否 |
0 |
租户ID(0表示系统通用菜单) |
| menu_name |
VARCHAR |
100 |
是 |
- |
菜单名称 |
| menu_type |
VARCHAR |
20 |
是 |
- |
菜单类型:dir-目录,menu-菜单,button-按钮 |
| parent_id |
BIGINT |
- |
否 |
0 |
父菜单ID(0表示顶级菜单) |
| menu_level |
INT |
- |
否 |
1 |
菜单层级 |
| icon |
VARCHAR |
100 |
否 |
- |
菜单图标 |
| path |
VARCHAR |
200 |
否 |
- |
路由路径 |
| component |
VARCHAR |
200 |
否 |
- |
组件路径 |
| permission |
VARCHAR |
100 |
否 |
- |
权限标识(如:user:list) |
| sort_order |
INT |
- |
否 |
0 |
排序顺序 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
menu_id)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_parent (parent_id)
- INDEX
idx_type (menu_type)
- INDEX
idx_status (status)
3.1.6 sys_user_role(用户角色关联表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| id |
BIGINT |
- |
是 |
自增 |
主键,ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| user_id |
BIGINT |
- |
是 |
- |
用户ID(外键) |
| role_id |
BIGINT |
- |
是 |
- |
角色ID(外键) |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
索引:
- PRIMARY KEY (
id)
- UNIQUE KEY
uk_user_role (tenant_id, user_id, role_id)
- INDEX
idx_user (user_id)
- INDEX
idx_role (role_id)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| id |
BIGINT |
- |
是 |
自增 |
主键,ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| role_id |
BIGINT |
- |
是 |
- |
角色ID(外键) |
| menu_id |
BIGINT |
- |
是 |
- |
菜单ID(外键) |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
索引:
- PRIMARY KEY (
id)
- UNIQUE KEY
uk_role_menu (tenant_id, role_id, menu_id)
- INDEX
idx_role (role_id)
- INDEX
idx_menu (menu_id)
3.1.8 sys_operation_log(操作日志表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| log_id |
BIGINT |
- |
是 |
自增 |
主键,日志ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| user_id |
BIGINT |
- |
否 |
- |
操作人ID(外键) |
| username |
VARCHAR |
50 |
否 |
- |
操作人用户名 |
| operation |
VARCHAR |
100 |
否 |
- |
操作描述 |
| method |
VARCHAR |
200 |
否 |
- |
操作方法 |
| params |
TEXT |
- |
否 |
- |
操作参数(JSON格式) |
| ip |
VARCHAR |
50 |
否 |
- |
操作IP |
| user_agent |
VARCHAR |
500 |
否 |
- |
用户代理 |
| operation_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
操作时间 |
| cost_time |
BIGINT |
- |
否 |
0 |
耗时(毫秒) |
| result |
VARCHAR |
20 |
否 |
success |
操作结果:success-成功,fail-失败 |
| error_msg |
TEXT |
- |
否 |
- |
错误信息 |
索引:
- PRIMARY KEY (
log_id)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_user (user_id)
- INDEX
idx_time (operation_time)
- INDEX
idx_result (result)
3.2 客户管理模块
3.2.1 customer(客户表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| customer_id |
BIGINT |
- |
是 |
自增 |
主键,客户ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| customer_code |
VARCHAR |
50 |
是 |
- |
客户编码(唯一) |
| customer_name |
VARCHAR |
200 |
是 |
- |
客户名称 |
| customer_short |
VARCHAR |
100 |
否 |
- |
客户简称 |
| customer_type |
VARCHAR |
20 |
否 |
enterprise |
客户类型:enterprise-企业,individual-个人 |
| industry |
VARCHAR |
50 |
否 |
- |
所属行业 |
| scale |
VARCHAR |
20 |
否 |
- |
企业规模:small-小型,medium-中型,large-大型 |
| level |
VARCHAR |
20 |
否 |
normal |
客户等级:A/B/C/D/normal |
| tax_no |
VARCHAR |
50 |
否 |
- |
纳税人识别号 |
| legal_person |
VARCHAR |
50 |
否 |
- |
法定代表人 |
| address |
VARCHAR |
500 |
否 |
- |
公司地址 |
| phone |
VARCHAR |
20 |
否 |
- |
联系电话 |
| email |
VARCHAR |
100 |
否 |
- |
邮箱地址 |
| website |
VARCHAR |
200 |
否 |
- |
公司网站 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| cooperation_start |
DATE |
- |
否 |
- |
合作开始日期 |
| cooperation_end |
DATE |
- |
否 |
- |
合作结束日期 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
customer_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, customer_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_status (status)
- INDEX
idx_level (level)
3.2.2 customer_contact(客户联系人表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| contact_id |
BIGINT |
- |
是 |
自增 |
主键,联系人ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| customer_id |
BIGINT |
- |
是 |
- |
客户ID(外键) |
| contact_name |
VARCHAR |
50 |
是 |
- |
联系人姓名 |
| position |
VARCHAR |
50 |
否 |
- |
职位/职务 |
| department |
VARCHAR |
100 |
否 |
- |
所属部门 |
| phone |
VARCHAR |
20 |
否 |
- |
联系电话 |
| mobile |
VARCHAR |
20 |
否 |
- |
手机号码 |
| email |
VARCHAR |
100 |
否 |
- |
邮箱地址 |
| wechat |
VARCHAR |
50 |
否 |
- |
微信号 |
| qq |
VARCHAR |
20 |
否 |
- |
QQ号 |
| is_primary |
TINYINT |
- |
否 |
0 |
是否主要联系人:0-否,1-是 |
| sort_order |
INT |
- |
否 |
0 |
排序顺序 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| remark |
VARCHAR |
200 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
contact_id)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_customer (customer_id)
- INDEX
idx_status (status)
3.3 项目管理模块
3.3.1 project(项目表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| project_id |
BIGINT |
- |
是 |
自增 |
主键,项目ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| project_code |
VARCHAR |
50 |
是 |
- |
项目编号(唯一) |
| project_name |
VARCHAR |
200 |
是 |
- |
项目名称 |
| project_short |
VARCHAR |
100 |
否 |
- |
项目简称 |
| customer_id |
BIGINT |
- |
是 |
- |
客户ID(外键) |
| project_type |
VARCHAR |
20 |
否 |
development |
项目类型:development-开发,maintenance-维护,consulting-咨询 |
| project_manager_id |
BIGINT |
- |
否 |
- |
项目经理ID(外键) |
| start_date |
DATE |
- |
否 |
- |
项目开始日期 |
| end_date |
DATE |
- |
否 |
- |
项目结束日期 |
| budget_amount |
DECIMAL |
15,2 |
否 |
0.00 |
项目预算金额 |
| contract_amount |
DECIMAL |
15,2 |
否 |
0.00 |
合同金额 |
| status |
VARCHAR |
20 |
否 |
preparing |
项目状态:preparing-筹备中,ongoing-进行中,completed-已完成,archived-已归档,cancelled-已取消 |
| progress |
INT |
- |
否 |
0 |
项目进度(0-100) |
| description |
TEXT |
- |
否 |
- |
项目描述 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| attachment_url |
VARCHAR |
500 |
否 |
- |
附件URL |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
project_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, project_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_customer (customer_id)
- INDEX
idx_manager (project_manager_id)
- INDEX
idx_status (status)
3.3.2 project_member(项目成员表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| member_id |
BIGINT |
- |
是 |
自增 |
主键,成员关系ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| project_id |
BIGINT |
- |
是 |
- |
项目ID(外键) |
| user_id |
BIGINT |
- |
是 |
- |
用户ID(外键) |
| role |
VARCHAR |
50 |
否 |
member |
项目角色:pm-项目经理,dev-开发,test-测试,finance-财务,member-普通成员 |
| join_date |
DATE |
- |
否 |
- |
加入日期 |
| leave_date |
DATE |
- |
否 |
- |
离开日期 |
| workload |
DECIMAL |
5,2 |
否 |
0.00 |
工作量占比(0-100) |
| status |
TINYINT |
- |
否 |
1 |
状态:0-已离开,1-在职 |
| remark |
VARCHAR |
200 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
member_id)
- UNIQUE KEY
uk_project_user (tenant_id, project_id, user_id)
- INDEX
idx_project (project_id)
- INDEX
idx_user (user_id)
3.4 需求工单模块
3.4.1 requirement(需求工单表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| requirement_id |
BIGINT |
- |
是 |
自增 |
主键,需求ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| requirement_code |
VARCHAR |
50 |
是 |
- |
需求编号(唯一) |
| requirement_name |
VARCHAR |
200 |
是 |
- |
需求名称 |
| description |
TEXT |
- |
否 |
- |
需求描述 |
| project_id |
BIGINT |
- |
是 |
- |
项目ID(外键) |
| customer_id |
BIGINT |
- |
是 |
- |
客户ID(外键) |
| priority |
VARCHAR |
20 |
否 |
normal |
优先级:high-高,normal-中,low-低 |
| estimated_hours |
DECIMAL |
8,2 |
否 |
0.00 |
预估开发工时(小时) |
| actual_hours |
DECIMAL |
8,2 |
否 |
0.00 |
实际开发工时(小时) |
| planned_start |
DATE |
- |
否 |
- |
计划开始日期 |
| planned_end |
DATE |
- |
否 |
- |
计划结束日期 |
| actual_start |
DATE |
- |
否 |
- |
实际开始日期 |
| actual_end |
DATE |
- |
否 |
- |
实际结束日期 |
| delivery_date |
DATE |
- |
否 |
- |
交付日期 |
| receivable_amount |
DECIMAL |
15,2 |
否 |
0.00 |
应收款金额 |
| receivable_date |
DATE |
- |
否 |
- |
应收款日期 |
| status |
VARCHAR |
20 |
否 |
pending |
状态:pending-待开发,developing-开发中,delivered-已交付,completed-已完成 |
| progress |
INT |
- |
否 |
0 |
开发进度(0-100) |
| attachment_url |
VARCHAR |
500 |
否 |
- |
附件URL |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
requirement_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, requirement_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_project (project_id)
- INDEX
idx_customer (customer_id)
- INDEX
idx_status (status)
3.5 支出管理模块
3.5.1 expense_type(支出类型表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| type_id |
BIGINT |
- |
是 |
自增 |
主键,支出类型ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| type_code |
VARCHAR |
50 |
否 |
- |
支出类型编码 |
| type_name |
VARCHAR |
100 |
是 |
- |
支出类型名称 |
| parent_id |
BIGINT |
- |
否 |
0 |
父类型ID(0表示一级类型) |
| type_level |
INT |
- |
否 |
1 |
类型层级 |
| sort_order |
INT |
- |
否 |
0 |
排序顺序 |
| description |
VARCHAR |
200 |
否 |
- |
类型描述 |
| status |
TINYINT |
- |
否 |
1 |
状态:0-禁用,1-启用 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
type_id)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_parent (parent_id)
- INDEX
idx_status (status)
3.5.2 expense(支出表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| expense_id |
BIGINT |
- |
是 |
自增 |
主键,支出ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| expense_code |
VARCHAR |
50 |
是 |
- |
支出编号(唯一) |
| expense_type_id |
BIGINT |
- |
是 |
- |
支出类型ID(外键) |
| expense_amount |
DECIMAL |
15,2 |
否 |
0.00 |
支出金额 |
| expense_date |
DATE |
- |
否 |
- |
支出日期 |
| expense_reason |
TEXT |
- |
否 |
- |
支出事由 |
| project_id |
BIGINT |
- |
否 |
- |
所属项目ID(外键) |
| applicant_id |
BIGINT |
- |
是 |
- |
申请人ID(外键) |
| department_id |
BIGINT |
- |
否 |
- |
申请部门ID(外键) |
| payment_method |
VARCHAR |
20 |
否 |
transfer |
付款方式:transfer-转账,cash-现金,check-支票,other-其他 |
| payment_account |
VARCHAR |
100 |
否 |
- |
付款账户 |
| attachment_url |
VARCHAR |
500 |
否 |
- |
附件URL |
| status |
VARCHAR |
20 |
否 |
pending |
状态:pending-待付款,paid-已付款,completed-已完成,cancelled-已作废 |
| payment_date |
DATE |
- |
否 |
- |
付款日期 |
| payment_voucher |
VARCHAR |
255 |
否 |
- |
付款凭证 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
expense_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, expense_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_type (expense_type_id)
- INDEX
idx_project (project_id)
- INDEX
idx_applicant (applicant_id)
- INDEX
idx_status (status)
3.6 应收款管理模块
3.6.1 receivable(应收款表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| receivable_id |
BIGINT |
- |
是 |
自增 |
主键,应收款ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| receivable_code |
VARCHAR |
50 |
是 |
- |
应收款编号(唯一) |
| requirement_id |
BIGINT |
- |
是 |
- |
需求ID(外键) |
| project_id |
BIGINT |
- |
是 |
- |
项目ID(外键) |
| customer_id |
BIGINT |
- |
是 |
- |
客户ID(外键) |
| receivable_amount |
DECIMAL |
15,2 |
否 |
0.00 |
应收款金额 |
| receivable_date |
DATE |
- |
否 |
- |
应收款日期 |
| payment_due_date |
DATE |
- |
否 |
- |
付款截止日期 |
| payment_method |
VARCHAR |
20 |
否 |
- |
付款方式:transfer-转账,cash-现金,check-支票,other-其他 |
| bank_account |
VARCHAR |
100 |
否 |
- |
收款账户 |
| status |
VARCHAR |
20 |
否 |
pending |
状态:pending-待收款,partial-部分收款,received-已收款,overdue-逾期 |
| received_amount |
DECIMAL |
15,2 |
否 |
0.00 |
已收款金额 |
| unpaid_amount |
DECIMAL |
15,2 |
否 |
0.00 |
未收款金额 |
| overdue_days |
INT |
- |
否 |
0 |
逾期天数 |
| remark |
VARCHAR |
500 |
否 |
- |
备注说明 |
| created_by |
BIGINT |
- |
否 |
- |
创建人ID |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
| updated_by |
BIGINT |
- |
否 |
- |
更新人ID |
| updated_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
更新时间 |
| deleted |
TINYINT |
- |
否 |
0 |
逻辑删除:0-未删除,1-已删除 |
索引:
- PRIMARY KEY (
receivable_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, receivable_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_requirement (requirement_id)
- INDEX
idx_project (project_id)
- INDEX
idx_customer (customer_id)
- INDEX
idx_status (status)
3.6.2 receipt(收款记录表)
| 字段名 |
类型 |
长度 |
必填 |
默认值 |
说明 |
| receipt_id |
BIGINT |
- |
是 |
自增 |
主键,收款记录ID |
| tenant_id |
BIGINT |
- |
是 |
- |
租户ID(外键) |
| receipt_code |
VARCHAR |
50 |
是 |
- |
收款编号(唯一) |
| receivable_id |
BIGINT |
- |
是 |
- |
应收款ID(外键) |
| receipt_amount |
DECIMAL |
15,2 |
否 |
0.00 |
收款金额 |
| receipt_date |
DATE |
- |
否 |
- |
收款日期 |
| receipt_method |
VARCHAR |
20 |
否 |
transfer |
收款方式:transfer-转账,cash-现金,check-支票,other-其他 |
| receipt_account |
VARCHAR |
100 |
否 |
- |
收款账户 |
| payer_name |
VARCHAR |
100 |
否 |
- |
付款方名称 |
| receipt_voucher |
VARCHAR |
255 |
否 |
- |
收款凭证URL |
| operator_id |
BIGINT |
- |
否 |
- |
操作人ID(外键) |
| remark |
VARCHAR |
200 |
否 |
- |
备注说明 |
| created_time |
DATETIME |
- |
否 |
CURRENT_TIMESTAMP |
创建时间 |
索引:
- PRIMARY KEY (
receipt_id)
- UNIQUE KEY
uk_tenant_code (tenant_id, receipt_code)
- INDEX
idx_tenant (tenant_id)
- INDEX
idx_receivable (receivable_id)
四、数据库设计规范
4.1 命名规范
| 项目 |
规范 |
示例 |
| 数据库名 |
小写,下划线分隔 |
fund_platform |
| 表名 |
小写,下划线分隔 |
sys_user |
| 字段名 |
小写,下划线分隔 |
user_name |
| 索引名 |
前缀_表名_字段名 |
uk_tenant_username |
| 外键名 |
fk_表名_字段名 |
fk_user_dept |
4.2 字段规范
| 字段类型 |
使用场景 |
示例 |
| BIGINT |
主键、外键、ID |
user_id |
| VARCHAR(50) |
编码、用户名、短文本 |
user_code |
| VARCHAR(100) |
名称、标题 |
user_name |
| VARCHAR(200) |
长名称、URL |
project_name |
| VARCHAR(500) |
备注、描述 |
remark |
| TEXT |
长文本、JSON |
description |
| TINYINT |
状态、布尔值 |
status |
| INT |
数量、排序 |
sort_order |
| DECIMAL(15,2) |
金额 |
amount |
| DATETIME |
日期时间 |
created_time |
| DATE |
日期 |
start_date |
4.3 通用字段
所有表必须包含以下字段:
| 字段名 |
类型 |
说明 |
| created_by |
BIGINT |
创建人ID |
| created_time |
DATETIME |
创建时间(DEFAULT CURRENT_TIMESTAMP) |
| updated_by |
BIGINT |
更新人ID |
| updated_time |
DATETIME |
更新时间(DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) |
| deleted |
TINYINT |
逻辑删除标志(DEFAULT 0) |
4.4 实体类与SQL脚本同步规范
强制要求:修改实体类字段时,必须同步更新 SQL 初始化脚本
4.4.1 同步修改流程
graph LR
A[修改实体类字段] --> B[同步修改SQL脚本]
B --> C[更新数据库设计文档]
C --> D[编译验证]
D --> E[提交代码]
| 操作类型 |
实体类修改 |
SQL脚本修改 |
文档更新 |
| 新增字段 |
添加属性 + Getter/Setter |
ALTER TABLE ADD COLUMN |
更新表结构说明 |
| 删除字段 |
删除属性 + Getter/Setter |
ALTER TABLE DROP COLUMN |
更新表结构说明 |
| 修改字段 |
修改属性类型 |
ALTER TABLE MODIFY COLUMN |
更新字段说明 |
| 新增实体 |
创建Entity类 |
CREATE TABLE |
新增表结构说明 |
4.4.2 常见问题与预防
| 问题 |
原因 |
预防措施 |
| Unknown column |
实体类有字段但数据库表无对应列 |
修改实体类后立即更新SQL脚本 |
| SQLSyntaxErrorException |
SQL脚本与实体类不一致 |
提交前对比验证 |
| 字段类型不匹配 |
Java类型与MySQL类型映射错误 |
参照4.2字段规范 |
4.4.3 Java与MySQL类型映射
| Java类型 |
MySQL类型 |
说明 |
| Long |
BIGINT |
主键、外键、ID |
| String |
VARCHAR(n) |
根据长度选择n值 |
| String (长文本) |
TEXT |
超过500字符 |
| Integer |
INT |
数量、排序 |
| Boolean / Integer |
TINYINT |
0/1状态值 |
| BigDecimal |
DECIMAL(15,2) |
金额 |
| LocalDateTime |
DATETIME |
日期时间 |
| LocalDate |
DATE |
日期 |
4.5 自动化检查机制
4.5.1 单元测试验证
建议在 fund-common 或各业务模块的测试目录中添加实体类与表结构一致性测试:
@SpringBootTest
class EntitySchemaConsistencyTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
@DisplayName("验证SysConfig实体类与sys_config表结构一致")
void testSysConfigSchema() {
// 获取数据库表结构
var columns = jdbcTemplate.queryForList(
"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_NAME = 'sys_config' AND TABLE_SCHEMA = DATABASE()"
);
Set<String> dbColumns = columns.stream()
.map(row -> (String) row.get("COLUMN_NAME"))
.collect(Collectors.toSet());
// 获取实体类字段(通过反射)
Set<String> entityFields = Arrays.stream(SysConfig.class.getDeclaredFields())
.map(f -> CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, f.getName()))
.collect(Collectors.toSet());
// 验证一致性
assertThat(entityFields).isSubsetOf(dbColumns);
}
}
4.5.2 CI/CD集成检查
在持续集成流程中添加数据库脚本验证步骤:
# .gitlab-ci.yml 或 GitHub Actions
validate-schema:
stage: test
script:
- echo "验证SQL脚本语法"
- mysql --help > /dev/null 2>&1 && echo "MySQL client available"
# 可集成sqlfluff等SQL语法检查工具
文档结束