feat(REQ-3488): 班组类别树形结构实现

This commit is contained in:
songyuanlun 2025-01-09 13:57:08 +08:00
parent 07eaccf53d
commit 58d057b62d
16 changed files with 426 additions and 48 deletions

View File

@ -2,6 +2,7 @@ package cn.axzo.orgmanax.api.project.team.feign;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.foundation.result.ApiResult; import cn.axzo.foundation.result.ApiResult;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryAggregateDTO;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO; import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO;
import cn.axzo.orgmanax.dto.project.team.req.GroupTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.GroupTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.OperateOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.OperateOrgTeamCategoryReq;
@ -11,6 +12,7 @@ import cn.axzo.orgmanax.dto.project.team.req.PreCheckRemoveTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.RemoveProjectTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.RemoveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.TreeOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp; import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp;
import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp;
import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp; import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp;
@ -101,9 +103,16 @@ public interface OrgProjectTeamCategoryApi {
@PostMapping(value = "/api/project/team-category/list-by-node") @PostMapping(value = "/api/project/team-category/list-by-node")
ApiResult<SingletonOrgTeamCategoryResp> listByNode(@RequestBody @Valid SingletonOrgTeamCategoryReq req); ApiResult<SingletonOrgTeamCategoryResp> listByNode(@RequestBody @Valid SingletonOrgTeamCategoryReq req);
// ---------------- 新版接口 ----------------
/** /**
* 列表分页查询 * 列表分页查询
*/ */
@PostMapping(value = "/api/project/team-category/list") @PostMapping(value = "/api/project/team-category/list")
ApiResult<PageResp<TeamCategoryDTO>> list(@RequestBody PageOrgTeamCategoryReq req); ApiResult<PageResp<TeamCategoryDTO>> list(@RequestBody PageOrgTeamCategoryReq req);
/**
* 查询班组-树形结构
*/
@PostMapping(value = "/api/project/team-category/tree-list")
ApiResult<List<TeamCategoryAggregateDTO>> treeList(@RequestBody TreeOrgTeamCategoryReq req);
} }

View File

@ -7,3 +7,12 @@ Accept: application/json
{ {
"orgNodeIds": [14606,14585] "orgNodeIds": [14606,14585]
} }
### 班组类别-树形结构
POST {{host}}/api/project/team-category/tree-list
Content-Type: application/json
Accept: application/json
{
"orgNodeIds": [14606,14585]
}

View File

@ -147,6 +147,13 @@ public class ListNodeReq extends PageReqV2 {
@Builder.Default @Builder.Default
private Set<Long> platTeamIds = Collections.emptySet(); private Set<Long> platTeamIds = Collections.emptySet();
/**
* 项目内班组id列表
* todo 未实现
*/
@Builder.Default
private Set<Long> projectTeamIds = Collections.emptySet();
/** /**
* todo 未实现 * todo 未实现
* 小组类型 * 小组类型

View File

@ -1,5 +1,7 @@
package cn.axzo.orgmanax.dto.project.team.dto; package cn.axzo.orgmanax.dto.project.team.dto;
import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import java.util.List; import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -14,22 +16,32 @@ import lombok.experimental.SuperBuilder;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class TeamCategoryAggregateDTO { public class TeamCategoryAggregateDTO {
/**
* 邀请id/申请id
*/
private Long inviteId;
/** /**
* 班组id * 班组id
* 须知返回的班组id可能没有业务方如果只需要项目班组的班组类别需要过滤掉为空的数据
*/ */
private Long projectTeamId; private Long projectTeamId;
/** /**
* 经营范围code * 经营范围code
*/ */
private String categoryCode; private String code;
/** /**
* 经营范围名称 * 经营范围名称
*/ */
private String categoryName; private String name;
/**
* 班组类别 - 分类
* @see TeamCategoryTypeEnum
*/
private Integer type;
/**
* 数据有效性标记
* @see ValidationEnum
*/
private Integer valid;
/** /**
* 父级经营范围code * 父级经营范围code
@ -41,23 +53,9 @@ public class TeamCategoryAggregateDTO {
*/ */
private String parentCategoryName; private String parentCategoryName;
private Integer type;
private Integer valid;
/** /**
* 经营范围子级 * 经营范围子级
*/ */
private List<TeamCategoryAggregateDTO> workScopes; private List<TeamCategoryAggregateDTO> workScopes;
public TeamCategoryAggregateDTO(String categoryCode, String categoryName) {
this.categoryCode = categoryCode;
this.categoryName = categoryName;
}
public TeamCategoryAggregateDTO(Long inviteId, Long projectTeamId, String categoryCode, String categoryName) {
this.inviteId = inviteId;
this.projectTeamId = projectTeamId;
this.categoryCode = categoryCode;
this.categoryName = categoryName;
}
} }

