去掉顶层部门HITCH.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. -- =====================================================================================
  2. -- 去掉最外层部门 HITCH,将「日立能源」提升为顶层部门
  3. -- 涉及表:t_sys_dept / t_sys_dept_relation / t_sb_info / t_sys_dept_manager
  4. -- 使用说明:
  5. -- 1. 先执行「一、预检查」,确认结果符合预期(HITCH 下只有日立能源一个子部门、无用户直挂 HITCH);
  6. -- 2. 再按顺序执行「二、变量准备」「三、结构修改」「四、修改后验证」;
  7. -- 3. 建议在业务低峰期执行,并先备份 t_sys_dept、t_sys_dept_relation、t_sb_info 三张表。
  8. -- =====================================================================================
  9. -- -------------------------------------------------------------------------------------
  10. -- 一、预检查(只读)
  11. -- -------------------------------------------------------------------------------------
  12. -- 1.1 确认 HITCH 与日立能源的 id / 编码 / 性质 / 层级
  13. SELECT dept_id, name, dept_code, nature, rank, parent_id, del_flag
  14. FROM t_sys_dept
  15. WHERE name IN ('HITCH', '日立能源');
  16. -- 1.2 HITCH 的子部门列表(预期:只有日立能源一条)
  17. SELECT dept_id, name, dept_code
  18. FROM t_sys_dept
  19. WHERE parent_id = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
  20. AND del_flag = 0;
  21. -- 1.3 是否有用户直接挂在 HITCH 下(预期:0;若大于 0 需先在界面把用户调到其他部门)
  22. SELECT COUNT(*) AS user_cnt_on_hitch
  23. FROM t_sys_user_dept
  24. WHERE dept_id = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0);
  25. -- 1.4 是否有设备记录引用 HITCH(脚本第三步会统一改挂到日立能源,此处仅确认影响行数)
  26. SELECT COUNT(*) AS sb_ref_cnt
  27. FROM t_sb_info
  28. WHERE use_area = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
  29. OR use_company = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
  30. OR use_project = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
  31. OR use_group = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0)
  32. OR use_dept = (SELECT dept_id FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0);
  33. -- -------------------------------------------------------------------------------------
  34. -- 二、变量准备
  35. -- -------------------------------------------------------------------------------------
  36. SELECT dept_id INTO @hitch FROM t_sys_dept WHERE name = 'HITCH' AND del_flag = 0 LIMIT 1;
  37. SELECT dept_id INTO @rl FROM t_sys_dept WHERE name = '日立能源' AND del_flag = 0 AND parent_id = @hitch LIMIT 1;
  38. SELECT dept_code INTO @old_code FROM t_sys_dept WHERE dept_id = @rl;
  39. -- 校验:日立能源子树内所有部门编码都必须以旧编码为前缀(预期:0;大于 0 说明历史编码脏,先人工处理)
  40. SELECT COUNT(*) AS bad_prefix_cnt
  41. FROM t_sys_dept d
  42. JOIN t_sys_dept_relation r ON r.descendant = d.dept_id
  43. WHERE r.ancestor = @rl
  44. AND d.dept_code NOT LIKE CONCAT(@old_code, '%');
  45. -- 模仿后端 SysDeptServiceImpl.getCode 的规则,计算日立能源升顶后的新顶层编码(顶层最大编码末三位 +1)
  46. SELECT dept_code INTO @max_root FROM t_sys_dept WHERE parent_id = '0' ORDER BY dept_code DESC LIMIT 1;
  47. SET @new_code = IF(@max_root IS NULL, '001',
  48. CONCAT(LEFT(@max_root, CHAR_LENGTH(@max_root) - 3),
  49. LPAD(SUBSTRING(@max_root, -3) + 1, 3, '0')));
  50. SELECT @hitch AS hitch_id, @rl AS rili_id, @old_code AS old_code, @new_code AS new_code;
  51. -- -------------------------------------------------------------------------------------
  52. -- 三、结构修改(建议整体作为一个事务执行)
  53. -- -------------------------------------------------------------------------------------
  54. START TRANSACTION;
  55. -- 3.1 重写日立能源整棵子树(含自身)的 dept_code:旧前缀替换为新前缀
  56. -- (dept_code 被设备/用户等查询以 like '编码%' 的方式做子树过滤,前缀链必须保持一致)
  57. UPDATE t_sys_dept
  58. SET dept_code = CONCAT(@new_code, SUBSTRING(dept_code, CHAR_LENGTH(@old_code) + 1)),
  59. update_time = NOW()
  60. WHERE dept_id IN (SELECT descendant FROM t_sys_dept_relation WHERE ancestor = @rl);
  61. -- 3.2 日立能源升为顶层
  62. UPDATE t_sys_dept
  63. SET parent_id = '0', parent_name = NULL, rank = 1, update_time = NOW()
  64. WHERE dept_id = @rl;
  65. -- 3.3 子树其余部门层级整体上移一级(rank 值减 1)
  66. UPDATE t_sys_dept d
  67. JOIN t_sys_dept_relation r ON r.descendant = d.dept_id AND r.ancestor = @rl AND r.descendant <> @rl
  68. SET d.rank = d.rank - 1;
  69. -- 3.4 闭包表摘除 HITCH(含 HITCH 自关联行及其到所有后代的行),子树内部关系保留
  70. DELETE FROM t_sys_dept_relation WHERE ancestor = @hitch;
  71. -- 3.5 原引用 HITCH 的设备记录改挂到日立能源
  72. UPDATE t_sb_info
  73. SET use_area = IF(use_area = @hitch, @rl, use_area),
  74. use_company = IF(use_company = @hitch, @rl, use_company),
  75. use_project = IF(use_project = @hitch, @rl, use_project),
  76. use_group = IF(use_group = @hitch, @rl, use_group),
  77. use_dept = IF(use_dept = @hitch, @rl, use_dept)
  78. WHERE @hitch IN (use_area, use_company, use_project, use_group, use_dept);
  79. -- 3.6 清理 HITCH 的部门负责人关系,并逻辑删除 HITCH
  80. DELETE FROM t_sys_dept_manager WHERE dept_id = @hitch;
  81. UPDATE t_sys_dept SET del_flag = 1, update_time = NOW() WHERE dept_id = @hitch;
  82. COMMIT;
  83. -- -------------------------------------------------------------------------------------
  84. -- 四、修改后验证(只读)
  85. -- -------------------------------------------------------------------------------------
  86. -- 4.1 顶层部门列表(HITCH 应消失,日立能源应在列)
  87. SELECT dept_id, name, dept_code, nature, rank FROM t_sys_dept WHERE parent_id = '0' AND del_flag = 0;
  88. -- 4.2 日立能源子树编码/层级应连续(编码以新前缀开头,rank 从 1 递增)
  89. SELECT d.dept_id, d.name, d.dept_code, d.rank, d.parent_id
  90. FROM t_sys_dept d
  91. JOIN t_sys_dept_relation r ON r.descendant = d.dept_id
  92. WHERE r.ancestor = @rl
  93. ORDER BY d.dept_code;
  94. -- 4.3 闭包表中不应再存在 HITCH 的任何关系行(预期:0)
  95. SELECT COUNT(*) AS hitch_relation_cnt FROM t_sys_dept_relation WHERE ancestor = @hitch OR descendant = @hitch;
  96. -- -------------------------------------------------------------------------------------
  97. -- 五、可选:部门性质继承(按需人工判断后执行)
  98. -- -------------------------------------------------------------------------------------
  99. -- 部门层级追溯(projectId/companyId、调拨范围等)是按 nature 向上找的。
  100. -- HITCH 被移除后,若它的 nature(如 JITUAN/FEN_GONG_SI)在链上再无其他部门承担,
  101. -- 相关追溯会查不到。如确认需要,可让日立能源继承 HITCH 的性质
  102. -- (前提:日立能源自身的 nature 不再需要保留,执行前先核对 1.1 的结果):
  103. -- UPDATE t_sys_dept SET nature = (SELECT t.nature FROM (SELECT nature FROM t_sys_dept WHERE dept_id = @hitch) t)
  104. -- WHERE dept_id = @rl;