文章

【若依】27、网关

1 排他网关(互斥网关)

排他网关可以有多个入口,但有且仅有一个有效出口。 请假流程

  1. 小于等于 1 天,组长审批;
  2. 大于 1 天,小于等于 3 天,经理审批;
  3. 大于 3 天,总监审批;

image.png 通过连接线上的流条件,来设置流程的执行 image.png image.png image.png image.png image.png image.png XML 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<process id="ExclusiveGatewayDemo" name="ExclusiveGatewayDemo" isExecutable="true">
  <documentation>ExclusiveGatewayDemo</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <exclusiveGateway id="sid-262DF489-9E39-4A3F-8D46-AFB7A16D40D5"></exclusiveGateway>
  <sequenceFlow id="sid-B93D9321-3913-444F-8094-7C2FD9C249C0" sourceRef="startEvent1" targetRef="sid-262DF489-9E39-4A3F-8D46-AFB7A16D40D5"></sequenceFlow>
  <userTask id="sid-8D36C169-2053-496E-AC3D-96947950F401" name="经理审批" flowable:formFieldValidation="true"></userTask>
  <userTask id="sid-7792C75C-98A8-48D1-A99D-B66E0035BEA4" name="总监审批" flowable:formFieldValidation="true"></userTask>
  <userTask id="sid-155CE7DB-E5DD-4E2D-8E37-3A21286C4D49" name="组长审批" flowable:formFieldValidation="true"></userTask>
  <endEvent id="sid-E911E45F-3C00-4ECE-8B67-48F35D882E38"></endEvent>
  <sequenceFlow id="sid-8430C4C9-E201-461C-9DEA-ECA0CDFD980C" sourceRef="sid-8D36C169-2053-496E-AC3D-96947950F401" targetRef="sid-E911E45F-3C00-4ECE-8B67-48F35D882E38"></sequenceFlow>
  <sequenceFlow id="sid-B5627016-97EB-42F8-8D78-FD4F4B8CF09A" sourceRef="sid-155CE7DB-E5DD-4E2D-8E37-3A21286C4D49" targetRef="sid-E911E45F-3C00-4ECE-8B67-48F35D882E38"></sequenceFlow>
  <sequenceFlow id="sid-C2D2647D-8527-452D-8CAA-C223073CB3F8" sourceRef="sid-7792C75C-98A8-48D1-A99D-B66E0035BEA4" targetRef="sid-E911E45F-3C00-4ECE-8B67-48F35D882E38"></sequenceFlow>
  <sequenceFlow id="sid-1DC8421C-05BF-4AE2-B3B9-B1A7A71330E7" name="小于等于 1 天" sourceRef="sid-262DF489-9E39-4A3F-8D46-AFB7A16D40D5" targetRef="sid-155CE7DB-E5DD-4E2D-8E37-3A21286C4D49">
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days <= 1}]]></conditionExpression>
  </sequenceFlow>
  <sequenceFlow id="sid-C554F00F-8D15-4C62-AF2F-85B037B3B735" name="大于 1 天
小于等于 3 天" sourceRef="sid-262DF489-9E39-4A3F-8D46-AFB7A16D40D5" targetRef="sid-8D36C169-2053-496E-AC3D-96947950F401">
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days > 1 && days <= 3}]]></conditionExpression>
  </sequenceFlow>
  <sequenceFlow id="sid-D5320843-E536-4DCA-BB8B-6650E3B0BFFB" name="大于 3 天" sourceRef="sid-262DF489-9E39-4A3F-8D46-AFB7A16D40D5" targetRef="sid-7792C75C-98A8-48D1-A99D-B66E0035BEA4">
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days >= 3}]]></conditionExpression>
  </sequenceFlow>
</process>

sequenceFlow标签中,有一个conditionExpression标签,这个标签用来设置流程执行的条件 启动流程并指定变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 启动流程并指定变量
 * act_ru_task
 */
@Test
public void startProcessInstanceByKey1() {
    Map<String, Object> map = new HashMap<>();
    map.put("days", 6);
    runtimeService.startProcessInstanceByKey("ExclusiveGatewayDemo", map);
}

/**
 * 完成任务
 * act_ru_task
 */
