Skip to content

Commit 1ed9a54

Browse files
committed
refactor: approval flow get status permission setting
1 parent 8674655 commit 1ed9a54

9 files changed

Lines changed: 96 additions & 38 deletions

File tree

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
package cn.cordys.crm.approval.constants;
22

3+
import cn.cordys.common.constants.ValueEnum;
4+
35
/**
46
* 表单类型枚举
57
*/
6-
public enum ApprovalFormTypeEnum {
8+
public enum ApprovalFormTypeEnum implements ValueEnum<String> {
79

810
/** 报价 */
9-
QUOTATION("QTE-APV", "OPPORTUNITY_MANAGEMENT_QUOTATION"),
11+
QUOTATION("QTE-APV", "OPPORTUNITY_MANAGEMENT_QUOTATION", "quotation"),
1012
/** 合同 */
11-
CONTRACT("CTR-APV", "CONTRACT"),
13+
CONTRACT("CTR-APV", "CONTRACT", "contract"),
1214
/** 发票 */
13-
INVOICE("INV-APV", "CONTRACT_INVOICE"),
15+
INVOICE("INV-APV", "CONTRACT_INVOICE", "invoice"),
1416
/** 订单 */
15-
ORDER("ORD-APV", "ORDER");
17+
ORDER("ORD-APV", "ORDER", "order");
1618

1719
private final String prefix;
1820
private final String permissionId;
21+
private final String value;
1922

20-
ApprovalFormTypeEnum(String prefix, String permissionId) {
23+
ApprovalFormTypeEnum(String prefix, String permissionId, String value) {
2124
this.prefix = prefix;
2225
this.permissionId = permissionId;
26+
this.value = value;
2327
}
2428

2529
public String getPrefix() {
@@ -29,4 +33,17 @@ public String getPrefix() {
2933
public String getPermissionId() {
3034
return permissionId;
3135
}
36+
37+
public static ApprovalFormTypeEnum getByValue(String value) {
38+
for (ApprovalFormTypeEnum type : values()) {
39+
if (type.value.equals(value)) {
40+
return type;
41+
}
42+
}
43+
return null;
44+
}
45+
46+
public String getValue() {
47+
return value;
48+
}
3249
}

backend/crm/src/main/java/cn/cordys/crm/approval/controller/ApprovalFlowController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import cn.cordys.common.constants.PermissionConstants;
77
import cn.cordys.common.pager.Pager;
88
import cn.cordys.context.OrganizationContext;
9-
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
109
import cn.cordys.crm.approval.dto.response.ApprovalFlowDetailResponse;
1110
import cn.cordys.crm.approval.dto.response.ApprovalFlowListResponse;
11+
import cn.cordys.crm.approval.dto.response.StatusPermissionSettingResponse;
1212
import cn.cordys.crm.approval.dto.request.ApprovalFlowAddRequest;
1313
import cn.cordys.crm.approval.dto.request.ApprovalFlowPageRequest;
1414
import cn.cordys.crm.approval.dto.request.ApprovalFlowUpdateRequest;
@@ -81,9 +81,9 @@ public void updateEnable(@PathVariable("id") String id, @RequestParam("enable")
8181
approvalFlowService.updateEnable(id, enable, SessionUtils.getUserId(), OrganizationContext.getOrganizationId());
8282
}
8383

84-
@GetMapping("/status-permissions/{formType}")
84+
@GetMapping("/status-permission/setting/{formType}")
8585
@Operation(summary = "根据表单类型获取审批流状态权限配置")
86-
public List<StatusPermissionDTO> getStatusPermissions(@PathVariable("formType") String formType) {
86+
public StatusPermissionSettingResponse getStatusPermissionSetting(@PathVariable("formType") String formType) {
8787
return approvalFlowService.getStatusPermissionsByFormType(formType, OrganizationContext.getOrganizationId());
8888
}
8989
}

backend/crm/src/main/java/cn/cordys/crm/approval/domain/ApprovalFlow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class ApprovalFlow extends BaseModel {
1515
@Schema(description = "流程名称")
1616
private String name;
1717

18-
@Schema(description = "表单类型:QUOTATION/CONTRACT/INVOICE/ORDER")
18+
@Schema(description = "表单类型:quotation/contract/invoice/order")
1919
private String formType;
2020

2121
@Schema(description = "执行时机(JSON)")

backend/crm/src/main/java/cn/cordys/crm/approval/domain/ApprovalNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class ApprovalNode {
1717
@Schema(description = "节点名称")
1818
private String name;
1919

20-
@Schema(description = "节点类型:START/APPROVER/CONDITION/ELSE/END")
20+
@Schema(description = "节点类型:START/APPROVER/CONDITION/DEFAULT/END")
2121
private String nodeType;
2222

2323
@Schema(description = "排序序号")

backend/crm/src/main/java/cn/cordys/crm/approval/dto/request/ApprovalFlowAddRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ApprovalFlowAddRequest {
1919

2020
@EnumValue(enumClass = ApprovalFormTypeEnum.class)
2121
@NotBlank(message = "表单类型不能为空")
22-
@Schema(description = "表单类型:QUOTATION/CONTRACT/INVOICE/ORDER")
22+
@Schema(description = "表单类型:quotation/contract/invoice/order")
2323
private String formType;
2424

2525
@Schema(description = "执行时机列表:CREATE/EDIT")

backend/crm/src/main/java/cn/cordys/crm/approval/dto/request/ApprovalNodeRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class ApprovalNodeRequest {
2929

3030
@EnumValue(enumClass = ApprovalNodeTypeEnum.class)
3131
@NotBlank(message = "节点类型不能为空")
32-
@Schema(description = "节点类型:START/APPROVER/CONDITION/ELSE/END")
32+
@Schema(description = "节点类型:START/APPROVER/CONDITION/DEFAULT/END")
3333
private String nodeType;
3434

3535
@Schema(description = "排序序号")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cn.cordys.crm.approval.dto.response;
2+
3+
import cn.cordys.common.dto.OptionDTO;
4+
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import lombok.Data;
7+
8+
import java.io.Serializable;
9+
import java.util.List;
10+
11+
/**
12+
* 审批流状态权限配置响应
13+
*/
14+
@Data
15+
@Schema(description = "审批流状态权限配置")
16+
public class StatusPermissionSettingResponse implements Serializable {
17+
18+
@Schema(description = "权限列表")
19+
private List<OptionDTO> permissions;
20+
21+
@Schema(description = "状态权限配置")
22+
private List<StatusPermissionDTO> statusPermissions;
23+
}

backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,33 +68,41 @@ public class ApprovalFlowService {
6868
/**
6969
* 根据表单类型获取审批流状态权限配置
7070
*/
71-
public List<StatusPermissionDTO> getStatusPermissionsByFormType(String formType, String organizationId) {
71+
public StatusPermissionSettingResponse getStatusPermissionsByFormType(String formType, String organizationId) {
72+
StatusPermissionSettingResponse response = new StatusPermissionSettingResponse();
73+
74+
// 获取权限列表
75+
List<OptionDTO> permissions = getResourcePermissions(getPermissionsByFormType(formType));
76+
response.setPermissions(permissions);
77+
7278
// 查询该表单类型对应的审批流
7379
ApprovalFlow criteria = new ApprovalFlow();
7480
criteria.setFormType(formType);
7581
criteria.setEnable(true);
7682
criteria.setOrganizationId(organizationId);
7783
List<ApprovalFlow> flows = approvalFlowMapper.select(criteria);
78-
84+
7985
if (CollectionUtils.isEmpty(flows)) {
80-
return List.of();
86+
response.setStatusPermissions(List.of());
87+
return response;
8188
}
82-
89+
8390
// 优先使用启用的审批流,如果没有则使用第一个
8491
ApprovalFlow targetFlow = flows.stream()
8592
.filter(ApprovalFlow::getEnable)
8693
.findFirst()
8794
.orElse(flows.get(0));
88-
95+
8996
// 查询大字段表获取状态权限配置
9097
ApprovalFlowBlob blob = approvalFlowBlobMapper.selectByPrimaryKey(targetFlow.getId());
9198
if (blob == null || StringUtils.isBlank(blob.getStatusPermissions())) {
92-
return List.of();
99+
response.setStatusPermissions(List.of());
100+
return response;
93101
}
94-
102+
95103
// 解析状态权限配置
96-
List<OptionDTO> permissions = getResourcePermissions(getPermissionsByFormType(formType));
97-
return parseStatusPermissions(permissions, blob.getStatusPermissions());
104+
response.setStatusPermissions(parseStatusPermissions(permissions, blob.getStatusPermissions()));
105+
return response;
98106
}
99107

100108
/**
@@ -602,7 +610,7 @@ private List<OptionDTO> getResourcePermissions(List<Permission> permissions) {
602610

603611
private List<Permission> getPermissionsByFormType(String formType) {
604612
List<PermissionDefinitionItem> permissionSetting = roleService.getPermissionSetting();
605-
String permissionId = ApprovalFormTypeEnum.valueOf(formType).getPermissionId();
613+
String permissionId = ApprovalFormTypeEnum.getByValue(formType).getPermissionId();
606614
List<Permission> permissions = findPermissionsByPermissionId(permissionSetting, permissionId);
607615
if (permissions == null) {
608616
return List.of();
@@ -923,6 +931,9 @@ public List<ApprovalNodeResponse> getNextNodes(String nodeId) {
923931
* 根据权限ID查找对应的权限列表
924932
*/
925933
private List<Permission> findPermissionsByPermissionId(List<PermissionDefinitionItem> permissionSetting, String permissionId) {
934+
if (StringUtils.isBlank(permissionId) || CollectionUtils.isEmpty(permissionSetting)) {
935+
return List.of();
936+
}
926937
for (PermissionDefinitionItem module : permissionSetting) {
927938
if (module.getChildren() != null) {
928939
for (PermissionDefinitionItem resource : module.getChildren()) {

backend/crm/src/test/java/cn/cordys/crm/approval/ApprovalFlowControllerTests.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cn.cordys.crm.approval;
22

33
import cn.cordys.common.constants.PermissionConstants;
4+
import cn.cordys.crm.approval.dto.response.StatusPermissionSettingResponse;
45
import cn.cordys.crm.base.BaseTest;
56
import cn.cordys.crm.approval.domain.ApprovalFlow;
67
import cn.cordys.crm.approval.domain.ApprovalFlowBlob;
@@ -43,7 +44,7 @@
4344
class ApprovalFlowControllerTests extends BaseTest {
4445
private static final String BASE_PATH = "/approval-flow/";
4546
private static final String ENABLE = "enable/{0}";
46-
private static final String STATUS_PERMISSIONS = "status-permissions/{0}";
47+
private static final String STATUS_PERMISSION_SETTING = "status-permission/setting/{0}";
4748

4849
/**
4950
* 记录创建的审批流
@@ -139,7 +140,7 @@ private List<StatusPermissionDTO> buildStatusPermissions() {
139140
private ApprovalFlowAddRequest buildAddRequest(String name, ApprovalFormTypeEnum formType, boolean enable) {
140141
ApprovalFlowAddRequest request = new ApprovalFlowAddRequest();
141142
request.setName(name);
142-
request.setFormType(formType.name());
143+
request.setFormType(formType.getValue());
143144
request.setEnable(enable);
144145
request.setDescription("测试审批流描述");
145146
request.setSubmitterCanRevoke(true);
@@ -306,13 +307,13 @@ void testPage() throws Exception {
306307
ApprovalFlowPageRequest formTypeFilterRequest = new ApprovalFlowPageRequest();
307308
formTypeFilterRequest.setCurrent(1);
308309
formTypeFilterRequest.setPageSize(10);
309-
formTypeFilterRequest.setFormType(ApprovalFormTypeEnum.QUOTATION.name());
310+
formTypeFilterRequest.setFormType(ApprovalFormTypeEnum.QUOTATION.getValue());
310311
MvcResult formTypeMvcResult = this.requestPostWithOkAndReturn(DEFAULT_PAGE, formTypeFilterRequest);
311312
List<ApprovalFlowListResponse> formTypePageResult = getPageResult(formTypeMvcResult, ApprovalFlowListResponse.class).getList();
312313

313314
// 校验筛选结果
314315
Assertions.assertFalse(formTypePageResult.isEmpty());
315-
formTypePageResult.forEach(flow -> Assertions.assertEquals(ApprovalFormTypeEnum.QUOTATION.name(), flow.getFormType()));
316+
formTypePageResult.forEach(flow -> Assertions.assertEquals(ApprovalFormTypeEnum.QUOTATION.getValue(), flow.getFormType()));
316317

317318
// 校验权限
318319
requestPostPermissionTest(PermissionConstants.APPROVAL_FLOW_READ, DEFAULT_PAGE, request);
@@ -441,7 +442,7 @@ private List<ApprovalNode> getNodesByFlowId(String flowId) {
441442
*/
442443
private ApprovalFlow getDisabledFlow() {
443444
ApprovalFlow criteria = new ApprovalFlow();
444-
criteria.setFormType(ApprovalFormTypeEnum.INVOICE.name());
445+
criteria.setFormType(ApprovalFormTypeEnum.INVOICE.getValue());
445446
criteria.setOrganizationId(DEFAULT_ORGANIZATION_ID);
446447
criteria.setEnable(false);
447448
List<ApprovalFlow> flows = approvalFlowMapper.select(criteria);
@@ -450,24 +451,30 @@ private ApprovalFlow getDisabledFlow() {
450451

451452
@Test
452453
@Order(8)
453-
void testGetStatusPermissions() throws Exception {
454+
void testGetStatusPermissionSetting() throws Exception {
454455
// 请求成功 - 获取报价审批流的状态权限配置
455-
MvcResult mvcResult = this.requestGetWithOkAndReturn(STATUS_PERMISSIONS, ApprovalFormTypeEnum.QUOTATION.name());
456-
List<StatusPermissionDTO> permissions = getResultDataArray(mvcResult, StatusPermissionDTO.class);
456+
MvcResult mvcResult = this.requestGetWithOkAndReturn(STATUS_PERMISSION_SETTING, ApprovalFormTypeEnum.QUOTATION.getValue());
457+
StatusPermissionSettingResponse response = getResultData(mvcResult, StatusPermissionSettingResponse.class);
457458

458459
// 校验返回数据不为空
459-
Assertions.assertFalse(permissions.isEmpty());
460+
Assertions.assertNotNull(response);
461+
Assertions.assertNotNull(response.getPermissions());
462+
Assertions.assertNotNull(response.getStatusPermissions());
463+
464+
// 校验权限列表不为空
465+
Assertions.assertFalse(response.getPermissions().isEmpty());
460466

461467
// 校验权限数据结构正确
462-
permissions.forEach(p -> {
468+
response.getPermissions().forEach(p -> {
469+
Assertions.assertNotNull(p.getId());
470+
Assertions.assertNotNull(p.getName());
471+
});
472+
473+
// 校验状态权限数据结构正确
474+
response.getStatusPermissions().forEach(p -> {
463475
Assertions.assertNotNull(p.getApprovalStatus());
464476
Assertions.assertNotNull(p.getPermission());
465477
Assertions.assertNotNull(p.getEnabled());
466478
});
467-
468-
// 校验权限 - 不存在的表单类型
469-
MvcResult emptyMvcResult = this.requestGetWithOkAndReturn(STATUS_PERMISSIONS, "NON_EXISTENT_FORM");
470-
List<StatusPermissionDTO> emptyPermissions = getResultDataArray(emptyMvcResult, StatusPermissionDTO.class);
471-
Assertions.assertTrue(emptyPermissions.isEmpty());
472479
}
473480
}

0 commit comments

Comments
 (0)