1.场景模拟
以kft-activiti-demo中的请假流程为例,操作流程:
- 用户A申请请假
- 领导B驳回
- 任务流转到“调整请假信息”节点
问题来了:如何把“调整请假信息”任务自动分配给申请请假的用户A呢?
2.救世主activiti:initiator
Activiti为此专门在startEvent上扩展了一个属性activiti:initiator用了解决这个问题。
下面的代码片段包含了这个属性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<
process
id
=
"leave"
name
=
"请假流程"
>
<
startevent
id
=
"startevent1"
name
=
"Start"
activiti:initiator
=
"applyUserId"
></
startevent
>
<
usertask
id
=
"deptLeaderAudit"
name
=
"部门领导审批"
activiti:candidategroups
=
"deptLeader"
></
usertask
>
<
exclusivegateway
id
=
"exclusivegateway5"
name
=
"Exclusive Gateway"
></
exclusivegateway
>
<
usertask
id
=
"modifyApply"
name
=
"调整申请"
activiti:assignee
=
"${applyUserId}"
>
<
extensionelements
>
<
activiti:tasklistener
event
=
"complete"
delegateexpression
=
"${afterModifyApplyContentProcessor}"
></
activiti:tasklistener
>
</
extensionelements
>
</
usertask
>
<
usertask
id
=
"hrAudit"
name
=
"人事审批"
activiti:candidategroups
=
"hr"
></
usertask
>
<
exclusivegateway
id
=
"exclusivegateway6"
name
=
"Exclusive Gateway"
></
exclusivegateway
>
<
usertask
id
=
"reportBack"
name
=
"销假"
activiti:assignee
=
"${applyUserId}"
>
<
extensionelements
>
<
activiti:tasklistener
event
=
"complete"
delegateexpression
=
"${reportBackEndProcessor}"
></
activiti:tasklistener
>
</
extensionelements
>
</
usertask
>
</
process
>
|
分步理解:
- activiti:initiator设置一个变量名称(代码第2行),可以是任意的字符串,这一点是让很多初学者迷糊的地方不知道写什么,现在请记住一个变量。
- 变量applyUserId应该保存申请用户的ID
- 在需要设置申请用户才能办理的任务上设置activiti:assginee=${applyUserId}属性,参见第5、11行代码
为什么这么做呢?
在用户手册上其实专门讲解了这个属性的做作用以及使用方法,代码如下:
1
2
|
identityService.setAuthenticatedUserId(
"kafeitu"
);
runtimeService.startProcessInstanceByKey(
"leave"
);
|
- 第1行代码的作用就是设置当前的用户ID,非常关键,而且这行代码需要和activiti:initiator配合使用,不可分割……
- 第2行代码启动一个流程,在启动流程的时候会判断有没有activiti:initiator属性,如果有把属性activiti:initiator的值作为一个变量添加到流程实例中,本文中也就是applyUserId,
不要以为applyUserId是一个特殊的变量,它就是一个普通的变量而已
。
在流程XML中的第5、11行代码出使用${applyUserId}作为activiti:initiator的值,引擎会在创建任务的使用用变量applyUserId替换。
3.单元测试理解
请参考kft-activiti-demo中的单元测试:
- java: LeaveWorkflowServiceTest.java
- xml:leave.bpmn
还可以在线运行请假流程:http://demo.kafeitu.me/kft-activiti-demo体验一下这个过程。