From c12a1ac3d31b5789a463a52860b92f9d52f770a8 Mon Sep 17 00:00:00 2001 From: zhangjf Date: Sun, 15 Feb 2026 12:00:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=E7=BB=93=E6=9E=84=E5=92=8C=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/fund_platform_init.sql | 178 ++++++++++++++ sql/fund_platform_schema.sql | 441 +++++++++++++++++++++++++++++++++++ 2 files changed, 619 insertions(+) create mode 100644 sql/fund_platform_init.sql create mode 100644 sql/fund_platform_schema.sql diff --git a/sql/fund_platform_init.sql b/sql/fund_platform_init.sql new file mode 100644 index 0000000..d891ade --- /dev/null +++ b/sql/fund_platform_init.sql @@ -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); diff --git a/sql/fund_platform_schema.sql b/sql/fund_platform_schema.sql new file mode 100644 index 0000000..b6ab79f --- /dev/null +++ b/sql/fund_platform_schema.sql @@ -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 '父部门ID(0表示顶级部门)', + 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 '租户ID(0表示系统通用菜单)', + menu_name VARCHAR(100) NOT NULL COMMENT '菜单名称', + menu_type VARCHAR(20) NOT NULL COMMENT '菜单类型:dir-目录,menu-菜单,button-按钮', + parent_id BIGINT DEFAULT 0 COMMENT '父菜单ID(0表示顶级菜单)', + 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 '父类型ID(0表示一级类型)', + 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='收款记录表';