分配任务的几种方式
第一种:直接在bpmn文件中配置好某一个任务由谁来完成
<process id="demo" isExecutable="true">
<startEvent id="start" name="startPoint"></startEvent>
<userTask id="usertask" name="测试节点名称" activiti:assignee="0001"></userTask>
<endEvent id="end" name="endPoint"></endEvent>
<sequenceFlow id="flow1" sourceRef="start" targetRef="usertask"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask" targetRef="end"></sequenceFlow>
</process>
如上图所示,在启动任务的之前就已经设置好了只能由用户ID为“0001”的用户来办理该任务,但是这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中
第二种:在启动流程的同时设置流程变量Map<String, Object> variables
<process id="demo" isExecutable="true">
<startEvent id="start" name="startPoint"></startEvent>
<userTask id="usertask" name="测试节点名称" activiti:assignee="#{userID}"></userTask>
<endEvent id="end" name="endPoint"></endEvent>
<sequenceFlow id="flow1" sourceRef="start" targetRef="usertask"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask" targetRef="end"></sequenceFlow>
</process>
必须先在bpmn文件中将该该任务的办理人设置成变量userID后才能使用下面的Java代码
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userID", "0001");
//启动流程实例的同时,设置流程变量
ProcessInstance pi=processEngine.getRuntimeService().startProcessInstanceByKey("demo",variables);
在开发中,可以在页面中指定提前预先备好的审批人(即下一个任务的办理人),通过流程变量设置下一个任务的办理人
第三种:通过任务监听类,动态设置当前所创建任务的办理人
通过实现org.activiti.engine.delegate.TaskListener类的方式来创建任务监听类TaskListenerImpl
package com.demo;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskListenerImpl implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
/**
* 在该部分可通过个人定义的审批规则,动态获取并设置所创建任务的办理人
*/
String assignee = "0001";
//指定当前任务的办理人
delegateTask.setAssignee(assignee);
}
}
在bpmn文件中引入对该类的使用
<process id="demo" isExecutable="true">
<startEvent id="start" name="startPoint"></startEvent>
<userTask id="usertask" name="测试节点名称">
<extensionElements>
<activiti:taskListener event="create" class="com.demo.TaskListenerImpl">
</activiti:taskListener>
</extensionElements>
</userTask>
<endEvent id="end" name="endPoint"></endEvent>
<sequenceFlow id="flow1" sourceRef="start" targetRef="usertask"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask" targetRef="end"></sequenceFlow>
</process>
在开发中,可以提前预置于好审批规则,例如0001的领导是0002,李四的领导是0003,这样0001提交任务,就可以查询出 0001的领导是0002,依此类推,通过监听类的方式动态设置下一个任务的办理人