feat:(REQ-3068) 修改原用户查询角色接口,解决循环查询导致接口性能差的问题
This commit is contained in:
parent
b1c3989166
commit
bd0f4e83d1
@ -9,6 +9,10 @@ import lombok.*;
|
|||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
public class QueryByIdentityIdTypeReq {
|
public class QueryByIdentityIdTypeReq {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* personId跟identityId、identityType不能混用
|
||||||
|
* 只存在使用personId或者identityId\identityType
|
||||||
|
*/
|
||||||
Long identityId;
|
Long identityId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -113,6 +113,9 @@ public class ListRoleUserRelationParam {
|
|||||||
@CriteriaField(ignore = true)
|
@CriteriaField(ignore = true)
|
||||||
private Set<String> roleCodes;
|
private Set<String> roleCodes;
|
||||||
|
|
||||||
|
@CriteriaField(ignore = true)
|
||||||
|
private List<BatchPerson> batchPersons;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@ -130,4 +133,23 @@ public class ListRoleUserRelationParam {
|
|||||||
private Long ouId;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,11 +46,14 @@ import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
|
|||||||
import cn.axzo.tyr.server.config.MqProducer;
|
import cn.axzo.tyr.server.config.MqProducer;
|
||||||
import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload;
|
import cn.axzo.tyr.server.event.payload.RolePermissionCreatedPayload;
|
||||||
import cn.axzo.tyr.server.event.payload.SaasFeatureResourceUpsertPayload;
|
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.ResourcePermission;
|
||||||
import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
|
import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
|
||||||
import cn.axzo.tyr.server.model.RoleFeatureRelation;
|
import cn.axzo.tyr.server.model.RoleFeatureRelation;
|
||||||
import cn.axzo.tyr.server.model.RoleWithFeature;
|
import cn.axzo.tyr.server.model.RoleWithFeature;
|
||||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
|
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.SaasPermissionGroupDao;
|
||||||
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
|
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
|
||||||
import cn.axzo.tyr.server.repository.dao.SaasPgroupRoleRelationDao;
|
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.SaasFeatureResource;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup;
|
import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
|
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.SaasPgroupRoleRelation;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasRole;
|
import cn.axzo.tyr.server.repository.entity.SaasRole;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
|
import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
|
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
|
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
|
||||||
import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser;
|
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.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.axzo.tyr.server.util.RpcInternalUtil;
|
||||||
import cn.azxo.framework.common.constatns.Constants;
|
import cn.azxo.framework.common.constatns.Constants;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
@ -325,34 +333,85 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<QueryBatchByIdentityIdTypeRes> queryBatchByIdentityIdType(List<QueryByIdentityIdTypeReq> req) {
|
public List<QueryBatchByIdentityIdTypeRes> queryBatchByIdentityIdType(List<QueryByIdentityIdTypeReq> req) {
|
||||||
List<QueryBatchByIdentityIdTypeRes> result = new ArrayList<>();
|
// 一起查询,减少数据库io,原来入参过多时,接口性能很差
|
||||||
req.stream().distinct().forEach(e -> {
|
List<ListRoleUserRelationParam.BatchPerson> batchPersons = req.stream()
|
||||||
if (e.getPersonId() != null) {
|
.distinct()
|
||||||
List<Long> roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId())
|
.map(e -> {
|
||||||
.stream()
|
ListRoleUserRelationParam.BatchPerson batchPerson = ListRoleUserRelationParam.BatchPerson.builder().build();
|
||||||
.map(SaasRoleUserRelation::getRoleId)
|
BeanUtils.copyProperties(e, batchPerson);
|
||||||
|
return batchPerson;
|
||||||
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
List<SaasRoleVO> saasRoles = getByIds(roleIds, null, null, null, false, null);
|
List<SaasRoleUserV2DTO> saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder()
|
||||||
result.add(QueryBatchByIdentityIdTypeRes.builder()
|
.batchPersons(batchPersons)
|
||||||
.identityId(e.getIdentityId())
|
|
||||||
.identityType(e.getIdentityType())
|
|
||||||
.workspaceId(e.getWorkspaceId())
|
|
||||||
.ouId(e.getOuId())
|
|
||||||
.personId(e.getPersonId())
|
|
||||||
.role(saasRoles)
|
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
|
// 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType
|
||||||
|
Map<Long, Set<Long>> personRoles = saasRoleUsers.stream()
|
||||||
|
.collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getPersonId(),
|
||||||
|
Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet())));
|
||||||
|
|
||||||
|
Map<String, Set<Long>> identityRoles = saasRoleUsers.stream()
|
||||||
|
.collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType(),
|
||||||
|
Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet())));
|
||||||
|
|
||||||
|
List<Long> allRoleIds = saasRoleUsers.stream()
|
||||||
|
.map(SaasRoleUserV2DTO::getRoleId)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 这里使用原来代码的查询角色信息的接口,因为接口返回的对象使用的这个接口返回对象
|
||||||
|
Map<Long, SaasRoleVO> 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<Long> roleIds;
|
||||||
|
if (Objects.nonNull(e.getPersonId())) {
|
||||||
|
roleIds = personRoles.get(e.getPersonId());
|
||||||
} else {
|
} else {
|
||||||
result.add(QueryBatchByIdentityIdTypeRes.builder()
|
roleIds = identityRoles.get(e.getIdentityId() + "_" + e.getIdentityType());
|
||||||
.identityId(e.getIdentityId())
|
|
||||||
.identityType(e.getIdentityType())
|
|
||||||
.workspaceId(e.getWorkspaceId())
|
|
||||||
.ouId(e.getOuId())
|
|
||||||
.role(queryByIdentityIdType(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId(), false))
|
|
||||||
.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
if (CollectionUtils.isNotEmpty(roleIds)) {
|
||||||
|
result.setRole(roleIds.stream().map(saasRoles::get).collect(Collectors.toList()));
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
|
// req.stream().distinct().forEach(e -> {
|
||||||
|
// if (e.getPersonId() != null) {
|
||||||
|
// List<Long> roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId())
|
||||||
|
// .stream()
|
||||||
|
// .map(SaasRoleUserRelation::getRoleId)
|
||||||
|
// .collect(Collectors.toList());
|
||||||
|
// List<SaasRoleVO> 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
|
@Override
|
||||||
|
|||||||
@ -161,6 +161,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl<SaasRoleUserRel
|
|||||||
}
|
}
|
||||||
wrapper.in(!CollectionUtils.isEmpty(roleIds), "role_id", roleIds);
|
wrapper.in(!CollectionUtils.isEmpty(roleIds), "role_id", roleIds);
|
||||||
|
|
||||||
|
assembleBatchPersonWrapper(param, wrapper);
|
||||||
|
|
||||||
IPage<SaasRoleUserRelation> page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper);
|
IPage<SaasRoleUserRelation> page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper);
|
||||||
|
|
||||||
Map<Long, SaasRoleUserV2DTO.SaasRoleUser> saasRoleUsers = listSaasRoleUser(param, page.getRecords());
|
Map<Long, SaasRoleUserV2DTO.SaasRoleUser> saasRoleUsers = listSaasRoleUser(param, page.getRecords());
|
||||||
@ -170,6 +172,26 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl<SaasRoleUserRel
|
|||||||
return PageConverter.toResp(page, (record) -> from(record, saasRoleUsers, saasRoles));
|
return PageConverter.toResp(page, (record) -> from(record, saasRoleUsers, saasRoles));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assembleBatchPersonWrapper(PageRoleUserRelationParam param,
|
||||||
|
QueryWrapper<SaasRoleUserRelation> 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<Long> resolveRoleIds(PageRoleUserRelationParam param) {
|
private Set<Long> resolveRoleIds(PageRoleUserRelationParam param) {
|
||||||
if (CollectionUtils.isEmpty(param.getRoleCodes())) {
|
if (CollectionUtils.isEmpty(param.getRoleCodes())) {
|
||||||
return Optional.ofNullable(param.getRoleIds())
|
return Optional.ofNullable(param.getRoleIds())
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user