From e235b3b7f5a7db97fa8a71dc4a638d918af22c0e Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 17 九月 2026 13:33:18 +0800
Subject: [PATCH] feat(sql): 迁移脚本补齐审批配置地基 + 采购计划/订单变更,并加订单审批测试

---
 sql/mysql/xgdl_review_audit_pending_changes.sql |  271 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 252 insertions(+), 19 deletions(-)

diff --git a/sql/mysql/xgdl_review_audit_pending_changes.sql b/sql/mysql/xgdl_review_audit_pending_changes.sql
index 38e98c2..5631353 100644
--- a/sql/mysql/xgdl_review_audit_pending_changes.sql
+++ b/sql/mysql/xgdl_review_audit_pending_changes.sql
@@ -3,9 +3,21 @@
 -- 鐩爣搴擄細mom-xgdl
 -- 璇存槑锛氭湰鑴氭湰骞傜瓑锛屽彲閲嶅鎵ц锛涘凡瀛樺湪鐨勫瓧娈�/鑿滃崟浼氳嚜鍔ㄨ烦杩囥��
 --       寮�鍙戝簱锛�192.168.197.128锛夊凡鍏ㄩ儴鎵ц杩囷紝鏈剼鏈敤浜庡悜鍏跺畠鐜锛堝娴嬭瘯/鐢熶骇锛夊悓姝ャ��
+-- 鍐呭缁撴瀯锛�
+--   绗竴閮ㄥ垎  20 寮犲崟鎹〃鐨勫鏍镐汉鍥涘瓧娈�
+--   绗簩閮ㄥ垎  涓婅堪鍗曟嵁鐨勩�屽鏍搞�嶆寜閽潈闄愶紙system_menu type=3锛�
+--   绗笁閮ㄥ垎  鐢靛姏浣滀笟璁″垝鐢熸垚宸ュ崟缂栫爜瑙勫垯璇存槑锛堟棤闇�鎵ц锛�
+--   绗洓閮ㄥ垎  閫氱敤瀹℃壒閰嶇疆琛� + 26 涓笟鍔$被鍨� + 瀹℃壒閰嶇疆椤佃彍鍗�
+--             + 閲囪喘璁″垝/閲囪喘璁㈠崟瀹℃牳瀛楁涓庢寜閽� + 瑙掕壊鎺堟潈
+--
+-- 鎵ц鍓嶇疆瑕佹眰锛氬繀椤荤敤鏀寔 DELIMITER 涓庡瓨鍌ㄨ繃绋嬬殑瀹㈡埛绔暣浣撴墽琛�
+--   锛坢ysql CLI锛歮ysql -h<host> -P<port> -u<user> -p mom-xgdl < 鏈枃浠讹級銆�
+--   澶氭暟鍥惧舰鍖�/鍦ㄧ嚎 SQL 鎺у埗鍙版寜鍒嗗彿鎷嗗垎璇彞锛屼細鎶� DELIMITER $$ 娈佃惤鎷嗗潖銆�
+--
 -- 瀵瑰簲浠g爜鎻愪氦锛�
 --   refactor(crm/erp/hrm/mes): 鍗曟嵁瀹℃牳鏀逛负瀹℃壒閰嶇疆鐘舵�佹満
 --   fix(mes): 鐢靛姏浣滀笟璁″垝鐢熸垚宸ュ崟琛ュ厖缂栫爜瑙勫垯鍙栧彿
+--   e347fd6e refactor(approval): 閲囪喘璁″垝/閲囪喘璁㈠崟瀹℃壒鐢� BPM 鏀逛负杞婚噺绾х姸鎬佹満
 -- ============================================================================
 
 SET NAMES utf8mb4;
