-- 组织架构模块:表名去掉 erp 字样,改为租户端通用命名 -- yz_backend_erp_organization -> yz_backend_organization -- yz_backend_erp_employee -> yz_backend_employee -- yz_backend_erp_position -> yz_backend_position -- -- 组织架构由进销存(ERP)与办公自动化(OA)共用同一份数据,通过 tid 实现租户间隔离。 -- 执行前请确认当前数据库字符集为 utf8mb4,并先备份这三张表。 -- -- 说明:脚本可重复执行。如果旧表不存在(全新环境),RENAME 会被跳过, -- 后面的 CREATE TABLE IF NOT EXISTS 会建出目标表结构。 -- --------------------------------------------------------------------------- -- 1. 重命名已有表(仅当旧表存在且新表不存在时执行) -- --------------------------------------------------------------------------- SET @schema := DATABASE(); SET @sql := IF( (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_erp_organization') = 1 AND (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_organization') = 0, 'RENAME TABLE `yz_backend_erp_organization` TO `yz_backend_organization`', 'SELECT "skip: yz_backend_organization"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_erp_employee') = 1 AND (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_employee') = 0, 'RENAME TABLE `yz_backend_erp_employee` TO `yz_backend_employee`', 'SELECT "skip: yz_backend_employee"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_erp_position') = 1 AND (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_position') = 0, 'RENAME TABLE `yz_backend_erp_position` TO `yz_backend_position`', 'SELECT "skip: yz_backend_position"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- --------------------------------------------------------------------------- -- 2. 全新环境建表(旧表不存在时生效) -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `yz_backend_organization` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '租户ID(数据隔离)', `org_name` varchar(128) NOT NULL DEFAULT '' COMMENT '组织名称', `org_code` varchar(64) NOT NULL DEFAULT '' COMMENT '组织编码(租户内唯一)', `parent_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '上级组织ID,0为顶级', `sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序,越小越靠前', `leader_id` bigint(20) unsigned DEFAULT NULL COMMENT '负责人(员工ID)', `is_company` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否企业单位:1-是 0-部门', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-启用 0-禁用', `remark` varchar(512) DEFAULT NULL COMMENT '备注', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_tid` (`tid`) USING BTREE, KEY `idx_tid_code` (`tid`,`org_code`) USING BTREE, KEY `idx_parent_id` (`parent_id`) USING BTREE, KEY `idx_is_company` (`is_company`) USING BTREE, KEY `idx_status` (`status`) USING BTREE, KEY `idx_delete_time` (`delete_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='组织架构表(ERP与OA共用)'; CREATE TABLE IF NOT EXISTS `yz_backend_employee` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` int(11) DEFAULT NULL COMMENT '租户ID(数据隔离)', `account` varchar(50) NOT NULL DEFAULT '' COMMENT '登录账号(租户内唯一)', `password` varchar(64) NOT NULL DEFAULT '' COMMENT '密码(sha256 hex)', `name` varchar(30) NOT NULL DEFAULT '' COMMENT '姓名', `gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:0-未知 1-男 2-女', `birthday` date DEFAULT NULL COMMENT '生日', `affiliate_unit` varchar(100) DEFAULT NULL COMMENT '隶属单位(组织ID)', `department` varchar(50) DEFAULT NULL COMMENT '部门(组织ID)', `position` varchar(50) DEFAULT NULL COMMENT '职位', `education` varchar(20) DEFAULT NULL COMMENT '学历', `nation` varchar(20) DEFAULT NULL COMMENT '民族', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `wechat` varchar(50) DEFAULT NULL COMMENT '微信', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `home_address` varchar(255) DEFAULT NULL COMMENT '家庭住址', `account_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '账号状态:1-启用 0-禁用 2-离职', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_tid` (`tid`) USING BTREE, KEY `idx_tid_account` (`tid`,`account`) USING BTREE, KEY `idx_department` (`department`) USING BTREE, KEY `idx_affiliate_unit` (`affiliate_unit`) USING BTREE, KEY `idx_account_status` (`account_status`) USING BTREE, KEY `idx_delete_time` (`delete_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='员工信息表(ERP与OA共用)'; CREATE TABLE IF NOT EXISTS `yz_backend_position` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '租户ID(数据隔离)', `department_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '所属部门(组织ID)', `position_code` varchar(50) NOT NULL DEFAULT '' COMMENT '职位编码(租户内唯一)', `position_name` varchar(100) NOT NULL DEFAULT '' COMMENT '职位名称', `position_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '职位类型:0-普通 1-主管 2-负责人', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-启用 0-禁用', `sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序,越小越靠前', `remark` varchar(512) DEFAULT NULL COMMENT '备注', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_tid` (`tid`) USING BTREE, KEY `idx_tid_code` (`tid`,`position_code`) USING BTREE, KEY `idx_department_id` (`department_id`) USING BTREE, KEY `idx_status` (`status`) USING BTREE, KEY `idx_delete_time` (`delete_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='职位表(ERP与OA共用)'; -- --------------------------------------------------------------------------- -- 3. 补齐旧表缺失的字段与索引(重命名后的表可能来自更早的版本) -- --------------------------------------------------------------------------- -- yz_backend_position 新增 remark / delete_time SET @sql := IF( (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_position' AND COLUMN_NAME = 'remark') = 0, 'ALTER TABLE `yz_backend_position` ADD COLUMN `remark` varchar(512) DEFAULT NULL COMMENT ''备注'' AFTER `sort`', 'SELECT "skip: yz_backend_position.remark"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_position' AND COLUMN_NAME = 'delete_time') = 0, 'ALTER TABLE `yz_backend_position` ADD COLUMN `delete_time` datetime DEFAULT NULL COMMENT ''删除时间(软删除)''', 'SELECT "skip: yz_backend_position.delete_time"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_position' AND INDEX_NAME = 'idx_tid_code') = 0, 'ALTER TABLE `yz_backend_position` ADD INDEX `idx_tid_code` (`tid`,`position_code`) USING BTREE', 'SELECT "skip: yz_backend_position.idx_tid_code"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_organization' AND INDEX_NAME = 'idx_tid_code') = 0, 'ALTER TABLE `yz_backend_organization` ADD INDEX `idx_tid_code` (`tid`,`org_code`) USING BTREE', 'SELECT "skip: yz_backend_organization.idx_tid_code"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF( (SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = 'yz_backend_employee' AND INDEX_NAME = 'idx_tid_account') = 0, 'ALTER TABLE `yz_backend_employee` ADD INDEX `idx_tid_account` (`tid`,`account`) USING BTREE', 'SELECT "skip: yz_backend_employee.idx_tid_account"' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- --------------------------------------------------------------------------- -- 4. 组织架构设置存放在 yz_backend_normal_setting,按 backend_org_settings_{tid} 区分租户 -- 这里只保证该表存在,具体记录由后端首次保存设置时写入。 -- --------------------------------------------------------------------------- CREATE TABLE IF NOT EXISTS `yz_backend_normal_setting` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(128) NOT NULL DEFAULT '' COMMENT '配置名称', `value` text COMMENT '配置内容(JSON)', `code` varchar(64) NOT NULL DEFAULT '' COMMENT '配置标识', `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)', PRIMARY KEY (`id`) USING BTREE, KEY `idx_code` (`code`) USING BTREE, KEY `idx_delete_time` (`delete_time`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='管理端通用配置表';