2026-10-11-mobile-menu-market-oa-dirs.sql 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. -- =============================================================================
  2. -- 移动端菜单重组:市场部 / OA工作流两大目录
  3. --
  4. -- 目标结构:
  5. -- 移动端菜单
  6. -- ├─ 市场部
  7. -- │ ├─ 预签约订单(专员)…运费信息(专员)
  8. -- │ └─ 预签约订单(经理)…运费信息(经理)
  9. -- └─ OA工作流
  10. -- └─ 发起审批…开启微信通知
  11. --
  12. -- 说明:
  13. -- 1. 复用原「市场专员」目录 id,改名为「市场部」;原「地区经理」目录软删。
  14. -- 2. 叶子 id / path / perms 不变,仅调整 parent_id、menu_name、order_num。
  15. -- 3. 已授权 OA 叶子的角色自动补授「OA工作流」目录(幂等)。
  16. -- 4. MySQL 5.7 可执行。
  17. -- =============================================================================
  18. -- 1) 「市场专员」→「市场部」
  19. UPDATE sys_menu market_dir
  20. INNER JOIN sys_menu root
  21. ON root.id = market_dir.parent_id
  22. AND root.parent_id = '0'
  23. AND root.menu_name = '移动端菜单'
  24. AND root.del_flag = 0
  25. SET
  26. market_dir.menu_name = '市场部',
  27. market_dir.order_num = 10,
  28. market_dir.remark = '小程序:市场部菜单目录',
  29. market_dir.update_time = NOW()
  30. WHERE market_dir.menu_type = 'M'
  31. AND market_dir.path = ''
  32. AND market_dir.del_flag = 0
  33. AND market_dir.menu_name IN ('市场专员', '市场部');
  34. -- 2) 新建「OA工作流」目录(每个租户移动端根下一条)
  35. INSERT INTO sys_menu (
  36. id, menu_name, parent_id, menu_type, path, component, perms,
  37. is_frame, visible, status, tenant_no, order_num, remark,
  38. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  39. )
  40. SELECT
  41. MD5(CONCAT(
  42. 'mobile-oa-directory|', root.tenant_no, '|', root.id, '|M||OA工作流'
  43. )),
  44. 'OA工作流',
  45. root.id,
  46. 'M',
  47. '',
  48. NULL,
  49. NULL,
  50. 1,
  51. '1',
  52. '1',
  53. root.tenant_no,
  54. 20,
  55. '小程序:OA工作流菜单目录',
  56. NULL,
  57. '',
  58. NOW(),
  59. NULL,
  60. NOW(),
  61. 0
  62. FROM sys_menu root
  63. WHERE root.parent_id = '0'
  64. AND root.menu_name = '移动端菜单'
  65. AND root.del_flag = 0
  66. AND NOT EXISTS (
  67. SELECT 1
  68. FROM sys_menu existing
  69. WHERE existing.tenant_no = root.tenant_no
  70. AND existing.parent_id = root.id
  71. AND existing.menu_name = 'OA工作流'
  72. AND existing.menu_type = 'M'
  73. AND existing.path = ''
  74. AND existing.del_flag = 0
  75. )
  76. ON DUPLICATE KEY UPDATE
  77. tenant_no = VALUES(tenant_no),
  78. parent_id = VALUES(parent_id),
  79. menu_name = VALUES(menu_name),
  80. menu_type = VALUES(menu_type),
  81. path = VALUES(path),
  82. order_num = VALUES(order_num),
  83. remark = VALUES(remark),
  84. update_time = VALUES(update_time),
  85. del_flag = VALUES(del_flag);
  86. -- 3) 市场叶子:挂到「市场部」,名称加(专员)/(经理),调整排序
  87. UPDATE sys_menu leaf
  88. INNER JOIN sys_menu root
  89. ON root.parent_id = '0'
  90. AND root.menu_name = '移动端菜单'
  91. AND root.del_flag = 0
  92. AND root.tenant_no = leaf.tenant_no
  93. INNER JOIN sys_menu market_dir
  94. ON market_dir.tenant_no = root.tenant_no
  95. AND market_dir.parent_id = root.id
  96. AND market_dir.menu_name = '市场部'
  97. AND market_dir.menu_type = 'M'
  98. AND market_dir.path = ''
  99. AND market_dir.del_flag = 0
  100. INNER JOIN (
  101. SELECT 'mini:market:specialist:presign' AS perms, '预签约订单(专员)' AS menu_name, 10 AS order_num
  102. UNION ALL SELECT 'mini:market:specialist:protocol', '协议单(专员)', 20
  103. UNION ALL SELECT 'mini:market:specialist:payment-chase', '催缴信息(专员)', 30
  104. UNION ALL SELECT 'mini:market:specialist:payment', '缴费信息(专员)', 40
  105. UNION ALL SELECT 'mini:market:specialist:freight', '运费信息(专员)', 50
  106. UNION ALL SELECT 'mini:market:manager:presign', '预签约订单(经理)', 60
  107. UNION ALL SELECT 'mini:market:manager:protocol', '协议单(经理)', 70
  108. UNION ALL SELECT 'mini:market:manager:payment-chase', '催缴信息(经理)', 80
  109. UNION ALL SELECT 'mini:market:manager:payment', '缴费信息(经理)', 90
  110. UNION ALL SELECT 'mini:market:manager:freight', '运费信息(经理)', 100
  111. ) map ON map.perms = leaf.perms
  112. SET
  113. leaf.parent_id = market_dir.id,
  114. leaf.menu_name = map.menu_name,
  115. leaf.order_num = map.order_num,
  116. leaf.remark = CONCAT('小程序市场现场:', map.menu_name),
  117. leaf.update_time = NOW()
  118. WHERE leaf.menu_type = 'C'
  119. AND leaf.del_flag = 0
  120. AND leaf.perms LIKE 'mini:market:%';
  121. -- 4) OA 叶子:挂到「OA工作流」
  122. UPDATE sys_menu leaf
  123. INNER JOIN sys_menu root
  124. ON root.parent_id = '0'
  125. AND root.menu_name = '移动端菜单'
  126. AND root.del_flag = 0
  127. AND root.tenant_no = leaf.tenant_no
  128. INNER JOIN sys_menu oa_dir
  129. ON oa_dir.tenant_no = root.tenant_no
  130. AND oa_dir.parent_id = root.id
  131. AND oa_dir.menu_name = 'OA工作流'
  132. AND oa_dir.menu_type = 'M'
  133. AND oa_dir.path = ''
  134. AND oa_dir.del_flag = 0
  135. SET
  136. leaf.parent_id = oa_dir.id,
  137. leaf.update_time = NOW()
  138. WHERE leaf.del_flag = 0
  139. AND leaf.menu_type = 'C'
  140. AND (
  141. leaf.perms IN (
  142. 'mini:oa:start',
  143. 'mini:oa:drafts',
  144. 'mini:oa:pending',
  145. 'mini:oa:done',
  146. 'mini:oa:mine',
  147. 'mini:oa:cc',
  148. 'oa:mention',
  149. 'mini:oa:wechat-notify'
  150. )
  151. OR leaf.path IN (
  152. '/pages/oa/start/index',
  153. '/pages/oa/drafts/index',
  154. '/pages/oa/pending/index',
  155. '/pages/oa/done/index',
  156. '/pages/oa/mine/index',
  157. '/pages/oa/cc/index',
  158. '/pages/oa/mentions/index',
  159. '/pages/oa/wechat-notify/index'
  160. )
  161. );
  162. -- 5) 软删「地区经理」目录(步骤 3 已把子节点迁到市场部;避免同表子查询触发 1093)
  163. UPDATE sys_menu manager_dir
  164. INNER JOIN sys_menu root
  165. ON root.id = manager_dir.parent_id
  166. AND root.parent_id = '0'
  167. AND root.menu_name = '移动端菜单'
  168. AND root.del_flag = 0
  169. SET
  170. manager_dir.del_flag = 1,
  171. manager_dir.update_time = NOW(),
  172. manager_dir.remark = '已重组至市场部,软删'
  173. WHERE manager_dir.menu_type = 'M'
  174. AND manager_dir.path = ''
  175. AND manager_dir.menu_name = '地区经理'
  176. AND manager_dir.del_flag = 0;
  177. -- 6) 已有 OA 叶子授权的角色补授「OA工作流」目录
  178. INSERT INTO sys_role_menu (
  179. id, role_id, menu_id, tenant_no, order_num, remark,
  180. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  181. )
  182. SELECT
  183. MD5(CONCAT(r.id, '|', oa_dir.id)),
  184. r.id,
  185. oa_dir.id,
  186. IFNULL(NULLIF(r.tenant_no, ''), oa_dir.tenant_no),
  187. 0,
  188. 'grant OA工作流 directory to roles with OA leaf menus',
  189. NULL,
  190. '',
  191. NOW(),
  192. NULL,
  193. NOW(),
  194. 0
  195. FROM sys_role r
  196. INNER JOIN sys_role_menu rm
  197. ON rm.role_id = r.id
  198. AND rm.del_flag = 0
  199. INNER JOIN sys_menu leaf
  200. ON leaf.id = rm.menu_id
  201. AND leaf.del_flag = 0
  202. AND leaf.menu_type = 'C'
  203. AND (
  204. leaf.perms IN (
  205. 'mini:oa:start',
  206. 'mini:oa:drafts',
  207. 'mini:oa:pending',
  208. 'mini:oa:done',
  209. 'mini:oa:mine',
  210. 'mini:oa:cc',
  211. 'oa:mention',
  212. 'mini:oa:wechat-notify'
  213. )
  214. OR leaf.path LIKE '/pages/oa/%'
  215. )
  216. INNER JOIN sys_menu oa_dir
  217. ON oa_dir.id = leaf.parent_id
  218. AND oa_dir.menu_name = 'OA工作流'
  219. AND oa_dir.menu_type = 'M'
  220. AND oa_dir.del_flag = 0
  221. WHERE r.del_flag = 0
  222. AND NOT EXISTS (
  223. SELECT 1
  224. FROM sys_role_menu x
  225. WHERE x.del_flag = 0
  226. AND x.role_id = r.id
  227. AND x.menu_id = oa_dir.id
  228. )
  229. GROUP BY r.id, oa_dir.id, r.tenant_no, oa_dir.tenant_no;