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 1/6] =?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) From 411cc12d95e9f6b08b624132df4544729b9397fa Mon Sep 17 00:00:00 2001 From: liuyang Date: Tue, 24 Dec 2024 10:28:00 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:[REQ-3282]=20=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E8=87=AA=E6=B5=8B,=E4=BF=AE=E5=A4=8DBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java index e83be83..3bcbfb7 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java @@ -97,7 +97,7 @@ public class NodeServiceImpl implements NodeService { // 获取部门用户信息, 若获取不到直接返回 if (Objects.nonNull(req.getPersonId())) { List nodeUsers = nodeUserQueryRepository.list(ListNodeUserReq - .builder().build()); + .builder().personId(req.getPersonId()).build()); if (CollUtil.isEmpty(nodeUsers)) { return emptyPageResp; } From 7f6416f576f747dc20f09d7f292ecaf3e813a0d5 Mon Sep 17 00:00:00 2001 From: songyuanlun Date: Tue, 24 Dec 2024 11:26:38 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat(REQ-3282):=20=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E5=85=B3=E8=81=94=E8=A1=A8=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/dao/orgjob/entity/OrgJobGroup.java | 6 ++++-- .../infra/dao/orgjob/entity/OrgJobGroupRelation.java | 9 ++++++--- .../orgjob/entity/OrgJobGroupRelationHistory.java | 6 ++++-- .../infra/dao/orgjob/entity/OrgJobHistory.java | 6 ++++-- .../repository/OrgJobGroupRelationRepository.java | 4 +++- .../impl/OrgJobGroupRelationRepositoryImpl.java | 11 +++++------ .../repository/impl/OrgJobGroupRepositoryImpl.java | 12 ++++++------ 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroup.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroup.java index e2bea3f..d93cf9b 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroup.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroup.java @@ -9,9 +9,10 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * @description 岗位分组表 @@ -20,7 +21,8 @@ import lombok.NoArgsConstructor; * @date 2024/9/9 */ @Data -@Builder +@EqualsAndHashCode(callSuper = false) +@SuperBuilder @NoArgsConstructor @AllArgsConstructor @TableName(value = "org_job_group", autoResultMap = true) diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelation.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelation.java index bf6a3bc..4405c88 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelation.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelation.java @@ -4,11 +4,13 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; import java.util.Date; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * @description 岗位与分组的关系表 @@ -17,11 +19,12 @@ import lombok.NoArgsConstructor; * @date 2024/9/9 */ @Data -@Builder +@EqualsAndHashCode(callSuper = false) +@SuperBuilder @NoArgsConstructor @AllArgsConstructor @TableName(value = "org_job_group_relation", autoResultMap = true) -public class OrgJobGroupRelation { +public class OrgJobGroupRelation implements Serializable { /** * 主键 diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelationHistory.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelationHistory.java index 2206d21..73f5c1f 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelationHistory.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobGroupRelationHistory.java @@ -9,9 +9,10 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import java.util.Date; import java.util.List; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * @description 岗位与分组的关系历史表 @@ -20,7 +21,8 @@ import lombok.NoArgsConstructor; * @date 2024/9/9 */ @Data -@Builder +@EqualsAndHashCode(callSuper = false) +@SuperBuilder @NoArgsConstructor @AllArgsConstructor @TableName(value = "org_job_group_relation_history", autoResultMap = true) diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobHistory.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobHistory.java index 12519dc..8c9110a 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobHistory.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/entity/OrgJobHistory.java @@ -10,9 +10,10 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import java.io.Serializable; import java.util.Date; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; /** * @description 岗位变更历史表 @@ -21,7 +22,8 @@ import lombok.NoArgsConstructor; * @date 2024/9/9 */ @Data -@Builder +@EqualsAndHashCode(callSuper = false) +@SuperBuilder @NoArgsConstructor @AllArgsConstructor @TableName(value = "org_job_history", autoResultMap = true) diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobGroupRelationRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobGroupRelationRepository.java index d8435de..28200e3 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobGroupRelationRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobGroupRelationRepository.java @@ -29,15 +29,17 @@ public interface OrgJobGroupRelationRepository { /** * 分组id集合 */ - @CriteriaField(field = "id", operator = Operator.IN) + @CriteriaField(ignore = true) private Collection groupIds; /** * 岗位分组编码集合 */ + @CriteriaField(field = "group_code", operator = Operator.IN) private Collection groupCodes; /** * 岗位编码集合 */ + @CriteriaField(field = "job_code", operator = Operator.IN) private Collection jobCodes; public boolean isInvalid() { diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRelationRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRelationRepositoryImpl.java index 13cac76..d0cf187 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRelationRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRelationRepositoryImpl.java @@ -1,14 +1,11 @@ package cn.axzo.orgmanax.infra.dao.orgjob.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.infra.dao.orgjob.dao.OrgJobGroupRelationDao; import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJobGroupRelation; import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobGroupRelationRepository; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.List; import lombok.RequiredArgsConstructor; @@ -26,9 +23,11 @@ public class OrgJobGroupRelationRepositoryImpl implements OrgJobGroupRelationRep @Override public PageResp page(PageReq req) { IPage page = PageConverter.toMybatis(req, OrgJobGroupRelation.class); - QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrgJobGroupRelation.class); - IPage results = orgJobGroupRelationDao.page(page, wrapper) - .convert(e -> BeanUtil.toBean(e, OrgJobGroupRelation.class)); + IPage results = orgJobGroupRelationDao.lambdaQuery() + .in(CollUtil.isNotEmpty(req.getGroupCodes()), OrgJobGroupRelation::getGroupCode, req.getGroupCodes()) + .in(CollUtil.isNotEmpty(req.getJobCodes()), OrgJobGroupRelation::getJobCode, req.getJobCodes()) + .eq(OrgJobGroupRelation::getIsDelete, 0L) + .page(page); PageResp resp = PageConverter.toResp(results); List records = resp.getData(); if (CollUtil.isEmpty(records)) { diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRepositoryImpl.java index b500a99..4b22697 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/impl/OrgJobGroupRepositoryImpl.java @@ -1,14 +1,11 @@ package cn.axzo.orgmanax.infra.dao.orgjob.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.infra.dao.orgjob.dao.OrgJobGroupDao; import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJobGroup; import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobGroupRepository; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import java.util.List; import lombok.RequiredArgsConstructor; @@ -27,9 +24,12 @@ public class OrgJobGroupRepositoryImpl implements OrgJobGroupRepository { @Override public PageResp page(PageReq req) { IPage page = PageConverter.toMybatis(req, OrgJobGroup.class); - QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrgJobGroup.class); - IPage results = orgJobGroupDao.page(page, wrapper) - .convert(e -> BeanUtil.toBean(e, OrgJobGroup.class)); + IPage results = orgJobGroupDao.lambdaQuery() + .in(CollUtil.isNotEmpty(req.getOrgJobGroupFlags()), OrgJobGroup::getFlag, req.getOrgJobGroupFlags()) + .in(CollUtil.isNotEmpty(req.getGroupCodes()), OrgJobGroup::getCode, req.getGroupCodes()) + .in(CollUtil.isNotEmpty(req.getGroupIds()), OrgJobGroup::getId, req.getGroupIds()) + .eq(OrgJobGroup::getIsDelete, 0L) + .page(page); PageResp resp = PageConverter.toResp(results); List records = resp.getData(); if (CollUtil.isEmpty(records)) { From bafc1e0bb364a880fbcbf0c3b5e2fe72a2a90f1a Mon Sep 17 00:00:00 2001 From: liuyang Date: Tue, 24 Dec 2024 13:47:34 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:[REQ-3282]=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=80=9A=E7=94=A8=E6=A0=91=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orgmanax-common/pom.xml | 4 + .../axzo/orgmanax/common/model/IBaseTree.java | 35 +++ .../axzo/orgmanax/common/util/TreeUtil.java | 246 ++++++++++++++++++ .../impl/NodeQueryRepositoryImpl.java | 6 +- .../impl/CooperateShipServiceImpl.java | 1 + 5 files changed, 288 insertions(+), 4 deletions(-) create mode 100644 orgmanax-common/src/main/java/cn/axzo/orgmanax/common/model/IBaseTree.java create mode 100644 orgmanax-common/src/main/java/cn/axzo/orgmanax/common/util/TreeUtil.java diff --git a/orgmanax-common/pom.xml b/orgmanax-common/pom.xml index 100d46a..2ff5b46 100644 --- a/orgmanax-common/pom.xml +++ b/orgmanax-common/pom.xml @@ -23,6 +23,10 @@ 2.0.0-SNAPSHOT compile + + cn.hutool + hutool-all + \ No newline at end of file diff --git a/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/model/IBaseTree.java b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/model/IBaseTree.java new file mode 100644 index 0000000..54aa3cd --- /dev/null +++ b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/model/IBaseTree.java @@ -0,0 +1,35 @@ +package cn.axzo.orgmanax.common.model; + +import java.util.List; + +public interface IBaseTree, O> { + + /** + * 节点编码 + * + * @return 节点编码 + */ + O getNodeCode(); + + /** + * 父节点编码 + * + * @return 父节点编码 + */ + O getParentNodeCode(); + + /** + * 子节点 + * + * @return 子节点 + */ + List getNodeChildren(); + + /** + * 设置子节点 + * + * @param nodeChildren + */ + void setNodeChildren(List nodeChildren); + +} diff --git a/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/util/TreeUtil.java b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/util/TreeUtil.java new file mode 100644 index 0000000..54ae6df --- /dev/null +++ b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/util/TreeUtil.java @@ -0,0 +1,246 @@ +package cn.axzo.orgmanax.common.util; + +import cn.axzo.orgmanax.common.model.IBaseTree; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Pair; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class TreeUtil { + + + /** + * 合并两个树 极大合并

这里以新树为基础:
同层级树:
1).如果新树的当前节点在旧树中存在,则直接使用新树的当前节点,并保持当前节点的顺序不变
+ * 2).如果新树的当前节点在旧树中存在,在 1)的基础上,去递归比较新树的子节点
3).如果新树的当前节点在旧树中不存在,直接使用新树的当前节点,并保持当前节点的顺序不变
+ * 4).如果旧树的节点在新树中不存在,则直接附加到新树之后,并保持旧树的顺序
+ *

