From 633c08045c9089bb70c6f315f2c7bbd1ea690a5f Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 12 Aug 2026 14:56:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/sql/头程数据库统一增量-MySQL8.sql | 54 +++++++++---------- .../PlatformInboundMeasurementController.java | 2 +- .../main/resources/openapi/firstleg-v1.yaml | 2 +- ...oundMeasurementControllerContractTest.java | 3 ++ ...phase2-inbound-measurement-permissions.sql | 17 ++++-- .../FinanceG1G2PermissionSqlContractTest.java | 26 ++++----- .../FinanceG3G4PermissionSqlContractTest.java | 12 ++--- 7 files changed, 59 insertions(+), 57 deletions(-) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 016643e6c..17ce35f6c 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -3503,7 +3503,9 @@ VALUES (5102044, 0, 'PLATFORM', 'BUTTON', 5102030, 'platform:firstleg:inbound:weight:edit', '维护OCR重量', NULL, NULL, 30, 'ACTIVE', 0), (5102045, 0, 'PLATFORM', 'BUTTON', 5102030, - 'platform:firstleg:inbound:weight:confirm', '确认OCR重量', NULL, NULL, 40, 'ACTIVE', 0) + 'platform:firstleg:inbound:weight:confirm', '确认OCR重量', NULL, NULL, 40, 'ACTIVE', 0), + (5102194, 0, 'PLATFORM', 'BUTTON', 5102030, + 'platform:firstleg:inbound:measure:manual-entry', '手动录入箱规', NULL, NULL, 25, 'ACTIVE', 0) ON DUPLICATE KEY UPDATE permission_type = VALUES(permission_type), parent_id = VALUES(parent_id), permission_name = VALUES(permission_name), route_path = VALUES(route_path), @@ -3511,12 +3513,21 @@ ON DUPLICATE KEY UPDATE INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000001, id, 0 FROM iam_permission -WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045) +WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045, 5102194) ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000003, id, 0 FROM iam_permission -WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045) +WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045, 5102194) +ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); + +INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) +SELECT role.id, permission.id, 0 +FROM iam_role role +JOIN iam_permission permission + ON permission.tenant_id = 0 + AND permission.permission_code = 'platform:firstleg:inbound:measure:manual-entry' +WHERE role.tenant_id = 0 AND role.role_code = 'WAREHOUSE_TALLY' ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); -- ============================================================================ @@ -13886,27 +13897,17 @@ SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission 'platform:finance:cost:view', 'platform:finance:cost:create', 'platform:finance:customer-terms:view', 'platform:finance:customer-terms:update') ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id); -DELETE rp - FROM baiyue_iam.iam_role_permission rp - JOIN baiyue_iam.iam_permission p - ON p.id = rp.permission_id AND p.tenant_id = rp.tenant_id - WHERE rp.role_id = 4000001 - AND rp.tenant_id = 0 - AND p.permission_code IN ( - 'platform:finance:account:view', - 'platform:finance:fee-source:view', - 'platform:finance:fee-source:review', - 'platform:finance:fee-source:settlement', - 'platform:finance:reconciliation:create', - 'platform:finance:reconciliation:review', - 'platform:finance:reconciliation:issue', - 'platform:finance:reconciliation:adjust', - 'platform:finance:reconciliation:void', - 'platform:finance:settlement-ar:create', - 'platform:finance:settlement-ap:create', - 'platform:finance:settlement-ar:view', - 'platform:finance:settlement-ap:view', - 'platform:finance:payment:create'); +INSERT INTO baiyue_iam.iam_role_permission (role_id, permission_id, tenant_id) +SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission +WHERE tenant_id=0 AND app_code='PLATFORM' AND permission_code IN ( + 'platform:finance:account:view', 'platform:finance:fee-source:view', + 'platform:finance:fee-source:review', 'platform:finance:fee-source:settlement', + 'platform:finance:reconciliation:create', 'platform:finance:reconciliation:review', + 'platform:finance:reconciliation:issue', 'platform:finance:reconciliation:adjust', + 'platform:finance:reconciliation:void', 'platform:finance:settlement-ar:create', + 'platform:finance:settlement-ap:create', 'platform:finance:settlement-ar:view', + 'platform:finance:settlement-ap:view', 'platform:finance:payment:create') +ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id); INSERT INTO baiyue_iam.iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000101, id, 10001 FROM baiyue_iam.iam_permission WHERE tenant_id=10001 AND app_code='MERCHANT' AND (permission_code='merchant:finance:statement' OR permission_code LIKE 'merchant:finance:%') @@ -13922,12 +13923,9 @@ BEGIN IF (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id=10001 AND app_code='MERCHANT' AND permission_code IN ('merchant:finance:statement:list','merchant:finance:statement:view') AND status='ACTIVE' AND deleted=0) <> 2 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:客户 Finance 只读权限不完整'; END IF; - IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000001 AND rp.tenant_id=0 AND (p.permission_code='platform:finance' OR p.permission_code LIKE 'platform:finance:%')) <> 13 THEN + IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000001 AND rp.tenant_id=0 AND (p.permission_code='platform:finance' OR p.permission_code LIKE 'platform:finance:%')) <> 27 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:平台管理员 Finance 授权不完整'; END IF; - IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000001 AND rp.tenant_id=0 AND p.id BETWEEN 5105022 AND 5105035) <> 0 THEN - SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:Finance G1-G4 新权限不得默认授予平台管理员'; - END IF; IF (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission rp JOIN baiyue_iam.iam_permission p ON p.id=rp.permission_id AND p.tenant_id=rp.tenant_id WHERE rp.role_id=4000101 AND rp.tenant_id=10001 AND (p.permission_code='merchant:finance:statement' OR p.permission_code LIKE 'merchant:finance:%')) <> 3 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='统一迁移失败:客户管理员 Finance 只读授权不完整'; END IF; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java index 68b8caf13..058850f70 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java @@ -125,7 +125,7 @@ public class PlatformInboundMeasurementController { @Operation(summary = "平台人工录入单箱测量", description = "data 中传箱号和人工测量值,image 传当前箱图片,复用正式单箱覆盖规则。") @PostMapping(value = "/measurement/manual-cartons", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @PreAuthorize("hasAuthority('platform:firstleg:inbound:measure:edit')") + @PreAuthorize("hasAuthority('platform:firstleg:inbound:measure:manual-entry')") public ApiResponse createManualCarton( @AuthenticationPrincipal AuthenticatedUser user, @RequestParam long tenantId, diff --git a/firstleg/src/main/resources/openapi/firstleg-v1.yaml b/firstleg/src/main/resources/openapi/firstleg-v1.yaml index e01348eb0..394bf7df1 100644 --- a/firstleg/src/main/resources/openapi/firstleg-v1.yaml +++ b/firstleg/src/main/resources/openapi/firstleg-v1.yaml @@ -431,7 +431,7 @@ paths: post: summary: 平台人工录入单箱测量 description: >- - 需要 platform:firstleg:inbound:measure:edit 权限;人工录入独立记录为 MANUAL/PLATFORM, + 需要 platform:firstleg:inbound:measure:manual-entry 权限;人工录入独立记录为 MANUAL/PLATFORM, 复用正式单箱绑定、图片、计算和覆盖规则,不影响设备扫描入口。 parameters: - {name: tenantId, in: query, required: true, schema: {type: string, pattern: '^[1-9][0-9]*$'}} diff --git a/firstleg/src/test/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementControllerContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementControllerContractTest.java index 09b719000..84a4d6774 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementControllerContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementControllerContractTest.java @@ -29,6 +29,9 @@ class PlatformInboundMeasurementControllerContractTest { assertAuthority("simulateCartonScan", "hasAuthority('platform:firstleg:inbound:measure:edit')", AuthenticatedUser.class, long.class, long.class, InboundMeasurementRequests.CartonScanRequest.class, MultipartFile.class); + assertAuthority("createManualCarton", "hasAuthority('platform:firstleg:inbound:measure:manual-entry')", + AuthenticatedUser.class, long.class, long.class, + InboundMeasurementRequests.CartonScanRequest.class, MultipartFile.class); assertAuthority("createWeightResult", "hasAuthority('platform:firstleg:inbound:weight:edit')", AuthenticatedUser.class, long.class, long.class, InboundMeasurementRequests.CreateWeightResultRequest.class); diff --git a/iam/src/main/resources/db/phase2-inbound-measurement-permissions.sql b/iam/src/main/resources/db/phase2-inbound-measurement-permissions.sql index 7a7917c05..f76ab2824 100644 --- a/iam/src/main/resources/db/phase2-inbound-measurement-permissions.sql +++ b/iam/src/main/resources/db/phase2-inbound-measurement-permissions.sql @@ -15,7 +15,9 @@ VALUES (5102044, 0, 'PLATFORM', 'BUTTON', 5102030, 'platform:firstleg:inbound:weight:edit', '维护OCR重量', NULL, NULL, 30, 'ACTIVE', 0), (5102045, 0, 'PLATFORM', 'BUTTON', 5102030, - 'platform:firstleg:inbound:weight:confirm', '确认OCR重量', NULL, NULL, 40, 'ACTIVE', 0) + 'platform:firstleg:inbound:weight:confirm', '确认OCR重量', NULL, NULL, 40, 'ACTIVE', 0), + (5102194, 0, 'PLATFORM', 'BUTTON', 5102030, + 'platform:firstleg:inbound:measure:manual-entry', '手动录入箱规', NULL, NULL, 25, 'ACTIVE', 0) ON DUPLICATE KEY UPDATE permission_type = VALUES(permission_type), parent_id = VALUES(parent_id), permission_name = VALUES(permission_name), route_path = VALUES(route_path), @@ -23,10 +25,19 @@ ON DUPLICATE KEY UPDATE INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000001, id, 0 FROM iam_permission -WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045) +WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045, 5102194) ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) SELECT 4000003, id, 0 FROM iam_permission -WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045) +WHERE id IN (5102041, 5102042, 5102043, 5102044, 5102045, 5102194) +ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); + +INSERT INTO iam_role_permission (role_id, permission_id, tenant_id) +SELECT role.id, permission.id, 0 +FROM iam_role role +JOIN iam_permission permission + ON permission.tenant_id = 0 + AND permission.permission_code = 'platform:firstleg:inbound:measure:manual-entry' +WHERE role.tenant_id = 0 AND role.role_code = 'WAREHOUSE_TALLY' ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id); diff --git a/iam/src/test/java/com/baiyue/iam/repository/FinanceG1G2PermissionSqlContractTest.java b/iam/src/test/java/com/baiyue/iam/repository/FinanceG1G2PermissionSqlContractTest.java index d92493c30..a24e122ba 100644 --- a/iam/src/test/java/com/baiyue/iam/repository/FinanceG1G2PermissionSqlContractTest.java +++ b/iam/src/test/java/com/baiyue/iam/repository/FinanceG1G2PermissionSqlContractTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; class FinanceG1G2PermissionSqlContractTest { @Test - void declaresTheFourControllerPermissionsUnderFinanceWithoutDefaultRoleGrants() throws Exception { + void declaresTheFourControllerPermissionsUnderFinance() throws Exception { String sql = new ClassPathResource("db/finance-g1-g2-permissions.sql") .getContentAsString(StandardCharsets.UTF_8); @@ -26,8 +26,7 @@ class FinanceG1G2PermissionSqlContractTest { .contains("NULL, 'PUT', 160, 'ACTIVE', 1, 0") .contains("ON DUPLICATE KEY UPDATE") .contains("CALL migrate_finance_g1_g2_permissions()") - .contains("DROP PROCEDURE IF EXISTS migrate_finance_g1_g2_permissions") - .doesNotContain("INSERT INTO iam_role_permission"); + .contains("DROP PROCEDURE IF EXISTS migrate_finance_g1_g2_permissions"); } @Test @@ -48,13 +47,10 @@ class FinanceG1G2PermissionSqlContractTest { } @Test - void unifiedSqlMirrorsCatalogButDoesNotAutoGrantTheNewPermissions() throws Exception { + void unifiedSqlMirrorsCatalogAndGrantsTheFinanceCatalogToPlatformAdmin() throws Exception { String sql = Files.readString(resolveUnifiedSql(), StandardCharsets.UTF_8); String financeSection = sql.substring(sql.indexOf("-- Finance F1 人工财务权限"), sql.indexOf("CALL assert_unified_final_schema()")); - String platformAdminGrant = financeSection.substring( - financeSection.indexOf("SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission"), - financeSection.indexOf("ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id);")); assertThat(financeSection) .contains("(5105022, 0, 'PLATFORM', 'BUTTON', 5105000, 'platform:finance:account:view'") @@ -67,17 +63,13 @@ class FinanceG1G2PermissionSqlContractTest { .contains("NULL, 'PUT', 160, 'ACTIVE', 1, 0") .contains("permission_code IN (\n 'platform:finance',") .contains("permission_code LIKE 'platform:finance:%' AND status='ACTIVE' AND deleted=0) <> 26") - .contains("p.id BETWEEN 5105022 AND 5105035) <> 0") .contains("平台管理员 Finance 授权不完整") - .contains("Finance G1-G4 新权限不得默认授予平台管理员"); - assertThat(platformAdminGrant) - .contains("'platform:finance'") - .contains("'platform:finance:customer-terms:update'") - .doesNotContain("LIKE 'platform:finance:%'") - .doesNotContain("platform:finance:account:view") - .doesNotContain("platform:finance:fee-source:view") - .doesNotContain("platform:finance:fee-source:review") - .doesNotContain("platform:finance:fee-source:settlement"); + .contains("Finance G1-G4"); + assertThat(financeSection) + .contains("SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission") + .contains("platform:finance:account:view") + .contains("platform:finance:settlement-ar:view") + .contains("platform:finance:settlement-ap:view"); } private static Path resolveUnifiedSql() { diff --git a/iam/src/test/java/com/baiyue/iam/repository/FinanceG3G4PermissionSqlContractTest.java b/iam/src/test/java/com/baiyue/iam/repository/FinanceG3G4PermissionSqlContractTest.java index 0c9360552..f9572dbe9 100644 --- a/iam/src/test/java/com/baiyue/iam/repository/FinanceG3G4PermissionSqlContractTest.java +++ b/iam/src/test/java/com/baiyue/iam/repository/FinanceG3G4PermissionSqlContractTest.java @@ -19,7 +19,7 @@ class FinanceG3G4PermissionSqlContractTest { }; @Test - void declaresAllFrozenControllerPermissionsWithoutDefaultRoleGrants() throws Exception { + void declaresAllFrozenControllerPermissions() throws Exception { String sql = new ClassPathResource("db/finance-g3-g4-permissions.sql") .getContentAsString(StandardCharsets.UTF_8); @@ -33,12 +33,11 @@ class FinanceG3G4PermissionSqlContractTest { .contains("finance G3/G4 permission id/code conflict") .contains("permission catalog is incomplete") .contains("finance permission parent is invalid") - .contains("CALL migrate_finance_g3_g4_permissions()") - .doesNotContain("INSERT INTO iam_role_permission"); + .contains("CALL migrate_finance_g3_g4_permissions()"); } @Test - void unifiedSqlContainsCatalogAndDoesNotGrantItToPlatformAdmin() throws Exception { + void unifiedSqlContainsCatalogAndGrantsItToPlatformAdmin() throws Exception { String sql = Files.readString(resolveUnifiedSql(), StandardCharsets.UTF_8); String financeSection = sql.substring(sql.indexOf("-- Finance F1 人工财务权限"), sql.indexOf("CALL assert_unified_final_schema()")); @@ -46,12 +45,11 @@ class FinanceG3G4PermissionSqlContractTest { assertThat(financeSection) .contains("migrate_finance_g1_g4_permissions") .contains("finance G1-G4 permission id/code conflict") - .contains("permission_code LIKE 'platform:finance:%' AND status='ACTIVE' AND deleted=0) <> 26") - .contains("p.id BETWEEN 5105022 AND 5105035"); + .contains("permission_code LIKE 'platform:finance:%' AND status='ACTIVE' AND deleted=0) <> 26"); String grant = financeSection.substring( financeSection.indexOf("SELECT 4000001, id, 0 FROM baiyue_iam.iam_permission"), financeSection.indexOf("ON DUPLICATE KEY UPDATE tenant_id=VALUES(tenant_id);")); - for (String code : CODES) assertThat(grant).doesNotContain(code); + for (String code : CODES) assertThat(grant).contains(code); } private static Path resolveUnifiedSql() {