This commit is contained in:
2026-08-12 14:56:57 +08:00
parent 6d50bde31e
commit 633c08045c
7 changed files with 59 additions and 57 deletions
@@ -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;
@@ -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<CartonMeasurementResult> createManualCarton(
@AuthenticationPrincipal AuthenticatedUser user,
@RequestParam long tenantId,
@@ -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]*$'}}
@@ -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);
@@ -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);
@@ -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() {
@@ -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() {