Merge remote-tracking branch 'refs/remotes/origin/feature/REQ-3282' into feature/REQ-3282-zhh

This commit is contained in:
zhanghonghao 2024-12-19 11:44:30 +08:00
commit b884d1c05e
30 changed files with 419 additions and 172 deletions

3
.gitignore vendored
View File

@ -33,4 +33,5 @@ build/
.vscode/
### Mac OS ###
.DS_Store
.DS_Store
**/.flattened-pom.xml

View File

@ -24,17 +24,17 @@
-
## 接口规范
- 所有接口统一采用POST列表接口需要带上分页且设置默认大小1000条
- 所有接口统一采用POST列表接口需要设置默认大小1000条
- 接口出入参,必须使用可扩展的对象类型。不能直接是 StringInteger或者List这些无法扩展的类型。
- 为每个接口定义自己的出入参,不要复用出入参
- 接口URL使用 【-】符号进行分割,比如: /orgmanax/node/create-team
- 接口定义规范: 使用```/api/org/${domain}/${affiliateDomain}/${action}``` 形式进行定义。如:
- 接口定义规范: 使用```/api/${domain}/${affiliateDomain}/${action}``` 形式进行定义。如:
```
/api/org/unit/create
/api/org/unit/update
/api/org/node-user/list
/api/org/org-user/page
/api/org/org-user/page
/api/unit/create
/api/unit/update
/api/node-user/list
/api/org-user/page
/api/org-user/page
```
* domain 为主要操作/查询的对象。包含以下值
```
@ -60,14 +60,14 @@
## 模块描述
模块名称 | 功能 | 依赖
------ |---------------------------------------------------------------------------------------------------------------------------------------| ----
`orgmanax-api` | API层提供给org-gateway的接口 |无
`orgmanax-common`| 公共组件、UTIL等 |无
`orgmanax-infra` | 基础设施层,隔离非业务变化,防止外部变化引起内部业务变更。<br/>对接外部依赖数据库MQ等中件间 | `orgmanax-common`
`orgmanax-integration`| 封装了非基础业务的API防止外部API无用依赖影响内部。如apollo-api、gaia-api等 | `orgmanax-infra`
`orgmanax-server`| 业务层,核心分为两层:<br/>1、基础层:`foundation` 单域核心逻辑如:创建部门,创建单位 <br/>2、业务层`service` 如:创建班组、创建小组 <br/>`service` 依赖本域 `foundation`或他域service完成业务 | `orgmanax-api` `orgmanax-common` `orgmanax-infra`
`orgmanax-starter`| 启动类 | `orgmanax-api` `orgmanax-common` `orgmanax-infra` `orgmanax-server` `orgmanax-integration`
模块名称 | 功能 | 依赖
------ |--------------------------------------------------------------------------------------------------------------------------------------------| ----
`orgmanax-api` | API层提供给org-gateway的接口 |无
`orgmanax-common`| 公共组件、UTIL等 |无
`orgmanax-infra` | 基础设施层,隔离非业务变化,防止外部变化引起内部业务变更。<br/>对接二方服务数据库MQ等中件间 | `orgmanax-common`
`orgmanax-integration`| 封装了二方服务非纯净版本。如apollo-api、gaia-api等。等两方服务统一规范后该层就会移除。 | `orgmanax-infra`
`orgmanax-server`| 核心能力层,分为两块:<br/>1、通用能力:`foundation` 单域核心逻辑如:创建部门,创建单位 <br/>2、人岗架业务能力`service` 如:创建班组、创建小组 <br/>`service` 依赖本域 `foundation`或他域service完成业务 | `orgmanax-api` `orgmanax-common` `orgmanax-infra`
`orgmanax-starter`| 启动类 | `orgmanax-api` `orgmanax-common` `orgmanax-infra` `orgmanax-server` `orgmanax-integration`
## 各模块参数约束
@ -79,7 +79,6 @@
- XXXUpdate更新入参
- DO数据库实体DO使用充血模型包括属性和行为定义行为的范围只能是本对象内部属性发生变更的行为
## 目录层级
```
.
@ -137,7 +136,7 @@
│   │   │   │   ├── mapper
│   │   │   │   └── repository
│   │   │   │   └── impl
├── orgmanax-integration #封装非基础域API该层会引用其它域的feign
├── orgmanax-integration #封装二方非纯净API
│   └── src
│   └── main
│   └── java
@ -153,7 +152,7 @@
│   ├── elise
│   ├── gaia
│   └── profile
├── orgmanax-server#业务服务
├── orgmanax-server#核心能力
│   └── src
│   ├── main
│   │   └── java
@ -166,14 +165,14 @@
│   │   │   ├── event#协同关系事件
│   │   │   │   └── inner
│   │   │   │   └── payload
│   │   │   └── service# 协同关系业务
│   │   │   └── service# 协同关系相关业务
│   │   │   └── impl
│   │   ├── node#部门相关
│   │   │   ├── controller
│   │   │   ├── event#部门事件
│   │   │   │   └── inner
│   │   │   │   └── payload
│   │   │   ├── foundation#部门基础功能(如创建部门、更新部门)
│   │   │   ├── foundation#部门基础能力层
│   │   │   │   ├── impl
│   │   │   │   └── req
│   │   │   └── service# 部门业务(创建班组、解散班组、更换班组长、创建小组)

