• 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");
    */ } }
  • 相关阅读:
    备忘录模式(java)
    06
    观察者模式(java)
    迭代器模式(c++)
    06
    07
    2021.11.21(迭代器模式c++)
    2021.11.24(状态模式java)
    2021.11.22(hive安装)
    2021.11.23(MYSQL安装)
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9310939.html
Copyright © 2020-2023  润新知