用户任务(UserTask)即用户操作的任务, 个人任务是用户任务的一种,这篇博文将简单地介绍下分配个人任务的三种方式。
一、流程图
图一 分配用户任务流程图
二、方式一:直接指定办理人
1.流程图中配置任务节点
图二 配置任务节点办理人
2.测试代码
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
processEngine.getRepositoryService()//
.createDeployment()//
.addInputStream("userTask.bpmn", inputStreamBpmn)//
.addInputStream("userTask.png", inputStreamPng)//
.deploy();
// 2 启动流程
//启动流程实例的同时,设置流程变量
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("taskProcess");
System.out.println("pid:" + pi.getId());
}
//查询我的个人任务列表
@Test
public void findMyTaskList(){
String userId = "周江霄";
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(userId)//指定个人任务查询
.list();
for(Task task:list ){
System.out.println("id="+task.getId());
System.out.println("name="+task.getName());
System.out.println("assinee="+task.getAssignee());
System.out.println("createTime="+task.getCreateTime());
System.out.println("executionId="+task.getExecutionId());
}
}
//完成任务
@Test
public void completeTask(){
String taskId = "3209";
processEngine.getTaskService()//
.complete(taskId);//
System.out.println("完成任务");
}
说明:在上面的例子中,周江霄是个人任务的办理人;但是这样分配任务的办理人不够灵活,因为项目开发中任
务的办理人不要放置XML文件中。
三、方式二:直接指定办理人(动态指定)
1.流程图中配置任务节点变量
图三 配置任务节点变量
2.测试代码
package cn.gome.k_personTask;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest {
//流程引擎对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定义+启动流程实例*/
@Test
public void deployementAndStartProcess(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
//部署流程定义
Deployment deployment = processEngine.getRepositoryService()//
.createDeployment()//创建部署对象
.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
.addInputStream("task.png", inputStreampng)
.name("个人任务演示")
.deploy();
System.out.println("部署ID:"+deployment.getId());
//启动流程实例
/**
* 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人
* 流程变量的名称,就是在task.bpmn中定义#{userID}的userID
* 流程变量的值,就是任务的办理人
*/
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userID", "周江霄");
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("task",variables);//使用流程定义的key的最新版本启动流程
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
}
/**查询我的个人任务*/
@Test
public void findPersonalTaskList(){
//任务办理人
String assignee = "周江霄";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assignee)//个人任务的查询
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
/**完成任务*/
@Test
public void completeTask(){
//任务ID
String taskId = "5209";
processEngine.getTaskService()
.complete(taskId);
System.out.println("完成任务:"+taskId);
}
}
四、方式三:使用类
1.TaskListenerImpl类,用来设置任务的办理人
package cn.gome.l_personTask;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskListenerImpl implements TaskListener{
/**设置任务的办理人(个人任务和组任务)*/
@Override
public void notify(DelegateTask delegateTask) {
//指定个人任务
delegateTask.setAssignee("郭靖");
}
}
2.流程图中配置任务节点监听
图四 流程图中配置任务节点监听
3.测试代码
package cn.gome.l_personTask;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest {
//流程引擎对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定义+启动流程实例*/
@Test
public void deployementAndStartProcess(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
//部署流程定义
Deployment deployment = processEngine.getRepositoryService()//
.createDeployment()//创建部署对象
.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
.addInputStream("task.png", inputStreampng)//
.deploy();
System.out.println("部署ID:"+deployment.getId());
//启动流程实例
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("task");//使用流程定义的key的最新版本启动流程
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
}
/**查询我的个人任务*/
@Test
public void findPersonalTaskList(){
//任务办理人
String assignee = "郭靖";
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.taskAssignee(assignee)//个人任务的查询
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
/**完成任务*/
@Test
public void completeTask(){
//任务ID
String taskId = "5408";
processEngine.getTaskService().complete(taskId);
System.out.println("完成任务:"+taskId);
}
/**将个人任务从一个人分配给另一个人*/
@Test
public void setAssignee(){
//指定任务的办理人
String userId = "黄蓉";
//任务ID
String taskId = "5408";
processEngine.getTaskService()//
.setAssignee(taskId, userId);
}
}
总结:
通过对比,我们发现,分配个人任务的三种方式中,第一种欠灵活,后面两种都还是不错的,可以在项目中灵活的分配个人任务。