From 6bc3228b00325b0cfda7ec323581053aa21653aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Tue, 24 Dec 2024 10:27:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-3282):=20WorkspaceOuPair=E6=94=BE?= =?UTF-8?q?=E5=88=B0dto.common=E5=8C=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orgmanax/dto/common/WorkspaceOuPair.java | 15 ++++++ .../orgmanax/dto/node/req/ListNodeReq.java | 10 +--- .../dto/nodeuser/req/ListNodeUserReq.java | 10 ++++ .../node/repository/NodeQueryRepository.java | 11 +++- .../impl/NodeUserQueryRepositoryImpl.java | 52 +++++++++++++++++-- .../repository/OrgJobQueryRepository.java | 15 ++++++ 6 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/common/WorkspaceOuPair.java diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/common/WorkspaceOuPair.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/common/WorkspaceOuPair.java new file mode 100644 index 0000000..e211762 --- /dev/null +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/common/WorkspaceOuPair.java @@ -0,0 +1,15 @@ +package cn.axzo.orgmanax.dto.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class WorkspaceOuPair { + private Long workspaceId; + private Long ouId; +} diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java index 89b661d..fff71cb 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java @@ -1,6 +1,7 @@ package cn.axzo.orgmanax.dto.node.req; import cn.axzo.foundation.page.PageReqV2; +import cn.axzo.orgmanax.dto.common.WorkspaceOuPair; import lombok.*; import lombok.experimental.SuperBuilder; @@ -118,13 +119,4 @@ public class ListNodeReq extends PageReqV2 { private Long personId; - @NoArgsConstructor - @AllArgsConstructor - @Data - @Builder - public static class WorkspaceOuPair { - private Long workspaceId; - private Long ouId; - } - } diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/ListNodeUserReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/ListNodeUserReq.java index 744871d..4db8ac2 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/ListNodeUserReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/ListNodeUserReq.java @@ -3,8 +3,11 @@ package cn.axzo.orgmanax.dto.nodeuser.req; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.foundation.page.PageReqV2; +import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.common.DistinctRule; import cn.axzo.orgmanax.dto.common.IdentityPair; +import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; +import com.google.common.collect.ImmutableList; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -239,6 +242,12 @@ public class ListNodeUserReq extends PageReqV2 { @CriteriaField(ignore = true) private Integer nodeState; // TODO: 待实现 + /** + * keyword。用 idNumber,phone,jobNumber精确匹配,或者realName模糊匹配 + */ + @CriteriaField(ignore = true) + private String keyword; + // ~ 后置过滤的字段 /** * 包含的单位类型 @@ -360,4 +369,5 @@ public class ListNodeUserReq extends PageReqV2 { private Boolean personProfile; } + } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java index be80205..1d044f8 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java @@ -72,7 +72,6 @@ public interface NodeQueryRepository { } - @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @AllArgsConstructor @@ -143,6 +142,16 @@ public interface NodeQueryRepository { @Builder.Default private Boolean isSelectTopNodeOnly = false; + /** + * 是否返回祖先节点 TODO:liuyang + */ + private Boolean needAncestorNode; + + /** + * 根据workspace和ouId组合查询 + */ + private Set workspaceOuPairs; + } } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java index 9588f7f..d5996b4 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java @@ -3,21 +3,24 @@ package cn.axzo.orgmanax.infra.dao.nodeuser.repository.impl; import cn.axzo.foundation.dao.support.converter.PageConverter; import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; import cn.axzo.foundation.page.PageResp; -import cn.axzo.orgmanax.dto.node.req.ListNodeReq; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.dao.NodeUserDao; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository; import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.google.common.collect.ImmutableList; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.List; @@ -39,8 +42,50 @@ public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository { @Override public PageResp page(ListNodeUserReq req) { IPage page = PageConverter.toMybatis(req, OrganizationalNodeUser.class); + PageResp emptyPage = PageResp.builder().size(req.getPageSize()).current(req.getPage()).total(0L).data(ImmutableList.of()).build(); QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrganizationalNodeUser.class); - // 查询参数过滤 + // 查询参数处理 ~ + // keyword + if (StrUtil.isNotBlank(req.getKeyword())) { + wrapper.and(w -> { + w.like("real_name", req.getKeyword()) + .or().eq("phone", req.getKeyword()) + .or().eq("job_number", req.getKeyword()) + .or().eq("phone", req.getKeyword()); + }); + } + // 处理删除标记 + if (BooleanUtil.isTrue(req.getDeletedOnly())) { + wrapper.ne("is_delete", 0); + } + if (!BooleanUtil.isTrue(req.getIncludeDeleted())) { + wrapper.eq("is_delete", 0); + } + // jobIds查询 - 这里可以合并对orgJob的查询。后续优化。 + if (CollUtil.isNotEmpty(req.getOrganizationalJobCodes())) { + Set jobIds = jobQueryRepository.list(OrgJobQueryRepository.ListReq.builder().codes(req.getOrganizationalJobCodes()).build()) + .stream().map(OrgJob::getId).collect(Collectors.toSet()); + if (jobIds.isEmpty()) { + return emptyPage; + } + wrapper.in("organizational_job_id", jobIds); + } + if (StrUtil.isNotBlank(req.getOrganizationalJobCode())) { + Set jobIds = jobQueryRepository.list(OrgJobQueryRepository.ListReq.builder().codes(req.getOrganizationalJobCodes()).build()) + .stream().map(OrgJob::getId).collect(Collectors.toSet()); + if (jobIds.isEmpty()) { + return emptyPage; + } + wrapper.eq("organizational_job_id", jobIds); + } + if (StringUtils.isNotBlank(req.getOrganizationalJobNameLike())) { + Set jobIds = jobQueryRepository.list(OrgJobQueryRepository.ListReq.builder().nameLike(req.getOrganizationalJobNameLike()).build()) + .stream().map(OrgJob::getId).collect(Collectors.toSet()); + if (jobIds.isEmpty()) { + return emptyPage; + } + wrapper.in("organizational_job_id", jobIds); + } IPage results = nodeUserDao.page(page, wrapper) .convert(e -> BeanUtil.toBean(e, NodeUserResp.class)); @@ -90,13 +135,14 @@ public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository { if (CollUtil.isEmpty(records) || req.getNeeds() == null) { return; } - if (!BooleanUtil.isTrue(req.getNeeds().getNode())) { + if (!BooleanUtil.isTrue(req.getNeeds().getNode()) && !BooleanUtil.isTrue(req.getNeeds().getAncestorNode())) { return; } Set nodeIds = records.stream().map(NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet()); // assemble parentNode Map nodesById = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder() .ids(nodeIds) + .needAncestorNode(BooleanUtil.isTrue(req.getNeeds().getAncestorNode())) .build()).stream().collect(Collectors.toMap(NodeQueryRepository.NodeResp::getId, Function.identity())); records.forEach(r -> r.setNode(nodesById.get(r.getOrganizationalNodeId()))); diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java index d0963da..6dd502c 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java @@ -16,6 +16,17 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import java.util.Collection; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + public interface OrgJobQueryRepository { @@ -23,6 +34,7 @@ public interface OrgJobQueryRepository { /** * 列表查询 + * * @param req * @return */ @@ -63,6 +75,9 @@ public interface OrgJobQueryRepository { */ @CriteriaField(ignore = true) private String keyword; + @CriteriaField(field = "name", operator = Operator.LIKE) + private String nameLike; + } @EqualsAndHashCode(callSuper = true)