1.什么是流程变量

流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti 结合时少不了流程变量,流程变量就是 activiti 在管理工作流时根据管理需要而设置的变量。

比如在请假流程流转时如果请假天数大于 3 天则由总经理审核,否则由人事直接审核,请假天数就可以设置为流程变量,在流程流转时使用。

注意:

如果将 pojo 存储到流程变量中,必须实现序列化接口 serializable,为了防止由于新增字段无法反序列化,需要生成 serialVersionUID

2.流程变量作用域

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

  • global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。

  • Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。

  • Local 变量名也可以和 global 变量名相同,没有影响。

3.流程变量使用方法

第一步:设置流程变量

第二步:通过UEL表达式使用流程变量

(1)可以在assginee处设置UEL表达式,表达式的值为任务的负责人,比如${assignee}

(2)可以在连线上设置UEL表达式,决定流程走向,比如${num>3}

4.使用Global变量控制流程

(1)需求

员工创建请假申请单,由部门经理审核,部门经理审核通过后请假 3 天及以下由人事经理直接审核,3 天以上先由总经理审核,总经理审核通过再由人事经理存档。

(2)流程定义

流程审批的人为方便测试设置为固定值:

填写请假申请单:zhangsan

部门经理审批:lisi

总经理审批:wangwu

人事经理存档:zhaoliu

根据请假天数走不同的分支:

(3)启动流程时设置

在启动流程时设置流程变量,变量的作用域是整个流程实例。

通过 map<key,value>设置流程变量,map 中可以设置多个变量,这个 key 就是流程变量的名字。

// 启动流程时设置流程变量 @Testpublic void startProcessInstance() {// 流程定义keyString processDefinitionKey = "";Holiday holiday = new Holiday();holiday.setNum(3f);// 定义流程变量Map<String, Object> variables = new HashMap<>();//变量名是num,变量值是holiday.getNum(),变量名也可以是一个对象variables.put("num", holiday.getNum());//1.创建ProcessEngineer对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2.获取runtimeServiceRuntimeService runtimeService = processEngine.getRuntimeService();ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);System.out.println(" 流 程 实 例 id:" + processInstance.getProcessInstanceId());}

(4)创建请假实体类对象

/*** 请假实体类:*    注意POJO类型,一定要实现Serializable接口,否则在存储这个pojo时就会报异常*/
@Data
public class Holiday implements Serializable {private Integer id;private String holidayName;//申请人的名字private Date beginDate;//开始时间private Date endDate;//结束日期private Float num;//请假天数private String reason;//事由private String type;//请假类型}

(4)流程定义部署

    //新的请假流程定义的部署public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​//2.得到RepositoryService对象RepositoryService repositoryService = processEngine.getRepositoryService();
​//3.部署Deployment deploy = repositoryService.createDeployment().addClasspathResource("diagram/holiday4.bpmn").addClasspathResource("diagram/holiday4.png").name("请假流程-流程变量").deploy();
​System.out.println(deploy.getId());System.out.println(deploy.getName());}

(5)启动流程实例

    //启动流程实例,同时还要设置流程变量的值// act_ge_bytearray// act_ru_variablepublic static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​//2.得到RuntimeServiceRuntimeService runtimeService =  processEngine.getRuntimeService();
​//3.流程定义的key问题String key = "holiday4";Map<String ,Object> map = new HashMap<>();
​Holiday holiday = new Holiday();holiday.setNum(5F);map.put("holiday",holiday);
​//4.启动流程实例,并且设置流程变量的值ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map);
​//5.输出实例信息System.out.println(processInstance.getName());System.out.println(processInstance.getProcessDefinitionId());
​}

(6)执行流程

依次执行zhangsan,lisi,wangwu,zhaoliu的任务

    public static void main(String[] args) {//完成任务  zhangsan  -----lisi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​//2.得到TaskServiceTaskService taskService = processEngine.getTaskService();
​//3.查询当前用户是否有任务String key = "holiday4";Task task = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee("zhangsan").singleResult();
​//4.判断task!=null,说明当前用户有任务if(task!=null){taskService.complete(task.getId());System.out.println("任务执行完毕");}
​}

通过创建流程实例时设置的请假天数num变量,可以发现当num>3的时候,在通过部门经理审批后,会先走总经理审批。当num=3的时候,在通过部门经理审批后,就可以直接到达人事经理存档环节。

(7)global变量的其它设置方法

global除了在启动流程时设置,还可以在以下步骤中设置

  • 任务办理时设置

在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。

    public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​//2.得到TaskServiceTaskService taskService = processEngine.getTaskService();
​//3.查询当前用户是否有任务String key = "holiday4";Task task = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee("zhangsan").singleResult();
​//初始化一些参数Map<String ,Object> map = new HashMap<>();
​Holiday holiday = new Holiday();holiday.setNum(5F);map.put("holiday",holiday);
​//4.判断task!=null,说明当前用户有任务if(task!=null){taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值System.out.println("任务执行完毕");}
​}
  • 通过当前流程实例设置

通过流程实例 id 设置全局变量,该流程实例必须未执行完成

    public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​//2.得到RuntimeServiceRuntimeService runtimeService =  processEngine.getRuntimeService();
