Skip to content

Commit 3d87d89

Browse files
authored
Merge pull request #111 from codingapi/dev
add else node
2 parents 3bef62b + 180b840 commit 3d87d89

18 files changed

Lines changed: 537 additions & 15 deletions

File tree

flow-engine-example/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.codingapi.flow</groupId>
88
<artifactId>flow-engine-parent</artifactId>
9-
<version>0.0.11</version>
9+
<version>0.0.12</version>
1010
<relativePath>../pom.xml</relativePath>
1111
</parent>
1212

flow-engine-framework/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.codingapi.flow</groupId>
88
<artifactId>flow-engine-parent</artifactId>
9-
<version>0.0.11</version>
9+
<version>0.0.12</version>
1010
</parent>
1111

1212
<name>flow-engine-framework</name>

flow-engine-framework/src/main/java/com/codingapi/flow/manager/FlowNodeState.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ public FlowNodeState(IFlowNode node) {
2929
this.blockNodeTypes.add(NodeType.MANUAL.name());
3030

3131
this.branchNodeTypes.add(NodeType.CONDITION_BRANCH.name());
32+
this.branchNodeTypes.add(NodeType.CONDITION_ELSE_BRANCH.name());
3233
this.branchNodeTypes.add(NodeType.INCLUSIVE_BRANCH.name());
34+
this.branchNodeTypes.add(NodeType.INCLUSIVE_ELSE_BRANCH.name());
3335
this.branchNodeTypes.add(NodeType.PARALLEL_BRANCH.name());
3436
this.branchNodeTypes.add(NodeType.MANUAL_BRANCH.name());
3537
}

