6.task任务节点----个人任务
task任务节点一般是用来处理涉及人机交互的,其中有一个assign属性可以将任务分配给指定用户。
下面通过一个demo来说明一下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="demo6_personaltask" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="241,6,48,48">
<transition name="to 员工请假" to="员工请假" g="-71,-17"/>
</start>
<end name="end1" g="247,317,48,126"/>
<!-- 只有张三可以请假 -->
<task name="员工请假" g="225,76,92,52" assignee="张三">
<transition name="to 部门经理审批" to="部门经理审批" g="-95,-17"/>
</task>
<!-- 实际中请假,审批人一定是申请人所在部门主管 -->
<task name="部门经理审批" g="226,160,92,52" assignee="#{manager}">
<transition name="to 总经理审批" to="总经理审批" g="-83,-17"/>
</task>
<task name="总经理审批" g="232,236,92,52">
<assignment-handler class="learn.PersonalAssignmentHandler"/>
<transition name="to end1" to="end1" g="-47,-17"/>
</task>
</process>
以上是一个流程定义图和它所对应的xml配置文件。这个配置文件很好的展现了为个人分配任务的3种方式,分别是:
1.指定人 2.指定变量,为变量赋值 3.Handler方式
下面为了讲解这个流程,附上代码更好理解:
<span style="white-space:pre"> </span>//发布流程
@Test
public void demo1(){
RepositoryService repositoryService = new Configuration().buildProcessEngine().getRepositoryService();
NewDeployment createDeployment = repositoryService.createDeployment();
createDeployment.addResourceFromClasspath("demo6_personaltask.jpdl.xml");
createDeployment.addResourceFromClasspath("demo6_personaltask.png");
createDeployment.deploy();
}
//启动流程
@Test
public void demo2(){
ExecutionService executionService = new Configuration().buildProcessEngine().getExecutionService();
executionService.startProcessInstanceById("demo6_personaltask-1");
}
以上是发布和启动流程实例。此时jbpm4_task表中数据如下:
看以清楚地看到,ASSIGN字段记录当前节点是某人的个人任务(说白了就是谁可以操作,在谁的待办工作中显示),‘张三’和我们在task节点的name为‘员工请假’中assign配置的‘张三’
相对应。接着走:
//办理'部门经理审批'节点
@Test
public void demo3(){
TaskService taskService = new Configuration().buildProcessEngine().getTaskService();
HashMap<String, Object> variables = new HashMap<String, Object>();
variables.put("manager", "李经理");
taskService.setVariables("10002", variables);
taskService.completeTask("10002");
}
办理‘部门经理审批’节点,将manager作为变量传给taskService,taskService为xml配置文件assign="#{manager}"赋值,此时jbpm4_task表中数据如下:
可以看到,此时‘部门经理审批’节点的办理人是‘李经理’。接着走:
<span style="white-space:pre"> </span>//办理'总经理审批'节点
@Test
public void demo4(){
TaskService taskService = new Configuration().buildProcessEngine().getTaskService();
taskService.completeTask("20002");
}
package learn;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
/**
* 需要一个handler 指定任务负责人
* @author seawind
*/
public class PersonalAssignmentHandler implements AssignmentHandler {
@Override
public void assign(Assignable assignable, OpenExecution openExecution) throws Exception {
// assignable 设置任务负责人
// openExecution 获取流程变量
assignable.setAssignee("老王");// 设置负责人
}
}
这就是Handler方式给为办理人赋值,当执行次节点时,会读取xml配置文件的<assignment-handler class="learn.PersonalAssignmentHandler"/>,去PersonalAssignmentHandler
的assign方法获得,代码注释写的很清楚了。此时jbpm4_task表中数据如下:
此时该总经理‘老王’办理了,但是老王太忙,没时间办,于是可以委托给他的秘书小丽来办理:
<span style="white-space:pre"> </span>@Test
// 更换任务负责人
public void demo6() {
// 1、 获得流程引擎
ProcessEngine processEngine = new Configuration().buildProcessEngine();
// 2、获得Service
TaskService taskService = processEngine.getTaskService();
// 3、更换负责人
taskService.assignTask("30001", "小丽"); //30001是jbpm4_task的DBID
}