Ver Fonte

重构开始节点

caixiaofeng há 6 meses atrás
pai
commit
7471a1d292

+ 2 - 2
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowDefineServiceImpl.java

@@ -171,8 +171,8 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
         if (Objects.isNull(define)) {
             throw new BaseException("流程不存在");
         }
-        StartNode startNode = (StartNode) define.getProcess();
-        List<FieldProperty> formProperties = startNode.getFormProperties();
+        RootNode rootNode = (RootNode) define.getProcess();
+        List<FieldProperty> formProperties = rootNode.getFormProperties();
         return new FormInfo(define, formProperties, null);
     }
 }

+ 3 - 3
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowTaskServiceImpl.java

@@ -16,7 +16,7 @@ import com.flow.entity.FlowTask;
 import com.flow.entity.node.ApprovalNode;
 import com.flow.entity.node.FieldProperty;
 import com.flow.entity.node.Node;
-import com.flow.entity.node.StartNode;
+import com.flow.entity.node.RootNode;
 import com.flow.enums.ProcessStatus;
 import com.flow.flowable.cmd.AddTaskExecutionCmd;
 import com.flow.flowable.cmd.DeleteTaskExecutionCmd;
@@ -100,8 +100,8 @@ public class FlowTaskServiceImpl extends BaseServiceImpl<FlowTaskDao, FlowTask>
         }
         Map<String, Object> variables = this.getVariables(task.getId());
         ApprovalNode approvalNode = flowDefine.getNode(task.getTaskDefinitionKey(), ApprovalNode.class);
-        StartNode startNode = flowDefine.getNode(null, StartNode.class);
-        List<FieldProperty> formProperties = Objects.nonNull(approvalNode) ? approvalNode.getFormProperties() : startNode.getFormProperties();
+        RootNode rootNode = flowDefine.getNode(null, RootNode.class);
+        List<FieldProperty> formProperties = Objects.nonNull(approvalNode) ? approvalNode.getFormProperties() : rootNode.getFormProperties();
         HashMap<String, Boolean> startOpera = new HashMap<>();
         startOpera.put("complete", true);
         Map<String, Boolean> operations = Objects.nonNull(approvalNode) ? approvalNode.getOperations() : startOpera;

+ 4 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/constant/NodeTypeConstant.java

@@ -1,6 +1,8 @@
 package com.flow.constant;
 
 public interface NodeTypeConstant {
+    // 根节点
+    String ROOT = "root";
     // 开始
     String START = "start";
     // 抄送
@@ -27,6 +29,8 @@ public interface NodeTypeConstant {
     String HTTP = "http";
     // 服务
     String SERVICE = "service";
+    // 子流程
+    String SUB = "sub";
     // 结束
     String END = "end";
 }

+ 2 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/Node.java

@@ -21,6 +21,7 @@ import java.util.stream.Collectors;
 @Data
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = Node.class, visible = true)
 @JsonSubTypes({
+        @JsonSubTypes.Type(value = RootNode.class, name = NodeTypeConstant.ROOT),
         @JsonSubTypes.Type(value = StartNode.class, name = NodeTypeConstant.START),
         @JsonSubTypes.Type(value = CcNode.class, name = NodeTypeConstant.CC),
         @JsonSubTypes.Type(value = ApprovalNode.class, name = NodeTypeConstant.APPROVAL),
@@ -34,6 +35,7 @@ import java.util.stream.Collectors;
         @JsonSubTypes.Type(value = JumpNode.class, name = NodeTypeConstant.JUMP),
         @JsonSubTypes.Type(value = HttpNode.class, name = NodeTypeConstant.HTTP),
         @JsonSubTypes.Type(value = ServiceNode.class, name = NodeTypeConstant.SERVICE),
+        @JsonSubTypes.Type(value = SubNode.class, name = NodeTypeConstant.SUB),
         @JsonSubTypes.Type(value = EndNode.class, name = NodeTypeConstant.END)
 })
 @JsonIgnoreProperties(ignoreUnknown = true)

+ 56 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/RootNode.java

@@ -0,0 +1,56 @@
+package com.flow.entity.node;
+
+import com.google.common.collect.Lists;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.SequenceFlow;
+import org.flowable.bpmn.model.StartEvent;
+import org.flowable.bpmn.model.UserTask;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RootNode extends Node {
+    // 表单属性
+    private List<FieldProperty> formProperties = new ArrayList<>();
+    // 操作权限
+    private Map<String, Boolean> operations = new LinkedHashMap<>();
+
+    @Override
+    public List<FlowElement> convert() {
+        ArrayList<FlowElement> elements = Lists.newArrayList();
+        // 开始节点
+        StartEvent startEvent = new StartEvent();
+        String startId = "node_start";
+        startEvent.setId(startId);
+        startEvent.setName("开始");
+        startEvent.setExecutionListeners(this.buidEventListener());
+        elements.add(startEvent);
+        // 下一个节点的连线
+        SequenceFlow sequenceFlow = new SequenceFlow();
+        sequenceFlow.setId(String.format("%s-%s", startId, this.getId()));
+        sequenceFlow.setSourceRef(startId);
+        sequenceFlow.setTargetRef(this.getId());
+        elements.add(sequenceFlow);
+        // 发起人用户任务
+        UserTask userTask = new UserTask();
+        userTask.setId(this.getId());
+        userTask.setName(this.getName());
+        userTask.setAssignee("${initiator}");
+        userTask.setSkipExpression("${_SKIP_INITIATOR == true}");
+        elements.add(userTask);
+        // 下一个节点的连线
+        Node next = this.getNext();
+        SequenceFlow sequence = this.buildSequence(next);
+        elements.add(sequence);
+        // 下一个节点
+        List<FlowElement> flowElements = next.convert();
+        elements.addAll(flowElements);
+        return elements;
+    }
+}

+ 2 - 23
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/StartNode.java

@@ -6,45 +6,24 @@ import lombok.EqualsAndHashCode;
 import org.flowable.bpmn.model.FlowElement;
 import org.flowable.bpmn.model.SequenceFlow;
 import org.flowable.bpmn.model.StartEvent;
-import org.flowable.bpmn.model.UserTask;
 
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class StartNode extends Node {
-    // 表单属性
-    private List<FieldProperty> formProperties = new ArrayList<>();
-    // 操作权限
-    private Map<String, Boolean> operations = new LinkedHashMap<>();
 
     @Override
     public List<FlowElement> convert() {
         ArrayList<FlowElement> elements = Lists.newArrayList();
         // 开始节点
         StartEvent startEvent = new StartEvent();
-        String startId = "node_start";
-        startEvent.setId(startId);
-        startEvent.setName("开始");
+        startEvent.setId(this.getId());
+        startEvent.setName(this.getName());
         startEvent.setExecutionListeners(this.buidEventListener());
         elements.add(startEvent);
         // 下一个节点的连线
-        SequenceFlow sequenceFlow = new SequenceFlow();
-        sequenceFlow.setId(String.format("%s-%s", startId, this.getId()));
-        sequenceFlow.setSourceRef(startId);
-        sequenceFlow.setTargetRef(this.getId());
-        elements.add(sequenceFlow);
-        // 发起人用户任务
-        UserTask userTask = new UserTask();
-        userTask.setId(this.getId());
-        userTask.setName(this.getName());
-        userTask.setAssignee("${initiator}");
-        userTask.setSkipExpression("${_SKIP_INITIATOR == true}");
-        elements.add(userTask);
-        // 下一个节点的连线
         Node next = this.getNext();
         SequenceFlow sequence = this.buildSequence(next);
         elements.add(sequence);

+ 42 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/SubNode.java

@@ -0,0 +1,42 @@
+package com.flow.entity.node;
+
+import com.google.common.collect.Lists;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.SequenceFlow;
+import org.flowable.bpmn.model.SubProcess;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SubNode extends Node {
+    private Node child;
+
+    @Override
+    public List<FlowElement> convert() {
+        ArrayList<FlowElement> elements = Lists.newArrayList();
+        // 服务节点
+        SubProcess subProcess = new SubProcess();
+        subProcess.setId(this.getId());
+        subProcess.setName(this.getName());
+        subProcess.setExecutionListeners(this.buidEventListener());
+        List<FlowElement> subElements = this.child.convert();
+        subElements.forEach(subProcess::addFlowElement);
+        elements.add(subProcess);
+        // 下一个节点的连线
+        Node next = this.getNext();
+        SequenceFlow sequenceFlow = this.buildSequence(next);
+        elements.add(sequenceFlow);
+        // 下一个节点
+        if (Objects.nonNull(next)) {
+            next.setBranchId(this.getBranchId());
+            List<FlowElement> flowElements = next.convert();
+            elements.addAll(flowElements);
+        }
+        return elements;
+    }
+}