博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排他网关(ExclusiveGateWay)
阅读量:4308 次
发布时间:2019-06-06

本文共 6729 字,大约阅读时间需要 22 分钟。

网关(ExclusiveGateWay)

作者:邓家海

2018年3月11日 00:13:25

情景:

某一家公司最近在给一个单位做一个财务审批的OA。具体需求是这样的:当部门申请的金额小于一万块的时候,财务部可以直接决策。当部分申请的金额大于一万块并且小于三十万的时候,财务部经理决策,当金额超出了或者等于三十万的时候,需要财务主管来决策。那么我们的工作流应该如何设计呢?
也许有人会说,这不简单,小于一万直接发送到财务部,大于一万小于三十,直接给财务经理。其他就发给财务主管。
你是否注意到,其实这样字可以存在审批漏洞。打个比方,我跟部门一个哥们非常好,我又想申请大于一万的经费。我是不是可以直接越过领导发送给我哥们,让他给我放款。再或者,来了一个新人,新人并不知道这个申请的规则,申请几块钱,也发给了财务主管,财务主管非常生气的说:我很忙的,没空给你处理这些蒜皮小事。
分析:
工作流的作用无非就是自动化,规范化。形成一整套的流程。制定好一些列规则后,能够严格遵守这些规则来处理任务。很多一些国产的工作流很灵活,但是审核机制或者工作机制很不严谨。我是不怎么理解这些工作流中国化的。当然,客户是上帝,客户说了算。我们这里以BPMN2.0的标准。就可以使用排他网关来实现我们的需求。
关于排他网关:
1. 排他网关exclusive gateway 经常使用流程变量决定流程下一步要选择的路径
2. 排他网关(也叫异或网关 XOR gateway,或者更专业的,基于数据的排他网关 exclusive data¬based gateway),用于为流程中的决策建模。
3. 当执行到达这个网关时,所有出口顺序流会按照它们定义的顺序进行计算。条件计算为true的顺序流(当没有设置条件时,认为顺序流定义为true)会被选择用于继续流程。
4. 用排他网关时,只会选择一条顺序流。当多条顺序 流的条件都计算为true时,其中在XML中定义的第一条(也只有这条)会被选择,用于继续流程。如果没有可选的顺序流,会抛出异常。
5. 排他网关,用内部带有’X’图标的标准网关(菱形)表示,'X’图标代表异或(XOR)的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中,混合使用带有及没有X的菱形标志
6. 一个排他网关对应一个以上的顺序流

图1 排他网关

说明:网关是一个菱形◇,排他网关就是菱形里面加个'X’,'X’图标代表异或(XOR)的含义

图2 默认顺序流

说明:默认顺序流,用起点带有“斜线”标记的一般顺序流表示。

活动的默认顺序流,由该活动的default属性定义。
当其他连线计算都为false的时候,才会走默认顺序流。

排他网关的实现:

关于资金申请审批流程。

步骤一:设计流程图
我们这里设置一个发起部门,就是资金发起申请部门
流程申请的流程:
1. 小于或者等于一万的,直接走财务审批即可
2. 大于一万小于三十万的,需要财务经理审批。
3. 大于或者等于三十万的,需要爱财务主管审批。

图3 排他网关设计

步骤二:并设置表达式

Activiti里面设置表达式可以用EL(Expression Language)表达式。。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。EL不在本章节的讨论范围内,需要了解的可以自行找资料。

1、语法结构
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${ user. My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量

表达式一:${money>1&&money<30}

 

图4 设置表达式

表达式二:${money>=30}

 

图6 设置表达式

无表达式:默认

默认是指其他其他条件都不满足的条件下,走默认路线。

 

图7 设置表达式

流程图代码:

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1&&money<30}]]>
19
20
21
=30}]]>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

 

步骤三:测试

1).如果是大于1万小于30万

完成任务代码

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="377542"; 6 Map
variables=new HashMap
(); 7 variables.put("money", 20); 8 processEngine.getTaskService()//与正在执行的案例管理相关的Service 9 .complete(taskId,variables);10 11 System.out.println("完成任务,任务ID:"+taskId);12 }

 

 

图8 测试流程跟踪

2).如果是大于或者等于30万

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="385053"; 6 Map
variables=new HashMap
(); 7 variables.put("money", 40); 8 processEngine.getTaskService()//与正在执行的案例管理相关的Service 9 .complete(taskId,variables);10 11 System.out.println("完成任务,任务ID:"+taskId);12 }

 

 

