This commit is contained in:
2026-08-28 14:04:31 +08:00
54 changed files with 6272 additions and 4696 deletions
@@ -0,0 +1,193 @@
-- 组织架构模块:表名去掉 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='管理端通用配置表';
+96
View File
@@ -0,0 +1,96 @@
-- 组织架构菜单(租户端):进销存与办公自动化各自一套入口,指向共用页面组件。
--
-- 前置:yz_system_menu 中已存在 path 为 /apps/erp 与 /apps/oa 的模块目录菜单。
-- 若不存在,脚本会自动创建这两个目录菜单。
-- views 字段:[1] 平台端 / [2] 租户端 / [1,2] 双端。组织架构属于租户端,固定为 [2]。
-- type 字段:1-目录 2-页面。
--
-- 脚本可重复执行:按 path 判重,已存在的菜单会更新组件路径与标题。
-- ---------------------------------------------------------------------------
-- 1. 确保模块目录存在
-- ---------------------------------------------------------------------------
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT 0, '进销存', '/apps/erp', '', 'Goods', 30, 1, 1, '[2]', 1, '进销存模块'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/erp'
);
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT 0, '办公自动化', '/apps/oa', '', 'Document', 31, 1, 1, '[2]', 1, '办公自动化模块'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/oa'
);
SET @erp_pid := (SELECT `id` FROM `yz_system_menu` WHERE `path` = '/apps/erp' ORDER BY `id` LIMIT 1);
SET @oa_pid := (SELECT `id` FROM `yz_system_menu` WHERE `path` = '/apps/oa' ORDER BY `id` LIMIT 1);
-- ---------------------------------------------------------------------------
-- 2. 进销存:组织架构 / 员工管理 / 职位管理
-- ---------------------------------------------------------------------------
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @erp_pid, '组织架构', '/apps/erp/organization', '/apps/erp/organization/index.vue', 'OfficeBuilding', 1, 1, 1, '[2]', 2, '与OA共用组织数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/erp/organization'
);
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @erp_pid, '员工管理', '/apps/erp/employee', '/apps/erp/employee/index.vue', 'User', 2, 1, 1, '[2]', 2, '与OA共用员工数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/erp/employee'
);
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @erp_pid, '职位管理', '/apps/erp/position', '/apps/erp/position/index.vue', 'Postcard', 3, 1, 1, '[2]', 2, '与OA共用职位数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/erp/position'
);
-- ---------------------------------------------------------------------------
-- 3. 办公自动化:组织架构 / 人员管理 / 职位管理
-- ---------------------------------------------------------------------------
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @oa_pid, '组织架构', '/apps/oa/organization', '/apps/oa/organization/index.vue', 'OfficeBuilding', 1, 1, 1, '[2]', 2, '与进销存共用组织数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/oa/organization'
);
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @oa_pid, '人员管理', '/apps/oa/employee', '/apps/oa/employee/index.vue', 'User', 2, 1, 1, '[2]', 2, '与进销存共用员工数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/oa/employee'
);
INSERT INTO `yz_system_menu` (`pid`, `title`, `path`, `component_path`, `icon`, `sort`, `status`, `is_visible`, `views`, `type`, `remark`)
SELECT @oa_pid, '职位管理', '/apps/oa/position', '/apps/oa/position/index.vue', 'Postcard', 3, 1, 1, '[2]', 2, '与进销存共用职位数据'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM (SELECT * FROM `yz_system_menu`) AS t WHERE t.`path` = '/apps/oa/position'
);
-- ---------------------------------------------------------------------------
-- 4. 修正已有菜单的组件路径(历史数据可能指向旧组件)
-- ---------------------------------------------------------------------------
UPDATE `yz_system_menu` SET `component_path` = '/apps/erp/organization/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/erp/organization';
UPDATE `yz_system_menu` SET `component_path` = '/apps/erp/employee/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/erp/employee';
UPDATE `yz_system_menu` SET `component_path` = '/apps/erp/position/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/erp/position';
UPDATE `yz_system_menu` SET `component_path` = '/apps/oa/organization/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/oa/organization';
UPDATE `yz_system_menu` SET `component_path` = '/apps/oa/employee/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/oa/employee';
UPDATE `yz_system_menu` SET `component_path` = '/apps/oa/position/index.vue', `type` = 2, `views` = '[2]'
WHERE `path` = '/apps/oa/position';