diff --git a/orgmanax-dto/pom.xml b/orgmanax-dto/pom.xml
index d8061d8..655974c 100644
--- a/orgmanax-dto/pom.xml
+++ b/orgmanax-dto/pom.xml
@@ -46,7 +46,10 @@
cn.hutool
hutool-all
-
+
+ cn.axzo.foundation
+ event-support-lib
+
\ No newline at end of file
diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/event/CoopeateShipUpsertedPayload.java
similarity index 59%
rename from orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java
rename to orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/event/CoopeateShipUpsertedPayload.java
index ecf30bb..78962c7 100644
--- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java
+++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/event/CoopeateShipUpsertedPayload.java
@@ -1,7 +1,7 @@
-package cn.axzo.orgmanax.server.cooperateship.event.inner.payload;
+package cn.axzo.orgmanax.dto.cooperateship.event;
import cn.axzo.foundation.event.support.AbstractDiffablePayload;
-import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
+import cn.axzo.orgmanax.dto.cooperateship.dto.OrgCooperateShipDTO;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -12,8 +12,8 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@Data
@Builder
-public class CoopeateShipUpsertedPayload extends AbstractDiffablePayload {
- private SaasCooperateShip oldValue;
- private SaasCooperateShip newValue;
+public class CoopeateShipUpsertedPayload extends AbstractDiffablePayload {
+ private OrgCooperateShipDTO oldValue;
+ private OrgCooperateShipDTO newValue;
private JSONObject ext;
}
diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/CreateOrgCooperateShipReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/CreateOrgCooperateShipReq.java
index 3b934e6..7fbb2ea 100644
--- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/CreateOrgCooperateShipReq.java
+++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/cooperateship/req/CreateOrgCooperateShipReq.java
@@ -22,7 +22,7 @@ public class CreateOrgCooperateShipReq {
private Long organizationalNodeId;
/**
- * 上级节点
+ * 上级节点(非顶级节点时必填)
*/
private Long parentId;
diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java
index 85cc710..bf5908d 100644
--- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java
+++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/CooperateShipFoundationService.java
@@ -1,6 +1,7 @@
package cn.axzo.orgmanax.server.cooperateship.foundation;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip;
+import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator;
import java.util.Collection;
import java.util.List;
@@ -71,4 +72,8 @@ public interface CooperateShipFoundationService {
*/
Collection extract(Collection currentNodeList, Function function);
+ /**
+ * 创建协同关系
+ */
+ SaasCooperateShip create(CooperateShipCreator creator);
}
diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/dto/CooperateShipCreator.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/dto/CooperateShipCreator.java
new file mode 100644
index 0000000..5edc883
--- /dev/null
+++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/dto/CooperateShipCreator.java
@@ -0,0 +1,66 @@
+package cn.axzo.orgmanax.server.cooperateship.foundation.dto;
+
+import cn.axzo.apollo.workspace.api.v2.workspace.resp.WorkspaceDetailResp;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CooperateShipCreator {
+
+ /**
+ * 工作台ID
+ */
+ private Long workspaceId;
+
+ /**
+ * 工作台名称
+ */
+ private String workspaceName;
+
+ /**
+ * 工作台类型
+ */
+ private Integer workspaceType;
+
+ /**
+ * 组织节点ID
+ */
+ private Long organizationalNodeId;
+
+ /**
+ * 组织单位ID
+ */
+ private Long organizationalUnitId;
+
+ /**
+ * 组织单位名称
+ */
+ private String organizationalUnitName;
+
+ /**
+ * 父级协同节点ID
+ */
+ private Long parentId;
+
+ /**
+ * 协同类型
+ */
+ private Integer cooperateType;
+
+ /**
+ * 协作关系
+ */
+ private Integer partnerShip;
+
+ /**
+ * 操作人ID
+ */
+ private Long operatorId;
+
+
+}
diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java
index 0d2f712..1339d4b 100644
--- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java
+++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/foundation/impl/CooperateShipFoundationServiceImpl.java
@@ -1,25 +1,37 @@
package cn.axzo.orgmanax.server.cooperateship.foundation.impl;
-import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO;
-import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq;
+import cn.axzo.foundation.event.support.Event;
+import cn.axzo.foundation.event.support.producer.EventProducer;
+import cn.axzo.foundation.exception.Axssert;
+import cn.axzo.orgmanax.common.config.BizResultCode;
+import cn.axzo.orgmanax.dto.cooperateship.dto.OrgCooperateShipDTO;
+import cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipStatusEnum;
+import cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum;
+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.nodeuser.entity.OrganizationalNodeUser;
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository;
import cn.axzo.orgmanax.infra.dao.orgjob.entity.OrgJob;
import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository;
+import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType;
+import cn.axzo.orgmanax.dto.cooperateship.event.CoopeateShipUpsertedPayload;
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
-import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService;
-import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService;
+import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableSet;
import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@@ -28,6 +40,24 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati
private final NodeUserQueryRepository nodeUserQueryRepository;
private final OrgJobQueryRepository jobQueryRepository;
+ private final CooperateShipQueryRepository cooperateShipQueryRepository;
+ private final CooperateShipUpsertRepository cooperateShipUpsertRepository;
+ private final EventProducer eventProducer;
+ private final WorkspaceGateway workspaceGateway;
+
+ /**
+ * 顶级协同关系类型
+ */
+ private static final Set ALLOWED_TOP_COOPERATE_TYPES = ImmutableSet.of(
+ CooperateShipTypeEnum.PROJ_PRIMARY_CONTRACTING_UNIT.getCode(),
+ CooperateShipTypeEnum.PROJ_CONSTRUCTION_UNIT.getCode(),
+ CooperateShipTypeEnum.PROJ_SUPERVISION_UNIT.getCode(),
+ CooperateShipTypeEnum.OMS.getCode(),
+ CooperateShipTypeEnum.ENT_COMMON.getCode(),
+ CooperateShipTypeEnum.SURVEY_UNIT.getCode(),
+ CooperateShipTypeEnum.DESIGN_UNIT.getCode(),
+ CooperateShipTypeEnum.OTHER.getCode()
+ );
@Override
public void filterNodeIdsByPerson(Long filterPersonId, Collection cooperateShips, Boolean includeExitPerson, Collection excludeJobCodes) {
@@ -109,4 +139,58 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati
return currentNodeList.stream().map(function).collect(Collectors.toSet());
}
+ @Override
+ public SaasCooperateShip create(CooperateShipCreator creator) {
+
+ // 如果parentId不为空, 查询父级协同节点
+ SaasCooperateShip parentCooperateShip = null;
+ if (Objects.nonNull(creator.getParentId()) && creator.getParentId() > 0) {
+ parentCooperateShip = cooperateShipQueryRepository
+ .oneOpt(CooperateShipQueryRepository.OneReq.builder().id(creator.getParentId()).build())
+ .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("父级协同部门不存在{}", creator.getOrganizationalNodeId()));
+ Axssert.check(Objects.equals(parentCooperateShip.getWorkspaceId(), creator.getWorkspaceId()), BizResultCode.INVALID_PARAM, "父级协同部门和要加入部门不是同一个工作台");
+ }
+
+ // 创建协同关系
+ SaasCooperateShip cooperateShip = SaasCooperateShip.builder()
+ .parentId(creator.getParentId())
+ .workspaceId(creator.getWorkspaceId())
+ .workspaceType(creator.getWorkspaceType())
+ .workspaceName(creator.getWorkspaceName())
+ .status(CooperateShipStatusEnum.PRESENT.getCode())
+ .joinAt(new Date())
+ .organizationalUnitId(creator.getOrganizationalUnitId())
+ .organizationalUnitName(creator.getOrganizationalUnitName())
+ .cooperateType(creator.getCooperateType())
+ .organizationalNodeId(creator.getOrganizationalNodeId())
+ .partnerShip(creator.getPartnerShip())
+ .createBy(creator.getOperatorId())
+ .build();
+ SaasCooperateShip savedCooperateShip = cooperateShipUpsertRepository.create(cooperateShip);
+
+
+ // 更新协同关系路径
+ savedCooperateShip.calcPath(parentCooperateShip);
+ SaasCooperateShip saved = cooperateShipUpsertRepository.update(CooperateShipUpsertRepository.UpdateReq.builder()
+ .id(savedCooperateShip.getId())
+ .path(savedCooperateShip.getPath())
+ .build());
+
+ // 发送领域事件
+ eventProducer.send(Event.builder()
+ .eventCode(CooperateShipEventType.COOPERATE_SHIP_UPSERTED.getEventCode())
+ .operatorId(Convert.toStr(creator.getOperatorId()))
+ .operatorType(getClass().getSimpleName())
+ .targetType("cooperate_ship_id")
+ .targetId(cooperateShip.getId() + "")
+ .shardingKey(saved.getOrganizationalNodeId() + "")
+ .data(CoopeateShipUpsertedPayload.builder()
+ .newValue(BeanUtil.copyProperties(saved, OrgCooperateShipDTO.class))
+ .oldValue(null)
+ .build())
+ .build());
+ // 返回结果
+ return cooperateShipQueryRepository.one(CooperateShipQueryRepository.OneReq.builder().id(saved.getId()).build());
+ }
+
}
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 18814ab..f0e6dd4 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
@@ -19,8 +19,9 @@ import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
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.dto.cooperateship.event.CoopeateShipUpsertedPayload;
import cn.axzo.orgmanax.server.cooperateship.foundation.CooperateShipFoundationService;
+import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator;
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
@@ -63,69 +64,33 @@ public class CooperateShipServiceImpl implements CooperateShipService {
@Override
public SaasCooperateShip create(CreateOrgCooperateShipReq req) {
- // node check
+ // 获取组织节点
OrganizationalNode node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build())
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId()));
Axssert.check(node.isTopNode(), BizResultCode.INVALID_PARAM, "只有顶级节点才能添加协同关系");
- // workspace check
+ // 获取工作台信息
WorkspaceDetailResp workspace = workspaceGateway.getDetail(WorkspaceDetailReq.builder().id(req.getWorkspaceId()).build());
Axssert.checkNonNull(workspace, "工作台不存在{}", req.getWorkspaceId());
- // cooperate check
- SaasCooperateShip parentShip = null;
- if (!ALLOWED_TOP_COOPERATE_TYPES.contains(req.getCooperateType())) {
- Axssert.check(req.getParentId() > 0L, BizResultCode.INVALID_PARAM, "父级协同类型不能为空");
- parentShip = cooperateShipQueryRepository
- .oneOpt(CooperateShipQueryRepository.OneReq.builder().id(req.getParentId()).build())
- .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("父级协同部门不存在{}", req.getOrganizationalNodeId()));
- Axssert.check(Objects.equals(parentShip.getWorkspaceId(), req.getWorkspaceId()), BizResultCode.INVALID_PARAM, "父级协同部门和要加入部门不是同一个工作台");
- }
-
- // unit check
+ // 获取组织单位
UnitQueryRepository.UnitResp unit = unitQueryRepository.oneOpt(UnitQueryRepository.OneReq.builder()
.id(node.getId())
.build()).orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("单位不存在{}", node.getOrganizationalUnitId()));
- SaasCooperateShip cooperateShip = SaasCooperateShip.builder()
- .parentId(req.getParentId())
- .workspaceId(workspace.getId())
- .workspaceType(workspace.getWorkspaceType())
+
+ // 创建协同关系
+ return cooperateShipFoundationService.create(CooperateShipCreator.builder()
+ .workspaceId(req.getWorkspaceId())
.workspaceName(workspace.getName())
- .status(CooperateShipStatusEnum.PRESENT.getCode())
- .joinAt(new Date())
- .organizationalUnitId(node.getOrganizationalUnitId())
+ .workspaceType(workspace.getWorkspaceType())
+ .organizationalNodeId(req.getOrganizationalNodeId())
+ .organizationalUnitId(unit.getId())
.organizationalUnitName(unit.getName())
+ .parentId(req.getParentId())
.cooperateType(req.getCooperateType())
- .organizationalNodeId(node.getId())
.partnerShip(req.getPartnerShip())
- .createBy(req.getOperatorId())
- .build();
-
- SaasCooperateShip savedCooperateShip = cooperateShipUpsertRepository.create(cooperateShip);
-
- // update path
- savedCooperateShip.calcPath(parentShip);
- SaasCooperateShip saved = cooperateShipUpsertRepository.update(CooperateShipUpsertRepository.UpdateReq.builder()
- .id(savedCooperateShip.getId())
- .path(savedCooperateShip.getPath())
+ .operatorId(req.getOperatorId())
.build());
-
- // 发送数据变更基础MQ
- eventProducer.send(Event.builder()
- .eventCode(CooperateShipEventType.COOPERATE_SHIP_UPSERTED.getEventCode())
- .operatorId(req.getOperatorId() + "")
- .operatorType(getClass().getSimpleName())
- .targetType("cooperate_ship_id")
- .targetId(cooperateShip.getId() + "")
- .shardingKey(saved.getOrganizationalNodeId() + "")
- .data(CoopeateShipUpsertedPayload.builder()
- .newValue(saved)
- .oldValue(null)
- .build())
- .build());
-
- // 返回结果
- return cooperateShipQueryRepository.one(CooperateShipQueryRepository.OneReq.builder().id(saved.getId()).build());
}
@Override
@@ -182,7 +147,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// 是否查询父级节点
if (BooleanUtil.isTrue(req.getIncludeAncestors())) {
- Collection ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
+ Collection ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
List ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).statuses(req.getStatuses()).build());
resultNodeList.addAll(ancestorShipNodes);
}
@@ -202,7 +167,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// 是否查询子孙节点
if (BooleanUtil.isTrue(req.getIncludeChildren())) {
- Collection ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId);
+ Collection ids = CollUtil.map(currentNodeList, SaasCooperateShip::getId, true);
List childrenShipNodes = cooperateShipQueryRepository.list(
CooperateShipQueryRepository.ListReq.builder()
.statuses(req.getStatuses())