​//3.流程定义的key问题   myProcess_1//Map<String ,Object> map = new HashMap<>();
​Holiday holiday = new Holiday();holiday.setNum(5F);// map.put("holiday",holiday);
​//4.通过实例id,来设置流程变量//第一个参数:流程实例的id//第二个参数:流程变量名//第三个变量:流程变量名,所对应的值runtimeService.setVariable("2501","holiday",holiday);
​}
  • 通过当前任务设置

    public static void main(String[] args) {    //当前待办任务id String taskId="1404";//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService(); Holiday holiday = new Holiday();holiday.setNum(3f);//通过任务设置流程变量taskService.setVariable("1404", "holiday", holiday); //一次设置多个值//taskService.setVariables(taskId, variables)}

5.设置local流程变量

(1)任务办理时设置

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

    // 办理任务时设置local流程变量@Testpublic void completTask() { //任务idProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();String taskId = "1404";TaskService taskService = processEngine.getTaskService();// 定义流程变量Map<String, Object> variables = new HashMap<String, Object>();Holiday holiday = new Holiday();holiday.setNum(3f);// 定义流程变量variables.put("holiday", holiday);// 设置local变量,作用域为该任务 // taskService.setVariablesLocal(tasked, variables);taskService.complete(taskId);}

(2)通过当前任务设置

    @Testpublic void setLocalVariableByTaskId(){ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//当前待办任务idString taskId="1404";TaskService taskService = processEngine.getTaskService(); Holiday holiday = new Holiday ();holiday.setNum(3f);//通过任务设置流程变量taskService.setVariableLocal(taskId, "holiday", holiday); //一次设置多个值//taskService.setVariablesLocal(taskId, variables)}

Activiti工作流之流程变量相关推荐

  1. Activiti工作流之流程分支

    回顾: Activiti工作流之简介与环境搭建 Activiti工作流之流程部署和相关操作 Activiti工作流之任务的运行/查询/完成 Activiti工作流之流程变量 Activiti工作流之历 ...

  2. Activiti——工作流之流程实例、任务的执行(五)

    转自:http://profound-accumulation.iteye.com/blog/2244881 一.流程图   二.部署流程定义 /**部署请假流程(从zip)*/ @Test publ ...

  3. Java Activiti 工作流引擎 流程审批 后台框架源码 springmvc SSM

    博文来源:http://www.fhadmin.org/webnewsdetail1.html 工作流模块----------------------------------------------- ...

  4. springmvc SSM Activiti 工作流引擎 流程审批 后台框架 源码 shiro权

    工作流模块----------------------------------------------------------------------------------------------- ...

  5. Activiti工作流之历史查询

    流程的部署和流程的启动步骤就不贴出代码了, 请看我的Activiti系列之前的代码即可 系列回顾: 1 Activiti工作流之简介与环境搭建 2 Activiti工作流之流程部署和相关操作 3 Ac ...

  6. 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot

    本篇学习笔记是观看黑马程序员Activiti7视频而得 Activiti7 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是" ...

  7. Activiti工作流学习笔记01

    Activiti6工作流学习笔记01 activiti工作流目前官方最新版本是7.x,但....版本不重要了.这篇笔记只是我学习activiti6过程中的自我总结.如果笔记上有错误的话,欢迎赐教,谢谢 ...

  8. Activiti工作流引擎进阶【收藏可做笔记系列】

    Activiti工作流引擎进阶 Activiti进阶 一.流程实例 什么是流程实例 启动流程实例 并添加Businesskey(业务标识) 操作数据库表 查询流程实例 关联BusinessKey 挂起 ...

  9. Activiti工作流之个人任务分配模式

    1.固定分配 在进行业务流程建模时指定固定的任务负责人. 在 properties 视图中,填写 Assignee 项为任务负责人 由于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照 ...

最新文章

  1. 实战SSM_O2O商铺_45【Redis缓存】配置Redis在Service层加入缓存
  2. S/4HANA生产订单的标准状态和透明工厂原型状态的映射
  3. C# 中xml数组的序列和反序列化方法
  4. js/css文件修改后浏览器本地缓存解决
  5. Docker上搭建Mysql8.0服务器
  6. VB为MSHFlexGrid添加表格编辑功能
  7. 嵌入式组态软件HMImaker(绿色版人机界面组态软件)
  8. 学神经网络需要什么基础,神经网络需要什么基础
  9. oracle上如何下载java_王二暖Oracle视频教程 下载
  10. 游戏的交互设计与心理学应用
  11. redis 集群详解及搭建过程
  12. 如何在服务器查看文件,如何在服务器地址上查看文件夹
  13. springboot+vue基本微信小程序的疫情防控平台系统 计算机毕业设计
  14. SSD测试专题(三)
  15. Machin(梅钦/马青)公式计算圆周率π
  16. 解决Discus!x3.1论坛安装插件提示无法运行通过zend加密应用
  17. JavaFX+Jfoenix 学习笔记(序)--引言And软件截图
  18. libcurl.dll丢失怎么办?libcurl.dll丢失的解决方法
  19. PowerShell 和Microsoft Dynamics NAV / Business Central 关联
  20. java cache定时过期_一个定时更新cache框架

热门文章

  1. 01. 对称密码——算法
  2. java大乘期(33)----java进阶(springboot基础(1)----springboot基本概念)
  3. DRF框架—序列化器中的字段校验规则
  4. 基础知识——密码学笔记(一)
  5. 密码学基础知识(八)略说数字签名
  6. leetcode 最长公共前缀
  7. Windbg无源码调试驱动
  8. MySQL创建触发器(CREATE TRIGGER)
  9. 【Let‘s Encrypt】 too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limit
  10. 在Debian 上安装php zip扩展