This commit is contained in:
2026-08-28 10:38:58 +08:00
parent b34fbb2bd1
commit 1e5ce54858
37 changed files with 256 additions and 159 deletions
@@ -82,10 +82,10 @@ class OverseasPhase4PermissionSqlContractTest {
"platform:overseas-business:purchase:list",
"platform:overseas-business:truck:list",
"platform:overseas-business:looseboard:list");
assertThat(matrix).doesNotContain("WAREHOUSE_PICKER");
assertThat(matrix).doesNotContain("OVERSEAS_WAREHOUSE_PDA_OPERATOR");
assertThat(matrix).doesNotContain(":create'", ":edit'", ":status'", ":export'", ":adjust'");
assertThat(sql).contains("assert_phase4_warehouse_role_minimum", "<> 20",
"role.role_code IN ('WAREHOUSE_OPERATOR','WAREHOUSE_PICKER','WAREHOUSE_TALLY')");
"role.role_code IN ('WAREHOUSE_OPERATOR','OVERSEAS_WAREHOUSE_PDA_OPERATOR','WAREHOUSE_TALLY','CN_FIRSTLEG_PDA_OPERATOR')");
}
}
@@ -125,12 +125,12 @@ class OverseasPhase4PermissionSqlContractTest {
"permission.permission_code<>'lastleg:pda:operate'",
"role.id=4000005",
"assert_overseas_pda_picker_permission",
"存在非仓库拣货员授权",
"role.role_code='WAREHOUSE_PICKER'",
"存在非海外仓 PDA 作业员授权",
"role.role_code='OVERSEAS_WAREHOUSE_PDA_OPERATOR'",
"permission.permission_code='lastleg:pda:operate'",
"role.role_code='PLATFORM_ADMIN'",
"DELETE role_permission FROM");
int picker = sql.indexOf("role.role_code='WAREHOUSE_PICKER'");
int picker = sql.indexOf("role.role_code='OVERSEAS_WAREHOUSE_PDA_OPERATOR'");
int grantStart = sql.lastIndexOf("INSERT IGNORE INTO", picker);
int grantEnd = sql.indexOf(';', picker);
assertThat(grantStart).isGreaterThanOrEqualTo(0);
@@ -30,33 +30,35 @@ class WarehouseRoleSqlContractTest {
private static void assertWarehouseRoleContract(String sql) {
assertThat(sql)
.contains("(4000004, 0, 'PLATFORM', 'WAREHOUSE_OPERATOR', '仓库操作员', 'SYSTEM'")
.contains("(4000005, 0, 'PLATFORM', 'WAREHOUSE_PICKER', '仓库拣货员', 'SYSTEM'")
.contains("(4000006, 0, 'PLATFORM', 'WAREHOUSE_TALLY', '仓库理货员', 'SYSTEM'")
.contains("(4000004, 0, 'PLATFORM', 'WAREHOUSE_OPERATOR', '国内仓后台操作员', 'SYSTEM'")
.contains("(4000005, 0, 'PLATFORM', 'OVERSEAS_WAREHOUSE_PDA_OPERATOR', '海外仓 PDA 作业员', 'SYSTEM'")
.contains("(4000006, 0, 'PLATFORM', 'WAREHOUSE_TALLY', '国内仓理货复核员', 'SYSTEM'")
.contains("(4000007, 0, 'PLATFORM', 'CN_FIRSTLEG_PDA_OPERATOR', '国内头程 PDA 作业员', 'SYSTEM'")
.contains("ON DUPLICATE KEY UPDATE")
.contains("INSERT IGNORE INTO iam_role_permission")
.contains("'WAREHOUSE_PICKER', 'platform:firstleg:pda:work'")
.contains("'CN_FIRSTLEG_PDA_OPERATOR', 'platform:firstleg:pda:work'")
.contains("'WAREHOUSE_TALLY', 'platform:firstleg:pda:review'")
.contains("'WAREHOUSE_TALLY', 'platform:firstleg:inbound:loading:edit'")
.contains("'WAREHOUSE_OPERATOR', 'platform:firstleg:inbound:loading:edit'")
.contains("operator_permission_count <> 5")
.contains("picker_permission_count <> 2")
.contains("domestic_pda_permission_count <> 2")
.contains("tally_permission_count <> 12")
.contains("依赖的三期平台权限尚未完整部署")
.contains("DELETE role_permission")
.contains("expected.permission_code IS NULL")
.contains("role.role_code = 'WAREHOUSE_PICKER' AND permission.permission_code = 'lastleg:pda:operate'")
.contains("role.role_code = 'OVERSEAS_WAREHOUSE_PDA_OPERATOR' AND permission.permission_code = 'lastleg:pda:operate'")
.contains("最小权限授权未完整写入")
.contains("grant_row.tenant_id = 0) <> 19")
.contains("(6000004, 4000004, 0, 'TENANT', NULL)")
.contains("(6000005, 4000005, 0, 'TENANT', NULL)")
.contains("(6000006, 4000006, 0, 'TENANT', NULL)");
.contains("(6000006, 4000006, 0, 'TENANT', NULL)")
.contains("(6000007, 4000007, 0, 'TENANT', NULL)");
assertRoleGrant(sql, "WAREHOUSE_PICKER", "platform:firstleg:pda:work");
assertRoleGrant(sql, "CN_FIRSTLEG_PDA_OPERATOR", "platform:firstleg:pda:work");
assertRoleGrant(sql, "WAREHOUSE_TALLY", "platform:firstleg:pda:review");
assertRoleGrant(sql, "WAREHOUSE_OPERATOR", "platform:firstleg:inbound:loading:edit");
assertThat(roleGrantBlock(sql, "WAREHOUSE_PICKER"))
assertThat(roleGrantBlock(sql, "CN_FIRSTLEG_PDA_OPERATOR"))
.doesNotContain("platform:order")
.doesNotContain("platform:master-data")
.doesNotContain("platform:warehouse:list")
@@ -76,9 +78,9 @@ class WarehouseRoleSqlContractTest {
.doesNotContain("'WAREHOUSE_OPERATOR', 'platform:firstleg:inbound:loading:complete'")
.doesNotContain("'WAREHOUSE_OPERATOR', 'platform:firstleg:outbound-dispatch:confirm'")
.doesNotContain("'WAREHOUSE_OPERATOR', 'platform:firstleg:outbound-dispatch:reverse'")
.doesNotContain("'WAREHOUSE_PICKER', 'platform:firstleg:smart-loading:delete'")
.doesNotContain("'CN_FIRSTLEG_PDA_OPERATOR', 'platform:firstleg:smart-loading:delete'")
.doesNotContain("'WAREHOUSE_TALLY', 'firstleg:inbound:fee-detail:edit'")
.doesNotContain("'WAREHOUSE_PICKER', 'merchant:")
.doesNotContain("'CN_FIRSTLEG_PDA_OPERATOR', 'merchant:")
.doesNotContain("'WAREHOUSE_OPERATOR', 'merchant:")
.doesNotContain("'WAREHOUSE_TALLY', 'merchant:");
}
@@ -89,7 +91,7 @@ class WarehouseRoleSqlContractTest {
private static String roleGrantBlock(String sql, String roleCode) {
String marker = "-- " + switch (roleCode) {
case "WAREHOUSE_PICKER" -> "拣货员:";
case "CN_FIRSTLEG_PDA_OPERATOR" -> "国内头程 PDA 作业员:";
case "WAREHOUSE_TALLY" -> "理货员:";
default -> throw new IllegalArgumentException("unsupported role " + roleCode);
};
@@ -146,7 +146,7 @@ class PlatformUserManagementServiceTest {
@Test
void warehousePickerRequiresAndPersistsSingleOverseasWarehouseBinding() {
platformRole.setRoleCode("WAREHOUSE_PICKER");
platformRole.setRoleCode("OVERSEAS_WAREHOUSE_PDA_OPERATOR");
UpdateUserRequest missing = new UpdateUserRequest("张伟", "13800138000", null,
0L, List.of(40001L), null);
assertThrows(BizException.class,
@@ -161,9 +161,31 @@ class PlatformUserManagementServiceTest {
verify(auth).revokeSessions(eq("internal-token"), any());
}
@Test
void domesticAndOverseasPdaRolesAreMutuallyExclusive() {
IamRole domestic = new IamRole();
domestic.setId(40007L); domestic.setTenantId(0L); domestic.setAppCode("PLATFORM");
domestic.setRoleCode("CN_FIRSTLEG_PDA_OPERATOR"); domestic.setRoleName("国内头程 PDA 作业员");
domestic.setStatus("ACTIVE");
IamRole overseas = new IamRole();
overseas.setId(40005L); overseas.setTenantId(0L); overseas.setAppCode("PLATFORM");
overseas.setRoleCode("OVERSEAS_WAREHOUSE_PDA_OPERATOR"); overseas.setRoleName("海外仓 PDA 作业员");
overseas.setStatus("ACTIVE");
when(roles.selectById(40007L)).thenReturn(domestic);
when(roles.selectById(40005L)).thenReturn(overseas);
UpdateUserRequest request = new UpdateUserRequest("张伟", "13800138000", null,
0L, List.of(40007L, 40005L), 900L);
BizException error = assertThrows(BizException.class,
() -> service.update(30L, request, Set.of("platform:user:grant-role")));
assertTrue(error.getMessage().contains("不能同时分配"));
verify(auth, never()).scope(anyString(), anyLong(), any());
}
@Test
void changingWarehouseBindingRevokesAllAuthSessionsSoAccountVersionIsBumped() {
platformRole.setRoleCode("WAREHOUSE_PICKER");
platformRole.setRoleCode("OVERSEAS_WAREHOUSE_PDA_OPERATOR");
membership.setOverseasWarehouseId(900L);
UpdateUserRequest changed = new UpdateUserRequest("张伟", "13800138000", null,
0L, List.of(40001L), 901L);