feat:(REQ-2968) 资源详情增加needRole

This commit is contained in:
lilong 2024-09-24 14:51:28 +08:00
parent aa9fc3c09f
commit dd65dce4af
6 changed files with 128 additions and 7 deletions

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.req.DeleteFeatureResourceReq;
import cn.axzo.tyr.client.model.req.DetailFeatureResourceReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq;
@ -53,10 +54,18 @@ public interface FeatureResourceApi {
@PostMapping("/api/featureResource/reorder")
ApiResult<Void> reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset);
/** 菜单详情 **/
/**
* 去掉因为原接口入参只能只一个featureId无法扩展所以使用detailV2
* @param featureId
* @return
*/
@PostMapping("/api/featureResource/detail")
@Deprecated
ApiResult<FeatureResourceTreeNode> detail(@RequestParam Long featureId);
@PostMapping("/api/featureResource/detail/v2")
ApiResult<FeatureResourceTreeNode> detailV2(@RequestBody @Valid DetailFeatureResourceReq req);
/** 从基准环境查询功能资源树 **/
@PostMapping("/api/featureResource/getBaseTree")
ApiResult<List<FeatureResourceTreeNode>> getBaseTree(@RequestBody @Valid GetFeatureResourceTreeReq req);

View File

@ -0,0 +1,25 @@
package cn.axzo.tyr.client.model.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DetailFeatureResourceReq {
@NotNull(message = "featureId不能为空")
private Long featureId;
private Boolean needRole;
/**
* 资源类型1-菜单 2-页面 3-应用入口 4-组件;5-root节点
*/
private Integer featureType;
}

View File

@ -26,6 +26,8 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase
private List<String> roleCodes;
private List<Role> roles;
@JsonIgnore
@Override
public Long getNodeCode() {
@ -48,4 +50,12 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase
public void setNodeChildren(List<FeatureResourceTreeNode> nodeChildren) {
this.children = nodeChildren;
}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public static class Role {
private Long roleId;
}
}

View File

@ -3,6 +3,7 @@ package cn.axzo.tyr.server.controller.permission;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.FeatureResourceApi;
import cn.axzo.tyr.client.model.req.DeleteFeatureResourceReq;
import cn.axzo.tyr.client.model.req.DetailFeatureResourceReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.ResourceSyncReq;
@ -76,7 +77,15 @@ public class FeatureResourceController implements FeatureResourceApi {
@Override
public ApiResult<FeatureResourceTreeNode> detail(Long featureId) {
// 详情只查子集组件
return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(featureId, null));
DetailFeatureResourceReq detailFeatureResourceReq = DetailFeatureResourceReq.builder()
.featureId(featureId)
.build();
return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(detailFeatureResourceReq));
}
@Override
public ApiResult<FeatureResourceTreeNode> detailV2(DetailFeatureResourceReq req) {
return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(req));
}
@Override

View File

@ -2,6 +2,7 @@ package cn.axzo.tyr.server.service;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.tyr.client.model.req.DeleteFeatureResourceReq;
import cn.axzo.tyr.client.model.req.DetailFeatureResourceReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
@ -38,7 +39,7 @@ public interface SaasFeatureResourceService extends IService<SaasFeatureResource
SaasFeatureResource featureResourceById(Long featureId);
FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId, Integer featureType);
FeatureResourceTreeNode getTreeFeatureDescendant(DetailFeatureResourceReq param);
/**菜单重排序**/
void reorderMenuFeature(Long featureId, Integer offset);

View File

