From dd65dce4af0b98ee98b48475557d4c99f48bcb4f Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 24 Sep 2024 14:51:28 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:(REQ-2968)=20=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=AF=A6=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); From 91faafe72e150f6862e634e2752da3a20774cd7e Mon Sep 17 00:00:00 2001 From: lilong Date: Tue, 24 Sep 2024 15:48:04 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat:(REQ-2968)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9B=AE=E5=89=8D=E5=8F=AA=E8=BF=94=E5=9B=9E?= =?UTF-8?q?roleId=EF=BC=8C=E5=87=8F=E5=B0=91IO=E6=B5=81=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/res/FeatureResourceTreeNode.java | 11 ++--------- .../impl/SaasFeatureResourceServiceImpl.java | 14 +++++++------- 2 files changed, 9 insertions(+), 16 deletions(-) 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 c883edd2..8cb87ea7 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 @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.util.List; +import java.util.Set; /** * 功能资源树形节点 @@ -26,7 +27,7 @@ public class FeatureResourceTreeNode extends FeatureResourceDTO implements IBase private List roleCodes; - private List roles; + private Set roleIds; @JsonIgnore @Override @@ -50,12 +51,4 @@ 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/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 8c1b2c38..11cd0d09 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -31,6 +31,7 @@ import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode; import cn.axzo.tyr.client.model.res.PageElementBasicDTO; import cn.axzo.tyr.client.model.res.PageElementResp; import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; +import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.server.common.util.Throws; import cn.axzo.tyr.server.config.MqProducer; import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; @@ -246,7 +247,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl> listRoles(DetailFeatureResourceReq detailFeatureResourceReq, + private Map> listRoles(DetailFeatureResourceReq detailFeatureResourceReq, List descendants) { if (CollectionUtils.isEmpty(descendants) || BooleanUtils.isNotTrue(detailFeatureResourceReq.getNeedRole())) { return Collections.emptyMap(); @@ -266,12 +267,11 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl roles = roleService.list(RoleService.ListSaasRoleParam.builder() + 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())); + .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); Map> groupRoleMap = saasPgroupRoleRelations.stream() .collect(Collectors.groupingBy(SaasPgroupRoleRelation::getGroupId, @@ -307,13 +307,13 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl> roles = listRoles(param, descendants); + Map> roles = listRoles(param, descendants); List treeList = TreeUtil.buildTree(descendants.stream() .map(e -> { FeatureResourceTreeNode featureResourceTreeNode = SaasFeatureResourceConvert.INSTANCE.convert(e); - featureResourceTreeNode.setRoles(Optional.ofNullable(roles.get(featureResourceTreeNode.getId())) - .map(f -> f.stream().distinct().collect(Collectors.toList())) + featureResourceTreeNode.setRoleIds(Optional.ofNullable(roles.get(featureResourceTreeNode.getId())) + .map(f -> f.stream().map(SaasRoleRes::getId).collect(Collectors.toSet())) .orElse(null)); return featureResourceTreeNode; }) From bd0f4e83d1fc82cca46617a8e8cff2bab25a9934 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 11:04:54 +0800 Subject: [PATCH 03/10] =?UTF-8?q?feat:(REQ-3068)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8E=9F=E7=94=A8=E6=88=B7=E6=9F=A5=E8=AF=A2=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AF=BC=E8=87=B4=E6=8E=A5=E5=8F=A3=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E5=B7=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/req/QueryByIdentityIdTypeReq.java | 4 + .../req/ListRoleUserRelationParam.java | 22 ++++ .../server/service/impl/RoleServiceImpl.java | 121 +++++++++++++----- .../impl/SaasRoleUserRelationServiceImpl.java | 22 ++++ 4 files changed, 138 insertions(+), 31 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java index 1ff9f4db..41bc5268 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java @@ -9,6 +9,10 @@ import lombok.*; @EqualsAndHashCode public class QueryByIdentityIdTypeReq { + /** + * personId跟identityId、identityType不能混用 + * 只存在使用personId或者identityId\identityType + */ Long identityId; /** diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index b5e6a2f0..f4ae20ca 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -113,6 +113,9 @@ public class ListRoleUserRelationParam { @CriteriaField(ignore = true) private Set roleCodes; + @CriteriaField(ignore = true) + private List batchPersons; + @Data @Builder @NoArgsConstructor @@ -130,4 +133,23 @@ public class ListRoleUserRelationParam { private Long ouId; } + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class BatchPerson { + private Long identityId; + + /** + * 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + */ + private Integer identityType; + + private Long workspaceId; + + private Long ouId; + + private Long personId; + } + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index aa7d50e2..e4e0a206 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -46,11 +46,14 @@ import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; import cn.axzo.tyr.server.config.MqProducer; import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload; import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload; +import cn.axzo.tyr.server.model.RelationOperateLogResourceBindRoleDO; +import cn.axzo.tyr.server.model.RelationOperateLogRoleBindResourceDO; import cn.axzo.tyr.server.model.ResourcePermission; import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO; import cn.axzo.tyr.server.model.RoleFeatureRelation; import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; +import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao; import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao; @@ -62,17 +65,22 @@ import cn.axzo.tyr.server.repository.entity.SaasFeature; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup; 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.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; -import cn.axzo.tyr.server.model.*; -import cn.axzo.tyr.server.repository.dao.*; -import cn.axzo.tyr.server.repository.entity.*; import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; -import cn.axzo.tyr.server.service.*; +import cn.axzo.tyr.server.service.PermissionGroupService; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.azxo.framework.common.constatns.Constants; import cn.hutool.core.bean.BeanUtil; @@ -325,34 +333,85 @@ public class RoleServiceImpl extends ServiceImpl @Override public List queryBatchByIdentityIdType(List req) { - List result = new ArrayList<>(); - req.stream().distinct().forEach(e -> { - if (e.getPersonId() != null) { - List roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) - .stream() - .map(SaasRoleUserRelation::getRoleId) - .collect(Collectors.toList()); - List saasRoles = getByIds(roleIds, null, null, null, false, null); - result.add(QueryBatchByIdentityIdTypeRes.builder() - .identityId(e.getIdentityId()) - .identityType(e.getIdentityType()) - .workspaceId(e.getWorkspaceId()) - .ouId(e.getOuId()) - .personId(e.getPersonId()) - .role(saasRoles) - .build()); - } else { - result.add(QueryBatchByIdentityIdTypeRes.builder() - .identityId(e.getIdentityId()) - .identityType(e.getIdentityType()) - .workspaceId(e.getWorkspaceId()) - .ouId(e.getOuId()) - .role(queryByIdentityIdType(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId(), false)) - .build()); - } + // 一起查询,减少数据库io,原来入参过多时,接口性能很差 + List batchPersons = req.stream() + .distinct() + .map(e -> { + ListRoleUserRelationParam.BatchPerson batchPerson = ListRoleUserRelationParam.BatchPerson.builder().build(); + BeanUtils.copyProperties(e, batchPerson); + return batchPerson; + }) + .collect(Collectors.toList()); + List saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .batchPersons(batchPersons) + .build()); - }); - return result; + // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType + Map> personRoles = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getPersonId(), + Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); + + Map> identityRoles = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType(), + Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); + + List allRoleIds = saasRoleUsers.stream() + .map(SaasRoleUserV2DTO::getRoleId) + .distinct() + .collect(Collectors.toList()); + + // 这里使用原来代码的查询角色信息的接口,因为接口返回的对象使用的这个接口返回对象 + Map saasRoles = getByIds(allRoleIds, null, null, null, false, null) + .stream() + .collect(Collectors.toMap(SaasRoleVO::getId, Function.identity())); + + return batchPersons.stream() + .map(e -> { + QueryBatchByIdentityIdTypeRes result = QueryBatchByIdentityIdTypeRes.builder().build(); + BeanUtils.copyProperties(e, result); + // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType + Set roleIds; + if (Objects.nonNull(e.getPersonId())) { + roleIds = personRoles.get(e.getPersonId()); + } else { + roleIds = identityRoles.get(e.getIdentityId() + "_" + e.getIdentityType()); + } + + if (CollectionUtils.isNotEmpty(roleIds)) { + result.setRole(roleIds.stream().map(saasRoles::get).collect(Collectors.toList())); + } + return result; + }) + .collect(Collectors.toList()); + + +// req.stream().distinct().forEach(e -> { +// if (e.getPersonId() != null) { +// List roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) +// .stream() +// .map(SaasRoleUserRelation::getRoleId) +// .collect(Collectors.toList()); +// List saasRoles = getByIds(roleIds, null, null, null, false, null); +// result.add(QueryBatchByIdentityIdTypeRes.builder() +// .identityId(e.getIdentityId()) +// .identityType(e.getIdentityType()) +// .workspaceId(e.getWorkspaceId()) +// .ouId(e.getOuId()) +// .personId(e.getPersonId()) +// .role(saasRoles) +// .build()); +// } else { +// result.add(QueryBatchByIdentityIdTypeRes.builder() +// .identityId(e.getIdentityId()) +// .identityType(e.getIdentityType()) +// .workspaceId(e.getWorkspaceId()) +// .ouId(e.getOuId()) +// .role(queryByIdentityIdType(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId(), false)) +// .build()); +// } +// +// }); +// return result; } @Override diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 77b7a3d4..5ef40ac8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -161,6 +161,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper); Map saasRoleUsers = listSaasRoleUser(param, page.getRecords()); @@ -170,6 +172,26 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl from(record, saasRoleUsers, saasRoles)); } + private void assembleBatchPersonWrapper(PageRoleUserRelationParam param, + QueryWrapper wrapper) { + + if (CollectionUtils.isEmpty(param.getBatchPersons())) { + return; + } + + wrapper.and(j -> { + for (ListRoleUserRelationParam.BatchPerson batchPerson : param.getBatchPersons()) { + j.or(k -> { + k.eq(Objects.nonNull(batchPerson.getPersonId()), "natural_person_id", batchPerson.getPersonId()); + k.eq(Objects.nonNull(batchPerson.getIdentityId()), "identity_id", batchPerson.getIdentityId()); + k.eq(Objects.nonNull(batchPerson.getIdentityType()), "identity_type", batchPerson.getIdentityType()); + k.eq(Objects.nonNull(batchPerson.getWorkspaceId()), "workspace_id", batchPerson.getWorkspaceId()); + k.eq(Objects.nonNull(batchPerson.getOuId()), "ou_id", batchPerson.getOuId()); + }); + } + }); + } + private Set resolveRoleIds(PageRoleUserRelationParam param) { if (CollectionUtils.isEmpty(param.getRoleCodes())) { return Optional.ofNullable(param.getRoleIds()) From 8870a1830de49cb49e256c0c87b8840750e988b1 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 13:43:25 +0800 Subject: [PATCH 04/10] =?UTF-8?q?feat:(REQ-3068)=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/RoleServiceImpl.java | 41 ++++--------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index e4e0a206..24e13098 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -347,12 +347,14 @@ public class RoleServiceImpl extends ServiceImpl .build()); // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType - Map> personRoles = saasRoleUsers.stream() - .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getPersonId(), + Map> personRoles = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> + e.getSaasRoleUser().getPersonId() + "_" + e.getSaasRoleUser().getWorkspaceId() + "_" + e.getSaasRoleUser().getOuId(), Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); Map> identityRoles = saasRoleUsers.stream() - .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType(), + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType() + + "_" + e.getSaasRoleUser().getWorkspaceId() + "_" + e.getSaasRoleUser().getOuId(), Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); List allRoleIds = saasRoleUsers.stream() @@ -372,9 +374,9 @@ public class RoleServiceImpl extends ServiceImpl // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType Set roleIds; if (Objects.nonNull(e.getPersonId())) { - roleIds = personRoles.get(e.getPersonId()); + roleIds = personRoles.get(e.getPersonId() + "_" + e.getWorkspaceId() + "_" + e.getOuId()); } else { - roleIds = identityRoles.get(e.getIdentityId() + "_" + e.getIdentityType()); + roleIds = identityRoles.get(e.getIdentityId() + "_" + e.getIdentityType() + "_" + e.getWorkspaceId() + "_" + e.getOuId()); } if (CollectionUtils.isNotEmpty(roleIds)) { @@ -383,35 +385,6 @@ public class RoleServiceImpl extends ServiceImpl return result; }) .collect(Collectors.toList()); - - -// req.stream().distinct().forEach(e -> { -// if (e.getPersonId() != null) { -// List roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) -// .stream() -// .map(SaasRoleUserRelation::getRoleId) -// .collect(Collectors.toList()); -// List saasRoles = getByIds(roleIds, null, null, null, false, null); -// result.add(QueryBatchByIdentityIdTypeRes.builder() -// .identityId(e.getIdentityId()) -// .identityType(e.getIdentityType()) -// .workspaceId(e.getWorkspaceId()) -// .ouId(e.getOuId()) -// .personId(e.getPersonId()) -// .role(saasRoles) -// .build()); -// } else { -// result.add(QueryBatchByIdentityIdTypeRes.builder() -// .identityId(e.getIdentityId()) -// .identityType(e.getIdentityType()) -// .workspaceId(e.getWorkspaceId()) -// .ouId(e.getOuId()) -// .role(queryByIdentityIdType(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId(), false)) -// .build()); -// } -// -// }); -// return result; } @Override From d766af05aa7f03717218f4576e0b875d2f21cda2 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 14:44:43 +0800 Subject: [PATCH 05/10] =?UTF-8?q?feat:(REQ-3068)=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6=E6=9C=89?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=9D=83=E9=99=90=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/client/feign/PermissionQueryApi.java | 10 ++++++ .../model/req/BatchPermissionCheckReq.java | 28 +++++++++++++++ .../model/res/BatchPermissionCheckRes.java | 34 +++++++++++++++++++ .../permission/PermissionQueryController.java | 30 ++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java create mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/res/BatchPermissionCheckRes.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java index f6bd0aa6..fb50a884 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionQueryApi.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.client.feign; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.BatchPermissionCheckReq; import cn.axzo.tyr.client.model.req.ListPermissionFeatureReq; import cn.axzo.tyr.client.model.req.NavTreeReq; import cn.axzo.tyr.client.model.req.PagePermissionReq; @@ -8,6 +9,7 @@ import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.req.TreePermissionReq; import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq; +import cn.axzo.tyr.client.model.res.BatchPermissionCheckRes; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; import cn.axzo.tyr.client.model.res.ListPermissionFeatureResp; import cn.axzo.tyr.client.model.res.NavTreeResp; @@ -44,6 +46,14 @@ public interface PermissionQueryApi { @PostMapping(value = "/api/v3/permission/query/hasPermission") ApiResult hasPermission(@RequestBody @Valid PermissionCheckReq req); + /** + * 批量鉴权 + * @param req + * @return + */ + @PostMapping(value = "/api/v3/permission/query/hasPermission/batch") + ApiResult hasPermissionBatch(@RequestBody @Valid BatchPermissionCheckReq req); + /** * 查询租户的权限树 * @param request diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java new file mode 100644 index 00000000..3267bcdc --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/BatchPermissionCheckReq.java @@ -0,0 +1,28 @@ +package cn.axzo.tyr.client.model.req; + +import cn.axzo.tyr.client.model.base.WorkspaceOUPair; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BatchPermissionCheckReq { + + @NotNull(message = "personId不能为空") + private Long personId; + + @NotEmpty(message = "workspaceOUPairs不能为空") + private List workspaceOUPairs; + + @NotBlank(message = "itemCode不能为空") + private String itemCode; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/BatchPermissionCheckRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/BatchPermissionCheckRes.java new file mode 100644 index 00000000..ab3adfec --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/BatchPermissionCheckRes.java @@ -0,0 +1,34 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BatchPermissionCheckRes { + + private List workspaceOuPermissions; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class WorkspaceOuPermission { + private Long ouId; + + private Long workspaceId; + + /** + * true表示有权限 + * false表示没权限 + */ + private Boolean permissionResult; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java index 01c7b990..bbcd3653 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionQueryController.java @@ -1,7 +1,10 @@ package cn.axzo.tyr.server.controller.permission; +import cn.axzo.basics.common.BeanMapper; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.PermissionQueryApi; +import cn.axzo.tyr.client.model.req.BatchPermissionCheckReq; +import cn.axzo.tyr.client.model.req.IdentityAuthReq; import cn.axzo.tyr.client.model.req.ListPermissionFeatureReq; import cn.axzo.tyr.client.model.req.NavTreeReq; import cn.axzo.tyr.client.model.req.PagePermissionReq; @@ -9,17 +12,22 @@ import cn.axzo.tyr.client.model.req.PagePermissionResp; import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.req.TreePermissionReq; import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq; +import cn.axzo.tyr.client.model.res.BatchPermissionCheckRes; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; +import cn.axzo.tyr.client.model.res.IdentityAuthRes; import cn.axzo.tyr.client.model.res.ListPermissionFeatureResp; import cn.axzo.tyr.client.model.res.NavTreeResp; import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp; import cn.axzo.tyr.client.model.res.TreePermissionResp; import cn.axzo.tyr.server.service.PermissionQueryService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.stream.Collectors; /** * 权限接口实现 @@ -34,6 +42,7 @@ import java.util.List; public class PermissionQueryController implements PermissionQueryApi { private final PermissionQueryService permissionService; + private final TyrSaasAuthService tyrSaasAuthService; @Override public ApiResult> getNavTree(NavTreeReq req) { @@ -50,6 +59,27 @@ public class PermissionQueryController implements PermissionQueryApi { return ApiResult.ok(permissionService.hasPermission(req)); } + @Override + public ApiResult hasPermissionBatch(BatchPermissionCheckReq req) { + + IdentityAuthReq request = IdentityAuthReq.builder().build(); + request.setPersonId(req.getPersonId()); + List pairs = BeanMapper.copyList(req.getWorkspaceOUPairs(), IdentityAuthReq.WorkspaceOuPair.class); + request.setWorkspaceOusPairs(pairs); + request.setItemCode(req.getItemCode()); + IdentityAuthRes authRes = tyrSaasAuthService.findIdentityAuthMix(request); + + return ApiResult.ok(BatchPermissionCheckRes.builder() + .workspaceOuPermissions(authRes.getPermissions().stream() + .map(e -> BatchPermissionCheckRes.WorkspaceOuPermission.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .permissionResult(CollectionUtils.isNotEmpty(e.getPermissionPoint())) + .build()) + .collect(Collectors.toList())) + .build()); + } + @Override public ApiResult> treeProduct(TreeProductFeatureResourceReq request) { return ApiResult.ok(permissionService.treeProduct(request)); From 0e9e269f4b1f9b6eb0dd4f9720255278b48ded55 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 17:13:24 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat:(REQ-3068)=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BA=BA=E5=91=98=E8=A7=92=E8=89=B2=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E7=BB=99ouId=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/RoleServiceImpl.java | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 24e13098..435befac 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -346,17 +346,6 @@ public class RoleServiceImpl extends ServiceImpl .batchPersons(batchPersons) .build()); - // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType - Map> personRoles = saasRoleUsers.stream() - .collect(Collectors.groupingBy(e -> - e.getSaasRoleUser().getPersonId() + "_" + e.getSaasRoleUser().getWorkspaceId() + "_" + e.getSaasRoleUser().getOuId(), - Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); - - Map> identityRoles = saasRoleUsers.stream() - .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType() - + "_" + e.getSaasRoleUser().getWorkspaceId() + "_" + e.getSaasRoleUser().getOuId(), - Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); - List allRoleIds = saasRoleUsers.stream() .map(SaasRoleUserV2DTO::getRoleId) .distinct() @@ -372,15 +361,35 @@ public class RoleServiceImpl extends ServiceImpl QueryBatchByIdentityIdTypeRes result = QueryBatchByIdentityIdTypeRes.builder().build(); BeanUtils.copyProperties(e, result); // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType - Set roleIds; - if (Objects.nonNull(e.getPersonId())) { - roleIds = personRoles.get(e.getPersonId() + "_" + e.getWorkspaceId() + "_" + e.getOuId()); - } else { - roleIds = identityRoles.get(e.getIdentityId() + "_" + e.getIdentityType() + "_" + e.getWorkspaceId() + "_" + e.getOuId()); - } + // 因为入参workspaceId和ouId不一定都有,所以不好转成map去取,只能遍历,数据量不大,所以还好 + Set roleIds = saasRoleUsers.stream() + .filter(role -> { + if (Objects.nonNull(e.getIdentityType()) && !Objects.equals(e.getIdentityType(), role.getSaasRoleUser().getIdentityType())) { + return false; + } + + if (Objects.nonNull(e.getIdentityId()) && !Objects.equals(e.getIdentityId(), role.getSaasRoleUser().getIdentityId())) { + return false; + } + + if (Objects.nonNull(e.getPersonId()) && !Objects.equals(e.getPersonId(), role.getSaasRoleUser().getPersonId())) { + return false; + } + + if (Objects.nonNull(e.getWorkspaceId()) && !Objects.equals(e.getWorkspaceId(), role.getSaasRoleUser().getWorkspaceId())) { + return false; + } + + if (Objects.nonNull(e.getOuId()) && !Objects.equals(e.getOuId(), role.getSaasRoleUser().getOuId())) { + return false; + } + return true; + }) + .map(SaasRoleUserV2DTO::getRoleId) + .collect(Collectors.toSet()); if (CollectionUtils.isNotEmpty(roleIds)) { - result.setRole(roleIds.stream().map(saasRoles::get).collect(Collectors.toList())); + result.setRole(roleIds.stream().map(saasRoles::get).filter(Objects::nonNull).collect(Collectors.toList())); } return result; }) From 9ae581f5fbd2c4fec0852b4fe3da36df2927eb3e Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 18:42:17 +0800 Subject: [PATCH 07/10] =?UTF-8?q?feat:(REQ-3068)=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=96=B0=E8=8F=9C=E5=8D=95=E8=B7=9F=E8=8F=9C=E5=8D=95=E7=AB=AF?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasFeatureResourceServiceImpl.java | 6 +++++- .../tyr/server/service/impl/TyrSaasAuthServiceImpl.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index e6b701dc..2a6b676a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -858,7 +858,11 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl { + f.addAll(s); + return f; + })); } private List resolveSaasFeature(Set terminals) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index 1fbeaa3e..36b43f84 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -814,6 +814,7 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { try { return findIdentityAuthV2(req).getPermissions(); } catch (Exception ex) { + log.error("", ex); log.error("查询权限异常,执行降级处理"); return findIdentityAuth(req).getPermissions(); } From 4d329323913c3c505822a257c63810c3c90bcd08 Mon Sep 17 00:00:00 2001 From: lilong Date: Fri, 11 Oct 2024 18:53:08 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat:(REQ-3068)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=89=93=E5=8D=B0=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index 36b43f84..b7780cb4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -812,10 +812,10 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { } try { + System.out.println(100/0); return findIdentityAuthV2(req).getPermissions(); } catch (Exception ex) { - log.error("", ex); - log.error("查询权限异常,执行降级处理"); + log.error("查询权限异常,执行降级处理,", ex); return findIdentityAuth(req).getPermissions(); } } From b1f98935f9c2c97c7022f51d8715582cc3b2149a Mon Sep 17 00:00:00 2001 From: lilong Date: Sat, 12 Oct 2024 09:25:21 +0800 Subject: [PATCH 09/10] =?UTF-8?q?feat:(REQ-3068)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=89=93=E5=8D=B0=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index b7780cb4..2bf4f827 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -812,7 +812,6 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { } try { - System.out.println(100/0); return findIdentityAuthV2(req).getPermissions(); } catch (Exception ex) { log.error("查询权限异常,执行降级处理,", ex); From f414070272c727ab8843759578c665ca25a03e80 Mon Sep 17 00:00:00 2001 From: lilong Date: Sat, 12 Oct 2024 11:40:34 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20(feature/REQ-3068)=20=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=96=B0=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E6=8E=A5=E5=8F=A3=E5=BC=95=E7=94=A8=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E5=A4=AA=E5=A4=9A=EF=BC=8C=E9=9C=80=E8=A6=81=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E7=9A=84=E5=9C=B0=E6=96=B9=E5=A4=AA=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/tyr/client/feign/TyrSaasRoleApi.java | 4 +++ .../controller/role/SaasRoleController.java | 5 +++ .../axzo/tyr/server/service/RoleService.java | 3 ++ .../server/service/impl/RoleServiceImpl.java | 32 +++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java index 9e351c72..013ac1e8 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -107,9 +107,13 @@ public interface TyrSaasRoleApi { * * @return */ + @Deprecated @PostMapping("/api/saasRole/queryBatchByIdentityIdType") ApiResult> queryBatchByIdentityIdType(@RequestBody List req); + @PostMapping("/api/saasRole/queryBatchByIdentityIdType/v2") + ApiResult> queryBatchByIdentityIdTypeV2(@RequestBody List req); + /** * 根据身份id身份类型查询是否为超管 * diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java index c2f8cabb..d380b81b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -173,6 +173,11 @@ public class SaasRoleController implements TyrSaasRoleApi { return ApiResult.ok(roleService.queryBatchByIdentityIdType(req)); } + @Override + public ApiResult> queryBatchByIdentityIdTypeV2(List req) { + return ApiResult.ok(roleService.queryBatchByIdentityIdTypeV2(req)); + } + @Override public ApiResult> isSuperAdmin(List req) { return ApiResult.ok(roleService.isSuperAdmin(req)); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java index 2274e702..3174d2f0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -55,8 +55,11 @@ public interface RoleService extends IService { List query(QuerySaasRoleReq req); + @Deprecated List queryBatchByIdentityIdType(List req); + List queryBatchByIdentityIdTypeV2(List req); + Long saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole); List isSuperAdmin(List req); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 435befac..65366659 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -333,6 +333,38 @@ public class RoleServiceImpl extends ServiceImpl @Override public List queryBatchByIdentityIdType(List req) { + List result = new ArrayList<>(); + req.stream().distinct().forEach(e -> { + if (e.getPersonId() != null) { + List roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) + .stream() + .map(SaasRoleUserRelation::getRoleId) + .collect(Collectors.toList()); + List saasRoles = getByIds(roleIds, null, null, null, false, null); + result.add(QueryBatchByIdentityIdTypeRes.builder() + .identityId(e.getIdentityId()) + .identityType(e.getIdentityType()) + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .personId(e.getPersonId()) + .role(saasRoles) + .build()); + } else { + result.add(QueryBatchByIdentityIdTypeRes.builder() + .identityId(e.getIdentityId()) + .identityType(e.getIdentityType()) + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .role(queryByIdentityIdType(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId(), false)) + .build()); + } + + }); + return result; + } + + @Override + public List queryBatchByIdentityIdTypeV2(List req) { // 一起查询,减少数据库io,原来入参过多时,接口性能很差 List batchPersons = req.stream() .distinct()