feat: 创建数据库表结构和初始化数据

This commit is contained in:
zhangjf 2026-02-15 12:00:00 +08:00
parent 7718a73537
commit c12a1ac3d3
2 changed files with 619 additions and 0 deletions

178
sql/fund_platform_init.sql Normal file
View File

@ -0,0 +1,178 @@
-- ============================================
-- 资金服务平台初始化数据
-- ============================================
USE fund_platform;
-- ============================================
-- 1. 初始化租户
-- ============================================
INSERT INTO sys_tenant (tenant_id, tenant_code, tenant_name, tenant_type, contact_name, contact_phone, contact_email, status, expire_time) VALUES
(1, 'SYSTEM', '系统管理租户', 1, '系统管理员', '13800138000', 'admin@fundplatform.com', 1, '2099-12-31 23:59:59'),
(2, 'DEMO', '演示租户', 1, '演示用户', '13800138001', 'demo@fundplatform.com', 1, '2099-12-31 23:59:59');
-- ============================================
-- 2. 初始化部门
-- ============================================
INSERT INTO sys_dept (dept_id, tenant_id, dept_name, parent_id, dept_code, dept_level, sort_order, leader, leader_phone, status, remark) VALUES
(1, 1, '总部', 0, 'HQ', 1, 1, '总经理', '13800138000', 1, '公司总部'),
(2, 1, '技术部', 1, 'TECH', 2, 1, '技术总监', '13800138001', 1, '负责技术研发'),
(3, 1, '财务部', 1, 'FINANCE', 2, 2, '财务总监', '13800138002', 1, '负责财务管理'),
(4, 1, '市场部', 1, 'MARKET', 2, 3, '市场总监', '13800138003', 1, '负责市场拓展'),
(5, 1, '前端开发组', 2, 'FE', 3, 1, '前端组长', '13800138004', 1, '前端开发'),
(6, 1, '后端开发组', 2, 'BE', 3, 2, '后端组长', '13800138005', 1, '后端开发'),
(7, 1, '测试组', 2, 'TEST', 3, 3, '测试组长', '13800138006', 1, '测试团队');
-- ============================================
-- 3. 初始化角色
-- ============================================
INSERT INTO sys_role (role_id, tenant_id, role_code, role_name, role_type, data_scope, sort_order, status, remark) VALUES
(1, 1, 'super_admin', '超级管理员', 'system', 'all', 1, 1, '系统超级管理员,拥有所有权限'),
(2, 1, 'tenant_admin', '租户管理员', 'system', 'all', 2, 1, '租户管理员,管理租户内所有资源'),
(3, 1, 'project_manager', '项目经理', 'custom', 'dept', 3, 1, '负责项目管理'),
(4, 1, 'finance_manager', '财务经理', 'custom', 'dept', 4, 1, '负责财务管理'),
(5, 1, 'developer', '开发人员', 'custom', 'self', 5, 1, '开发人员'),
(6, 1, 'tester', '测试人员', 'custom', 'self', 6, 1, '测试人员'),
(7, 1, 'sales', '销售人员', 'custom', 'self', 7, 1, '销售人员');
-- ============================================
-- 4. 初始化用户
-- 密码: admin123 (BCrypt加密: $2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO)
-- ============================================
INSERT INTO sys_user (user_id, tenant_id, username, password, real_name, gender, phone, email, dept_id, position, status) VALUES
(1, 1, 'admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '系统管理员', 1, '13800138000', 'admin@fundplatform.com', 1, '系统管理员', 1),
(2, 1, 'zhangsan', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '张三', 1, '13800138001', 'zhangsan@fundplatform.com', 2, '技术总监', 1),
(3, 1, 'lisi', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '李四', 1, '13800138002', 'lisi@fundplatform.com', 3, '财务总监', 1),
(4, 1, 'wangwu', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '王五', 1, '13800138003', 'wangwu@fundplatform.com', 4, '市场总监', 1),
(5, 1, 'dev01', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '开发一号', 1, '13800138004', 'dev01@fundplatform.com', 6, '后端开发', 1),
(6, 1, 'test01', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EO', '测试一号', 2, '13800138005', 'test01@fundplatform.com', 7, '测试工程师', 1);
-- ============================================
-- 5. 初始化菜单
-- ============================================
INSERT INTO sys_menu (menu_id, tenant_id, menu_name, menu_type, parent_id, menu_level, icon, path, component, permission, sort_order, status) VALUES
-- 系统管理
(1, 0, '系统管理', 'dir', 0, 1, 'Setting', '/system', NULL, NULL, 1, 1),
(2, 0, '用户管理', 'menu', 1, 2, 'User', 'user', 'system/user/index', 'user:list', 1, 1),
(3, 0, '新增用户', 'button', 2, 3, NULL, NULL, NULL, 'user:add', 1, 1),
(4, 0, '编辑用户', 'button', 2, 3, NULL, NULL, NULL, 'user:edit', 2, 1),
(5, 0, '删除用户', 'button', 2, 3, NULL, NULL, NULL, 'user:delete', 3, 1),
(6, 0, '角色管理', 'menu', 1, 2, 'Role', 'role', 'system/role/index', 'role:list', 2, 1),
(7, 0, '新增角色', 'button', 6, 3, NULL, NULL, NULL, 'role:add', 1, 1),
(8, 0, '编辑角色', 'button', 6, 3, NULL, NULL, NULL, 'role:edit', 2, 1),
(9, 0, '删除角色', 'button', 6, 3, NULL, NULL, NULL, 'role:delete', 3, 1),
(10, 0, '菜单管理', 'menu', 1, 2, 'Menu', 'menu', 'system/menu/index', 'menu:list', 3, 1),
(11, 0, '部门管理', 'menu', 1, 2, 'Dept', 'dept', 'system/dept/index', 'dept:list', 4, 1),
(12, 0, '租户管理', 'menu', 1, 2, 'Tenant', 'tenant', 'system/tenant/index', 'tenant:list', 5, 1),
(13, 0, '操作日志', 'menu', 1, 2, 'Log', 'log', 'system/log/index', 'log:list', 6, 1),
-- 客户管理
(20, 0, '客户管理', 'dir', 0, 1, 'Customer', '/customer', NULL, NULL, 2, 1),
(21, 0, '客户列表', 'menu', 20, 2, 'CustomerList', 'customer', 'customer/customer/index', 'customer:list', 1, 1),
(22, 0, '新增客户', 'button', 21, 3, NULL, NULL, NULL, 'customer:add', 1, 1),
(23, 0, '编辑客户', 'button', 21, 3, NULL, NULL, NULL, 'customer:edit', 2, 1),
(24, 0, '删除客户', 'button', 21, 3, NULL, NULL, NULL, 'customer:delete', 3, 1),
(25, 0, '联系人管理', 'menu', 20, 2, 'Contact', 'contact', 'customer/contact/index', 'contact:list', 2, 1),
-- 项目管理
(30, 0, '项目管理', 'dir', 0, 1, 'Project', '/project', NULL, NULL, 3, 1),
(31, 0, '项目列表', 'menu', 30, 2, 'ProjectList', 'project', 'project/project/index', 'project:list', 1, 1),
(32, 0, '新增项目', 'button', 31, 3, NULL, NULL, NULL, 'project:add', 1, 1),
(33, 0, '编辑项目', 'button', 31, 3, NULL, NULL, NULL, 'project:edit', 2, 1),
(34, 0, '删除项目', 'button', 31, 3, NULL, NULL, NULL, 'project:delete', 3, 1),
(35, 0, '项目成员', 'menu', 30, 2, 'ProjectMember', 'member', 'project/member/index', 'member:list', 2, 1),
-- 需求工单
(40, 0, '需求工单', 'dir', 0, 1, 'Requirement', '/requirement', NULL, NULL, 4, 1),
(41, 0, '需求列表', 'menu', 40, 2, 'RequirementList', 'requirement', 'requirement/requirement/index', 'requirement:list', 1, 1),
(42, 0, '新增需求', 'button', 41, 3, NULL, NULL, NULL, 'requirement:add', 1, 1),
(43, 0, '编辑需求', 'button', 41, 3, NULL, NULL, NULL, 'requirement:edit', 2, 1),
(44, 0, '删除需求', 'button', 41, 3, NULL, NULL, NULL, 'requirement:delete', 3, 1),
-- 支出管理
(50, 0, '支出管理', 'dir', 0, 1, 'Expense', '/expense', NULL, NULL, 5, 1),
(51, 0, '支出类型', 'menu', 50, 2, 'ExpenseType', 'type', 'expense/type/index', 'expense-type:list', 1, 1),
(52, 0, '支出列表', 'menu', 50, 2, 'ExpenseList', 'expense', 'expense/expense/index', 'expense:list', 2, 1),
(53, 0, '新增支出', 'button', 52, 3, NULL, NULL, NULL, 'expense:add', 1, 1),
(54, 0, '编辑支出', 'button', 52, 3, NULL, NULL, NULL, 'expense:edit', 2, 1),
-- 应收款管理
(60, 0, '应收款管理', 'dir', 0, 1, 'Receivable', '/receivable', NULL, NULL, 6, 1),
(61, 0, '应收款列表', 'menu', 60, 2, 'ReceivableList', 'receivable', 'receivable/receivable/index', 'receivable:list', 1, 1),
(62, 0, '收款记录', 'menu', 60, 2, 'Receipt', 'receipt', 'receivable/receipt/index', 'receipt:list', 2, 1);
-- ============================================
-- 6. 初始化用户角色关联
-- ============================================
INSERT INTO sys_user_role (id, tenant_id, user_id, role_id) VALUES
(1, 1, 1, 1), -- admin -> 超级管理员
(2, 1, 2, 2), -- zhangsan -> 租户管理员
(3, 1, 3, 4), -- lisi -> 财务经理
(4, 1, 4, 3), -- wangwu -> 项目经理
(5, 1, 5, 5), -- dev01 -> 开发人员
(6, 1, 6, 6); -- test01 -> 测试人员
-- ============================================
-- 7. 初始化角色菜单关联(超级管理员拥有所有权限)
-- ============================================
INSERT INTO sys_role_menu (id, tenant_id, role_id, menu_id)
SELECT NULL, 1, 1, menu_id FROM sys_menu WHERE status = 1;
-- 租户管理员权限(除租户管理外的所有权限)
INSERT INTO sys_role_menu (id, tenant_id, role_id, menu_id)
SELECT NULL, 1, 2, menu_id FROM sys_menu WHERE status = 1 AND menu_id != 12;
-- 项目经理权限
INSERT INTO sys_role_menu (tenant_id, role_id, menu_id) VALUES
(1, 3, 30), (1, 3, 31), (1, 3, 32), (1, 3, 33), (1, 3, 34),
(1, 3, 35), (1, 3, 40), (1, 3, 41), (1, 3, 42), (1, 3, 43),
(1, 3, 44), (1, 3, 60), (1, 3, 61), (1, 3, 62);
-- 财务经理权限
INSERT INTO sys_role_menu (tenant_id, role_id, menu_id) VALUES
(1, 4, 50), (1, 4, 51), (1, 4, 52), (1, 4, 53), (1, 4, 54),
(1, 4, 60), (1, 4, 61), (1, 4, 62);
-- ============================================
-- 8. 初始化支出类型
-- ============================================
INSERT INTO expense_type (type_id, tenant_id, type_code, type_name, parent_id, type_level, sort_order, description, status) VALUES
(1, 1, 'personnel', '人力成本', 0, 1, 1, '人员相关支出', 1),
(2, 1, 'salary', '工资薪金', 1, 2, 1, '员工工资', 1),
(3, 1, 'bonus', '奖金福利', 1, 2, 2, '奖金和福利', 1),
(4, 1, 'social', '社保公积金', 1, 2, 3, '社保和公积金', 1),
(5, 1, 'operation', '运营成本', 0, 1, 2, '日常运营支出', 1),
(6, 1, 'rent', '房租物业', 5, 2, 1, '房租和物业费', 1),
(7, 1, 'utilities', '水电费', 5, 2, 2, '水电费', 1),
(8, 1, 'office', '办公用品', 5, 2, 3, '办公用品采购', 1),
(9, 1, 'project', '项目成本', 0, 1, 3, '项目相关支出', 1),
(10, 1, 'outsourcing', '外包费用', 9, 2, 1, '外包服务费', 1),
(11, 1, 'material', '材料费', 9, 2, 2, '项目材料费', 1),
(12, 1, 'travel', '差旅费', 9, 2, 3, '项目差旅费', 1);
-- ============================================
-- 9. 初始化客户数据
-- ============================================
INSERT INTO customer (customer_id, tenant_id, customer_code, customer_name, customer_short, customer_type, industry, scale, level, contact_name, contact_phone, email, address, status, cooperation_start) VALUES
(1, 1, 'CUST2024001', '北京科技有限公司', '北京科技', 'enterprise', '互联网', 'medium', 'A', '张总', '13800138001', 'ceo@bjtech.com', '北京市海淀区中关村大街1号', 1, '2024-01-01'),
(2, 1, 'CUST2024002', '上海金融投资有限公司', '上海金融', 'enterprise', '金融', 'large', 'A', '李总', '13800138002', 'ceo@shfinance.com', '上海市浦东新区陆家嘴环路1000号', 1, '2024-02-01'),
(3, 1, 'CUST2024003', '广州贸易发展有限公司', '广州贸易', 'enterprise', '贸易', 'small', 'B', '王总', '13800138003', 'ceo@gztrade.com', '广州市天河区珠江新城华夏路10号', 1, '2024-03-01');
-- ============================================
-- 10. 初始化项目数据
-- ============================================
INSERT INTO project (project_id, tenant_id, project_code, project_name, project_short, customer_id, project_type, project_manager_id, start_date, end_date, budget_amount, contract_amount, status, progress, description) VALUES
(1, 1, 'PROJ2024001', '北京科技ERP系统开发', 'ERP系统', 1, 'development', 4, '2024-01-15', '2024-06-30', 500000.00, 600000.00, 'ongoing', 60, '北京科技ERP管理系统开发项目'),
(2, 1, 'PROJ2024002', '上海金融数据分析平台', '数据分析平台', 2, 'development', 4, '2024-02-01', '2024-08-31', 800000.00, 1000000.00, 'ongoing', 40, '金融数据分析与可视化平台'),
(3, 1, 'PROJ2024003', '广州贸易官网建设', '官网建设', 3, 'development', 4, '2024-03-15', '2024-05-15', 100000.00, 120000.00, 'completed', 100, '企业官网设计与开发');
-- ============================================
-- 11. 初始化项目成员
-- ============================================
INSERT INTO project_member (member_id, tenant_id, project_id, user_id, role, join_date, workload, status) VALUES
(1, 1, 1, 4, 'pm', '2024-01-15', 50.00, 1),
(2, 1, 1, 5, 'dev', '2024-01-15', 100.00, 1),
(3, 1, 1, 6, 'test', '2024-02-01', 80.00, 1),
(4, 1, 2, 4, 'pm', '2024-02-01', 50.00, 1),
(5, 1, 2, 5, 'dev', '2024-02-01', 80.00, 1),
(6, 1, 3, 4, 'pm', '2024-03-15', 30.00, 1);

View File

@ -0,0 +1,441 @@
-- ============================================
-- 资金服务平台数据库结构
-- 数据库: fund_platform
-- 字符集: utf8mb4
-- ============================================
USE fund_platform;
-- ============================================
-- 1. 系统管理模块表结构
-- ============================================
-- 租户表
CREATE TABLE IF NOT EXISTS sys_tenant (
tenant_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '租户ID',
tenant_code VARCHAR(50) NOT NULL UNIQUE COMMENT '租户编码',
tenant_name VARCHAR(100) NOT NULL COMMENT '租户名称',
tenant_type TINYINT DEFAULT 1 COMMENT '租户类型1-一库多租户2-一库一租户',
contact_name VARCHAR(50) COMMENT '联系人姓名',
contact_phone VARCHAR(20) COMMENT '联系人电话',
contact_email VARCHAR(100) COMMENT '联系人邮箱',
db_config JSON COMMENT '数据库配置(一库一租户模式使用)',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
expire_time DATETIME COMMENT '过期时间',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_code (tenant_code),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户表';
-- 部门表
CREATE TABLE IF NOT EXISTS sys_dept (
dept_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
parent_id BIGINT DEFAULT 0 COMMENT '父部门ID0表示顶级部门',
dept_code VARCHAR(50) COMMENT '部门编码',
dept_level INT DEFAULT 1 COMMENT '部门层级',
sort_order INT DEFAULT 0 COMMENT '排序顺序',
leader VARCHAR(50) COMMENT '部门负责人',
leader_phone VARCHAR(20) COMMENT '负责人电话',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
remark VARCHAR(500) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
INDEX idx_tenant (tenant_id),
INDEX idx_parent (parent_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
-- 用户表
CREATE TABLE IF NOT EXISTS sys_user (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
username VARCHAR(50) NOT NULL COMMENT '用户名(登录账号)',
password VARCHAR(100) NOT NULL COMMENT '密码(加密存储)',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
gender TINYINT DEFAULT 0 COMMENT '性别0-未知1-男2-女',
phone VARCHAR(20) COMMENT '手机号码',
email VARCHAR(100) COMMENT '邮箱地址',
dept_id BIGINT COMMENT '所属部门ID',
position VARCHAR(50) COMMENT '岗位/职位',
avatar VARCHAR(255) COMMENT '头像URL',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
last_login_time DATETIME COMMENT '最后登录时间',
last_login_ip VARCHAR(50) COMMENT '最后登录IP',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
UNIQUE KEY uk_tenant_username (tenant_id, username),
INDEX idx_tenant (tenant_id),
INDEX idx_dept (dept_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 角色表
CREATE TABLE IF NOT EXISTS sys_role (
role_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
role_code VARCHAR(50) NOT NULL COMMENT '角色编码',
role_name VARCHAR(100) NOT NULL COMMENT '角色名称',
role_type VARCHAR(20) DEFAULT 'custom' COMMENT '角色类型system-系统角色custom-自定义角色',
data_scope VARCHAR(20) DEFAULT 'self' COMMENT '数据范围all-全部dept-本部门self-本人',
sort_order INT DEFAULT 0 COMMENT '排序顺序',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
remark VARCHAR(500) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
UNIQUE KEY uk_tenant_code (tenant_id, role_code),
INDEX idx_tenant (tenant_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
-- 菜单表
CREATE TABLE IF NOT EXISTS sys_menu (
menu_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '菜单ID',
tenant_id BIGINT DEFAULT 0 COMMENT '租户ID0表示系统通用菜单',
menu_name VARCHAR(100) NOT NULL COMMENT '菜单名称',
menu_type VARCHAR(20) NOT NULL COMMENT '菜单类型dir-目录menu-菜单button-按钮',
parent_id BIGINT DEFAULT 0 COMMENT '父菜单ID0表示顶级菜单',
menu_level INT DEFAULT 1 COMMENT '菜单层级',
icon VARCHAR(100) COMMENT '菜单图标',
path VARCHAR(200) COMMENT '路由路径',
component VARCHAR(200) COMMENT '组件路径',
permission VARCHAR(100) COMMENT '权限标识user:list',
sort_order INT DEFAULT 0 COMMENT '排序顺序',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
remark VARCHAR(500) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
INDEX idx_tenant (tenant_id),
INDEX idx_parent (parent_id),
INDEX idx_type (menu_type),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';
-- 用户角色关联表
CREATE TABLE IF NOT EXISTS sys_user_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY uk_user_role (tenant_id, user_id, role_id),
INDEX idx_user (user_id),
INDEX idx_role (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表';
-- 角色菜单关联表
CREATE TABLE IF NOT EXISTS sys_role_menu (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
menu_id BIGINT NOT NULL COMMENT '菜单ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY uk_role_menu (tenant_id, role_id, menu_id),
INDEX idx_role (role_id),
INDEX idx_menu (menu_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关联表';
-- 操作日志表
CREATE TABLE IF NOT EXISTS sys_operation_log (
log_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
user_id BIGINT COMMENT '操作人ID',
username VARCHAR(50) COMMENT '操作人用户名',
operation VARCHAR(100) COMMENT '操作描述',
method VARCHAR(200) COMMENT '操作方法',
params TEXT COMMENT '操作参数JSON格式',
ip VARCHAR(50) COMMENT '操作IP',
user_agent VARCHAR(500) COMMENT '用户代理',
operation_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
cost_time BIGINT DEFAULT 0 COMMENT '耗时(毫秒)',
result VARCHAR(20) DEFAULT 'success' COMMENT '操作结果success-成功fail-失败',
error_msg TEXT COMMENT '错误信息',
INDEX idx_tenant (tenant_id),
INDEX idx_user (user_id),
INDEX idx_time (operation_time),
INDEX idx_result (result)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
-- ============================================
-- 2. 客户管理模块表结构
-- ============================================
-- 客户表
CREATE TABLE IF NOT EXISTS customer (
customer_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '客户ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
customer_code VARCHAR(50) NOT NULL COMMENT '客户编码(唯一)',
customer_name VARCHAR(200) NOT NULL COMMENT '客户名称',
customer_short VARCHAR(100) COMMENT '客户简称',
customer_type VARCHAR(20) DEFAULT 'enterprise' COMMENT '客户类型enterprise-企业individual-个人',
industry VARCHAR(50) COMMENT '所属行业',
scale VARCHAR(20) COMMENT '企业规模small-小型medium-中型large-大型',
level VARCHAR(20) DEFAULT 'normal' COMMENT '客户等级A/B/C/D/normal',
tax_no VARCHAR(50) COMMENT '纳税人识别号',
legal_person VARCHAR(50) COMMENT '法定代表人',
address VARCHAR(500) COMMENT '公司地址',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱地址',
website VARCHAR(200) COMMENT '公司网站',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
remark VARCHAR(500) COMMENT '备注说明',
cooperation_start DATE COMMENT '合作开始日期',
cooperation_end DATE COMMENT '合作结束日期',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
UNIQUE KEY uk_tenant_code (tenant_id, customer_code),
INDEX idx_tenant (tenant_id),
INDEX idx_status (status),
INDEX idx_level (level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';
-- 客户联系人表
CREATE TABLE IF NOT EXISTS customer_contact (
contact_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '联系人ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
customer_id BIGINT NOT NULL COMMENT '客户ID',
contact_name VARCHAR(50) NOT NULL COMMENT '联系人姓名',
position VARCHAR(50) COMMENT '职位/职务',
department VARCHAR(100) COMMENT '所属部门',
phone VARCHAR(20) COMMENT '联系电话',
mobile VARCHAR(20) COMMENT '手机号码',
email VARCHAR(100) COMMENT '邮箱地址',
wechat VARCHAR(50) COMMENT '微信号',
qq VARCHAR(20) COMMENT 'QQ号',
is_primary TINYINT DEFAULT 0 COMMENT '是否主要联系人0-否1-是',
sort_order INT DEFAULT 0 COMMENT '排序顺序',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
remark VARCHAR(200) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
INDEX idx_tenant (tenant_id),
INDEX idx_customer (customer_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户联系人表';
-- ============================================
-- 3. 项目管理模块表结构
-- ============================================
-- 项目表
CREATE TABLE IF NOT EXISTS project (
project_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '项目ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
project_code VARCHAR(50) NOT NULL COMMENT '项目编号(唯一)',
project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
project_short VARCHAR(100) COMMENT '项目简称',
customer_id BIGINT NOT NULL COMMENT '客户ID',
project_type VARCHAR(20) DEFAULT 'development' COMMENT '项目类型development-开发maintenance-维护consulting-咨询',
project_manager_id BIGINT COMMENT '项目经理ID',
start_date DATE COMMENT '项目开始日期',
end_date DATE COMMENT '项目结束日期',
budget_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '项目预算金额',
contract_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '合同金额',
status VARCHAR(20) DEFAULT 'preparing' COMMENT '项目状态preparing-筹备中ongoing-进行中completed-已完成archived-已归档cancelled-已取消',
progress INT DEFAULT 0 COMMENT '项目进度0-100',
description TEXT COMMENT '项目描述',
remark VARCHAR(500) COMMENT '备注说明',
attachment_url VARCHAR(500) COMMENT '附件URL',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目表';
-- 项目成员表
CREATE TABLE IF NOT EXISTS project_member (
member_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '成员关系ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
project_id BIGINT NOT NULL COMMENT '项目ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
role VARCHAR(50) DEFAULT 'member' COMMENT '项目角色pm-项目经理dev-开发test-测试finance-财务member-普通成员',
join_date DATE COMMENT '加入日期',
leave_date DATE COMMENT '离开日期',
workload DECIMAL(5,2) DEFAULT 0.00 COMMENT '工作量占比0-100',
status TINYINT DEFAULT 1 COMMENT '状态0-已离开1-在职',
remark VARCHAR(200) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
UNIQUE KEY uk_project_user (tenant_id, project_id, user_id),
INDEX idx_project (project_id),
INDEX idx_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目成员表';
-- ============================================
-- 4. 需求工单模块表结构
-- ============================================
-- 需求工单表
CREATE TABLE IF NOT EXISTS requirement (
requirement_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '需求ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
requirement_code VARCHAR(50) NOT NULL COMMENT '需求编号(唯一)',
requirement_name VARCHAR(200) NOT NULL COMMENT '需求名称',
description TEXT COMMENT '需求描述',
project_id BIGINT NOT NULL COMMENT '项目ID',
customer_id BIGINT NOT NULL COMMENT '客户ID',
priority VARCHAR(20) DEFAULT 'normal' COMMENT '优先级high-高normal-中low-低',
estimated_hours DECIMAL(8,2) DEFAULT 0.00 COMMENT '预估开发工时(小时)',
actual_hours DECIMAL(8,2) DEFAULT 0.00 COMMENT '实际开发工时(小时)',
planned_start DATE COMMENT '计划开始日期',
planned_end DATE COMMENT '计划结束日期',
actual_start DATE COMMENT '实际开始日期',
actual_end DATE COMMENT '实际结束日期',
delivery_date DATE COMMENT '交付日期',
receivable_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '应收款金额',
receivable_date DATE COMMENT '应收款日期',
status VARCHAR(20) DEFAULT 'pending' COMMENT '状态pending-待开发developing-开发中delivered-已交付completed-已完成',
progress INT DEFAULT 0 COMMENT '开发进度0-100',
attachment_url VARCHAR(500) COMMENT '附件URL',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='需求工单表';
-- ============================================
-- 5. 支出管理模块表结构
-- ============================================
-- 支出类型表
CREATE TABLE IF NOT EXISTS expense_type (
type_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '支出类型ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
type_code VARCHAR(50) COMMENT '支出类型编码',
type_name VARCHAR(100) NOT NULL COMMENT '支出类型名称',
parent_id BIGINT DEFAULT 0 COMMENT '父类型ID0表示一级类型',
type_level INT DEFAULT 1 COMMENT '类型层级',
sort_order INT DEFAULT 0 COMMENT '排序顺序',
description VARCHAR(200) COMMENT '类型描述',
status TINYINT DEFAULT 1 COMMENT '状态0-禁用1-启用',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
INDEX idx_tenant (tenant_id),
INDEX idx_parent (parent_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支出类型表';
-- 支出表
CREATE TABLE IF NOT EXISTS expense (
expense_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '支出ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
expense_code VARCHAR(50) NOT NULL COMMENT '支出编号(唯一)',
expense_type_id BIGINT NOT NULL COMMENT '支出类型ID',
expense_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '支出金额',
expense_date DATE COMMENT '支出日期',
expense_reason TEXT COMMENT '支出事由',
project_id BIGINT COMMENT '所属项目ID',
applicant_id BIGINT NOT NULL COMMENT '申请人ID',
department_id BIGINT COMMENT '申请部门ID',
payment_method VARCHAR(20) DEFAULT 'transfer' COMMENT '付款方式transfer-转账cash-现金check-支票other-其他',
payment_account VARCHAR(100) COMMENT '付款账户',
attachment_url VARCHAR(500) COMMENT '附件URL',
status VARCHAR(20) DEFAULT 'pending' COMMENT '状态pending-待付款paid-已付款completed-已完成cancelled-已作废',
payment_date DATE COMMENT '付款日期',
payment_voucher VARCHAR(255) COMMENT '付款凭证',
remark VARCHAR(500) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支出表';
-- ============================================
-- 6. 应收款管理模块表结构
-- ============================================
-- 应收款表
CREATE TABLE IF NOT EXISTS receivable (
receivable_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '应收款ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
receivable_code VARCHAR(50) NOT NULL COMMENT '应收款编号(唯一)',
requirement_id BIGINT NOT NULL COMMENT '需求ID',
project_id BIGINT NOT NULL COMMENT '项目ID',
customer_id BIGINT NOT NULL COMMENT '客户ID',
receivable_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '应收款金额',
receivable_date DATE COMMENT '应收款日期',
payment_due_date DATE COMMENT '付款截止日期',
payment_method VARCHAR(20) COMMENT '付款方式transfer-转账cash-现金check-支票other-其他',
bank_account VARCHAR(100) COMMENT '收款账户',
status VARCHAR(20) DEFAULT 'pending' COMMENT '状态pending-待收款partial-部分收款received-已收款overdue-逾期',
received_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '已收款金额',
unpaid_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '未收款金额',
overdue_days INT DEFAULT 0 COMMENT '逾期天数',
remark VARCHAR(500) COMMENT '备注说明',
created_by BIGINT COMMENT '创建人ID',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_by BIGINT COMMENT '更新人ID',
updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='应收款表';
-- 收款记录表
CREATE TABLE IF NOT EXISTS receipt (
receipt_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '收款记录ID',
tenant_id BIGINT NOT NULL COMMENT '租户ID',
receipt_code VARCHAR(50) NOT NULL COMMENT '收款编号(唯一)',
receivable_id BIGINT NOT NULL COMMENT '应收款ID',
receipt_amount DECIMAL(15,2) DEFAULT 0.00 COMMENT '收款金额',
receipt_date DATE COMMENT '收款日期',
receipt_method VARCHAR(20) DEFAULT 'transfer' COMMENT '收款方式transfer-转账cash-现金check-支票other-其他',
receipt_account VARCHAR(100) COMMENT '收款账户',
payer_name VARCHAR(100) COMMENT '付款方名称',
receipt_voucher VARCHAR(255) COMMENT '收款凭证URL',
operator_id BIGINT COMMENT '操作人ID',
remark VARCHAR(200) COMMENT '备注说明',
created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
UNIQUE KEY uk_tenant_code (tenant_id, receipt_code),
INDEX idx_tenant (tenant_id),
INDEX idx_receivable (receivable_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收款记录表';