分配任务负责人
一、固定分配
在进行业务流程建模时指定固定的任务负责人
在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"); } }