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())