diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 2d3c8eff9..71410dfd3 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -16633,6 +16633,9 @@ DROP PROCEDURE IF EXISTS assert_phase5_delivery_permissions; DELIMITER $$ CREATE PROCEDURE assert_phase5_delivery_permissions() BEGIN + DECLARE v_warehouse_operator_permission_count INT DEFAULT 0; + DECLARE v_warehouse_tally_permission_count INT DEFAULT 0; + IF (SELECT COUNT(*) FROM iam_permission WHERE tenant_id=0 AND status='ACTIVE' AND deleted=0 AND permission_code IN ( @@ -16661,8 +16664,12 @@ BEGIN 'platform:overseas-warehouse:delivery:list')) <> 7 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='五期海外派送权限初始化失败:平台管理员授权不完整'; END IF; - IF (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission WHERE role_code='WAREHOUSE_OPERATOR') <> 7 - OR (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission WHERE role_code='WAREHOUSE_TALLY') <> 2 THEN + SELECT COALESCE(SUM(role_code='WAREHOUSE_OPERATOR'),0), + COALESCE(SUM(role_code='WAREHOUSE_TALLY'),0) + INTO v_warehouse_operator_permission_count, v_warehouse_tally_permission_count + FROM tmp_phase5_delivery_role_permission; + IF v_warehouse_operator_permission_count <> 7 + OR v_warehouse_tally_permission_count <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='五期海外派送权限初始化失败:仓库岗位最小权限矩阵异常'; END IF; IF EXISTS (SELECT 1 FROM iam_role_permission grant_row diff --git a/iam/src/main/resources/db/phase5-delivery-permissions.sql b/iam/src/main/resources/db/phase5-delivery-permissions.sql index 3dd23f7b6..f60b4a4b5 100644 --- a/iam/src/main/resources/db/phase5-delivery-permissions.sql +++ b/iam/src/main/resources/db/phase5-delivery-permissions.sql @@ -133,6 +133,9 @@ DROP PROCEDURE IF EXISTS assert_phase5_delivery_permissions; DELIMITER $$ CREATE PROCEDURE assert_phase5_delivery_permissions() BEGIN + DECLARE v_warehouse_operator_permission_count INT DEFAULT 0; + DECLARE v_warehouse_tally_permission_count INT DEFAULT 0; + IF (SELECT COUNT(*) FROM iam_permission WHERE tenant_id=0 AND status='ACTIVE' AND deleted=0 AND permission_code IN ( @@ -161,8 +164,12 @@ BEGIN 'platform:overseas-warehouse:delivery:list')) <> 7 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='五期海外派送权限初始化失败:平台管理员授权不完整'; END IF; - IF (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission WHERE role_code='WAREHOUSE_OPERATOR') <> 7 - OR (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission WHERE role_code='WAREHOUSE_TALLY') <> 2 THEN + SELECT COALESCE(SUM(role_code='WAREHOUSE_OPERATOR'),0), + COALESCE(SUM(role_code='WAREHOUSE_TALLY'),0) + INTO v_warehouse_operator_permission_count, v_warehouse_tally_permission_count + FROM tmp_phase5_delivery_role_permission; + IF v_warehouse_operator_permission_count <> 7 + OR v_warehouse_tally_permission_count <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='五期海外派送权限初始化失败:仓库岗位最小权限矩阵异常'; END IF; IF EXISTS (SELECT 1 FROM iam_role_permission grant_row diff --git a/iam/src/test/java/com/baiyue/iam/repository/Phase5DeliveryPermissionSqlContractTest.java b/iam/src/test/java/com/baiyue/iam/repository/Phase5DeliveryPermissionSqlContractTest.java index 00d195e31..1112018dd 100644 --- a/iam/src/test/java/com/baiyue/iam/repository/Phase5DeliveryPermissionSqlContractTest.java +++ b/iam/src/test/java/com/baiyue/iam/repository/Phase5DeliveryPermissionSqlContractTest.java @@ -58,6 +58,23 @@ class Phase5DeliveryPermissionSqlContractTest { "('CN_FIRSTLEG_PDA_OPERATOR','platform:overseas-warehouse:"); } + @Test + void validatesTheWarehouseRoleMatrixWithOneTemporaryTableReadPerStatement() throws Exception { + String sql = sql(); + + assertThat(sql).contains( + "DECLARE v_warehouse_operator_permission_count INT DEFAULT 0", + "DECLARE v_warehouse_tally_permission_count INT DEFAULT 0", + "SELECT COALESCE(SUM(role_code='WAREHOUSE_OPERATOR'),0)", + "COALESCE(SUM(role_code='WAREHOUSE_TALLY'),0)", + "INTO v_warehouse_operator_permission_count, v_warehouse_tally_permission_count", + "IF v_warehouse_operator_permission_count <> 7", + "OR v_warehouse_tally_permission_count <> 2 THEN"); + assertThat(sql).doesNotContain( + "IF (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission", + "OR (SELECT COUNT(*) FROM tmp_phase5_delivery_role_permission"); + } + @Test void grantsOnlyTheDefaultCustomerAdministratorAutomatically() throws Exception { String sql = sql();