文章目录

1.个人任务

由某一个负责办理,在任务表中通过assignee字段记录

2.公共任务(组任务)

当前的任务可以由多个人办理, 可以在设计流程图时指定多个办理人
《Activiti工作流框架》专题(六)-Activiti工作流框架任务类型_启动流程
测试:

/*
* 公共任务测试
*/
public class PublicTask {

ProcessEngine pe=null;

@Before
public void init(){
pe = ProcessEngines.getDefaultProcessEngine();
}

/**
* 01-部署流程定义
*/
@Test
public void test1(){
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("Demo.bpmn");
deploymentBuilder.addClasspathResource("Demo.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println("流程定义部署成功...");
}

/**
* 02-查询流程定义列表
*/
@Test
public void test2() {
// 流程定义查询对象,用于查询表act_re_procdef
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
// 添加排序条件
query.orderByProcessDefinitionVersion().desc();
// 添加分页查询
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
}
}

/**
* 03-启动流程实例
*/
@Test
public void test3(){
String processDefinitionId="myProcess:1:60004";
pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.println("流程实例定义成功.....");
}

/**
* 04-办理个人任务
*/
@Test
public void test4(){
String taskId="62504";
pe.getTaskService().complete(taskId);
System.out.println("任务办理成功....");
}

/**
* 05-查询公共任务列表
*/
@Test
public void test5(){
TaskQuery query = pe.getTaskService().createTaskQuery();
//根据候选人过滤
String candidateUser="小黑";
query.taskCandidateUser(candidateUser);
List<Task> list = query.list();
for (Task task : list) {
System.out.println(task.getName()+"----"+task.getId());
}
}

/**
* 06-拾取任务(将公共任务变为个人任务)
*/
@Test
public void test6(){
String userId="小黑";
String taskId="65002";
pe.getTaskService().claim(taskId, userId);
System.out.println("任务拾取成功..");
}

/**
* 07-查询个人任务列表
*/
@Test
public void test7() {
TaskQuery query = pe.getTaskService().createTaskQuery();
String assignee = "小黑";
query.taskAssignee(assignee);
List<Task> list = query.list();
for (Task task : list) {
System.out.println("待办任务ID:"+task.getId());
System.out.println("待办任务名称:"+task.getName());
System.out.println("任务创建时间:"+task.getCreateTime());
System.out.println("任务办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
}
}

/**
* 08-办理任务
*/
@Test
public void test9(){
String taskId= "65002";
pe.getTaskService().complete(taskId);
System.out.println("办理完成,任务ID是:"+taskId);
}
}

3.接收任务

接收任务不是由某个人负责办理,通过signal方法让流程执行的
《Activiti工作流框架》专题(六)-Activiti工作流框架任务类型_启动流程_02

/**
* 接受任务测试
*/
public class ReceiveTaskTest {

ProcessEngine pe=null;

@Before
public void init(){
pe = ProcessEngines.getDefaultProcessEngine();
}

/**
* 01-部署流程定义
*/
@Test
public void test1(){
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("Demo1.bpmn");
deploymentBuilder.addClasspathResource("Demo1.png");
Deployment deployment = deploymentBuilder.deploy();
System.out.println("流程定义部署成功...");
}

/**
* 02-查询流程定义列表
*/
@Test
public void test2() {
// 流程定义查询对象,用于查询表act_re_procdef
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
// 添加排序条件
query.orderByProcessDefinitionVersion().desc();
// 添加分页查询
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "--" + pd.getName()+"--key:"+pd.getKey());
}
}

/**
* 03-启动流程实例
*/
@Test
public void test3(){
String processDefinitionId="myProcess:2:75004";
pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.println("流程实例定义成功.....");
}

/**
* 04-办理任务
*/
@Test
public void test4(){
String taskId = "77504";
pe.getTaskService().complete(taskId );
}

/**
* 05-查询流程实例列表,查询act_ru_execution表
*/
@Test
public void test9() {
// 流程实例查询对象,查询act_ru_execution表
ProcessInstanceQuery query = pe.getRuntimeService().createProcessInstanceQuery();
query.processDefinitionKey("myProcess");
query.orderByProcessInstanceId().desc();
query.listPage(0, 2);
List<ProcessInstance> list = query.list();
for (ProcessInstance pi : list) {
System.out.println(pi.getId() + " " + pi.getActivityId());
}
}

/**
* 06-处理接收任务
*/
@Test
public void test5(){
String executionId = "77501";
pe.getRuntimeService().signal(executionId);
}
}

4.接收任务案例

接收任务(ReceiveTask)即等待任务,接收任务是一个简单任务,它会等待对应消息的到达。当前,官方只实现

了这个任务的java语义。 当流程达到接收任务,流程状态会保存到数据库中。在任务创建后,意味着流程会进入等

待状态,直到引擎接收了一个特定的消息, 这会触发流程穿过接收任务继续执行。

流程图
《Activiti工作流框架》专题(六)-Activiti工作流框架任务类型_java_03
流程演示

package cn.gome.j_receiveTask;

import java.io.InputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

public class ReceiveTaskTest {

//流程引擎对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

/**部署流程定义+启动流程实例*/
@Test
public void deployementAndStartProcess(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");

//1.部署流程定义
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()//创建部署对象
.addInputStream("receiveTask.bpmn", inputStreamBpmn)
.addInputStream("receiveTask.png", inputStreamPng)
.deploy();
System.out.println("部署ID:" + deployment.getId());

//2.启动流程实例
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("receiveTask");//使用流程定义的key的最新版本启动流程
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());

//3.查询执行对象表,使用流程实例ID和当前活动的名称(receivetask1)
String processInstanceId = pi.getId();//得到流程实例ID
Execution execution1 = processEngine.getRuntimeService()
.createExecutionQuery()
.processInstanceId(processInstanceId)//流程实例ID
.activityId("receivetask1")//当前活动的名称
.singleResult();

//4.使用流程变量设置当日的销售额
processEngine.getRuntimeService().setVariable(execution1.getId(), "当日销售额", 20000);

//5.向后执行一步
processEngine.getRuntimeService()
.signal(execution1.getId());

//6.查询执行对象表,使用流程实例ID和当前活动的名称(receivetask2)
Execution execution2 = processEngine.getRuntimeService()
.createExecutionQuery()
.processInstanceId(processInstanceId)
.activityId("receivetask2")
.singleResult();

//7.获取流程变量,给老板发送短信
Integer value = (Integer) processEngine.getRuntimeService()
.getVariable(execution2.getId(), "当日销售额");
System.out.println("给老板发送短信:内容,当日销售额:"+value);

//8.向后执行一步
processEngine.getRuntimeService()
.signal(execution2.getId());

//9.判断流程是否结束
ProcessInstance nowPi = processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processInstanceId(pi.getId())
.singleResult();
if(nowPi == null){
System.out.println("流程结束");
}
}

}

说明:与用户任务(UserTask)不同的是,接收任务(ReceiveTask)创建后,会进入一个等待状态,一般指机器自动完成,但需要耗费一定时间的工作,当完成工作后后,向后推移流程,在上面的代码中也就是向下执行一步,使用​​runtimeService.signal(executionId)​​,传递接收执行对象的id。