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

 

posted @ 2018-07-14 23:25  H.U.C-王子  阅读(348)  评论(0编辑  收藏  举报