View File

@ -0,0 +1 @@
-- 待补充

View File

@ -27,7 +27,7 @@ public interface OrgCooperateShipApi {
* @param req
* @return
*/
@PostMapping("/api/org/cooperate-ship/list")
@PostMapping("/api/cooperate-ship/list")
ApiResult<List<OrgCooperateShipDTO>> list(@RequestBody @Validated ListOrgCooperateShipReq req);
}

View File

@ -7,6 +7,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.Set;
@NoArgsConstructor
@ -14,67 +15,111 @@ import java.util.Set;
@Data
@Builder
public class ListOrgCooperateShipReq {
@CriteriaField
private Long id;
/**
* 协同关系集合
*/
@CriteriaField(field = "id", operator = Operator.IN)
private Set<Long> ids;
@CriteriaField
private Long parentId;
@CriteriaField(field = "parentId", operator = Operator.IN)
private Set<Long> parentIds;
@Builder.Default
private Set<Long> ids = Collections.emptySet();
/**
* 用于遍历数据
* 工作台id
*/
@CriteriaField(field = "id", operator = Operator.GT)
private Long idGt;
/**
* 工作台ID
*/
@CriteriaField
private Long workspaceId;
@CriteriaField(field = "workspaceId", operator = Operator.IN)
private Long workspaceIds;
@CriteriaField
private Integer workspaceType;
@CriteriaField(field = "workspaceType", operator = Operator.IN)
private Set<Integer> workspaceTypes;
@CriteriaField
private Integer status;
@CriteriaField(field = "status", operator = Operator.IN)
private Set<Integer> statuses;
@CriteriaField
private Integer cooperateType;
@CriteriaField(field = "cooperateType", operator = Operator.IN)
private Set<Integer> cooperateTypes;
@CriteriaField
private Integer partnerShip;
@CriteriaField(field = "partnerShip", operator = Operator.IN)
private Set<Integer> partnerShips;
@Builder.Default
private Set<Long> workspaceIds = Collections.emptySet();
/**
* 组织节点id
* 工作台类型
*/
@CriteriaField
private Long organizationalNodeId;
@CriteriaField(field = "organizationalNodeId", operator = Operator.IN)
private Set<Long> organizationalNodeIds;
@CriteriaField(field = "workspaceType", operator = Operator.IN)
@Builder.Default
private Set<Integer> workspaceType = Collections.emptySet();
@CriteriaField
private Long organizationalUnitId;
/**
* 单位id集合(如果是班组则插入队伍id)
*/
@CriteriaField(field = "organizationalUnitId", operator = Operator.IN)
private Long organizationalUnitIds;
@Builder.Default
private Set<Long> ouIds = Collections.emptySet();
@CriteriaField(ignore = true)
private Long personId;
/**
* 指定的协同关系类型
*/
@CriteriaField(field = "cooperateType", operator = Operator.IN)
@Builder.Default
private Set<Integer> includeCooperateTypes = Collections.emptySet();
/**
* 待排除的协同关系类型
*/
@CriteriaField(field = "cooperateType", operator = Operator.NOT_IN)
@Builder.Default
private Set<Integer> excludeCooperateTypes = Collections.emptySet();
@CriteriaField(ignore = true)
private Boolean needParent;
/**
* 节点id
*/
@CriteriaField(field = "organizationalNodeId", operator = Operator.IN)
@Builder.Default
private Set<Long> organizationNodeIds = Collections.emptySet();
/**
* 合作关系 1.合作 2.直属
*/
@CriteriaField(field = "partnerShip", operator = Operator.IN)
@Builder.Default
private Set<Integer> partnerShips = Collections.emptySet();
/**
* 在场状态集合
*/
@CriteriaField(field = "status", operator = Operator.IN)
@Builder.Default
private Set<Integer> statuses = Collections.emptySet();
/**
* 需要过滤的personId
* personId
*/
private Long filterPersonId;
/**
* 当personId有值时为必填项
* 1只过滤当前节点数据 2过滤当前节点及以下数据
*/
private Integer filterPersonType;
/**
* 是否过滤工人
*/
@Builder.Default
private Boolean isFilterWorker = false;
/**
* 人员过滤是否包含已退场
*/
@Builder.Default
private Boolean includeExitPerson = false;
/**
* 是否查询祖先节点
*/
@Builder.Default
private Boolean isSelectAncestors = false;
/**
* 是否查询子孙节点
*/
@Builder.Default
private Boolean isSelectDescendant = false;
/**
* 条件当需要查询上下级数据时启用
* 是否只查一级
*/
@Builder.Default
private Boolean isSelectLevelOne = false;
}

