开始使用 BPM
本章节介绍如何建模以及运行简单的业务流。
假设我们想要创建一个报销流程。
有三方需要参与这个流程:
-
需要报销的职员;
-
能审批报销的经理;
-
给职员转账的会计。
我们将创建的模型:

流程建模
启动应用程序并打开 BPM → Modeler(建模器) 界面。
当建模器第一次打开时,右侧的属性面板展示流程本身的属性。修改下列字段:
-
Process id:
reimbursement
-
Name:
Reimbursement

在属性面板找到 Documentation(文档) 文本域,然后编写一段流程描述。

创建开始表单
在画布上点击 StartEvent
元素。属性面板则会展示其属性。
Form(表单) 部分填写的内容是会在用户启动流程之后展示给用户的。我们指定 Input dialog(输入对话框) 作为流程启动的表单。

然后我们需要指定在输入对话框内给用户展示的参数。
点击 + 按钮,然后在 Input dialog parameter edit(输入对话框参数编辑器) 窗口中创建一个 requestNumber
参数,有下列属性:
-
Caption(名称) - 请求编号
-
Type(类型) - String
-
Editable(可编辑) - true
-
Required(必选) - true

再创建三个输入对话框参数:
-
expenseAmount
(类型是Decimal (double)
,可编辑且必需) -
expenseDate
(类型是Date
,可编辑且必需) -
document
(类型是File
,可编辑且必需)
之后,再创建一个输入对话框参数 manager
,类型为 Entity
,可编辑且必需。选择 User
实体名称。指定 UI 组件为 ComboBox
,方便用户选择。我们将 JPQL 查询字段留空,这样会使用默认的 select e from smpl_User e
查询语句。
在输入对话框参数列表的下方 Business key(业务键值) 字段,选中 requestNumber
。业务键值是一个流程实例的特定领域标识符。
添加完所有参数之后,Form 部分将展示如下:

流程启动之后,输入对话框参数会保存在对应的流程变量中。
创建审批用户任务
我们开始创建 Approval(审批) 用户任务。在画布中选中开始事件节点,展示弹出菜单。点击 Append task 按钮。

然后点击 Change type,扳手图标按钮,并选择 User Task。

在属性面板中,指定任务名 Approval
以及任务 id approval
。
我们用 Process variable(流程变量) 作为执行人来源。下拉列表展示这些字段和 Entity
类型的流程变量,实体类型需要实现 UserDetails
接口。从列表中选择 manager
流程变量。

默认情况下,可以用内置的 initiator 流程变量分配任务。更多详细信息,请参阅 流程变量相应章节。
|
对于 Approval 任务,我们还需要指定一个流程表单。这也是一个输入对话框。这个对话框将展示开始表单中的流程变量,但需要新增一个参数。
创建一个新的输入对话框参数,并在 Process variable 下拉列表中选择 requestNumber
变量。将这个字段设置为不可编辑,即,取消勾选 Editable 复选框。

用同样的方式创建输入对话框参数 expenseAmount
、expenseDate
和 document
变量。这些参数都是不可编辑的。
新增一个对话框参数,流程变量名为 comment
,类型为 Multiline string
。字段是可编辑,非必需。这个字段是给经理用的,当批准或驳回报销申请时,可以用来写一些说明。
创建输出
在 Approval 这一步,经理有两个选择:批准或驳回请求。做到这点有个简单的办法 - 使用输出。对于每个输出,表单上都会显示一个按钮,结果会存在一个特殊的流程变量中。
首先创建 Approval 用户任务的第一个输出,点击属性面板中 Outcomes(输出) 部分的相应按钮。在输出编辑器界面,指定输出 id approve
,名称为 Approve
并在图标列表选择一个图标 CHECK
。

然后创建第二个输出:id 是 reject
,名称是 Reject
,图标是 BAN
。
Approval 任务完成之后,流程需要根据输出选择相应的路径。我们创建一个互斥网关(exclusive gateway)。
选中 Approval 任务元素,在菜单中点击 Append Gateway 操作。

点击这个网关,使用菜单中的相应按钮创建 EndEvent
和 User task
。一个顺序流从互斥网关流向 EndEvent
元素,另一个顺序流流向用户任务。给这两个顺序流分别命名为:approved
和 rejected
。

为 approved
流指定条件,点击这个流元素,然后在序列流属性面板的 Condition source(条件来源) 下拉框字段选择 User task outcome
。再选中 Approval
用户任务和 approve
输出。

按同样的步骤配置 rejected
序列流,但是在输出值字段需要选择 reject
。
创建支付用户任务
第二个用户任务,设置任务名称为 Payment
,任务 id 为 payment
。
我们实现下列行为:所有的会计都能看到这个任务,他们中的任何一人都能领取这个任务。因此,为了实现这个功能,我们不能指定某个特定的任务执行人,而是需要指定 Candidate groups(候选组) 或 Candidate users(候选用户)。
我们给会计创建一个 Candidate group。打开 BPM → User groups(用户组) 界面,新建一个组,名称为 Accountants
,编码为 accountants
。修改组类型为 Users
并添加几个用户到组内。

需要给这些用户分配 bpm-process-actor-ui
角色,给予必要的访问 BPM 界面和实体的权限,以便这些用户能开始流程、处理用户任务。可以在 Application → Users 界面分配角色。
返回建模器,选择 Payment
用户任务并点击 Assignee(执行人) 区域 Candidate groups 字段旁边的编辑按钮。

在弹窗中,选择 Groups source(组来源) 字段的值为 User groups
然后添加 Accountants
分组。

为 Payment
任务创建输入对话框表单。添加已有的 requestNumber
、expenseAmount
、expenseDate
、document
和 comment
字段,全部为不可编辑。
在 Payment
用户任务后添加 EndEvent
元素。
开始流程
流程模型已准备好,可以部署至流程引擎。点击工具栏的 Deploy process(部署流程) 按钮。

如需发起流程,打开 BPM → Start Process(开始流程) 界面。此界面展示当前用户可以发起的流程定义。
测试流程
选择 reimbursement
流程,点击 Start process 按钮。

开始流程表单会自动展示,填写字段,选择 manager
然后点击 Start process 按钮。

经理可以在 BPM → My Tasks(我的任务) 界面看到分配的任务。

双击任务。表单中的一些字段是只读的,与我们之前在建模器配置的一样,还有两个按钮用来输出结果:Approve 和 Reject。

输入备注,点击 Approve 按钮。 以 Accountants 用户组的任何成员的身份登录。打开 BPM → My Tasks 界面。可以看到虽然表格是空的,但是提示用户有一个组任务可以领取。展开 Group tasks 节点。

任何会计领取这个任务之前,Accountants
分组的所有用户都能在他们的组任务中看到 Payment
任务。打开任务表单。可以看到,表单是只读的,如果没有领取任务则不能修改表单。表单底部有两个按钮:Claim and resume(领取并继续) and Claim and close(领取并关闭)。

-
Claim and resume 将任务从其他用户的分组任务列表删除,并将任务表单保留在界面上。表单将变为可编辑状态,并显示完成任务的按钮。
-
Claim and close 将任务从其他用户的分组任务列表删除,并关闭流程表单。任务会显示在当前用户已分配的任务列表中。
点击 Claim and close 按钮。从 Assigned tasks(已分配任务) 分组中选择 Payment
任务。打开任务表单,使用默认的 Complete task(完成任务) 按钮完成当前任务。当我们没有在模型中指定任务输出时,会展示该默认按钮。

流程操作结束。