(一)基本概念

流程变量就是activiti在管理工作流时根据管理需要而设置的变量。比如在请假流程流转时如果请假天数大于3天则由总经理审核,否则由人事直接审核,请假天数就可以设置为流程变量,在流程流转时使用。

(二)作用域

流程变量的作用域默认是一个流程实例(processInstance),也可以是一个任务(task)或一个执行实例(execution),这三个作用域流程实例的范围最大,可以称为global变量,任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local变量。

(三)变量类型

type namedescription
stringjava.lang.String
integerjava.lang.Integer
shortjava.lang.Short
longjava.lang.Long
doublejava.lang.Double
datejava.lang.Date
binarybyte[]
serializablejava.lang.Serializable 实现

(四)使用方法

1)设置流程变量
2)通过UEL表达式使用流程变量

可以在assignee处设置UEL表达式,表达式的值为任务的负责人,比如:$,assignee就是一个流程变量名称,Activiti获取UEL表达式的值,即流程变量assignee的值,将assignee的值作为任务的负责人进行任务分配。
可以在连线上设置UEL表达式,决定流程走向,比如:${price>=10000}和${price<10000}:price就是一个流程变量名称,uel表达式结果类型为布尔类型,如果UEL表达式是true,要决定流程执行走向。

(五)使用Global变量控制流程

流程: 员工创建请假申请单,由部门经理审核,部门经理审核通过后请假 3 天及以下由人事经理直接审核, 3 天以上先由总经理审核,总经理审核通过再由人事经理存档。
124018020200117121419021716891584.png
测试代码:

package com.activiti.example;

import java.io.Serializable;
import java.util.Date;

/**
 * 请假实体
 * 必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要生成serialVersionUID
 */

public class Holiday implements Serializable {
    private static final long serialVersionUID = 373046364072498634L;

    private Integer id;
    /**
     * 申请人的名字
     */
    private String holidayName;
    /**
     * 开始时间
     */
    private Date beginDate;
    /**
     * 结束日期
     */
    private Date endDate;
    /**
     * 请假天数
     */
    private Float days;
    /**
     * 事由
     */
    private String reason;
    /**
     * 请假类型
     */
    private String type;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getHolidayName() {
        return holidayName;
    }

    public void setHolidayName(String holidayName) {
        this.holidayName = holidayName;
    }

    public Date getBeginDate() {
        return beginDate;
    }

    public void setBeginDate(Date beginDate) {
        this.beginDate = beginDate;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public Float getDays() {
        return days;
    }

    public void setDays(Float days) {
        this.days = days;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
} 

1)启动流程时设置

在启动流程时设置流程变量,变量的作用域是整个流程实例。通过map<key,value>设置流程变量,map中可以设置多个变量,这个key就是流程变量的名字。

     /**
     * 启动一个实例
     * 动态设置设置assignee和假期变量
     */
    @Test
    public void startProcessInstance() {
        Holiday holiday = new Holiday();
        holiday.setDays(5F);


        Map<String, Object> variables = new HashMap<>();
        //设置assignee
        variables.put("user1","张三");
        variables.put("user2","李四");
        variables.put("user3","王五");
        //定义流程变量holiday
        variables.put("holiday", holiday);

        //启动流程实例,同时还要设置流程定义的变量值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", variables);
        System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
    }

2)任务办理时设置

    /**
     * 完成任务
     */
    @Test
    public void completeTask() {
        String assignee = "张三";
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskAssignee(assignee).singleResult();

        Holiday holiday = new Holiday();
        holiday.setDays(4F);
        //初始化一些参数
        Map<String, Object> map = new HashMap<>();
        map.put("holiday", holiday);

        if (task != null) {
            taskService.complete(task.getId(), map);//完成任务时,设置流程变量的值
            System.out.println("任务执行完毕");
        }
    }

3)通过当前流程实例设置

executionId必须当前未结束流程实例的执行id,通常此id设置流程实例的id。也可以通过runtimeService.getVariable()获取流程变量。

    /**
     * 通过当前流程实例设置变量
     */
    @Test
    public void setGlobalVariableByExecutionId() {
        String executionId = "9d5079d9-38e3-11ea-903f-30b49ec7161f";

        Holiday holiday = new Holiday();
        holiday.setDays(3F);
        runtimeService.setVariable(executionId, "holiday", holiday);
        System.out.println(runtimeService.getVariable(executionId, "holiday"));
    }

4)通过当前任务设置

    @Test
    public void setGlobalVariableByTaskId() {
        String taskId = "73eb4a5b-38e4-11ea-ba62-30b49ec7161f";

        Holiday holiday = new Holiday();
        holiday.setDays(5F);
        Map<String, Object> variables = new HashMap<>();
        variables.put("holiday", holiday);

        taskService.setVariable(taskId, "holiday", holiday);
        System.out.println(taskService.getVariable(taskId, "holiday"));
    }

(六)设置local流程变量

1)任务办理时设置

任务办理时设置local流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无法在当前流程实例使用,可以通过查询历史任务查询。

设置作用域为任务的local变量,每个任务可以设置同名的变量,互不影响。

    /**
     * 任务完成时,设置local变量,作用域为该任务
     */
    @Test
    public void completeTaskLocal() {
        String taskId = "73eb4a5b-38e4-11ea-ba62-30b49ec7161f";

        Map<String, Object> variables = new HashMap<>();
        Holiday holiday = new Holiday();
        holiday.setDays(3F);
        variables.put("holiday", holiday);

        //设置local变量,作用域为该任务
        taskService.setVariablesLocal(taskId, variables);
        taskService.complete(taskId);
    }

(七)查询历史流程变量

    /**
     * 查询历史流程变量
     */
    @Test
    public void queryHistoricLocalVariables() {
        HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
        List<HistoricTaskInstance> list = historicTaskInstanceQuery.includeTaskLocalVariables()
                .finished().list();

        for (HistoricTaskInstance hti : list) {
            System.out.println("============================");
            System.out.println("任务id:" + hti.getId());
            System.out.println("任务名称:" + hti.getName());
            System.out.println("任务负责人:" + hti.getAssignee());
            System.out.println("任务local变量:" + hti.getTaskLocalVariables());
        }
    }
打赏
支付宝 微信
上一篇 下一篇