Activiti流程的实例以及任务

流程的实例启动以及任务是建立在流程的定义的基础上的,如果还没有流程的定义,请参考文章:

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());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值