View File

@ -90,28 +90,4 @@ public class OrgCooperateShipDTO implements Serializable {
*/
private JSONObject ext;
/**
* 创建时间
*/
private Date createAt;
/**
* 修改时间
*/
private Date updateAt;
/**
* 创建人
*/
private Long createBy;
/**
* 修改人
*/
private Long updateBy;
/**
* 是否删除
*/
private Long isDelete = 0L;
}

View File

@ -28,7 +28,7 @@ public interface OrgNodeApi {
* @param req
* @return
*/
@PostMapping("/api/org/node/process")
@PostMapping("/api/node/process")
ApiResult<JSONObject> process(@RequestBody @Validated ProcessNodeReq req);
/**
@ -39,7 +39,7 @@ public interface OrgNodeApi {
* @return
* @see ListNodeReq#getPageSize()
*/
@PostMapping("/api/org/node/list")
@PostMapping("/api/node/list")
ApiResult<PageResp<OrgNodeDTO>> list(@RequestBody @Validated ListNodeReq req);
}

View File

@ -16,36 +16,109 @@ import java.util.Set;
@Data
@Builder
public class ListNodeReq implements IPageReq {
@CriteriaField
private Long id;
@CriteriaField(field = "id", operator = Operator.IN)
/**
* 页数
*/
private Integer page;
/**
* 条数
*/
private Integer pageSize;
/**
* ids
*/
private Set<Long> ids;
@CriteriaField
private Long parentId;
@CriteriaField(field = "parentId", operator = Operator.IN)
private Set<Long> parentIds;
/**
* 用于遍历数据
*/
@CriteriaField(field = "id", operator = Operator.GT)
private Long idGt;
@CriteriaField
private Long organizationalUnitId;
@CriteriaField(field = "organizationalUnitId", operator = Operator.IN)
private Long organizationalUnitIds;
@CriteriaField(ignore = true)
private Boolean needParent;
@CriteriaField(ignore = true)
@Builder.Default
Integer page = 1;
/**
* 最大支持1000条数据不支持单页超过1000的查询接入方按需分页
* 组织单位ids
*/
@Builder.Default
@CriteriaField(ignore = true)
Integer pageSize = 1000;
@CriteriaField(ignore = true)
List<String> sort;
private Set<Long> ouIds;
/**
* 节点名称集合
*/
private Set<String> nodeNames;
/**
* 节点名称查询模糊
*/
private Set<String> nodeName;
/**
* 指定部门类型
*/
private Set<Integer> includeOrgNodeTypes;
/**
* 排除部门类型
*/
private Set<Integer> excludeOrgNodeTypes;
/**
* 顶级节点ID集合
*/
private Set<Long> topNodeIds;
/**
* 是否查询祖先节点
*/
private Boolean isSelectAncestors;
/**
* 是否查询子孙节点
*/
private Boolean isSelectDescendant;
/**
* 是否查询节点用户
*/
private Boolean isSelectNodeUser;
/**
* 是否查询删除的
*/
private Boolean isSelectDelete;
/**
* 数据权限缓存数据key
*/
private String dataPermissionCacheKey;
/**
* 只返回topNode
*/
private Boolean isSelectTopNodeOnly;
/**
* 根据workspace和ouId组合查询
*/
private Set<WorkspaceOuPair> workspaceOuPairs;
/**
* 需要返回管理员信息
*/
private Boolean needAdmin;
/**
* 岗位编码
*/
private Set<String> jobCodes;
/**
* 当前用户personId
*/
private Long personId;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public static class WorkspaceOuPair {
private Long workspaceId;
private Long ouId;
}
}

