Activiti任务分配

分配任务负责人

一、固定分配

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

   Activiti任务分配_第1张图片

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

注意:

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

二、表达式分配

1、UEL 表达式

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

1.1 UEL-value 定义

  Activiti任务分配_第2张图片

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

或:

  Activiti任务分配_第3张图片

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

1.2 UEL-method 方式

   Activiti任务分配_第4张图片

  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、定义任务分配流程变量

  Activiti任务分配_第5张图片

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 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 逻辑 或表达式。任务相当事件包括:

  Activiti任务分配_第6张图片

  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 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());
        }
    }

}

控制台效果:

  Activiti任务分配_第7张图片

六、关联 businessKey

需求:

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

实现:

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

  Activiti任务分配_第8张图片

七、 办理任务

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

}

 

你可能感兴趣的:(Activiti任务分配)