feat:[REQ-3488] cooperateShip 创建方法,将通用创建能力下沉到foundation层中

This commit is contained in:
liuyang 2025-01-14 18:36:03 +08:00
parent fe1d733c66
commit 6e23456512
7 changed files with 186 additions and 63 deletions

View File

@ -46,7 +46,10 @@
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>event-support-lib</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -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.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 com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@ -12,8 +12,8 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@Builder @Builder
public class CoopeateShipUpsertedPayload extends AbstractDiffablePayload<SaasCooperateShip> { public class CoopeateShipUpsertedPayload extends AbstractDiffablePayload<OrgCooperateShipDTO> {
private SaasCooperateShip oldValue; private OrgCooperateShipDTO oldValue;
private SaasCooperateShip newValue; private OrgCooperateShipDTO newValue;
private JSONObject ext; private JSONObject ext;
} }

View File

@ -22,7 +22,7 @@ public class CreateOrgCooperateShipReq {
private Long organizationalNodeId; private Long organizationalNodeId;
/** /**
* 上级节点 * 上级节点非顶级节点时必填
*/ */
private Long parentId; private Long parentId;

View File

@ -1,6 +1,7 @@
package cn.axzo.orgmanax.server.cooperateship.foundation; package cn.axzo.orgmanax.server.cooperateship.foundation;
import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; 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.Collection;
import java.util.List; import java.util.List;
@ -71,4 +72,8 @@ public interface CooperateShipFoundationService {
*/ */
<T> Collection<T> extract(Collection<SaasCooperateShip> currentNodeList, Function<SaasCooperateShip, T> function); <T> Collection<T> extract(Collection<SaasCooperateShip> currentNodeList, Function<SaasCooperateShip, T> function);
/**
* 创建协同关系
*/
SaasCooperateShip create(CooperateShipCreator creator);
} }

View File

@ -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;
}

View File

@ -1,25 +1,37 @@
package cn.axzo.orgmanax.server.cooperateship.foundation.impl; package cn.axzo.orgmanax.server.cooperateship.foundation.impl;
import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; import cn.axzo.foundation.event.support.Event;
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; 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.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.entity.OrganizationalNodeUser;
import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; 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.entity.OrgJob;
import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository; 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.cooperateship.foundation.CooperateShipFoundationService;
import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator;
import cn.axzo.orgmanax.server.orgjob.foundation.OrgJobFoundationService;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollUtil; 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 cn.hutool.core.util.StrUtil;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.ImmutableSet;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@RequiredArgsConstructor @RequiredArgsConstructor
@ -28,6 +40,24 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati
private final NodeUserQueryRepository nodeUserQueryRepository; private final NodeUserQueryRepository nodeUserQueryRepository;
private final OrgJobQueryRepository jobQueryRepository; private final OrgJobQueryRepository jobQueryRepository;
private final CooperateShipQueryRepository cooperateShipQueryRepository;
private final CooperateShipUpsertRepository cooperateShipUpsertRepository;
private final EventProducer eventProducer;
private final WorkspaceGateway workspaceGateway;
/**
* 顶级协同关系类型
*/
private static final Set<Integer> 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 @Override
public void filterNodeIdsByPerson(Long filterPersonId, Collection<SaasCooperateShip> cooperateShips, Boolean includeExitPerson, Collection<String> excludeJobCodes) { public void filterNodeIdsByPerson(Long filterPersonId, Collection<SaasCooperateShip> cooperateShips, Boolean includeExitPerson, Collection<String> excludeJobCodes) {
@ -109,4 +139,58 @@ public class CooperateShipFoundationServiceImpl implements CooperateShipFoundati
return currentNodeList.stream().map(function).collect(Collectors.toSet()); 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());
}
} }

View File

