Activiti工作流學習(五)

前言

工作流中會帶有參數跟着流程走,例如我們的請假例子,請假一定要有請假天數、請假原因和開始時間等參數,這些參數要跟着流程走讓經理和老闆看到你請假的具體信息。今天就講這些參數是如何添加到流程中並獲取顯現。

兩種變量添加方式

  1. 流程實例上的變量
/*
 * 流程實例級別的變量(在流程實例啓動時就把變量放到正在執行的流程對象中)
 */
@Test
public void startProcessInstanceWithVarivablue(){

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("請假天數", 3);
    map.put("請假原因", "旅遊去");
    map.put("請假開始時間", new Date());
    //在流程實例上添加的變量影響範圍:當前流程實例下的所有任務都能獲取到流程變量,正在執行的流程對象也能獲得到變量
    //當流程實例結束時流程變量消失,正在執行的對象消失,流程變量歷史表保留變量
    //影響的表act_ru_variable和act_hi_varinst.
    runtimeService.startProcessInstanceByKey("activiti_leave", map);
}

從代碼中可以看出該流程變量是在流程啓動時就添加到流程實例中的。下邊的代碼是如何獲取該變量。

@Test
public void SelectVarivablue(){
    List<Execution> executionList = runtimeService.createExecutionQuery()
            .processDefinitionKey("activiti_leave")
            .orderByProcessInstanceId()
            .asc()
            .list();
    Execution execution = executionList.get(0);
    Map<String,Object> map = runtimeService.getVariables(execution.getId());
    System.out.println(map);
}

2.當前任務中來儲存流程變量

/*
* 在當前任務中來儲存流程變量,流程的變量儲存在正在執行的流程對象上,當前任務後面的所有任務就都能拿到流程變量
*/
@Test
public void putVariablesIntask(){
    String assignee = "employnee";
    Task task = taskService.createTaskQuery()
                .processDefinitionKey("activiti_leave")
                .taskAssignee(assignee)
                .singleResult();
    //設置流程變量
    /*taskService.setVariable(task.getId(), "請假天數" ,10);
      taskService.setVariable(task.getId(), "請假原因" , "結婚");
      taskService.setVariable(task.getId(), "請假開始時間" ,new Date());*/

    Map<String,Object> map = new HashMap<String,Object>();
    map.put("請假天數", 3);
    map.put("請假原因", "旅遊去");
    map.put("請假開始時間", new Date());
    //當任務完成時設置流程變量
    taskService.complete(task.getId(), map);
}

在當前任務中來儲存流程變量也分爲兩種,從上邊的代碼中也可以看出一種是直接用taskService.setVariable方法(註解掉的部分)設置,另一中是先放在map中再任務完成時添加。

下邊是對應上邊兩種變量設置方法的獲取方法

//第一種
@Test
public void getVariablesIntask(){
    String assignee = "employnee";
    Task task = taskService.createTaskQuery()
                .processDefinitionKey("activiti_leave")
                .taskAssignee(assignee)
                .singleResult();

    Integer days = (Integer) taskService.getVariable(task.getId(), "請假天數");
    String reason = (String) taskService.getVariable(task.getId(), "請假原因");
    Date startTime = (Date) taskService.getVariable(task.getId(), "請假開始時間");
    System.out.println(days);
    System.out.println(reason);
    System.out.println(startTime);
}

//第二種
@Test
public void getVariablesIntaskWithMap(){
    String assignee = "employnee";
    Task task = taskService.createTaskQuery()
                .processDefinitionKey("activiti_leave")
                .taskAssignee(assignee)
                .singleResult();

    Map<String,Object> map = taskService.getVariables(task.getId());
    System.out.println(map);
}

以上兩種獲取方式都是缺點節點的任務只有一個時使用的,如果有多個則需要判斷是那個,就使用如下方法

@Test
public void getVariablesIntaskWithMap(){
        String assignee = "employnee";
        List<Task> taskList = taskService.createTaskQuery()//創建任務 查詢對象
                        .processDefinitionKey("activiti_leave")//根據流程定義key查詢
                        .taskAssignee(assignee)//根據辦理人查詢
                        .orderByTaskCreateTime()
                        .desc()
                        .list();
        //獲取第一個任務
        Task task = taskList.get(0);
        Map<String,Object> map = taskService.getVariables(task.getId());
        System.out.println(map);
  }

注意事項:

添加的變量可以是自定義的類型,使用自定義的pojo要注意必須實現序列化接口並添加uid,具體的使用方式大家百度吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章