diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateRoleController.java index fca271ff..37a731f9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateRoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateRoleController.java @@ -125,9 +125,9 @@ public class PrivateRoleController { superAdmin.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); superAdmin.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); superAdmin.setRoleCode(e.getRoleCode()); - superAdmin.setWorkspaceId(-1L); + superAdmin.setWorkspaceId(0L); superAdmin.setWorkspaceType(e.getWorkspaceType()); - superAdmin.setOwnerOuId(-1L); + superAdmin.setOwnerOuId(0L); superAdmin.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); superAdmin.setIsDelete(0L); superAdmin.setCreateAt(now); @@ -200,14 +200,14 @@ public class PrivateRoleController { } Map initSuperAdminRoles = allSuperAdminRoles.stream() - .filter(e -> e.getWorkspaceId() == -1L) + .filter(e -> e.getWorkspaceId() == 0L) .collect(Collectors.toMap(SaasRoleRes::getWorkspaceType, Function.identity())); if (initSuperAdminRoles.isEmpty()) { return "ok"; } List oldSuperAdminRoles = allSuperAdminRoles.stream() - .filter(e -> e.getWorkspaceId() != -1L) + .filter(e -> e.getWorkspaceId() > 0L) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(oldSuperAdminRoles)) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java index 888a33d3..eedd7241 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java @@ -91,13 +91,9 @@ public class SaasRoleDao extends ServiceImpl { .list(); } - public Page pageQueryForOUWorkspace(RoleWithUserQueryReq req) { + public Page pageQueryForOUWorkspace(RoleWithUserQueryReq req, Integer superAdminWorkspaceType) { IPage page = new Page<>(req.getPage(), req.getPageSize()); - return this.baseMapper.pageQueryForOUWorkspace(page, req.getOuId(), req.getWorkspaceId(), req.getWorkspaceJoinType()); - } - - public List listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType) { - return this.baseMapper.listForOUWorkspace(ouId, workspaceId, workspaceJoinType); + return this.baseMapper.pageQueryForOUWorkspace(page, req.getOuId(), req.getWorkspaceId(), req.getWorkspaceJoinType(), superAdminWorkspaceType); } public void removeWorkspaceOuAllRole(Long workspaceId, Long ouId) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java index 3a992c58..eb4a7aff 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java @@ -22,7 +22,8 @@ public interface SaasRoleMapper extends BaseMapper { List listRoleUserByPermissionGroup(List permissionGroupIds, Set workspaceIds); - Page pageQueryForOUWorkspace(IPage page, Long ouId, Long workspaceId, Integer workspaceJoinType); + Page pageQueryForOUWorkspace(IPage page, Long ouId, Long workspaceId, Integer workspaceJoinType, + Integer superAdminWorkspaceType); List listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType); 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 aed4cf8a..888e9065 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 @@ -1,5 +1,8 @@ package cn.axzo.tyr.server.service.impl; +import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; +import cn.axzo.apollo.workspace.api.workspace.req.GetSimpleWorkspaceReqV2; +import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.basics.profiles.api.UserProfileServiceApi; @@ -87,6 +90,7 @@ 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.axzo.tyr.server.utils.RpcExternalUtil; import cn.azxo.framework.common.constatns.Constants; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -205,6 +209,8 @@ public class RoleServiceImpl extends ServiceImpl @Autowired private MqProducer mqProducer; + @Autowired + private WorkspaceApi workspaceApi; private static final String TARGET_TYPE = "saasFeatureResourceId"; @@ -344,9 +350,41 @@ public class RoleServiceImpl extends ServiceImpl .eq(Objects.nonNull(req.getProductUnitType()), SaasRole::getProductUnitType, req.getProductUnitType()) .orderByDesc(BaseEntity::getId) .list(); + + list.addAll(listSuperAdmin(req)); + return getByIds(list.stream().map(BaseEntity::getId).collect(Collectors.toList()), req.getIsCommon(), req.getWorkspaceId(), req.getOuId(), req.getIncludePermissionGroup(), req.getIncludeSpecialRole()); } + /** + * 历史每个workspaceId都有一个超管角色,现在每个业务类一个超管角色, + * 新的超管角色workspaceId = 0(不是-1是因为很多接口默认就会查询-1的数据,要过滤掉超管角色比较复杂) + * 历史传入workspaceId时会查询出项目的超管角色,所以有传workspaceId时需要兼容历史接口 + * @param req + * @return + */ + private List listSuperAdmin(QuerySaasRoleReq req) { + if (CollectionUtils.isEmpty(req.getWorkspaceId())) { + return Collections.emptyList(); + } + + GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder() + .ids(req.getWorkspaceId()) + .build(); + List workspaces = RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), + "查询项目信息", build); + if (CollectionUtils.isEmpty(workspaces)) { + return Collections.emptyList(); + } + + return saasRoleDao.lambdaQuery() + .eq(SaasRole::getWorkspaceId, 0) + .eq(SaasRole::getOwnerOuId, 0) + .in(SaasRole::getWorkspaceType, Lists.transform(workspaces, SimpleWorkspaceRes::getType)) + .eq(SaasRole::getRoleType, RoleTypeEnum.SUPER_ADMIN.getValue()) + .list(); + } + @Override public List queryBatchByIdentityIdType(List req) { List result = new ArrayList<>(); @@ -905,11 +943,35 @@ public class RoleServiceImpl extends ServiceImpl .list(); } + /** + * 历史每个workspaceId都有一个超管角色,现在每个业务类一个超管角色, + * 新的超管角色workspaceId = 0(不是-1是因为很多接口默认就会查询-1的数据,要过滤掉超管角色比较复杂) + * 历史传入workspaceId时会查询出项目的超管角色,所以有传workspaceId时需要兼容历史接口 + * @param req + * @return + */ + private Integer resolveSuperAdminWorkspaceType(RoleWithUserQueryReq req) { + if (Objects.isNull(req.getWorkspaceId())) { + return null; + } + GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder() + .ids(Lists.newArrayList(req.getWorkspaceId())) + .build(); + List workspaces = RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), + "查询项目信息", build); + return workspaces.stream() + .map(SimpleWorkspaceRes::getType) + .findFirst() + .orElse(null); + } + @Override public PageResp queryRoleWithUser(RoleWithUserQueryReq req) { page2Default(req); //按role进行分页查询 - - Page rolePage = saasRoleDao.pageQueryForOUWorkspace(req); + Integer superAdminWorkspaceType = resolveSuperAdminWorkspaceType(req); + Page rolePage = saasRoleDao.pageQueryForOUWorkspace(req, superAdminWorkspaceType); + if (CollectionUtil.isEmpty(rolePage.getRecords())) { return PageResp.list(req.getPage(), req.getPageSize(), 0L, Collections.emptyList()); } @@ -1366,6 +1428,9 @@ public class RoleServiceImpl extends ServiceImpl wrapper.in(CollectionUtils.isNotEmpty(roleIds), "id", roleIds); } + // 因为历史是每一个workspaceId一个超管角色,现在是一个workspaceType一个超管角色, + // 为了兼容历史情况,入参有workspaceId,且roleType为空或者roleType包含superAdmin的,需要组装superAdmin的查询条件 + assembleSuperAdminWrapper(param, wrapper); IPage page = this.page(PageConverter.toMybatis(param, SaasRole.class), wrapper); @@ -1386,6 +1451,55 @@ public class RoleServiceImpl extends ServiceImpl permissionRelations)); } + /** + * 因为历史是每一个workspaceId一个超管角色,现在是一个workspaceType一个超管角色, + * 为了兼容历史情况,入参有workspaceId,且roleType为空或者roleType包含superAdmin的,需要组装superAdmin的查询条件 + * @param param + * @param wrapper + */ + private void assembleSuperAdminWrapper(PageRoleReq param, QueryWrapper wrapper) { + if (Objects.isNull(param.getWorkspaceId()) + && CollectionUtils.isEmpty(param.getWorkspaceIds()) + && CollectionUtils.isEmpty(param.getWorkspaceOuPairs())) { + return; + } + + if (CollectionUtils.isEmpty(param.getRoleTypes()) + || !param.getRoleTypes().contains(RoleTypeEnum.SUPER_ADMIN.getValue())) { + return; + } + + List workspaceIds = Lists.newArrayList(); + if (Objects.nonNull(param.getWorkspaceId())) { + workspaceIds.add(param.getWorkspaceId()); + } + if (CollectionUtils.isNotEmpty(param.getWorkspaceIds())) { + workspaceIds.addAll(param.getWorkspaceIds()); + } + + if (CollectionUtils.isNotEmpty(param.getWorkspaceOuPairs())) { + workspaceIds.addAll(param.getWorkspaceOuPairs().stream() + .map(ListRoleUserRelationParam.WorkspaceOuPair::getWorkspaceId) + .collect(Collectors.toList())); + } + + GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder() + .ids(workspaceIds) + .build(); + List workspaces = RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), + "查询项目信息", build); + if (CollectionUtils.isEmpty(workspaces)) { + return; + } + + wrapper.or(j -> { + j.in("workspace_type", Lists.transform(workspaces, SimpleWorkspaceRes::getType)); + j.eq("owner_ou_id", 0L); + j.eq("workspace_id", 0L); + j.eq("role_type", RoleTypeEnum.SUPER_ADMIN.getValue()); + }); + } + private Set resolveRoleGroupCodes(PageRoleReq param) { if (CollectionUtils.isEmpty(param.getRoleGroupCodes())) { return Collections.emptySet(); @@ -1703,6 +1817,11 @@ public class RoleServiceImpl extends ServiceImpl ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() .roleIds(roleIds) .needUsers(param.getNeedRoleUser()) + .workspaceId(param.getWorkspaceId()) + .workspaceIds(Optional.ofNullable(param.getWorkspaceIds()) + .map(Sets::newHashSet) + .orElse(null)) + .workspaceOuPairs(param.getWorkspaceOuPairs()) .build(); List saasRoleUserV2DTOS = saasRoleUserRelationService.listV2(listRoleUserRelationParam); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index 2399b49d..0e6a492b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -286,22 +286,18 @@ public class RoleUserService implements SaasRoleUserService { @Transactional(rollbackFor = Exception.class) public void createSuperAdminRole(CreateSuperAdminRoleParam param) { //获取超管角色 - SaasRole superAdmin = findSuperAdmin(param.getWorkspaceId(), param.getOuId(), param.getWorkspaceType()); - if (superAdmin == null) { - superAdmin = new SaasRole(); - superAdmin.setDescription(RoleTypeEnum.SUPER_ADMIN.getDesc()); - superAdmin.setName(RoleTypeEnum.SUPER_ADMIN.getDesc()); - superAdmin.setWorkspaceId(param.getWorkspaceId()); - superAdmin.setWorkspaceType(param.getWorkspaceType()); - superAdmin.setOwnerOuId(param.getOuId()); - superAdmin.setRoleType(RoleTypeEnum.SUPER_ADMIN.getValue()); - superAdmin.setIsDelete(0L); - DictWorkSpaceTypeEnum dictWorkSpaceTypeEnum = DictWorkSpaceTypeEnum.getByValueWorkspaceType(param.getWorkspaceType()); - superAdmin.setProductUnitType(dictWorkSpaceTypeEnum == null ? 0 : dictWorkSpaceTypeEnum.getSuperAdminProductType()); + // 因为以前一个项目一个超管 + // 不根据code查询,是因为增加一个业务的超管,就需要维护 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceType(param.getWorkspaceType()) + .build(); + SaasRoleRes superAdmin = roleService.list(listRoleReq).stream() + .findFirst() + .orElse(null); + + AssertUtil.notNull(superAdmin, "超管角色不存在,请联系业务初始化超管角色"); - checkRoleName(RoleTypeEnum.SUPER_ADMIN.getDesc(), param.getWorkspaceId(), param.getOuId()); - saasRoleDao.save(superAdmin); - } //删除当前超管角色 removeOldSuperAdmin(superAdmin.getId(), param.getWorkspaceId(), param.getOuId()); @@ -348,25 +344,28 @@ public class RoleUserService implements SaasRoleUserService { @Override public List batchSuperAdminList(List param) { - LambdaQueryChainWrapper roleWrapper = saasRoleDao.lambdaQuery(); - roleWrapper.and(w -> - param.forEach(c -> w.or() - .eq(SaasRole::getOwnerOuId, c.getOuId()) - .eq(SaasRole::getWorkspaceId, c.getWorkspaceId()))); - roleWrapper.eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .eq(SaasRole::getRoleType, RoleTypeEnum.SUPER_ADMIN.getValue()); - List roleList = roleWrapper.list(); + // 兼容上线历史数据还没清洗的间隙,查询超管角色需要根据workspaceId和预设的超管一起 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceOuPairs(param.stream() + .map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .build()) + .collect(Collectors.toList())) + .build(); + List roleList = roleService.list(listRoleReq); if (CollectionUtils.isEmpty(roleList)) { return Collections.emptyList(); } LambdaQueryChainWrapper userRoleWrapper = roleUserRelationDao.lambdaQuery(); userRoleWrapper.and(w -> - roleList.forEach(c -> w.or() - .eq(SaasRoleUserRelation::getOuId, c.getOwnerOuId()) + param.forEach(c -> w.or() + .eq(SaasRoleUserRelation::getOuId, c.getOuId()) .eq(SaasRoleUserRelation::getWorkspaceId, c.getWorkspaceId()) - .eq(SaasRoleUserRelation::getRoleId, c.getId()) )); + userRoleWrapper.in(SaasRoleUserRelation::getRoleId, roleList.stream().map(SaasRoleRes::getId).collect(Collectors.toList())); userRoleWrapper.eq(SaasRoleUserRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value); List relations = userRoleWrapper.list(); @@ -388,15 +387,23 @@ public class RoleUserService implements SaasRoleUserService { if (param.getWorkspaceId() == null || Objects.isNull(param.getOuId())) { return Collections.emptyList(); } - SaasRole saasRole = saasRoleDao.findRoleByTypeAndWorkspaceIdAndOuId(RoleTypeEnum.SUPER_ADMIN.getValue(), - param.getWorkspaceId(), param.getOuId()); - if (Objects.isNull(saasRole)) { + + // 兼容上线历史数据还没清洗的间隙,查询超管角色需要根据workspaceId和预设的超管一起 + ListRoleReq listRoleReq = ListRoleReq.builder() + .roleTypes(Lists.newArrayList(RoleTypeEnum.SUPER_ADMIN.getValue())) + .workspaceOuPairs(Lists.newArrayList(ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(param.getWorkspaceId()) + .ouId(param.getOuId()) + .build())) + .build(); + List saasRoles = roleService.list(listRoleReq); + if (CollectionUtils.isEmpty(saasRoles)) { return Collections.emptyList(); } List relations = roleUserRelationDao.lambdaQuery() .eq(SaasRoleUserRelation::getWorkspaceId, param.getWorkspaceId()) .eq(SaasRoleUserRelation::getOuId, param.getOuId()) - .in(SaasRoleUserRelation::getRoleId, saasRole.getId()) + .in(SaasRoleUserRelation::getRoleId, saasRoles.stream().map(SaasRoleRes::getId).collect(Collectors.toList())) .eq(SaasRoleUserRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); if (CollectionUtils.isEmpty(relations)) { return Collections.emptyList(); diff --git a/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml b/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml index 2e417232..c10fc25a 100644 --- a/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml +++ b/tyr-server/src/main/resources/mapper/SaasRoleMapper.xml @@ -104,6 +104,8 @@ ( r.workspace_id = #{workspaceId} AND r.owner_ou_id = #{ouId} AND (r.role_type = 'common' OR r.role_type = 'super_admin') ) OR ( r.owner_ou_id = - 1 AND FIND_IN_SET( #{workspaceJoinType},g.ou_type_code) > 0) + OR + ( r.workspace_type = #{superAdminWorkspaceType} AND r.workspace_id = 0 AND r.owner_ou_id = 0 and r.role_type = 'super_admin') ) @@ -111,10 +113,6 @@ - -