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-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-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/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-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..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,10 +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.orgmanax.dto.common.DistinctRule; import cn.axzo.orgmanax.dto.common.IdentityPair; +import cn.axzo.orgmanax.dto.common.WorkspaceOuPair; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,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; /** @@ -126,7 +99,6 @@ public class ListNodeUserReq extends PageReqV2 { */ @CriteriaField private Long workspaceId; - @CriteriaField(field = "workspaceId", operator = Operator.IN) private Collection workspaceIds; /** @@ -152,7 +124,6 @@ public class ListNodeUserReq extends PageReqV2 { */ @CriteriaField private Long syncDataId; - @CriteriaField(field = "syncDataId", operator = Operator.IN) private List syncDataIds; /** @@ -167,78 +138,84 @@ 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模糊匹配 + */ + 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: 待实现 + + // ~ 结束。 + // ~ 后置过滤的字段 /** * 包含的单位类型 @@ -267,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 /** @@ -301,10 +262,8 @@ public class ListNodeUserReq extends PageReqV2 { /** * 聚合信息needs */ - @CriteriaField(ignore = true) private Needs needs; - @NoArgsConstructor @AllArgsConstructor @Data @@ -360,4 +319,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/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-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 9588f7f..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,28 +3,21 @@ 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.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.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 @@ -32,74 +25,40 @@ 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); - // 查询参数过滤 - + // 查询参数处理 ~ + // 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); + } 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())) { - return; - } - Set nodeIds = records.stream().map(NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet()); - // assemble parentNode - Map nodesById = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder() - .ids(nodeIds) - .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/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/OrgJobQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orgjob/repository/OrgJobQueryRepository.java index d0963da..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 @@ -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 */ @@ -50,6 +62,8 @@ public interface OrgJobQueryRepository { @CriteriaField(field = "code", operator = Operator.IN) private Collection codes; + @CriteriaField + private String code; /** * 岗位类型 @@ -63,6 +77,9 @@ public interface OrgJobQueryRepository { */ @CriteriaField(ignore = true) private String keyword; + @CriteriaField(field = "name", operator = Operator.LIKE) + private String nameLike; + } @EqualsAndHashCode(callSuper = true) 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)) { 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); 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; } 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/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..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 @@ -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,10 +49,12 @@ 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()); + param.setCode(req.getJobCode()); + param.setNameLike(req.getJobNameLike()); return param; } } 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..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 @@ -1,22 +1,25 @@ 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.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; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Set; + /** * @author luofu * @version 1.0 - * @date 2024/9/18 + * @date 2024/9/12 */ @Data @SuperBuilder @@ -25,8 +28,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集合 */ @@ -34,7 +44,9 @@ public class OrgJobPageParam extends PageReqV2 { /** * 岗位编码集合 */ - private Set jobCodes; + private Collection jobCodes; + private String jobCode; + private String jobNameLike; /** * 岗位类型 */ @@ -45,36 +57,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()); } 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); + } +}