-- ===================================================================================== -- 去掉最外层部门 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;