背景介绍
在快速入门中,我们将会为您展示一个简单的案例,通过这个案例,你将了解到以下内容:
- 如何为流程定义“变量”
- 如何定义自己的工作流跳转规则
- 如何绘制流程图
- 如何在审批时看到单据的表单
我们假设有这样一个场景,在公司日常办公中,员工可能会需要向公司申请采购一些办公用品,现在假设员工有一个入口提交自己的采购申请,然后由采购人员确认生成订单,如果订单金额大于1000块钱则需要采购总监二次确认,采购人员确认完成之后订单会发送至财务人员,财务审核完成之后会拨款给采购人员,采购人员可以进行采购,如果预算不足采购可以重新提交预算由财务审批,采购之后采购人员会将物品交给提交申请的员工确认,员工确认之后,采购上传采购物品的发票,然后财务确认后会扣除剩余拨款金额,最终流程结束。
前置需求
- 在进行上述需求的实现之前,我们首先定义几个用户:
- 定义组织架构
- 定义员工
- 然后给员工分配用户和岗位
员工姓名 | 用户名称 | 岗位名称 |
---|---|---|
员工A | 员工A | 研发主管 |
采购A | 采购A | 采购员 |
采购总监A | 采购总监A | 采购总监 |
财务A | 财务A | 财务 |
定义流程分类
在完成上述的准备之后,我们继续看工作流,首先我们需要定义一个流程分类用于划分我们的流程。流程分类的作用有以下几点:
- 对流程进行归类
- 定义分类下的公共变量
在此示例中,我们定义如下的流程分类:
在流程分类中我们定义了两个流程变量
:quantity
和unitPrice
,分别表示采购的数量和单价,这两个变量我们可以认为是采购分类下所有的流程都必须要有的变量。
定义流程单据
在完成流程分类的定义之后,我们继续定义流程单据,流程单据的目的是将一个流程模型化,流程分类的作用有以下几点:
- 关联流程分类
- 定义流程的特有变量
- 定义流程的展示表单(流程在审批时展示当前审批内容信息的页面)
在此示例中,我们定义如下的流程单据:
在流程单据中,我们定义了一个叫办公用品
的流程单据,在单据下我们定义了一个变量produceName
,我们假设这个变量是这个分类特有的,假设还有其他的分类如商务出行
,在这个单据下可能会有它特有的变量如出发地点
、目的地
和出行方式
等。
除了这个流程变量之外,我们还能看到还有两个流程表单,流程表单是在人工审批时用来展示当前审批内容信息的页面,我们在这里定义了两个表单,一个是能够用来编辑订单信息的表单,另一个是仅仅只用来展示的只读表单,在绘制流程时我们可以将表单与人工节点进行关联。除了上图展示的方式之外,流程表单还有其他的规则来定义,详情请参考用户手册流程单据中对流程表单的详细描述。
值得一提的是在流程表单中有一段内容是${processInstaceBusinessKey}
,这个代表是的当前流程中的业务主键
,是工作流与外部业务关联的一个标识,关于业务主键的概念我们在后面的流程详细介绍。
定义跳转条件
在之前的背景介绍中,我们提到了一个条件是“如果订单金额大于1000,那么需要采购总监审批”,在这个条件中我们,订单金额可以由我们之前定义的“单价”和“数量”两个变量来确定。跳转条件是在服务定义
菜单中定义的,服务定义是将工作流的流程定义中的通用内容进行整合,减少重复操作和简化配置。在服务定义中新建,我们可以看到有四种类型的服务定义,关于每一种类型的用途和详细描述可以在用户手册服务定义中查看。在这里我们选择跳转条件
。跳转条件的主要作用就是:
- 确定流程的走向
在此示例中,我们定义如下的跳转条件:
在流程单据中,我们首选需要选择服务类别为跳转条件
,然后需要选择服务方式为表达式
,这里能够看到服务任务分了两种方式,一种是远程调用
,也就是说这个跳转条件的结果需要通过某个接口的返回值确定,调用的接口需要在接口定义中定义,关于接口定义和远程调用的详细说明可以参考用户手册,表达式就是一个由变量、常量以及运算符等字符构成的可以计算的表达式,一般表达式会分两种用途,一种是值表达式,用来计算一个结果;一种是方法调用,用来执行某个过程。在跳转条件中,我们需要使用值表达式,并且他的结果值只能是“真”和“假”,关于表达式的详细描述,可以查看服务定义的操作手册部分。在参数
这个表格中,我们定义了两列,每一行可以理解为一个子表达式,比如序号为1
的这一行定义了单价和数量相乘的结果,序号为2
的这一行定义了一个常量1000
,在表达式中,通过对子表达式的组合,来完成表达式的定义。在表达式之后还有一个执行表达式
,这个执行表达式就是由表达式和参数表格计算出来的最终交由Activiti引擎计算的表达式。
定义服务任务
在背景介绍中,我们有一个需求是在财务第二次审核完成之后扣除剩余拨款。很明显这个操作是属于业务个性化的操作,那么如果在工作流中如何实现这种个性化的操作呢?我们需要借助接口定义和服务任务这个功能来完成。
- 首先,我们需要在业务服务中实现这个功能,然后提供一个接口。
- 在工作流的接口定义中定义接口,假设我们已经完成了接口开发,然后我们在工作流接口定义中做如下定义:
- 在工作流的服务任务中定义服务任务,服务任务中选择远程调用,表示我们这个任务会调用一个远程接口,选择上一步定义的接口之后,我们需要定义接口参数,订单唯一标识这个参数对应工作流的业务主键(该工作流与外部业务关联的一个标识),租户标识选择工作流的租户标识,定义如下图所示:
定义流程
在完成这些基础定义之后,我们开始绘制流程图,流程图决定了流程的内容,我们首先需要新建流程定义,如下图所示:
流程分类和流程单据选择我们之前定义好的分类和单据,这里有一个可选项描述
,描述中我们可以使用表达式来让描述变成一段动态的文本,这里使用了一个${initiator}
表达式,这个表达式代表的就是流程的发起人,另一个表达式${productName}
代表的是在流程单据中定义的变量“产品名称”。
新建流程定义之后,我们点击流程定义列表行上的编辑
按钮就可以跳转到工作流的编辑页面。在开始绘制流程图之前,我们先来简单介绍一下工作流的编辑器。
流程编辑器
工作流编辑器主要分为四块区域。
- 最上方为
工具栏
,工具栏中主要包含一下帮助绘制流程图的快捷操作,常用的操作有保存、删除、添加(减少)顺序流的拐点等,关于工作流编辑器的工具栏部分,详细内容可以查看操作手册。工具栏如下图所示:
- 左侧为
流程节点
的图形标注区域,这些图形都是由BPMN2.0
协议定义的,开始/结束节点用于标识一个流程的开始和终止,一个流程可以有多个结束节点,但一般却只能有一个开始节点。除了开始和结束之外,常用的节点由人工任务和服务任务,人工任务表示一个需要人工干预的节点,比如审批,服务任务标识一个由计算机自己执行的活动,比如发送消息之类的。关于流程编辑器节点的详细内容可以查看操作手册。流程节点如下图所示:
- 右侧为
属性面板
,在属性面板中可以看到流程节点的全部属性,点击空白地方展示的是整个流程的属性,例如名称、编码和描述等,也就是在流程编辑器中也可以编辑流程图的描述。关于不同流程节点的属性描述,可以查看操作手册。属性面板如图所示:
- 中间的空白区域为流程图的
绘制面板
,可以通过拖拽的方式将流程节点拖拽到绘制面板中,点击面板中的流程节点可以看到推荐的下一步操作,点击这些快捷操作就能快速的绘制流程图。
绘制流程图
在大概了解工作流的编辑器之后,我们来绘制流程图,按照我们之前的业务背景,绘制出来的流程图如下图所示:
- 开始节点
首先我们新建一个开始节点,在开始节点中,需要注意的是我们要在这里的表单属性中选择我们之前在流程单据
中定义的只读表单,开始节点中的流程表单用于我参与的/发起的/抄送的流程
功能中展示的表单,详细定义如下图所示:
- 员工确认申请
下一步我们选择一个人工节点,在这一步中我们需要让提交申请的员工确认自己的申请,所以在审批规则中,我们选择申请人自己
,然后审批动作勾选审批同意
和审批拒绝
,因为是自己提交的申请,所以没必要催办,我们去掉默认勾选的允许催办
,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 采购员确认
下一步我们选择一个人工节点,在这一步中我们需要让采购员确认员工提交的申请,所以在审批规则中,我们选择指定岗位-采购员
,然后审批方式选择一票通过或拒绝
(任一个人审批之后结束),采购员确认时可能会向申请人或者其他员工征求一些意见,所以我们这里勾选加签
按钮,在采购员审批时,采购员就可以选择加签按钮,然后指定一个员工,该员工提供一些意见之后返回采购员让采购员继续审批,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 金额大于1000
下一步我们需要做一个判断,这里条件比较简单,我们直接在人工节点上选择顺序流(也可以使用单一网关),然后条件选择我们之前定义的跳转条件,详细定义如下图所示:
- 金额小于等于1000
除了金额大于1000之外,还有一种情况就是金额小于等于1000,这里我们直接可以借助工作流的默认跳线来实现,默认跳线就是不满足其他的顺序流时的选择(需要注意默认跳线和跳转条件不能同时选择),详细定义如下图所示:
- 采购总监审批
金额大于1000时,我们选择一个人工节点,在这一步审批规则我们选择指定岗位-采购总监
,然后审批方式选择一票通过或拒绝
,审批动作同样勾选上加签
,因为是高级岗位,我们去掉允许催办
按钮,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 财务审核
下一步我们选择一个人工节点,在这一步中我们需要让财务人员审核我们的订单,所以在审批规则中,我们选择指定岗位-财务
,然后审批方式选择一票通过或拒绝
,然后审批动作我们继续勾选加签,财务审核之后我们一般不允许撤回,所以我们去掉允许撤回
,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 采购
下一步我们选择一个人工节点,在这一步中我们需要让采购人员去采购,所以审批规则选择指定岗位-采购员
,审批方式选择一票通过或拒绝
,然后审批动作我们继续勾选加签,然后在流程表单中选择我们的审批表单,取消勾选已审批自动同意,详细定义如下图所示:
- 预算不足
在采购人员确认时,采购人员可以拒绝单据,重新回到采购员确认,然后调整价格,所以这里我们在顺序流中选择审批拒绝
,详细定义如下图所示:
- 采购结束
采购员采购成功后,采购结束,这里同之前一样,我们继续采用默认跳线的方式来实现采购结束,详细定义如下图所示:
- 员工确认
下一步是员工确认节点,我们继续选择人工节点,然后审批规则选择申请者自己
,然后在流程表单中选择我们的审批表单,取消勾选已审批自动同意,详细定义如下图所示:
- 不符合预期
员工确认不符合预期需要采购员重新采购,我们选择顺序,指定审批拒绝时返回采购节点,详细定义如下图所示:
- 员工确认结束
员工如果确认没有问题,进入下一个节点,这里我们继续使用默认条线,详细定义如下图所示:
- 采购上传发票
下一步我们选择人工节点,这个节点由采购人员上传采购发票,所以审批规则选择指定岗位-采购员
,审批方式选择一票通过或拒绝
,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 财务审核
下一步我们选择人工节点,这个节点由财务人员审核采购发票,所以审批规则选择指定岗位-财务
,审批方式选择一票通过或拒绝
,然后在流程表单中选择我们的审批表单,详细定义如下图所示:
- 审核错误
如果财务审核发票时发现错误,需要拒绝然后然采购重新上传,我们选择顺序,详细定义如下图所示:
- 审核结束
财务审核没有问题之后,继续向下执行,这里我们继续使用默认条线,详细定义如下图所示:
- 扣除剩余费用
流程结束后,需要扣除财务拨款的剩余金额,这一步无需人工干预,所以我们选择服务任务,在服务任务下拉列表中选择我们之前定义的服务任务,详细定义如下图所示:
- 结束
在扣除费用之后,流程结束,这里我们选择结束节点,详细定义如下图所示:
部署流程
按照上一步的介绍,完成工作流的定义之后,我们回到流程定义的列表页,这流程定义的操作列中,我们能够看到由几个选项:
- 下载:将刚刚定义的流程图使用XML的格式导出来(BPMN2.0)
- 部署:将定义好的流程部署,部署操作相当于生成一个版本记录,同一个版本的多个流程不会互相影响,也就是运行中如果有人改了流程定义重新部署,之前的工作流不会受到影响。
- 部署记录:查看流程部署的时间和版本记录
- 删除:删除流程
在定义好流程之后,我们这里选择部署,部署完成之后,我们可以在部署记录中看到相关信息:
启动流程
现在假设已经实现了一个业务功能,员工可以提交一张采购订单,然后这个订单需要执行我们之前定义的工作流,一般来说在生成订单的时候,后端程序会自动启动工作流,这里我们为了做演示,我们在流程启动
功能中手动启动一个工作流:
通过上图所示的参数,即可启动我们之前定义的工作流,模拟用户是一个可空的参数,表示用哪个员工发起工作流,如果不指定,默认使用当前登录用户来启动工作流,我们使用我们之前定义的“员工A”来启动,业务主键参数就是工作流与外部业务关联的唯一标识,这里我们使用订单ID,流程定义选择我们之前部署的流程(如果没有部署 ,这里无法选择或者选择到的不是最新的),在选择流程定义之后,会自动带出流程的参数,这里我们使用图中所示的示例参数。
流程监控
启动工作流之后,可以在流程监控页面看到我们刚刚启动的工作流,我们可以看到流程的状态,还有当前节点以及申请人信息,点击详情也可以查看工作流的详细内容,关于流程监控的更多内容可以查看操作手册。
我发起的流程
我发起的流程
菜单中展示的是由当前用户启动的流程,然后我们登录员工A
的账号,在我发起的的流程
中,我们也可以看到刚刚我们启动的流程,在流程进行审批之前,我们还可以撤销流程,点击详情进入详情页面,在审批表单这一栏中,我们能够看到我们定义的只读表单(开始节点关联的表单),如下图所示:
在下方审批历史这个Tab页中我们能够看到流程每个节点的审批历史,如下图所示:
在流程图Tab页中,我们能够看到我们之前定义的流程图,并且在流程途中不同的元素使用不同的颜色标注,下面对标注的颜色进行说明:
- 绿色:已经执行过的节点
- 蓝色:选择执行的顺序流
- 灰色:未执行的节点或者顺序流
- 橙色:预测可能会执行的顺序流,预测功能会展示当前还未执行,但程序动态预估会执行的顺序流,橙色的顺序流回随着审批的进行动态的变化
流程如图如下图所示:
鼠标悬浮在对应的节点之后,会展示该节点的审批人信息,如下图所示:
我的待办事项
我的待办事项
菜单中会展示需要当前用户审批的工作流任务,需要注意的是,与我发起的流程不同,这里展示的维度是任务,也就是我们在流程图中定义的每一个人工任务。按照我们之前的定义,我们需要登录员工A
、采购A
、采购总监A
、财务A
等的账号来完成我们的工作流。当相应的人员做出审批操作之后,工作流就会流向下一个节点,然后节点对应的人将在我的待办事项
中看到相应的人工任务。详情页面展示内容与我发起的流程
相同,唯一不同的是展示的审批表单是可编辑的(对应的人工节点关联的表单),如下图所示:
员工A
审批通过,意见:确认采购采购A
审批通过,意见:采购员同意采购采购总监A
审批通过,意见:采购总监同意采购财务A
审批通过,意见:财务审核通过采购A
审批通过,意见:完成采购员工
审批通过,意见:员工确认完毕采购A
审批通过,意见:采购上传采购发票,上传发票附件财务A
审批通过,意见:发票审核通过
通过上面的步骤,我们就可以完成我们的审批流程,此时我们再回到员工A
,查看我发起的流程,可以看到我们之前的审批历史: