流程的实例启动以及任务是建立在流程的定义的基础上的,如果还没有流程的定义,请参考文章:
https://blog.csdn.net/houkai18792669930/article/details/103386025
import com.google.gson.Gson;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
/**
* @describe: 流程实例相关
* 流程实例描述
*
* 流程实例: 是流程定义的一次执行
* 对应的表:
* act_ru_execution: 正在执行的信息
* act_hi_procinst:已经执行完的历史流程实例信息
* act_hi_actinst:存放历史所有完成的活动
* ProcessInstance 流程实例
* 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。
*
* Task 任务:执行到某任务环节时生成的任务信息。
* 对应的表:
* act_ru_task:正在执行的任务信息
* act_hi_taskinst:已经执行完的历史任务信息
* 注意
* 1.如果是单例流程,执行对象ID就是流程实例ID
* 2.如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
* 3.一个流程中,流程实例只有1个,执行对象可以存在多个。
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessInstanceTest {
private Gson gson = new Gson();
@Autowired
private ProcessEngine processEngine;
/**
* 启动流程变量:操作数据库的act_ru_execution表,如果是用户任务节点,同时也会在act_ru_task添加一条记录
*/
@Test
public void startProcessTest() {
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceById("helloworld:2:12504");
System.out.printf("ID:" + pi.getId() + " processDefinitionId:" + pi.getProcessDefinitionId());
//ID:17501 processDefinitionId:helloworld:2:12504
}
/**
* 查看我的任务
*/
@Test
public void queryTaskTest() {
List<Task> taskList = processEngine.getTaskService()
.createTaskQuery()
.orderByTaskCreateTime()
.desc()
.list();
taskList.forEach(task->{
System.out.println("taskId:" + task.getId() + "\ttaskName:"+ task.getName() +"\tcreateTime:"+ task.getCreateTime() +"\tassign:"+task.getAssignee());
});
}
/**
* 办理任务
*/
@Test
public void completeTest() {
processEngine.getTaskService().complete("17505"); //任务ID
}
/**
* 查询流程状态
* 在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除
* 说明:
* 1)因为是查询流程实例,所以先获取runtimeService
* 2)创建流程实例查询对象,设置实例ID过滤参数
* 3)由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常
* 4)判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换成历史数据。
*
*/
@Test
public void queryProcessStateTest() {
ProcessInstance pi = processEngine.getRuntimeService()
.createProcessInstanceQuery() //创建流程实例,查询正在执行的流程
.processInstanceId("17501") //实例ID
.singleResult();
if(pi == null){
System.out.printf("流程结束");
}else {
System.out.printf("流程到:" + pi.getActivityId());
}
}
/**
* 查询历史任务
*/
@Test
public void queryHistoryTaskTest() {
List<HistoricTaskInstance> historicTaskInstances = processEngine.getHistoryService()
.createHistoricTaskInstanceQuery()
.processInstanceId("17501")
.list();
System.out.printf(gson.toJson(historicTaskInstances));
}
/**
* 查询历史流程实例
*/
@Test
public void queryHistoryProcessInstanceTest() {
HistoricProcessInstance hi = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()
.processInstanceId("17501")
.singleResult();
System.out.printf("流程定义ID:"+ hi.getProcessDefinitionId() + "流程实例ID:" + hi.getId() + "流程开始时间:"+ hi.getStartTime()+ "流程结束时间:" + hi.getEndTime());
}
}