feat(iam): add delivery document management permission

This commit is contained in:
2026-09-09 11:09:51 +08:00
parent 0d157e4dd9
commit cde8acf111
7 changed files with 88 additions and 27 deletions
@@ -29,6 +29,8 @@ class IamOpenApiContractTest {
.contains("platform:overseas-warehouse:delivery:list")
.contains("platform:overseas-warehouse:delivery:return")
.contains("platform:overseas-warehouse:delivery:status")
.contains("platform:overseas-warehouse:delivery:documents")
.contains("读取和下载仍使用 `platform:overseas-warehouse:delivery:list`")
.contains("platform:overseas-warehouse:exception-order:list")
.contains("platform:overseas-warehouse:exception-order:create")
.contains("platform:overseas-warehouse:exception-order:process")
@@ -28,6 +28,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"platform:overseas-warehouse:exception-order:process",
"platform:overseas-warehouse:delivery:return",
"platform:overseas-warehouse:delivery:status",
"platform:overseas-warehouse:delivery:documents",
"platform:overseas-warehouse:customer-visit:list",
"platform:overseas-warehouse:customer-visit:edit",
"merchant:warehouse:delivery:list",
@@ -58,6 +59,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"'platform:overseas-warehouse:exception-order:process','处理海外异常订单',NULL,'POST'",
"'platform:overseas-warehouse:delivery:return','派送单标记退货',NULL,'POST'",
"'platform:overseas-warehouse:delivery:status','编辑派送单状态',NULL,'PUT'",
"(5107094,0,'PLATFORM','BUTTON',5107092,'platform:overseas-warehouse:delivery:documents','管理派送资料',NULL,'POST'",
"'platform:overseas-warehouse:customer-visit:list','客户回访','/overseas-warehouse/customer-visits','GET'",
"'platform:overseas-warehouse:customer-visit:edit','保存客户回访',NULL,'PUT'",
"'merchant:warehouse:delivery:list','海外仓派送单','/orders/delivery','GET'");
@@ -80,6 +82,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"('WAREHOUSE_OPERATOR','platform:overseas-warehouse:exception-order:process')",
"('WAREHOUSE_OPERATOR','platform:overseas-warehouse:delivery:return')",
"('WAREHOUSE_OPERATOR','platform:overseas-warehouse:delivery:status')",
"('WAREHOUSE_OPERATOR','platform:overseas-warehouse:delivery:documents')",
"('WAREHOUSE_OPERATOR','platform:overseas-warehouse:customer-visit:edit')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:dispatch:list')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:outbound:list')",
@@ -95,6 +98,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"('WAREHOUSE_TALLY','platform:overseas-warehouse:exception-order:process')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:delivery:return')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:delivery:status')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:delivery:documents')",
"('WAREHOUSE_TALLY','platform:overseas-warehouse:customer-visit:edit')",
"('OVERSEAS_WAREHOUSE_PDA_OPERATOR','platform:overseas-warehouse:",
"('CN_FIRSTLEG_PDA_OPERATOR','platform:overseas-warehouse:");
@@ -110,7 +114,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"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 <> 15",
"IF v_warehouse_operator_permission_count <> 16",
"OR v_warehouse_tally_permission_count <> 5 THEN",
"IF EXISTS (SELECT 1 FROM iam_role role",
"AND UPPER(role.role_code)='PLATFORM_CUSTOM_ADMIN'",
@@ -164,7 +168,7 @@ class Phase5DeliveryPermissionSqlContractTest {
"海外排车、出库与派送权限",
"测试和部署只执行固定入口,不再单独执行模块脚本",
"排车列表/编辑/取消/转派送",
"异常订单列表/创建/处理和客户回访列表/编辑十五项权限",
"异常订单列表/创建/处理和客户回访列表/编辑十六项权限",
"merchant:warehouse:delivery:list",
"merchant:warehouse:delivery:create",
"PDA 岗位不得获得上述后台权限");
@@ -37,12 +37,12 @@ class Phase5DeliveryPermissionSqlExecutionTest {
assertThat(customAdministratorViolations(connection)).isEqualTo(1);
executeGrant(connection);
assertThat(grantCount(connection, 11L)).isEqualTo(15);
assertThat(grantCount(connection, 11L)).isEqualTo(16);
assertThat(customAdministratorViolations(connection)).isZero();
executeGrant(connection);
assertThat(grantCount(connection, 11L)).isEqualTo(15);
assertThat(totalGrantCount(connection)).isEqualTo(15);
assertThat(grantCount(connection, 11L)).isEqualTo(16);
assertThat(totalGrantCount(connection)).isEqualTo(16);
}
}
@@ -51,14 +51,14 @@ class Phase5DeliveryPermissionSqlExecutionTest {
try (Connection connection = database()) {
insertRole(connection, 21L, "PLATFORM_CUSTOM_ADMIN");
insertRole(connection, 22L, "Platform_Custom_Admin");
grantFirstPermissions(connection, 21L, 15);
grantFirstPermissions(connection, 22L, 14);
grantFirstPermissions(connection, 21L, 16);
grantFirstPermissions(connection, 22L, 15);
assertThat(customAdministratorViolations(connection)).isEqualTo(1);
executeGrant(connection);
assertThat(grantCount(connection, 21L)).isEqualTo(15);
assertThat(grantCount(connection, 22L)).isEqualTo(15);
assertThat(grantCount(connection, 21L)).isEqualTo(16);
assertThat(grantCount(connection, 22L)).isEqualTo(16);
assertThat(customAdministratorViolations(connection)).isZero();
}
}
@@ -68,16 +68,50 @@ class Phase5DeliveryPermissionSqlExecutionTest {
try (Connection connection = database()) {
insertRole(connection, 31L, "PLATFORM_CUSTOM_ADMIN");
insertRole(connection, 32L, "platform_custom_admin");
grantFirstPermissions(connection, 31L, 15);
grantFirstPermissions(connection, 32L, 15);
grantFirstPermissions(connection, 31L, 16);
grantFirstPermissions(connection, 32L, 16);
assertThat(customAdministratorViolations(connection)).isZero();
executeGrant(connection);
executeGrant(connection);
assertThat(grantCount(connection, 31L)).isEqualTo(15);
assertThat(grantCount(connection, 32L)).isEqualTo(15);
assertThat(totalGrantCount(connection)).isEqualTo(30);
assertThat(grantCount(connection, 31L)).isEqualTo(16);
assertThat(grantCount(connection, 32L)).isEqualTo(16);
assertThat(totalGrantCount(connection)).isEqualTo(32);
}
}
@Test
void administratorGrantDoesNotEscalateAReadOnlyRoleOrDisabledAdministrator() throws Exception {
try (Connection connection = database()) {
insertRole(connection, 41L, "PLATFORM_ADMIN");
insertRole(connection, 42L, "WAREHOUSE_TALLY");
insertRole(connection, 43L, "PLATFORM_CUSTOM_ADMIN");
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("UPDATE iam_role SET status='INACTIVE' WHERE id=43");
statement.executeUpdate("""
INSERT INTO iam_role_permission
SELECT 0, 42, id, CURRENT_TIMESTAMP FROM iam_permission
WHERE permission_code='platform:overseas-warehouse:delivery:list'
""");
}
executeGrant(connection);
executeGrant(connection);
assertThat(grantCount(connection, 41L)).isEqualTo(16);
assertThat(grantCount(connection, 42L)).isEqualTo(1);
assertThat(grantCount(connection, 43L)).isZero();
try (Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("""
SELECT role_id FROM iam_role_permission grant_row
JOIN iam_permission permission ON permission.id=grant_row.permission_id
WHERE permission.permission_code='platform:overseas-warehouse:delivery:documents'
""")) {
assertThat(result.next()).isTrue();
assertThat(result.getLong(1)).isEqualTo(41L);
assertThat(result.next()).isFalse();
}
}
}
@@ -182,7 +216,7 @@ class Phase5DeliveryPermissionSqlExecutionTest {
AND (SELECT COUNT(*) FROM iam_role_permission grant_row
JOIN iam_permission permission ON permission.id=grant_row.permission_id
WHERE grant_row.role_id=role.id AND grant_row.tenant_id=role.tenant_id
AND permission.permission_code IN (%s)) <> 15
AND permission.permission_code IN (%s)) <> 16
""".formatted(placeholders);
try (PreparedStatement query = connection.prepareStatement(sql)) {
int index = 1;
@@ -209,7 +243,7 @@ class Phase5DeliveryPermissionSqlExecutionTest {
LinkedHashSet<String> codes = new LinkedHashSet<>();
String grant = administratorGrantSql();
PLATFORM_CODE.matcher(grant).results().map(result -> result.group()).forEach(codes::add);
assertThat(codes).hasSize(15);
assertThat(codes).hasSize(16);
return codes;
}