Activiti进阶篇

您所在的位置:网站首页 activiti组任务个人任务 Activiti进阶篇

Activiti进阶篇

2023-09-27 22:31| 来源: 网络整理| 查看: 265

1. 个人任务 1.1 分配任务责任人 1.1.1 固定分配

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

image-20210518161104632.png

在Properties视图中,填写Assiginee项为任务负责人

1.1.2 表达式分配

在Activiti中支持使用UEL表达式,UEL表达式是Java EE6 规范的一部分, UEL(Unified Expression Language) 即 统一表达式语音, Activiti支持两种UEL表达式: UEL-value 和UEL-method

UEL-value

image-20210518161513735.png

在assignee中使用流程变量处理

image-20210518161552652.png

image-20210518161620415.png

image-20210518161649311.png

image-20210518161649311.png

然后我们可以来操作

首先我们需要将定义的流程部署到Activiti数据库中

/** * 先将新定义的流程部署到Activiti中数据库中 */ @Test public void test01(){ // 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService进行部署操作 RepositoryService service = engine.getRepositoryService(); // 3.使用RepositoryService进行部署操作 Deployment deploy = service.createDeployment() .addClasspathResource("bpmn/evection-uel.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/evection-uel.png") // 添加png资源 .name("出差申请流程-UEL") .deploy();// 部署流程 // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); }

部署成功后我们需要启动一个新的流程实例,然后在流程实例创建的其实关联UEL表达式

/** * 创建一个流程实例 * 给流程定义中的 UEL表达式赋值 */ @Test public void test02(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 设置 assignee 的取值, Map map = new HashMap(); map.put("assignee0","张三"); map.put("assignee1","李四"); map.put("assignee2","王五"); map.put("assignee3","赵财务"); // 创建流程实例 runtimeService.startProcessInstanceByKey("evection-uel",map); }

启动成功后我们在 act_ru_variable中可以看到UEL表达式对应的赋值信息

image-20210518163344275.png

UEL-method

image-20210518163633595.png

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

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}

2.1.3 监听器分配

可以使用监听器来完成很多Activiti的流程业务。

我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee

Event选项

image-20210518164413956.png

create:任务创建后触发 assignment:任务分配后触发 Delete:任务完成后触发 All:所有事件都触发

自定义的监听器

import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { if("创建请假单".equals(delegateTask.getName()) && "create".equals(delegateTask.getEventName())){ // 指定任务的负责人 delegateTask.setAssignee("张三-Listener"); } } }

测试代码

/** * 先将新定义的流程部署到Activiti中数据库中 */ @Test public void test01(){ // 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService进行部署操作 RepositoryService service = engine.getRepositoryService(); // 3.使用RepositoryService进行部署操作 Deployment deploy = service.createDeployment() .addClasspathResource("bpmn/evection-listener.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/evection-listener.png") // 添加png资源 .name("出差申请流程-UEL") .deploy();// 部署流程 // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); } /** * 创建一个流程实例 * 给流程定义中的 UEL表达式赋值 */ @Test public void test02(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 创建流程实例 runtimeService.startProcessInstanceByKey("evection-listener"); }

image-20210518165520969.png

image-20210518165644992.png

1.2 查询任务 查询任务负责人的待办任务

代码如下:

// 查询当前个人待执行的任务 @Test public void findPersonalTaskList() { // 流程定义key String processDefinitionKey = "myEvection1"; // 任务负责人 String assignee = "张三"; // 获取TaskService TaskService taskService = processEngine.getTaskService(); List taskList = taskService.createTaskQuery() .processDefinitionKey(processDefinitionKey) .includeProcessVariables() .taskAssignee(assignee) .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()); } } 关联 businessKey

需求: 在 activiti 实际应用时,查询待办任务可能要显示出业务系统的一些相关信息。

比如:查询待审批出差任务列表需要将出差单的日期、 出差天数等信息显示出来。

出差天数等信息在业务系统中存在,而并没有在 activiti 数据库中存在,所以是无法通过 activiti 的 api 查询到出差天数等信息。 实现: 在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的出差单表,查询出出差天数等信息。

@Test public void findProcessInstance(){ // 获取processEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取TaskService TaskService taskService = processEngine.getTaskService(); // 获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 查询流程定义的对象 Task task = taskService.createTaskQuery() .processDefinitionKey("myEvection1") .taskAssignee("张三") .singleResult(); // 使用task对象获取实例id String processInstanceId = task.getProcessInstanceId(); // 使用实例id,获取流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); // 使用processInstance,得到 businessKey String businessKey = processInstance.getBusinessKey(); System.out.println("businessKey=="+businessKey); } 1.3 办理任务

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

/** * 完成任务,判断当前用户是否有权限 */ @Test public void completTask() { //任务id String taskId = "15005"; // 任务负责人 String assingee = "张三"; //获取processEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 创建TaskService TaskService taskService = processEngine.getTaskService(); // 完成任务前,需要校验该负责人可以完成当前任务 // 校验方法: // 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成 Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(assingee) .singleResult(); if(task != null){ taskService.complete(taskId); System.out.println("完成任务"); } }

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3