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

相關文章
相關標籤/搜索