@@ -154,115 +166,115 @@
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '閿�鎴风敵璇峰鏍�' AS name, 'crm:cancellation:audit' AS perm, 'crm:cancellation:update' AS anchor) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'crm:cancellation:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:cancellation:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:cancellation:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鍚堝悓瀹℃牳' AS name, 'crm:contract:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'crm:contract:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:contract:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:contract:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鍙戠エ瀹℃牳' AS name, 'crm:invoice:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'crm:invoice:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:invoice:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:invoice:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '閫�璐瑰崟瀹℃牳' AS name, 'crm:refund:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'crm:refund:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:refund:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'crm:refund:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '浠樻鍗曞鏍�' AS name, 'erp:finance-payment:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'erp:finance-payment:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:finance-payment:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:finance-payment:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '閲囪喘鐢宠瀹℃牳' AS name, 'erp:purchase-request:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'erp:purchase-request:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:purchase-request:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:purchase-request:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '璇峰亣鐢宠瀹℃牳' AS name, 'hrm:leave:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:leave:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:leave:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:leave:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '杞鐢宠瀹℃牳' AS name, 'hrm:regularize:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:regularize:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:regularize:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:regularize:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '绂昏亴鐢宠瀹℃牳' AS name, 'hrm:resignation:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:resignation:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:resignation:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:resignation:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '璋冨姩鐢宠瀹℃牳' AS name, 'hrm:transfer:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:transfer:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:transfer:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:transfer:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鑰冨嫟寮傚父瀹℃牳' AS name, 'hrm:attendance-exception:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:attendance-exception:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:attendance-exception:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:attendance-exception:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '椤圭洰瀹℃牳' AS name, 'mes:pd-project:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:pd-project:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:pd-project:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:pd-project:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鎶�鏈‘璁ゅ嚱瀹℃牳' AS name, 'mes:pd-tech-confirm:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:pd-tech-confirm:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:pd-tech-confirm:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:pd-tech-confirm:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '閲囪喘鍏ュ簱鍗曞鏍�' AS name, 'mes:wm-item-receipt:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm-item-receipt:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-item-receipt:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-item-receipt:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鏉傞」鍑哄簱鍗曞鏍�' AS name, 'mes:wm-misc-issue:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm-misc-issue:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-misc-issue:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-misc-issue:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '閲囪喘閫�璐у崟瀹℃牳' AS name, 'mes:wm-return-vendor:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm-return-vendor:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-return-vendor:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-return-vendor:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鐩樼偣浠诲姟瀹℃牳' AS name, 'mes:wm-stock-taking-task:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm-stock-taking-task:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-stock-taking-task:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm-stock-taking-task:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '璁惧鍏ュ簱鍗曞鏍�' AS name, 'mes:wm:equipment-receipt:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm:equipment-receipt:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm:equipment-receipt:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm:equipment-receipt:audit') m);
 
 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
 SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
 FROM (SELECT '鏉傞」鍏ュ簱鍗曞鏍�' AS name, 'mes:wm:misc-receipt:audit' AS perm) t
 JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:wm:misc-receipt:update') a ON 1 = 1
-WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm:misc-receipt:audit') m);
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:wm:misc-receipt:audit') m);
 
 -- ============================================================================
 -- 绗笁閮ㄥ垎锛氱數鍔涗綔涓氳鍒掔敓鎴愬伐鍗� 鈥斺�� 宸ュ崟缂栫爜鍙栧彿瑙勫垯锛堟棤鍙樻洿锛屼粎璇存槑锛�
@@ -273,7 +285,228 @@
 --   锛堟敞鎰忥細璇ヨ剼鏈細 TRUNC 寮忛噸寤鸿鍒欒〃锛屼粎閫傜敤浜庨娆″垵濮嬪寲锛屽嬁鍦ㄥ凡鏈夋暟鎹殑鐜鎵ц锛夈��
 -- ============================================================================
 