View File

@ -18,6 +18,9 @@ import lombok.Getter;
@AllArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum TeamCategoryTypeEnum{ public enum TeamCategoryTypeEnum{
/**
* 班组类别分类
*/
OTHERS(0, "其他"), OTHERS(0, "其他"),
WORKER_GROUP_CATEGORY(1, "经营范围"), WORKER_GROUP_CATEGORY(1, "经营范围"),
WORKER_GROUP_PROFESSION(2, "经营范围子级"), WORKER_GROUP_PROFESSION(2, "经营范围子级"),

View File

@ -1,12 +1,14 @@
package cn.axzo.orgmanax.dto.project.team.enums; package cn.axzo.orgmanax.dto.project.team.enums;
import lombok.AccessLevel; import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
/** /**
* @description * @description
@ -40,4 +42,11 @@ public enum ValidationEnum {
.filter(e -> Objects.equals(e.code, code)) .filter(e -> Objects.equals(e.code, code))
.findFirst(); .findFirst();
} }
public static Set<Integer> getAllCode() {
return Lists.newArrayList(EFFECTIVE, INVALID)
.stream()
.map(ValidationEnum::getCode)
.collect(Collectors.toSet());
}
} }

View File

@ -1,13 +1,12 @@
package cn.axzo.orgmanax.dto.project.team.req; package cn.axzo.orgmanax.dto.project.team.req;
import java.util.List;
import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.List;
import java.util.Set;
/** /**
* @author : zhanghonghao@axzo.cn * @author : zhanghonghao@axzo.cn
* @since : 2024/12/30 * @since : 2024/12/30
@ -53,6 +52,11 @@ public class ListProjectTeamReq {
*/ */
private Set<Long> platTeamIds; private Set<Long> platTeamIds;
/**
* 项目内班组id列表
*/
private Set<Long> projectTeamIds;
/** /**
* 项目IDs workspaceId workspaceIds只传一个 * 项目IDs workspaceId workspaceIds只传一个
*/ */

View File

@ -1,7 +1,9 @@
package cn.axzo.orgmanax.dto.project.team.req; package cn.axzo.orgmanax.dto.project.team.req;
import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageReqV2;
import java.util.List; import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -22,5 +24,28 @@ public class PageOrgTeamCategoryReq extends PageReqV2 {
/** /**
* nodeId 列表 * nodeId 列表
*/ */
private List<Long> orgNodeIds; private Set<Long> orgNodeIds;
/**
* 班组类别列表 categoryTypes
* @see TeamCategoryTypeEnum
*/
private Set<String> categoryTypes;
/**
* 经营范围/经营范围子级categoryCodes
*/
private Set<String> categoryCodes;
/**
* 数据有效性标记
* @see ValidationEnum
*/
private Integer valid;
/**
* 项目内班组id列表
*/
private Set<Long> projectTeamIds;
} }

View File

@ -0,0 +1,48 @@
package cn.axzo.orgmanax.dto.project.team.req;
import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author syl
* @date 2024/12/18
*/
@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class TreeOrgTeamCategoryReq {
/**
* nodeId 列表
*/
private Set<Long> orgNodeIds;
/**
* 班组类别列表 categoryTypes
* @see TeamCategoryTypeEnum
*/
private Set<String> categoryTypes;
/**
* 经营范围/经营范围子级categoryCodes
*/
private Set<String> categoryCodes;
/**
* 数据有效性标记
* @see ValidationEnum
*/
private Integer valid;
/**
* 项目内班组id列表
*/
private Set<Long> projectTeamIds;
}

View File

@ -4,11 +4,10 @@ import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum; import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum; import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import cn.axzo.orgmanax.infra.dao.project.team.entity.TeamCategory; import cn.axzo.orgmanax.infra.dao.project.team.entity.TeamCategory;
import java.util.List; import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -46,7 +45,7 @@ public interface TeamCategoryRepository {
* 组织节点idList * 组织节点idList
*/ */
@CriteriaField(field = "orgNodeId", operator = Operator.IN) @CriteriaField(field = "orgNodeId", operator = Operator.IN)
private List<Long> orgNodeIds; private Set<Long> orgNodeIds;
/** /**
* 班组类别code * 班组类别code
*/ */
@ -56,7 +55,7 @@ public interface TeamCategoryRepository {
* 班组类别codes * 班组类别codes
*/ */
@CriteriaField(field = "code", operator = Operator.IN) @CriteriaField(field = "code", operator = Operator.IN)
private List<String> codes; private Set<String> codes;
/** /**
* 班组类别名称 * 班组类别名称
*/ */
@ -67,16 +66,11 @@ public interface TeamCategoryRepository {
*/ */
@CriteriaField @CriteriaField
private String parentCode; private String parentCode;
/**
* 班组类别 - 分类
*/
@CriteriaField
private TeamCategoryTypeEnum type;
/** /**
* 班组类别 - 分类 List * 班组类别 - 分类 List
*/ */
@CriteriaField(field = "type", operator = Operator.IN) @CriteriaField(field = "type", operator = Operator.IN)
private List<TeamCategoryTypeEnum> types; private Set<Integer> types;
/** /**
* 班组类别使用场景 * 班组类别使用场景
*/ */
@ -84,9 +78,10 @@ public interface TeamCategoryRepository {
private TeamSceneEnum scene; private TeamSceneEnum scene;
/** /**
* 数据有效性标记 * 数据有效性标记
* @see ValidationEnum
*/ */
@CriteriaField(field = "valid", operator = Operator.IN) @CriteriaField(field = "valid", operator = Operator.IN)
private List<ValidationEnum> valids; private Set<Integer> validList;
/** /**
* 创建人的自然人id * 创建人的自然人id
*/ */

View File

@ -3,6 +3,7 @@ package cn.axzo.orgmanax.server.project.team.controller;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.foundation.result.ApiResult; import cn.axzo.foundation.result.ApiResult;
import cn.axzo.orgmanax.api.project.team.feign.OrgProjectTeamCategoryApi; import cn.axzo.orgmanax.api.project.team.feign.OrgProjectTeamCategoryApi;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryAggregateDTO;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO; import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO;
import cn.axzo.orgmanax.dto.project.team.req.GroupTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.GroupTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.OperateOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.OperateOrgTeamCategoryReq;
@ -12,14 +13,16 @@ import cn.axzo.orgmanax.dto.project.team.req.PreCheckRemoveTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.RemoveProjectTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.RemoveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.TreeOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp; import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp;
import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp;
import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp; import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp;
import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService; import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService;
import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq; import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONUtil;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -27,6 +30,7 @@ import org.springframework.web.bind.annotation.RestController;
* @author syl * @author syl
* @date 2025/1/3 * @date 2025/1/3
*/ */
@Slf4j
@RestController @RestController
@RequestMapping @RequestMapping
@RequiredArgsConstructor @RequiredArgsConstructor
@ -71,7 +75,15 @@ public class OrgProjectTeamCategoryController implements OrgProjectTeamCategoryA
@Override @Override
public ApiResult<PageResp<TeamCategoryDTO>> list(PageOrgTeamCategoryReq req) { public ApiResult<PageResp<TeamCategoryDTO>> list(PageOrgTeamCategoryReq req) {
log.info("team_category page request param: [{}]", JSONUtil.toJsonStr(req));
return ApiResult.success(projectTeamCategoryService return ApiResult.success(projectTeamCategoryService
.page(BeanUtil.copyProperties(req, ListTeamCategoryReq.class))); .page(ListTeamCategoryReq.convertListReq(req)));
}
@Override
public ApiResult<List<TeamCategoryAggregateDTO>> treeList(TreeOrgTeamCategoryReq req) {
log.info("team_category tree request param: [{}]", JSONUtil.toJsonStr(req));
return ApiResult.success(projectTeamCategoryService
.treeList(ListTeamCategoryReq.convertTreeReq(req)));
} }
} }

View File

@ -28,8 +28,7 @@ public class ProjectTeamCategoryFoundationServiceImpl implements ProjectTeamCate
private final TeamCategoryRepository teamCategoryRepository; private final TeamCategoryRepository teamCategoryRepository;
@Override @Override
public PageResp<TeamCategoryDTO> page(ListTeamCategoryReq param) { public PageResp<TeamCategoryDTO> page(ListTeamCategoryReq param) {
PageResp<TeamCategoryResp> page = teamCategoryRepository.page( PageResp<TeamCategoryResp> page = teamCategoryRepository.page(convertFromList(param));
BeanUtil.copyProperties(param, TeamCategoryRepository.PageReq.class));
return PageResp.<TeamCategoryDTO>builder() return PageResp.<TeamCategoryDTO>builder()
.size(page.getSize()) .size(page.getSize())
.current(page.getCurrent()) .current(page.getCurrent())
@ -53,4 +52,13 @@ public class ProjectTeamCategoryFoundationServiceImpl implements ProjectTeamCate
} while (pageResp.hasNext()); } while (pageResp.hasNext());
return categoryList; return categoryList;
} }
public TeamCategoryRepository.PageReq convertFromList(ListTeamCategoryReq param) {
TeamCategoryRepository.PageReq pageReq = BeanUtil.copyProperties(param, TeamCategoryRepository.PageReq.class);
pageReq.setTypes(param.getCategoryTypes());
pageReq.setCodes(param.getCategoryCodes());
pageReq.setParentCode(param.getParentCategoryCode());
return pageReq;
}
} }

