feature(REQ-3282): Node基于Processor方式写收口的方法demo

This commit is contained in:
周敏 2024-12-06 19:27:15 +08:00
parent 6bcf30a339
commit 6baeb19d40
30 changed files with 579 additions and 140 deletions

View File

@ -31,6 +31,10 @@
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,29 +1,29 @@
package cn.axzo.orgmanax.api.node.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.orgmanax.api.node.req.OrganizationalNodeCreateReq;
import cn.axzo.orgmanax.api.node.resp.OrganizationalNodeInfoResp;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 部门相关基础API
* 部门相关基础API
*
* @author tanjie@axzo.cn
* @date 2024/12/2 15:40
*/
@FeignClient(
value = "orgmanax",
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
public interface OrganizationalNodeBasicApi {
public interface OrgNodeApi {
/**
* 创建部门标准接口
* @param organizationalNodeCreateReq
* 处理部门相关的逻辑
*
* @param param why json: 由于不同行为需要的参数和返回信息均不一致jsonObject用来统一接收参数和返回数据具体消费参数的地方serviceprocessor来定义具体的类型
* @return
*/
@PostMapping("/api/org/node/basic/create")
ApiResult<OrganizationalNodeInfoResp> create(@RequestBody OrganizationalNodeCreateReq organizationalNodeCreateReq);
@PostMapping("/api/org/node/process")
ApiResult<JSONObject> process(@RequestBody JSONObject param);
}

View File

@ -1,8 +1,11 @@
package cn.axzo.orgmanax.api.node.req;
import com.alibaba.fastjson.JSONObject;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
@ -14,7 +17,7 @@ import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrganizationalNodeCreateReq {
public class ProcessNodeReq {
/**
* 单位ID
@ -42,9 +45,24 @@ public class OrganizationalNodeCreateReq {
private String remark;
/**
* 创建
* 操作
*/
private Long crateBy;
private Long operatorId;
/**
* 参数
*/
private JSONObject param;
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public enum Action {
CREATE("创建", "createNodeProcessor"),
UPDATE("普通更新", "updateNodeProcessor"),
CHANGE_MANAGER("更换管理员", "changeNodeManagerProcessor");
private final String desc;
private final String processor;
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.orgmanax.api.node.resp;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -9,6 +10,7 @@ import java.util.Date;
/**
* 部门信息
*
* @author tanjie@axzo.cn
* @date 2024/12/2 16:20
*/
@ -16,7 +18,7 @@ import java.util.Date;
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrganizationalNodeInfoResp {
public class ProcessOrgNodeResp {
/**
* 部门ID
@ -53,10 +55,6 @@ public class OrganizationalNodeInfoResp {
* 状态
*/
private Integer status;
/**
* 扩展信息
*/
private String extra;
/**
* 创建人自然人ID
@ -66,5 +64,13 @@ public class OrganizationalNodeInfoResp {
* 创建时间
*/
private Date createAt;
/**
* 业务数据业务需要使用的数据小组-盈亏模型平台班组-platTeamId等不同nodeType里面的内容不一样
*/
private JSONObject bizData;
/**
* 扩展信息
*/
private JSONObject extra;
}

View File

@ -16,5 +16,13 @@
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>cn.axzo.foundation</groupId>
<artifactId>common-lib</artifactId>
<version>2.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,23 @@
package cn.axzo.orgmanax.common.config;
import cn.axzo.foundation.result.IResultCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum BizResultCode implements IResultCode {
// ~ 100 -> 199 Node相关的错误码
NODE_PROCESS_FAILED("100", "部门操作失败"),
INVALID_PARAM("400", "参数异常"),
ENTITY_NOT_FOUND("404", "实体不存在"),
DATA_PUMP_ERROR("999", "数据同步错误"),
;
private String errorCode;
private String errorMessage;
}

View File

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.*;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.Date;
@ -25,7 +26,7 @@ import java.util.Objects;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@SuperBuilder
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
public class OrganizationalNode implements Serializable {

View File

@ -1,12 +0,0 @@
package cn.axzo.orgmanax.infra.dao.node.gateway;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 18:00
*/
public interface NodeQueryGateway {
OrganizationalNode findById(Long id);
}

View File

@ -1,24 +0,0 @@
package cn.axzo.orgmanax.infra.dao.node.gateway.impl;
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.gateway.NodeQueryGateway;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 18:05
*/
@Service
@RequiredArgsConstructor
public class NodeQueryGatewayImpl implements NodeQueryGateway {
private final NodeDao nodeDao;
@Override
public OrganizationalNode findById(Long id) {
return nodeDao.findById(id);
}
}

View File

@ -0,0 +1,84 @@
package cn.axzo.orgmanax.infra.dao.node.repository;
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.IPageReq;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 18:00
*/
public interface NodeQueryRepository {
List<NodeResp> list(ListReq req);
PageResp<NodeResp> page(PageReq req);
default Optional<NodeResp> oneOpt(ListReq req) {
return list(req).stream().findFirst();
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class ListReq {
@CriteriaField
private Long id;
@CriteriaField(field = "id", operator = Operator.IN)
private Set<Long> ids;
/**
* 用于遍历数据
*/
@CriteriaField(field = "id", operator = Operator.GT)
private Long idGt;
@CriteriaField
private Long organizationalUnitId;
@CriteriaField(field = "organizationalUnitId", operator = Operator.IN)
private Long organizationalUnitIds;
@CriteriaField
private Boolean needParent;
}
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class PageReq extends ListReq implements IPageReq {
@CriteriaField(ignore = true)
Integer page;
@CriteriaField(ignore = true)
Integer pageSize;
@CriteriaField(ignore = true)
List<String> sort;
}
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class NodeResp extends OrganizationalNode {
/**
* 查询参数指定 needParentInfo = true才会返回
*
* @see ListReq#needParent
*/
private NodeResp parentNode;
}
}

View File

@ -1,4 +1,4 @@
package cn.axzo.orgmanax.infra.dao.node.gateway;
package cn.axzo.orgmanax.infra.dao.node.repository;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
@ -7,7 +7,7 @@ import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
* @author tanjie@axzo.cn
* @date 2024/12/4 18:25
*/
public interface NodeUpsertGateway {
public interface NodeUpsertRepository {
OrganizationalNode create(OrganizationalNode node);
OrganizationalNode update(OrganizationalNode node);

View File

@ -0,0 +1,42 @@
package cn.axzo.orgmanax.infra.dao.node.repository.impl;
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.page.PageResp;
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.NodeQueryRepository;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.BooleanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 18:05
*/
@Service
@RequiredArgsConstructor
public class NodeQueryRepositoryImpl implements NodeQueryRepository {
private final NodeDao nodeDao;
@Override
public List<NodeResp> list(ListReq req) {
QueryWrapper<OrganizationalNode> wrapper = QueryWrapperHelper.fromBean(this, OrganizationalNode.class);
List<NodeResp> results = nodeDao.list(wrapper).stream().map(e -> BeanUtil.toBean(e, NodeResp.class)).collect(Collectors.toList());
if (BooleanUtil.isTrue(req.getNeedParent())) {
// assemble parentNode
}
return results;
}
@Override
public PageResp<NodeResp> page(PageReq req) {
// TODO
return null;
}
}

View File

@ -1,9 +1,8 @@
package cn.axzo.orgmanax.infra.dao.node.gateway.impl;
package cn.axzo.orgmanax.infra.dao.node.repository.impl;
import cn.axzo.orgmanax.infra.dao.node.convert.NodeInfraConvert;
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.gateway.NodeUpsertGateway;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeUpsertRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
@ -14,7 +13,7 @@ import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class NodeUpsertGatewayImpl implements NodeUpsertGateway {
public class NodeUpsertRepositoryImpl implements NodeUpsertRepository {
private final NodeDao nodeDao;
@Override

View File

@ -0,0 +1,49 @@
package cn.axzo.orgmanax.server.node.controller;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.orgmanax.api.node.feign.OrgNodeApi;
import cn.axzo.orgmanax.api.node.req.ProcessNodeReq;
import cn.axzo.orgmanax.server.node.service.NodeService;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.axzo.orgmanax.common.config.BizResultCode.NODE_PROCESS_FAILED;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 16:47
*/
@RestController
@RequestMapping
@RequiredArgsConstructor
public class NodeController implements OrgNodeApi {
private final NodeService nodeService;
/**
* 创建部门
* <p>
* XXX: why json: 由于不同行为需要的参数和返回信息均不一致jsonObject用来统一接收参数和返回数据具体消费参数的地方serviceprocessor来定义具体的类型
*
* @param param 创建部门参数
* @return
*/
@Override
public ApiResult<JSONObject> process(JSONObject param) {
NodeService.ProcessReq processReq = NodeService.ProcessReq.builder()
.id(param.getLong("id"))
.operatorId(param.getLong("operatorId"))
.action(param.getObject("action", ProcessNodeReq.Action.class))
.param(param)
.build();
NodeProcessor.ProcessResult processResult = nodeService.process(processReq);
Axssert.isTrue(processResult.getSuccess(), NODE_PROCESS_FAILED, processResult.getMsg());
return ApiResult.ok(processResult.getContext());
}
}

View File

@ -1,37 +0,0 @@
package cn.axzo.orgmanax.server.node.controller;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.orgmanax.api.node.feign.OrganizationalNodeBasicApi;
import cn.axzo.orgmanax.api.node.req.OrganizationalNodeCreateReq;
import cn.axzo.orgmanax.api.node.resp.OrganizationalNodeInfoResp;
import cn.axzo.orgmanax.server.node.convert.NodeApiConvert;
import cn.axzo.orgmanax.server.node.service.foundation.node.service.NodeFoundationServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tanjie@axzo.cn
* @date 2024/12/2 16:47
*/
@RestController
@RequestMapping
@RequiredArgsConstructor
public class OrganizationalNodeBasicController implements OrganizationalNodeBasicApi {
private final NodeFoundationServiceImpl nodeBasicService;
/**
* 创建部门
*
* @param organizationalNodeCreateReq 创建部门参数
* @return
*/
@Override
public ApiResult<OrganizationalNodeInfoResp> create(OrganizationalNodeCreateReq organizationalNodeCreateReq) {
return ApiResult.ok(nodeBasicService.create(NodeApiConvert.INSTANCE.toFoundation(organizationalNodeCreateReq)));
}
}

View File

@ -1,7 +1,7 @@
package cn.axzo.orgmanax.server.node.convert;
import cn.axzo.orgmanax.api.node.req.OrganizationalNodeCreateReq;
import cn.axzo.orgmanax.server.node.service.foundation.node.entity.OrganizationalNodeCreate;
import cn.axzo.orgmanax.api.node.req.ProcessNodeReq;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
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(OrganizationalNodeCreateReq req);
OrganizationalNodeCreate toFoundation(ProcessNodeReq req);
}

View File

@ -1,8 +1,8 @@
package cn.axzo.orgmanax.server.node.service.foundation.node.check;
package cn.axzo.orgmanax.server.node.foundation.node.check;
import cn.axzo.orgmanax.common.entity.BizErrorInfo;
import cn.axzo.orgmanax.infra.dao.node.gateway.NodeQueryGateway;
import cn.axzo.orgmanax.server.node.service.foundation.node.entity.OrganizationalNodeCreate;
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;
@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
public class NodeBasicCheck {
private final NodeQueryGateway nodeQueryGateway;
private final NodeQueryRepository nodeQueryRepository;
/** 返回值也可以封装成对象
* @param organizationalNode

View File

@ -1,7 +1,7 @@
package cn.axzo.orgmanax.server.node.service.foundation.node.convert;
package cn.axzo.orgmanax.server.node.foundation.node.convert;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.server.node.service.foundation.node.entity.OrganizationalNodeCreate;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

View File

@ -1,4 +1,4 @@
package cn.axzo.orgmanax.server.node.service.foundation.node.entity;
package cn.axzo.orgmanax.server.node.foundation.node.entity;
/**
* 部门相关操作

View File

@ -1,13 +1,13 @@
package cn.axzo.orgmanax.server.node.service.foundation.node.service;
package cn.axzo.orgmanax.server.node.foundation.node.service;
import cn.axzo.orgmanax.api.node.resp.OrganizationalNodeInfoResp;
import cn.axzo.orgmanax.api.node.resp.ProcessOrgNodeResp;
import cn.axzo.orgmanax.common.entity.BizErrorInfo;
import cn.axzo.orgmanax.infra.dao.node.DO.OrganizationalNode;
import cn.axzo.orgmanax.infra.dao.node.gateway.NodeQueryGateway;
import cn.axzo.orgmanax.infra.dao.node.gateway.NodeUpsertGateway;
import cn.axzo.orgmanax.server.node.service.foundation.node.check.NodeBasicCheck;
import cn.axzo.orgmanax.server.node.service.foundation.node.convert.NodeConvert;
import cn.axzo.orgmanax.server.node.service.foundation.node.entity.OrganizationalNodeCreate;
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.convert.NodeConvert;
import cn.axzo.orgmanax.server.node.foundation.node.check.NodeBasicCheck;
import cn.axzo.orgmanax.server.node.foundation.node.entity.OrganizationalNodeCreate;
import cn.hutool.core.lang.Assert;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@ -22,8 +22,8 @@ import org.springframework.transaction.annotation.Transactional;
public class NodeFoundationServiceImpl {
private final NodeBasicCheck nodeBasicCheck;
private final NodeQueryGateway nodeQueryGateway;
private final NodeUpsertGateway nodeUpsertGateway;
private final NodeQueryRepository nodeQueryRepository;
private final NodeUpsertRepository nodeUpsertRepository;
/**
@ -33,7 +33,7 @@ public class NodeFoundationServiceImpl {
* @return
*/
@Transactional
public OrganizationalNodeInfoResp create(OrganizationalNodeCreate organizationalNodeCreate) {
public ProcessOrgNodeResp create(OrganizationalNodeCreate organizationalNodeCreate) {
// 业务校验
BizErrorInfo bizErrorInfo = nodeBasicCheck.createNodeCheck(organizationalNodeCreate);
@ -41,22 +41,22 @@ public class NodeFoundationServiceImpl {
// 转换为领域对象
// 持久化
OrganizationalNode organizationalNode = NodeConvert.INSTANCE.toDo(organizationalNodeCreate);
nodeUpsertGateway.create(organizationalNode);
nodeUpsertRepository.create(organizationalNode);
// 获取上级节点为了重新计算pathtopNodeId等数据
OrganizationalNode parentNode = nodeQueryGateway.findById(organizationalNode.getParentId());
OrganizationalNode parentNode = nodeQueryRepository.findById(organizationalNode.getParentId());
// 重新计算pathtopNodeId等数据 未来也可以添加workspaceId等信息
organizationalNode.calcPath(parentNode);
//更新数据
nodeUpsertGateway.update(organizationalNode);
nodeUpsertRepository.update(organizationalNode);
// 发送消息
// 返回结果
return OrganizationalNodeInfoResp.builder()
return ProcessOrgNodeResp.builder()
.id(organizationalNode.getId())
// ....
.build();

View File

@ -1,4 +1,4 @@
package cn.axzo.orgmanax.server.node.service.foundation;
package cn.axzo.orgmanax.server.node.foundation;
/**

View File

@ -0,0 +1,45 @@
package cn.axzo.orgmanax.server.node.service;
import cn.axzo.foundation.exception.Axssert;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.api.node.req.ProcessNodeReq;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
public interface NodeService {
NodeProcessor.ProcessResult process(ProcessReq req);
List<NodeQueryRepository.NodeResp> list(NodeQueryRepository.ListReq req);
PageResp<NodeQueryRepository.NodeResp> page(NodeQueryRepository.PageReq req);
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
class ProcessReq {
private Long id;
private Long operatorId;
private ProcessNodeReq.Action action;
private JSONObject param;
/**
* 基于参数的通用逻辑判断
*/
public void check() {
Axssert.notNull(action, BizResultCode.INVALID_PARAM, "执行行为不能为空");
Axssert.notNull(operatorId, BizResultCode.INVALID_PARAM, "操作人不能为空");
}
}
}

View File

@ -1,6 +0,0 @@
package cn.axzo.orgmanax.server.node.service.biz;
/**
* 业务层
*
*
*/

View File

@ -1,12 +0,0 @@
package cn.axzo.orgmanax.server.node.service.biz.team.service;
import org.springframework.stereotype.Service;
/**
* @author tanjie@axzo.cn
* @date 2024/12/4 18:07
*/
@Service
public class TeamServiceImpl {
}

View File

@ -0,0 +1,53 @@
package cn.axzo.orgmanax.server.node.service.impl;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import cn.axzo.orgmanax.server.node.service.NodeService;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class NodeServiceImpl implements NodeService {
private final NodeQueryRepository nodeQueryRepository;
private final ApplicationContext applicationContext;
@Override
public NodeProcessor.ProcessResult process(ProcessReq req) {
// 通用check
req.check();
// 如果指定了id校验部门是否存在并加载出node以便后续使用
NodeQueryRepository.NodeResp current = req.getId() == null ? null
: nodeQueryRepository.oneOpt(NodeQueryRepository.ListReq.builder().id(req.getId()).build())
.orElseThrow(BizResultCode.ENTITY_NOT_FOUND::toException);
// 构建processor所需上下文
NodeProcessor.ProcessContext processContext = NodeProcessor.ProcessContext.builder()
.node(current)
.action(req.getAction())
.operatorId(req.getOperatorId())
.params(req.getParam())
.build();
NodeProcessor processor = applicationContext.getBean(req.getAction().getProcessor(), NodeProcessor.class);
return processor.process(processContext);
}
@Override
public List<NodeQueryRepository.NodeResp> list(NodeQueryRepository.ListReq req) {
return nodeQueryRepository.list(req);
}
@Override
public PageResp<NodeQueryRepository.NodeResp> page(NodeQueryRepository.PageReq req) {
return nodeQueryRepository.page(req);
}
}

View File

@ -0,0 +1,70 @@
package cn.axzo.orgmanax.server.node.service.processor;
import cn.axzo.orgmanax.api.node.req.ProcessNodeReq;
import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository;
import com.alibaba.fastjson.JSONObject;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
public interface NodeProcessor {
@Transactional(rollbackFor = Throwable.class)
ProcessResult process(ProcessContext context);
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ProcessContext {
NodeQueryRepository.NodeResp node;
ProcessNodeReq.Action action;
JSONObject params;
String processScene;
Long operatorId;
String operatorName;
}
@Getter
@Builder(access = AccessLevel.PRIVATE)
@AllArgsConstructor
class ProcessResult {
@Builder.Default
Boolean success = Boolean.TRUE;
String msg;
JSONObject context;
public static ProcessResult success() {
return success(null);
}
public static ProcessResult success(JSONObject context) {
return ProcessResult.builder()
.success(true)
.context(Optional.ofNullable(context).orElse(new JSONObject(0)))
.build();
}
public static ProcessResult fail() {
return fail(null);
}
public static ProcessResult fail(String msg) {
return ProcessResult.builder()
.success(false)
.msg(msg)
.build();
}
}
}

View File

@ -0,0 +1,31 @@
package cn.axzo.orgmanax.server.node.service.processor.impl;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class ChangeNodeManagerProcessor implements NodeProcessor {
@Override
public ProcessResult process(ProcessContext context) {
// 前置校验
// 找到原管理员
// nodeUser = nodeUserRepository.oneOpt(xxx).orElseThrown();
// 找到新管理员
// nodeUser = nodeUserRepository.oneOpt(xxx).orElseThrown();
// 将原管理员设置为manager = false
// 将新管理员设置为manager = true
// 发送 更换部门管理员 MQ消息
return ProcessResult.success(new JSONObject().fluentPut("node", context.getNode())
.fluentPut("oldManagerId", "1").fluentPut("newManagerId", "2"));
}
}

View File

@ -0,0 +1,63 @@
package cn.axzo.orgmanax.server.node.service.processor.impl;
import cn.axzo.foundation.event.support.producer.EventProducer;
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.service.processor.NodeProcessor;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 创建普通部门
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class CreateNodeProcessor implements NodeProcessor {
private final NodeQueryRepository nodeQueryRepository;
private final NodeUpsertRepository nodeUpsertRepository;
private final EventProducer eventProducer;
@Override
public ProcessResult process(ProcessContext context) {
// 转成该处理器关注的参数对象
Param param = context.getParams().toJavaObject(Param.class);
// basic check
param.check();
// additional check
if (param.getParentId() != null && param.getParentId() > 0) {
nodeQueryRepository.oneOpt(NodeQueryRepository.ListReq.builder()
.id(param.getParentId())
.build());
}
// 创建普通部门数据
OrganizationalNode organizationalNode = nodeUpsertRepository.create(null);
// 发送部门创建MQ消息
eventProducer.send(null);
// 返回数据
return ProcessResult.success((JSONObject) JSONObject.toJSON(organizationalNode));
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public static class Param {
private Long parentId;
public void check() {
// checks
}
}
}

View File

@ -0,0 +1,16 @@
package cn.axzo.orgmanax.server.node.service.processor.impl;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class CreateTeamProcessor implements NodeProcessor {
@Override
public ProcessResult process(ProcessContext context) {
return null;
}
}

View File

@ -0,0 +1,18 @@
package cn.axzo.orgmanax.server.node.service.processor.impl;
import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 更新部门普通字段
*/
@Component
@Slf4j
public class UpdateNodeProcessor implements NodeProcessor {
@Override
public ProcessResult process(ProcessContext context) {
// TODO
return null;
}
}