From dd65dce4af0b98ee98b48475557d4c99f48bcb4f Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 24 Sep 2024 14:51:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:(REQ-2968)=20=E8=B5=84=E6=BA=90=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=A2=9E=E5=8A=A0needRole?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/FeatureResourceApi.java | 11 ++- .../model/req/DetailFeatureResourceReq.java | 25 +++++++ .../model/res/FeatureResourceTreeNode.java | 10 +++ .../permission/FeatureResourceController.java | 11 ++- .../service/SaasFeatureResourceService.java | 3 +- .../impl/SaasFeatureResourceServiceImpl.java | 75 ++++++++++++++++++- 6 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/DetailFeatureResourceReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java index e7867591..000ff981 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/FeatureResourceApi.java @@ -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 reorderFeatureTree(@RequestParam Long featureId, @RequestParam Integer offset); - /** 菜单详情 **/ + /** + * 去掉,因为原接口入参只能只一个featureId,无法扩展,所以使用detailV2 + * @param featureId + * @return + */ @PostMapping("/api/featureResource/detail") + @Deprecated ApiResult detail(@RequestParam Long featureId); + @PostMapping("/api/featureResource/detail/v2") + ApiResult detailV2(@RequestBody @Valid DetailFeatureResourceReq req); + /** 从基准环境查询功能资源树 **/ @PostMapping("/api/featureResource/getBaseTree") ApiResult> getBaseTree(@RequestBody @Valid GetFeatureResourceTreeReq req); diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/DetailFeatureResourceReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/DetailFeatureResourceReq.java new file mode 100644 index 00000000..8f65fa43 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/DetailFeatureResourceReq.java @@ -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; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java index a7ef28e6..c883edd2 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/FeatureResourceTreeNode.java @@ -26,6 +26,8 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase private List roleCodes; + private List roles; + @JsonIgnore @Override public Long getNodeCode() { @@ -48,4 +50,12 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase public void setNodeChildren(List nodeChildren) { this.children = nodeChildren; } + + @Data + @SuperBuilder + @NoArgsConstructor + @AllArgsConstructor + public static class Role { + private Long roleId; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java index 7deb0210..9b7075c5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/FeatureResourceController.java @@ -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 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 detailV2(DetailFeatureResourceReq req) { + return ApiResult.ok(featureResourceService.getTreeFeatureDescendant(req)); } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java index 7aa6fa61..55d05c07 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasFeatureResourceService.java @@ -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> listRoles(DetailFeatureResourceReq detailFeatureResourceReq, + List descendants) { + if (CollectionUtils.isEmpty(descendants) || BooleanUtils.isNotTrue(detailFeatureResourceReq.getNeedRole())) { + return Collections.emptyMap(); + } + + List relations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() + .featureIds(Lists.transform(descendants, SaasFeatureResource::getId)) + .build()); + if (CollectionUtils.isEmpty(relations)) { + return Collections.emptyMap(); + } + + List groupIds = Lists.transform(relations, SaasPgroupPermissionRelation::getGroupId); + List saasPgroupRoleRelations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); + + if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { + return Collections.emptyMap(); + } + + Map 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> groupRoleMap = saasPgroupRoleRelations.stream() + .collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId, + Collectors.mapping(SaasPgroupRoleRelation::getRoleId, Collectors.toList()))); + + return relations.stream() + .map(e -> { + List 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 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> roles = listRoles(param, descendants); + List 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);