|
|
@@ -0,0 +1,123 @@
|
|
|
+-- =====================================================================================
|
|
|
+-- 去掉最外层部门 HITCH,将「日立能源」提升为顶层部门
|
|
|
+-- 涉及表:t_sys_dept / t_sys_dept_relation / t_sb_info / t_sys_dept_manager
|
|
|
+-- 使用说明:
|
|
|
+-- 1. 先执行「一、预检查」,确认结果符合预期(HITCH 下只有日立能源一个子部门、无用户直挂 HITCH);
|
|
|
+-- 2. 再按顺序执行「二、变量准备」「三、结构修改」「四、修改后验证」;
|
|
|
+-- 3. 建议在业务低峰期执行,并先备份 t_sys_dept、t_sys_dept_relation、t_sb_info 三张表。
|
|
|
+-- =====================================================================================
|
|
|
+
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 一、预检查(只读)
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 1.1 确认 HITCH 与日立能源的 id / 编码 / 性质 / 层级
|
|
|
+SELECT dept_id, name, dept_code, nature, rank, parent_id, del_flag
|
|
|
+FROM t_sys_dept
|
|
|
+WHERE name IN ('HITCH', '日立能源');
|
|
|
+
|
|
|
+-- 1.2 HITCH 的子部门列表(预期:只有日立能源一条)
|
|
|
+SELECT dept_id, name, dept_code
|
|
|
+FROM t_sys_dept
|
|
|
+WHERE parent_id = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
|
|
|
+ AND del_flag = 0;
|
|
|
+
|
|
|
+-- 1.3 是否有用户直接挂在 HITCH 下(预期:0;若大于 0 需先在界面把用户调到其他部门)
|
|
|
+SELECT COUNT(*) AS user_cnt_on_hitch
|
|
|
+FROM t_sys_user_dept
|
|
|
+WHERE dept_id = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0);
|
|
|
+
|
|
|
+-- 1.4 是否有设备记录引用 HITCH(脚本第三步会统一改挂到日立能源,此处仅确认影响行数)
|
|
|
+SELECT COUNT(*) AS sb_ref_cnt
|
|
|
+FROM t_sb_info
|
|
|
+WHERE use_area = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
|
|
|
+ OR use_company = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
|
|
|
+ OR use_project = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
|
|
|
+ OR use_group = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
|
|
|
+ OR use_dept = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0);
|
|
|
+
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 二、变量准备
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+SELECT dept_id INTO @hitch FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0 LIMIT 1;
|
|
|
+SELECT dept_id INTO @rl FROM t_sys_dept WHERE name = '日立能源' AND del_flag = 0 AND parent_id = @hitch LIMIT 1;
|
|
|
+SELECT dept_code INTO @old_code FROM t_sys_dept WHERE dept_id = @rl;
|
|
|
+
|
|
|
+-- 校验:日立能源子树内所有部门编码都必须以旧编码为前缀(预期:0;大于 0 说明历史编码脏,先人工处理)
|
|
|
+SELECT COUNT(*) AS bad_prefix_cnt
|
|
|
+FROM t_sys_dept d
|
|
|
+JOIN t_sys_dept_relation r ON r.descendant = d.dept_id
|
|
|
+WHERE r.ancestor = @rl
|
|
|
+ AND d.dept_code NOT LIKE CONCAT(@old_code, '%');
|
|
|
+
|
|
|
+-- 模仿后端 SysDeptServiceImpl.getCode 的规则,计算日立能源升顶后的新顶层编码(顶层最大编码末三位 +1)
|
|
|
+SELECT dept_code INTO @max_root FROM t_sys_dept WHERE parent_id = '0' ORDER BY dept_code DESC LIMIT 1;
|
|
|
+SET @new_code = IF(@max_root IS NULL, '001',
|
|
|
+ CONCAT(LEFT(@max_root, CHAR_LENGTH(@max_root) - 3),
|
|
|
+ LPAD(SUBSTRING(@max_root, -3) + 1, 3, '0')));
|
|
|
+SELECT @hitch AS hitch_id, @rl AS rili_id, @old_code AS old_code, @new_code AS new_code;
|
|
|
+
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 三、结构修改(建议整体作为一个事务执行)
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+START TRANSACTION;
|
|
|
+
|
|
|
+-- 3.1 重写日立能源整棵子树(含自身)的 dept_code:旧前缀替换为新前缀
|
|
|
+-- (dept_code 被设备/用户等查询以 like '编码%' 的方式做子树过滤,前缀链必须保持一致)
|
|
|
+UPDATE t_sys_dept
|
|
|
+SET dept_code = CONCAT(@new_code, SUBSTRING(dept_code, CHAR_LENGTH(@old_code) + 1)),
|
|
|
+ update_time = NOW()
|
|
|
+WHERE dept_id IN (SELECT descendant FROM t_sys_dept_relation WHERE ancestor = @rl);
|
|
|
+
|
|
|
+-- 3.2 日立能源升为顶层
|
|
|
+UPDATE t_sys_dept
|
|
|
+SET parent_id = '0', parent_name = NULL, rank = 1, update_time = NOW()
|
|
|
+WHERE dept_id = @rl;
|
|
|
+
|
|
|
+-- 3.3 子树其余部门层级整体上移一级(rank 值减 1)
|
|
|
+UPDATE t_sys_dept d
|
|
|
+JOIN t_sys_dept_relation r ON r.descendant = d.dept_id AND r.ancestor = @rl AND r.descendant <> @rl
|
|
|
+SET d.rank = d.rank - 1;
|
|
|
+
|
|
|
+-- 3.4 闭包表摘除 HITCH(含 HITCH 自关联行及其到所有后代的行),子树内部关系保留
|
|
|
+DELETE FROM t_sys_dept_relation WHERE ancestor = @hitch;
|
|
|
+
|
|
|
+-- 3.5 原引用 HITCH 的设备记录改挂到日立能源
|
|
|
+UPDATE t_sb_info
|
|
|
+SET use_area = IF(use_area = @hitch, @rl, use_area),
|
|
|
+ use_company = IF(use_company = @hitch, @rl, use_company),
|
|
|
+ use_project = IF(use_project = @hitch, @rl, use_project),
|
|
|
+ use_group = IF(use_group = @hitch, @rl, use_group),
|
|
|
+ use_dept = IF(use_dept = @hitch, @rl, use_dept)
|
|
|
+WHERE @hitch IN (use_area, use_company, use_project, use_group, use_dept);
|
|
|
+
|
|
|
+-- 3.6 清理 HITCH 的部门负责人关系,并逻辑删除 HITCH
|
|
|
+DELETE FROM t_sys_dept_manager WHERE dept_id = @hitch;
|
|
|
+UPDATE t_sys_dept SET del_flag = 1, update_time = NOW() WHERE dept_id = @hitch;
|
|
|
+
|
|
|
+COMMIT;
|
|
|
+
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 四、修改后验证(只读)
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 4.1 顶层部门列表(HITCH 应消失,日立能源应在列)
|
|
|
+SELECT dept_id, name, dept_code, nature, rank FROM t_sys_dept WHERE parent_id = '0' AND del_flag = 0;
|
|
|
+
|
|
|
+-- 4.2 日立能源子树编码/层级应连续(编码以新前缀开头,rank 从 1 递增)
|
|
|
+SELECT d.dept_id, d.name, d.dept_code, d.rank, d.parent_id
|
|
|
+FROM t_sys_dept d
|
|
|
+JOIN t_sys_dept_relation r ON r.descendant = d.dept_id
|
|
|
+WHERE r.ancestor = @rl
|
|
|
+ORDER BY d.dept_code;
|
|
|
+
|
|
|
+-- 4.3 闭包表中不应再存在 HITCH 的任何关系行(预期:0)
|
|
|
+SELECT COUNT(*) AS hitch_relation_cnt FROM t_sys_dept_relation WHERE ancestor = @hitch OR descendant = @hitch;
|
|
|
+
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 五、可选:部门性质继承(按需人工判断后执行)
|
|
|
+-- -------------------------------------------------------------------------------------
|
|
|
+-- 部门层级追溯(projectId/companyId、调拨范围等)是按 nature 向上找的。
|
|
|
+-- HITCH 被移除后,若它的 nature(如 JITUAN/FEN_GONG_SI)在链上再无其他部门承担,
|
|
|
+-- 相关追溯会查不到。如确认需要,可让日立能源继承 HITCH 的性质
|
|
|
+-- (前提:日立能源自身的 nature 不再需要保留,执行前先核对 1.1 的结果):
|
|
|
+-- UPDATE t_sys_dept SET nature = (SELECT t.nature FROM (SELECT nature FROM t_sys_dept WHERE dept_id = @hitch) t)
|
|
|
+-- WHERE dept_id = @rl;
|