View File

@ -1,8 +1,10 @@
package cn.axzo.orgmanax.server.project.team.service; package cn.axzo.orgmanax.server.project.team.service;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryAggregateDTO;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO; import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO;
import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq; import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq;
import java.util.List;
/** /**
* @author syl * @author syl
@ -10,5 +12,13 @@ import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq;
*/ */
public interface ProjectTeamCategoryService { public interface ProjectTeamCategoryService {
/**
* 分页查询班组类别
*/
PageResp<TeamCategoryDTO> page(ListTeamCategoryReq req); PageResp<TeamCategoryDTO> page(ListTeamCategoryReq req);
/**
* 班组类别聚合查询
*/
List<TeamCategoryAggregateDTO> treeList(ListTeamCategoryReq req);
} }

View File

@ -1,7 +1,15 @@
package cn.axzo.orgmanax.server.project.team.service.dto; package cn.axzo.orgmanax.server.project.team.service.dto;
import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageReqV2;
import java.util.List; import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import cn.axzo.orgmanax.dto.project.team.req.PageOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.TreeOrgTeamCategoryReq;
import cn.hutool.core.bean.BeanUtil;
import com.google.common.collect.Sets;
import java.util.Objects;
import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -22,5 +30,73 @@ public class ListTeamCategoryReq extends PageReqV2 {
/** /**
* nodeId 列表 * nodeId 列表
*/ */
private List<Long> orgNodeIds; private Set<Long> orgNodeIds;
/**
* 租户id
*/
private Long workspaceId;
/**
* 班组类别使用场景
* @see TeamSceneEnum
*/
private String scene;
/**
* 上级节点code
*/
private String parentCategoryCode;
/**
* 班组类别列表 categoryTypes
* @see TeamCategoryTypeEnum
*/
private Set<Integer> categoryTypes;
/**
* 经营范围/经营范围子级categoryCodes
*/
private Set<String> categoryCodes;
/**
* 数据有效性标记
* @see ValidationEnum
*/
private Set<Integer> validList;
/**
* 项目内班组idList
*/
private Set<Long> projectTeamIds;
/**
* 平台班组id
*/
private Set<Long> platTeamIds;
public static ListTeamCategoryReq convertListReq(PageOrgTeamCategoryReq req){
ListTeamCategoryReq param = BeanUtil.copyProperties(req, ListTeamCategoryReq.class);
if (Objects.isNull(req.getValid())) {
param.setValidList(Sets.newHashSet(ValidationEnum.EFFECTIVE.getCode()));
} else if (Objects.equals(ValidationEnum.ALL.getCode(), req.getValid())) {
param.setValidList(ValidationEnum.getAllCode());
} else {
param.setValidList(Sets.newHashSet(req.getValid()));
}
return param;
}
public static ListTeamCategoryReq convertTreeReq(TreeOrgTeamCategoryReq req){
ListTeamCategoryReq param = BeanUtil.copyProperties(req, ListTeamCategoryReq.class);
if (Objects.isNull(req.getValid())) {
param.setValidList(Sets.newHashSet(ValidationEnum.EFFECTIVE.getCode()));
} else if (Objects.equals(ValidationEnum.ALL.getCode(), req.getValid())) {
param.setValidList(ValidationEnum.getAllCode());
} else {
param.setValidList(Sets.newHashSet(req.getValid()));
}
return param;
}
} }

