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


(一)基本概念

流程變量就是activiti在管理工作流時根據管理需要而設置的變量。比如在請假流程流轉時如果請假天數大於3天則由總經理審核,否則由人事直接審核,請假天數就可以設置為流程變量,在流程流轉時使用。

(二)作用域

流程變量的作用域默認是一個流程實例(processInstance),也可以是一個任務(task)或一個執行實例(execution),這三個作用域流程實例的范圍最大,可以稱為global變量,任務和執行實例僅僅是針對一個任務和一個執行實例范圍,范圍沒有流程實例大,稱為local變量。

(三)變量類型

 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 實現

(四)使用方法

1)設置流程變量
2)通過UEL表達式使用流程變量

  • 可以在assignee處設置UEL表達式,表達式的值為任務的負責人,比如:${assignee},assignee就是一個流程變量名稱,Activiti獲取UEL表達式的值,即流程變量assignee的值,將assignee的值作為任務的負責人進行任務分配。
  • 可以在連線上設置UEL表達式,決定流程走向,比如:${price>=10000}和${price<10000}:price就是一個流程變量名稱,uel表達式結果類型為布爾類型,如果UEL表達式是true,要決定流程執行走向。

 

(五)使用Global變量控制流程

流程:員工創建請假申請單,由部門經理審核,部門經理審核通過后請假3天及以下由人事直接審核,3天以上先由總經理審核,總經理審核通過再由人事審核存檔。

測試代碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM