Skip to content

Commit f8fdb46

Browse files
committed
refactor: approval flow status permission
1 parent ec4f8b9 commit f8fdb46

6 files changed

Lines changed: 136 additions & 12 deletions

File tree

backend/crm/src/main/java/cn/cordys/crm/approval/constants/ApprovalFormTypeEnum.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,27 @@
66
public enum ApprovalFormTypeEnum {
77

88
/** 报价 */
9-
QUOTATION("QTE-APV"),
9+
QUOTATION("QTE-APV", "OPPORTUNITY_MANAGEMENT_QUOTATION"),
1010
/** 合同 */
11-
CONTRACT("CTR-APV"),
11+
CONTRACT("CTR-APV", "CONTRACT"),
1212
/** 发票 */
13-
INVOICE("INV-APV"),
13+
INVOICE("INV-APV", "CONTRACT_INVOICE"),
1414
/** 订单 */
15-
ORDER("ORD-APV");
15+
ORDER("ORD-APV", "ORDER");
1616

1717
private final String prefix;
18+
private final String permissionId;
1819

19-
ApprovalFormTypeEnum(String prefix) {
20+
ApprovalFormTypeEnum(String prefix, String permissionId) {
2021
this.prefix = prefix;
22+
this.permissionId = permissionId;
2123
}
2224

2325
public String getPrefix() {
2426
return prefix;
2527
}
28+
29+
public String getPermissionId() {
30+
return permissionId;
31+
}
2632
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cn.cordys.crm.approval.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Data;
5+
6+
/**
7+
* 状态权限配置DTO
8+
*/
9+
@Data
10+
public class StatusPermissionDTO {
11+
@Schema(description = "审批状态")
12+
private String approvalStatus;
13+
14+
@Schema(description = "权限")
15+
private String permission;
16+
17+
@Schema(description = "是否启用")
18+
private Boolean enabled;
19+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import cn.cordys.common.constants.EnumValue;
44
import cn.cordys.crm.approval.constants.DuplicateApproverRuleEnum;
55
import cn.cordys.crm.approval.constants.ApprovalFormTypeEnum;
6+
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
67
import io.swagger.v3.oas.annotations.media.Schema;
78
import jakarta.validation.constraints.NotBlank;
89
import lombok.Data;
@@ -50,7 +51,7 @@ public class ApprovalFlowAddRequest {
5051
private Boolean requireComment;
5152

5253
@Schema(description = "状态权限配置")
53-
private String statusPermissions;
54+
private List<StatusPermissionDTO> statusPermissions;
5455

5556
@Schema(description = "节点配置列表")
5657
private List<ApprovalNodeRequest> nodes;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import cn.cordys.common.constants.EnumValue;
44
import cn.cordys.crm.approval.constants.DuplicateApproverRuleEnum;
5+
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
56
import io.swagger.v3.oas.annotations.media.Schema;
67
import jakarta.validation.constraints.NotBlank;
78
import lombok.Data;
@@ -48,7 +49,7 @@ public class ApprovalFlowUpdateRequest {
4849
private Boolean requireComment;
4950

5051
@Schema(description = "状态权限配置")
51-
private String statusPermissions;
52+
private List<StatusPermissionDTO> statusPermissions;
5253

5354
@Schema(description = "节点配置列表")
5455
private List<ApprovalNodeRequest> nodes;

backend/crm/src/main/java/cn/cordys/crm/approval/dto/response/ApprovalFlowDetailResponse.java

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

3+
import cn.cordys.common.dto.OptionDTO;
4+
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
35
import io.swagger.v3.oas.annotations.media.Schema;
46
import lombok.Data;
57

@@ -47,8 +49,11 @@ public class ApprovalFlowDetailResponse {
4749
@Schema(description = "是否必须填写审批意见")
4850
private Boolean requireComment;
4951

52+
@Schema(description = "对应资源表单的权限列表")
53+
private List<OptionDTO> permissions;
54+
5055
@Schema(description = "状态权限配置")
51-
private String statusPermissions;
56+
private List<StatusPermissionDTO> statusPermissions;
5257

5358
@Schema(description = "节点配置列表")
5459
private List<ApprovalNodeResponse> nodes;

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

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,26 @@
55
import cn.cordys.aspectj.constants.LogType;
66
import cn.cordys.aspectj.context.OperationLogContext;
77
import cn.cordys.aspectj.dto.LogContextInfo;
8+
import cn.cordys.common.dto.OptionDTO;
89
import cn.cordys.common.exception.GenericException;
910
import cn.cordys.common.pager.PageUtils;
1011
import cn.cordys.common.pager.Pager;
12+
import cn.cordys.common.permission.Permission;
13+
import cn.cordys.common.permission.PermissionDefinitionItem;
1114
import cn.cordys.common.response.result.CrmHttpResultCode;
1215
import cn.cordys.common.uid.IDGenerator;
1316
import cn.cordys.common.util.BeanUtils;
1417
import cn.cordys.common.util.JSON;
1518
import cn.cordys.crm.approval.constants.ApprovalFormTypeEnum;
1619
import cn.cordys.crm.approval.constants.ApprovalNodeTypeEnum;
1720
import cn.cordys.crm.approval.domain.*;
18-
import cn.cordys.crm.approval.dto.response.*;
21+
import cn.cordys.crm.approval.dto.StatusPermissionDTO;
1922
import cn.cordys.crm.approval.dto.request.*;
23+
import cn.cordys.crm.approval.dto.response.*;
2024
import cn.cordys.crm.system.constants.SystemResultCode;
2125
import cn.cordys.crm.approval.log.ApprovalFlowLogDTO;
2226
import cn.cordys.crm.approval.mapper.ExtApprovalFlowMapper;
27+
import cn.cordys.crm.system.service.RoleService;
2328
import cn.cordys.mybatis.BaseMapper;
2429
import cn.cordys.mybatis.lambda.LambdaQueryWrapper;
2530
import com.github.pagehelper.Page;
@@ -51,6 +56,8 @@ public class ApprovalFlowService {
5156
private BaseMapper<ApprovalNodeCondition> approvalNodeConditionMapper;
5257
@Resource
5358
private BaseMapper<ApprovalNodeLink> approvalNodeLinkMapper;
59+
@Resource
60+
private RoleService roleService;
5461

5562
/**
5663
* 分页查询审批流列表
@@ -73,11 +80,16 @@ public ApprovalFlowDetailResponse getDetail(String id, String organizationId) {
7380

7481
ApprovalFlowDetailResponse response = convertToDetailResponse(flow);
7582

83+
List<Permission> permissions = getPermissionsByFormType(flow.getFormType());
84+
85+
// 设置对应资源的权限列表
86+
response.setPermissions(getResourcePermissions(permissions));
87+
7688
// 查询大字段表
7789
ApprovalFlowBlob blob = approvalFlowBlobMapper.selectByPrimaryKey(id);
7890
if (blob != null) {
7991
response.setDescription(blob.getDescription());
80-
response.setStatusPermissions(blob.getStatusPermissions());
92+
response.setStatusPermissions(parseStatusPermissions(response.getPermissions(), blob.getStatusPermissions()));
8193
}
8294

8395
// 查询节点配置并构建树状结构
@@ -113,7 +125,7 @@ public ApprovalFlow add(ApprovalFlowAddRequest request, String userId, String or
113125
ApprovalFlowBlob blob = new ApprovalFlowBlob();
114126
blob.setId(flow.getId());
115127
blob.setDescription(request.getDescription());
116-
blob.setStatusPermissions(request.getStatusPermissions());
128+
blob.setStatusPermissions(JSON.toJSONString(request.getStatusPermissions()));
117129
approvalFlowBlobMapper.insert(blob);
118130

119131
// 保存节点配置
@@ -162,7 +174,7 @@ public ApprovalFlow update(ApprovalFlowUpdateRequest request, String userId, Str
162174
ApprovalFlowBlob blob = new ApprovalFlowBlob();
163175
blob.setId(flow.getId());
164176
blob.setDescription(request.getDescription());
165-
blob.setStatusPermissions(request.getStatusPermissions());
177+
blob.setStatusPermissions(JSON.toJSONString(request.getStatusPermissions()));
166178
approvalFlowBlobMapper.updateById(blob);
167179

168180
// 删除原有节点配置并重新保存
@@ -487,4 +499,84 @@ private ApprovalFlowLogDTO buildModifiedLogDTO(ApprovalFlowUpdateRequest request
487499
logDTO.setDescription(request.getDescription());
488500
return logDTO;
489501
}
502+
503+
/**
504+
* 获取对应资源的权限列表
505+
*/
506+
private List<OptionDTO> getResourcePermissions(List<Permission> permissions) {
507+
return permissions.stream()
508+
.map(p -> new OptionDTO(p.getId(), p.getName()))
509+
.collect(Collectors.toList());
510+
}
511+
512+
private List<Permission> getPermissionsByFormType(String formType) {
513+
List<PermissionDefinitionItem> permissionSetting = roleService.getPermissionSetting();
514+
String permissionId = ApprovalFormTypeEnum.valueOf(formType).getPermissionId();
515+
List<Permission> permissions = findPermissionsByPermissionId(permissionSetting, permissionId);
516+
if (permissions == null) {
517+
return List.of();
518+
}
519+
return permissions;
520+
}
521+
522+
/**
523+
* 解析状态权限配置
524+
*/
525+
private List<StatusPermissionDTO> parseStatusPermissions(List<OptionDTO> permissions, String statusPermissions) {
526+
if (StringUtils.isBlank(statusPermissions)) {
527+
return null;
528+
}
529+
// 解析已保存的状态权限配置
530+
List<StatusPermissionDTO> savedPermissions = JSON.parseArray(statusPermissions, StatusPermissionDTO.class);
531+
532+
// 获取所有审批状态
533+
Set<String> approvalStatuses = savedPermissions.stream()
534+
.map(StatusPermissionDTO::getApprovalStatus)
535+
.collect(Collectors.toSet());
536+
537+
// 构建已保存权限的映射:(审批状态, 权限ID) -> StatusPermissionDTO
538+
Map<String, StatusPermissionDTO> savedPermissionMap = savedPermissions.stream()
539+
.collect(Collectors.toMap(
540+
p -> p.getApprovalStatus() + ":" + p.getPermission(),
541+
p -> p));
542+
543+
// 更新权限名称并补充缺失的权限
544+
List<StatusPermissionDTO> updatedPermissions = new ArrayList<>();
545+
for (String approvalStatus : approvalStatuses) {
546+
for (OptionDTO permission : permissions) {
547+
String key = approvalStatus + ":" + permission.getId();
548+
StatusPermissionDTO item = savedPermissionMap.get(key);
549+
if (item != null) {
550+
// 更新权限名称
551+
item.setEnabled(true);
552+
updatedPermissions.add(item);
553+
} else {
554+
// 添加缺失的权限,默认不启用
555+
StatusPermissionDTO newItem = new StatusPermissionDTO();
556+
newItem.setApprovalStatus(approvalStatus);
557+
newItem.setPermission(permission.getId());
558+
newItem.setEnabled(false);
559+
updatedPermissions.add(newItem);
560+
}
561+
}
562+
}
563+
564+
return updatedPermissions;
565+
}
566+
567+
/**
568+
* 根据权限ID查找对应的权限列表
569+
*/
570+
private List<Permission> findPermissionsByPermissionId(List<PermissionDefinitionItem> permissionSetting, String permissionId) {
571+
for (PermissionDefinitionItem module : permissionSetting) {
572+
if (module.getChildren() != null) {
573+
for (PermissionDefinitionItem resource : module.getChildren()) {
574+
if (resource.getId().equals(permissionId)) {
575+
return resource.getPermissions();
576+
}
577+
}
578+
}
579+
}
580+
return null;
581+
}
490582
}

0 commit comments

Comments
 (0)