-- ======================================================== -- MySQL 建表脚本(带注释) -- 适用于 MySQL 5.7+ -- ======================================================== -- ---------------------------- -- 1. 系统用户表 -- ---------------------------- CREATE TABLE IF NOT EXISTS sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID', username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', password VARCHAR(100) NOT NULL COMMENT '密码(加密存储)', real_name VARCHAR(50) COMMENT '真实姓名', phone VARCHAR(20) COMMENT '手机号', email VARCHAR(100) COMMENT '邮箱', dept_id BIGINT DEFAULT NULL COMMENT '所属部门ID,NULL表示无部门', employee_type VARCHAR(20) DEFAULT 'common_user' COMMENT '员工类型:super_admin/flow_manager/dept_manager/common_user', status TINYINT DEFAULT 0 COMMENT '状态:0-正常,1-禁用', wecom_user_id VARCHAR(100) COMMENT '企业微信用户ID', wecom_remind_enabled TINYINT DEFAULT 1 COMMENT '是否开启企微提醒:0-否 1-是', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', UNIQUE KEY uk_user_phone (phone) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表'; -- ---------------------------- -- 2. 系统角色表 -- ---------------------------- CREATE TABLE IF NOT EXISTS sys_role ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID', role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码', role_name VARCHAR(50) NOT NULL COMMENT '角色名称', role_scope VARCHAR(20) DEFAULT 'tenant' COMMENT '角色范围:platform-平台级 tenant-租户级', parent_id BIGINT DEFAULT 0 COMMENT '父角色ID,0表示顶级角色', dept_id BIGINT DEFAULT 0 COMMENT '所属部门ID', username VARCHAR(50) COMMENT '角色账号登录名', phone VARCHAR(20) COMMENT '手机号', password VARCHAR(100) COMMENT '角色账号密码(加密存储)', status TINYINT DEFAULT 1 COMMENT '状态:0-禁用,1-启用', wecom_user_id VARCHAR(100) COMMENT '企业微信用户ID', wecom_remind_enabled TINYINT DEFAULT 1 COMMENT '是否开启企微提醒:0-否 1-是', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', UNIQUE KEY uk_role_phone (phone) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统角色表'; -- ---------------------------- -- 3. 用户角色关联表 -- ---------------------------- CREATE TABLE IF NOT EXISTS sys_user_role ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '关联ID', user_id BIGINT NOT NULL COMMENT '用户ID', role_id BIGINT NOT NULL COMMENT '角色ID', UNIQUE KEY uk_user_role (user_id, role_id) COMMENT '用户角色唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表'; -- ---------------------------- -- 4. 部门表 -- ---------------------------- CREATE TABLE IF NOT EXISTS sys_dept ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID', dept_name VARCHAR(50) NOT NULL COMMENT '部门名称', dept_code VARCHAR(50) COMMENT '部门编码', parent_id BIGINT DEFAULT 0 COMMENT '父部门ID,0表示顶级部门', leader_id BIGINT COMMENT '部门负责人ID', sort_order INT DEFAULT 0 COMMENT '排序号', status TINYINT DEFAULT 1 COMMENT '状态:0-禁用,1-启用', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; -- ---------------------------- -- 5. 流程定义表 -- ---------------------------- CREATE TABLE IF NOT EXISTS bpm_process_definition ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '流程定义ID', process_code VARCHAR(50) NOT NULL COMMENT '流程编码', process_name VARCHAR(100) NOT NULL COMMENT '流程名称', category VARCHAR(50) COMMENT '流程分类', form_id BIGINT COMMENT '关联表单ID', form_schema TEXT COMMENT '流程表单字段定义 JSON', model_json TEXT NOT NULL COMMENT '流程模型JSON', version INT DEFAULT 1 COMMENT '版本号', status TINYINT DEFAULT 0 COMMENT '状态:0-设计中 1-启用中 2-历史', description VARCHAR(500) COMMENT '流程描述', create_by BIGINT COMMENT '创建人ID', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_by BIGINT COMMENT '更新人ID', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除', UNIQUE KEY uk_process_code_version (process_code, version, deleted) COMMENT '流程编码+版本+删除标记唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程定义表'; -- ---------------------------- -- 6. 流程实例表 -- ---------------------------- CREATE TABLE IF NOT EXISTS bpm_process_instance ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '流程实例ID', instance_no VARCHAR(50) NOT NULL UNIQUE COMMENT '实例编号(业务单号)', process_definition_id BIGINT NOT NULL COMMENT '流程定义ID', version INT NOT NULL COMMENT '流程版本号', title VARCHAR(200) COMMENT '实例标题', applicant_id BIGINT NOT NULL COMMENT '申请人ID', applicant_dept_id BIGINT COMMENT '申请人部门ID', form_data TEXT COMMENT '表单数据JSON', attachment_urls TEXT COMMENT '附件URL列表JSON', current_node_id VARCHAR(50) COMMENT '当前节点ID', status TINYINT DEFAULT 0 COMMENT '实例状态:0待接收 1待处理 2已通过 3已拒绝 4已回退 5整体完成 6已撤回 7已终止', result VARCHAR(20) COMMENT '审批结果:PASS/REJECT/RETURN/TRANSFER', start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '流程启动时间', end_time TIMESTAMP NULL COMMENT '流程结束时间', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除', KEY idx_instance_definition_id (process_definition_id), KEY idx_instance_applicant (applicant_id), KEY idx_instance_status (status), KEY idx_instance_current_node (current_node_id), KEY idx_instance_status_end_definition (status, end_time, process_definition_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程实例表'; -- ---------------------------- -- 7. 审批任务表 -- ---------------------------- CREATE TABLE IF NOT EXISTS bpm_approval_task ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '任务ID', instance_id BIGINT NOT NULL COMMENT '流程实例ID', node_id VARCHAR(50) NOT NULL COMMENT '节点ID(流程模型中的节点标识)', node_name VARCHAR(100) COMMENT '节点名称', node_type VARCHAR(20) COMMENT '节点类型:start/approval/cc/condition/end', assignee_id BIGINT COMMENT '任务处理人ID', assignee_type VARCHAR(20) COMMENT '处理人类型:USER-指定用户 ROLE-角色 SELF-发起人 LEADER-部门主管', task_status TINYINT DEFAULT 0 COMMENT '任务状态:0待处理 1已处理 2已转办 3已跳过 4已回退', sub_node_id VARCHAR(50) COMMENT '子节点ID(父审批节点下的子节点标识)', approval_result VARCHAR(20) COMMENT '审批结果:PASS/REJECT/RETURN/TRANSFER', version INT DEFAULT 0 COMMENT '乐观锁版本号', approval_comment TEXT COMMENT '审批意见', attachment_urls TEXT COMMENT '附件URL列表(JSON数组)', timeout_time TIMESTAMP NULL COMMENT '超时时间', timeout_action VARCHAR(20) COMMENT '超时动作:pass-自动通过,reject-自动驳回,remind-提醒等', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(任务生成时间)', handle_time TIMESTAMP NULL COMMENT '处理时间', deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除', KEY idx_task_instance_id (instance_id), KEY idx_task_assignee_type_status (assignee_id, assignee_type, task_status), KEY idx_task_node (node_id), KEY idx_task_status_node_create (task_status, node_type, create_time), KEY idx_task_status_timeout (task_status, timeout_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批任务表'; -- ---------------------------- -- 8. 审批记录表 -- ---------------------------- CREATE TABLE IF NOT EXISTS bpm_approval_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID', task_id BIGINT NOT NULL COMMENT '关联审批任务ID', instance_id BIGINT NOT NULL COMMENT '关联流程实例ID', node_id VARCHAR(50) NOT NULL COMMENT '节点ID', node_name VARCHAR(100) COMMENT '节点名称', operator_id BIGINT NOT NULL COMMENT '操作人ID', operator_name VARCHAR(50) COMMENT '操作人姓名', action_type VARCHAR(20) NOT NULL COMMENT '动作类型:APPROVE/REJECT/RETURN/TRANSFER/ADD_SIGN', action_result VARCHAR(20) COMMENT '动作结果:PASS/REJECT/RETURN/TRANSFER', comment TEXT COMMENT '审批意见', attachment_urls TEXT COMMENT '附件URL列表(JSON数组)', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除', KEY idx_record_instance_id (instance_id), KEY idx_record_task_id (task_id), KEY idx_record_operator (operator_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批记录表(操作日志/历史记录)'; -- ---------------------------- -- 9. 流程附件表 -- ---------------------------- CREATE TABLE IF NOT EXISTS bpm_attachment ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '附件ID', instance_id BIGINT NOT NULL COMMENT '流程实例ID', task_id BIGINT COMMENT '关联任务ID', record_id BIGINT COMMENT '关联审批记录ID', node_id VARCHAR(50) COMMENT '节点ID', node_name VARCHAR(100) COMMENT '节点名称', file_name VARCHAR(500) NOT NULL COMMENT '原始文件名', file_url VARCHAR(500) NOT NULL COMMENT '文件访问URL', file_size BIGINT COMMENT '文件大小(字节)', uploader_id BIGINT COMMENT '上传人ID', uploader_name VARCHAR(50) COMMENT '上传人姓名', uploader_type VARCHAR(20) COMMENT '上传人类型:SYSTEM/ROLE', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', deleted TINYINT DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除', KEY idx_attachment_instance_id (instance_id), KEY idx_attachment_task_id (task_id), KEY idx_attachment_record_id (record_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程附件表'; -- 兼容已存在的 MySQL 数据库:补充审批任务子节点字段 SET @sql = ( SELECT IF(COUNT(*) = 0, 'ALTER TABLE bpm_approval_task ADD COLUMN sub_node_id VARCHAR(50) COMMENT ''子节点ID(父审批节点下的子节点标识)''', 'SELECT 1' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'bpm_approval_task' AND COLUMN_NAME = 'sub_node_id' AND TABLE_SCHEMA = DATABASE() ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 兼容已存在的 MySQL 数据库:补充角色企业微信字段 SET @sql = ( SELECT IF(COUNT(*) = 0, 'ALTER TABLE sys_role ADD COLUMN wecom_user_id VARCHAR(100) COMMENT ''企业微信用户ID''', 'SELECT 1' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_role' AND COLUMN_NAME = 'wecom_user_id' AND TABLE_SCHEMA = DATABASE() ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql = ( SELECT IF(COUNT(*) = 0, 'ALTER TABLE sys_role ADD COLUMN wecom_remind_enabled TINYINT DEFAULT 1 COMMENT ''是否开启企微提醒:0-否 1-是''', 'SELECT 1' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_role' AND COLUMN_NAME = 'wecom_remind_enabled' AND TABLE_SCHEMA = DATABASE() ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------- -- 9. 通知配置表 -- ---------------------------- CREATE TABLE IF NOT EXISTS sys_notification_config ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '配置ID', config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键', config_value VARCHAR(500) COMMENT '配置值', config_type VARCHAR(50) COMMENT '配置类型:WECOM/EMAIL/SMS', description VARCHAR(200) COMMENT '配置说明', status TINYINT DEFAULT 1 COMMENT '状态:0-禁用,1-启用', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知配置表';