Avtiviti(五)之个人任务

1、分配任务负责人

1.1 固定分配

       我们之前使用的方式都是使用固定分配的方式。就是在某一个节点,固定的指定只有谁能去执行该任务。所以这里就不再赘述了。

1.1.1 注意事项

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

 

1.2 表达式分配

1.2.1 UEL表达式

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

UEL-value定义如下:           

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

也可以是下面这种方式定义:

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

 

UEL-method方式如下:

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

 

UEL-method与UEL-value结合
再比如:
${ldapService.findManagerForEmployee(emp)}
ldapService是spring容器的一个bean,findManagerForEmployee是该bean的一个方法,emp是activiti流程变量,emp作为参数传到ldapService.findManagerForEmployee方法中。
其它:
表达式支持解析基础类型、bean、list、array和map,也可作为条件判断。
如下:${order.price > 100 && order.price < 250}

 

1.2.2 使用流程变量分配任务

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

package com.zdw.activiti02;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;

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

/**
 * 任务分配的操作
 */
public class TaskFenPeiOperate {

    //启动流程实例,设置流程变量
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //设置流程变量的值,可以是map
        Map<String,Object> map = new HashMap<>();
        map.put("applicator","小王");
        map.put("bumenjingli","小丽");
        map.put("zongjingli","老王");
        //启动流程实例,设置流程变量的值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myholiday2", map);
        System.out.println("流程部署ID"+processInstance.getDeploymentId());
        System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());
        System.out.println("流程实例ID"+processInstance.getId());
        System.out.println("活动ID"+processInstance.getActivityId());

    }
}

执行完,会发现在数据库中的表:act_ru_variable,会有变量信息:

查看act_ru_task表会发现,执行人是小王:

注意事项:

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

 

1.2.3 监听器分配

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

Create:任务创建后触发
Assignment:任务分配后触发
Delete:任务完成后触发
All:所有事件发生都触发

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

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

public class MyTaskListener implements TaskListener {
   @Override
   public void notify(DelegateTask delegateTask) {
       //这里指定任务负责人
      delegateTask.setAssignee("张三");
   }
}

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

 

2、查询任务

2.1 查询任务负责人的待办任务:

//查询任务执行人的代办任务
public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        //得到任务的查询对象TaskQuery
        TaskQuery taskQuery = taskService.createTaskQuery();
        //根据流程定义key和任务执行人查询 代办任务
        List<Task> taskList = taskQuery.processDefinitionKey("myholiday2").includeProcessVariables().taskAssignee("小王").list();
        for (Task task : taskList) {
            System.out.println("----------------------------");
            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        }
}

2.2. 关联businessKey

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

//先启动一个新的流程实例,里面关联了businessKey
//启动流程实例,设置流程变量的值
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myholiday2", "businessKey:11001",map);

根据执行人查询任务时,同时查询出业务数据库中的businessKey,这个key一般对应我们业务数据库中的主键
public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        TaskQuery taskQuery = taskService.createTaskQuery();
        List<Task> taskList = taskQuery.processDefinitionKey("myholiday2").includeProcessVariables().taskAssignee("小王").list();
        for (Task task : taskList) {
            //通过任务task得到流程实例id的值
            String processInstanceId = task.getProcessInstanceId();
            //根据流程实例id,查询流程实例
            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
            //通过流程实例对象,得到业务key的值
            String businessKey = processInstance.getBusinessKey();
            //我们可以根据该key来进行业务操作了
            System.out.println("业务key:"+businessKey);
        }
    }

3、办理任务

指定任务id,调用TaskService完成任务:

package com.zdw.activiti02;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;

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

/**
 * 任务分配的操作
 */
public class TaskFenPeiOperate {

    //根据任务id来完成任务
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        TaskQuery taskQuery = taskService.createTaskQuery();
        List<Task> taskList = taskQuery.processDefinitionKey("myholiday2").includeProcessVariables().taskAssignee("小王").list();
        for (Task task : taskList) {
            //通过任务task得到任务id的值
            String taskId = task.getId();
            //完成任务
            taskService.complete(taskId);
            System.out.println("完成任务:"+taskId);
        }
    }
}

注意:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限。

校验方式:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值