1.新建一个流程实例:
![](https://img.haomeiwen.com/i3717258/27c409e8f7aedec2.png)
模型名称:由用户自定义输入
模型分类:由用户自定义选择
模型key:需要使用审批流程的功能模块的实体类名称(比如请假流程,他的实体类为Leave)
模型描述:由用户自定义输入
2.解释审批流首界面属性含义:
![](https://img.haomeiwen.com/i3717258/da9e0beee3fa4837.png)
流程名称:生成的审批流png图片的后缀,就是一个标识
名称:生成审批流文件的前缀,就是一个标识
![](https://img.haomeiwen.com/i3717258/82f1e9878e7bcbeb.png)
描述:目前审批流实例描述
流程作者:由用户自定义输入
流程版本:目前这一版的bpmn.xml的版本,就是一个标识,不是流程模型的版本
目标命名空间:bpmn.xml中的targetNameSpace,用来区分bpmn.xml文件的,自定义输入即可
执行监听器:业务流程运行中监听整个开始,结束,连线(全局)
事件监听器:选择流程实例中的事件进行监听(一个流程实例中的所有内置事件)
信号定义:定义一些信号的引用给信号事件使用,就是让信号事件使用我这边定义的信号
![](https://img.haomeiwen.com/i3717258/096feda101636fa9.png)
![](https://img.haomeiwen.com/i3717258/3478536a8eb36cf7.png)
消息定义:定义一些消息的引用给消息事件使用,跟上面那个一样的
![](https://img.haomeiwen.com/i3717258/1222f2d87245b3be.png)
![](https://img.haomeiwen.com/i3717258/e9f924b911aeac7f.png)
3.线含义解释
![](https://img.haomeiwen.com/i3717258/4bf8f9d62f311578.png)
流向线:
![](https://img.haomeiwen.com/i3717258/1994e053756d56d5.png)
顺序流:也就是单向的连线,比较常用
![](https://img.haomeiwen.com/i3717258/6464cef2f1923d46.png)
关联流:跟具体的某个活动进行关联比如我那个补偿事件就是一个做关联用的
4.开始事件
![](https://img.haomeiwen.com/i3717258/afb30a7d7e97cd64.png)
id:当前这个活动的id,意思是什么呢就是一个Id标识相当于跟任务的key一样,必须唯一,不填内部生成一个sid拼接activiti内部规则生成的唯一id,并且有命名规则:要以字母或下划线或(-)字符开头,后接 XML 规范中允许的任意字母数字、重音字符、变音符号、句点 (.)、连字符(-)和下划线 (_) 的组合。
![](https://img.haomeiwen.com/i3717258/ea1811716efecf2b.png)
名称:由用户自定义输入,当前节点名称
描述:由用户自定义输入,当前节点描述
执行监听器:业务流程运行中监听整个开始,结束,连线(针对于当前这个节点)
发起人:由用户自定义输入(可以在监听器中做用户判断,一般没什么用)
自定义表单:也是由用户自己设置表单路径提供给后端代码做处理实现每个节点打开页面不同,目前功能未实现
动态表单属性:设置一些表单内部的一些字段的数据,目前功能未实现
5.用户任务
![](https://img.haomeiwen.com/i3717258/b3048818fb43421a.png)
任务监听器:监听目前任务节点的生命周期有代理人赋值阶段,创建阶段,完成阶段,删除阶段,后面给大家做实验
id:跟开始事件ID一样的,就不多讲解了
名称:由用户自定义输入,当前节点名称
描述:由用户自定义输入,当前节点描述
异步:跟定时器相关的操作,如果勾选了异步就代表你目前的这个任务不在主线程中执行,在子线程中执行,那
![](https://img.haomeiwen.com/i3717258/25c3fbaeabe74631.png)
独立:把目前这个异步的节点进行一个串行化,为什么会有这个独立这个东西存在呢,可以看下方解释
![](https://img.haomeiwen.com/i3717258/7590ea09b54852a9.png)
![](https://img.haomeiwen.com/i3717258/c50c85d726b3a689.png)
执行监听器:业务流程运行中监听整个开始,结束,连线(针对于当前这个节点),后面给大家做实验
任务多实例:多实例就跟写java代码使用for循环一样,目的把这个任务动态的根据集合分发给集合中设置的代理人,就是实现了个跟多人审批一样的操作
下方的这些属性我采用通俗易懂的讲解
基数(多实例): 定义创建分发任务的次数(写法:填数字就行了比如5),相当于for循环中的i,比如++i
集合(多实例): 定义创建分发任务的集合(写法:${bean.方法}),相当于for循环读取的那个List的集合
元素变量(多实例):定义集合的变量(写法:item),相当于for循环读取的集合中每一个元素的变量
完成条件(多实例):定义结束for循环的条件(写法:${bean.方法}),相当于for循环中的break
![](https://img.haomeiwen.com/i3717258/c8ee87c6378e60b2.jpg)
是否为补偿:标注目前任务为补偿任务,如果有任务出错触发了错误边界事件,会触发补偿任务进行补偿,需要搭配边界修正事件一起使用,其实说白了就在出错了再来一次。
![](https://img.haomeiwen.com/i3717258/7b23778b49c029c2.png)
代理人:由谁来处理这个任务,内部又分代理人,候选人,候选组,后面会给大家测试
自定义表单:也是由用户自己设置表单路径提供给后端代码做处理实现每个节点打开页面不同,目前功能未实现
到期日期:由用户自定义一个到期日期,这个日期数据是提供给后端代码做处理,目前功能为实现(注意采用iso-8601格式比如2021-04-18T15:30:00)
6.结束事件
![](https://img.haomeiwen.com/i3717258/66c4c54f89b79ce8.png)
id:跟开始事件ID一样的,就不多讲解了
名称:由用户自定义输入,当前节点名称
描述:由用户自定义输入,当前节点描述
执行监听器:业务流程运行中监听整个开始,结束,连线(针对于当前这个节点),后面给大家做实验
7.流向线
![](https://img.haomeiwen.com/i3717258/db4332076943b439.png)
id:跟开始事件ID一样的,就不多讲解了
名称:由用户自定义输入,当前节点名称
描述:由用户自定义输入,当前节点描述
流转条件:指定条件就行了,然后会根据条件是否走你这条线比如${num==5}
执行监听器:业务流程运行中监听整个开始,结束,连线(针对于当前这个节点),后面给大家做实验
默认流转:比如目前有3条线然后这三条线条件都为false,此时你其中一条勾选了默认流转,就会走你勾选了默认流转的那条线路,并且忽略掉这一条的流转条件
![](https://img.haomeiwen.com/i3717258/3bbaa52196aad097.png)
2.使用bpmn中的常用功能
![](https://img.haomeiwen.com/i3717258/ca8c83e5f15b3e7c.png)
新增了四个用户:小猫,小可爱,小狗,小猪
1.用户活动任务监听器,监听目前用户任务节点生命周期,创建,代理人赋值,完成,删除
![](https://img.haomeiwen.com/i3717258/1f984a5a85519c1b.png)
事件:代理人赋值时,创建,完成,删除四种,后面测试他们有什么区别
注意:类,表达式,委托表达式 3选一
类:实现了TaskListener接口的实现类,直接复制粘贴他的类全路径就好了
![](https://img.haomeiwen.com/i3717258/bf3977a948a9a791.png)
表达式:使用el表达式就行${bean.方法()}
委托表达式:使用实现了activiti内置的一些接口的bean比如实现了TaskListener的bean,此时直接使用bean的名字就可以了不需要再去调用方法了,activiti内部帮你调用了
![](https://img.haomeiwen.com/i3717258/e9b4d2bc57d2bcf5.png)
注意:需要给目前的类添加到spring容器中
![](https://img.haomeiwen.com/i3717258/955a64f195b94365.png)
字段:可以把目前设置的数据注入到类中的成员变量中去
![](https://img.haomeiwen.com/i3717258/ca68325307c5c5a0.png)
名称:类中的成员变量名称
![](https://img.haomeiwen.com/i3717258/3f804c7c85290336.png)
注意:数据这边有三个填入,只能使用一种
字符串:用FixedValue接收
![](https://img.haomeiwen.com/i3717258/f99c7bcbbbd90f29.png)
表达式:用Expression接收
![](https://img.haomeiwen.com/i3717258/9005157492514e7d.png)
生命周期顺序:如下
用户点击提交
![](https://img.haomeiwen.com/i3717258/ae758f7cfdb50ecc.png)
进入监听代理人赋值阶段
![](https://img.haomeiwen.com/i3717258/bbf9d52086e5a6ce.png)
进入监听用户任务创建阶段
![](https://img.haomeiwen.com/i3717258/a8686b6222d9462e.png)
用户点击审批目前任务
![](https://img.haomeiwen.com/i3717258/b69d6f4eef3c26eb.png)
进入监听用户任务完成阶段
![](https://img.haomeiwen.com/i3717258/f29a6203dac3216d.png)
进入监听用户任务删除阶段
![](https://img.haomeiwen.com/i3717258/14c195e89c594447.png)
2.用户活动执行监听器,监听你这个节点的启动,结束,还有一个是监听连线的,在线上面设置才有用
![](https://img.haomeiwen.com/i3717258/e7a205cc43464f21.png)
事件:监听节点的启动,监听节点的结束,还有一个是监听连线的,在线上面设置才有
其他的就不过多讲解了,上面都讲过了
用户点击提交
![](https://img.haomeiwen.com/i3717258/212b0fea9f27ae15.png)
进入监听节点启动阶段
![](https://img.haomeiwen.com/i3717258/ede5acc71c939851.png)
用户点击审批
![](https://img.haomeiwen.com/i3717258/7289d78cc2e55b07.png)
进入监听节点结束阶段
![](https://img.haomeiwen.com/i3717258/543428e00e022ed5.png)
还有一个是在连线上设置的
![](https://img.haomeiwen.com/i3717258/59ce1b68b194a0d7.png)
只要到达了这条线就会进入监听的方法
![](https://img.haomeiwen.com/i3717258/1202a135298c096c.png)
3.代理
![](https://img.haomeiwen.com/i3717258/0ed3fecf246d54f0.png)
代理人:可以设置目前用户名称比如,小狗
那此时到达这个节点是小狗用户就是处理人
候选人:可以设置多个用户用逗号隔开, 小狗,小可爱,小猫
那此时到达这个节点 小狗,小可爱,小猫 3人就会收到这个流程任务,然后其中一个用户处理了该任务其他用户那里的流程任务也会被删除,相当于就是一个多人审批其中其中一个审理了就过了
候选组:这里是选择项目中目前的角色,然后查询当前角色下的用户进行一个分发流程任务,目前这个功能未实现
![](https://img.haomeiwen.com/i3717258/f1bfbc78f8c1219f.png)
4.EL表达式用法
springBrean容器方式:{bean.getUserName('test')}
获取设置变量的方式: 有全局变量,跟局部变量
全局变量:整个流程实例执行中都可以拿到的
局部变量:针对于某个节点才能拿到
![](https://img.haomeiwen.com/i3717258/4342a93486942a54.png)
例如:${userUp.name}
5.常用的一些网关
![](https://img.haomeiwen.com/i3717258/66251e6cd0309d3f.png)
互斥网关:互斥网关的作用就是在多条线中只会选择一个线去执行,比如我两条线全部为True就会根据线的ID去比较看那个ID小就去执行那条线,两条线False也是一样的
![](https://img.haomeiwen.com/i3717258/18cc4f716325a5d2.png)
并行网关:并行网关的作用可以让多条线同时执行,不过会无视掉线中的条件,还可以进行一个多条线是否执行完毕统计
![](https://img.haomeiwen.com/i3717258/b984b186d4b2a753.png)
包含网关:内部实现了并行网关跟互斥网关两种网关,其实就是既支持执行多条线又支持有判断条件
![](https://img.haomeiwen.com/i3717258/60ee2a1f10aba940.png)
3.补充activiti定时器功能
1.首先需要添加定时器配置:
//启用异步执行器
config.setAsyncExecutorEnabled(true);
//激活异步执行器线程池(Activiti启动创建线程池)
config.setAsyncExecutorActivate(true);
//激活作业执行器(让定时器工作)
config.setJobExecutorActivate(true);
![](https://img.haomeiwen.com/i3717258/87b0c4bd286ad47c.png)
2.讲解定时器流程属性,基本有些定时器bpmn属性都是一样的,大家注意一些灵活应用:
这里讲解定时边界事件
![](https://img.haomeiwen.com/i3717258/9c5550381afb978c.png)
首先来了解iso-8601,克隆表达式就不讲了弄java的都是很常见的东西了
[R表示重复,S表示秒,M表示分,D表示天,P表示时间段(比如8点15分),T表示精确到时间的时间段(比如8点15分30秒)注意配合使用]
id:跟开始事件ID一样的,就不多讲解了
名称:由用户自定义输入,当前节点名称
描述:由用户自定义输入,当前节点描述
循环时间:第一个触发事件后,每隔多长时间再触发事件,这是一个持续的过程(目前支持两种格式iso-8601跟cron表达式)
iso-8601循环格式:R[循环次数][/开始时间]/时间间隔[/结束时间]
例子:[]的可以忽略不写
R4/2021-04-12T15:01/PT5S/2021-04-12T15:02:循环四次从2021年4月12日15点1分间隔5秒到2021年4月12日15点2分结束
R4/PT1M:循环四次间隔1分钟
开始时间: 指定开始的时间(目前只支持iso-8601)。
例子:规定日期和时间的组合表示时,要在时间前面加一大写字母T
2021-04-12T16:04:30:2021年4月12日下午4点30分30秒
持续时间:指定多长时间以后触发事件。如:15 分钟,2 天等(目前只支持iso-8601格式)
例子:不支持秒
P1D:代表1天后执行此时间定时器
P1H:代表1小时后执行此时间定时器
P1M:代表1分钟后执行此时间定时器
PT1M:代表1分钟后执行此时间定时器
结束时间:指定结束时间(目前只支持iso-8601)。
例子:规定日期和时间的组合表示时,要在时间前面加一大写字母T
2021-04-12T16:04:30:2021年4月12日下午4点30分30秒
取消活动: 默认true超时会直接取消这个定时器,为false,不取消,设置结束时间到了就会删除这个定时任务
3.实践操作:
具体定时器可以做很多事情,我这里为大家演示一般常用的审批代办提醒功能吧
配置邮件服务器:开启pop3,或者开启对应的邮件smtp服务器
![](https://img.haomeiwen.com/i3717258/f079f5acad7553d3.png)
配置邮件服务器:
![](https://img.haomeiwen.com/i3717258/57369556e4e815bb.png)
配置定时边界事件,循环4次间隔5秒
![](https://img.haomeiwen.com/i3717258/cf598faa75f2f033.png)
提交审批
![](https://img.haomeiwen.com/i3717258/1ff48394f6fc8381.png)
![](https://img.haomeiwen.com/i3717258/e6bf1cc9b8bf0d4b.png)
网友评论