图9 测试流程跟踪

3).如果是小于1万(没有满足条件的,走默认路径:财务):

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="385048"; 6 Map
variables=new HashMap
(); 7 variables.put("money", 0.2); 8 processEngine.getTaskService()//与正在执行的案例管理相关的Service 9 .complete(taskId,variables);10 11 System.out.println("完成任务,任务ID:"+taskId);12 }

 

 

图10 测试流程跟踪

4).如果没有设置金额

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="385048"; 6 //Map
variables=new HashMap
(); 7 //variables.put("money", 0.2); 8 processEngine.getTaskService()//与正在执行的案例管理相关的Service 9 .complete(taskId);10 11 System.out.println("完成任务,任务ID:"+taskId);

 

会抛一个异常:Unknown property used in expression: ${money>1&&money<30}

org.activiti.engine.ActivitiException: Unknown property used in expression: ${money>1&&money<30}

5).如果没有默认顺序流,又没有满足的条件(2000)

 

图11 测试流程图设计

 

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="385022"; 6 Map
variables=new HashMap
(); 7 variables.put("money", 0.2); 8 processEngine.getTaskService()//与正在执行的案例管理相关的Service 9 .complete(taskId,variables);10 11 System.out.println("完成任务,任务ID:"+taskId);12 }

 

会抛异常:No outgoing sequence flow of the exclusive gateway

org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'sid-8E4A81E5-2B71-4397-A8F1-242C7B0F4DC9' could be selected for continuing the process

扩展:

假如我部门是确定了,但是我的金额可能是随时变动的,那么有两种方案第一种,全部动态表达式:

财务经理:
${money>num2&&money<num3}
财务主管:
${money>=num1}
财务:
${money<num4}

1 /**完成我的任务*/ 2 @Test 3 public void completeMyPersonalTask(){ 4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 5 String taskId="385063"; 6 Map
variables=new HashMap
(); 7 variables.put("money", 40); 8 variables.put("num1", 30); 9 variables.put("num2", 1);10 variables.put("num3", 30);11 variables.put("num3", 1);12 processEngine.getTaskService()//与正在执行的案例管理相关的Service13 .complete(taskId,variables);14 15 System.out.println("完成任务,任务ID:"+taskId);16 }

 

 

图12 测试流程跟踪

第二种,后台判断

设置表达式:
财务经理:
${flow==”1” }
财务主管:
${flow==”2” }
财务:
${flow==”3” }

1 @Test 2 public void completeMyPersonalTask(){ 3 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 4 String taskId="385072"; 5 Map
variables=new HashMap
(); 6 int money=40; 7 if(money>=30){ 8 variables.put("flow", "1"); 9 }else if(money>1&&money<30){10 variables.put("flow", "2");11 }else{12 variables.put("flow", "3");13 }14 processEngine.getTaskService()//与正在执行的案例管理相关的Service15 .complete(taskId,variables);16 17 System.out.println("完成任务,任务ID:"+taskId);18 }

 

图13 测试流程跟踪

  Activiti交流QQ群:634320089

转载于:https://www.cnblogs.com/dengjiahai/p/8542929.html

你可能感兴趣的文章
数据结构与算法6—树
查看>>
.net mvc 超过了最大请求长度 限制文件上传大小
查看>>
PDU与SDU理解
查看>>
linux分盘笔记
查看>>
606. Construct String from Binary Tree
查看>>
[iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10
查看>>
Flex布局
查看>>
峰Redis学习(8)Redis 持久化AOF方式
查看>>
spring指导的index.html在spring文件夹中的位置
查看>>
12.6今日任务
查看>>
Debian8.3.0下安装Odoo8.0步骤
查看>>
Maven 3-Maven依赖版本冲突的分析及解决小结
查看>>
Lists
查看>>
WPF 关于鼠标事件和坐标
查看>>
100个直接可以拿来用的JavaScript实用功能代码片段
查看>>
[转]Design Pattern Interview Questions - Part 2
查看>>
winform错误提示 :窗口类名无效(Window class name is not valid)
查看>>
[STemWin教程入门篇]第一期:emWin介绍
查看>>
编译原理
查看>>
GIT 常用命令
查看>>