View File

@ -1,11 +1,36 @@
package cn.axzo.orgmanax.server.project.team.service.impl; package cn.axzo.orgmanax.server.project.team.service.impl;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.dto.node.dto.NodeProfile;
import cn.axzo.orgmanax.dto.node.dto.OrgNodeDTO;
import cn.axzo.orgmanax.dto.node.enums.NodeTypeEnum;
import cn.axzo.orgmanax.dto.node.req.ListNodeReq;
import cn.axzo.orgmanax.dto.project.team.dto.OrgProjectTeamDTO;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryAggregateDTO;
import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO; import cn.axzo.orgmanax.dto.project.team.dto.TeamCategoryDTO;
import cn.axzo.orgmanax.dto.project.team.enums.TeamCategoryTypeEnum;
import cn.axzo.orgmanax.dto.project.team.req.ListProjectTeamReq;
import cn.axzo.orgmanax.dto.project.team.req.ListProjectTeamReq.ListProjectTeamReqBuilder;
import cn.axzo.orgmanax.server.node.service.NodeService;
import cn.axzo.orgmanax.server.project.team.foundation.ProjectTeamCategoryFoundationService; import cn.axzo.orgmanax.server.project.team.foundation.ProjectTeamCategoryFoundationService;
import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService; import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService;
import cn.axzo.orgmanax.server.project.team.service.ProjectTeamService;
import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq; import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -17,11 +42,150 @@ import org.springframework.stereotype.Service;
@Service @Service
public class ProjectTeamCategoryServiceImpl implements ProjectTeamCategoryService { public class ProjectTeamCategoryServiceImpl implements ProjectTeamCategoryService {
private final static Long NO_PROJECT_TEAM_ID = 0L;
private final static String TOP_CATEGORY_PARENT_CODE = "0";
@Autowired @Autowired
private ProjectTeamCategoryFoundationService teamCategoryFoundationService; private ProjectTeamCategoryFoundationService teamCategoryFoundationService;
@Autowired
private ProjectTeamService projectTeamService;
@Autowired
private NodeService nodeService;
@Override @Override
public PageResp<TeamCategoryDTO> page(ListTeamCategoryReq req) { public PageResp<TeamCategoryDTO> page(ListTeamCategoryReq param) {
// todo 扩展 // todo 扩展
return teamCategoryFoundationService.page(req); resolveNodeIds(param);
return teamCategoryFoundationService.page(param);
}
@Override
public List<TeamCategoryAggregateDTO> treeList(ListTeamCategoryReq param) {
Map<Long, Long> nodeTeamMap = resolveNodeIds(param);
List<TeamCategoryDTO> categoryList = teamCategoryFoundationService.pageAll(param);
if (CollUtil.isEmpty(categoryList)) {
return Lists.newArrayList();
}
return getCategoryTreeList(categoryList, nodeTeamMap);
}
private List<TeamCategoryAggregateDTO> getCategoryTreeList(List<TeamCategoryDTO> teamCategories,
Map<Long, Long> paramNodeTeamMap) {
if (CollUtil.isEmpty(paramNodeTeamMap)) {
log.info("getCategoryTreeList re-query project team");
ListNodeReq nodeReq = ListNodeReq.builder()
.ids(teamCategories.stream().map(TeamCategoryDTO::getOrgNodeId).collect(Collectors.toSet()))
.includeOrgNodeTypes(Sets.newHashSet(NodeTypeEnum.PROJECT_TEAM.getCode()))
.build();
List<OrgNodeDTO> orgNodeList = nodeService.list(nodeReq);
paramNodeTeamMap = orgNodeList.stream().collect(
Collectors.toMap(OrgNodeDTO::getId, this::getProjectTeamId, (v1, v2) -> v1));
}
final Map<Long, Long> nodeTeamMap = paramNodeTeamMap;
// 构建tree
Map<String, List<TeamCategoryDTO>> categoryMap = teamCategories.stream()
.collect(Collectors.groupingBy(TeamCategoryDTO::getParentCode));
return teamCategories.stream()
.filter(category ->
Objects.equals(category.getType(), TeamCategoryTypeEnum.WORKER_GROUP_CATEGORY.getCode()))
.map(c -> {
TeamCategoryAggregateDTO dto = convert(c, nodeTeamMap, c);
List<TeamCategoryDTO> childrens = categoryMap.get(c.getCode());
if (ObjectUtils.isNotEmpty(childrens)) {
List<TeamCategoryAggregateDTO> categoryRes = childrens.stream()
.map(s -> convert(s, nodeTeamMap, c))
.collect(Collectors.toList());
dto.setWorkScopes(categoryRes);
}
return dto;
}
).collect(Collectors.toList());
}
private Long getProjectTeamId(OrgNodeDTO node) {
NodeProfile.ProjectTeamProfile projectTeamProfile = node.resolveProfile();
if (Objects.isNull(projectTeamProfile)) {
return NO_PROJECT_TEAM_ID;
}
return projectTeamProfile.getProjectTeamId();
}
public TeamCategoryAggregateDTO convert(TeamCategoryDTO category, Map<Long, Long> nodeTeamMap,
TeamCategoryDTO parentCategory) {
TeamCategoryAggregateDTO dto = BeanUtil.copyProperties(category, TeamCategoryAggregateDTO.class);
Long projectTeamId = nodeTeamMap.get(category.getOrgNodeId());
if (Objects.nonNull(projectTeamId) && !Objects.equals(projectTeamId, NO_PROJECT_TEAM_ID)) {
dto.setProjectTeamId(projectTeamId);
}
dto.setParentCategoryCode(category.getParentCode());
if (!Objects.equals(category.getParentCode(), TOP_CATEGORY_PARENT_CODE)) {
dto.setParentCategoryName(parentCategory.getName());
}
return dto;
}
private Map<Long, Long> resolveNodeIds(ListTeamCategoryReq param) {
boolean hasProjectTeam = CollUtil.isNotEmpty(param.getProjectTeamIds());
boolean hasPlatTeam = CollUtil.isNotEmpty(param.getPlatTeamIds());
if (!hasProjectTeam && !hasPlatTeam) {
return Maps.newHashMap();
}
Set<Long> projectTeamNodeIds = new HashSet<>();
Set<Long> platTeamNodeIds = new HashSet<>();
List<OrgProjectTeamDTO> projectTeams = new ArrayList<>();
if (hasProjectTeam) {
// todo 通过项目班组id获取组织节点id
projectTeams = queryTeams(param.getProjectTeamIds(), NodeTypeEnum.PROJECT_TEAM);
projectTeamNodeIds = projectTeams.stream()
.map(OrgProjectTeamDTO::getOrganizationalNodeId)
.collect(Collectors.toSet());
}
if (hasPlatTeam) {
// todo 通过平台班组id获取组织节点id
List<OrgProjectTeamDTO> platTeams = queryTeams(param.getPlatTeamIds(), NodeTypeEnum.TEAM);
projectTeams.addAll(platTeams);
platTeamNodeIds = platTeams.stream()
.map(OrgProjectTeamDTO::getOrganizationalNodeId)
.collect(Collectors.toSet());
}
Set<Long> teamNodeIds;
// 拼接
if (!hasProjectTeam) {
teamNodeIds = intersectionNodeId(platTeamNodeIds, param.getOrgNodeIds());
} else if (!hasPlatTeam) {
teamNodeIds = intersectionNodeId(projectTeamNodeIds, param.getOrgNodeIds());
} else {
teamNodeIds = intersectionNodeId(Sets.intersection(projectTeamNodeIds, platTeamNodeIds)
, param.getOrgNodeIds());
}
log.info("resolveNodeIds teamNodeIds = [{}]", JSONUtil.toJsonStr(teamNodeIds));
param.setOrgNodeIds(teamNodeIds);
return projectTeams.stream()
.filter(t -> Objects.nonNull(t.getOrganizationalNodeId()))
.collect(Collectors.toMap(OrgProjectTeamDTO::getOrganizationalNodeId, OrgProjectTeamDTO::getProjectTeamId
, (p, n) -> p));
}
private Set<Long> intersectionNodeId(Set<Long> teamNodeIds, Set<Long> orgNodeIds) {
if (CollUtil.isEmpty(orgNodeIds)) {
return teamNodeIds;
}
return Sets.intersection(teamNodeIds, orgNodeIds);
}
private List<OrgProjectTeamDTO> queryTeams(Set<Long> teamIds, NodeTypeEnum nodeType) {
ListProjectTeamReqBuilder<?, ?> teamBuilder = ListProjectTeamReq.builder();
return CollUtil.defaultIfEmpty(projectTeamService
.list(teamBuilder.projectTeamIds(teamIds)
.nodeTypes(Sets.newHashSet(nodeType.getCode()))
.build()), CollUtil.newArrayList());
} }
} }

View File

@ -43,6 +43,7 @@ public class ProjectTeamServiceImpl implements ProjectTeamService {
.ouIds(req.getOuIds()) .ouIds(req.getOuIds())
.platTeamIds(platTeamIds) .platTeamIds(platTeamIds)
.workspaceIds(req.getWorkspaceIds()) .workspaceIds(req.getWorkspaceIds())
.projectTeamIds(req.getProjectTeamIds())
.build(); .build();
List<OrgNodeDTO> orgNodeDTOS = nodeService.list(nodeReq); List<OrgNodeDTO> orgNodeDTOS = nodeService.list(nodeReq);
List<OrgProjectTeamDTO> orgProjectTeamDTOS = CollUtil.newArrayList(); List<OrgProjectTeamDTO> orgProjectTeamDTOS = CollUtil.newArrayList();