+-- ============================================================================
+-- 绗洓閮ㄥ垎锛氶�氱敤瀹℃壒閰嶇疆锛堝鎵瑰紩鎿庣殑鍦板熀锛�
+--
+-- 鍓嶄笁閮ㄥ垎鍙姞浜嗐�屽鏍镐汉瀛楁銆嶅拰銆屽鏍告寜閽潈闄愩�嶏紝浣嗘病鏈夊缓瀹℃壒閰嶇疆琛ㄦ湰韬��
+-- 鍙窇鍓嶄笁閮ㄥ垎鐨勮瘽锛屾墍鏈夊崟鎹殑銆屾彁浜ゃ�嶉兘浼氬湪 validateApprovalEnabledAndGetApprovers
+-- 澶勫け璐ワ紙瀹℃壒閰嶇疆涓嶅瓨鍦� / 鏈惎鐢� / 鏈厤缃鎵逛汉锛夈�傛湰閮ㄥ垎琛ラ綈锛�
+--   4.1 瀹℃壒閰嶇疆涓昏〃 + 瀹℃壒浜哄瓙琛�
+--   4.2 26 涓笟鍔$被鍨嬬瀛愶紙榛樿鏈惎鐢級
+--   4.3 瀹℃壒閰嶇疆椤甸潰鑿滃崟涓庢煡璇�/淇濆瓨鎸夐挳
+--   4.4 閲囪喘璁″垝銆侀噰璐鍗曠殑瀹℃牳浜哄洓瀛楁
+--   4.5 閲囪喘璁″垝銆侀噰璐鍗曠殑瀹℃牳鎸夐挳鏉冮檺
+--   4.6 瑙掕壊鎺堟潈锛堟湰妗嗘灦鏃犮�岃秴绠$粫杩囨潈闄愩�嶉�昏緫锛屼笉鎺堟潈鍒� admin 涔熺湅涓嶅埌鎸夐挳锛�
+--
+-- 瀵瑰簲浠g爜鎻愪氦锛歟347fd6e refactor(approval): 閲囪喘璁″垝/閲囪喘璁㈠崟瀹℃壒鐢� BPM 鏀逛负杞婚噺绾х姸鎬佹満
+-- ============================================================================
+
+-- 4.1 瀹℃壒閰嶇疆涓昏〃 / 瀹℃壒浜哄瓙琛�
+CREATE TABLE IF NOT EXISTS system_approval_config (
+  id bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+  biz_type varchar(64) NOT NULL COMMENT '涓氬姟绫诲瀷缂栫爜锛屼笌鍚勬ā鍧楀鎵瑰垎绫荤紪鐮佷竴鑷�',
+  biz_name varchar(100) NOT NULL COMMENT '涓氬姟绫诲瀷鍚嶇О',
+  approval_enabled bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍚敤瀹℃壒',
+  remark varchar(500) NULL DEFAULT NULL COMMENT '澶囨敞',
+  creator varchar(64) NULL DEFAULT '' COMMENT '鍒涘缓鑰�',
+  create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+  updater varchar(64) NULL DEFAULT '' COMMENT '鏇存柊鑰�',
+  update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+  deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+  PRIMARY KEY (id) USING BTREE,
+  KEY idx_biz_type (biz_type) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '閫氱敤瀹℃壒閰嶇疆琛�';
+
+CREATE TABLE IF NOT EXISTS system_approval_config_user (
+  id bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭ID',
+  config_id bigint NOT NULL COMMENT '瀹℃壒閰嶇疆ID锛堝叧鑱� system_approval_config.id锛�',
+  user_id bigint NOT NULL COMMENT '瀹℃壒浜虹敤鎴稩D锛堢郴缁熺敤鎴凤級',
+  sort int NOT NULL DEFAULT 0 COMMENT '鏄剧ず椤哄簭',
+  creator varchar(64) NULL DEFAULT '' COMMENT '鍒涘缓鑰�',
+  create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+  updater varchar(64) NULL DEFAULT '' COMMENT '鏇存柊鑰�',
+  update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+  deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '鏄惁鍒犻櫎',
+  PRIMARY KEY (id) USING BTREE,
+  KEY idx_config_id (config_id) USING BTREE,
+  KEY idx_user_id (user_id) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '閫氱敤瀹℃壒閰嶇疆-瀹℃壒浜鸿〃';
+
+-- 4.2 涓氬姟绫诲瀷绉嶅瓙锛氱紪鐮佷笌鍚勬ā鍧� *_APPROVE_* 甯搁噺涓�涓�瀵瑰簲锛岄粯璁ゅ叏閮ㄦ湭鍚敤
+INSERT IGNORE INTO system_approval_config
+  (biz_type, biz_name, approval_enabled, remark, creator, create_time, updater, update_time, deleted) VALUES
+('purchase_plan_approve',        '閲囪喘璁″垝瀹℃牳',   b'0', 'ERP 閲囪喘璁″垝', '1', NOW(), '1', NOW(), b'0'),
+('purchase_request_approve',     '閲囪喘鐢宠瀹℃牳',   b'0', 'ERP 閲囪喘鐢宠', '1', NOW(), '1', NOW(), b'0'),
+('erp_purchase_order_approve',   '閲囪喘璁㈠崟瀹℃牳',   b'0', 'ERP 閲囪喘璁㈠崟锛堝師璇敤 purchase_request_approve锛屽凡鏀逛负鐙珛缂栫爜锛�', '1', NOW(), '1', NOW(), b'0'),
+('erp_purchase_invoice_approve', '閲囪喘鏉ョエ瀹℃牳',   b'0', 'ERP 閲囪喘鏉ョエ', '1', NOW(), '1', NOW(), b'0'),
+('erp_finance_payment_approve',  '浠樻鍗曞鏍�',     b'0', 'ERP 浠樻鍗�', '1', NOW(), '1', NOW(), b'0'),
+('contract_approve',             '鍚堝悓瀹℃壒',       b'0', 'CRM 鍚堝悓', '1', NOW(), '1', NOW(), b'0'),
+('refund_approve',               '閫�璐瑰鎵�',       b'0', 'CRM 閫�娆�', '1', NOW(), '1', NOW(), b'0'),
+('cancellation_approve',         '閿�鎴峰鎵�',       b'0', 'CRM 閿�鎴�', '1', NOW(), '1', NOW(), b'0'),
+('crm_invoice_approve',          '寮�绁ㄥ鎵�',       b'0', 'CRM 鍙戠エ', '1', NOW(), '1', NOW(), b'0'),
+('sale_quotation_approve',       '閿�鍞姤浠峰鎵�',   b'0', 'CRM 閿�鍞姤浠�', '1', NOW(), '1', NOW(), b'0'),
+('hrm_leave_approve',            '璇峰亣瀹℃壒',       b'0', 'HRM 璇峰亣鐢宠', '1', NOW(), '1', NOW(), b'0'),
+('hrm_regularize_approve',       '杞瀹℃壒',       b'0', 'HRM 杞鐢宠', '1', NOW(), '1', NOW(), b'0'),
+('hrm_resignation_approve',      '绂昏亴瀹℃壒',       b'0', 'HRM 绂昏亴鐢宠', '1', NOW(), '1', NOW(), b'0'),
+('hrm_transfer_approve',         '璋冨姩瀹℃壒',       b'0', 'HRM 璋冨姩鐢宠', '1', NOW(), '1', NOW(), b'0'),
+('hrm_attendance_approve',       '鑰冨嫟寮傚父瀹℃壒',   b'0', 'HRM 鑰冨嫟寮傚父', '1', NOW(), '1', NOW(), b'0'),
+('performance_appraise_approve', '缁╂晥鑰冩牳瀹℃壒',   b'0', 'HRM 缁╂晥鑰冩牳', '1', NOW(), '1', NOW(), b'0'),
+('mes_pd_project_approve',       '浜у搧椤圭洰瀹℃壒',   b'0', 'MES 浜у搧椤圭洰', '1', NOW(), '1', NOW(), b'0'),
+('pd_tech_confirm_approve',      '鎶�鏈‘璁ゅ嚱瀹℃壒', b'0', 'MES 浜у搧鎶�鏈‘璁ゅ嚱', '1', NOW(), '1', NOW(), b'0'),
+('item_receipt_approve',         '閲囪喘鍏ュ簱瀹℃壒',   b'0', 'MES 閲囪喘鍏ュ簱鍗�', '1', NOW(), '1', NOW(), b'0'),
+('equipment_receipt_approve',    '璁惧鍏ュ簱瀹℃壒',   b'0', 'MES 璁惧鍏ュ簱鍗�', '1', NOW(), '1', NOW(), b'0'),
+('misc_issue_approve',           '鍏朵粬鍑哄簱瀹℃壒',   b'0', 'MES 鍏朵粬鍑哄簱鍗�', '1', NOW(), '1', NOW(), b'0'),
+('misc_receipt_approve',         '鍏朵粬鍏ュ簱瀹℃壒',   b'0', 'MES 鍏朵粬鍏ュ簱鍗�', '1', NOW(), '1', NOW(), b'0'),
+('return_vendor_approve',        '閫�璐у鎵�',       b'0', 'MES 閫�璐у崟', '1', NOW(), '1', NOW(), b'0'),
+('stock_taking_result_approve',  '鐩樼偣缁撴灉瀹℃壒',   b'0', 'MES 鐩樼偣鍗�', '1', NOW(), '1', NOW(), b'0'),
+('wms_approve',                  '浠撳簱鍗曟嵁瀹℃牳',   b'0', 'MES 浠撳偍閫氱敤瀹℃壒', '1', NOW(), '1', NOW(), b'0'),
+('compensation_approve',         '璧斾粯瀹℃壒',       b'0', '鍞悗璧斿伩鍗�', '1', NOW(), '1', NOW(), b'0');
+
+-- 4.3 瀹℃壒閰嶇疆椤甸潰鑿滃崟
+--     鐖剁骇閿氬畾銆岀郴缁熺鐞嗐�嶏細鍙� system/user/index 鐨� parent_id锛岄伩鍏嶇‖缂栫爜鐩綍 ID
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT '瀹℃壒閰嶇疆', '', 2, 8, a.parent_id, 'approval-config', 'ep:stamp', 'system/approvalConfig/index', 'SystemApprovalConfig', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT MIN(m.parent_id) AS parent_id FROM system_menu m WHERE m.deleted = 0 AND m.component = 'system/user/index') a
+WHERE a.parent_id IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND component = 'system/approvalConfig/index') x);
+
+-- 4.3.1 瀹℃壒閰嶇疆鏌ヨ鎸夐挳锛堢埗绾� = 涓婇潰鐨勯〉闈㈣彍鍗曪紝鎸� component 鍙嶆煡锛�
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT '瀹℃壒閰嶇疆鏌ヨ', 'system:approval-config:query', 3, 1, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT MIN(m.id) AS parent_id FROM system_menu m WHERE m.deleted = 0 AND m.component = 'system/approvalConfig/index') a
+WHERE a.parent_id IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'system:approval-config:query') x);
+
+-- 4.3.2 瀹℃壒閰嶇疆淇濆瓨鎸夐挳
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT '瀹℃壒閰嶇疆淇濆瓨', 'system:approval-config:update', 3, 2, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT MIN(m.id) AS parent_id FROM system_menu m WHERE m.deleted = 0 AND m.component = 'system/approvalConfig/index') a
+WHERE a.parent_id IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'system:approval-config:update') x);
+
+-- 4.4 閲囪喘璁″垝 / 閲囪喘璁㈠崟 瀹℃牳浜哄洓瀛楁
+--     锛堢涓�閮ㄥ垎鍙鐩栦簡鍙﹀ 20 寮犺〃锛岃繖涓ゅ紶鏄噰璐鍒�/閲囪喘璁㈠崟鏀归�犳椂琛ョ殑锛�
+DROP TABLE IF EXISTS _tmp_xgdl_po_review_cols;
+CREATE TABLE _tmp_xgdl_po_review_cols (
+    tbl    VARCHAR(64)  NOT NULL,
+    col    VARCHAR(64)  NOT NULL,
+    coldef VARCHAR(255) NOT NULL
+);
+
+INSERT INTO _tmp_xgdl_po_review_cols (tbl, col, coldef) VALUES
+('erp_purchase_plan',  'reviewer_id',   'bigint COMMENT ''瀹℃牳浜虹紪鍙凤紙瀹為檯鎵ц瀹℃牳鐨勭敤鎴凤級'''),
+('erp_purchase_plan',  'reviewer_name', 'varchar(64) COMMENT ''瀹℃牳浜哄鍚嶏紙鍐椾綑璁板綍锛岄伩鍏嶅垪琛ㄦ煡璇㈠啀鏌ョ敤鎴凤級'''),
+('erp_purchase_plan',  'review_time',   'datetime COMMENT ''瀹℃牳鏃堕棿'''),
+('erp_purchase_plan',  'review_remark', 'varchar(500) COMMENT ''瀹℃牳鎰忚锛堥�氳繃鏃剁殑鎰忚 / 涓嶉�氳繃鏃剁殑鍘熷洜锛�'''),
+('erp_purchase_order', 'reviewer_id',   'bigint COMMENT ''瀹℃牳浜虹紪鍙凤紙瀹為檯鎵ц瀹℃牳鐨勭敤鎴凤級'''),
+('erp_purchase_order', 'reviewer_name', 'varchar(64) COMMENT ''瀹℃牳浜哄鍚嶏紙鍐椾綑璁板綍锛岄伩鍏嶅垪琛ㄦ煡璇㈠啀鏌ョ敤鎴凤級'''),
+('erp_purchase_order', 'review_time',   'datetime COMMENT ''瀹℃牳鏃堕棿'''),
+('erp_purchase_order', 'review_remark', 'varchar(500) COMMENT ''瀹℃牳鎰忚锛堥�氳繃鏃剁殑鎰忚 / 涓嶉�氳繃鏃剁殑鍘熷洜锛�''');
+
+DROP PROCEDURE IF EXISTS xgdl_add_po_review_cols;
+DELIMITER $$
+CREATE PROCEDURE xgdl_add_po_review_cols()
+BEGIN
+    DECLARE v_done INT DEFAULT 0;
+    DECLARE v_tbl VARCHAR(64);
+    DECLARE v_col VARCHAR(64);
+    DECLARE v_def VARCHAR(255);
+    DECLARE cur CURSOR FOR SELECT tbl, col, coldef FROM _tmp_xgdl_po_review_cols;
+    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
+
+    OPEN cur;
+    read_loop: LOOP
+        FETCH cur INTO v_tbl, v_col, v_def;
+        IF v_done = 1 THEN
+            LEAVE read_loop;
+        END IF;
+        IF EXISTS (SELECT 1 FROM information_schema.tables
+                   WHERE table_schema = DATABASE() AND table_name = v_tbl)
+           AND NOT EXISTS (SELECT 1 FROM information_schema.columns
+                   WHERE table_schema = DATABASE() AND table_name = v_tbl AND column_name = v_col)
+        THEN
+            SET @ddl = CONCAT('ALTER TABLE `', v_tbl, '` ADD COLUMN `', v_col, '` ', v_def);
+            PREPARE stmt FROM @ddl;
+            EXECUTE stmt;
+            DEALLOCATE PREPARE stmt;
+        END IF;
+    END LOOP;
+    CLOSE cur;
+END$$
+DELIMITER ;
+
+CALL xgdl_add_po_review_cols();
+DROP PROCEDURE IF EXISTS xgdl_add_po_review_cols;
+DROP TABLE IF EXISTS _tmp_xgdl_po_review_cols;
+
+-- 4.5 閲囪喘璁″垝 / 閲囪喘璁㈠崟 瀹℃牳鎸夐挳鏉冮檺锛堥敋鐐瑰悓绗竴閮ㄥ垎锛氬悇鑷祫婧愮殑 :update 鎸夐挳锛�
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT '閲囪喘璁″垝瀹℃牳' AS name, 'erp:purchase-plan:audit' AS perm) t
+JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'erp:purchase-plan:update') a ON 1 = 1
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:purchase-plan:audit') m);
+
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT '閲囪喘璁㈠崟瀹℃牳' AS name, 'erp:purchase-order:audit' AS perm) t
+JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'erp:purchase-order:update') a ON 1 = 1
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'erp:purchase-order:audit') m);
+
+-- 4.6 琛ユ紡锛氫唬鐮侀噷宸蹭娇鐢ㄣ�佷絾绗簩閮ㄥ垎鏈垱寤虹殑 3 涓鏍告寜閽潈闄�
+--     瀵硅处鏂瑰紡锛歡rep -rhoE "'[a-z]+:[a-z0-9-]+:audit'" --include=*.java
+--     缂哄け浼氬鑷村搴旈〉闈㈢殑瀹℃牳鎸夐挳瀵逛换浣曚汉閮戒笉鏄剧ず锛堝惈 admin锛夈��
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT '鏁呴殰璧斾粯瀹℃牳' AS name, 'aftersales:compensation:audit' AS perm) t
+JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'aftersales:compensation:update') a ON 1 = 1
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'aftersales:compensation:audit') m);
+
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT '缁╂晥鑰冩牳瀹℃牳' AS name, 'hrm:performance-appraise:audit' AS perm) t
+JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'hrm:performance-appraise:update') a ON 1 = 1
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'hrm:performance-appraise:audit') m);
+
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
+SELECT t.name, t.perm, 3, 99, a.parent_id, '', '', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
+FROM (SELECT '浜у搧椤圭洰瀹℃牳' AS name, 'mes:pd-product:audit' AS perm) t
+JOIN (SELECT MIN(x.parent_id) AS parent_id FROM system_menu x WHERE x.deleted = 0 AND x.permission = 'mes:pd-product:update') a ON 1 = 1
+WHERE a.parent_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_menu WHERE deleted = 0 AND permission = 'mes:pd-product:audit') m);
+
+-- 4.7 瑙掕壊鎺堟潈
+--     閲嶈锛氭湰妗嗘灦 SecurityFrameworkServiceImpl 娌℃湁銆岃秴绾х鐞嗗憳缁曡繃鏉冮檺鏍¢獙銆嶇殑鐭矾閫昏緫锛�
+--     鏉冮檺涓�寰嬭蛋 system_role_menu銆備笉鎺堟潈鐨勮瘽杩� admin 閮界湅涓嶅埌瀹℃壒閰嶇疆鑿滃崟鍜屽鏍告寜閽��
+--     寮�鍙戝簱瀹炴祴锛氬叏閮� :audit 鍧囧凡鎺堜簣 super_admin(1) 涓� common(2)锛�
+--     浠� mes:pd-product:audit 涓� mes:pd-tech-confirm:audit 婕忔巿 super_admin 鈥斺��
+--     涓嬮潰杩欐潯璇彞浼氶『甯︽妸杩欎袱涓己鍙hˉ榻愩��
+--     鍏朵綑瑙掕壊璇峰湪銆岃鑹茬鐞嗐�嶉〉闈㈡寜闇�鍕鹃�夈��
+INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted)
+SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0'
+FROM system_role r
+CROSS JOIN system_menu m
+WHERE r.code IN ('super_admin', 'common')
+  AND r.deleted = 0
+  AND m.deleted = 0
+  AND ( m.component = 'system/approvalConfig/index'
+        OR m.permission IN ('system:approval-config:query', 'system:approval-config:update')
+        OR m.permission LIKE '%:audit' )
+  AND NOT EXISTS (
+      SELECT 1 FROM system_role_menu rm
+      WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = 0
+  );
+
 -- 瀹屾垚銆傚彲鎵ц浠ヤ笅璇彞鏍¢獙锛�
 -- SELECT table_name, column_name FROM information_schema.columns
 --  WHERE table_schema = DATABASE() AND column_name = 'reviewer_id';
 -- SELECT permission FROM system_menu WHERE deleted = 0 AND permission LIKE '%:audit';
+-- SELECT COUNT(*) FROM system_approval_config WHERE deleted = 0;                     -- 鏈熸湜 26
+-- SELECT id, name, permission, parent_id FROM system_menu                            -- 蹇呴』鍥炶涓夐」锛屽嬁鍙湅琛屾暟
+--  WHERE deleted = 0 AND (component = 'system/approvalConfig/index'
+--    OR permission LIKE 'system:approval-config:%'
+--    OR permission IN ('erp:purchase-plan:audit','erp:purchase-order:audit'));
+-- SELECT r.code, COUNT(*) FROM system_role_menu rm JOIN system_role r ON r.id = rm.role_id
+--  JOIN system_menu m ON m.id = rm.menu_id
+--  WHERE rm.deleted = 0 AND (m.component = 'system/approvalConfig/index'
+--    OR m.permission LIKE 'system:approval-config:%'
+--    OR m.permission IN ('erp:purchase-plan:audit','erp:purchase-order:audit'))
+--  GROUP BY r.code;                                                                  -- 鏈熸湜姣忚鑹� 5 鏉�

--
Gitblit v1.9.3