1. 程式人生 > >Activiti5工作流筆記二

Activiti5工作流筆記二

klist system activit RoCE ima obj rep ddc out

流程變量

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");
*/ } }

Activiti5工作流筆記二