Activiti-个人任务

1.分配任务负责人

  1.1 固定分配

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

    

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

    注意事项:由固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照bpmn的配置去分配任务负责人;

  1.2 表达式分配

    1.2.1 UEL表达式

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

      1.2.1.1 UEL定义如下:

        

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

        或:

        

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

      1.2.1.2 UEL-method方式如下:

        

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

      1.2.1.3 UEL-method与UEL-value结合:

        ${ldapService.findManagerForEmployee(emp)}

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

        流程变量,emp作为参数传到ldapService.findManagerForEmployee方法中;

      1.2.1.4 其他:

        表达式支持解析基础类型,bean,list,array和map,也可作为条件判断;

        如下:

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

  1.3 使用流程变量分配任务

    1.3.1 定义任务分配流程变量

      

    1.3.2 设置流程变量

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

package com.wn.hoilday;

import com.wn.entity.Hoilday;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

import java.util.HashMap;
import java.util.Map;

/*启动流程*/
public class StartInstance {
    public static void main(String[] args) {
        //获取ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //设置流程变量
        Hoilday hoilday=new Hoilday();
        hoilday.setNum(3);
        //定义一个map集合,存放assignee的值
        Map<String ,Object> assMap=new HashMap<>();
        assMap.put("hoilday",hoilday);
        //启动一个流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("hoilday2", assMap);
        System.out.println("流程启动成功!");
    }
}

  1.4 注意事项

    由于使用表达式分配,必须保证在任务执行过程,表达式执行成功,比如:某个任务使用了表达式${order.price>100 && order.price<250},当执行该任务时必须保证order在流程变量中存在,否则activiti异常;

  1.5 监听器分配

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

    

    create:任务创建后触发;

    Assignment:任务分配后触发;

    Delete:任务完成后触发;

    All:所有事件发生后触发;

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

package com.wn.entity;

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

  1.6 注意事项

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

2. 查询任务

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

package com.wn.hoilday;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

import java.util.List;

/*查看代办任务*/
public class GetTask {
    public static void main(String[] args) {
        //获取ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取一个TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //查询代办业务 createTaskQuery查询任务  taskCandidateOrAssigned查询任务执行者    processDefinitionKey执行查看流程
        //查看hoilday流程中zhangsan代办的任务
        //taskCandidateOrAssigned匹配规则: 1.Assigned   2.配置bpmn文件中定义的值
        /*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("zhangsan").processDefinitionKey("hoilday").list();*/
        //taskAssignee查看当前指定人的指定任务
        List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("hoilday").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());
        }
    }
}

3. 关联businessKey

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

  实现:在查询待办任务时,通过businessKey关联查询业务系统的请假单表,查询出请假天数等信息;

    

4.办理任务

  指定任务ID,调用TaskService完成任务;

package com.wn.hoilday;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;

/*任务处理
* `act_hi_identitylink`     历史参与者信息
* `act_hi_taskinst`         历史任务信息
* `act_ru_execution`        任务执行信息
* `act_ru_task`             任务信息
* 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息
* */
public class CompleteTask {
    public static void main(String[] args) {
        //获取ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象进行流程部署
        TaskService taskService = processEngine.getTaskService();
        //任务处理
        taskService.complete("7502");
    }
}

    

原文地址:https://www.cnblogs.com/wnwn/p/12641760.html