View File

@ -28,7 +28,7 @@ public interface OrgNodeUserApi {
* @param req
* @return
*/
@PostMapping("/api/org/node-user/process")
@PostMapping("/api/node-user/process")
ApiResult<JSONObject> process(@RequestBody @Validated ProcessNodeUserReq req);
/**
@ -39,7 +39,7 @@ public interface OrgNodeUserApi {
* @return
* @see ListNodeUserReq#getPageSize()
*/
@PostMapping("/api/org/node-user/list")
@PostMapping("/api/node-user/list")
ApiResult<PageResp<OrgNodeUserDTO>> list(@RequestBody @Validated ListNodeUserReq req);
}

View File

@ -19,15 +19,15 @@ import java.util.List;
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
public interface OrgJobApi {
@PostMapping("/api/org/job/create")
@PostMapping("/api/job/create")
ApiResult<OrgJobDTO> create(@RequestBody @Validated CreateOrgJobReq req);
@PostMapping("/api/org/job/update")
@PostMapping("/api/job/update")
ApiResult<OrgJobDTO> update(@RequestBody @Validated UpdateOrgJobReq req);
@PostMapping("/api/org/job/delete")
@PostMapping("/api/job/delete")
ApiResult<Void> delete(@RequestBody @Validated DeleteOrgJobReq req);
@PostMapping("/api/org/job/list")
@PostMapping("/api/job/list")
ApiResult<PageResp<OrgJobDTO>> list(@RequestBody @Validated ListOrgJobReq req);
}

View File

@ -33,7 +33,7 @@ public interface OrgUserApi {
* @return
* @see ListOrgUserReq#getPageSize()
*/
@PostMapping("/api/org/org-user/list")
@PostMapping("/api/org-user/list")
ApiResult<PageResp<OrgUserDTO>> list(@RequestBody @Validated ListOrgUserReq req);
}

View File

@ -29,7 +29,7 @@ public interface OrgUnitApi {
* @param req
* @return
*/
@PostMapping("/api/org/unit/create")
@PostMapping("/api/unit/create")
ApiResult<CreateUnitResp> create(@RequestBody @Validated CreateUnitReq req);
/**
@ -37,7 +37,7 @@ public interface OrgUnitApi {
* @param req
* @return
*/
@PostMapping("/api/org/unit/update")
@PostMapping("/api/unit/update")
ApiResult<UpdateUnitResp> update(@RequestBody @Validated UpdateUnitReq req);
/**
@ -48,7 +48,7 @@ public interface OrgUnitApi {
* @return
* @see ListUnitReq#getPageSize()
*/
@PostMapping("/api/org/unit/list")
@PostMapping("/api/unit/list")
ApiResult<PageResp<OrgUnitDTO>> list(@RequestBody @Validated ListUnitReq req);
}

View File

