修复快捷工具无法显示
This commit is contained in:
1 parent
9898962836
commit
2e2b837a20
23 files changed
+1941
-38
No files matched your search
@@ -0,0 +1,97 @@
|
||||
-- =============================================================
|
||||
-- OA 职级管理 —— 表结构
|
||||
--
|
||||
-- 对应代码:
|
||||
-- models/backend_job_rank.go 职级模型
|
||||
-- controllers/backend_job_rank.go 职级 CRUD 接口
|
||||
--
|
||||
-- 职级(Job Rank)用于定义「职位等级」:
|
||||
-- · 每个部门可以各设一套职级阶梯。department_id 指向
|
||||
-- yz_backend_organization.id;department_id = 0 表示
|
||||
-- 全公司通用职级,任何部门都能选用。
|
||||
-- · level_no 是等级序号(数字越大职级越高),用于排序与
|
||||
-- 「取不超过某职级的最高一级」这类计算。
|
||||
-- · salary_min / salary_max 是该职级的标准薪资区间,
|
||||
-- 薪酬方案选定职级后据此带出参考薪资。
|
||||
-- · default_role_id 是为「职级 → 角色权限绑定」预留的字段,
|
||||
-- 本期不启用,后端不做任何自动授权,等权限方案确定后单独做。
|
||||
--
|
||||
-- 使用链路:
|
||||
-- 员工(yz_backend_employee) → 职位(yz_backend_position.rank_id)
|
||||
-- → 职级(yz_backend_job_rank)
|
||||
-- 薪酬方案(yz_backend_oa_compensation_schemes.rank_id) → 职级
|
||||
--
|
||||
-- 执行顺序:
|
||||
-- 1) 本脚本:建表 + 给职位表 / 薪酬方案表补 rank_id 列
|
||||
-- 2) oa_job_rank_menus.sql:注册「OA → 基础设置 → 职级管理」菜单并授权角色
|
||||
-- =============================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ---------------- 职级表 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_job_rank` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
|
||||
`rank_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '职级编码,如 P5 / M2',
|
||||
`rank_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '职级名称,如 高级工程师',
|
||||
`level_no` INT NOT NULL DEFAULT 0 COMMENT '等级序号,数字越大职级越高',
|
||||
`department_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '适用部门ID(yz_backend_organization.id),0=全公司通用',
|
||||
`salary_min` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '标准薪资下限',
|
||||
`salary_max` DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '标准薪资上限,0=不限',
|
||||
`default_role_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '预留:默认角色ID(职级→角色权限绑定,本期不启用)',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0=禁用 1=启用',
|
||||
`sort` INT 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_deleted` (`tid`, `delete_time`) USING BTREE,
|
||||
KEY `idx_tid_department` (`tid`, `department_id`) USING BTREE,
|
||||
KEY `idx_tid_code` (`tid`, `rank_code`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='职级表';
|
||||
|
||||
-- =============================================================
|
||||
-- 给既有表补 rank_id 列
|
||||
-- MySQL 不支持 ADD COLUMN IF NOT EXISTS,先查 information_schema 再动态执行,
|
||||
-- 保证脚本可重复执行。
|
||||
-- =============================================================
|
||||
|
||||
-- ---------- yz_backend_position(职位挂职级) ----------
|
||||
SET @tbl := 'yz_backend_position';
|
||||
SET @col := 'rank_id';
|
||||
SET @exists := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = @col
|
||||
);
|
||||
SET @sql := IF(@exists = 0,
|
||||
CONCAT('ALTER TABLE `', @tbl, '` ADD COLUMN `', @col,
|
||||
'` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''职级ID(yz_backend_job_rank.id),0=未设置'' AFTER `position_type`'),
|
||||
CONCAT('ALTER TABLE `', @tbl, '` MODIFY COLUMN `', @col,
|
||||
'` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''职级ID(yz_backend_job_rank.id),0=未设置''')
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ---------- yz_backend_oa_compensation_schemes(薪酬方案带职级) ----------
|
||||
SET @tbl := 'yz_backend_oa_compensation_schemes';
|
||||
SET @col := 'rank_id';
|
||||
SET @exists := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = @col
|
||||
);
|
||||
SET @sql := IF(@exists = 0,
|
||||
CONCAT('ALTER TABLE `', @tbl, '` ADD COLUMN `', @col,
|
||||
'` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''职级ID(yz_backend_job_rank.id),0=未设置'' AFTER `employee_id`'),
|
||||
CONCAT('ALTER TABLE `', @tbl, '` MODIFY COLUMN `', @col,
|
||||
'` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ''职级ID(yz_backend_job_rank.id),0=未设置''')
|
||||
);
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ---------------- 校验 ----------------
|
||||
SHOW CREATE TABLE `yz_backend_job_rank`;
|
||||
|
||||
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND COLUMN_NAME = 'rank_id'
|
||||
AND TABLE_NAME IN ('yz_backend_position', 'yz_backend_oa_compensation_schemes');
|
||||
@@ -0,0 +1,67 @@
|
||||
-- =============================================================
|
||||
-- 修复:模块「展示端(platforms)」误配置导致菜单整块消失
|
||||
--
|
||||
-- 背景:
|
||||
-- yz_system_modules.platforms 是与 status/is_show、菜单 views、角色 rights
|
||||
-- 并列的第四个维度,决定模块/菜单出现在 Web 端还是移动端:
|
||||
-- ["web"] 仅 Web 端(租户管理后台 PC)
|
||||
-- ["app"] 仅移动端(APP / 微信小程序)
|
||||
-- ["web","app"] 两端都显示
|
||||
-- '' / NULL 全端显示(默认)
|
||||
--
|
||||
-- 菜单自身未配置 platforms 时,按 path 前缀继承所属模块的 platforms
|
||||
-- (services.MenuVisibleOn)。所以模块一旦配错,其下整棵菜单都会被
|
||||
-- 某一端整体剔除——而后台的「模块管理 / 菜单管理 / 角色管理」里
|
||||
-- 所有开关都是正常的,界面上完全看不出原因。
|
||||
--
|
||||
-- 事故原因:
|
||||
-- add_module_platforms.sql 里的「使用示例」第 1、2 条是演示语句,
|
||||
-- 却被原样执行到了正式库:
|
||||
-- 例1 UPDATE yz_system_modules SET platforms = JSON_ARRAY('web') WHERE code = 'crm';
|
||||
-- 例2 UPDATE yz_system_modules SET platforms = JSON_ARRAY('app') WHERE code = 'bianjiegongju';
|
||||
--
|
||||
-- 后果:
|
||||
-- 例2 → 租户后台(Web)左侧菜单里 /tools(便捷工具)整块消失:
|
||||
-- 记事本、日程提醒、账号管理全部不显示。
|
||||
-- 例1 → 移动端工作台没有「客户关系」模块卡片,/apps/crm 下 29 条菜单全部不显示。
|
||||
--
|
||||
-- 修复:两个模块都恢复为两端可见。
|
||||
-- 依据:
|
||||
-- · 便捷工具:backend/src/views/tools/ 有记事本/日程/密码库完整页面;
|
||||
-- uniapp/pages/toolbox/ 有 home/functions/mine/todo;
|
||||
-- 菜单 views 含 2;全部租户套餐都含 bianjiegongju。
|
||||
-- · 客户关系:backend/src/views/apps/crm/ 与 uniapp/pages/crm/ 均已完整实现;
|
||||
-- SUBSYSTEMS 已注册 crm;菜单 views 全为 2(租户端两端共用)。
|
||||
--
|
||||
-- 回滚:
|
||||
-- UPDATE yz_system_modules SET platforms = JSON_ARRAY('app')
|
||||
-- WHERE code = 'bianjiegongju';
|
||||
-- UPDATE yz_system_modules SET platforms = JSON_ARRAY('web')
|
||||
-- WHERE code = 'crm';
|
||||
-- =============================================================
|
||||
|
||||
-- ---------- 修复前先看一眼现状 ----------
|
||||
SELECT id, name, code, path, type, status, is_show, platforms
|
||||
FROM yz_system_modules
|
||||
WHERE code IN ('bianjiegongju', 'crm');
|
||||
|
||||
-- ---------- 恢复为两端可见 ----------
|
||||
UPDATE yz_system_modules
|
||||
SET platforms = JSON_ARRAY('web', 'app'),
|
||||
update_time = NOW()
|
||||
WHERE code IN ('bianjiegongju', 'crm')
|
||||
AND delete_time IS NULL;
|
||||
|
||||
-- ---------- 校验 ----------
|
||||
SELECT id, name, code, path, type, status, is_show, platforms
|
||||
FROM yz_system_modules
|
||||
WHERE code IN ('bianjiegongju', 'crm');
|
||||
|
||||
-- ---------- 顺带体检:其余模块不应残留单端配置 ----------
|
||||
-- 除本次修复的两个模块外,其余模块 platforms 应为 NULL(全端)。
|
||||
SELECT id, name, code, path, platforms
|
||||
FROM yz_system_modules
|
||||
WHERE delete_time IS NULL
|
||||
AND platforms IS NOT NULL
|
||||
AND platforms <> ''
|
||||
AND code NOT IN ('bianjiegongju', 'crm');
|
||||
@@ -0,0 +1,68 @@
|
||||
-- ============================================================
|
||||
-- OA 职级管理 —— 菜单配置(yz_system_menu)
|
||||
--
|
||||
-- 幂等脚本:按 path 判重,重复执行不会产生重复菜单
|
||||
-- 执行:mysql -h <host> -P <port> -u <user> -p <db> < oa_job_rank_menus.sql
|
||||
--
|
||||
-- 挂载位置:OA → 基础设置(目录,path = '/apps/oa/normalsetting')
|
||||
-- OA
|
||||
-- └─ 基础设置
|
||||
-- ├─ 组织架构 /basic-settings/organization
|
||||
-- ├─ 人员管理 /basic-settings/employee
|
||||
-- ├─ 职位管理 /basic-settings/position
|
||||
-- └─ 职级管理 /basic-settings/jobrank ← 本脚本新增
|
||||
--
|
||||
-- 对应页面:backend/src/views/basicSettings/jobRank/index.vue
|
||||
--
|
||||
-- 说明:
|
||||
-- 1. views = [2](租户端),与同级的组织架构/人员管理/职位管理保持一致;
|
||||
-- platforms 留空(= 全端),移动端可通过 webview 容器打开同一页面。
|
||||
-- 2. 租户端角色(cid=2)的 rights 是显式菜单 ID 列表,菜单接口会按
|
||||
-- rights 过滤。只插菜单不授权,会出现「目录可见但页面被过滤」,
|
||||
-- 因此本脚本同时把菜单 ID 追加到角色 rights。
|
||||
-- ============================================================
|
||||
|
||||
SET @basic_id := (
|
||||
SELECT id FROM yz_system_menu
|
||||
WHERE path = '/apps/oa/normalsetting' AND delete_time IS NULL
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
-- ---------- 职级管理(页面) ----------
|
||||
INSERT INTO yz_system_menu
|
||||
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
|
||||
SELECT @basic_id, '职级管理', '/basic-settings/jobrank', '/basicSettings/jobRank/index.vue',
|
||||
'Sort', 4, 1, 1, '[2]', NULL, 2, 'system',
|
||||
'按部门设置职位等级,供薪酬管理与权限分级使用'
|
||||
FROM DUAL
|
||||
WHERE @basic_id IS NOT NULL
|
||||
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/basic-settings/jobrank' AND delete_time IS NULL) x);
|
||||
|
||||
SET @jobrank_id := (
|
||||
SELECT id FROM yz_system_menu
|
||||
WHERE path = '/basic-settings/jobrank' AND delete_time IS NULL
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
-- ---------- 角色授权:把菜单追加到所有租户端角色的 rights ----------
|
||||
-- 只处理 rights 非空(显式授权)的角色;rights 为空表示全权限,无需追加。
|
||||
|
||||
UPDATE yz_system_admin_role
|
||||
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @jobrank_id) AS CHAR)
|
||||
WHERE cid = 2
|
||||
AND rights IS NOT NULL
|
||||
AND TRIM(rights) <> ''
|
||||
AND JSON_VALID(rights)
|
||||
AND @jobrank_id IS NOT NULL
|
||||
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@jobrank_id AS JSON));
|
||||
|
||||
-- ---------- 结果校验 ----------
|
||||
SELECT id, pid, title, path, component_path, views, platforms, type, sort
|
||||
FROM yz_system_menu
|
||||
WHERE delete_time IS NULL AND path = '/basic-settings/jobrank';
|
||||
|
||||
SELECT id, name, tenant_id,
|
||||
JSON_CONTAINS(CAST(rights AS JSON), CAST(@jobrank_id AS JSON)) AS has_jobrank
|
||||
FROM yz_system_admin_role
|
||||
WHERE cid = 2 AND rights IS NOT NULL AND TRIM(rights) <> ''
|
||||
ORDER BY tenant_id, id;
|
||||
Reference in new issue
Block a user