feature(REQ-3282): Node基于Processor方式写收口的方法demo
This commit is contained in:
parent
6bcf30a339
commit
6baeb19d40
@ -31,6 +31,10 @@
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@ -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用来统一接收参数和返回数据。具体消费参数的地方「service、processor」来定义具体的类型。
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/org/node/basic/create")
|
||||
ApiResult<OrganizationalNodeInfoResp> create(@RequestBody OrganizationalNodeCreateReq organizationalNodeCreateReq);
|
||||
@PostMapping("/api/org/node/process")
|
||||
ApiResult<JSONObject> process(@RequestBody JSONObject param);
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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>
|
||||
@ -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;
|
||||
}
|
||||
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
@ -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用来统一接收参数和返回数据。具体消费参数的地方「service、processor」来定义具体的类型。
|
||||
*
|
||||
* @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());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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)));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -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;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package cn.axzo.orgmanax.server.node.service.foundation.node.entity;
|
||||
package cn.axzo.orgmanax.server.node.foundation.node.entity;
|
||||
|
||||
/**
|
||||
* 部门相关操作
|
||||
@ -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);
|
||||
|
||||
// 获取上级节点,为了重新计算path、topNodeId等数据
|
||||
OrganizationalNode parentNode = nodeQueryGateway.findById(organizationalNode.getParentId());
|
||||
OrganizationalNode parentNode = nodeQueryRepository.findById(organizationalNode.getParentId());
|
||||
|
||||
// 重新计算path、topNodeId等数据。 未来也可以添加workspaceId等信息
|
||||
organizationalNode.calcPath(parentNode);
|
||||
|
||||
//更新数据
|
||||
nodeUpsertGateway.update(organizationalNode);
|
||||
nodeUpsertRepository.update(organizationalNode);
|
||||
|
||||
// 发送消息
|
||||
|
||||
|
||||
// 返回结果
|
||||
return OrganizationalNodeInfoResp.builder()
|
||||
return ProcessOrgNodeResp.builder()
|
||||
.id(organizationalNode.getId())
|
||||
// ....
|
||||
.build();
|
||||
@ -1,4 +1,4 @@
|
||||
package cn.axzo.orgmanax.server.node.service.foundation;
|
||||
package cn.axzo.orgmanax.server.node.foundation;
|
||||
|
||||
|
||||
/**
|
||||
@ -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, "操作人不能为空");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,6 +0,0 @@
|
||||
package cn.axzo.orgmanax.server.node.service.biz;
|
||||
/**
|
||||
* 业务层
|
||||
*
|
||||
*
|
||||
*/
|
||||
@ -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 {
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user