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