feat: 部门岗位角色标识改用 organization_code,缺编码阻断提交

This commit is contained in:
2026-10-31 01:57:35 +08:00
parent 4929dbc3d3
commit 8953fc3088
12 changed files with 132 additions and 70 deletions
@@ -136,6 +136,24 @@ class ApprovalCompletionDraftIT {
assertThat(bizNo(instanceId)).isNull();
}
@Test
void rejectsSubmitWhenDepartmentCodeMissing() throws Exception {
Integer noCodeOrg = data.createOrganization("无编码部门" + data.uniqueSuffix(), 136);
data.clearOrganizationCode(noCodeOrg);
ApprovalTestData.TestUser noCodeReporter =
data.createUser("无编码报送人" + data.uniqueSuffix(), noCodeOrg);
long instanceId = createCompletion(noCodeReporter, noCodeOrg, TENANT, "无编码单据");
mockMvc.perform(authed(post("/api/approval/instance/" + instanceId + "/submit"),
noCodeReporter, noCodeOrg, TENANT, SUBMIT))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(1))
.andExpect(jsonPath("$.message").value(org.hamcrest.Matchers.containsString("部门未配置编码")));
assertThat(instanceStatus(instanceId)).isEqualTo("DRAFT");
assertThat(bizNo(instanceId)).isNull();
}
@Test
void rejectsSubmitWhenDepartmentLeaderRoleMissing() throws Exception {
long instanceId = createCompletion(reporter, organizationId, TENANT, "缺负责人");
@@ -263,7 +281,7 @@ class ApprovalCompletionDraftIT {
int otherTenant = 10023;
Integer otherOrg = data.createOrganization("外租户部门" + data.uniqueSuffix(), 136, otherTenant);
ApprovalTestData.TestUser otherReporter = data.createUser("外租户报送人" + data.uniqueSuffix(), otherOrg, otherTenant);
ApprovalTestData.TestRole otherLeaderRole = data.createRole("dept_leader_" + otherOrg, "外租户负责人", otherTenant);
ApprovalTestData.TestRole otherLeaderRole = data.createRole(data.leaderRoleCode(otherOrg), "外租户负责人", otherTenant);
ApprovalTestData.TestUser otherLeader = data.createUser("外租户负责人" + data.uniqueSuffix(), otherOrg, otherTenant);
data.bindTenant(otherLeader.userId, otherLeaderRole.roleId, otherTenant);
ApprovalTestData.TestRole otherArchivistRole = data.createRole("approval_archivist", "外租户收文员", otherTenant);
@@ -476,7 +494,7 @@ class ApprovalCompletionDraftIT {
}
private List<ApprovalTestData.TestUser> grantDepartmentLeader(int orgId, int tenant, int memberCount) {
ApprovalTestData.TestRole role = data.createRole("dept_leader_" + orgId, "部门负责人", tenant);
ApprovalTestData.TestRole role = data.createRole(data.leaderRoleCode(orgId), "部门负责人", tenant);
List<ApprovalTestData.TestUser> members = new ArrayList<>();
for (int i = 0; i < memberCount; i++) {
ApprovalTestData.TestUser member = data.createUser("负责人" + data.uniqueSuffix(), orgId, tenant);
@@ -69,7 +69,7 @@ class ApprovalConfirmArchiveIT {
organizationId = data.createOrganization("归档部门" + data.uniqueSuffix(), 136, TENANT);
reporter = data.createUser("归档报送人" + data.uniqueSuffix(), organizationId, TENANT);
ApprovalTestData.TestRole leaderRole =
data.createRole("dept_leader_" + organizationId, "部门负责人", TENANT);
data.createRole(data.leaderRoleCode(organizationId), "部门负责人", TENANT);
leader = data.createUser("归档负责人" + data.uniqueSuffix(), organizationId, TENANT);
data.bindTenant(leader.userId, leaderRole.roleId, TENANT);
@@ -368,8 +368,8 @@ class ApprovalCoordinationIT {
@Test
void allowsSamePersonToHandleBothApprovalNodes() throws Exception {
ApprovalTestData.TestUser both = data.createUser("双部门负责人" + data.uniqueSuffix(), reportOrgId);
ApprovalTestData.TestRole reportRole = data.createRole("dept_leader_" + reportOrgId, "部门负责人");
ApprovalTestData.TestRole acceptRole = data.createRole("dept_leader_" + acceptOrgId, "部门负责人");
ApprovalTestData.TestRole reportRole = data.createRole(data.leaderRoleCode(reportOrgId), "部门负责人");
ApprovalTestData.TestRole acceptRole = data.createRole(data.leaderRoleCode(acceptOrgId), "部门负责人");
data.bind(both.userId, reportRole.roleId);
data.bind(both.userId, acceptRole.roleId);
grantArchivist();
@@ -523,7 +523,7 @@ class ApprovalCoordinationIT {
}
private List<ApprovalTestData.TestUser> grantDepartmentLeader(int orgId, int memberCount) {
ApprovalTestData.TestRole role = data.createRole("dept_leader_" + orgId, "部门负责人");
ApprovalTestData.TestRole role = data.createRole(data.leaderRoleCode(orgId), "部门负责人");
List<ApprovalTestData.TestUser> members = new ArrayList<>();
for (int i = 0; i < memberCount; i++) {
ApprovalTestData.TestUser member = data.createUser("协调负责人" + data.uniqueSuffix(), orgId);
@@ -79,12 +79,12 @@ class ApprovalDispatchIT {
reporter = data.createUser("派单报送人" + data.uniqueSuffix(), reportOrgId, TENANT);
ApprovalTestData.TestRole reportLeaderRole =
data.createRole("dept_leader_" + reportOrgId, "报送部门负责人", TENANT);
data.createRole(data.leaderRoleCode(reportOrgId), "报送部门负责人", TENANT);
reportLeader = data.createUser("派单报送负责人" + data.uniqueSuffix(), reportOrgId, TENANT);
data.bindTenant(reportLeader.userId, reportLeaderRole.roleId, TENANT);
ApprovalTestData.TestRole acceptLeaderRole =
data.createRole("dept_leader_" + acceptOrgId, "受理部门负责人", TENANT);
data.createRole(data.leaderRoleCode(acceptOrgId), "受理部门负责人", TENANT);
acceptLeader = data.createUser("派单受理负责人" + data.uniqueSuffix(), acceptOrgId, TENANT);
data.bindTenant(acceptLeader.userId, acceptLeaderRole.roleId, TENANT);
acceptMember = data.createUser("派单受理成员" + data.uniqueSuffix(), acceptOrgId, TENANT);
@@ -66,7 +66,7 @@ class ApprovalPcTodoIT {
organizationId = data.createOrganization("PC待办部门" + data.uniqueSuffix(), 136);
reporter = data.createUser("PC报送人" + data.uniqueSuffix(), organizationId);
ApprovalTestData.TestRole leaderRole =
data.createRole("dept_leader_" + organizationId, "部门负责人");
data.createRole(data.leaderRoleCode(organizationId), "部门负责人");
leader = data.createUser("PC负责人" + data.uniqueSuffix(), organizationId);
data.bind(leader.userId, leaderRole.roleId);
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
@@ -319,7 +319,7 @@ class ApprovalQueryIT {
}
private void grantDepartmentLeader() {
ApprovalTestData.TestRole role = data.createRole("dept_leader_" + reportOrgId, "部门负责人");
ApprovalTestData.TestRole role = data.createRole(data.leaderRoleCode(reportOrgId), "部门负责人");
ApprovalTestData.TestUser leader = data.createUser("负责人" + data.uniqueSuffix(), reportOrgId);
data.bind(leader.userId, role.roleId);
}
@@ -65,7 +65,7 @@ class ApprovalTaskIT {
organizationId = data.createOrganization("任务部门" + data.uniqueSuffix(), 136);
reporter = data.createUser("任务报送人" + data.uniqueSuffix(), organizationId);
ApprovalTestData.TestRole leaderRole =
data.createRole("dept_leader_" + organizationId, "部门负责人");
data.createRole(data.leaderRoleCode(organizationId), "部门负责人");
leader = data.createUser("任务负责人" + data.uniqueSuffix(), organizationId);
data.bind(leader.userId, leaderRole.roleId);
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
@@ -167,7 +167,7 @@ class ApprovalTaskIT {
ApprovalTestData.TestUser second =
data.createUser("第二负责人" + data.uniqueSuffix(), organizationId);
Integer leaderRoleId = data.server().queryForObject("SELECT role_id FROM sys_role WHERE role_code = ? AND tenant_id = ?",
Integer.class, "dept_leader_" + organizationId, TENANT);
Integer.class, data.leaderRoleCode(organizationId), TENANT);
data.bind(second.userId, leaderRoleId);
long instanceId = createAndSubmit("或签取消");
@@ -243,7 +243,7 @@ class ApprovalTaskIT {
@Test
void allowsReporterToApproveOwnTask() throws Exception {
Integer leaderRoleId = data.server().queryForObject("SELECT role_id FROM sys_role WHERE role_code = ? AND tenant_id = ?",
Integer.class, "dept_leader_" + organizationId, TENANT);
Integer.class, data.leaderRoleCode(organizationId), TENANT);
data.bind(reporter.userId, leaderRoleId);
long instanceId = createAndSubmit("自审单据");
@@ -80,10 +80,11 @@ public class ApprovalTestData {
}
public Integer createOrganization(String name, int parentId, int tenantId) {
String code = "T_" + uniqueSuffix();
Integer id = insert(server,
"INSERT INTO sys_organization (organization_name, parent_id, organization_type, deleted, tenant_id) "
+ "VALUES (?, ?, 'dept', 0, ?)",
name, parentId, tenantId);
"INSERT INTO sys_organization (organization_name, organization_code, parent_id, organization_type, deleted, tenant_id) "
+ "VALUES (?, ?, ?, 'dept', 0, ?)",
name, code, parentId, tenantId);
organizationIds.add(id);
return id;
}
@@ -92,6 +93,20 @@ public class ApprovalTestData {
return createOrganization(name, parentId, TestAuthentication.TENANT_ID);
}
public String organizationCode(Integer organizationId) {
return server.queryForObject(
"SELECT organization_code FROM sys_organization WHERE organization_id = ?",
String.class, organizationId);
}
public String leaderRoleCode(Integer organizationId) {
return "dept_leader_" + organizationCode(organizationId);
}
public void clearOrganizationCode(int organizationId) {
server.update("UPDATE sys_organization SET organization_code = NULL WHERE organization_id = ?", organizationId);
}
public void disableOrganization(int organizationId) {
server.update("UPDATE sys_organization SET deleted = 1 WHERE organization_id = ?", organizationId);
}