diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java index 1ff9f4db..41bc5268 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java @@ -9,6 +9,10 @@ import lombok.*; @EqualsAndHashCode public class QueryByIdentityIdTypeReq { + /** + * personId跟identityId、identityType不能混用 + * 只存在使用personId或者identityId\identityType + */ Long identityId; /** diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index b5e6a2f0..f4ae20ca 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -113,6 +113,9 @@ public class ListRoleUserRelationParam { @CriteriaField(ignore = true) private Set roleCodes; + @CriteriaField(ignore = true) + private List 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; + } + } 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 aa7d50e2..e4e0a206 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 @@ -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 @Override public List queryBatchByIdentityIdType(List req) { - List result = new ArrayList<>(); - req.stream().distinct().forEach(e -> { - if (e.getPersonId() != null) { - List roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) - .stream() - .map(SaasRoleUserRelation::getRoleId) - .collect(Collectors.toList()); - List 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()); - } + // 一起查询,减少数据库io,原来入参过多时,接口性能很差 + List batchPersons = req.stream() + .distinct() + .map(e -> { + ListRoleUserRelationParam.BatchPerson batchPerson = ListRoleUserRelationParam.BatchPerson.builder().build(); + BeanUtils.copyProperties(e, batchPerson); + return batchPerson; + }) + .collect(Collectors.toList()); + List saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .batchPersons(batchPersons) + .build()); - }); - return result; + // 原代码是入参有personId就使用personId查询,不能同时使用personId和identityId、identityType + Map> personRoles = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getPersonId(), + Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); + + Map> identityRoles = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getIdentityId() + "_" + e.getSaasRoleUser().getIdentityType(), + Collectors.mapping(SaasRoleUserV2DTO::getRoleId, Collectors.toSet()))); + + List allRoleIds = saasRoleUsers.stream() + .map(SaasRoleUserV2DTO::getRoleId) + .distinct() + .collect(Collectors.toList()); + + // 这里使用原来代码的查询角色信息的接口,因为接口返回的对象使用的这个接口返回对象 + Map 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 roleIds; + if (Objects.nonNull(e.getPersonId())) { + roleIds = personRoles.get(e.getPersonId()); + } else { + 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 roleIds = roleUserRelationDao.queryByPersonId(e.getPersonId(), e.getWorkspaceId(), e.getOuId()) +// .stream() +// .map(SaasRoleUserRelation::getRoleId) +// .collect(Collectors.toList()); +// List 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 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 77b7a3d4..5ef40ac8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -161,6 +161,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper); Map saasRoleUsers = listSaasRoleUser(param, page.getRecords()); @@ -170,6 +172,26 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl from(record, saasRoleUsers, saasRoles)); } + private void assembleBatchPersonWrapper(PageRoleUserRelationParam param, + QueryWrapper 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 resolveRoleIds(PageRoleUserRelationParam param) { if (CollectionUtils.isEmpty(param.getRoleCodes())) { return Optional.ofNullable(param.getRoleIds())