@Test
public void complete1() {
    List<Task> list = taskService.createTaskQuery().list();
    for (Task task : list) {
        taskService.complete(task.getId());
    }
}

2 并行网关

多个任务同时执行,并且多个任务全部执行完毕时,才会进入到下一个任务。 注意:并行网关一般是成对出现的。 image.png XML 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<process id="ParallelGatewayDemo" name="ParallelGatewayDemo" isExecutable="true">
  <documentation>ParallelGatewayDemo01</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <sequenceFlow id="sid-543AEF5C-A222-4CA3-99C4-822A8E04ABC1" sourceRef="startEvent1" targetRef="sid-EFB937C8-9E06-4872-84F6-85F03D71A79A"></sequenceFlow>
  <parallelGateway id="sid-EFB937C8-9E06-4872-84F6-85F03D71A79A"></parallelGateway>
  <userTask id="sid-09AF6AC8-D4BF-483A-99E1-A322E70E5D1B" name="生产屏幕" flowable:assignee="yueyazhui" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <userTask id="sid-D6A72695-0760-45DE-A781-6172BDAFABBD" name="生产键盘" flowable:assignee="zhangyanpeng" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-80C64863-1D8A-4661-A6B1-F0C6C7F69669" sourceRef="sid-EFB937C8-9E06-4872-84F6-85F03D71A79A" targetRef="sid-D6A72695-0760-45DE-A781-6172BDAFABBD"></sequenceFlow>
  <sequenceFlow id="sid-26412ECD-5BE3-4C7D-AEE7-5CB31CE72213" sourceRef="sid-EFB937C8-9E06-4872-84F6-85F03D71A79A" targetRef="sid-09AF6AC8-D4BF-483A-99E1-A322E70E5D1B"></sequenceFlow>
  <sequenceFlow id="sid-46120E68-F670-4F9D-9ED0-E42F1E0316DC" sourceRef="sid-09AF6AC8-D4BF-483A-99E1-A322E70E5D1B" targetRef="sid-B9012403-959B-438C-837D-D782A4EB0A5E"></sequenceFlow>
  <sequenceFlow id="sid-8556B269-8DBE-4B47-9BC0-C26B95B2C141" sourceRef="sid-D6A72695-0760-45DE-A781-6172BDAFABBD" targetRef="sid-B9012403-959B-438C-837D-D782A4EB0A5E"></sequenceFlow>
  <userTask id="sid-F686443E-BC3B-4835-A2A3-78211EE75272" name="组装" flowable:assignee="yue" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-D6C5F429-B086-4399-BB7D-C2F45DC5B491" sourceRef="sid-B9012403-959B-438C-837D-D782A4EB0A5E" targetRef="sid-F686443E-BC3B-4835-A2A3-78211EE75272"></sequenceFlow>
  <endEvent id="sid-8546339C-7249-4A0D-B2E5-D4EF17BF624D"></endEvent>
  <sequenceFlow id="sid-6DB86606-2020-42AD-9A3A-53DF544191E0" sourceRef="sid-F686443E-BC3B-4835-A2A3-78211EE75272" targetRef="sid-8546339C-7249-4A0D-B2E5-D4EF17BF624D"></sequenceFlow>
  <parallelGateway id="sid-B9012403-959B-438C-837D-D782A4EB0A5E"></parallelGateway>
</process>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * 启动流程
 * act_ru_task
 */
@Test
public void startProcessInstanceByKey2() {
    runtimeService.startProcessInstanceByKey("ParallelGatewayDemo");
}

/**
 * 完成任务
 * act_ru_task
 */
@Test
public void complete2() {
    String[] assignees = new String[]{"yueyazhui", "zhangyanpeng", "yue"};
    List<Task> list = taskService.createTaskQuery().taskAssignee(assignees[0]).list();
    for (Task task : list) {
        taskService.complete(task.getId());
    }
}

3 包容网关(兼容网关、相容网关)

包容网关可以根据条件,自动转为排他网关或并行网关。

报销流程:小于等于 500 元,yueyazhui 审批;大于 500 元,yueyazhui 和 zhangyanpeng 同时审批。

