news 2026/4/23 8:13:42

Activiti7工作流(七)个人任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Activiti7工作流(七)个人任务

文章目录

    • 1、分配任务负责人
      • 1.1、固定分配
      • 2.2、动态分配--表达式分配
        • 2.2.1、UEL 表达式
        • 2.2.2、编写代码配置负责人
        • 2.2.3、注意事项
      • 2.3、动态分配--监听器分配
    • 2、查询任务
      • 2.1、查询任务负责人的待办任务
      • 2.2、关联 businessKey
    • 3、办理任务

1、分配任务负责人

1.1、固定分配

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

并在 properties 视图中,填写 Assignee 项为任务负责人。实际工作中,固定分配任务负责人用的很少,只当作了解。

2.2、动态分配–表达式分配

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

2.2.1、UEL 表达式

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

  1. UEL-value 定义

如图:

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

或者使用这种方式定义:

如图:

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

  1. UEL-method 方式
    如图:


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

  1. UEL-method 与 UEL-value 结合

再比如:

${ldapService.findManagerForEmployee(emp)}

ldapService 是 spring 容器的一个 bean,findManagerForEmployee 是该 bean 的一个方法,emp 是 activiti

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

  1. 其它

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

如下:

${order.price>100&&order.price<250}
2.2.2、编写代码配置负责人
  1. 定义任务分配流程变量

如图:

  1. 设置流程变量

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

