Activiti7学习九之流程变量

流程变量
流程变量就是在流程流转过程中使用到的变量,比如在出差申请过程中,大于3天的由总经理审批,否则人事直接审批。将出差天数设置流程的变量,在流程流转时使用。

流程变量的类型
如果将pojo当作流程变量使用时,必须要实现序列化接口serialzable,为防止由于新增字段无法序列化,需要生成serialsionUID。
流程变量的类型有:
String、Integer、short、long、double、boolean、date、binary、serializable
流程变量的作用域
流程变量的作用域可以是一个流程实例(processInstance),或是一个任务(task),或是一个执行的实例(execution)
global变量
流程变量的默认作用域是流程实例,当一个流程变量是流程实例时,可以称为global变量。
如:global变量userId,zhangsan
global变量中的变量名不允许重复,设置同样名称的变量,后设置的值会覆盖前设置的变量值。
local变量
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,成为local变量。
local变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名想吐没有影响。local变量名也可以和global变量名相同,没有影响。

流程变量的使用方法
在属性上使用UEL表达式
可以在assignee处设置UEL表达式,表达式的值为任务的负责人,比如:${assignee},assignee就是一个流程变量名称。Activiti获取UEL表达式的值,即流程变量assignee的值,将assignee的值作为任务的负责人进行任务分配。

在连线上使用UEL表达式
可以在连线上设置UEL表达式,决定流程走向。

比如:${price<10000}。price就是一个流程变量名称,uel表达式结果类型为布尔类型。
如果UEL表达式是true,要决定流程执行走向。

应用
设计带有变量的流程实例
在这里插入图片描述
画图中需要设置流程引擎,不然的话在assginee中会没有用户显示
在这里插入图片描述
这里设置的却别在于bpmn中文件的区别如下:
在这里插入图片描述
在这里插入图片描述
全局变量在开启实例时注入代码

 @Test
    public void test03(){
        ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
        RuntimeService service = engine.getRuntimeService();
        Evection evection = new Evection();
        evection.setNum(3);
        Map<String, Object> map = new HashMap<>();
        map.put("evection",evection);
        ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539",map);
//        ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655006033525");
//        ProcessInstance evection = service.startProcessInstanceById("27501");
        System.out.println(evectionInstance.getProcessDefinitionId());
        System.out.println(evectionInstance.getProcessDefinitionName());
        System.out.println(evectionInstance.getId());
        System.out.println(evectionInstance.getName());
    }

局部变量注入代码,局部变量在任务执行任务的时候,该变量在该任务结束时失效。以下代码不适用于上面的流程,上面的流程会报错,只是展示怎么注入

/**
     * 查询任务,处理任务
     */
    @Test
    public void test04(){
        ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
        TaskService service = engine.getTaskService();
        //查询任务
        Task task = service.createTaskQuery()
                .taskAssignee("user2")
                .processDefinitionKey("Process_1655017372539")
                .singleResult();
        //处理任务
        Evection evection = new Evection();
        evection.setNum(2);
        Map<String, Object> map = new HashMap<>();
        map.put("evection",evection);
        service.setVariablesLocal(task.getId(),map);
        service.complete(task.getId());
    }

如果执行该代码于上面流程会报一下错误:

15:39:00.589 [main] ERROR org.activiti.engine.impl.interceptor.CommandContext - Error while closing command context
org.activiti.engine.ActivitiException: Unknown property used in expression: ${evection.num>=3}

所示缺少表达式,因为这个表达式是写在了连接上边
完整代码:

public class Test02 {
    //部署流程,创建默认数据库表
    @Test
    public void test01(){
        //默认加载resource路径下的activiti.cfg.xml
        ProcessEngine engin= ProcessEngines.getDefaultProcessEngine();
        System.out.println(engin);
    }

    /**
     * 部署流程
     */
    @Test
    public  void test02(){
        //获取引擎
        ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
        //获取资源服务
        RepositoryService service = engine.getRepositoryService();
        Deployment deploy = service.createDeployment()
                .addClasspathResource("bpmn/evection_num.bpmn")
                .addClasspathResource("bpmn/evection_num.svg")
                .name("流程变量测试")
                .deploy();
        System.out.println("部署的id:"+deploy.getId());
        System.out.println("部署的key:"+deploy.getKey());
        System.out.println("部署的名称:"+deploy.getName());
        System.out.println("部署的时间:"+deploy.getDeploymentTime());
//        部署的id:27501
//        部署的key:evection
//        部署的名称:出差申请流程
//        部署的时间:Sun Jun 12 00:48:46 CST 2022
    }

    /**
     * 开启一个实例
     */
    @Test
    public void test03(){
        ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
        RuntimeService service = engine.getRuntimeService();
        Evection evection = new Evection();
        evection.setNum(3);
        Map<String, Object> map = new HashMap<>();
        map.put("evection",evection);
//        ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539",map);
        ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539");
//        ProcessInstance evection = service.startProcessInstanceById("27501");
        System.out.println(evectionInstance.getProcessDefinitionId());
        System.out.println(evectionInstance.getProcessDefinitionName());
        System.out.println(evectionInstance.getId());
        System.out.println(evectionInstance.getName());
    }

    /**
     * 查询任务,处理任务
     */
    @Test
    public void test04(){
        ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
        TaskService service = engine.getTaskService();
        //查询任务
        Task task = service.createTaskQuery()
                .taskAssignee("user2")
                .processDefinitionKey("Process_1655017372539")
                .singleResult();
        //处理任务
        Evection evection = new Evection();
        evection.setNum(2);
        Map<String, Object> map = new HashMap<>();
        map.put("evection",evection);
        service.setVariablesLocal(task.getId(),map);
        service.complete(task.getId());
    }


}

pojoEvection需要实现序列化

import lombok.Data;

import java.io.Serializable;
import java.util.Date;
@Data
public class Evection implements Serializable {
    private long id;    private String evectionName;
    /**     * 出差的天数     */
    private double num;
    private Date beginDate;
    private Date endDate;
    private String destination;
    private String reson;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枣泥馅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值