文章目录
基本概念
什么是工作流
工作流:业务过程的部分或整体在计算机应用环境下的自动化
工作流管理系统:工作流的定义和管理,按照在系统中预定义好的工作流规则进行工作流实例的执行。
工作流管理系统的目标:管理工作流程以确保工作在正确的时间被期望的人员执行,在自动化进行的业务过程中插入人工的执行和干预。
什么是Activiti
Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台,其核心是使用Java开发的快速、稳定的BPMN2.0流程引擎。LCP采用的是Activiti 6.0版本
典型特点
数据持久化,底层使用MyBatis
引擎Service接口
原生支持Spring
流程设计器
分离运行时与历史数据
核心概念
英文
中文
描述
ProcessEngine
流程引擎
是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
ProcessDefinition
流程定义
基于bpmn2.0标准,使用Activiti提供流程建模工具,绘制的工作流程图。包含了流程属性,节点定义和判断分支
Activity/TaskDefine
活动/任务定义
流程定义中每一个任务节点的定义规范,包含名称,执行方式,表单变量等
ProcessInstance
流程实例
代表流程定义的执行实例,一个流程实例包括了所有的运行节点,表达了从刚开始到结束的最大流程分支。一个流程定义可以创建多个流程实例
Execution
流程执行
描述了流程执行的每一个节点。一个流程实例包含一个(串行)或多个(并行)流程执行
Task
流程任务
流程执行到某任务环节时生成的任务信息,一个流程执行可能生成零个或一个任务
Variable
流程变量
在流程执行或者任务执行的过程中传递的各类业务参数
核心服务
英文
中文
描述
RepositoryService
仓库服务类
管理流程定义。用于管理流程仓库,例如部署、删除、读取流程资源。仓库是指流程定义文档的两个文件:bpmn文件和流程图片。
IdentifyService
身份服务类
用户管理和查询用户、组之间的关系
RuntimeService
流程执行服务类
可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
任务服务类
可以从这个类中获取任务的信息
FormService
表单服务类
用于读取流程、任务相关的表单数据
HistoryService
查询历史信息服务类
在一个流程执行完成后,这个对象为我们提供查询历史信息,例如流程实例、任务、活动、变量、附件。
ManagementService
引擎管理服务类
和具体业务无关,主要可以查询引擎配置、数据库、作业等
业界参考
Activiti v5.21用户手册
Activiti v5.22数据库结构参考
绘制流程
使用Activiti提供的流程建模工具Activiti Modeler,完成流程图的绘制
流程图例
流程定义
名称
描述
是否常用
流程定义
为流程定义提供绘制区域
是
任务图例
名称
描述
是否常用
人工任务
表示需要人工去执行的任务
是
服务任务
不需要任何的人工干涉的自动执行的任务
是
接收任务
当任务接收到信号的时开始执行的任务
是
手工任务
手动任务定义了 BPM引擎之外的任务。用来对那些需要人来完成的工作进行建模。手工任务就是一个自动执行的任务。且无法使用taskservice查询
脚本任务
通过指定脚本(script )和脚本格式(scriptFormat)定义一个脚本任务。多用于Java代码无法满足的场景,或者后期系统维护
邮件任务
系统自动发送邮件的任务
业务规则任务
调用Drool规则引擎来执行的任务
Camel任务
调用Camel规则引擎来执行的任务
Mule任务
调用Mule服务总线来执行的任务
事件图例
名称
描述
是否常用
开始事件(均为捕获事件)
开始事件(空)
必须要人工去启动一个流程
是
开始事件(触发器)
在给定的时间点创建流程实例
开始事件(信号)
使用具名信号启动流程实例
开始事件(消息)
使用具名消息启动流程实例
开始事件(错误)
使用建模业务异常启动流程实例
边界事件(均为捕获事件,需附属于某个流程元素)
边界出错事件
捕获子流程中抛出的错误,流程从本事件的外出连线继续执行
边界定时事件
当流程到达节点时,定时器启动,捕获定时器事件并从本事件的外出连线继续执行
边界信号事件
全局捕获同名信号,流程从本事件的外出连线继续执行
边界消息事件
全局捕获同名消息,流程从本事件的外出连线继续执行
边界取消事件
捕获子流程中的事务取消动作,并等待所有补偿事件完成后,流程从本事件的外出连线继续执行
边界补偿事件
获取子流程中因取消(或其它原因)触发的补偿事件,流程从本事件的外出连线继续执行
中间事件(可以单独作为流程元素存在于流程中的事件)
捕获中间定时器事件
定时器启动,捕获定时器事件并从本事件的外出连线继续执行
捕获中间信号事件
全局捕获同名信号,流程从本事件的外出连线继续执行
捕获中间消息事件
全局捕获同名消息,流程从本事件的外出连线继续执行
抛出中间信号事件
当流程到达该事件时,全局抛出命名信号,其他引用了同名信号的捕获事件将被触发
抛出无触发的中间事件
当流程到达该事件时,全局抛出无定义的事件。不会触发任何捕获。多用于改变流程状态
结束事件(均为抛出事件)
结束事件(空)
到达该节点时流程引擎自动结束该流程实例
是
结束事件(出错)
到达该节点时流程引擎自动结束该流程/子流程实例,并抛出出错事件
结束事件(取消)
到达该节点时流程引擎自动结束该流程/子流程实例,并抛出出错事件
结束事件(终止)
到达该节点时流程引擎自动结束该流程/子流程实例,并先后抛出取消事件与补偿事件
网关图例
名称
描述
是否常用
单一网关
将所有出口顺序流按照它们定义的顺序进行计算。第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流定义为true)会被选择用于继续流程
是
并行网关
用于分支时,为每一个顺序流都创建一个并发分支;用于合并时,等待直到所有进入顺序流的分支都到达以后,流程通过本网关
是
包含网关
用于分支时,为每一个条件计算为true的顺序流都创建一个并发分支;用于合并时,等待直到所有进入顺序流的分支都到达以后,流程通过本网关
是
事件网关
为网关的每个外出顺序流连接一个中间捕获事件,基于事件判断选择第一个符合的进入后续的顺序流
结构图例
名称
描述
是否常用
子流程
一个包含了节点,网关,事件的流程,同时也是更大流程的一部份
子流程的事件
子流程所包含的各类事件
调用活动
在一个流程中调用另一个独立的流程
注释图例
名称
描述
是否常用
泳道
泳道
用于区分不同业务角色所承担的项目节点任务
区域
没有表头线的泳道
文档注释
文本关联
为界面各元素添加注释
连线图例
名称
描述
是否常用
顺序跳转线
不同活动节点执行的顺序
是
注释线
为元素关联文本说明
图例属性
公共属性
名称
描述
是否常用
ID
主键,全局唯一
是
名称
对象名称
是
事件监听器
在流程引擎执行的过程中触发某个事件时,事件监听器允许你去执行额外的java代码或者对指定的表达式求值。java代码需实现org.activiti.engine.delegate.event.ActivitiEventListener
接口
执行监听器
在流程实例执行的过程中触发某个事件时,执行监听器允许你去执行额外的java代码或者对指定的表达式求值。java代码需实现org.activiti.engine.delegate.ExecutionListener
接口
是
任务监听器
在流程任务执行的过程中触发某个事件时,任务监听器允许你去执行额外的java代码或者对指定的表达式求值。java代码需实现org.activiti.engine.delegate.TaskListener
接口
是
表单URL
当前界面元素所关联的PC端页面地址
是
表单属性
为关联页面预定义的表单属性以及对应的值
是
异步
在单独的线程/事务去执行
排它性
确保同一个流程实例的异步任务在同一个独立的线程里执行
流程定义
名称
描述
是否常用
ID
流程Key值
是
名称
流程描述
流程的描述说明
是
流程作者
流程的创建者名称
是
流程版本字符
流程版本号
是
目标命名空间
生成xml描述文件的命名空间
执行监听器
事件监听器
信号定义
定义当前流程的信号类型
消息定义
定义当前流程的消息类型
开始事件(无)
名称
描述
是否常用
ID
名称
执行监听器
表单URL
表单属性
人工任务
经改造,人工任务默认为多实例模式,以支持各类审批方式。
名称
描述
是否常用
ID
名称
审批方式
判定节点审批通过或不通过的计算方式
是
审批方式变量
审批方式计算的边界值设定
审批规则
节点办理人的选择规则
是
加签
在当前节点临时添加审批人
是
转交
将当前任务转移给其它人办理
是
拒绝后通知审批人
当流程中途中止时,将相关信息通知已参与流程审批的所有人
允许撤回
当前节点审批人,可将流程从下一节点回收至本节点
是
表单URL
表单属性
到期的日期
当前级点的办理有效期
优先级
节点办理优先级
任务监听器
执行监听器
服务任务/接收任务
名称
描述
ID
名称
异步
排它性
执行监听器
多实例类型
重复执行当前环节。None:无, Parallel:并行执行,Sequential:串行执行
基数(多实例)
重复执行的次数
集合(多实例)
循环的目标集合
元素的变量(多实例)
从循环取值使用的变量名
完成条件(多实例)
停止循环的条件计算表达式
作为补偿
配合补偿事件触发时执行的节点
类名(服务任务)
执行额外的java服务,java代码需实现org.activiti.engine.delegate.JavaDelegate
或org.activiti.engine.impl.delegate.ActivityBehavior
接口
表达式(服务任务)
通过UEL方法表达式指定执行额外的java服务,java代码需实现com.hand.hap.activiti.custom.IActivitiBean
接口
代理的表达式(服务任务)
使用类表达式指定执行额外的java服务,java代码需实现org.activiti.engine.delegate.JavaDelegate
接口
类的字段(服务任务)
实现为代理类的属性注入数据
变量名结果(服务任务)
将服务执行结果分配给已经存在的或新的流程变量
网关
名称
描述
是否常用
ID
名称
异步
排它性
流程顺序
判断计算的先后顺序
结束事件(无)
顺序跳转线
名称
描述
标例
是否常用
ID
名称
跳转条件
使用流程变量判断计算表达式
${isFixation == ‘Y’}
是
执行监听器
默认跳线
默认选择的线路
是
执行监听器
节点每被创建一次生成一个执行监听器。当流程存在并行时,或一个节点存在多实例模式时,将同时生成多个执行监听器
监听事件
名称
描述
是否常用
start
进入节点时触发
是
end
离开节点时触发
是
take
连接下一个元素时触发
代码绑定
名称
描述
示例
是否常用
类名
执行额外的java服务,java代码需实现org.activiti.engine.delegate.ExecutionListener
接口
com.fsl.ams.carrier.workflow.WorkFlowBaseListener
表达式
通过UEL方法表达式指定执行额外的java服务,java代码需实现com.hand.hap.activiti.custom.IActivitiBean
接口,方法将传入org.activiti.engine.delegate.DelegateExecution
类型参数
${repairSubmitListener.submit(execution)}
是
代理的表达式
使用类表达式指定执行额外的java服务,java代码需实现org.activiti.engine.delegate.JavaDelegate
接口
com.fsl.ams.carrier.workflow.WorkFlowBaseDelegate
属性注入
名称
描述
是否常用
字段名
注备执入注入的字段名称
字符串的值
静态单行字符串
字符串
静态多行字符串
表达式
从流程变量或者通过UEL方法表达式指定执行额外的java服务获取值
任务监听器
一个作业任务对应一个任务监听器。
监听事件
名称
描述
是否常用
create
创建任务时触发
是
assignment
分配任务时触发
complete
完成任务时触发
是
delete
删除任务时触发
代码绑定
名称
描述
示例
是否常用
类名
执行额外的java服务,java代码需实现org.activiti.engine.delegate.TaskListener
接口
com.fsl.ams.carrier.workflow.WorkFlowBaseListener
表达式
通过UEL方法表达式指定执行额外的java服务,java代码需实现com.hand.hap.activiti.custom.IActivitiBean
接口,方法将传入org.activiti.engine.delegate.DelegateTask
类型参数
${repairSubmitListener.submit(task)}
是
代理的表达式
使用类表达式指定执行额外的java服务,java代码需实现org.activiti.engine.delegate.JavaDelegate
接口
com.fsl.ams.carrier.workflow.WorkFlowBaseDelegate
属性注入
名称
描述
是否常用
字段名
注备执入注入的字段名称
字符串的值
静态单行字符串
字符串
静态多行字符串
表达式
从流程变量或者通过UEL方法表达式指定执行额外的java服务获取值
表单属性
为关联页面预定义的表单属性以及对应的值,以表单变量的方式存储。
名称
描述
是否常用
Id
表单属性的识别码
是
表单名
表单属性的描述
是
类型
表单属性的数据类型,目前支持string、long、boolean、date、enum
是
表达式
过UEL方法表达式指定执行额外的java服务
变量
从流程变量中获取值
日期模式
当选择date类型时,显示的日期格式
Id(枚举)
当选择enum类型时,逐个设定的枚举项的Id
是
名称(枚举)
当选择enum类型时,逐个设定的枚举项的名称
是
必需
参数是否不可为空
是
可读
参数是否可读
是
可写
参数是否可写
是
人工任务
人工任务面板上的各类属性,大部份均以表单属性的方式存储
|表单变量Id|表单名|类型|| |:—|:—|:—| |approveResult|approveResult|enum|审批按钮| |APPROVAL_STRATEGY|参见审批方式|string|审批方式| |WFL_NUM|实际值|string|审批方式变量| |APPROVAL_CANDIDATE_RULE|参见审批规则|enum|审批规则| |ACT_AUTO_CARBON_COPY|Y|string|拒绝后通知审批人| |ACT_REVOKE_ENABLE_FLAG|Y|string|允许撤回| |APPROVAL_ACTION| |enum|审批动作| |枚举Id|枚举表单名|备注|| |ADD_SIGN_FLAG|Y|加签|| |DELEGATE_FLAG|Y|转交||
审批按钮
隶属于approveResult
表单变量的枚举值
枚举Id
枚举表单名
备注
APPROVED
同意
默认内置,流程流转到下一节点
APPROVED
提交
功能和同意一致,可与APPROVED\_TO\_SUBMIT
表单变量配合使用
REJECTED
拒绝
默认内置,流程直接结束
REJECTED
撤销
功能和拒绝一致,可与REJECTED\_TO\_CANCEL
表单变量、hideCancelBtn
流程变量配合使用名随意
REBUT_FIRST
驳回
驳回到第一节点
REBUT_SELECT
指定驳回
驳回到已审批节点(特定某节点/选择可驳回节点)
ADD_SIGN
加签
单独配置,将流程转交给指定人审批,通过后再自行审批
DELEGATE
转交
单独配置,将流程转交给指定人代替本人审批
审批按钮扩展
表单变量Id
表单名
类型
备注
APPROVED_TO_SUBMIT
任意指定
string
和提交按钮一起使用,将审批记录同步调整显示为提交
REJECTED_TO_CANCEL
任意指定
string
和撤销按钮一起使用,将审批记录同步调整显示为撤销
REBUT_TO
指定驳回的节点key
string
和指定驳回一起使用,直接驳回到设置的节点
CANNOT_REBUTED
不允许被驳回
string
和指定驳回一起使用,表示该节点不可被选择驳回
审批方式
人工任务默认采用多实例
的方式实现了会签。多实例变量如下
变量名
描述
nrOfApproved
同意的数量
nrOfRejected
拒绝的数量
nrOfInstances
总数量
WFLNUM
通过比例标准
审批方式如下
代码
描述
通过条件
备注
ONE_APPROVAL
任一人同意
${nrOfApproved>0}
改名
ONE_APPROVAL_OR_REJECT
任一人同意或者拒绝
${ nrOfApproved>0
ALL_APPROVAL
全部同意
${nrOfRejected>0}
改名
ALL_APPROVAL_OR_REJECT
全部同意或者拒绝
${nrOfApproved ==WFL_NUM
PROPORTION_PERSON
一定比例同意
${nrOfApproved/nrOfInstances>=WFL_NUM
PROPORTION_PERSON_A_O_R
一定比例同意或者拒绝
${nrOfApproved/nrOfInstances>=WFL_NUM
FEW_PERSON
一定人数同意
${nrOfApproved >=WFL_NUM
FEW_PERSON_APPROVAL_OR_REJECT
一定人数同意或者拒绝
${nrOfApproved >=WFL_NUM
WFL_CHAIN
外挂审批链
WFL_CHAIN
审批规则
通用规则
|代码|描述|表达式|是否传参|参数描述| |:—|:—|:—|:—| |逐级审批||||| |SUBMITTER|申请者自己| i n i t i a t o r ∣ 否 ∣ 查 找 申 请 者 工 员 编 码 审 批 ∣ ∣ U N I T _ C H I E F ∣ 部 门 领 导 ∣ {initiator}|否|查找申请者工员编码审批| |UNIT\_CHIEF|部门领导| i n i t i a t o r ∣ 否 ∣ 查 找 申 请 者 工 员 编 码 审 批 ∣ ∣ U N I T _ C H I E F ∣ 部 门 领 导 ∣ {empService.getDeptDirector(depEmpCode)}|是|传入指定员工编码,按序查找选择"派驻"、“挂职锻炼”、“借调”、“支援"的非主岗。如果以上都不存在,则查找其主岗。之后查找所选岗位对应的部门,如果存在主持人的,由主持人审核,否则由主要负责人审核| |PARENT_UNIT_CHIEF|上级部门领导| e m p S e r v i c e . g e t P a r D e p t D i r e c t o r ( s u p E m p C o d e ) ∣ 是 ∣ 传 入 指 定 员 工 编 码 , 按 序 查 找 选 择 " 派 驻 " 、 " 挂 职 锻 炼 " 、 " 借 调 " 、 " 支 援 " 的 非 主 岗 。 如 果 以 上 都 不 存 在 , 则 查 找 其 主 岗 。 之 后 查 找 所 选 岗 位 对 应 部 门 的 上 级 部 门 , 如 果 存 在 主 持 人 的 , 由 主 持 人 审 核 , 否 则 由 主 要 负 责 人 审 核 ∣ ∣ A P P O I N T E D _ P A R T _ F I R S T ∣ 优 先 指 定 部 门 分 管 领 导 ∣ {empService.getParDeptDirector(supEmpCode)}|是|传入指定员工编码,按序查找选择"派驻"、"挂职锻炼"、"借调"、"支援"的非主岗。如果以上都不存在,则查找其主岗。之后查找所选岗位对应部门的上级部门,如果存在主持人的,由主持人审核,否则由主要负责人审核| |APPOINTED\_PART\_FIRST|优先指定部门分管领导| e m p S e r v i c e . g e t P a r D e p t D i r e c t o r ( s u p E m p C o d e ) ∣ 是 ∣ 传 入 指 定 员 工 编 码 , 按 序 查 找 选 择 " 派 驻 " 、 " 挂 职 锻 炼 " 、 " 借 调 " 、 " 支 援 " 的 非 主 岗 。 如 果 以 上 都 不 存 在 , 则 查 找 其 主 岗 。 之 后 查 找 所 选 岗 位 对 应 部 门 的 上 级 部 门 , 如 果 存 在 主 持 人 的 , 由 主 持 人 审 核 , 否 则 由 主 要 负 责 人 审 核 ∣ ∣ A P P O I N T E D _ P A R T _ F I R S T ∣ 优 先 指 定 部 门 分 管 领 导 ∣ {empService.queryPartPerson(empCode)}|是|传入指定员工编码,按序查找选择"派驻”、“挂职锻炼”、“借调”、"支援"的非主岗。如果以上都不存在,则查找其主岗。之后查找所选岗位对应部门,如果存在分管领导的,由分管领导审批,否则查找上级部门。如果存在主持人的,由主持人审核,否则由主要负责人审核| |UNIT_CHIEF_DEPT|部门领导| e m p S e r v i c e . g e t D i r e c t o r B y D e p t ( d i r D e p t C o d e ) ∣ 是 ∣ 传 入 指 定 部 门 编 码 , 如 果 存 在 主 持 人 的 , 由 主 持 人 审 核 , 否 则 由 主 要 负 责 人 审 核 ∣ ∣ P A R E N T _ U N I T _ C H I E F _ D E P T ∣ 上 级 部 门 领 导 ∣ {empService.getDirectorByDept(dirDeptCode)}|是|传入指定部门编码,如果存在主持人的,由主持人审核,否则由主要负责人审核| |PARENT\_UNIT\_CHIEF\_DEPT|上级部门领导| e m p S e r v i c e . g e t D i r e c t o r B y D e p t (