/** * 设置流程负责人 */@TestpublicvoidassigneeUEL(){// 获取流程引擎ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 获取 RuntimeServiceRuntimeServiceruntimeService=processEngine.getRuntimeService();// 设置assignee的取值,用户可以在界面上设置流程的执行Map<String,Object>assigneeMap=newHashMap<>();assigneeMap.put("assignee0","张三");assigneeMap.put("assignee1","李经理");assigneeMap.put("assignee2","王总经理");assigneeMap.put("assignee3","赵财务");// 启动流程实例,同时还要设置流程定义的assignee的值runtimeService.startProcessInstanceByKey("myEvection1",assigneeMap);// 输出System.out.println(processEngine.getName());}

执行成功后,可以在act_ru_variable表中看到刚才map中的数据

2.2.3、注意事项

由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:

某个任务使用了表达式${order.price > 100 && order.price < 250},当执行该任务时必须保证 order 在

流程变量中存在,否则 activiti 异常。

2.3、动态分配–监听器分配

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

使用监听器的方式来指定负责人,在流程设计时就不需要指定assignee。

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

任务相当事件包括:

Event的选项包含:

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

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

publicclassMyTaskListenerimplementsTaskListener{@Overridepublicvoidnotify(DelegateTaskdelegateTask){if(delegateTask.getName().equals("创建出差申请")&&delegateTask.getEventName().equals("create")){//这里指定任务负责人delegateTask.setAssignee("张三");}}}

DelegateTask对象的内容如下:

注意事项

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

任务的执行。

2、查询任务

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

代码如下:

// 查询当前个人待执行的任务@TestpublicvoidfindPersonalTaskList(){ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 流程定义keyStringprocessDefinitionKey="myEvection1";// 任务负责人Stringassignee="张三";// 获取TaskServiceTaskServicetaskService=processEngine.getTaskService();List<Task>taskList=taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).includeProcessVariables().taskAssignee(assignee).list();for(Tasktask: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(业务标识 )关联查询业务系统的出差单表,查询出出差天数等信息。/** * 查询个人待办任务 关联businesskey */@TestpublicvoidfindProcessinstance(){ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();RuntimeServiceruntimeService=processEngine.getRuntimeService();TaskServicetaskService=processEngine.getTaskService();// 查询张三的个人的待办任务 查询结果是一个 任务对象Tasktask=taskService.createTaskQuery().processDefinitionKey("myEvection1").taskAssignee("张三").singleResult();// 通过个人task任务对象 查询流程实例idStringprocessInstanceId=task.getProcessInstanceId();// 通过流程实例id 查询流程实例对象ProcessInstanceprocessInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();// 通过流程实例对象,查询关联的bussinesskeyStringbusinessKey=processInstance.getBusinessKey();System.out.println("businessKey=="+businessKey);}

3、办理任务

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

/** * 完成任务,判断当前用户是否有权限 */@TestpublicvoidcompletTask2(){//任务idStringtaskId="42502";// 任务负责人Stringassingee="jack";//获取processEngineProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 创建TaskServiceTaskServicetaskService=processEngine.getTaskService();// 完成任务前,需要校验该负责人可以完成当前任务// 校验方法:// 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成Tasktask=taskService.createTaskQuery().taskId(taskId).taskAssignee(assingee).singleResult();if(task!=null){taskService.complete(taskId);System.out.println("完成任务");}}


“人的一生会经历很多痛苦,但回头想想,都是传奇”。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:28:20

SpringBoot+Vue Spring Boot律师事务所案件管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着信息技术的快速发展&#xff0c;传统律师事务所的案件管理方式已难以满足高效、精准的业务需求。纸质档案管理效率低下&#xff0c;案件进度跟踪困难&#xff0c;客户沟通成本高&#xff0c;这些问题严重制约了律所的服务质量和发展潜力。数字化管理平台能够有效整合案…

作者头像 李华
网站建设 2026/4/22 3:17:16

代码随想录算法第四十五天| LeetCode115不同的子序列、LeetCode583两个字符串的删除操作、LeetCode72编辑距离

LeetCode 115 不同的子序列 题目链接&#xff1a;115.不同的子序列 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;不同的子序列 思路与感想&#xff1a;这道题目跟昨天的判断子序列的一个区别在于如果字符相同那么是可以选择用或者不用当前遍历的字符做匹配的&#xf…

作者头像 李华
网站建设 2026/4/16 23:01:15

Langchain-Chatchat问答系统灰度期间资源配置调整

Langchain-Chatchat问答系统灰度期间资源配置调整 在企业知识管理日益智能化的今天&#xff0c;如何让员工快速获取散落在PDF、文档和内部系统中的“沉默知识”&#xff0c;成为提升组织效率的关键命题。通用大模型虽然强大&#xff0c;但面对企业私有数据时&#xff0c;常因隐…

作者头像 李华
网站建设 2026/4/20 15:22:41

Langchain-Chatchat能否实现问答结果RTF导出?

Langchain-Chatchat 能否实现问答结果 RTF 导出&#xff1f; 在企业知识管理日益依赖智能化工具的今天&#xff0c;如何将 AI 生成的内容以专业、可编辑的形式留存和流转&#xff0c;已成为一个不可忽视的实际需求。许多用户在使用基于大语言模型&#xff08;LLM&#xff09;的…

作者头像 李华
网站建设 2026/4/21 22:12:53

把 Flutter 插件搬上 OpenHarmony:手把手适配音频录制库

把 Flutter 插件搬上 OpenHarmony&#xff1a;手把手适配音频录制库 前言 OpenHarmony&#xff08;后面简称 OHOS&#xff09;的生态越来越热闹&#xff0c;它的分布式能力和全场景体验确实给开发带来了新的想象空间。对于我们这些熟悉 Flutter 的开发者来说&#xff0c;很自然…

作者头像 李华
网站建设 2026/4/12 15:25:50

Langchain-Chatchat能否实现问答结果PDF导出?

Langchain-Chatchat能否实现问答结果PDF导出&#xff1f; 在企业智能化转型的浪潮中&#xff0c;如何安全、高效地利用私有知识成为关键挑战。通用大模型虽然“见多识广”&#xff0c;但面对企业内部文档时往往力不从心——要么无法访问敏感资料&#xff0c;要么容易“一本正经…

作者头像 李华