|
@@ -1,11 +1,27 @@
|
|
|
package com.fjhx.service.process.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fjhx.constants.FlowConstant;
|
|
|
+import com.fjhx.constants.FlowExplainConstant;
|
|
|
import com.fjhx.entity.process.ProcessNode;
|
|
|
+import com.fjhx.entity.process.ProcessNodeButton;
|
|
|
+import com.fjhx.enums.ButtonNameEnum;
|
|
|
+import com.fjhx.enums.ProcessNodeHandleObjectTypeEnum;
|
|
|
+import com.fjhx.enums.ProcessNodeTypeEnum;
|
|
|
import com.fjhx.mapper.process.ProcessNodeMapper;
|
|
|
+import com.fjhx.params.process.ProcessNodeVo;
|
|
|
import com.fjhx.service.process.ProcessNodeService;
|
|
|
+import com.fjhx.utils.Assert;
|
|
|
+import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
/**
|
|
|
* <p>
|
|
|
* 服务实现类
|
|
@@ -17,4 +33,212 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class ProcessNodeServiceImpl extends ServiceImpl<ProcessNodeMapper, ProcessNode> implements ProcessNodeService {
|
|
|
|
|
|
+ @Override
|
|
|
+ public void addOrEditNodeList(Long id, List<ProcessNodeVo> processNodeVoList) {
|
|
|
+
|
|
|
+ // 节点集合
|
|
|
+ List<ProcessNode> processNodeList = processNodeVoList.stream().map(processNodeVo -> {
|
|
|
+ // 验证字段
|
|
|
+ verificationField(processNodeVo);
|
|
|
+ // 拷贝对象
|
|
|
+ ProcessNode processNode = BeanUtil.toBean(processNodeVo, ProcessNode.class);
|
|
|
+ // 赋值流程id
|
|
|
+ processNode.setProcessInfoId(id);
|
|
|
+ // 赋值处理对象id集合
|
|
|
+ processNode.setHandleObjectIdSet(String.join(",", processNodeVo.getHandleObjectIdList()));
|
|
|
+ return processNode;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 添加或更新节点
|
|
|
+ saveOrUpdateBatch(processNodeList);
|
|
|
+
|
|
|
+ // 添加节点按钮
|
|
|
+ insertNodeButton(processNodeList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证字段
|
|
|
+ */
|
|
|
+ private void verificationField(ProcessNodeVo processNodeVo) {
|
|
|
+
|
|
|
+ // 节点类型
|
|
|
+ Integer type = processNodeVo.getType();
|
|
|
+ Assert.notEmpty(type, FlowExplainConstant.NODE_TYPE);
|
|
|
+
|
|
|
+ // 父节点id
|
|
|
+ Long parentId = processNodeVo.getParentId();
|
|
|
+ Assert.notEmpty(parentId, FlowExplainConstant.NODE_PARENT_ID);
|
|
|
+
|
|
|
+ // 节点名称
|
|
|
+ String name = processNodeVo.getName();
|
|
|
+ Assert.notEmpty(name, FlowExplainConstant.NODE_NAME);
|
|
|
+
|
|
|
+ // 发起 / 处理对象类型
|
|
|
+ Integer handleObjectType = processNodeVo.getHandleObjectType();
|
|
|
+ Assert.notEmpty(handleObjectType, FlowExplainConstant.HANDLE_OBJECT_TYPE);
|
|
|
+
|
|
|
+ // 处理对象id集合
|
|
|
+ if (ObjectUtil.notEqual(handleObjectType, ProcessNodeHandleObjectTypeEnum.ALL.getType())) {
|
|
|
+ List<String> handleObjectIdList = processNodeVo.getHandleObjectIdList();
|
|
|
+ Assert.notEmpty(handleObjectIdList, FlowExplainConstant.HANDLE_OBJECT_ID_LIST);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加节点按钮
|
|
|
+ */
|
|
|
+ private void insertNodeButton(List<ProcessNode> processNodeList) {
|
|
|
+
|
|
|
+ // 按父级节点分组
|
|
|
+ Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId = processNodeList.stream()
|
|
|
+ .collect(Collectors.groupingBy(ProcessNode::getParentId));
|
|
|
+
|
|
|
+ for (ProcessNode processNode : processNodeList) {
|
|
|
+ Integer type = processNode.getType();
|
|
|
+ // 获取节点类型枚举值
|
|
|
+ ProcessNodeTypeEnum processNodeTypeEnum = ProcessNodeTypeEnum.get(type);
|
|
|
+ Assert.notEmpty(processNodeTypeEnum, FlowExplainConstant.NODE_UNKNOWN);
|
|
|
+ // 根据节点类型生成功能按钮
|
|
|
+ List<ProcessNodeButton> processNodeButtonList = new ArrayList<>();
|
|
|
+ switch (processNodeTypeEnum) {
|
|
|
+ case START: // 开始
|
|
|
+ startHandle(processNodeButtonList, ProcessNodeGroupByParentId, processNode);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case EXAMINED: // 审核
|
|
|
+ examinedHandle(processNodeButtonList, ProcessNodeGroupByParentId, processNode);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case APPROVAL: // 审批
|
|
|
+ approvalHandle(processNodeButtonList, ProcessNodeGroupByParentId, processNode);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HANDLE: // 办理
|
|
|
+ handle(processNodeButtonList, ProcessNodeGroupByParentId, processNode);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case END: // 结束
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 开始节点处理
|
|
|
+ */
|
|
|
+ private void startHandle(List<ProcessNodeButton> processNodeButtonList,
|
|
|
+ Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId, ProcessNode processNode) {
|
|
|
+ // 下一步
|
|
|
+ ProcessNodeButton next = next(ProcessNodeGroupByParentId, processNode, ButtonNameEnum.ADOPT);
|
|
|
+ processNodeButtonList.add(next);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核处理
|
|
|
+ */
|
|
|
+ private void examinedHandle(List<ProcessNodeButton> processNodeButtonList,
|
|
|
+ Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId, ProcessNode processNode) {
|
|
|
+ // 通过
|
|
|
+ ProcessNodeButton next = next(ProcessNodeGroupByParentId, processNode, ButtonNameEnum.ADOPT);
|
|
|
+ processNodeButtonList.add(next);
|
|
|
+ // 驳回
|
|
|
+ ProcessNodeButton previous = previous(ProcessNodeGroupByParentId, processNode, ButtonNameEnum.FAIL);
|
|
|
+ processNodeButtonList.add(previous);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审批处理
|
|
|
+ */
|
|
|
+ private void approvalHandle(List<ProcessNodeButton> processNodeButtonList,
|
|
|
+ Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId, ProcessNode processNode) {
|
|
|
+ // 同意
|
|
|
+ ProcessNodeButton next = next(ProcessNodeGroupByParentId, processNode, ButtonNameEnum.AGREE);
|
|
|
+ processNodeButtonList.add(next);
|
|
|
+ // 驳回
|
|
|
+ ProcessNodeButton over = over(processNode, ButtonNameEnum.REJECT);
|
|
|
+ processNodeButtonList.add(over);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 办理处理
|
|
|
+ */
|
|
|
+ private void handle(List<ProcessNodeButton> processNodeButtonList,
|
|
|
+ Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId, ProcessNode processNode) {
|
|
|
+ // 完成
|
|
|
+ ProcessNodeButton next = next(ProcessNodeGroupByParentId, processNode, ButtonNameEnum.complete);
|
|
|
+ processNodeButtonList.add(next);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 跳转下一节点
|
|
|
+ */
|
|
|
+ private ProcessNodeButton next(Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId,
|
|
|
+ ProcessNode processNode, ButtonNameEnum buttonNameEnum) {
|
|
|
+
|
|
|
+ ProcessNodeButton processNodeButton = createProcessNodeButton(processNode, buttonNameEnum);
|
|
|
+
|
|
|
+ // 赋值跳转到下一节点
|
|
|
+ List<ProcessNode> nextProcessNodeList = ProcessNodeGroupByParentId.get(processNode.getId());
|
|
|
+ if (nextProcessNodeList == null) {
|
|
|
+ throw new ServiceException(String.format(FlowExplainConstant.JUMP_EMPTY, processNode.getName()));
|
|
|
+ }
|
|
|
+ if (nextProcessNodeList.size() == 1) {
|
|
|
+ ProcessNode itemProcessNode = nextProcessNodeList.get(0);
|
|
|
+ if (itemProcessNode.getType().equals(ProcessNodeTypeEnum.END.getType())) {
|
|
|
+ processNodeButton.setJumpNodeId(FlowConstant.OVER_PROCESS_FLAG);
|
|
|
+ } else {
|
|
|
+ processNodeButton.setJumpNodeId(itemProcessNode.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return processNodeButton;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 跳转上一节点
|
|
|
+ */
|
|
|
+ private ProcessNodeButton previous(Map<Long, List<ProcessNode>> ProcessNodeGroupByParentId,
|
|
|
+ ProcessNode processNode, ButtonNameEnum buttonNameEnum) {
|
|
|
+
|
|
|
+ ProcessNodeButton processNodeButton = createProcessNodeButton(processNode, buttonNameEnum);
|
|
|
+
|
|
|
+ // 赋值跳转到上一节点
|
|
|
+ List<ProcessNode> previousProcessNodeList = ProcessNodeGroupByParentId.get(processNode.getParentId());
|
|
|
+
|
|
|
+ if (previousProcessNodeList == null || previousProcessNodeList.size() != 1) {
|
|
|
+ throw new ServiceException(String.format(FlowExplainConstant.PREVIOUS_ERROR, processNode.getName()));
|
|
|
+ }
|
|
|
+
|
|
|
+ processNodeButton.setJumpNodeId(previousProcessNodeList.get(0).getId());
|
|
|
+
|
|
|
+ return processNodeButton;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 结束流程
|
|
|
+ */
|
|
|
+ private ProcessNodeButton over(ProcessNode processNode, ButtonNameEnum buttonNameEnum) {
|
|
|
+
|
|
|
+ ProcessNodeButton processNodeButton = createProcessNodeButton(processNode, buttonNameEnum);
|
|
|
+
|
|
|
+ processNodeButton.setJumpNodeId(FlowConstant.OVER_PROCESS_FLAG);
|
|
|
+ return processNodeButton;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建按钮
|
|
|
+ */
|
|
|
+ private ProcessNodeButton createProcessNodeButton(ProcessNode processNode, ButtonNameEnum buttonNameEnum) {
|
|
|
+ ProcessNodeButton processNodeButton = new ProcessNodeButton();
|
|
|
+ processNodeButton.setProcessInfoId(processNode.getProcessInfoId());
|
|
|
+ processNodeButton.setProcessNodeId(processNode.getId());
|
|
|
+ processNodeButton.setProcessNodeCode(processNode.getCode());
|
|
|
+ processNodeButton.setNameType(buttonNameEnum.getType());
|
|
|
+ return processNodeButton;
|
|
|
+ }
|
|
|
+
|
|
|
}
|