image.png 设置条件 image.png image.png

  1. 报销 400 元的时候,只满足 > 0,所以是 yueyazhui 审批,此时是排他网关。
  2. 报销 600 元的时候,既满足 >0,又满足 >500,所以是 yueyazhui 和 zhangyanpeng 同时审批,此时是并行网关。

XML 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<process id="InclusiveGatewayDemo" name="InclusiveGatewayDemo" isExecutable="true">
  <documentation>InclusiveGatewayDemo</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <sequenceFlow id="sid-AC9C78FC-C36E-41E4-BB42-64FC094F576A" sourceRef="startEvent1" targetRef="sid-1278BA7A-3F89-42DA-8FFD-BD22C6CC58A8"></sequenceFlow>
  <inclusiveGateway id="sid-1278BA7A-3F89-42DA-8FFD-BD22C6CC58A8"></inclusiveGateway>
  <userTask id="sid-310BFAFD-7943-4E0C-8612-D876EB1A72AF" name="yueyazhui 审批" flowable:assignee="yueyazhui" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <userTask id="sid-D7745F05-6DFB-4867-9F14-9F12658FBA2B" name="zhangyanpeng审批" flowable:assignee="zhangyanpeng" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-F56A81C4-5E5E-4DEA-B708-B421A7327F50" sourceRef="sid-310BFAFD-7943-4E0C-8612-D876EB1A72AF" targetRef="sid-E13B17B0-2BDA-4716-9D8F-0864A555E446"></sequenceFlow>
  <inclusiveGateway id="sid-E13B17B0-2BDA-4716-9D8F-0864A555E446"></inclusiveGateway>
  <sequenceFlow id="sid-A72BCB0B-DD56-415E-8DF9-B8614FC6DFB7" sourceRef="sid-D7745F05-6DFB-4867-9F14-9F12658FBA2B" targetRef="sid-E13B17B0-2BDA-4716-9D8F-0864A555E446"></sequenceFlow>
  <userTask id="sid-0079B1F4-9C80-4DAB-841D-985DBE03586C" name="yue 审批" flowable:assignee="yue" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-0C2A0686-CE3B-4A13-9693-947CF193B797" sourceRef="sid-E13B17B0-2BDA-4716-9D8F-0864A555E446" targetRef="sid-0079B1F4-9C80-4DAB-841D-985DBE03586C"></sequenceFlow>
  <endEvent id="sid-105D25A5-42B1-4F47-BB02-F8017EFDF13E"></endEvent>
  <sequenceFlow id="sid-631AFA6F-40BC-4A9E-B670-C159067E8825" sourceRef="sid-0079B1F4-9C80-4DAB-841D-985DBE03586C" targetRef="sid-105D25A5-42B1-4F47-BB02-F8017EFDF13E"></sequenceFlow>
  <sequenceFlow id="sid-28B6240E-226C-4C88-9892-A610317226A0" name="大于 0 元" sourceRef="sid-1278BA7A-3F89-42DA-8FFD-BD22C6CC58A8" targetRef="sid-310BFAFD-7943-4E0C-8612-D876EB1A72AF">
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money > 0}]]></conditionExpression>
  </sequenceFlow>
  <sequenceFlow id="sid-9B2221C2-9E6E-409A-B6B4-F3348368821D" name="大于 500 元" sourceRef="sid-1278BA7A-3F89-42DA-8FFD-BD22C6CC58A8" targetRef="sid-D7745F05-6DFB-4867-9F14-9F12658FBA2B">
    <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money > 500}]]></conditionExpression>
  </sequenceFlow>
</process>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 启动流程
 * act_ru_task
 */
@Test
public void startProcessInstanceByKey3() {
    Map<String, Object> map = new HashMap<>();
    map.put("money", 600);
    runtimeService.startProcessInstanceByKey("InclusiveGatewayDemo", map);
}

/**
 * 完成任务
 * act_ru_task
 */
@Test
public void complete3() {
    String[] assignees = new String[]{"yueyazhui", "zhangyanpeng", "yue"};
    List<Task> list = taskService.createTaskQuery().taskAssignee(assignees[2]).list();
    for (Task task : list) {
        taskService.complete(task.getId());
    }
}
本文由作者按照 CC BY 4.0 进行授权