分配任务负责人

一、固定分配

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

  

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

最新文章

  1. 足球宝贝来了,任你旋转(CSS3)
  2. java12
  3. POJ Challenge消失之物
  4. Android TabWidget底部显示
  5. JS原生效果瀑布流布局的实现(一)
  6. C# JSon转换
  7. git error
  8. Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN
  9. [Effective Objective-C 读书笔记] 第1章 几条基本写法 (2~5条)
  10. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
  11. 135实例——add_4
  12. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
  13. 学习smart gwt 的一些好的网站
  14. zabbix基本操作
  15. tensorflow第一篇---numpy模块
  16. 我的第一个python web开发框架(28)——定制ORM(四)
  17. Volley Get网络请求
  18. EBS QRCODE
  19. select cast(round(12.5,2) as numeric(5,2))
  20. Altium Designer 13 插件安装

热门文章

  1. 关于css 的垂直居中
  2. http请求缓存头详解
  3. Oracle批量插入有日期类型数据
  4. 超级干货:动态防御WAF技术原理及编程实战!
  5. django setting文件那些事
  6. 【vue】---- 图片懒加载
  7. 手机app抓包工具,安卓手机adb无线连接
  8. etcdctl的使用
  9. 如何创建一个自定义的`ErrorHandlerMiddleware`方法
  10. MATLAB神经网络(3) 遗传算法优化BP神经网络——非线性函数拟合