@ -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.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository; 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.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.CooperateShipFoundationService;
import cn.axzo.orgmanax.server.cooperateship.foundation.dto.CooperateShipCreator;
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
@ -63,69 +64,33 @@ public class CooperateShipServiceImpl implements CooperateShipService {
@Override @Override
public SaasCooperateShip create(CreateOrgCooperateShipReq req) { public SaasCooperateShip create(CreateOrgCooperateShipReq req) {
// node check // 获取组织节点
OrganizationalNode node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build()) OrganizationalNode node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build())
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId())); .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId()));
Axssert.check(node.isTopNode(), BizResultCode.INVALID_PARAM, "只有顶级节点才能添加协同关系"); Axssert.check(node.isTopNode(), BizResultCode.INVALID_PARAM, "只有顶级节点才能添加协同关系");
// workspace check // 获取工作台信息
WorkspaceDetailResp workspace = workspaceGateway.getDetail(WorkspaceDetailReq.builder().id(req.getWorkspaceId()).build()); WorkspaceDetailResp workspace = workspaceGateway.getDetail(WorkspaceDetailReq.builder().id(req.getWorkspaceId()).build());
Axssert.checkNonNull(workspace, "工作台不存在{}", req.getWorkspaceId()); 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() UnitQueryRepository.UnitResp unit = unitQueryRepository.oneOpt(UnitQueryRepository.OneReq.builder()
.id(node.getId()) .id(node.getId())
.build()).orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("单位不存在{}", node.getOrganizationalUnitId())); .build()).orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("单位不存在{}", node.getOrganizationalUnitId()));
SaasCooperateShip cooperateShip = SaasCooperateShip.builder()
.parentId(req.getParentId()) // 创建协同关系
.workspaceId(workspace.getId()) return cooperateShipFoundationService.create(CooperateShipCreator.builder()
.workspaceType(workspace.getWorkspaceType()) .workspaceId(req.getWorkspaceId())
.workspaceName(workspace.getName()) .workspaceName(workspace.getName())
.status(CooperateShipStatusEnum.PRESENT.getCode()) .workspaceType(workspace.getWorkspaceType())
.joinAt(new Date()) .organizationalNodeId(req.getOrganizationalNodeId())
.organizationalUnitId(node.getOrganizationalUnitId()) .organizationalUnitId(unit.getId())
.organizationalUnitName(unit.getName()) .organizationalUnitName(unit.getName())
.parentId(req.getParentId())
.cooperateType(req.getCooperateType()) .cooperateType(req.getCooperateType())
.organizationalNodeId(node.getId())
.partnerShip(req.getPartnerShip()) .partnerShip(req.getPartnerShip())
.createBy(req.getOperatorId()) .operatorId(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())
.build()); .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 @Override
@ -182,7 +147,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// 是否查询父级节点 // 是否查询父级节点
if (BooleanUtil.isTrue(req.getIncludeAncestors())) { if (BooleanUtil.isTrue(req.getIncludeAncestors())) {
Collection<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList); Collection<Long> ancestorIds = cooperateShipFoundationService.extractAncestorIds(currentNodeList);
List<SaasCooperateShip> ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).statuses(req.getStatuses()).build()); List<SaasCooperateShip> ancestorShipNodes = cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder().ids(ancestorIds).statuses(req.getStatuses()).build());
resultNodeList.addAll(ancestorShipNodes); resultNodeList.addAll(ancestorShipNodes);
} }
@ -202,7 +167,7 @@ public class CooperateShipServiceImpl implements CooperateShipService {
// 是否查询子孙节点 // 是否查询子孙节点
if (BooleanUtil.isTrue(req.getIncludeChildren())) { if (BooleanUtil.isTrue(req.getIncludeChildren())) {
Collection<Long> ids = cooperateShipFoundationService.extract(currentNodeList, SaasCooperateShip::getId); Collection<Long> ids = CollUtil.map(currentNodeList, SaasCooperateShip::getId, true);
List<SaasCooperateShip> childrenShipNodes = cooperateShipQueryRepository.list( List<SaasCooperateShip> childrenShipNodes = cooperateShipQueryRepository.list(
CooperateShipQueryRepository.ListReq.builder() CooperateShipQueryRepository.ListReq.builder()
.statuses(req.getStatuses()) .statuses(req.getStatuses())