activiti5 學習 【流程變量】

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;

/**
 * 在執行流程的過程中產生數據稱爲流程變量
 *    1、流程變量的生命週期
 *               就是流程實例
 *    2、流程變量和流程實例的關係
 *        流程變量必須和流程實例綁定在一起
 *    3、通過什麼樣的方法把一個流程變量存放在流程實例中
 *    4、通過什麼樣的方法把一個流程變量從流程實例中提取出來
 *    5、把一個對象放入到流程變量中,該對象必須實現對象的序列化
 * @author zd
 *
 */
public class VariablesTest {
    /**
     * 涉及到的表
     *    act_hi_varinst     varinst:變量實例
     *    act_ru_variable    存放當前正在執行的流程實例的流程變量
     *         execution_id_:流程實例ID
     *         proc_inst_id_:流程實例ID
     *       可以根據流程實例ID獲取到該流程實例的流程變量
     */
    @Test
    public void testStartPI(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("當啓動流程實例的時候", "啓動流程實例的流程變量");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
        //當啓動流程實例的時候添加流程變量
        .startProcessInstanceByKey("qingjia", variables);
    }
    
    /**
     * 在完成任務的時候,設置流程變量
     */
    @Test
    public void testFinishTask(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("請假天數", 3);
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
        .complete("805", variables);
    }
    
    /**
     * 在流程實例的任何時候(只要流程實例沒有結束),設置流程變量
     */
    @Test
    public void testSetVariablesWhenPI(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
            /**
             * executionId  針對哪一個流程實例設置流程變量
             * variableName  變量的名稱
             * value  變量的值
             */
            .setVariable("801", "aaa", "aaa");
    }
    
    /**
     * 怎麼樣得到流程變量
     */
    @Test
    public void testGetVariables(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //獲取指定的流程實例下面的所有的流程變量
        Map<String, Object> variables = processEngine.getRuntimeService()
        .getVariablesLocal("801");
        for (Entry<String, Object> entry:variables.entrySet()) {
            if(entry.getValue() instanceof Person){
                Person person = (Person)entry.getValue();
                System.out.println(person.getName());
            }else{
                System.out.println(entry.getKey());
                System.out.println(entry.getValue());
            }
            
        }
    }
    
    /**
     * 在流程實例的任何時候(只要流程實例沒有結束),設置流程變量
     */
    @Test
    public void testSetVariables_Object_WhenPI(){
        Person person = new Person();
        person.setPid(1L);
        person.setName("王二麻子");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
            /**
             * executionId  針對哪一個流程實例設置流程變量
             * variableName  變量的名稱
             * value  變量的值
             */
            .setVariable("801", "person", person);
    }
}

person類

import java.io.Serializable;

public class Person implements Serializable{
    private Long pid;
    private String name;
    public Long getPid() {
        return pid;
    }
    public void setPid(Long pid) {
        this.pid = pid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    
}

給任務賦值任務的執行人

在進入該節點之前就能確定任務的執行者

流程圖中設置流程變量,如下:

import java.util.HashMap;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;


/**
 * <userTask id="申請請假" name="申請請假" activiti:assignee="#{applicator}"></userTask>
 * 如果一個任務節點的執行人是通過上面的形式賦值的,那麼在進入該節點之前,必須給變量applicator賦值(通過流程變量)
 * @author zd
 *
 */
public class Task1Test {
    @Test
    public void testDeploy(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRepositoryService()
        .createDeployment()
        .addClasspathResource("com/itheima10/activiti/task/task1.bpmn")
        .deploy();
    }
    
    /**
     * 在啓動流程實例的時候,設置流程變量,給aplicator賦值
     */
    @Test
    public void testStartPI(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("applicator", "張三");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
        .startProcessInstanceById("myProcess:1:1204",variables);
    }
    
    /**
     * 在完成請假申請任務的時候,設置流程變量
     */
    @Test
    public void testFinishApplicatorTask(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("manager", "李四");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
        .complete("1305", variables);
    }
    
    /**
     * 在完成部門經理審批的任務的時候,設置流程變量,給總經理任務的執行人賦值
     */
    @Test
    public void testFinishManagerTask(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("boss", "王五");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
        .complete("1403", variables);
    }
    
    /**
     * 完成總經理的任務
     */
    @Test
    public void testFinishBossTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()
        .complete("1503");
    }
}

 在進入該節點之後,纔要確定節點的執行者是誰

流程圖如下:

1、可以通過MyTaskListener的方式給任務賦值執行人
 <userTask id="部門經理審批" name="部門經理審批">
<extensionElements>
<activiti:taskListener event="create" class="com.itheima10.activiti.task.MyTaskListener"></activiti:taskListener>
</extensionElements>
</userTask>
當進入上述的userTask節點之後,立刻執行MyTaskListener的notify方法
delegateTask.setAssignee(manager);就是給MyTaskListener所在的任務節點賦值任務的執行人
說明:該類是由activiti內部調用的,不是由spring容器產生的,所以在notify方法中沒有辦法使用spring的聲明式事務處理產生事務
2、可以通過代碼的方式設置任務的執行人
processEngine.getTaskService()
.setAssignee(taskId, userId);
通過該方式也可以給正在執行的任務賦值任務的執行人

package com.itheima10.activiti.task;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class Task2Test {
    @Test
    public void testDeploy(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRepositoryService()
        .createDeployment()
        .addClasspathResource("com/itheima10/activiti/task/task2.bpmn")
        .deploy();
    }
    
    /**
     * 啓動流程實例,並且給流程變量 applicator,manager賦值
     */
    @Test
    public void testStartPI(){
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("applicator", "張三");
        variables.put("manager","李四");
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getRuntimeService()
        .startProcessInstanceById("task2:1:2104", variables);
    }
    
    /**
     * 根據張三查詢任務
     */
    @Test
    public void testQueryTaskByAssignee(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        List<Task> tasks = processEngine.getTaskService()
        .createTaskQuery()
        .taskAssignee("張三")
        .orderByTaskCreateTime()
        .desc()
        .list();
        
        for (Task task : tasks) {
            System.out.println(task.getAssignee());
            System.out.println(task.getName());
        }
    }
    
    @Test
    public void testFinishTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService().complete("2206");
        
    }
}
package com.itheima10.activiti.task;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class MyTaskListener implements TaskListener{
    /**
     * 
     */
    private static final long serialVersionUID = 1830618442071409874L;

    @Override
    public void notify(DelegateTask delegateTask) {
        String manager = delegateTask.getVariable("manager").toString();
        delegateTask.setAssignee(manager);
        
        /**
         *    獲得spring容器中的bean 
      *   WebApplicationContext ac = 
         *                 WebApplicationContextUtils.
         *                 getWebApplicationContext(ServletActionContext.getServletContext());
            IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
         */
    }
}

 

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