1. 程式人生 > >Activiti工作流之流程變數

Activiti工作流之流程變數

以請假單為例, 流程變數的意義在於將請假單跟這個流程繫結在一起, 流程走到哪裡, 請假單的狀態就跟到哪裡, 相當於定義了一個流程變數來儲存相對應的狀態.

流程變數存在兩個級別位置, 一是流程例項級別的的流程變數(在流程例項啟動時就將流程變數放入), 二是流程任務級別的流程變數(在執行當前任務時將流程變數放入)

9張表:

SELECT * FROM act_re_deployment;   -- 一 流程部署表
 
SELECT * FROM act_ge_bytearray;    -- 二 流程二進位制表
 
SELECT * FROM act_re_procdef;      -- 三 流程定義表
 
SELECT * FROM act_ru_execution;    -- 四 流程正在執行表
 
SELECT * FROM act_hi_procinst;     -- 五 流程例項歷史表
 
SELECT * FROM act_ru_task;         -- 六 流程當前任務表
 
SELECT * FROM act_hi_taskinst;     -- 七 流程歷史任務表
 
SELECT * FROM act_hi_actinst;      -- 八 流程歷史活動節點表

SELECT * FROM act_ru_variable;     -- 九 流程變量表

SELECT * FROM act_hi_varinst;      -- 十 流程變數歷史表

先決條件:

//定義一個成員變數
    RepositoryService repositoryService;
    
    RuntimeService runtimeService;
    
    TaskService taskService;
    
    /**
     * 獲取流程引擎
     */
    @Before
    public void setUp() throws Exception {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        repositoryService = processEngine.getRepositoryService();
        runtimeService = processEngine.getRuntimeService();
        taskService = processEngine.getTaskService();
    }
    
    /**
     * 新增流程例項級別的流程變數並啟動流程
     */
    @Test
    public void startProcessInstanceWithVariables() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("請假天數", 3);
        map.put("請假原因", "出國留學了");
        map.put("請假開始時間", new Date());
        runtimeService.startProcessInstanceByKey("activiti_leave", map);
    }

① 流程例項級別的流程變數(流程例項範圍大, 能被範圍小的流程任務獲取到)

流程任務物件/流程正在執行物件查詢流程變數測試程式碼:

/**
     * 根據辦理人查詢任務並找出流程變數
     */
    @Test
    public void queryTaskByAssignee(){
        String assignee = "employee";
        List<Task> taskList = taskService.createTaskQuery()
                                         .processDefinitionKey("activiti_leave")
                                         .taskAssignee(assignee)
                                         .orderByTaskCreateTime()
                                         .desc()
                                         .list();
        Task task = taskList.get(0);
        Map<String, Object> map = taskService.getVariables(task.getId());
        System.out.println(map);
        
        List<Execution> executionList = runtimeService.createExecutionQuery()
                                                  .processDefinitionKey("activiti_leave")
                                                  .orderByProcessInstanceId()
                                                  .asc()
                                                  .list();
        Execution execution = executionList.get(0);
        Map<String, Object> map1 = runtimeService.getVariables(execution.getId());
        System.out.println(map1);
    }

小結: 在流程例項級別上的流程變數, 當流程任務物件所有節點都執行完成之後, 整條流程例項就已經結束了, 此時的流程變數就消失了, 也就無法再根據流程任務物件來拿流程變量了

② 流程任務級別的流程變數

/**
     * 在特定的任務下放入流程變數
     */
    @Test
    public void setVariablesInTask(){
        String assignee = "employee";
        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方式
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("請假天數", 11);
        map.put("請假原因", "任性罷了");
        map.put("開始時間", new Date());
        taskService.setVariables(task.getId(), map);
    }
    
    /**
     * 取出流程變數
     */
    @Test
    public void getVariablesInTask(){
        String assignee = "employee";
        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);
    }

還有一種通過物件的方式新增流程變數的, 具體用法跟上面差不多, 就不貼出程式碼了, 但是注意要在類進行序列化, 並且提供UID.

小結: 在流程任務物件級別上的流程變數, 當前任務以及之後的任務能夠通過當前正在執行的物件(因為該流程變數掛載在當前正在執行的物件上)來獲得到流程變數, 但是在當前任務之前的則無法獲取該流程變數.

Activiti系列回顧: