feat: (feature/REQ-2750) 修改同步菜单时支持同步权限标签
This commit is contained in:
parent
ad7224a332
commit
2051e761df
@ -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() {
|
||||
|
||||
@ -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)
|
||||
.collect(Collectors.toList());
|
||||
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();
|
||||
|
||||
featureRoleMap.put(featureId, roleCodes);
|
||||
});
|
||||
|
||||
return featureRoleMap;
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
})
|
||||
.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())));
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user