@ -20,7 +20,7 @@ public interface OrgUnitContactApi {
/**
* 通过单位id获取单位联系人列表
*/
@PostMapping("/api/org/unit/contact/list")
@PostMapping("/api/unit/contact/list")
ApiResult<List<OrgUnitContactResp>> list(List<Long> ouIds);

View File

@ -1,5 +1,5 @@
# 查询协同关系
POST {{host}}/api/org/cooperate-ship/list
POST {{host}}/api/cooperate-ship/list
Content-Type: application/json
Accept: application/json

View File

@ -1,5 +1,5 @@
# 处理部门相关的逻辑
POST {{host}}/api/org/node/process
POST {{host}}/api/node/process
Content-Type: application/json
Accept: application/json
@ -18,7 +18,7 @@ Accept: application/json
###
# 处理部门相关的逻辑
POST {{host}}/api/org/node/list
POST {{host}}/api/node/list
Content-Type: application/json
Accept: application/json

View File

@ -1,5 +1,5 @@
# 分页列表接口
POST {{host}}/api/org/node-user/list
POST {{host}}/api/node-user/list
Content-Type: application/json
Accept: application/json

View File

@ -1,5 +1,5 @@
#创建
POST {{host}}/api/org/job/create
POST {{host}}/api/job/create
Content-Type: application/json
Accept: application/json
@ -12,7 +12,7 @@ Accept: application/json
###
#修改
POST {{host}}/api/org/job/update
POST {{host}}/api/job/update
Content-Type: application/json
Accept: application/json
@ -24,7 +24,7 @@ Accept: application/json
###
#删除
POST {{host}}/api/org/job/delete
POST {{host}}/api/job/delete
Content-Type: application/json
Accept: application/json
@ -35,7 +35,7 @@ Accept: application/json
###
# 查询
POST {{host}}/api/org/job/list
POST {{host}}/api/job/list
Content-Type: application/json
Accept: application/json

View File

@ -1,5 +1,5 @@
# 查询
POST {{host}}/api/org/org-user/list
POST {{host}}/api/org-user/list
Content-Type: application/json
Accept: application/json

View File

@ -1,5 +1,5 @@
# 创建单位
POST {{host}}/api/org/unit/create
POST {{host}}/api/unit/create
Content-Type: application/json
Accept: application/json
@ -11,7 +11,7 @@ Accept: application/json
###
#分页列表接口
POST {{host}}/api/org/unit/list
POST {{host}}/api/unit/list
Content-Type: application/json
Accept: application/json

View File

@ -0,0 +1 @@
-- 待补充

View File

@ -0,0 +1 @@
-- 待补充

View File

@ -18,8 +18,8 @@ import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
* (SaasCooperateShip)表实体类
@ -37,6 +37,9 @@ import java.util.Objects;
@EqualsAndHashCode(callSuper = false)
public class SaasCooperateShip implements Serializable {
public static final String PATH_SPLITER = ",";
/**
* 主健
*/
@ -164,5 +167,37 @@ public class SaasCooperateShip implements Serializable {
private final String desc;
}
/**
* 是否为根节点
* @param path
* @return
*/
public boolean isRootNode(String path) {
return !path.contains(PATH_SPLITER);
}
/**
* 从path中提取祖先的节点id
* @return
*/
public List<Long> parseAncestorIdsFromPath() {
if (isRootNode(path)) {
// 根节点没有父节点
return Collections.emptyList();
}
List<Long> parentIds = parsePath(path);
// 移除路径的最后一个结点
return parentIds.subList(0, parentIds.size() - 1);
}
/**
* 解析path
* @param path
* @return
*/
public List<Long> parsePath(String path) {
return Arrays.stream(path.split(PATH_SPLITER)).map(e -> Long.valueOf(e.trim())).collect(Collectors.toList());
}
}

View File

@ -15,13 +15,13 @@ import java.util.Optional;
public interface CooperateShipQueryRepository {
List<CooperateShipResp> list(ListOrgCooperateShipReq req);
List<SaasCooperateShip> list(ListOrgCooperateShipReq req);
default CooperateShipResp one(OneReq req) {
default SaasCooperateShip one(OneReq req) {
return oneOpt(req).orElse(null);
}
default Optional<CooperateShipResp> oneOpt(OneReq req) {
default Optional<SaasCooperateShip> oneOpt(OneReq req) {
req.check();
ListOrgCooperateShipReq listReq = BeanUtil.toBean(req, ListOrgCooperateShipReq.class);
return list(listReq).stream().findFirst();
@ -45,7 +45,7 @@ public interface CooperateShipQueryRepository {
@AllArgsConstructor
@Data
@SuperBuilder
class CooperateShipResp extends SaasCooperateShip {
class CooperateShip extends SaasCooperateShip {
// 按需扩展字段占个位避免报错
private String todo;
}

View File

@ -27,29 +27,29 @@ public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepos
private final NodeUserQueryRepository nodeUserQueryRepository;
@Override
public List<CooperateShipResp> list(ListOrgCooperateShipReq req) {
public List<SaasCooperateShip> list(ListOrgCooperateShipReq req) {
QueryWrapper<SaasCooperateShip> wrapper = QueryWrapperHelper.fromBean(req, SaasCooperateShip.class);
if (wrapper.isEmptyOfWhere()) {
//
log.warn("CooperateShipResp empty of where query. return empty list. req = {}", req);
return Collections.emptyList();
}
List<CooperateShipResp> results = cooperateShipDao.list(wrapper)
.stream().map(e -> BeanUtil.toBean(e, CooperateShipResp.class)).collect(Collectors.toList());
List<SaasCooperateShip> results = cooperateShipDao.list(wrapper)
.stream().map(e -> BeanUtil.toBean(e, SaasCooperateShip.class)).collect(Collectors.toList());
results = filterByPersonIds(results, req);
return results;
}
private List<CooperateShipResp> filterByPersonIds(List<CooperateShipResp> results, ListOrgCooperateShipReq req) {
if (req.getPersonId() == null) {
private List<SaasCooperateShip> filterByPersonIds(List<SaasCooperateShip> results, ListOrgCooperateShipReq req) {
if (req.getFilterPersonId() == null) {
// filter by personIds
return results;
}
Set<Long> organizationalNodeIds = results.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet());
Set<Long> personInNodeIds = nodeUserQueryRepository.list(ListNodeUserReq.builder()
.personId(req.getPersonId())
.personId(req.getFilterPersonId())
.organizationalNodeIds(organizationalNodeIds)
.build())
.stream().map(NodeUserQueryRepository.NodeUserResp::getTopNodeId).collect(Collectors.toSet());

View File

@ -0,0 +1,23 @@
package cn.axzo.orgmanax.server.cooperateship.foundation;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
import java.util.List;
import java.util.Set;
public interface CooperateShipFoundationService {
/**
* 通过person进行过滤
* @param filterPersonId
* @param list
*/
void filterByPerson(Long filterPersonId, List<SaasCooperateShip> list);
/**
* 提取祖级的数据
* @param list
* @return
*/
Set<Long> extractAncestorIds(List<SaasCooperateShip> list);
}

View File

@ -0,0 +1,44 @@
package cn.axzo.orgmanax.server.cooperateship.foundation.impl;
import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository;
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@RequiredArgsConstructor
@Service
public class CooperateShipFoundationServiceImpl implements CooperateShipFoundationService {
private final NodeUserQueryRepository nodeUserQueryRepository;
@Override
public void filterByPerson(Long filterPersonId, List<SaasCooperateShip> list) {
if (filterPersonId == null) {
return;
}
Set<Long> organizationalNodeIds = list.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet());
Set<Long> personInNodeIds = nodeUserQueryRepository.list(ListNodeUserReq.builder()
.personId(filterPersonId)
.organizationalNodeIds(organizationalNodeIds)
.build())
.stream().map(NodeUserQueryRepository.NodeUserResp::getTopNodeId).collect(Collectors.toSet());
list.removeIf(t -> !personInNodeIds.contains(t.getOrganizationalNodeId()));
}
@Override
public Set<Long> extractAncestorIds(List<SaasCooperateShip> list) {
return list.stream()
.flatMap(e -> e.parseAncestorIdsFromPath().stream())
.collect(Collectors.toSet());
}
}

View File

@ -3,6 +3,7 @@ package cn.axzo.orgmanax.server.cooperateship.service;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq;
import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -13,7 +14,7 @@ import java.util.List;
public interface CooperateShipService {
CooperateShipQueryRepository.CooperateShipResp create(CreateReq req);
SaasCooperateShip create(CreateReq req);
List<OrgCooperateShipDTO> list(ListOrgCooperateShipReq req);

View File

@ -9,26 +9,29 @@ import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq;
import cn.axzo.orgmanax.api.cooperateship.resp.CooperateShipStatusEnum;
import cn.axzo.orgmanax.api.cooperateship.resp.CooperateShipTypeEnum;
import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO;
import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.infra.client.workspace.WorkspaceGateway;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository;
import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository;
import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository;
import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType;
import cn.axzo.orgmanax.server.cooperateship.event.inner.payload.CoopeateShipUpsertedPayload;
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.ImmutableSet;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -53,9 +56,11 @@ public class CooperateShipServiceImpl implements CooperateShipService {
private final UnitQueryRepository unitQueryRepository;
private final WorkspaceGateway workspaceGateway;
private final EventProducer eventProducer;
private final CooperateShipFoundationService cooperateShipFoundationService;
private final NodeUserQueryRepository nodeUserQueryRepository;
@Override
public CooperateShipQueryRepository.CooperateShipResp create(CreateReq req) {
public SaasCooperateShip create(CreateReq req) {
// node check
NodeQueryRepository.NodeResp node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build())
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId()));
@ -63,7 +68,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// workspace check
WorkspaceDetailResp workspace = workspaceGateway.getDetail(WorkspaceDetailReq.builder().id(req.getWorkspaceId()).build());
Axssert.checkNonNull(workspace, "工作台不存在{}", req.getWorkspaceId());
CooperateShipQueryRepository.CooperateShipResp parentShip = null;
SaasCooperateShip parentShip = null;
if (!ALLOWED_TOP_COOPERATE_TYPES.contains(req.getCooperateType())) {
Axssert.check(req.getParentId() > 0L, BizResultCode.INVALID_PARAM, "父级协同类型不能为空");
parentShip = cooperateShipQueryRepository
@ -119,9 +124,26 @@ public class CooperateShipServiceImpl implements CooperateShipService {
@Override
public List<OrgCooperateShipDTO> list(ListOrgCooperateShipReq req) {
List<OrgCooperateShipDTO> results = cooperateShipQueryRepository.list(req).stream()
.map(e -> BeanUtil.toBean(e, OrgCooperateShipDTO.class)).collect(Collectors.toList());
// assemble other data
return results;
boolean isFilterCurrentNodeByPerson = ObjectUtil.isNotNull(req.getFilterPersonId()) && Objects.equals(req.getFilterPersonType(), 1);
// 根据入参查询数据
List<SaasCooperateShip> list = cooperateShipQueryRepository.list(req);
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 是否根据person过滤当前节点
if (isFilterCurrentNodeByPerson) {
cooperateShipFoundationService.filterByPerson(req.getFilterPersonId(), list);
}
// 是否查询祖先
if (BooleanUtil.isTrue(req.getIsSelectAncestors())) {
Set<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(list);
List<SaasCooperateShip> ancestorShipNodes = cooperateShipQueryRepository.list(ListOrgCooperateShipReq.builder().ids(ancestorIds).build());
list.addAll(ancestorShipNodes);
}
return BeanUtil.copyToList(list, OrgCooperateShipDTO.class);
}
}

View File

@ -7,6 +7,7 @@ import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.infra.client.profile.PersonProfileGateway;
import cn.axzo.orgmanax.infra.client.profile.dto.ProfileIdentityResp;
import cn.axzo.orgmanax.infra.client.profile.dto.ProfilePersonResp;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository;
import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
@ -134,7 +135,7 @@ public class NodeUserFoundationServiceImpl implements NodeUserFoundationService
}
return cooperateShipQueryRepository.oneOpt(CooperateShipQueryRepository.OneReq.builder()
.organizationalNodeId(node.getOrganizationalUnitId())
.build()).map(CooperateShipQueryRepository.CooperateShipResp::getWorkspaceId)
.build()).map(SaasCooperateShip::getWorkspaceId)
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门人员所属项目未找到,请稍后重试"));
}

View File

@ -29,4 +29,28 @@
</dependency>
</dependencies>
<build>
<finalName>orgmanax</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
<mainClass>cn.axzo.orgmanax.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>