feat: (feature/REQ-2750) 修改同步菜单时支持同步权限标签

This commit is contained in:
lilong 2024-10-25 15:18:04 +08:00
parent ad7224a332
commit 2051e761df
2 changed files with 107 additions and 34 deletions

View File

@ -1,8 +1,10 @@
package cn.axzo.tyr.client.model.res;
import cn.axzo.basics.common.model.IBaseTree;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -27,8 +29,23 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase
private List<String> roleCodes;
/**
* 兼容
*/
private List<Role> roles;
private Set<Long> roleIds;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Role {
private String roleCode;
private Set<RolePermissionTagEnum> tags;
}
@JsonIgnore
@Override
public Long getNodeCode() {

View File

@ -9,6 +9,7 @@ import cn.axzo.framework.rocketmq.Event;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq;
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
@ -22,7 +23,12 @@ import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationD
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleDao;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation;
import cn.axzo.tyr.server.repository.entity.SaasRole;
import cn.axzo.tyr.server.service.FeatureResourceSyncService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import cn.axzo.tyr.server.util.RpcInternalUtil;
@ -31,6 +37,10 @@ import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@ -41,9 +51,8 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -124,10 +133,20 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
allFeatureResourceIds.addAll(CollectionUtils.emptyIfNull(componentList).stream().map(BaseEntity::getId).collect(Collectors.toList()));
resourceList.addAll(componentList);
}
Map<Long, List<String>> featureResourceRoleCodeMap = getFeatureResourceRoleCodeMap(allFeatureResourceIds);
Map<Long, List<FeatureResourceTreeNode.Role>> featureResourceRoleCodeMap = getFeatureResourceRoleCodeMap(allFeatureResourceIds);
List<FeatureResourceTreeNode> dtoList = BeanMapper.copyList(resourceList, FeatureResourceTreeNode.class);
dtoList.forEach(e -> e.setRoleCodes(featureResourceRoleCodeMap.get(e.getId())));
dtoList.forEach(e -> {
List<FeatureResourceTreeNode.Role> roles = featureResourceRoleCodeMap.get(e.getId());
if (Objects.isNull(roles)) {
return;
}
e.setRoleCodes(roles.stream()
.map(FeatureResourceTreeNode.Role::getRoleCode)
.distinct()
.collect(Collectors.toList()));
e.setRoles(roles);
});
return TreeUtil.buildTree(dtoList);
}
@ -277,7 +296,7 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
// 处理资源关联的权限
RelationOperateLogResourceBindRoleDO logResourceBindRoleDO = doFeatureResourceRole(baseResource, treeNode.getRoleCodes(), operatorId, syncedRoleFeatureResourceIds);
RelationOperateLogResourceBindRoleDO logResourceBindRoleDO = doFeatureResourceRole(baseResource, treeNode, operatorId, syncedRoleFeatureResourceIds);
if (Objects.nonNull(logResourceBindRoleDO)) {
operateDos.add(logResourceBindRoleDO);
}
@ -308,8 +327,10 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
}
private RelationOperateLogResourceBindRoleDO doFeatureResourceRole(SaasFeatureResource featureResource, List<String> roleCodes,
Long operatorId, Set<Long> syncedRoleFeatureResourceIds) {
private RelationOperateLogResourceBindRoleDO doFeatureResourceRole(SaasFeatureResource featureResource,
FeatureResourceTreeNode treeNode,
Long operatorId,
Set<Long> syncedRoleFeatureResourceIds) {
if (Objects.isNull(featureResource)) {
return null;
}
@ -336,26 +357,29 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
.uniCode(featureResource.getUniCode())
.build();
roleCodes = CollectionUtils.emptyIfNull(roleCodes).stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
List<String> roleCodes = CollectionUtils.emptyIfNull(treeNode.getRoles()).stream()
.map(FeatureResourceTreeNode.Role::getRoleCode)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(roleCodes)) {
return logResourceBindRoleDO;
}
// List<String> existRoleCodes = getFeatureResourceRoleCodeMap(Lists.newArrayList(featureResource.getId()))
// .get(featureResource.getId());
//
// if (CollectionUtils.isNotEmpty(existRoleCodes)) {
// roleCodes.removeAll(existRoleCodes);
// }
// if (CollectionUtils.isEmpty(roleCodes)) {
// return;
// }
List<SaasRole> saasRoles = saasRoleDao.listByRoleCodes(roleCodes);
if (CollectionUtils.isEmpty(saasRoles)) {
return logResourceBindRoleDO;
}
Map<String, FeatureResourceTreeNode.Role> sourceRoleMap = treeNode.getRoles().stream()
.collect(Collectors.toMap(FeatureResourceTreeNode.Role::getRoleCode, Function.identity(), (f, s) -> s));
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(saasRoles.stream().map(BaseEntity::getId).collect(Collectors.toList()));
Map<Long, SaasPgroupRoleRelation> pgroupRoleMap = saasPgroupRoleRelations.stream()
.collect(Collectors.toMap(SaasPgroupRoleRelation::getGroupId, Function.identity()));
Map<Long, SaasRole> localRoleMap = saasRoles.stream()
.collect(Collectors.toMap(SaasRole::getId, Function.identity()));
Set<Long> groupIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toSet());
List<Long> existRoleIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getRoleId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(groupIds)) {
@ -368,6 +392,11 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
relation.setType(NEW_FEATURE);
relation.setFeatureType(featureResource.getFeatureType());
relation.setTerminal(featureResource.getTerminal());
SaasPgroupRoleRelation saasPgroupRoleRelation = pgroupRoleMap.get(groupId);
SaasRole saasRole = localRoleMap.get(saasPgroupRoleRelation.getRoleId());
FeatureResourceTreeNode.Role role = sourceRoleMap.get(saasRole.getRoleCode());
relation.setTags(role.getTags());
return relation;
})
.collect(Collectors.toList());
@ -387,7 +416,20 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
return logResourceBindRoleDO;
}
private Map<Long, List<String>> getFeatureResourceRoleCodeMap(List<Long> allFeatureResourceIds) {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class PermissionGroupRoleWrapper {
private Long featureId;
private String roleCode;
private Set<RolePermissionTagEnum> tags;
}
private Map<Long, List<FeatureResourceTreeNode.Role>> getFeatureResourceRoleCodeMap(List<Long> allFeatureResourceIds) {
allFeatureResourceIds = allFeatureResourceIds.stream().distinct().collect(Collectors.toList());
List<SaasPgroupPermissionRelation> permissionRelations = saasPgroupPermissionRelationDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.value)
@ -414,9 +456,6 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
return Collections.emptyMap();
}
Map<Long, List<Long>> featureIdToGroupIdsMap = permissionRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getFeatureId,
Collectors.mapping(SaasPgroupPermissionRelation::getGroupId, Collectors.toList())));
Map<Long, List<Long>> groupIdToRoleIdsMap = roleRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId,
@ -429,18 +468,35 @@ public class FeatureResourceSyncServiceImpl implements FeatureResourceSyncServic
}
}
Map<Long, List<String>> featureRoleMap = new HashMap<>();
featureIdToGroupIdsMap.forEach((featureId, groupIds) -> {
List<String> roleCodes = groupIds.stream()
.flatMap(groupId -> groupIdToRoleIdsMap.getOrDefault(groupId, Collections.emptyList()).stream())
.map(roleIdToRoleCodeMap::get)
.filter(StringUtils::isNotBlank)
return permissionRelations.stream()
.map(e -> {
List<Long> roleIds = groupIdToRoleIdsMap.get(e.getGroupId());
if (CollectionUtils.isEmpty(roleIds)) {
return null;
}
return roleIds.stream()
.map(roleId -> {
String roleCode = roleIdToRoleCodeMap.get(roleId);
if (StringUtils.isBlank(roleCode)) {
return null;
}
return PermissionGroupRoleWrapper.builder()
.featureId(e.getFeatureId())
.roleCode(roleCode)
.tags(e.getTags())
.build();
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
featureRoleMap.put(featureId, roleCodes);
});
return featureRoleMap;
})
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(PermissionGroupRoleWrapper::getFeatureId,
Collectors.mapping(e -> FeatureResourceTreeNode.Role.builder()
.roleCode(e.getRoleCode())
.tags(e.getTags())
.build(), Collectors.toList())));
}