回顾:
11张表:
select * from act_re_deployment;
select * from act_ru_identitylink; -- 组任务成员表
select * from act_re_procdef;
select * from act_ge_bytearray;
select * from act_ru_execution;
select * from act_ru_task;
select * from act_hi_taskinst;
select * from act_hi_procinst;
select * from act_hi_actinst;
select * from act_hi_varinst;
select * from act_ru_variable;
接收任务
新建一个"接收任务"bpmn:
注: "接收任务"只是一个执行对象, 在任务表中没有数据
测试代码:
/**
* 汇总销售额/发送短信给boss
*/
@Test
public void doExecutionObj(){
List<Execution> executionList = runtimeService
.createExecutionQuery().processDefinitionKey("myProcess").list();
Execution execution = executionList.get(0);
String activityId = execution.getActivityId();
if(activityId.equals("totalSum")){
/*
* "汇总销售额"业务代码...
* ...
*/
Map<String, Object> map = new HashMap<String, Object>();
map.put("totalCash", 10000);
//让流程执行下去
runtimeService.signal(executionList.get(0).getId(), map);
}else if(activityId.equals("sendMess")){
Integer totalCash = (Integer) runtimeService.getVariable(execution.getId(), "totalCash");
System.out.println(totalCash);
/*
* "发送短信"给boss业务代码...
* ...
*/
//让流程执行下去
runtimeService.signal(executionList.get(0).getId());
}
}
用户任务分配
新建一个"任务分配"的bpmn:
① 变量传递形式的动态分配(这种方式不采用)
测试代码:
/**
* 给用户分配任务
*/
@Test
public void completeManagerTask(){
Task task = taskService.createTaskQuery().processDefinitionKey("taskForAssignee").taskAssignee("manager").singleResult();
Map<String, Object> map = new HashMap<String, Object>();
//用流程变量动态指定下一个用户任务的办理人
map.put("userId", "boss");
taskService.complete(task.getId(), map);
}
/**
* 获取分配的任务
*/
@Test
public void getDynamicUserTask(){
Task task = taskService.createTaskQuery().processDefinitionKey("taskForAssignee").taskAssignee("boss").singleResult();
System.out.println("任务Id: "+task.getId());
System.out.println("任务名称: "+task.getName());
taskService.complete(task.getId());
}
② 监听器形式的任务分配(动态修改办理人不需要重新部署流程)
首先建立一个监听器类MyTaskListener, 实现"org.activiti.engine.delegate.TaskListener"接口
package com.rl.activiti.model;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyTaskListener implements TaskListener {
private static final long serialVersionUID = -2218199184499848878L;
@Override
public void notify(DelegateTask delegateTask) {
String taskKey = delegateTask.getTaskDefinitionKey();
if(taskKey.equals(Constants.MANAGER_AUDIT)){
delegateTask.setAssignee("张三");
}else if(taskKey.equals(Constants.BOSS_AUDIT)){
delegateTask.setAssignee("李四");
}
}
}
其次建立一个存放常量的接口:
package com.rl.activiti.model;
public interface Constants {
public static final String MANAGER_AUDIT = "manager_audit";
public static final String BOSS_AUDIT = "boss_audit";
}
最后在导航图上做如下设置监听器并部署启动流程:
测试代码:
/**
* 动态完成用户任务
*/
@Test
public void getDynamicUserTask(){
Task task = taskService.createTaskQuery().processDefinitionKey("taskForAssignee1").taskAssignee("张三").singleResult();
taskService.complete(task.getId());
}
组任务分配
① 普通形式
新建一个组任务的bpmn:
测试代码:
@Test
public void getCandidateTask(){
String candidateUser = "小花";
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("customer").taskCandidateUser(candidateUser).orderByTaskCreateTime().desc().list();
Task task = taskList.get(0);
System.out.println("任务的ID: "+task.getId());
System.out.println("任务的名称: "+task.getName());
}
② 变量传递的形式(启动流程时就传递)
测试代码:
/**
* 启动流程
*/
@Test
public void startProcess() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("userIds", "小红,小花,小黑");
//根据流程的key来启动相对应的流程, 默认是启动最新版本的流程
runtimeService.startProcessInstanceByKey("candidate1", map);
}
@Test
public void getCandidateTask(){
String candidateUser = "小花";
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("candidate1").taskCandidateUser(candidateUser).orderByTaskCreateTime().desc().list();
Task task = taskList.get(0);
System.out.println("任务的ID: "+task.getId());
System.out.println("任务的名称: "+task.getName());
}
③ 监听器的形式
新建一个TaskCandidateListener类, 实现TaskListener接口
package com.rl.activiti.model;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskCandidateListener implements TaskListener {
private static final long serialVersionUID = -8182532782820163037L;
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.addCandidateUser("小红");
delegateTask.addCandidateUser("小花");
delegateTask.addCandidateUser("小黑");
}
}
给流程图添加监听器
任务接管:
/**
* 任务接管
*/
@Test
public void getTask(){
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("candidate2").taskCandidateUser("小红").list();
Task task = taskList.get(0);
//让小红接管该任务
taskService.claim(task.getId(), "小红");
}
注: 任务被接管之后组任务的其他成员(小花和小黑)则无法查看到该任务.
归还任务:
/**
* 归还任务
*/
@Test
public void returnTask(){
Task task = taskService.createTaskQuery().processDefinitionKey("candidate2").taskAssignee("小红").singleResult();
taskService.claim(task.getId(), null);
}
注: 任务被归还之后其他的组任务成员又可以查看该任务了.
其他
/**
* 查询组任务成员列表
*/
@Test
public void getIdentityLink(){
Task task = taskService.createTaskQuery().processDefinitionKey("candidate2").taskCandidateUser("小红").singleResult();
List<IdentityLink> identityLinkList = taskService.getIdentityLinksForTask(task.getId());
for(IdentityLink identityLink: identityLinkList){
System.out.println(identityLink.getUserId());
}
}