欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Activiti流程变量使用

程序员文章站 2024-03-26 08:57:23
...

本文是建立在流程定义,流程实例的基础上的,可以参阅流程定义流程实例。 本文主要给出了如何使用流程变量的demo,包含流程变量的设置、获取方法,设置实例级别、任务级别的流程变量的方法,主要的描述请查看代码以及代码上的注释。

import com.google.gson.Gson;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessVariablesTest {

    private Gson gson = new Gson();

    @Autowired
    private ProcessEngine processEngine;

    /**
     * 设置流程变量
     *  1.流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
     *  2.基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
     *  3.Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
     *  4.涉及到的表
     *      ACT_HI_VARINST    流程变量历史表
     *      ACT_RU_VARIABLE  正在执行的流程变量表
     *  5.RuntimeService对象可以设置流程变量和获取流程变量
     *  6.TaskService对象可以设置流程变量和获取流程变量
     *  7.流程实例启动的时候可以设置流程变量
     *  8.任务办理完成的时候可以设置流程变量
     *  9.流程变量可以通过名称/值的形式设置单个流程变量
     *  10.流程变量可以通过Map集合,同时设置多个流程变量
     *  11.Map集合的key表示流程变量的名称, Map集合的value表示流程变量的值
     *  12.setVariable和setVariableLocal的区别
     *      setVariable:设置流程变量的时候,流程变量名称相同的时候,后一次的值替换前一次的值,
     *          而且可以看到TASK_ID的字段不会存放任务ID的值。
     *      setVariableLocal:
     *          1:设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在2个活动节点,
     *              对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替换
     *              前一次版本的值,它会使用不同的任务ID作为标识,存放2个流程变量值,而且可以看到
     *              TASK_ID的字段会存放任务ID的值,例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,
     *              存放的值也是不同的。
     *          2:使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取
     *              不到这个流程变量(因为正在执行的流程变量中没有这个数据),所有查询正在执行的任务时
     *              不能查询到需要的数据,此时需要查询历史的流程变量。
     */
    @Test
    public void setVariablesTest() {
        TaskService taskService = processEngine.getTaskService();
        String instanceId = "17501";
        Task task = taskService.createTaskQuery()
                .processInstanceId(instanceId)
                .singleResult();
        taskService.setVariable(task.getId(), "姓名", "张三");
        taskService.setVariable(task.getId(), "性别", "李四");

        Map<String, Object> variables = new HashMap<>();
        variables.put("key", "value");
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance pi = runtimeService.startProcessInstanceById("helloworld:5:32504", variables);
        runtimeService.setVariable(pi.getProcessInstanceId(), "key1", "value1");
        runtimeService.setVariables(pi.getProcessInstanceId(), variables);
        List<String> keys = new ArrayList<>();
        keys.add("key");
        Map map = runtimeService.getVariables(pi.getProcessInstanceId());
        System.out.println(gson.toJson(map));
    }

    /**
     * 获取流程变量
     *  1.流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
     *  2.使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
     *  3.Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,
     *    否则抛出异常。解决方案,固定序列化ID
     */
    @Test
    public void getVariablesTest() {
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processInstanceId("17501")
                .singleResult();
        String name = (String) taskService.getVariable(task.getId(), "姓名");
        String gender = (String) taskService.getVariable(task.getId(), "性别");
        System.out.println("姓名:" + name + "\t 性别:" + gender);
    }

    /**
     * 查询历史的流程变量
     */
    @Test
    public void getHisVariablesTest() {
        List<HistoricVariableInstance> instances = processEngine.getHistoryService()
                .createHistoricVariableInstanceQuery().variableName("姓名").list();
        instances.forEach(instance -> {
            System.out.println(instance.getVariableName() + "\t" + instance.getValue());
        });
    }
}