activiti 7 + springboot2(九) 流程变量的使用

(一)基本概念java

流程变量就是activiti在管理工做流时根据管理须要而设置的变量。好比在请假流程流转时若是请假天数大于3天则由总经理审核,不然由人事直接审核,请假天数就能够设置为流程变量,在流程流转时使用。测试

(二)做用域this

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

(三)变量类型.net

 string  java.lang.String
 integer  java.lang.Integer
 short  java.lang.Short
 long  java.lang.Long
 double  java.lang.Double
 date  java.lang.Date
 binary  byte[]
 serializable  java.lang.Serializable 实现

(四)使用方法code

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

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

 

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

流程:员工建立请假申请单,由部门经理审核,部门经理审核经过后请假3天及如下由人事直接审核,3天以上先由总经理审核,总经理审核经过再由人事审核存档。作用域

测试代码:get

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()); } }

源代码下载  https://download.csdn.net/download/zsg88/12109277

相关文章
相关标签/搜索