zoukankan      html  css  js  c++  java
  • Activiti任务分配

    分配任务负责人

    一、固定分配

    在进行业务流程建模时指定固定的任务负责人

       

    在properties 视图中,填写Assignee 项为任务负责人。

    注意:

      由于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照  bpmn  的配置去分配任务负责人。

    二、表达式分配

    1、UEL 表达式

      Activiti 使用UEL 表达式,UEL 是java EE6 规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti 支持两个UEL 表达式:UEL-value 和UEL-method。

    1.1 UEL-value 定义

      

      assignee 这个变量是activiti 的一个流程变量。

    或:

      

      user 也是activiti 的一个流程变量,user.assignee 表示通过调用user 的getter 方法获取值。 

    1.2 UEL-method 方式

       

      userBean 是spring 容器中的一个bean,表示调用该bean 的getUserId()方法。

    1.3 UEL-method 与UEL-value 结合

      ${ldapService.findManagerForEmployee(emp)}

      ldapService 是spring 容器的一个bean,findManagerForEmployee 是该bean 的一个方法,emp 是activiti流程变量,emp 作为参数传到ldapService.findManagerForEmployee 方法中。

    1.4 其它

      表达式支持解析基础类型、bean、list、array map,也可作为条件判断。如下:

      ${order.price > 100 && order.price < 250}

    三、使用流程变量分配任务

    1、定义任务分配流程变量

      

    2、设置流程变量

      在启动流程实例时设置流程变量,如下:   

    package com.zn;
    
    import org.activiti.engine.*;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ActivitiTest {
        /**
         * 流程部署
         */
        @Test
        public void deployment() {
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取RepositoryService对象进行流程部署
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
            Deployment deployment = repositoryService.createDeployment()
                    .addClasspathResource("bmpnfiles/holiday.bpmn")     //加载流程文件
                    .addClasspathResource("bmpnfiles/holiday.png")
                    .name("请假流程-任务分配")       //设置流程名称
                    .key("holiday")
                    .deploy();                      //部署
    
            //输出部署信息
            System.out.println("流程名称:" + deployment.getName());
            System.out.println("流程ID:" + deployment.getId());
            System.out.println("流程Key:" + deployment.getKey());
        }
    
        /**
         * 启动一个流程实例
         */
        @Test
        public void getInstance() {
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取RuntimeService
            RuntimeService runtimeService = processEngine.getRuntimeService();
            //定义一个Map集合,存放assignee的值
            Map<String, Object> assMap = new HashMap<>();
            assMap.put("assignee01", "zhuyuan");
            assMap.put("assignee02", "jingjie");
            assMap.put("assignee03", "guangge");
            assMap.put("assignee04", "chaoge");
            //启动一个流程实例
            ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday", assMap);
            System.out.println("流程启动成功~");
        }
    }

    3、注意事项

      由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:

      某个任务使用了表达式${order.price > 100 && order.price < 250},当执行该任务时必须保证order 在流程变量中存在,否则activiti 异常。

    四、监听器分配

      任务监听器是发生对应的任务相关事件时执行自定义java 逻辑 或表达式。任务相当事件包括:

      

      Create:任务创建后触发

      Assignment:任务分配后触发

      Delete:任务完成后触发

      All:所有事件发生都触发

      java 逻辑 或表达式:

        表达式参考上边的介绍的UEL 表达式,这里主要介绍监听类使用。

    定义任务监听类,且类必须实现org.activiti.engine.delegate.TaskListener 接口

    package com.zn.listener;
    
    import org.activiti.engine.delegate.DelegateTask;
    import org.activiti.engine.delegate.TaskListener;
    
    public class MyTaskListener implements TaskListener {
    
        @Override
        public void notify(DelegateTask delegateTask) {
            //这里执行任务负责人
            delegateTask.setAssignee("zhuyuan");
        }
    }

     注意事项:

      使用监听器分配方式,按照监听事件去执行监听类的 notify 方法,方法如果不能正常执行也会影响任务的执行。

    五、查询任务

      查询任务负责人的代办任务;

    package com.zn;
    
    import org.activiti.engine.*;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ActivitiTest {
    
        /**
         * 查看代办任务
         */
        @Test
        public void getTask(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取一个TaskService对象
            TaskService taskService=processEngine.getTaskService();
            //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
            List<Task> list = taskService.createTaskQuery().taskAssignee("zhuyuan").processDefinitionKey("holiday").list();
            for (Task task:list){
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务执行人:"+task.getAssignee());
                System.out.println("任务ID:"+task.getId());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
            }
        }
    
    }

    控制台效果:

      

    六、关联 businessKey

    需求:

      在activiti   实际应用时,查询待办任务可能要显示出业务系统的一些相关信息,比如:查询待审批请假单任务列表需要将请假单的日期、请假天数等信息显示出来,请假天数等信息在业务系统中存在, 而并没有在activiti 数据库中存在,所以是无法通过activiti 的api 查询到请假天数等信息。

    实现:

      在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的请假单表,查询出请假天数等信息。

      

    七、办理任务

    package com.zn;
    
    import org.activiti.engine.*;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class ActivitiTest {
        /*任务处理
         * `act_hi_identitylink`     历史参与者信息
         * `act_hi_taskinst`         历史任务信息
         * `act_ru_execution`        任务执行信息
         * `act_ru_task`             任务信息
         * 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息
         * */
        @Test
        public void completeTask(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取一个TaskService对象
            TaskService taskService = processEngine.getTaskService();
            //任务处理
            taskService.complete("2509");
        }
    
    }
  • 相关阅读:
    Allegro PCB转换成PADS方法
    Altium Designer只显示某一层,隐藏其他层
    DCDC功率电感(Inductor)选型
    DDR布线教程
    DDR地址、容量计算、Bank理解
    DDR3中的ODT(On-die termination)
    LINUX文件系统操作指令之四
    linux系统之间通过nfs网络文件系统挂载设置方法
    linux消息队列编程实例
    system()函数
  • 原文地址:https://www.cnblogs.com/Zzzzn/p/12642574.html
Copyright © 2011-2022 走看看