zoukankan      html  css  js  c++  java
  • 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");
    */ } }
  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9310939.html
Copyright © 2011-2022 走看看