5、流程变量Variables

本文介绍了Activiti工作流中流程变量的使用,包括全局和局部变量的设置、变量注意事项以及如何通过变量控制流程走向。在创建和启动流程时设置变量,并通过示例展示了如何根据请假天数动态分配审批人。强调了程序中变量值的校验和流程变量在流程判断中的应用。
摘要由CSDN通过智能技术生成

1、流程变量

其实流程变量 Map<String,Object> 和Business Key都是可以存储我们业务数据的,只是流程变量可以参与到流程的控制中,而Business Key 在流程中没有任何作用,只是存储个额外数据。
1.流程变量尽量不要存储太多业务数据,尽量少存储数据,多用于流程判断中
2.Objcect值可以存储JSON数据,这个POJO类需要实现Serializable接口
3.流程变量的作用域有global和local
Global 全局作用域:默认流程变量就是全局的,这个流程每个节点都会向下传递,相同的Key会覆盖之前的变量值

//1:启动流程时设置变量
runtimeService.startProcessInstanceByKey("myLeave2", variables);
//2:TaskService设置变量
taskService.setVariables("taskID",null);
//3:提交任务时,设置变量
taskService.complete(t.getId(),"map 全局变量信息");
//4: RuntimeService 设置变量,只要任务不结束可随时设置
runtimeService.setVariables(processInstanceId,null);

Local作用域只针对1个任务或1个执行实例的范围,Local变量可以和Global变量名称一样,相互不影响。在某个Task设置变量

taskService.setVariablesLocal("taskID",null);
runtimeService.setVariableLocal(processInstanceId,"设置Local变量","");

2、变量注意事项,程序设置的变量值尽量提前手动规则校验

  1. 流程变量采用UEL表达式,用${}包裹变量或表达式 ${evection.num>3}
  2. 如果UEL表达式中变量名称不存在则报错
  3. 如果UEL表达式中变量值为NULL,不可判断,流程结束
  4. 如果UEL表达式都不符合,流程结束(异常结束)
  5. 如果连线不设置条件,会走flow 序号小的那条线(最新拉去线)
  6. 设置流程变量会向表act_ru_variable插入记录,同时向历史表act_hi_varinst 插入

3、流程中添加变量,通过变量控制流程走向

项目中添加流程MyLeave2.bpmn 请假流程2,当请假天数大于3时,需要提交给”总经理“审批。否则直接给”财务“审批。流程中下一个节点负责人 由变量动态控制。

3.1、创建流程时,设置变量判断

在这里插入图片描述
在这里插入图片描述

3.2、开启流程时设置变量

package com.hongying.activiti;

import com.hongying.model.Evection;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zyk
 * @version 1.0.0
 * @ClassName VariablesTest
 * @Description 请假流程案例-变量
 * @createTime 2021年06月27日 16:30:00
 */
@Slf4j
public class VariablesTest {

    /**
     * 配置请假工作流2,请假大于3天时,需要总经理审批。否则直接给财务审批。
     */
    @Test
    public void deployDemployment(){
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("bpmn/MyLeave2.bpmn")
                .addClasspathResource("bpmn/MyLeave2.myLeave2.png")
                .name("请假流程2")
                .deploy();
        log.info("请假流程部署,ID:{}",deploy.getId());
        log.info("请假流程部署,Name:{}",deploy.getName());
    }

    /**
     * 开启请假流程2,请假大于3天给总经理审批;
     * 所有请假审批负责人由 变量控制
     */
    @Test
    public void startProcess(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        Map<String,Object> variables=new HashMap<>();
        Evection evection=new Evection();
        evection.setNum(5);
        variables.put("evection",evection);
        variables.put("work","gg");
        variables.put("manager","总经理");
        variables.put("finance","财务");

        //开启流程传递变量
        ProcessInstance myLeave2 = runtimeService.startProcessInstanceByKey("myLeave2", variables);
        log.info("开启新流程2:{}",myLeave2.getId());

        //打印历史信息
        printNextProcessInfo(myLeave2.getId());
    }

    /**
     * 当前负责人完成任务
     */
    @Test
    public void completeProcess(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().processDefinitionKey("myLeave2")
                .taskAssignee("财务").list();

        //这里也可以设置变量
//        taskService.setVariables("taskID",null);
        //Task可以设置局部变量,只在当前Task有效
//        taskService.setVariablesLocal("taskID",null);

        for(Task t:tasks){
            log.info("任务:{}-已被:{} 处理,变量:{}",t.getName(),t.getAssignee(),t.getProcessVariables());

            //完成任务
            taskService.complete(t.getId());
            //提交任务时也可以设置变量。这里可修改全局变量
//            taskService.complete(t.getId(),"map 全局变量信息");
            //打印历史信息,及待处理人
            printNextProcessInfo(t.getProcessInstanceId());
        }

    }

    /**
     * 通过RuntimeService 设置变量,Global和Local
     */
    public void setVariables(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        String processInstanceId="52501";
        runtimeService.setVariables(processInstanceId,null);
        runtimeService.setVariable(processInstanceId,"manager","经理2");
        runtimeService.setVariableLocal(processInstanceId,"设置Local变量","");
    }


    /**
     * 查看下一个结点处理人
     * @param instanceId
     */
    private void printNextProcessInfo(String instanceId){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();

        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
        //根据流程实例ID查询
        instanceQuery.processInstanceId(instanceId);
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();


        List<HistoricActivityInstance> history = instanceQuery.list();
        for(HistoricActivityInstance hi:history){
            log.info(hi.getActivityId());
            log.info(hi.getActivityName());
            log.info(hi.getProcessDefinitionId());
            log.info(hi.getProcessInstanceId());
            log.info(hi.getAssignee());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值