+ * snabbdom:https://github.com/snabbdom/snabbdom/blob/master/src/init.ts#L277 + * + * @param oldTree + * @param newTree + * @return + */ + public static , O> List largeMergeTree(List oldTree, + List newTree) { + return largeMergeTree(oldTree, newTree, null); + } + + /** + * 合并树 + * + * @param oldTree + * @param newTree + * @param oldTreeConsumer 对需要附加到新树的节点进行操作 + * @param + * @return + */ + public static , O> List largeMergeTree(List oldTree, + List newTree, + Consumer> oldTreeConsumer) { + //为空直接返回 + if (CollectionUtils.isEmpty(oldTree)) { + return newTree; + } + if (CollectionUtils.isEmpty(newTree)) { + return oldTree; + } + //构造老树code与所在索引的map + Map oldTreeIndexMap = new HashMap<>(oldTree.size()); + for (int i = 0; i < oldTree.size(); i++) { + oldTreeIndexMap.put(oldTree.get(i).getNodeCode(), i); + } + + //循环新树,找到新树中的当前节点在老树中的索引 + for (T t : newTree) { + Integer oldTreeIndex = oldTreeIndexMap.get(t.getNodeCode()); + //找到了,则直接使用新树的当前节点,并保持当前节点的顺序不变 + if (oldTreeIndex != null) { + t.setNodeChildren( + largeMergeTree(oldTree.get(oldTreeIndex).getNodeChildren(), t.getNodeChildren(), + oldTreeConsumer)); + oldTreeIndexMap.put(t.getNodeCode(), null); + } + } + List tempOldTree = null; + if (oldTreeConsumer != null) { + tempOldTree = new ArrayList<>(); + } + List finalResult = tempOldTree; + //将所有老树中未找到的节点附加到新树之后,并保持旧树的顺序 + oldTreeIndexMap.values().stream().filter(Objects::nonNull).sorted().forEach(e -> { + T t = oldTree.get(e); + newTree.add(t); + if (oldTreeConsumer != null) { + finalResult.add(t); + } + }); + if (oldTreeConsumer != null) { + oldTreeConsumer.accept(tempOldTree); + } + return newTree; + } + + + public static , O> List buildTree(List treeList) { + if (CollectionUtils.isEmpty(treeList)) { + return treeList; + } + Set codes = treeList.stream().map(IBaseTree::getNodeCode).collect(Collectors.toSet()); + List rootList = treeList.stream().filter(e -> !codes.contains(e.getParentNodeCode())) + .collect(Collectors.toList()); + List children = treeList.stream().filter(e -> codes.contains(e.getParentNodeCode())) + .collect(Collectors.toList()); + for (T t : rootList) { + t.setNodeChildren(buildTree(children, t.getNodeCode())); + } + return rootList; + } + + public static , O> List buildTree(List treeList, O rootCode) { + if (CollectionUtils.isEmpty(treeList)) { + return treeList; + } + //root级树 + List rootList = treeList.stream() + .filter(e -> Objects.equals(e.getParentNodeCode(), rootCode)) + .collect(Collectors.toList()); + + List childrenList = treeList.stream() + .filter(e -> !Objects.equals(e.getParentNodeCode(), rootCode)) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(childrenList)) { + return CollectionUtils.isEmpty(rootList) ? null : rootList; + } + for (T t : rootList) { + t.setNodeChildren(buildTree(childrenList, t.getNodeCode())); + } + return CollectionUtils.isEmpty(rootList) ? null : rootList; + } + + // public static , O> List buildFastTree(List treeList, O rootCode) { +// if (CollectionUtils.isEmpty(treeList)) { +// return treeList; +// } +// //root级树 +// List rootList = treeList.stream().filter(e -> Objects.equals(e.getParentNodeCode(), rootCode)) +// .collect(Collectors.toList()); +// +// List notRootList = treeList.stream().filter(e -> !Objects.equals(e.getParentNodeCode(), rootCode)) +// .collect(Collectors.toList()); +// +// Map> childrenMap = notRootList.stream() +// .collect(Collectors.groupingBy(IBaseTree::getParentNodeCode)); +// +// for (T t : rootList) { +// List children = childrenMap.get(t.getNodeCode()); +// if(children==null){ +// children=new ArrayList<>(); +// } +// t.setNodeChildren(children); +// } +// return rootList; +// } + + /** + * 树的扁平化操作 + * + * @param trees 树列表 + * @param maxLevel 业务场景所允许的最大的树高 + */ + public static , O> List flattening(List trees, int maxLevel) { + if (CollUtil.isEmpty(trees)) { + return Collections.emptyList(); + } + return trees.stream() + .flatMap(e -> flattening(e, maxLevel).stream()) + .collect(Collectors.toList()); + } + + /** + * 树的扁平化操作 + * + * @param tree 树 + * @param maxLevel 业务场景所允许的最大的树高 + */ + public static , O> List flattening(T tree, int maxLevel) { + if (Objects.isNull(tree)) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + // 根节点放入栈中 + LinkedList> stack = new LinkedList<>(); + stack.push(Pair.of(1, tree)); + Pair pointer; + do { + // 出栈 + pointer = stack.pop(); + // 校验当前遍历的层级是否过深 + Assert.isTrue(pointer.getKey() <= maxLevel, "层数过深,请检查数据的准确性"); + // 数据放入结果集 + result.add(pointer.getValue()); + if (CollUtil.isNotEmpty(pointer.getValue().getNodeChildren())) { + // 子集层级自增并入栈 + int recursiveLevel = pointer.getKey() + 1; + pointer.getValue().getNodeChildren().stream() + .map(e -> Pair.of(recursiveLevel, e)) + .forEach(stack::push); + } + } while (CollUtil.isNotEmpty(stack)); + return result; + } + + /** + * 树的剪枝操作 + * + * @param root 树 + * @param treeNodeCode 剪枝切入点 + */ + public static , O> T pruning(T root, O treeNodeCode) { + if (Objects.isNull(root) || Objects.isNull(treeNodeCode)) { + return root; + } + // 根节点放入栈中 + LinkedList stack = new LinkedList<>(); + stack.push(root); + T node; + do { + // 出栈 + node = stack.pop(); + if (Objects.equals(node.getNodeCode(), treeNodeCode)) { + return node; + } + if (CollUtil.isNotEmpty(node.getNodeChildren())) { + stack.addAll(node.getNodeChildren()); + } + } while (CollUtil.isNotEmpty(stack)); + return null; + } + + public static , O> List buildTree(List treeList, Function filter) { + Objects.requireNonNull(filter); + + if (CollectionUtils.isEmpty(treeList)) { + return treeList; + } + + Set codes = treeList.stream().map(IBaseTree::getNodeCode).collect(Collectors.toSet()); + List rootList = treeList.stream() + .filter(filter::apply) + .filter(e -> !codes.contains(e.getParentNodeCode())) + .collect(Collectors.toList()); + List children = treeList.stream() + .filter(filter::apply) + .filter(e -> codes.contains(e.getParentNodeCode())) + .collect(Collectors.toList()); + for (T t : rootList) { + t.setNodeChildren(buildTree(children, t.getNodeCode())); + } + return rootList; + } + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java index f8ec562..794e168 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java @@ -11,6 +11,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -28,7 +29,7 @@ import java.util.stream.Stream; */ @Service @RequiredArgsConstructor -public class NodeQueryRepositoryImpl implements NodeQueryRepository { +public class NodeQueryRepositoryImpl extends ServiceImpl implements NodeQueryRepository { private final NodeDao nodeDao; @@ -58,9 +59,6 @@ public class NodeQueryRepositoryImpl implements NodeQueryRepository { if (CollUtil.isEmpty(records)) { return resp; } - - // assemble parent node - assembleParentNode(req, records); return resp; } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java index 1745409..ef6ee89 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java @@ -166,6 +166,7 @@ public class CooperateShipServiceImpl implements CooperateShipService { resultNodeList.addAll(ancestorShipNodes); } + // 是否查询父级节点 if (BooleanUtil.isTrue(req.getIncludeAncestors())) { Set ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList); From d543184f53462a751ff55fb5c4a4f9ce854bc9d2 Mon Sep 17 00:00:00 2001 From: songyuanlun Date: Tue, 24 Dec 2024 14:02:29 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(REQ-3282):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=B2=97=E4=BD=8D=E5=88=86=E9=A1=B5=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orgmanax/api/orgjob/feign/OrgJobApi.java | 4 - ...odeConstants.java => OrgJobConstants.java} | 3 +- .../axzo/orgmanax/dto/job/dto/OrgJobDTO.java | 4 +- .../orgmanax/dto/job/req/ListOrgJobReq.java | 42 ---------- .../orgmanax/dto/job/req/PageOrgJobReq.java | 21 +++++ .../orgjob/controller/OrgJobController.java | 10 +-- .../foundation/OrgJobFoundationService.java | 4 +- .../impl/OrgJobFoundationServiceImpl.java | 6 +- .../OrgJobGroupFoundationServiceImpl.java | 2 +- ...JobGroupRelationFoundationServiceImpl.java | 2 +- .../server/orgjob/service/OrgJobService.java | 14 +--- .../service/dto/OrgJobAggregatePageParam.java | 77 ------------------- .../orgjob/service/dto/OrgJobPageParam.java | 73 +++++++++++------- .../service/impl/OrgJobServiceImpl.java | 43 ++++------- 14 files changed, 100 insertions(+), 205 deletions(-) rename orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/{OrgJobCodeConstants.java => OrgJobConstants.java} (93%) delete mode 100644 orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/ListOrgJobReq.java delete mode 100644 orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobAggregatePageParam.java diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orgjob/feign/OrgJobApi.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orgjob/feign/OrgJobApi.java index 3ec3ec4..9231171 100644 --- a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orgjob/feign/OrgJobApi.java +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orgjob/feign/OrgJobApi.java @@ -5,7 +5,6 @@ import cn.axzo.foundation.result.ApiResult; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; import cn.axzo.orgmanax.dto.job.req.CreateOrgJobReq; import cn.axzo.orgmanax.dto.job.req.DeleteOrgJobReq; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.dto.job.req.PageOrgJobReq; import cn.axzo.orgmanax.dto.job.req.UpdateOrgJobReq; import org.springframework.cloud.openfeign.FeignClient; @@ -27,9 +26,6 @@ public interface OrgJobApi { @PostMapping("/api/job/delete") ApiResult delete(@RequestBody @Validated DeleteOrgJobReq req); - @PostMapping("/api/job/list") - ApiResult> list(@RequestBody @Validated ListOrgJobReq req); - /** * 分页列表接口。 * XXX:本接口默认分页,单页最多返回1000条数据。调用方使用时需注意。 diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobCodeConstants.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobConstants.java similarity index 93% rename from orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobCodeConstants.java rename to orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobConstants.java index 1b1911a..7f5a16b 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobCodeConstants.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobConstants.java @@ -7,7 +7,7 @@ package cn.axzo.orgmanax.dto.job.dto; * @date 2024/2/27 * @version 1.0 */ -public interface OrgJobCodeConstants { +public interface OrgJobConstants { /** 项目内工人 **/ String PROJ_WORKER = "projWorker"; @@ -36,4 +36,5 @@ public interface OrgJobCodeConstants { String OLD_CONFIG = "oldJobConfigs"; String CODE_KEY = "code"; String OLD_NEW_JOB_CODE_MAP_KEY = "job_code_mapping"; + Integer JOB_PAGE_SIZE = 1000; } diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobDTO.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobDTO.java index b5e88cf..31a8a44 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobDTO.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/dto/OrgJobDTO.java @@ -1,7 +1,7 @@ package cn.axzo.orgmanax.dto.job.dto; -import static cn.axzo.orgmanax.dto.job.dto.OrgJobCodeConstants.CODE_KEY; -import static cn.axzo.orgmanax.dto.job.dto.OrgJobCodeConstants.OLD_CONFIG; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.CODE_KEY; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.OLD_CONFIG; import cn.axzo.orgmanax.dto.job.enums.OrgJobFlagEnum; import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/ListOrgJobReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/ListOrgJobReq.java deleted file mode 100644 index d9257c0..0000000 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/ListOrgJobReq.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.axzo.orgmanax.dto.job.req; - -import cn.axzo.foundation.page.PageReqV2; -import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; -import java.util.Set; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@AllArgsConstructor -@Data -@SuperBuilder -public class ListOrgJobReq extends PageReqV2 { - - /** - * 名称 - */ - private String name; - - /** - * 岗位id集合 - */ - private Set jobIds; - /** - * 岗位编码集合 - */ - private Set jobCodes; - /** - * 岗位类型 - */ - private OrgJobTypeEnum type; - /** - * 搜索关键字 - * Notice: 名称或别名的模糊搜索 - */ - private String keyword; - -} diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/PageOrgJobReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/PageOrgJobReq.java index 8f01bbb..b2b3019 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/PageOrgJobReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/job/req/PageOrgJobReq.java @@ -59,4 +59,25 @@ public class PageOrgJobReq extends PageReqV2 { */ private OrgJobTypeEnum type; + /** + * 岗位类型 1:总包单位 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS 7:企业通用 9:班组项目内 + */ + private List types; + + /** + * 可为空,即加载默认和自定义所有岗位 true预定义岗位 false 自定义岗位 + */ + private Boolean readonly; + + // workspace和unitId 只有自定义类型使用 + /** + * 单位/团队 ID 列表 + */ + private List unitIds; + + /** + * 工作台id 列表 + */ + private List workspaceIds; + } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/controller/OrgJobController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/controller/OrgJobController.java index 3de9f77..52a77c4 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/controller/OrgJobController.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/controller/OrgJobController.java @@ -6,11 +6,10 @@ import cn.axzo.orgmanax.api.orgjob.feign.OrgJobApi; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; import cn.axzo.orgmanax.dto.job.req.CreateOrgJobReq; import cn.axzo.orgmanax.dto.job.req.DeleteOrgJobReq; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.dto.job.req.PageOrgJobReq; import cn.axzo.orgmanax.dto.job.req.UpdateOrgJobReq; import cn.axzo.orgmanax.server.orgjob.service.OrgJobService; -import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobAggregatePageParam; +import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,13 +38,8 @@ public class OrgJobController implements OrgJobApi { return ApiResult.success(); } - @Override - public ApiResult> list(ListOrgJobReq req) { - return ApiResult.success(orgJobService.list(req)); - } - @Override public ApiResult> page(PageOrgJobReq req) { - return ApiResult.success(orgJobService.page(BeanUtil.copyProperties(req, OrgJobAggregatePageParam.class))); + return ApiResult.success(orgJobService.page(BeanUtil.copyProperties(req, OrgJobPageParam.class))); } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/OrgJobFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/OrgJobFoundationService.java index a49db07..2e519db 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/OrgJobFoundationService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/OrgJobFoundationService.java @@ -1,9 +1,9 @@ package cn.axzo.orgmanax.server.orgjob.foundation; import cn.axzo.foundation.page.PageResp; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; import cn.axzo.orgmanax.server.orgjob.foundation.dto.OrgJobCreator; +import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; /** * @@ -35,5 +35,5 @@ public interface OrgJobFoundationService { * 查询岗位信息 * @return */ - PageResp page(ListOrgJobReq req); + PageResp page(OrgJobPageParam req); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java index 2ac38fc..6f1ec52 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java @@ -2,12 +2,12 @@ package cn.axzo.orgmanax.server.orgjob.foundation.impl; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob; import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository; import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobUpsertRepository; import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService; import cn.axzo.orgmanax.server.orgjob.foundation.dto.OrgJobCreator; +import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; import cn.hutool.core.bean.BeanUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -39,7 +39,7 @@ public class OrgJobFoundationServiceImpl implements OrgJobFoundationService { } @Override - public PageResp page(ListOrgJobReq req) { + public PageResp page(OrgJobPageParam req) { PageResp page = orgJobQueryRepository.page(convert(req)); return PageResp.builder() .size(page.getSize()) @@ -49,7 +49,7 @@ public class OrgJobFoundationServiceImpl implements OrgJobFoundationService { .build(); } - public OrgJobQueryRepository.ListReq convert(ListOrgJobReq req) { + public OrgJobQueryRepository.ListReq convert(OrgJobPageParam req) { OrgJobQueryRepository.ListReq param = BeanUtil.copyProperties(req, OrgJobQueryRepository.ListReq.class); param.setIds(req.getJobIds()); param.setCodes(req.getJobCodes()); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupFoundationServiceImpl.java index 247f48c..1c3f29b 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupFoundationServiceImpl.java @@ -1,6 +1,6 @@ package cn.axzo.orgmanax.server.orgjob.foundation.impl; -import static cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam.JOB_PAGE_SIZE; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.JOB_PAGE_SIZE; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupDTO; diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupRelationFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupRelationFoundationServiceImpl.java index acc91ad..9697a5b 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupRelationFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobGroupRelationFoundationServiceImpl.java @@ -1,6 +1,6 @@ package cn.axzo.orgmanax.server.orgjob.foundation.impl; -import static cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam.JOB_PAGE_SIZE; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.JOB_PAGE_SIZE; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupRelationDTO; diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/OrgJobService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/OrgJobService.java index c66fe27..4a86acc 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/OrgJobService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/OrgJobService.java @@ -4,9 +4,8 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; import cn.axzo.orgmanax.dto.job.req.CreateOrgJobReq; import cn.axzo.orgmanax.dto.job.req.DeleteOrgJobReq; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.dto.job.req.UpdateOrgJobReq; -import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobAggregatePageParam; +import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; public interface OrgJobService { @@ -32,14 +31,7 @@ public interface OrgJobService { void delete(DeleteOrgJobReq req); /** - * 查询岗位 - * @param req - * @return + * 分页查询岗位 */ - PageResp list(ListOrgJobReq req); - - /** - * 聚合查询岗位 - */ - PageResp page(OrgJobAggregatePageParam req); + PageResp page(OrgJobPageParam req); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobAggregatePageParam.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobAggregatePageParam.java deleted file mode 100644 index 61e0d89..0000000 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobAggregatePageParam.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.axzo.orgmanax.server.orgjob.service.dto; - -import cn.axzo.foundation.page.PageReqV2; -import cn.axzo.orgmanax.dto.job.enums.OrgJobGroupFlagEnum; -import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; -import cn.hutool.core.collection.CollUtil; -import java.util.Objects; -import java.util.Set; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; -import org.apache.commons.lang3.StringUtils; - -/** - * @author luofu - * @version 1.0 - * @date 2024/9/12 - */ -@Data -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -public class OrgJobAggregatePageParam extends PageReqV2 { - - /** - * 岗位分组标识集合 - */ - private Set orgJobGroupFlags; - /** - * 分组编码集合 - */ - private Set orgJobGroupCodes; - /** - * 岗位id集合 - */ - private Set jobIds; - /** - * 岗位编码集合 - */ - private Set jobCodes; - /** - * 岗位类型 - */ - private OrgJobTypeEnum type; - /** - * 搜索关键字 - * Notice: 名称或别名的模糊搜索 - */ - private String keyword; - - /** - * 是否需要查询角色信息 - */ - @Builder.Default - private Boolean needSaasRole = false; - /** - * 是否需要查询岗位分组信息 - */ - @Builder.Default - private Boolean needJobGroup = false; - - public boolean isInvalid() { - return CollUtil.isEmpty(orgJobGroupFlags) - && CollUtil.isEmpty(orgJobGroupCodes) - && CollUtil.isEmpty(jobIds) - && CollUtil.isEmpty(jobCodes) - && Objects.isNull(type) - && StringUtils.isBlank(keyword); - } - - @Override - public String toString() { - return super.toString(); - } -} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java index 081162d..15a66d9 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java @@ -1,13 +1,14 @@ package cn.axzo.orgmanax.server.orgjob.service.dto; import cn.axzo.foundation.page.PageReqV2; +import cn.axzo.orgmanax.dto.job.enums.OrgJobGroupFlagEnum; import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import java.util.List; import java.util.Objects; import java.util.Set; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -16,7 +17,7 @@ import org.apache.commons.lang3.StringUtils; /** * @author luofu * @version 1.0 - * @date 2024/9/18 + * @date 2024/9/12 */ @Data @SuperBuilder @@ -25,8 +26,15 @@ import org.apache.commons.lang3.StringUtils; public class OrgJobPageParam extends PageReqV2 { public static final OrgJobPageParam EMPTY_INSTANCE = new OrgJobPageParam(); - public static final Integer JOB_PAGE_SIZE = 1000; + /** + * 岗位分组标识集合 + */ + private Set orgJobGroupFlags; + /** + * 分组编码集合 + */ + private Set orgJobGroupCodes; /** * 岗位id集合 */ @@ -45,36 +53,47 @@ public class OrgJobPageParam extends PageReqV2 { */ private String keyword; - public static OrgJobPageParam from(OrgJobAggregatePageParam param) { - OrgJobPageParam jobPageParam = new OrgJobPageParam(); - jobPageParam.setType(param.getType()); - jobPageParam.setKeyword(param.getKeyword()); - jobPageParam.setJobIds(param.getJobIds()); - jobPageParam.setJobCodes(param.getJobCodes()); - jobPageParam.setPage(param.getPage()); - jobPageParam.setPageSize(param.getPageSize()); - return jobPageParam; - } + /** + * 是否需要查询角色信息 + */ + @Builder.Default + private Boolean needSaasRole = false; + /** + * 是否需要查询岗位分组信息 + */ + @Builder.Default + private Boolean needJobGroup = false; + + /** + * 岗位类型 1:总包单位 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS 7:企业通用 9:班组项目内 + */ + private List types; + + /** + * 可为空,即加载默认和自定义所有岗位 true预定义岗位 false 自定义岗位 + */ + private Boolean readonly; + + // workspace和unitId 只有自定义类型使用 + /** + * 单位/团队 ID 列表 + */ + private List unitIds; + + /** + * 工作台id 列表 + */ + private List workspaceIds; public boolean isInvalid() { - return CollUtil.isEmpty(jobIds) + return CollUtil.isEmpty(orgJobGroupFlags) + && CollUtil.isEmpty(orgJobGroupCodes) + && CollUtil.isEmpty(jobIds) && CollUtil.isEmpty(jobCodes) && Objects.isNull(type) && StringUtils.isBlank(keyword); } - public ListOrgJobReq convert() { - return BeanUtil.toBean(this, ListOrgJobReq.class); - } - -// public Integer getPage() { -// return Optional.ofNullable(super.getPage()).orElse(1); -// } -// -// public Integer getPageSize() { -// return Optional.ofNullable(super.getPageSize()).orElse(20); -// } - @Override public String toString() { return super.toString(); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/impl/OrgJobServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/impl/OrgJobServiceImpl.java index b67bafb..f724fd7 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/impl/OrgJobServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/impl/OrgJobServiceImpl.java @@ -1,27 +1,25 @@ package cn.axzo.orgmanax.server.orgjob.service.impl; -import static cn.axzo.orgmanax.dto.job.dto.OrgJobCodeConstants.CODE_KEY; -import static cn.axzo.orgmanax.dto.job.dto.OrgJobCodeConstants.OLD_CONFIG; -import static cn.axzo.orgmanax.dto.job.dto.OrgJobCodeConstants.OLD_NEW_JOB_CODE_MAP_KEY; -import static cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam.JOB_PAGE_SIZE; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.CODE_KEY; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.JOB_PAGE_SIZE; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.OLD_CONFIG; +import static cn.axzo.orgmanax.dto.job.dto.OrgJobConstants.OLD_NEW_JOB_CODE_MAP_KEY; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; +import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupDTO; +import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupRelationDTO; import cn.axzo.orgmanax.dto.job.dto.RoleDTO; import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; import cn.axzo.orgmanax.dto.job.req.CreateOrgJobReq; import cn.axzo.orgmanax.dto.job.req.DeleteOrgJobReq; -import cn.axzo.orgmanax.dto.job.req.ListOrgJobReq; import cn.axzo.orgmanax.dto.job.req.UpdateOrgJobReq; -import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupDTO; -import cn.axzo.orgmanax.dto.job.dto.OrgJobGroupRelationDTO; import cn.axzo.orgmanax.infra.client.tyr.RoleGateway; import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService; import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobGroupFoundationService; import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobGroupRelationFoundationService; import cn.axzo.orgmanax.server.orgjob.foundation.dto.OrgJobCreator; import cn.axzo.orgmanax.server.orgjob.service.OrgJobService; -import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobAggregatePageParam; import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobGroupPageParam; import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobGroupRelationPageParam; import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; @@ -86,18 +84,13 @@ public class OrgJobServiceImpl implements OrgJobService { } @Override - public PageResp list(ListOrgJobReq req) { - return foundationService.page(req); - } - - @Override - public PageResp page(OrgJobAggregatePageParam param) { + public PageResp page(OrgJobPageParam param) { if (param.isInvalid()) { log.info("org job page param is invalid. param:{}", JSONUtil.toJsonStr(param)); return PageResp.builder().build(); } OrgJobPageParam orgJobPageParam = resolveJobPageParam(param); - PageResp orgJobs = foundationService.page(orgJobPageParam.convert()); + PageResp orgJobs = foundationService.page(param); if (CollUtil.isEmpty(orgJobs.getData())) { log.info("org job page there is not any job. param:{}", JSONUtil.toJsonStr(orgJobPageParam)); return PageResp.builder().build(); @@ -183,12 +176,11 @@ public class OrgJobServiceImpl implements OrgJobService { .forEach(e -> e.setJobGroup(groupMap.get(relationGroup.get(e.getCode())))); } - private OrgJobPageParam resolveJobPageParam(OrgJobAggregatePageParam param) { - OrgJobPageParam jobPageParam = OrgJobPageParam.from(param); - jobPageParam.setJobCodes(resolveJobCodes(param.getJobCodes())); + private OrgJobPageParam resolveJobPageParam(OrgJobPageParam param) { + param.setJobCodes(resolveJobCodes(param.getJobCodes())); if (CollUtil.isEmpty(param.getOrgJobGroupCodes()) && CollUtil.isEmpty(param.getOrgJobGroupFlags())) { - return jobPageParam; + return param; } // 通过分组相关参数参数JOB OrgJobGroupPageParam groupListParam = OrgJobGroupPageParam.builder() @@ -201,20 +193,20 @@ public class OrgJobServiceImpl implements OrgJobService { JSONUtil.toJsonStr(groupListParam)); return OrgJobPageParam.EMPTY_INSTANCE; } - if (CollUtil.isEmpty(jobPageParam.getJobCodes())) { + if (CollUtil.isEmpty(param.getJobCodes())) { // 直接设置jobCodes入参 - jobPageParam.setJobCodes(jobCodes); + param.setJobCodes(jobCodes); } else { // jobCodes取交集 - Collection intersection = CollUtil.intersection(jobPageParam.getJobCodes(), jobCodes); + Collection intersection = CollUtil.intersection(param.getJobCodes(), jobCodes); if (CollUtil.isEmpty(intersection)) { log.info("resolveJobPageParam the intersection is empty. param:{}", JSONUtil.toJsonStr(groupListParam)); return OrgJobPageParam.EMPTY_INSTANCE; } - jobPageParam.setJobCodes(Sets.newHashSet(intersection)); + param.setJobCodes(Sets.newHashSet(intersection)); } - return jobPageParam; + return param; } private Set resolveJobCodesByGroup(OrgJobGroupPageParam groupListParam) { @@ -251,14 +243,13 @@ public class OrgJobServiceImpl implements OrgJobService { } public List whileQuery(OrgJobPageParam param) { - ListOrgJobReq listParam = ListOrgJobReq.builder().type(param.getType()).build(); List jobs = new ArrayList<>(); PageResp jobPage; int pageNumber = 0; param.setPageSize(JOB_PAGE_SIZE); do { param.setPage(++pageNumber); - jobPage = foundationService.page(listParam); + jobPage = foundationService.page(param); if (CollUtil.isNotEmpty(jobPage.getData())) { jobs.addAll(jobPage.getData()); } From 8ab687fa95721acdca1dfbc0d04279ba0beb61ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Tue, 24 Dec 2024 14:54:07 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(REQ-3282):=20=E8=B0=83=E6=95=B4NodeUse?= =?UTF-8?q?rQueryRepository=E7=9A=84=E8=81=8C=E8=B4=A3=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=81=9A=E8=81=9A=E5=90=88=EF=BC=8C=E8=81=9A=E5=90=88=E5=92=8C?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E8=BD=AC=E5=8C=96=E6=94=BE?= =?UTF-8?q?=E5=88=B0service=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/nodeuser/req/ListNodeUserReq.java | 90 ++---- .../repository/NodeUserQueryRepository.java | 281 ++++++++++++++++-- .../impl/NodeUserQueryRepositoryImpl.java | 97 +----- .../repository/OrgJobQueryRepository.java | 2 + .../service/impl/NodeUserServiceImpl.java | 97 +++++- .../impl/OrgJobFoundationServiceImpl.java | 2 + .../orgjob/service/dto/OrgJobPageParam.java | 12 +- .../server/util/QueryConditionAssembler.java | 38 +++ 8 files changed, 422 insertions(+), 197 deletions(-) create mode 100644 orgmanax-server/src/main/java/cn/axzo/orgmanax/server/util/QueryConditionAssembler.java 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 4db8ac2..911f22a 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 @@ -1,13 +1,10 @@ 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 cn.axzo.orgmanax.dto.common.WorkspaceOuPair; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,103 +22,76 @@ import java.util.List; @SuperBuilder public class ListNodeUserReq extends PageReqV2 { - @CriteriaField private Long id; - @CriteriaField(field = "id", operator = Operator.GT) private Long idGt; - @CriteriaField(field = "id", operator = Operator.IN) private Collection ids; /** * identity_id */ - @CriteriaField private Long identityId; - @CriteriaField(field = "identityId", operator = Operator.IN) private Collection identityIds; /** * 身份类型 0-无效类型, 1-工人, 2-班组长, 3-从业人员, 4-政务人员,5-运营人员 */ - @CriteriaField private Integer identityType; - @CriteriaField(field = "identityType", operator = Operator.IN) private Collection identityTypes; /** * 自然人id */ - @CriteriaField private Long personId; - @CriteriaField(field = "personId", operator = Operator.IN) private Collection personIds; - @CriteriaField(field = "personId", operator = Operator.NOT_IN) private Collection excludePersonIds; /** * 主电话 */ - @CriteriaField private String phone; - @CriteriaField(field = "phone", operator = Operator.NOT_IN) private Collection phones; /** * 名字 */ - @CriteriaField private String realName; - @CriteriaField(field = "realName", operator = Operator.LIKE) private String realNameLike; /** * 身份证号 */ - @CriteriaField private String idNumber; - @CriteriaField(field = "idNumber", operator = Operator.IN) private Collection idNumbers; /** * 单位id */ - @CriteriaField private Long organizationalUnitId; - @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) private Collection organizationalUnitIds; /** * 组织节点id */ - @CriteriaField private Long organizationalNodeId; - @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) private Collection organizationalNodeIds; - @CriteriaField(field = "organizationalNodeId", operator = Operator.NOT_IN) private Collection excludeOrganizationalNodeIds; /** * 顶级节点id */ - @CriteriaField private Long topNodeId; - @CriteriaField(field = "topNodeId", operator = Operator.IN) private Collection topNodeIds; - @CriteriaField(field = "topNodeId", operator = Operator.GT) private Long topNodeIdGt; /** * 部门管理员 1是 0否 */ - @CriteriaField private Boolean manager; /** * 岗位id */ - @CriteriaField private Long organizationalJobId; - @CriteriaField(field = "organizationalJobId", operator = Operator.IN) private Collection organizationalJobIds; /** @@ -129,7 +99,6 @@ public class ListNodeUserReq extends PageReqV2 { */ @CriteriaField private Long workspaceId; - @CriteriaField(field = "workspaceId", operator = Operator.IN) private Collection workspaceIds; /** @@ -155,7 +124,6 @@ public class ListNodeUserReq extends PageReqV2 { */ @CriteriaField private Long syncDataId; - @CriteriaField(field = "syncDataId", operator = Operator.IN) private List syncDataIds; /** @@ -170,83 +138,83 @@ public class ListNodeUserReq extends PageReqV2 { /** * 入职时间,大于等于 */ - @CriteriaField(field = "joinAt", operator = Operator.GE) private Date joinAtGe; /** * 入职时间,小于等于 */ - @CriteriaField(field = "joinAt", operator = Operator.LE) private Date joinAtLe; /** * 离职时间,大于等于 */ - @CriteriaField(field = "leaveAt", operator = Operator.GE) private Date leaveAtGe; /** * 离职时间,小于等于 */ - @CriteriaField(field = "leaveAt", operator = Operator.LE) private Date leaveAtLe; /** * 更新时间,大于等于 */ - @CriteriaField(field = "updateAt", operator = Operator.GE) private Date updateAtGe; /** * 更新时间,小于等于 */ - @CriteriaField(field = "updateAt", operator = Operator.LE) private Date updateAtLe; // ~ 需特殊实现的查询字段。(非CriteriaField直接可查询的字段) - + private Collection workspaceOuPairs; /** * leaderPersonId. 根据personId=leaderPersonId and manager = true,查询node。然后查询整个node下面的人 */ - @CriteriaField(ignore = true) // TODO: 待实现 private Long leaderPersonId; /** * 下属personId,根据personId=subordinatePersonId,查询到node,然后返回node的manager。 */ - @CriteriaField(ignore = true) private Long subordinatePersonId; // TODO: 待实现 // 岗位code - @CriteriaField(ignore = true) private String organizationalJobCode; // TODO: 待实现 - @CriteriaField(ignore = true) private Collection organizationalJobCodes; // TODO: 待实现 - @CriteriaField(ignore = true) private String organizationalJobName; // TODO: 待实现 - @CriteriaField(ignore = true) private String organizationalJobNameLike; // TODO: 待实现 - @CriteriaField(ignore = true) private Boolean onlyHasJob; // TODO: 待实现 - @CriteriaField(ignore = true) private Collection identityPairs; // TODO: 待实现 /** * 查询返回数据包含,逻辑删除数据,即查询未删除和已删除的数据。 */ - @CriteriaField(ignore = true) private Boolean includeDeleted; // TODO: 待实现 /** * 仅查询已删除的数据 */ - @CriteriaField(ignore = true) private Boolean deletedOnly; // TODO: 待实现 - @CriteriaField(ignore = true) private Integer nodeState; // TODO: 待实现 /** * keyword。用 idNumber,phone,jobNumber精确匹配,或者realName模糊匹配 */ - @CriteriaField(ignore = true) private String keyword; + /** + * 状态:1未激活 2、已激活 3、施工中 4、已退场 + */ + private Collection projectWorkerStatuses; // TODO: 待实现 + + /** + * orgUserStatus + */ + private Collection orgUserStatus; // TODO: 待实现 + + // ~ 不同部门类型的nodeUser的差异化查询字段。如 项目内工人 的 项目班组id,平台班组id等。 start + private Long platTeamId; // TODO: 待实现 + private Long projectTeamId; // TODO: 待实现 + private Collection projectTeamIds; // TODO: 待实现 + private Long projectWorkerId; // TODO: 待实现 + private Long projectGroupId; // TODO: 待实现 + + // ~ 结束。 // ~ 后置过滤的字段 /** @@ -276,22 +244,6 @@ public class ListNodeUserReq extends PageReqV2 { * 数据权限 */ private String dataPermissionCacheKey; // TODO: 待实现 - - /** - * orgUserStatus - */ - private Collection orgUserStatus; // TODO: 待实现 - - // ~ 不同部门类型的nodeUser的差异化查询字段。如 项目内工人 的 项目班组id,平台班组id等。 start - private Long platTeamId; // TODO: 待实现 - private Long projectTeamId; // TODO: 待实现 - private Collection projectTeamIds; // TODO: 待实现 - private Long projectWorkerId; // TODO: 待实现 - private Long projectGroupId; // TODO: 待实现 - /** - * 状态:1未激活 2、已激活 3、施工中 4、已退场 - */ - private Collection projectWorkerStatuses; // TODO: 待实现 // ~ 不同部门类型的nodeUser的差异化查询字段。如 项目内工人 的 项目班组id,平台班组id等。 end /** @@ -310,10 +262,8 @@ public class ListNodeUserReq extends PageReqV2 { /** * 聚合信息needs */ - @CriteriaField(ignore = true) private Needs needs; - @NoArgsConstructor @AllArgsConstructor @Data diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java index 52c4fad..533423e 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java @@ -1,26 +1,33 @@ package cn.axzo.orgmanax.infra.dao.nodeuser.repository; +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.nodeuser.req.ListNodeUserReq; -import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.dto.common.IdentityPair; +import cn.axzo.orgmanax.dto.common.WorkspaceOuPair; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; -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 com.google.common.base.Preconditions; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Optional; import java.util.Set; public interface NodeUserQueryRepository { - PageResp page(ListNodeUserReq req); + PageResp page(ListReq req); - default List list(ListNodeUserReq req) { + default List list(ListReq req) { return page(req).getData(); } @@ -30,12 +37,249 @@ public interface NodeUserQueryRepository { default Optional oneOpt(OneReq req) { req.check(); - ListNodeUserReq page = BeanUtil.toBean(req, ListNodeUserReq.class); + ListReq page = BeanUtil.toBean(req, ListReq.class); page.setPage(1); page.setPageSize(1); return page(page).getData().stream().findFirst(); } + @EqualsAndHashCode(callSuper = true) + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + class ListReq extends PageReqV2 { + @CriteriaField + private Long id; + @CriteriaField(field = "id", operator = Operator.GT) + private Long idGt; + @CriteriaField(field = "id", operator = Operator.IN) + private Collection ids; + + /** + * identity_id + */ + @CriteriaField + private Long identityId; + @CriteriaField(field = "identityId", operator = Operator.IN) + private Collection identityIds; + + /** + * 身份类型 0-无效类型, 1-工人, 2-班组长, 3-从业人员, 4-政务人员,5-运营人员 + */ + @CriteriaField + private Integer identityType; + @CriteriaField(field = "identityType", operator = Operator.IN) + private Collection identityTypes; + + /** + * 自然人id + */ + @CriteriaField + private Long personId; + @CriteriaField(field = "personId", operator = Operator.IN) + private Collection personIds; + @CriteriaField(field = "personId", operator = Operator.NOT_IN) + private Collection excludePersonIds; + + /** + * 主电话 + */ + @CriteriaField + private String phone; + @CriteriaField(field = "phone", operator = Operator.NOT_IN) + private Collection phones; + + /** + * 名字 + */ + @CriteriaField + private String realName; + @CriteriaField(field = "realName", operator = Operator.LIKE) + private String realNameLike; + + /** + * 身份证号 + */ + @CriteriaField + private String idNumber; + @CriteriaField(field = "idNumber", operator = Operator.IN) + private Collection idNumbers; + + /** + * 单位id + */ + @CriteriaField + private Long organizationalUnitId; + @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) + private Collection organizationalUnitIds; + + /** + * 组织节点id + */ + @CriteriaField + private Long organizationalNodeId; + @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) + private Collection organizationalNodeIds; + @CriteriaField(field = "organizationalNodeId", operator = Operator.NOT_IN) + private Collection excludeOrganizationalNodeIds; + + /** + * 顶级节点id + */ + @CriteriaField + private Long topNodeId; + @CriteriaField(field = "topNodeId", operator = Operator.IN) + private Collection topNodeIds; + @CriteriaField(field = "topNodeId", operator = Operator.GT) + private Long topNodeIdGt; + + /** + * 部门管理员 1是 0否 + */ + @CriteriaField + private Boolean manager; + + /** + * 岗位id + */ + @CriteriaField + private Long organizationalJobId; + @CriteriaField(field = "organizationalJobId", operator = Operator.IN) + private Collection organizationalJobIds; + + /** + * 工作台ID + */ + @CriteriaField + private Long workspaceId; + @CriteriaField(field = "workspaceId", operator = Operator.IN) + private Collection workspaceIds; + + /** + * 0:普通岗位、1:主岗位 + */ + @CriteriaField + private Integer primaryJob; + + /** + * 是否允许进入工地 1.允许 2.不允许 + */ + @CriteriaField + private Integer isAllowed; + + /** + * 迁移数据临时源id + */ + @CriteriaField + private Long tempSourceId; + + /** + * 数据同步ID + */ + @CriteriaField + private Long syncDataId; + @CriteriaField(field = "syncDataId", operator = Operator.IN) + private List syncDataIds; + + /** + * 工号 + */ + @CriteriaField + private String jobNumber; + + @CriteriaField + private Integer activeFlag; + + /** + * 入职时间,大于等于 + */ + @CriteriaField(field = "joinAt", operator = Operator.GE) + private Date joinAtGe; + + /** + * 入职时间,小于等于 + */ + @CriteriaField(field = "joinAt", operator = Operator.LE) + private Date joinAtLe; + /** + * 离职时间,大于等于 + */ + @CriteriaField(field = "leaveAt", operator = Operator.GE) + private Date leaveAtGe; + /** + * 离职时间,小于等于 + */ + @CriteriaField(field = "leaveAt", operator = Operator.LE) + private Date leaveAtLe; + /** + * 更新时间,大于等于 + */ + @CriteriaField(field = "updateAt", operator = Operator.GE) + private Date updateAtGe; + /** + * 更新时间,小于等于 + */ + @CriteriaField(field = "updateAt", operator = Operator.LE) + private Date updateAtLe; + + + // ~ 需特殊实现的查询字段。(非CriteriaField直接可查询的字段) + @CriteriaField(ignore = true) + private Collection workspaceOuPairs; + /** + * leaderPersonId. 根据personId=leaderPersonId and manager = true,查询node。然后查询整个node下面的人 + */ + @CriteriaField(ignore = true) // TODO: 待实现 + private Long leaderPersonId; + /** + * 下属personId,根据personId=subordinatePersonId,查询到node,然后返回node的manager。 + */ + @CriteriaField(ignore = true) + private Long subordinatePersonId; // TODO: 待实现 + // 岗位code + @CriteriaField(ignore = true) + private String organizationalJobCode; // TODO: 待实现 + + @CriteriaField(ignore = true) + private Collection organizationalJobCodes; // TODO: 待实现 + @CriteriaField(ignore = true) + private String organizationalJobName; // TODO: 待实现 + @CriteriaField(ignore = true) + private String organizationalJobNameLike; // TODO: 待实现 + @CriteriaField(ignore = true) + private Boolean onlyHasJob; // TODO: 待实现 + + @CriteriaField(ignore = true) + private Collection identityPairs; // TODO: 待实现 + + /** + * 查询返回数据包含,逻辑删除数据,即查询未删除和已删除的数据。 + */ + @CriteriaField(ignore = true) + private Boolean includeDeleted; // TODO: 待实现 + /** + * 仅查询已删除的数据 + */ + @CriteriaField(ignore = true) + private Boolean deletedOnly; // TODO: 待实现 + + @CriteriaField(ignore = true) + private Integer nodeState; // TODO: 待实现 + + /** + * keyword。用 idNumber,phone,jobNumber精确匹配,或者realName模糊匹配 + */ + @CriteriaField(ignore = true) + private String keyword; + + /** + * orgUserStatus + */ + @CriteriaField(ignore = true) + private Collection orgUserStatus; // TODO: 待实现 + } + @NoArgsConstructor @AllArgsConstructor @Data @@ -55,26 +299,7 @@ public interface NodeUserQueryRepository { @Data @SuperBuilder class NodeUserResp extends OrganizationalNodeUser { - /** - * 查询参数指定 needs.node = true,才会返回 - * - * @see ListNodeUserReq.Needs#getNode() - */ - private NodeQueryRepository.NodeResp node; - - /** - * 查询参数指定 needs.unit = true,才会返回 - * - * @see ListNodeUserReq.Needs#getUnit() - */ - private UnitQueryRepository.UnitResp unit; - - /** - * 查询参数指定 needs.job = true,才会返回 - * - * @see ListNodeUserReq.Needs#getJob() - */ - private OrgJobQueryRepository.JobResp job; + private String xx; } } 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 d5996b4..93035c8 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,14 +3,9 @@ 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.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; @@ -20,14 +15,9 @@ 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; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -35,12 +25,9 @@ import java.util.stream.Collectors; public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository { private final NodeUserDao nodeUserDao; - private final NodeQueryRepository nodeQueryRepository; - private final OrgJobQueryRepository jobQueryRepository; - private final UnitQueryRepository unitQueryRepository; @Override - public PageResp page(ListNodeUserReq req) { + public PageResp page(ListReq 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); @@ -61,91 +48,17 @@ public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository { 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)); - PageResp resp = PageConverter.toResp(results); + if (CollUtil.isEmpty(results.getRecords())) { + return emptyPage; + } + PageResp resp = PageConverter.toResp(results); List records = resp.getData(); if (CollUtil.isEmpty(records)) { return resp; } - - // assembles - assembleNode(req, records); - assembleJob(req, records); - assembleUnit(req, records); return resp; } - private void assembleUnit(ListNodeUserReq req, List records) { - if (CollUtil.isEmpty(records) || req.getNeeds() == null) { - return; - } - if (!BooleanUtil.isTrue(req.getNeeds().getUnit())) { - return; - } - Set unitIds = records.stream().map(NodeUserResp::getOrganizationalUnitId).collect(Collectors.toSet()); - Map unitsById = unitQueryRepository.list(UnitQueryRepository.ListReq.builder() - .ids(unitIds) - .build()).stream().collect(Collectors.toMap(UnitQueryRepository.UnitResp::getId, Function.identity())); - records.forEach(r -> r.setUnit(unitsById.get(r.getOrganizationalUnitId()))); - } - - private void assembleJob(ListNodeUserReq req, List records) { - if (CollUtil.isEmpty(records) || req.getNeeds() == null) { - return; - } - if (!BooleanUtil.isTrue(req.getNeeds().getJob())) { - return; - } - Set jobIds = records.stream().map(NodeUserResp::getOrganizationalJobId).collect(Collectors.toSet()); - // assemble job - Map jobsById = jobQueryRepository.page(OrgJobQueryRepository.ListReq.builder() - .ids(jobIds) - .build()).getData().stream().collect(Collectors.toMap(OrgJobQueryRepository.JobResp::getId, Function.identity())); - records.forEach(r -> r.setJob(jobsById.get(r.getOrganizationalJobId()))); - } - - private void assembleNode(ListNodeUserReq req, List records) { - if (CollUtil.isEmpty(records) || req.getNeeds() == null) { - return; - } - 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 6dd502c..a5e3570 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 @@ -62,6 +62,8 @@ public interface OrgJobQueryRepository { @CriteriaField(field = "code", operator = Operator.IN) private Collection codes; + @CriteriaField + private String code; /** * 岗位类型 diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java index 4169728..ece6fce 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java @@ -2,21 +2,38 @@ package cn.axzo.orgmanax.server.nodeuser.service.impl; import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; +import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.dto.job.dto.OrgJobDTO; +import cn.axzo.orgmanax.dto.node.dto.OrgNodeDTO; +import cn.axzo.orgmanax.dto.node.req.ListNodeReq; +import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.dto.nodeuser.req.ProcessNodeUserReq; -import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; -import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.dto.unit.dto.OrgUnitDTO; +import cn.axzo.orgmanax.dto.unit.req.ListUnitReq; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.server.node.service.NodeService; import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import cn.axzo.orgmanax.server.orgjob.service.OrgJobService; +import cn.axzo.orgmanax.server.orgjob.service.dto.OrgJobPageParam; +import cn.axzo.orgmanax.server.unit.service.UnitService; +import cn.axzo.orgmanax.server.util.QueryConditionAssembler; 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.google.common.collect.ImmutableList; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -24,6 +41,9 @@ import java.util.List; public class NodeUserServiceImpl implements NodeUserService { private final NodeUserQueryRepository nodeUserQueryRepository; + private final NodeService nodeService; + private final OrgJobService jobService; + private final UnitService unitService; private final ApplicationContext applicationContext; @Override @@ -50,9 +70,80 @@ public class NodeUserServiceImpl implements NodeUserService { @Override public PageResp page(ListNodeUserReq req) { - PageResp page = nodeUserQueryRepository.page(req); + PageResp emptyPage = PageResp.builder().size(req.getPageSize()) + .current(req.getPage()).total(0L).data(ImmutableList.of()).build(); + NodeUserQueryRepository.ListReq listReq = BeanUtil.toBean(req, NodeUserQueryRepository.ListReq.class); + // jobCodes -> jobIds + if (CollUtil.isNotEmpty(req.getOrganizationalJobCodes()) + || StrUtil.isNotBlank(req.getOrganizationalJobCode()) + || StrUtil.isNotBlank(req.getOrganizationalJobNameLike())) { + Set jobIds = jobService.page(OrgJobPageParam.builder() + .jobCodes(req.getOrganizationalJobCodes()) + .jobCode(req.getOrganizationalJobCode()) + .jobNameLike(req.getOrganizationalJobNameLike()) + .build()) + .getData().stream().map(OrgJobDTO::getId).collect(Collectors.toSet()); + if (jobIds.isEmpty()) { + return emptyPage; + } + req.setOrganizationalJobIds(QueryConditionAssembler.assemble(req.getOrganizationalJobIds(), jobIds)); + } + PageResp page = nodeUserQueryRepository.page(listReq); List records = BeanUtil.copyToList(CollUtil.emptyIfNull(page.getData()), NodeUserDTO.class); + // assemble data if needed + assembleUnit(req, records); + assembleJob(req, records); + assembleNode(req, records); return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records); } + + + private void assembleUnit(ListNodeUserReq req, List records) { + if (CollUtil.isEmpty(records) || req.getNeeds() == null) { + return; + } + if (!BooleanUtil.isTrue(req.getNeeds().getUnit())) { + return; + } + Set unitIds = records.stream().map(NodeUserDTO::getOrganizationalUnitId).collect(Collectors.toSet()); + Map unitsById = unitService.list(ListUnitReq.builder() + .ids(unitIds) + .searchCount(false) + .build()).getData().stream().collect(Collectors.toMap(OrgUnitDTO::getId, Function.identity())); + records.forEach(r -> r.setUnit(unitsById.get(r.getOrganizationalUnitId()))); + } + + private void assembleJob(ListNodeUserReq req, List records) { + if (CollUtil.isEmpty(records) || req.getNeeds() == null) { + return; + } + if (!BooleanUtil.isTrue(req.getNeeds().getJob())) { + return; + } + Set jobIds = records.stream().map(NodeUserDTO::getOrganizationalJobId).collect(Collectors.toSet()); + // assemble job + Map jobsById = jobService.page(OrgJobPageParam.builder() + .jobIds(jobIds) + .build()).getData().stream().collect(Collectors.toMap(OrgJobDTO::getId, Function.identity())); + records.forEach(r -> r.setJob(jobsById.get(r.getOrganizationalJobId()))); + } + + private void assembleNode(ListNodeUserReq req, List records) { + if (CollUtil.isEmpty(records) || req.getNeeds() == null) { + return; + } + if (!BooleanUtil.isTrue(req.getNeeds().getNode()) && !BooleanUtil.isTrue(req.getNeeds().getAncestorNode())) { + return; + } + Set nodeIds = records.stream().map(NodeUserDTO::getOrganizationalNodeId).collect(Collectors.toSet()); + // assemble parentNode + Map nodesById = nodeService.list(ListNodeReq.builder() + .ids(nodeIds) + .includeAncestors(BooleanUtil.isTrue(req.getNeeds().getAncestorNode())) + .build()).stream().collect(Collectors.toMap(OrgNodeDTO::getId, Function.identity())); + + records.forEach(r -> r.setNode(nodesById.get(r.getOrganizationalNodeId()))); + } + } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java index 6f1ec52..2e6d226 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/foundation/impl/OrgJobFoundationServiceImpl.java @@ -53,6 +53,8 @@ public class OrgJobFoundationServiceImpl implements OrgJobFoundationService { OrgJobQueryRepository.ListReq param = BeanUtil.copyProperties(req, OrgJobQueryRepository.ListReq.class); param.setIds(req.getJobIds()); param.setCodes(req.getJobCodes()); + param.setCode(req.getJobCode()); + param.setNameLike(req.getJobNameLike()); return param; } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java index 15a66d9..b710bcf 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orgjob/service/dto/OrgJobPageParam.java @@ -4,9 +4,6 @@ import cn.axzo.foundation.page.PageReqV2; import cn.axzo.orgmanax.dto.job.enums.OrgJobGroupFlagEnum; import cn.axzo.orgmanax.dto.job.enums.OrgJobTypeEnum; import cn.hutool.core.collection.CollUtil; -import java.util.List; -import java.util.Objects; -import java.util.Set; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -14,6 +11,11 @@ import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import org.apache.commons.lang3.StringUtils; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Set; + /** * @author luofu * @version 1.0 @@ -42,7 +44,9 @@ public class OrgJobPageParam extends PageReqV2 { /** * 岗位编码集合 */ - private Set jobCodes; + private Collection jobCodes; + private String jobCode; + private String jobNameLike; /** * 岗位类型 */ diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/util/QueryConditionAssembler.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/util/QueryConditionAssembler.java new file mode 100644 index 0000000..fde6413 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/util/QueryConditionAssembler.java @@ -0,0 +1,38 @@ +package cn.axzo.orgmanax.server.util; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.ImmutableList; + +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class QueryConditionAssembler { + /** + * 组装查询条件的逻辑。 + * 1、如果没有参数,或者所有参数都是empty,则返回empty + * 2、如果仅有一个参数不为empty,则返回该参数 + * 3、如果存在多个不为empty的参数,将这些参数去交集 + * + * @param collections + * @param + * @return + */ + @SafeVarargs + public static Collection assemble(Collection... collections) { + if (collections == null || collections.length == 0) { + return ImmutableList.of(); + } + Collection> nonEmptyCollections = Stream.of(collections).filter(CollUtil::isNotEmpty).collect(Collectors.toList()); + if (nonEmptyCollections.isEmpty()) { + return ImmutableList.of(); + } + Collection c1 = nonEmptyCollections.stream().findFirst().orElse(null); + Collection c2 = nonEmptyCollections.stream().skip(1).findFirst().orElse(null); + if (CollUtil.isEmpty(c2)) { + return c1; + } + Collection[] others = nonEmptyCollections.stream().skip(2).toArray(Collection[]::new); + return CollUtil.intersectionDistinct(c1, c2, others); + } +}