feat:(REQ-3068) 修改原用户查询角色接口,解决循环查询导致接口性能差的问题

This commit is contained in:
lilong 2024-10-11 11:04:54 +08:00
parent b1c3989166
commit bd0f4e83d1
4 changed files with 138 additions and 31 deletions

View File

@ -9,6 +9,10 @@ import lombok.*;
@EqualsAndHashCode
public class QueryByIdentityIdTypeReq {
/**
* personId跟identityIdidentityType不能混用
* 只存在使用personId或者identityId\identityType
*/
Long identityId;
/**

View File

@ -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;
}
}

View File

@ -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和identityIdidentityType
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和identityIdidentityType
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

View File

@ -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())