feat: 部门岗位角色标识改用 organization_code,缺编码阻断提交
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
--
|
--
|
||||||
-- 覆盖 0630 九类线下审批涉及的部门与岗位:
|
-- 覆盖 0630 九类线下审批涉及的部门与岗位:
|
||||||
-- 部门:场馆部、运营管理部、安全运保部、财务部(均为新建,不复用历史部门)
|
-- 部门:场馆部、运营管理部、安全运保部、财务部(均为新建,不复用历史部门)
|
||||||
-- 部门岗位:dept_leader_<orgId>(负责人)、dept_deputy_<orgId>(分管领导)
|
-- 部门岗位:dept_leader_<orgCode>(负责人)、dept_deputy_<orgCode>(分管领导)
|
||||||
-- 租户岗位:approval_archivist(收文员)、approval_general_manager(总经理/主要领导)、
|
-- 租户岗位:approval_archivist(收文员)、approval_general_manager(总经理/主要领导)、
|
||||||
-- approval_cashier(出纳)、approval_typist(录入员)、approval_issuer(发放人)
|
-- approval_cashier(出纳)、approval_typist(录入员)、approval_issuer(发放人)
|
||||||
--
|
--
|
||||||
@@ -41,8 +41,7 @@ SELECT @root_id, '运营管理部', '运营管理部', 'APPROVAL_OPS',
|
|||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
SELECT 1 FROM sys_organization
|
SELECT 1 FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_OPS'
|
||||||
AND (organization_code = 'APPROVAL_OPS' OR organization_name = '运营管理部')
|
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_organization
|
INSERT INTO sys_organization
|
||||||
@@ -54,8 +53,7 @@ SELECT @root_id, '安全运保部', '安全运保部', 'APPROVAL_SAFETY',
|
|||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
SELECT 1 FROM sys_organization
|
SELECT 1 FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_SAFETY'
|
||||||
AND (organization_code = 'APPROVAL_SAFETY' OR organization_name IN ('安全运保部', '运保部'))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_organization
|
INSERT INTO sys_organization
|
||||||
@@ -67,98 +65,94 @@ SELECT @root_id, '财务部', '财务部', 'APPROVAL_FINANCE',
|
|||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE NOT EXISTS (
|
WHERE NOT EXISTS (
|
||||||
SELECT 1 FROM sys_organization
|
SELECT 1 FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_FINANCE'
|
||||||
AND (organization_code = 'APPROVAL_FINANCE' OR organization_name = '财务部')
|
|
||||||
);
|
);
|
||||||
|
|
||||||
SET @venue_id := (
|
SET @venue_code := (
|
||||||
SELECT organization_id FROM sys_organization
|
SELECT organization_code FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_VENUE'
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_VENUE'
|
||||||
ORDER BY organization_id LIMIT 1
|
ORDER BY organization_id LIMIT 1
|
||||||
);
|
);
|
||||||
SET @ops_id := (
|
SET @ops_code := (
|
||||||
SELECT organization_id FROM sys_organization
|
SELECT organization_code FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_OPS'
|
||||||
AND (organization_code = 'APPROVAL_OPS' OR organization_name = '运营管理部')
|
|
||||||
ORDER BY organization_id LIMIT 1
|
ORDER BY organization_id LIMIT 1
|
||||||
);
|
);
|
||||||
SET @safety_id := (
|
SET @safety_code := (
|
||||||
SELECT organization_id FROM sys_organization
|
SELECT organization_code FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_SAFETY'
|
||||||
AND (organization_code = 'APPROVAL_SAFETY' OR organization_name IN ('安全运保部', '运保部'))
|
|
||||||
ORDER BY organization_id LIMIT 1
|
ORDER BY organization_id LIMIT 1
|
||||||
);
|
);
|
||||||
SET @finance_id := (
|
SET @finance_code := (
|
||||||
SELECT organization_id FROM sys_organization
|
SELECT organization_code FROM sys_organization
|
||||||
WHERE tenant_id = @tenant_id AND deleted = 0
|
WHERE tenant_id = @tenant_id AND deleted = 0 AND organization_code = 'APPROVAL_FINANCE'
|
||||||
AND (organization_code = 'APPROVAL_FINANCE' OR organization_name = '财务部')
|
|
||||||
ORDER BY organization_id LIMIT 1
|
ORDER BY organization_id LIMIT 1
|
||||||
);
|
);
|
||||||
|
|
||||||
-- ---------------------------------------------------------------- 部门负责人(或签)
|
-- ---------------------------------------------------------------- 部门负责人(或签)
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '场馆部负责人', CONCAT('dept_leader_', @venue_id), '审批种子:场馆部负责人,多人或签', 901, @tenant_id, 0
|
SELECT '场馆部负责人', CONCAT('dept_leader_', @venue_code), '审批种子:场馆部负责人,多人或签', 901, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @venue_id IS NOT NULL AND NOT EXISTS (
|
WHERE @venue_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_leader_', @venue_id)
|
AND role_code = CONCAT('dept_leader_', @venue_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '运营管理部负责人', CONCAT('dept_leader_', @ops_id), '审批种子:运营管理部负责人,多人或签', 902, @tenant_id, 0
|
SELECT '运营管理部负责人', CONCAT('dept_leader_', @ops_code), '审批种子:运营管理部负责人,多人或签', 902, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @ops_id IS NOT NULL AND NOT EXISTS (
|
WHERE @ops_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_leader_', @ops_id)
|
AND role_code = CONCAT('dept_leader_', @ops_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '安全运保部负责人', CONCAT('dept_leader_', @safety_id), '审批种子:安全运保部负责人,多人或签', 903, @tenant_id, 0
|
SELECT '安全运保部负责人', CONCAT('dept_leader_', @safety_code), '审批种子:安全运保部负责人,多人或签', 903, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @safety_id IS NOT NULL AND NOT EXISTS (
|
WHERE @safety_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_leader_', @safety_id)
|
AND role_code = CONCAT('dept_leader_', @safety_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '财务部负责人', CONCAT('dept_leader_', @finance_id), '审批种子:财务部负责人,多人或签', 904, @tenant_id, 0
|
SELECT '财务部负责人', CONCAT('dept_leader_', @finance_code), '审批种子:财务部负责人,多人或签', 904, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @finance_id IS NOT NULL AND NOT EXISTS (
|
WHERE @finance_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_leader_', @finance_id)
|
AND role_code = CONCAT('dept_leader_', @finance_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
-- ---------------------------------------------------------------- 部门分管领导(二期使用,或签)
|
-- ---------------------------------------------------------------- 部门分管领导(二期使用,或签)
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '场馆部分管领导', CONCAT('dept_deputy_', @venue_id), '审批种子:场馆部分管领导,多人或签', 911, @tenant_id, 0
|
SELECT '场馆部分管领导', CONCAT('dept_deputy_', @venue_code), '审批种子:场馆部分管领导,多人或签', 911, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @venue_id IS NOT NULL AND NOT EXISTS (
|
WHERE @venue_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_deputy_', @venue_id)
|
AND role_code = CONCAT('dept_deputy_', @venue_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '运营管理部分管领导', CONCAT('dept_deputy_', @ops_id), '审批种子:运营管理部分管领导,多人或签', 912, @tenant_id, 0
|
SELECT '运营管理部分管领导', CONCAT('dept_deputy_', @ops_code), '审批种子:运营管理部分管领导,多人或签', 912, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @ops_id IS NOT NULL AND NOT EXISTS (
|
WHERE @ops_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_deputy_', @ops_id)
|
AND role_code = CONCAT('dept_deputy_', @ops_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '安全运保部分管领导', CONCAT('dept_deputy_', @safety_id), '审批种子:安全运保部分管领导,多人或签', 913, @tenant_id, 0
|
SELECT '安全运保部分管领导', CONCAT('dept_deputy_', @safety_code), '审批种子:安全运保部分管领导,多人或签', 913, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @safety_id IS NOT NULL AND NOT EXISTS (
|
WHERE @safety_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_deputy_', @safety_id)
|
AND role_code = CONCAT('dept_deputy_', @safety_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
INSERT INTO sys_role (role_name, role_code, comments, sort_number, tenant_id, deleted)
|
||||||
SELECT '财务部分管领导', CONCAT('dept_deputy_', @finance_id), '审批种子:财务部分管领导,多人或签', 914, @tenant_id, 0
|
SELECT '财务部分管领导', CONCAT('dept_deputy_', @finance_code), '审批种子:财务部分管领导,多人或签', 914, @tenant_id, 0
|
||||||
FROM DUAL
|
FROM DUAL
|
||||||
WHERE @finance_id IS NOT NULL AND NOT EXISTS (
|
WHERE @finance_code IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
SELECT 1 FROM sys_role WHERE tenant_id = @tenant_id AND deleted = 0
|
||||||
AND role_code = CONCAT('dept_deputy_', @finance_id)
|
AND role_code = CONCAT('dept_deputy_', @finance_code)
|
||||||
);
|
);
|
||||||
|
|
||||||
-- ---------------------------------------------------------------- 租户岗位(或签)
|
-- ---------------------------------------------------------------- 租户岗位(或签)
|
||||||
|
|||||||
@@ -186,7 +186,23 @@ public final class ApprovalConstants {
|
|||||||
return STATUS_ARCHIVED.equals(status) ? "单据已归档,不能修改" : "当前状态不可修改";
|
return STATUS_ARCHIVED.equals(status) ? "单据已归档,不能修改" : "当前状态不可修改";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String departmentLeaderRoleCode(Integer organizationId) {
|
/**
|
||||||
return organizationId == null ? null : "dept_leader_" + organizationId;
|
* 部门岗位角色标识:后缀取启用组织的 organization_code。
|
||||||
|
* 部门未配置编码时返回 null,由调用方阻断并提示。
|
||||||
|
*/
|
||||||
|
public static String departmentLeaderRoleCode(String organizationCode) {
|
||||||
|
return departmentRoleCode("dept_leader_", organizationCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String departmentDeputyRoleCode(String organizationCode) {
|
||||||
|
return departmentRoleCode("dept_deputy_", organizationCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String departmentRoleCode(String prefix, String organizationCode) {
|
||||||
|
if (organizationCode == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String code = organizationCode.trim();
|
||||||
|
return code.isEmpty() ? null : prefix + code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,8 +161,11 @@ public class ApprovalInstanceService {
|
|||||||
if (organization == null) {
|
if (organization == null) {
|
||||||
throw new BusinessException("未归属部门,无法提交");
|
throw new BusinessException("未归属部门,无法提交");
|
||||||
}
|
}
|
||||||
List<ApprovalUserVO> leaders = directoryService.listRoleMembers(
|
String leaderRoleCode = ApprovalConstants.departmentLeaderRoleCode(organization.getOrganizationCode());
|
||||||
ApprovalConstants.departmentLeaderRoleCode(organizationId));
|
if (leaderRoleCode == null) {
|
||||||
|
throw new BusinessException("部门未配置编码,无法提交");
|
||||||
|
}
|
||||||
|
List<ApprovalUserVO> leaders = directoryService.listRoleMembers(leaderRoleCode);
|
||||||
if (leaders.isEmpty()) {
|
if (leaders.isEmpty()) {
|
||||||
throw new BusinessException("报送部门负责人角色缺配");
|
throw new BusinessException("报送部门负责人角色缺配");
|
||||||
}
|
}
|
||||||
@@ -193,13 +196,17 @@ public class ApprovalInstanceService {
|
|||||||
if (acceptOrgId == null || acceptOrgId <= 0) {
|
if (acceptOrgId == null || acceptOrgId <= 0) {
|
||||||
throw new BusinessException("请选择受理部门");
|
throw new BusinessException("请选择受理部门");
|
||||||
}
|
}
|
||||||
if (directoryService.listRoleMembers(ApprovalConstants.departmentLeaderRoleCode(acceptOrgId)).isEmpty()) {
|
|
||||||
throw new BusinessException("受理部门负责人角色缺配");
|
|
||||||
}
|
|
||||||
ApprovalOrganizationVO acceptOrganization = directoryService.getOrganization(acceptOrgId);
|
ApprovalOrganizationVO acceptOrganization = directoryService.getOrganization(acceptOrgId);
|
||||||
if (acceptOrganization == null) {
|
if (acceptOrganization == null) {
|
||||||
throw new BusinessException("受理部门已停用");
|
throw new BusinessException("受理部门已停用");
|
||||||
}
|
}
|
||||||
|
String leaderRoleCode = ApprovalConstants.departmentLeaderRoleCode(acceptOrganization.getOrganizationCode());
|
||||||
|
if (leaderRoleCode == null) {
|
||||||
|
throw new BusinessException("受理部门未配置编码");
|
||||||
|
}
|
||||||
|
if (directoryService.listRoleMembers(leaderRoleCode).isEmpty()) {
|
||||||
|
throw new BusinessException("受理部门负责人角色缺配");
|
||||||
|
}
|
||||||
return acceptOrganization;
|
return acceptOrganization;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.gxwebsoft.approval.param.ApprovalTaskDispatchParam;
|
|||||||
import com.gxwebsoft.approval.support.ApprovalApprover;
|
import com.gxwebsoft.approval.support.ApprovalApprover;
|
||||||
import com.gxwebsoft.approval.support.ApprovalNode;
|
import com.gxwebsoft.approval.support.ApprovalNode;
|
||||||
import com.gxwebsoft.approval.vo.ApprovalAssignVO;
|
import com.gxwebsoft.approval.vo.ApprovalAssignVO;
|
||||||
|
import com.gxwebsoft.approval.vo.ApprovalOrganizationVO;
|
||||||
import com.gxwebsoft.approval.vo.ApprovalUserVO;
|
import com.gxwebsoft.approval.vo.ApprovalUserVO;
|
||||||
import com.gxwebsoft.common.core.exception.BusinessException;
|
import com.gxwebsoft.common.core.exception.BusinessException;
|
||||||
import com.gxwebsoft.common.system.entity.User;
|
import com.gxwebsoft.common.system.entity.User;
|
||||||
@@ -545,9 +546,9 @@ public class ApprovalTaskService {
|
|||||||
}
|
}
|
||||||
switch (resolver) {
|
switch (resolver) {
|
||||||
case RESOLVER_REPORTER_ORG_LEADER:
|
case RESOLVER_REPORTER_ORG_LEADER:
|
||||||
return roleApprovers(ApprovalConstants.departmentLeaderRoleCode(instance.getReportOrgId()));
|
return departmentLeaderApprovers(instance.getReportOrgId());
|
||||||
case RESOLVER_ACCEPT_ORG_LEADER:
|
case RESOLVER_ACCEPT_ORG_LEADER:
|
||||||
return roleApprovers(ApprovalConstants.departmentLeaderRoleCode(instance.getAcceptOrgId()));
|
return departmentLeaderApprovers(instance.getAcceptOrgId());
|
||||||
case RESOLVER_ARCHIVIST:
|
case RESOLVER_ARCHIVIST:
|
||||||
return roleApprovers(ApprovalConstants.ROLE_ARCHIVIST);
|
return roleApprovers(ApprovalConstants.ROLE_ARCHIVIST);
|
||||||
case RESOLVER_REPORTER:
|
case RESOLVER_REPORTER:
|
||||||
@@ -561,6 +562,17 @@ public class ApprovalTaskService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门负责人审批人:按部门 organization_code 解析角色;部门或编码缺失时返回空列表,
|
||||||
|
* 节点保持缺配状态,等待管理员补配置。
|
||||||
|
*/
|
||||||
|
private List<ApprovalApprover> departmentLeaderApprovers(Integer organizationId) {
|
||||||
|
ApprovalOrganizationVO organization = directoryService.getOrganization(organizationId);
|
||||||
|
String roleCode = organization == null
|
||||||
|
? null : ApprovalConstants.departmentLeaderRoleCode(organization.getOrganizationCode());
|
||||||
|
return roleCode == null ? Collections.emptyList() : roleApprovers(roleCode);
|
||||||
|
}
|
||||||
|
|
||||||
private List<Integer> confirmCandidateIds(ApprovalInstance instance) {
|
private List<Integer> confirmCandidateIds(ApprovalInstance instance) {
|
||||||
List<Integer> ids = new ArrayList<>();
|
List<Integer> ids = new ArrayList<>();
|
||||||
if (instance.getReporterId() != null) {
|
if (instance.getReporterId() != null) {
|
||||||
|
|||||||
@@ -136,6 +136,24 @@ class ApprovalCompletionDraftIT {
|
|||||||
assertThat(bizNo(instanceId)).isNull();
|
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
|
@Test
|
||||||
void rejectsSubmitWhenDepartmentLeaderRoleMissing() throws Exception {
|
void rejectsSubmitWhenDepartmentLeaderRoleMissing() throws Exception {
|
||||||
long instanceId = createCompletion(reporter, organizationId, TENANT, "缺负责人");
|
long instanceId = createCompletion(reporter, organizationId, TENANT, "缺负责人");
|
||||||
@@ -263,7 +281,7 @@ class ApprovalCompletionDraftIT {
|
|||||||
int otherTenant = 10023;
|
int otherTenant = 10023;
|
||||||
Integer otherOrg = data.createOrganization("外租户部门" + data.uniqueSuffix(), 136, otherTenant);
|
Integer otherOrg = data.createOrganization("外租户部门" + data.uniqueSuffix(), 136, otherTenant);
|
||||||
ApprovalTestData.TestUser otherReporter = data.createUser("外租户报送人" + data.uniqueSuffix(), otherOrg, 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);
|
ApprovalTestData.TestUser otherLeader = data.createUser("外租户负责人" + data.uniqueSuffix(), otherOrg, otherTenant);
|
||||||
data.bindTenant(otherLeader.userId, otherLeaderRole.roleId, otherTenant);
|
data.bindTenant(otherLeader.userId, otherLeaderRole.roleId, otherTenant);
|
||||||
ApprovalTestData.TestRole otherArchivistRole = data.createRole("approval_archivist", "外租户收文员", 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) {
|
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<>();
|
List<ApprovalTestData.TestUser> members = new ArrayList<>();
|
||||||
for (int i = 0; i < memberCount; i++) {
|
for (int i = 0; i < memberCount; i++) {
|
||||||
ApprovalTestData.TestUser member = data.createUser("负责人" + data.uniqueSuffix(), orgId, tenant);
|
ApprovalTestData.TestUser member = data.createUser("负责人" + data.uniqueSuffix(), orgId, tenant);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class ApprovalConfirmArchiveIT {
|
|||||||
organizationId = data.createOrganization("归档部门" + data.uniqueSuffix(), 136, TENANT);
|
organizationId = data.createOrganization("归档部门" + data.uniqueSuffix(), 136, TENANT);
|
||||||
reporter = data.createUser("归档报送人" + data.uniqueSuffix(), organizationId, TENANT);
|
reporter = data.createUser("归档报送人" + data.uniqueSuffix(), organizationId, TENANT);
|
||||||
ApprovalTestData.TestRole leaderRole =
|
ApprovalTestData.TestRole leaderRole =
|
||||||
data.createRole("dept_leader_" + organizationId, "部门负责人", TENANT);
|
data.createRole(data.leaderRoleCode(organizationId), "部门负责人", TENANT);
|
||||||
leader = data.createUser("归档负责人" + data.uniqueSuffix(), organizationId, TENANT);
|
leader = data.createUser("归档负责人" + data.uniqueSuffix(), organizationId, TENANT);
|
||||||
data.bindTenant(leader.userId, leaderRole.roleId, TENANT);
|
data.bindTenant(leader.userId, leaderRole.roleId, TENANT);
|
||||||
|
|
||||||
|
|||||||
@@ -368,8 +368,8 @@ class ApprovalCoordinationIT {
|
|||||||
@Test
|
@Test
|
||||||
void allowsSamePersonToHandleBothApprovalNodes() throws Exception {
|
void allowsSamePersonToHandleBothApprovalNodes() throws Exception {
|
||||||
ApprovalTestData.TestUser both = data.createUser("双部门负责人" + data.uniqueSuffix(), reportOrgId);
|
ApprovalTestData.TestUser both = data.createUser("双部门负责人" + data.uniqueSuffix(), reportOrgId);
|
||||||
ApprovalTestData.TestRole reportRole = data.createRole("dept_leader_" + reportOrgId, "部门负责人");
|
ApprovalTestData.TestRole reportRole = data.createRole(data.leaderRoleCode(reportOrgId), "部门负责人");
|
||||||
ApprovalTestData.TestRole acceptRole = data.createRole("dept_leader_" + acceptOrgId, "部门负责人");
|
ApprovalTestData.TestRole acceptRole = data.createRole(data.leaderRoleCode(acceptOrgId), "部门负责人");
|
||||||
data.bind(both.userId, reportRole.roleId);
|
data.bind(both.userId, reportRole.roleId);
|
||||||
data.bind(both.userId, acceptRole.roleId);
|
data.bind(both.userId, acceptRole.roleId);
|
||||||
grantArchivist();
|
grantArchivist();
|
||||||
@@ -523,7 +523,7 @@ class ApprovalCoordinationIT {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<ApprovalTestData.TestUser> grantDepartmentLeader(int orgId, int memberCount) {
|
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<>();
|
List<ApprovalTestData.TestUser> members = new ArrayList<>();
|
||||||
for (int i = 0; i < memberCount; i++) {
|
for (int i = 0; i < memberCount; i++) {
|
||||||
ApprovalTestData.TestUser member = data.createUser("协调负责人" + data.uniqueSuffix(), orgId);
|
ApprovalTestData.TestUser member = data.createUser("协调负责人" + data.uniqueSuffix(), orgId);
|
||||||
|
|||||||
@@ -79,12 +79,12 @@ class ApprovalDispatchIT {
|
|||||||
reporter = data.createUser("派单报送人" + data.uniqueSuffix(), reportOrgId, TENANT);
|
reporter = data.createUser("派单报送人" + data.uniqueSuffix(), reportOrgId, TENANT);
|
||||||
|
|
||||||
ApprovalTestData.TestRole reportLeaderRole =
|
ApprovalTestData.TestRole reportLeaderRole =
|
||||||
data.createRole("dept_leader_" + reportOrgId, "报送部门负责人", TENANT);
|
data.createRole(data.leaderRoleCode(reportOrgId), "报送部门负责人", TENANT);
|
||||||
reportLeader = data.createUser("派单报送负责人" + data.uniqueSuffix(), reportOrgId, TENANT);
|
reportLeader = data.createUser("派单报送负责人" + data.uniqueSuffix(), reportOrgId, TENANT);
|
||||||
data.bindTenant(reportLeader.userId, reportLeaderRole.roleId, TENANT);
|
data.bindTenant(reportLeader.userId, reportLeaderRole.roleId, TENANT);
|
||||||
|
|
||||||
ApprovalTestData.TestRole acceptLeaderRole =
|
ApprovalTestData.TestRole acceptLeaderRole =
|
||||||
data.createRole("dept_leader_" + acceptOrgId, "受理部门负责人", TENANT);
|
data.createRole(data.leaderRoleCode(acceptOrgId), "受理部门负责人", TENANT);
|
||||||
acceptLeader = data.createUser("派单受理负责人" + data.uniqueSuffix(), acceptOrgId, TENANT);
|
acceptLeader = data.createUser("派单受理负责人" + data.uniqueSuffix(), acceptOrgId, TENANT);
|
||||||
data.bindTenant(acceptLeader.userId, acceptLeaderRole.roleId, TENANT);
|
data.bindTenant(acceptLeader.userId, acceptLeaderRole.roleId, TENANT);
|
||||||
acceptMember = data.createUser("派单受理成员" + data.uniqueSuffix(), acceptOrgId, TENANT);
|
acceptMember = data.createUser("派单受理成员" + data.uniqueSuffix(), acceptOrgId, TENANT);
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class ApprovalPcTodoIT {
|
|||||||
organizationId = data.createOrganization("PC待办部门" + data.uniqueSuffix(), 136);
|
organizationId = data.createOrganization("PC待办部门" + data.uniqueSuffix(), 136);
|
||||||
reporter = data.createUser("PC报送人" + data.uniqueSuffix(), organizationId);
|
reporter = data.createUser("PC报送人" + data.uniqueSuffix(), organizationId);
|
||||||
ApprovalTestData.TestRole leaderRole =
|
ApprovalTestData.TestRole leaderRole =
|
||||||
data.createRole("dept_leader_" + organizationId, "部门负责人");
|
data.createRole(data.leaderRoleCode(organizationId), "部门负责人");
|
||||||
leader = data.createUser("PC负责人" + data.uniqueSuffix(), organizationId);
|
leader = data.createUser("PC负责人" + data.uniqueSuffix(), organizationId);
|
||||||
data.bind(leader.userId, leaderRole.roleId);
|
data.bind(leader.userId, leaderRole.roleId);
|
||||||
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
|
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ class ApprovalQueryIT {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void grantDepartmentLeader() {
|
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);
|
ApprovalTestData.TestUser leader = data.createUser("负责人" + data.uniqueSuffix(), reportOrgId);
|
||||||
data.bind(leader.userId, role.roleId);
|
data.bind(leader.userId, role.roleId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class ApprovalTaskIT {
|
|||||||
organizationId = data.createOrganization("任务部门" + data.uniqueSuffix(), 136);
|
organizationId = data.createOrganization("任务部门" + data.uniqueSuffix(), 136);
|
||||||
reporter = data.createUser("任务报送人" + data.uniqueSuffix(), organizationId);
|
reporter = data.createUser("任务报送人" + data.uniqueSuffix(), organizationId);
|
||||||
ApprovalTestData.TestRole leaderRole =
|
ApprovalTestData.TestRole leaderRole =
|
||||||
data.createRole("dept_leader_" + organizationId, "部门负责人");
|
data.createRole(data.leaderRoleCode(organizationId), "部门负责人");
|
||||||
leader = data.createUser("任务负责人" + data.uniqueSuffix(), organizationId);
|
leader = data.createUser("任务负责人" + data.uniqueSuffix(), organizationId);
|
||||||
data.bind(leader.userId, leaderRole.roleId);
|
data.bind(leader.userId, leaderRole.roleId);
|
||||||
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
|
ApprovalTestData.TestRole archivistRole = data.createRole("approval_archivist", "收文员");
|
||||||
@@ -167,7 +167,7 @@ class ApprovalTaskIT {
|
|||||||
ApprovalTestData.TestUser second =
|
ApprovalTestData.TestUser second =
|
||||||
data.createUser("第二负责人" + data.uniqueSuffix(), organizationId);
|
data.createUser("第二负责人" + data.uniqueSuffix(), organizationId);
|
||||||
Integer leaderRoleId = data.server().queryForObject("SELECT role_id FROM sys_role WHERE role_code = ? AND tenant_id = ?",
|
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);
|
data.bind(second.userId, leaderRoleId);
|
||||||
|
|
||||||
long instanceId = createAndSubmit("或签取消");
|
long instanceId = createAndSubmit("或签取消");
|
||||||
@@ -243,7 +243,7 @@ class ApprovalTaskIT {
|
|||||||
@Test
|
@Test
|
||||||
void allowsReporterToApproveOwnTask() throws Exception {
|
void allowsReporterToApproveOwnTask() throws Exception {
|
||||||
Integer leaderRoleId = data.server().queryForObject("SELECT role_id FROM sys_role WHERE role_code = ? AND tenant_id = ?",
|
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);
|
data.bind(reporter.userId, leaderRoleId);
|
||||||
|
|
||||||
long instanceId = createAndSubmit("自审单据");
|
long instanceId = createAndSubmit("自审单据");
|
||||||
|
|||||||
@@ -80,10 +80,11 @@ public class ApprovalTestData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Integer createOrganization(String name, int parentId, int tenantId) {
|
public Integer createOrganization(String name, int parentId, int tenantId) {
|
||||||
|
String code = "T_" + uniqueSuffix();
|
||||||
Integer id = insert(server,
|
Integer id = insert(server,
|
||||||
"INSERT INTO sys_organization (organization_name, parent_id, organization_type, deleted, tenant_id) "
|
"INSERT INTO sys_organization (organization_name, organization_code, parent_id, organization_type, deleted, tenant_id) "
|
||||||
+ "VALUES (?, ?, 'dept', 0, ?)",
|
+ "VALUES (?, ?, ?, 'dept', 0, ?)",
|
||||||
name, parentId, tenantId);
|
name, code, parentId, tenantId);
|
||||||
organizationIds.add(id);
|
organizationIds.add(id);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@@ -92,6 +93,20 @@ public class ApprovalTestData {
|
|||||||
return createOrganization(name, parentId, TestAuthentication.TENANT_ID);
|
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) {
|
public void disableOrganization(int organizationId) {
|
||||||
server.update("UPDATE sys_organization SET deleted = 1 WHERE organization_id = ?", organizationId);
|
server.update("UPDATE sys_organization SET deleted = 1 WHERE organization_id = ?", organizationId);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user