Merge branch 'release-20250121' into 'master'

Release 20250121

See merge request universal/infrastructure/backend/tyr!405
This commit is contained in:
李龙 2025-01-21 02:22:02 +00:00
commit fe3e8a52ab
3 changed files with 163 additions and 59 deletions

View File

@ -44,15 +44,21 @@ public class ListRoleReq {
private String roleCode; private String roleCode;
/** /**
* 租户id * 项目id
* 因为原来每一个workspace都有一个superAdmin角色现在同一个workspaceType只有一个superAdmin角色
* 为了兼容历史代码传入了workspaceId时
* 需要自动补充sql(workspaceId = #workspaceId# or (workspaceId = 0 and workspaceType = #workspaceType#))
*/ */
@CriteriaField(field = "workspaceId", operator = Operator.IN) @CriteriaField(ignore = true)
private List<Long> workspaceIds; private List<Long> workspaceIds;
/** /**
* 单位id * 单位id
* 因为原来每一个workspace都有一个superAdmin角色现在同一个workspaceType只有一个superAdmin角色
* 为了兼容历史代码传入了ouId时因为不会单独给ouIds查询
* 需要自动补充sql(ouId = #ouId# or (ouId = 0 ))
*/ */
@CriteriaField(field = "ownerOuId", operator = Operator.IN) @CriteriaField(ignore = true)
private List<Long> ouIds; private List<Long> ouIds;
/** /**
@ -140,15 +146,32 @@ public class ListRoleReq {
@CriteriaField(ignore = true) @CriteriaField(ignore = true)
private String terminal; private String terminal;
@CriteriaField(field = "workspaceId", operator = Operator.EQ) /**
* 因为原来每一个workspace都有一个superAdmin角色现在同一个workspaceType只有一个superAdmin角色
* 为了兼容历史代码传入了workspaceId时
* 需要自动补充sql(workspaceId = #workspaceId# or (workspaceId = 0 and workspaceType = #workspaceType#))
*/
@CriteriaField(ignore = true)
private Long workspaceId; private Long workspaceId;
@CriteriaField(field = "ownerOuId", operator = Operator.EQ) /**
* 单位id
* 因为原来每一个workspace都有一个superAdmin角色现在同一个workspaceType只有一个superAdmin角色
* 为了兼容历史代码传入了ouId时因为不会单独给ouIds查询
* 需要自动补充sql(ouId = #ouId# or (ouId = 0 ))
*/
@CriteriaField(ignore = true)
private Long ouId; private Long ouId;
/** /**
* workspaceId和ouId配对查询 * workspaceId和ouId配对查询
* 例如((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) * 例如((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##))
*
* 因为原来每一个workspace都有一个superAdmin角色现在同一个workspaceType只有一个superAdmin角色
* 为了兼容历史代码传入了workspaceId时
* 需要自动补充sql
* ((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##) or (ouId = 0 and workspaceId = 0 and workspaceType = #workspaceType#))
*
*/ */
@CriteriaField(ignore = true) @CriteriaField(ignore = true)
private List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs; private List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs;

View File

@ -1404,23 +1404,6 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
public cn.axzo.foundation.page.PageResp<SaasRoleRes> page(PageRoleReq param) { public cn.axzo.foundation.page.PageResp<SaasRoleRes> page(PageRoleReq param) {
QueryWrapper<SaasRole> wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class); QueryWrapper<SaasRole> wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class);
wrapper.eq("is_delete", 0); wrapper.eq("is_delete", 0);
List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs = Lists.newArrayList();
if (Boolean.TRUE.equals(param.getNeedPresetRole())) {
workspaceOuPairs.add(PRESET_WORKSPACE_OU_PAIR);
}
CollectionUtils.addAll(workspaceOuPairs, Optional.ofNullable(param.getWorkspaceOuPairs())
.map(List::listIterator)
.orElseGet(Collections::emptyListIterator));
if (CollectionUtils.isNotEmpty(workspaceOuPairs)) {
wrapper.and(j -> {
for (ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair : workspaceOuPairs) {
j.or(k -> {
k.eq(Objects.nonNull(workspaceOuPair.getOuId()), "owner_ou_id", workspaceOuPair.getOuId());
k.eq(Objects.nonNull(workspaceOuPair.getWorkspaceId()), "workspace_id", workspaceOuPair.getWorkspaceId());
});
}
});
}
if (CollectionUtils.isNotEmpty(param.getRoleGroupCodes())) { if (CollectionUtils.isNotEmpty(param.getRoleGroupCodes())) {
Set<Long> roleIds = resolveRoleGroupCodes(param); Set<Long> roleIds = resolveRoleGroupCodes(param);
@ -1430,9 +1413,13 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
wrapper.in(CollectionUtils.isNotEmpty(roleIds), "id", roleIds); wrapper.in(CollectionUtils.isNotEmpty(roleIds), "id", roleIds);
} }
// 因为历史是每一个workspaceId一个超管角色现在是一个workspaceType一个超管角色 // 因为历史是每一个workspaceId一个超管角色现在是一个workspaceType一个超管角色
// 为了兼容历史情况入参有workspaceId且roleType为空或者roleType包含superAdmin的需要组装superAdmin的查询条件 // 入参有workspaceId的时候需要组装workspaceId = 0 and workspaceType = #workspaceType#
assembleSuperAdminWrapper(param, wrapper); resolveWorkspaceOuPairWrapper(param, wrapper);
resolveWorkspaceIdWrapper(param, wrapper);
resolveWorkspaceIdsWrapper(param, wrapper);
resolveOuIdWrapper(param, wrapper);
resolveOuIdsWrapper(param, wrapper);
IPage<SaasRole> page = this.page(PageConverter.toMybatis(param, SaasRole.class), wrapper); IPage<SaasRole> page = this.page(PageConverter.toMybatis(param, SaasRole.class), wrapper);
@ -1453,53 +1440,110 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
permissionRelations)); permissionRelations));
} }
/** private void resolveWorkspaceOuPairWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
* 因为历史是每一个workspaceId一个超管角色现在是一个workspaceType一个超管角色
* 为了兼容历史情况入参有workspaceId且roleType为空或者roleType包含superAdmin的需要组装superAdmin的查询条件 if (BooleanUtils.isNotTrue(param.getNeedPresetRole()) && CollectionUtils.isEmpty(param.getWorkspaceOuPairs())) {
* @param param
* @param wrapper
*/
private void assembleSuperAdminWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
if (Objects.isNull(param.getWorkspaceId())
&& CollectionUtils.isEmpty(param.getWorkspaceIds())
&& CollectionUtils.isEmpty(param.getWorkspaceOuPairs())) {
return; return;
} }
if (CollectionUtils.isEmpty(param.getRoleTypes()) List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs = Optional.ofNullable(param.getWorkspaceOuPairs())
|| !param.getRoleTypes().contains(RoleTypeEnum.SUPER_ADMIN.getValue())) { .orElseGet(Lists::newArrayList);
return;
}
List<Long> workspaceIds = Lists.newArrayList(); List<Long> workspaceIds = workspaceOuPairs.stream()
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) .map(ListRoleUserRelationParam.WorkspaceOuPair::getWorkspaceId)
.collect(Collectors.toList())); .collect(Collectors.toList());
Set<Integer> workspaceTypes = listWorkspaceType(workspaceIds);
if (BooleanUtils.isTrue(param.getNeedPresetRole())) {
workspaceOuPairs.add(PRESET_WORKSPACE_OU_PAIR);
}
wrapper.and(j -> {
for (ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair : workspaceOuPairs) {
j.or(k -> {
k.eq(Objects.nonNull(workspaceOuPair.getOuId()), "owner_ou_id", workspaceOuPair.getOuId());
k.eq(Objects.nonNull(workspaceOuPair.getWorkspaceId()), "workspace_id", workspaceOuPair.getWorkspaceId());
});
}
j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> {
k.eq("workspace_id", 0L);
k.in("workspace_type", workspaceTypes);
});
});
}
private void resolveWorkspaceIdWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
if (Objects.isNull(param.getWorkspaceId())) {
return;
}
Set<Integer> workspaceTypes = listWorkspaceType(Lists.newArrayList(param.getWorkspaceId()));
wrapper.and(j -> {
j.or(k -> k.eq("workspace_id", param.getWorkspaceId()));
j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> {
k.eq("workspace_id", 0L);
k.in("workspace_type", workspaceTypes);
});
});
}
private void resolveOuIdWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
if (Objects.isNull(param.getOuId())) {
return;
}
wrapper.and(j -> {
j.or(k -> k.eq("owner_ou_id", param.getOuId()));
j.or(k -> k.eq("owner_ou_id", 0L));
});
}
private void resolveOuIdsWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
if (CollectionUtils.isEmpty(param.getOuIds())) {
return;
}
wrapper.and(j -> {
j.or(k -> k.in("owner_ou_id", param.getOuIds()));
j.or(k -> k.eq("owner_ou_id", 0L));
});
}
private void resolveWorkspaceIdsWrapper(PageRoleReq param, QueryWrapper<SaasRole> wrapper) {
if (CollectionUtils.isEmpty(param.getWorkspaceIds())) {
return;
}
Set<Integer> workspaceTypes = listWorkspaceType(param.getWorkspaceIds());
wrapper.and(j -> {
j.or(k -> k.in("workspace_id", param.getWorkspaceIds()));
j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> {
k.eq("workspace_id", 0L);
k.in("workspace_type", workspaceTypes);
});
});
}
private Set<Integer> listWorkspaceType(List<Long> workspaceIds) {
if (CollectionUtils.isEmpty(workspaceIds)) {
return Collections.emptySet();
} }
GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder() GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder()
.ids(workspaceIds) .ids(workspaceIds)
.build(); .build();
List<SimpleWorkspaceRes> workspaces = RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), return RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build),
"查询项目信息", build); "查询项目信息", build)
if (CollectionUtils.isEmpty(workspaces)) { .stream()
return; .map(SimpleWorkspaceRes::getType)
} .collect(Collectors.toSet());
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<Long> resolveRoleGroupCodes(PageRoleReq param) { private Set<Long> resolveRoleGroupCodes(PageRoleReq param) {

View File

@ -311,5 +311,42 @@ class RoleServiceTest extends BaseTest {
.build()); .build());
Assertions.assertEquals(roles.size(), 1); Assertions.assertEquals(roles.size(), 1);
// 直接查询超管角色 // 直接查询超管角色
roles = roleService.list(ListRoleReq.builder()
.roleIds(Lists.newArrayList(101101L))
.workspaceId(3L)
.build());
Assertions.assertEquals(roles.size(), 1);
roles = roleService.list(ListRoleReq.builder()
.workspaceOuPairs(Lists.newArrayList(
ListRoleUserRelationParam.WorkspaceOuPair.builder().workspaceId(3L)
.ouId(4L).build()
))
.needPresetRole(true)
.build());
Assertions.assertEquals(roles.size(), 6);
roles = roleService.list(ListRoleReq.builder()
.roleIds(Lists.newArrayList(101101L, 3416L))
.workspaceId(3L)
.ouId(4L)
.build());
Assertions.assertEquals(roles.size(), 2);
roles = roleService.list(ListRoleReq.builder()
.roleIds(Lists.newArrayList(101101L, 3416L))
.roleTypes(Lists.newArrayList("super_admin"))
.workspaceId(3L)
.ouId(4L)
.build());
Assertions.assertEquals(roles.size(), 1);
roles = roleService.list(ListRoleReq.builder()
.roleIds(Lists.newArrayList(101101L, 3416L))
.workspaceId(3L)
.ouIds(Lists.newArrayList(4L))
.build());
Assertions.assertEquals(roles.size(), 2);
} }
} }