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

This commit is contained in:
liuyang 2024-12-09 20:46:13 +08:00
commit 4ac7554f94
18 changed files with 102 additions and 167 deletions

View File

@ -59,7 +59,8 @@ public class ProcessNodeReq {
public enum Action {
CREATE("创建", "createNodeProcessor"),
UPDATE("普通更新", "updateNodeProcessor"),
CHANGE_MANAGER("更换管理员", "changeNodeManagerProcessor");
CHANGE_MANAGER("更换管理员", "changeNodeManagerProcessor"),
CHANGE_TEAM_LEADER("更换班组长", "changeTeamLeaderProcessor");
private final String desc;
private final String processor;

View File

@ -1,29 +0,0 @@
package cn.axzo.orgmanax.api.team;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.orgmanax.api.team.req.OrgCreateTeamReq;
import cn.axzo.orgmanax.api.team.resp.OrgCreateTeamResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 班组相关API
* @author tanjie@axzo.cn
* @date 2024/12/2 15:40
*/
@FeignClient(
value = "orgmanax",
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
public interface OrgTeamApi {
/**
* 创建项目班组
* @param organizationalNodeCreateReq
* @return
*/
@PostMapping("/api/org/project/create-team")
ApiResult<OrgCreateTeamResp> createProjectTeam(@RequestBody OrgCreateTeamReq organizationalNodeCreateReq);
}

View File

@ -1,44 +0,0 @@
package cn.axzo.orgmanax.api.team.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 创建班组请求实体
* @author tanjie@axzo.cn
* @date 2024/12/5 10:46
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrgCreateTeamReq {
/**
*
*/
private String name;
/**
*
*/
private Long teamLeaderPersonId;
private Long inviteOuId;
private Long inviteWorkspaceId;
/**
* 单位班组的节点ID
*/
private Long ouTeamNodeId;
/**
* 操作人ID: person id
*/
private Long operatorId;
}

View File

@ -1,14 +0,0 @@
package cn.axzo.orgmanax.api.team.resp;
/**
* @author tanjie@axzo.cn
* @date 2024/12/5 10:55
*/
public class OrgCreateTeamResp {
private Long projectTeamId;
private String teamName;
private Long organizationalNodeId;
}

View File

@ -29,6 +29,10 @@ public interface NodeQueryRepository {
PageResp<NodeResp> page(PageReq req);
default NodeResp one(OneReq req) {
return oneOpt(req).orElse(null);
}
default Optional<NodeResp> oneOpt(OneReq req) {
req.check();
PageReq page = BeanUtil.toBean(req, PageReq.class);

View File

@ -2,6 +2,14 @@ package cn.axzo.orgmanax.infra.dao.node.repository;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashSet;
import java.util.Set;
/**
* @author tanjie@axzo.cn
@ -11,4 +19,31 @@ public interface NodeUpsertRepository {
OrganizationalNode create(OrganizationalNode node);
OrganizationalNode update(OrganizationalNode node);
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
class CreateReq {
private OrganizationalNode node;
/**
* 场景描述 添加普通部门添加班组
*/
private String scene;
private Long operatorId;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
class UpdateReq {
private Long id;
private OrganizationalNode node;
private String scene;
/**
* 由于updateById不支持将值设置为null这里提供这个
*/
Set<SFunction<OrganizationalNode, ?>> setNullFields = new HashSet<>();
}
}

View File

@ -1,21 +1,22 @@
package cn.axzo.orgmanax.infra.dao.node.repository.impl;
import cn.axzo.orgmanax.infra.dao.node.dao.NodeDao;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.dao.NodeDao;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeUpsertRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Component;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 18:22
*/
@Repository
@Component
@RequiredArgsConstructor
public class NodeUpsertRepositoryImpl implements NodeUpsertRepository {
private final NodeDao nodeDao;
@Override
public OrganizationalNode create(OrganizationalNode node) {
nodeDao.save(node);

View File

@ -46,4 +46,5 @@ public class NodeController implements OrgNodeApi {
}
}

View File

@ -1,7 +1,7 @@
package cn.axzo.orgmanax.server.node.convert;
import cn.axzo.orgmanax.api.node.req.ProcessNodeReq;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import cn.axzo.orgmanax.server.node.foundation.entity.NodeCreate;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@ -13,5 +13,5 @@ import org.mapstruct.factory.Mappers;
public interface NodeApiConvert {
NodeApiConvert INSTANCE = Mappers.getMapper(NodeApiConvert.class);
OrganizationalNodeCreate toFoundation(ProcessNodeReq req);
NodeCreate toFoundation(ProcessNodeReq req);
}

View File

@ -0,0 +1,18 @@
package cn.axzo.orgmanax.server.node.foundation;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.server.node.foundation.entity.NodeCreate;
import org.springframework.transaction.annotation.Transactional;
public interface NodeFoundationService {
/**
* 创建部门
*
* @param nodeCreate
* @return
*/
@Transactional(rollbackFor = Throwable.class)
OrganizationalNode create(NodeCreate nodeCreate);
}

View File

@ -1,7 +1,7 @@
package cn.axzo.orgmanax.server.node.foundation.node.convert;
package cn.axzo.orgmanax.server.node.foundation.convert;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import cn.axzo.orgmanax.server.node.foundation.entity.NodeCreate;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@ -13,6 +13,6 @@ import org.mapstruct.factory.Mappers;
public interface NodeConvert {
NodeConvert INSTANCE = Mappers.getMapper(NodeConvert.class);
OrganizationalNode toDo(OrganizationalNodeCreate req);
OrganizationalNode toDo(NodeCreate req);
}

View File

@ -1,11 +1,21 @@
package cn.axzo.orgmanax.server.node.foundation.node.entity;
package cn.axzo.orgmanax.server.node.foundation.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 部门相关操作
*
* @author tanjie@axzo.cn
* @date 2024/12/5 10:28
*/
public class OrganizationalNodeCreate {
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class NodeCreate {
/**
@ -36,7 +46,7 @@ public class OrganizationalNodeCreate {
/**
* 创建人
*/
private Long crateBy;
private Long operatorId;
}

View File

@ -1,15 +1,12 @@
package cn.axzo.orgmanax.server.node.foundation.node.service;
package cn.axzo.orgmanax.server.node.foundation.impl;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.common.entity.BizErrorInfo;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeUpsertRepository;
import cn.axzo.orgmanax.server.node.foundation.node.check.NodeBasicCheck;
import cn.axzo.orgmanax.server.node.foundation.node.convert.NodeConvert;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import cn.hutool.core.lang.Assert;
import cn.axzo.orgmanax.server.node.foundation.NodeFoundationService;
import cn.axzo.orgmanax.server.node.foundation.convert.NodeConvert;
import cn.axzo.orgmanax.server.node.foundation.entity.NodeCreate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -22,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor
public class NodeFoundationServiceImpl implements NodeFoundationService {
private final NodeBasicCheck nodeBasicCheck;
private final NodeQueryRepository nodeQueryRepository;
private final NodeUpsertRepository nodeUpsertRepository;
@ -35,20 +31,16 @@ public class NodeFoundationServiceImpl implements NodeFoundationService {
*/
@Transactional
@Override
public ProcessOrgNodeResp create(OrganizationalNodeCreate organizationalNodeCreate) {
// 业务校验
BizErrorInfo bizErrorInfo = nodeBasicCheck.createNodeCheck(organizationalNodeCreate);
Assert.isTrue(bizErrorInfo.isSuccess(), bizErrorInfo.getErrorMsg());
// 转换为领域对象
// 持久化
OrganizationalNode organizationalNode = NodeConvert.INSTANCE.toDo(organizationalNodeCreate);
nodeUpsertRepository.create(organizationalNode);
public OrganizationalNode create(NodeCreate nodeCreate) {
// 获取上级节点为了重新计算pathtopNodeId等数据
OrganizationalNode parentNode = nodeQueryRepository
.oneOpt(NodeQueryRepository.OneReq.builder().id(organizationalNode.getParentId()).build())
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("父级部门不存在"));
OrganizationalNode parentNode = nodeCreate.getParentId() == null || nodeCreate.getParentId() <= 0L ? null :
nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(nodeCreate.getParentId()).build())
.orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("父级部门不存在"));
// 转换为领域对象
// 持久化 -> mapstruct?
OrganizationalNode organizationalNode = NodeConvert.INSTANCE.toDo(nodeCreate);
nodeUpsertRepository.create(organizationalNode);
// 重新计算pathtopNodeId等数据 未来也可以添加workspaceId等信息
organizationalNode.calcPath(parentNode);
@ -60,10 +52,7 @@ public class NodeFoundationServiceImpl implements NodeFoundationService {
// eventProducer.send(null);
// 返回结果
return ProcessOrgNodeResp.builder()
.id(organizationalNode.getId())
// ....
.build();
return nodeQueryRepository.one(NodeQueryRepository.OneReq.builder().id(organizationalNode.getId()).build());
}
}

View File

@ -1,31 +0,0 @@
package cn.axzo.orgmanax.server.node.foundation.node.check;
import cn.axzo.orgmanax.common.entity.BizErrorInfo;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 20:17
*/
@Service
@RequiredArgsConstructor
public class NodeBasicCheck {
private final NodeQueryRepository nodeQueryRepository;
/** 返回值也可以封装成对象
* @param organizationalNode
* @return
*/
public BizErrorInfo createNodeCheck(OrganizationalNodeCreate organizationalNode) {
// 重名校验
// nodeQueryGateway.find(organizationalNode.getOrganizationalNodeName());
return BizErrorInfo.builder()
.isSuccess(true)
.build();
}
}

View File

@ -1,10 +0,0 @@
package cn.axzo.orgmanax.server.node.foundation.node.service;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import org.springframework.transaction.annotation.Transactional;
public interface NodeFoundationService {
@Transactional
ProcessOrgNodeResp create(OrganizationalNodeCreate organizationalNodeCreate);
}

View File

@ -20,10 +20,14 @@ public class ChangeTeamLeaderProcessor extends ChangeNodeManagerProcessor {
// 3. 班组长移除班组长角色权限 新班组长添加角色权限
// 3.5 xxx
// 4. 更换项目内班组的班组长可异步处理
// 5. 发送 业务MQ消息 - 更换班组长
// 6.
// 返回处理结果可按需封装
return nodeChangeManagerResult;
}

View File

@ -4,7 +4,7 @@ import cn.axzo.foundation.event.support.producer.EventProducer;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.server.node.foundation.node.service.NodeFoundationService;
import cn.axzo.orgmanax.server.node.foundation.NodeFoundationService;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;

View File

@ -4,7 +4,7 @@ import cn.axzo.foundation.exception.Axssert;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.server.node.foundation.node.service.NodeFoundationService;
import cn.axzo.orgmanax.server.node.foundation.NodeFoundationService;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;