@ -17,6 +17,7 @@ import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.model.enums.DelegatedType;
import cn.axzo.tyr.client.model.req.DeleteFeatureResourceReq;
import cn.axzo.tyr.client.model.req.DetailFeatureResourceReq;
import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq;
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
@ -38,11 +39,14 @@ import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
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.SaasPgroupRoleRelation;
import cn.axzo.tyr.server.repository.mapper.SaasFeatureResourceMapper;
import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasPageElementFeatureResourceRelationService;
import cn.axzo.tyr.server.service.SaasPageElementService;
@ -50,6 +54,7 @@ import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
import cn.azxo.framework.common.utils.StringUtils;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -112,6 +117,8 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
private final MqProducer mqProducer;
private final SaasFeatureDao saasFeatureDao;
private final SaasPgroupRoleRelationDao saasPgroupRoleRelationDao;
private final RoleService roleService;
private static final String TARGET_TYPE = "saasFeatureResourceId";
/**
@ -238,18 +245,78 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
return Objects.equals(e.getWorkspaceType(), req.getWorkspaceType());
}
private Map<Long, List<FeatureResourceTreeNode.Role>> listRoles(DetailFeatureResourceReq detailFeatureResourceReq,
List<SaasFeatureResource> descendants) {
if (CollectionUtils.isEmpty(descendants) || BooleanUtils.isNotTrue(detailFeatureResourceReq.getNeedRole())) {
return Collections.emptyMap();
}
List<SaasPgroupPermissionRelation> relations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder()
.featureIds(Lists.transform(descendants, SaasFeatureResource::getId))
.build());
if (CollectionUtils.isEmpty(relations)) {
return Collections.emptyMap();
}
List<Long> groupIds = Lists.transform(relations, SaasPgroupPermissionRelation::getGroupId);
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.listByGroupIds(groupIds);
if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) {
return Collections.emptyMap();
}
Map<Long, FeatureResourceTreeNode.Role> roles = roleService.list(RoleService.ListSaasRoleParam.builder()
.roleIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getRoleId))
.build())
.stream()
.map(e -> FeatureResourceTreeNode.Role.builder().roleId(e.getId()).build())
.collect(Collectors.toMap(FeatureResourceTreeNode.Role::getRoleId, Function.identity()));
Map<Long, List<Long>> groupRoleMap = saasPgroupRoleRelations.stream()
.collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId,
Collectors.mapping(SaasPgroupRoleRelation::getRoleId, Collectors.toList())));
return relations.stream()
.map(e -> {
List<Long> roleIds = groupRoleMap.get(e.getGroupId());
if (CollectionUtils.isEmpty(roleIds)) {
return null;
}
return Pair.of(e.getFeatureId(), roleIds.stream()
.map(roles::get)
.filter(Objects::nonNull)
.collect(Collectors.toList()));
})
.filter(Objects::nonNull)
.collect(Collectors.toMap(Pair::getKey, Pair::getValue, (f, s) -> {
f.addAll(s);
return f;
}));
}
@Override
public FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId, Integer featureType) {
public FeatureResourceTreeNode getTreeFeatureDescendant(DetailFeatureResourceReq param) {
List<SaasFeatureResource> descendants = featureResourceDao.lambdaQuery()
.eq(BaseEntity::getIsDelete,0)
.eq(ObjectUtil.isNotNull(featureType), SaasFeatureResource::getFeatureType, featureType)
.apply("FIND_IN_SET('" + featureId + "', path)")
.eq(ObjectUtil.isNotNull(param.getFeatureType()), SaasFeatureResource::getFeatureType, param.getFeatureType())
.apply("FIND_IN_SET('" + param.getFeatureId() + "', path)")
.list();
if (CollectionUtil.isEmpty(descendants)) {
return null;
}
Map<Long, List<FeatureResourceTreeNode.Role>> roles = listRoles(param, descendants);
List<FeatureResourceTreeNode> treeList = TreeUtil.buildTree(descendants.stream()
.map(SaasFeatureResourceConvert.INSTANCE::convert)
.map(e -> {
FeatureResourceTreeNode featureResourceTreeNode = SaasFeatureResourceConvert.INSTANCE.convert(e);
featureResourceTreeNode.setRoles(Optional.ofNullable(roles.get(featureResourceTreeNode.getId()))
.map(f -> f.stream().distinct().collect(Collectors.toList()))
.orElse(null));
return featureResourceTreeNode;
})
.sorted(Comparator.comparing(FeatureResourceDTO::getDisplayOrder))
.collect(Collectors.toList()));
FeatureResourceTreeNode featureResourceTreeNode = treeList.get(0);