feat:(REQ-3068) 修改原用户查询角色接口,解决循环查询导致接口性能差的问题
This commit is contained in:
parent
b1c3989166
commit
bd0f4e83d1
@ -9,6 +9,10 @@ import lombok.*;
|
||||
@EqualsAndHashCode
|
||||
public class QueryByIdentityIdTypeReq {
|
||||
|
||||
/**
|
||||
* personId跟identityId、identityType不能混用
|
||||
* 只存在使用personId或者identityId\identityType
|
||||
*/
|
||||
Long identityId;
|
||||
|
||||
/**
|
||||
|
||||
@ -113,6 +113,9 @@ public class ListRoleUserRelationParam {
|
||||
@CriteriaField(ignore = true)
|
||||
private Set<String> roleCodes;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
private List<BatchPerson> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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<SaasRoleMapper, SaasRole>
|
||||
|
||||
@Override
|
||||
public List<QueryBatchByIdentityIdTypeRes> queryBatchByIdentityIdType(List<QueryByIdentityIdTypeReq> req) {
|
||||
List<QueryBatchByIdentityIdTypeRes> result = new ArrayList<>();
|
||||
req.stream().distinct().forEach(e -> {
|
||||
if (e.getPersonId() != null) {
|
||||
List<Long> roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId())
|
||||
.stream()
|
||||
.map(SaasRoleUserRelation::getRoleId)
|
||||
// 一起查询,减少数据库io,原来入参过多时,接口性能很差
|
||||
List<ListRoleUserRelationParam.BatchPerson> batchPersons = req.stream()
|
||||
.distinct()
|
||||
.map(e -> {
|
||||
ListRoleUserRelationParam.BatchPerson batchPerson = ListRoleUserRelationParam.BatchPerson.builder().build();
|
||||
BeanUtils.copyProperties(e, batchPerson);
|
||||
return batchPerson;
|
||||
})
|
||||
.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)
|
||||
List<SaasRoleUserV2DTO> saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder()
|
||||
.batchPersons(batchPersons)
|
||||
.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 {
|
||||
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());
|
||||
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<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
|
||||
|
||||
@ -161,6 +161,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl<SaasRoleUserRel
|
||||
}
|
||||
wrapper.in(!CollectionUtils.isEmpty(roleIds), "role_id", roleIds);
|
||||
|
||||
assembleBatchPersonWrapper(param, wrapper);
|
||||
|
||||
IPage<SaasRoleUserRelation> page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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) {
|
||||
if (CollectionUtils.isEmpty(param.getRoleCodes())) {
|
||||
return Optional.ofNullable(param.getRoleIds())
|
||||
|
||||
Loading…
Reference in New Issue
Block a user