天天看點

【第八篇】Flowable之流程變量

【第八篇】Flowable之流程變量

流程變量

  流程執行個體按步驟執行時,需要使用一些資料。在Flowable中,這些資料稱作變量(variable),并會存儲在資料庫中。變量可以用在表達式中(例如在排他網關中用于選擇正确的出口路徑),也可以在Java服務任務(service task)中用于調用外部服務(例如為服務調用提供輸入或結果存儲),等等。

  流程執行個體可以持有變量(稱作流程變量 process variables);使用者任務以及執行(executions)——流程目前活動節點的指針——也可以持有變量。流程執行個體可以持有任意數量的變量,每個變量存儲為ACT_RU_VARIABLE資料庫表的一行。

  所有的startProcessInstanceXXX方法都有一個可選參數,用于在流程執行個體建立及啟動時設定變量。例如,在RuntimeService中:

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);      

  也可以在流程執行中加入變量。例如,(RuntimeService):

void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);      
【第八篇】Flowable之流程變量

1.全局變量

  流程變量的預設作用域是流程執行個體。當一個流程變量的作用域為流程執行個體時,可以稱為 global 變量

注意:如: Global變量:userId(變量名)、zhangsan(變量值)

  global 變量中變量名不允許重複,設定相同名稱的變量,後設定的值會覆寫前設定的變量值。

2. 局部變量

  任務和執行執行個體僅僅是針對一個任務和一個執行執行個體範圍,範圍沒有流程執行個體大, 稱為 local 變量。

  Local 變量由于在不同的任務或不同的執行執行個體中,作用域互不影響,變量名可以相同沒有影響。Local 變量名也可以和 global 變量名相同,沒有影響。

3.案例講解

需求:員工建立出差申請單,由部門經理稽核,部門經理申請通過後3天以下由财務直接申批,3天以上先由總經理審批,總經理審批通過後再由财務審批。

【第八篇】Flowable之流程變量

連接配接先設定條件

【第八篇】Flowable之流程變量
【第八篇】Flowable之流程變量

部署流程

@Test
public void deploy(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    Deployment deploy = repositoryService.createDeployment()
        .addClasspathResource("出差申請單.bpmn20.xml")
        .name("請假流程...")
        .category("請假") // 分類
        .tenantId("dpb") // 租戶id
        .deploy();
    System.out.println("deploy.getId() = " + deploy.getId());
    System.out.println("deploy.getName() = " + deploy.getName());
    System.out.println("deploy.getCategory() = " + deploy.getCategory());
}      

啟動流程執行個體:并且指定全局流程變量

/**
     * 在啟動流程執行個體的時候設定流程變量
     */
    @Test
    public void runProcess(){
        // 擷取流程引擎對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 啟動流程執行個體通過 RuntimeService 對象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 設定流程變量
        Map<String,Object> variables = new HashMap<>();
        // 設定assignee的取值
        variables.put("assignee0","張三");
        variables.put("assignee1","李四");
        variables.put("assignee2","王五");
        variables.put("assignee3","趙财務");
        // 啟動流程執行個體,第一個參數是流程定義的id
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("evection:1:4",variables);// 啟動流程執行個體
        // 輸出相關的流程執行個體資訊
        System.out.println("流程定義的ID:" + processInstance.getProcessDefinitionId());
        System.out.println("流程執行個體的ID:" + processInstance.getId());
        System.out.println("目前活動的ID:" + processInstance.getActivityId());

    }      

完成Task任務,同時也可以指定流程變量

/**
     * 完成任務時指定流程變量
     */
    @Test
    public void completeTask(){

        // 擷取流程引擎對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionId("evection:1:4")
                .taskAssignee("李四")
                .singleResult();
        // 添加流程變量
        Map<String, Object> map = task.getProcessVariables();
        map.put("num",4);

        // 完成任務
        taskService.complete(task.getId(),map);
    }      
/**
     * 通過目前任務設定
     */
    @Test
    public void currentTask(){
        //   目前待辦任務id
        //  擷取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionId("evection:1:4")
                .taskAssignee("王五")
                .singleResult();
        // 添加流程變量
        Map<String, Object> map = task.getProcessVariables();
        map.put("num",1);
        //  一次設定多個值 設定局部變量
        taskService.setVariables(task.getId(), map);
    }      

繼續閱讀