flow-engine-framework/src/main/java/com/codingapi/flow/node/NodeType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public enum NodeType {
1010
CONDITION,
1111
// 分支节点
1212
CONDITION_BRANCH,
13+
// 分支else节点
14+
CONDITION_ELSE_BRANCH,
1315
// 延迟节点
1416
DELAY,
1517
// 结束
@@ -20,6 +22,8 @@ public enum NodeType {
2022
INCLUSIVE,
2123
// 包容分支
2224
INCLUSIVE_BRANCH,
25+
// 包容else分支
26+
INCLUSIVE_ELSE_BRANCH,
2327
// 人工控制
2428
MANUAL,
2529
// 人工分支

flow-engine-framework/src/main/java/com/codingapi/flow/node/factory/NodeFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ private void initNodes() {
2525
nodesClasses.put(ApprovalNode.NODE_TYPE, ApprovalNode.class);
2626
nodesClasses.put(ConditionNode.NODE_TYPE, ConditionNode.class);
2727
nodesClasses.put(ConditionBranchNode.NODE_TYPE, ConditionBranchNode.class);
28+
nodesClasses.put(ConditionElseBranchNode.NODE_TYPE, ConditionElseBranchNode.class);
2829
nodesClasses.put(DelayNode.NODE_TYPE, DelayNode.class);
2930
nodesClasses.put(EndNode.NODE_TYPE, EndNode.class);
3031
nodesClasses.put(HandleNode.NODE_TYPE, HandleNode.class);
3132
nodesClasses.put(InclusiveNode.NODE_TYPE, InclusiveNode.class);
3233
nodesClasses.put(InclusiveBranchNode.NODE_TYPE, InclusiveBranchNode.class);
34+
nodesClasses.put(InclusiveElseBranchNode.NODE_TYPE, InclusiveElseBranchNode.class);
3335
nodesClasses.put(ManualNode.NODE_TYPE, ManualNode.class);
3436
nodesClasses.put(ManualBranchNode.NODE_TYPE, ManualBranchNode.class);
3537
nodesClasses.put(NotifyNode.NODE_TYPE, NotifyNode.class);
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.codingapi.flow.node.nodes;
2+
3+
import com.codingapi.flow.builder.BaseNodeBuilder;
4+
import com.codingapi.flow.node.BaseFlowNode;
5+
import com.codingapi.flow.node.IFlowNode;
6+
import com.codingapi.flow.node.NodeType;
7+
import com.codingapi.flow.session.FlowSession;
8+
import com.codingapi.flow.utils.RandomUtils;
9+
10+
import java.util.ArrayList;
11+
import java.util.Comparator;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
/**
16+
* 条件else分支节点
17+
*/
18+
public class ConditionElseBranchNode extends BaseFlowNode {
19+
20+
public static final String NODE_TYPE = NodeType.CONDITION_ELSE_BRANCH.name();
21+
public static final String DEFAULT_NAME = "条件else分支节点";
22+
23+
24+
@Override
25+
public String getType() {
26+
return NODE_TYPE;
27+
}
28+
29+
public ConditionElseBranchNode(String id, String name, int order) {
30+
super(id, name, order);
31+
}
32+
33+
public ConditionElseBranchNode() {
34+
this(RandomUtils.generateStringId(), DEFAULT_NAME, 100);
35+
}
36+
37+
/**
38+
* 匹配条件
39+
*/
40+
@Override
41+
public boolean handle(FlowSession request) {
42+
return true;
43+
}
44+
45+
@Override
46+
public List<IFlowNode> filterBranches(List<IFlowNode> nodeList, FlowSession flowSession) {
47+
List<IFlowNode> nodes = new ArrayList<>();
48+
for (IFlowNode node : nodeList) {
49+
if (node.handle(flowSession)) {
50+
nodes.add(node);
51+
}
52+
}
53+
// 获取最小order的节点
54+
nodes.sort(Comparator.comparingInt(IFlowNode::getOrder));
55+
if (!nodes.isEmpty()) {
56+
return nodes.subList(0, 1);
57+
}
58+
return nodes;
59+
}
60+
61+
public static ConditionElseBranchNode formMap(Map<String, Object> map) {
62+
return BaseFlowNode.fromMap(map, ConditionElseBranchNode.class);
63+
}
64+
65+
public static Builder builder() {
66+
return new Builder();
67+
}
68+
69+
public static class Builder extends BaseNodeBuilder<Builder, ConditionElseBranchNode> {
70+
71+
public Builder() {
72+
super(new ConditionElseBranchNode());
73+
}
74+
75+
}
76+
}

flow-engine-framework/src/main/java/com/codingapi/flow/node/nodes/ConditionNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public void addDefaultBranch(int count){
4040
branchNode.setOrder(i+1);
4141
branches.add(branchNode);
4242
}
43+
branches.add(new ConditionElseBranchNode());
4344
this.setBlocks(branches);
4445
}
4546

flow-engine-framework/src/main/java/com/codingapi/flow/node/nodes/InclusiveBranchNode.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import com.codingapi.flow.workflow.Workflow;
1414
import lombok.Setter;
1515

16+
import java.util.ArrayList;
17+
import java.util.Comparator;
1618
import java.util.List;
1719
import java.util.Map;
1820

@@ -67,6 +69,27 @@ public static InclusiveBranchNode formMap(Map<String, Object> map) {
6769
return branchNode;
6870
}
6971

72+
73+
private List<IFlowNode> filterNodes(List<IFlowNode> nodeList, FlowSession flowSession){
74+
List<IFlowNode> nodes = new ArrayList<>();
75+
for (IFlowNode node : nodeList) {
76+
if (node.handle(flowSession)) {
77+
nodes.add(node);
78+
}
79+
}
80+
// 获取移除else节点
81+
if (!nodes.isEmpty() && nodes.size()>2) {
82+
List<IFlowNode> filterNodes = new ArrayList<>();
83+
for (IFlowNode node : nodes){
84+
if(!node.getType().equalsIgnoreCase(NodeType.INCLUSIVE_ELSE_BRANCH.name())){
85+
filterNodes.add(node);
86+
}
87+
}
88+
return filterNodes;
89+
}
90+
return nodes;
91+
}
92+
7093
/**
7194
* 匹配条件分支
7295
*
@@ -77,7 +100,9 @@ public static InclusiveBranchNode formMap(Map<String, Object> map) {
77100
public List<IFlowNode> filterBranches(List<IFlowNode> nodeList, FlowSession flowSession) {
78101
Workflow workflow = flowSession.getWorkflow();
79102
IFlowNode currentNode = flowSession.getCurrentNode();
80-
ParallelNodeRelationHelper helper = new ParallelNodeRelationHelper(workflow,currentNode,nodeList);
103+
104+
List<IFlowNode> nodes = this.filterNodes(nodeList,flowSession);
105+
ParallelNodeRelationHelper helper = new ParallelNodeRelationHelper(workflow,currentNode,nodes);
81106
// 分析并行分支的结束汇聚节点
82107
IFlowNode overNode = helper.fetchMargeNode();
83108
if (overNode == null) {
@@ -86,9 +111,9 @@ public List<IFlowNode> filterBranches(List<IFlowNode> nodeList, FlowSession flow
86111

87112
// 在流程记录中记录,合并的条件信息。
88113
FlowRecord flowRecord = flowSession.getCurrentRecord();
89-
flowRecord.parallelBranchNode(overNode.getId(), nodeList.size(), RandomUtils.generateStringId());
114+
flowRecord.parallelBranchNode(overNode.getId(), nodes.size(), RandomUtils.generateStringId());
90115

91-
return nodeList;
116+
return nodes;
92117
}
93118

94119
public static Builder builder() {
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.codingapi.flow.node.nodes;
2+
3+
import com.codingapi.flow.builder.BaseNodeBuilder;
4+
import com.codingapi.flow.exception.FlowNotFoundException;
5+
import com.codingapi.flow.node.BaseFlowNode;
6+
import com.codingapi.flow.node.IFlowNode;
7+
import com.codingapi.flow.node.NodeType;
8+
import com.codingapi.flow.node.helper.ParallelNodeRelationHelper;
9+
import com.codingapi.flow.record.FlowRecord;
10+
import com.codingapi.flow.session.FlowSession;
11+
import com.codingapi.flow.utils.RandomUtils;
12+
import com.codingapi.flow.workflow.Workflow;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
/**
19+
* 包容分支节点
20+
*/
21+
public class InclusiveElseBranchNode extends BaseFlowNode {
22+
23+
public static final String NODE_TYPE = NodeType.INCLUSIVE_ELSE_BRANCH.name();
24+
public static final String DEFAULT_NAME = "包容else分支节点";
25+
26+
27+
@Override
28+
public String getType() {
29+
return NODE_TYPE;
30+
}
31+
32+
33+
public InclusiveElseBranchNode(String id, String name, int order) {
34+
super(id, name, order);
35+
}
36+
37+
public InclusiveElseBranchNode() {
38+
this(RandomUtils.generateStringId(), DEFAULT_NAME, 100);
39+
}
40+
41+
/**
42+
* 匹配条件
43+
*/
44+
@Override
45+
public boolean handle(FlowSession request) {
46+
return true;
47+
}
48+
49+
50+
private List<IFlowNode> filterNodes(List<IFlowNode> nodeList, FlowSession flowSession){
51+
List<IFlowNode> nodes = new ArrayList<>();
52+
for (IFlowNode node : nodeList) {
53+
if (node.handle(flowSession)) {
54+
nodes.add(node);
55+
}
56+
}
57+
// 获取移除else节点
58+
if (!nodes.isEmpty() && nodes.size()>2) {
59+
List<IFlowNode> filterNodes = new ArrayList<>();
60+
for (IFlowNode node : nodes){
61+
if(!node.getType().equalsIgnoreCase(NodeType.INCLUSIVE_ELSE_BRANCH.name())){
62+
filterNodes.add(node);
63+
}
64+
}
65+
return filterNodes;
66+
}
67+
return nodes;
68+
}
69+
70+
/**
71+
* 匹配条件分支
72+
*
73+
* @param nodeList 当前节点下的所有条件
74+
* @param flowSession 当前会话
75+
* @return 匹配的节点
76+
*/
77+
public List<IFlowNode> filterBranches(List<IFlowNode> nodeList, FlowSession flowSession) {
78+
Workflow workflow = flowSession.getWorkflow();
79+
IFlowNode currentNode = flowSession.getCurrentNode();
80+
81+
List<IFlowNode> nodes = this.filterNodes(nodeList,flowSession);
82+
ParallelNodeRelationHelper helper = new ParallelNodeRelationHelper(workflow,currentNode,nodes);
83+
// 分析并行分支的结束汇聚节点
84+
IFlowNode overNode = helper.fetchMargeNode();
85+
if (overNode == null) {
86+
throw FlowNotFoundException.parallelEndNodeNotNull();
87+
}
88+
89+
// 在流程记录中记录,合并的条件信息。
90+
FlowRecord flowRecord = flowSession.getCurrentRecord();
91+
flowRecord.parallelBranchNode(overNode.getId(), nodes.size(), RandomUtils.generateStringId());
92+
93+
return nodes;
94+
}
95+
96+
public static InclusiveElseBranchNode formMap(Map<String, Object> map) {
97+
return BaseFlowNode.fromMap(map, InclusiveElseBranchNode.class);
98+
}
99+
100+
101+
public static Builder builder() {
102+
return new Builder();
103+
}
104+
105+
public static class Builder extends BaseNodeBuilder<Builder, InclusiveElseBranchNode> {
106+
107+
public Builder() {
108+
super(new InclusiveElseBranchNode());
109+
}
110+
111+
}
112+
}

flow-engine-framework/src/main/java/com/codingapi/flow/node/nodes/InclusiveNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public void addDefaultBranch(int count){
4343
branchNode.setOrder(i+1);
4444
branches.add(branchNode);
4545
}
46+
branches.add(new InclusiveElseBranchNode());
4647
this.setBlocks(branches);
4748
}
4849

0 commit comments

Comments
 (0)