news 2026/9/22 2:38:03

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/9/21 8:40:08

Activiti7工作流(八)流程变量

文章目录1、流程变量概念2、流程变量类型3、流程变量作用域3.1、globa变量3.2、local变量4、流程变量的使用方法4.1、在属性上使用UEL表达式4.2、在连线上使用UEL表达式5、使用Global变量控制流程5.1、需求5.2、流程定义5.3、设置global流程变量5.4、测试5.5、注意事项5.6、操作…

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

Langchain-Chatchat能否支持文档标签分类管理?

Langchain-Chatchat能否支持文档标签分类管理&#xff1f; 在企业知识库系统日益复杂的今天&#xff0c;一个核心问题逐渐浮现&#xff1a;当文档数量从几十份增长到成千上万时&#xff0c;仅靠“全文检索”是否还能保证回答的精准性&#xff1f;更进一步地说&#xff0c;不同部…

作者头像 李华
网站建设 2026/9/21 16:38:22

Langchain-Chatchat能否支持文档访问统计?

Langchain-Chatchat能否支持文档访问统计&#xff1f; 在企业知识管理系统日益智能化的今天&#xff0c;一个常见的需求浮出水面&#xff1a;我们能不能知道哪些文档被查得最多&#xff1f;员工最常问的问题背后对应的是哪几份制度文件&#xff1f;有没有长期“躺平”、从未被检…

作者头像 李华
网站建设 2026/9/21 7:16:27

Langchain-Chatchat结合Traefik实现动态路由

Langchain-Chatchat 结合 Traefik 实现动态路由 在企业知识管理日益复杂的今天&#xff0c;如何让员工快速从海量文档中获取准确信息&#xff0c;已成为提升组织效率的关键挑战。尤其在金融、医疗、制造等行业&#xff0c;数据隐私和合规性要求极高&#xff0c;依赖公有云的 AI…

作者头像 李华
网站建设 2026/9/21 11:07:58

【程序源代码】成人用品商城系统源码微信小程序(含源码)

关键字&#xff1a;成人用品商城系统源码微信小程序 前端 后端 小程序 JAVA &#xff08;一&#xff09;系统介绍 1.1 系统介绍 成人用品商城系统源码微信小程序&#xff08;含源码&#xff09; 原型是[小张送花] ,是一款同城鲜花订购 的小程序&#xff0c;专业提…

作者头像 李华
网站建设 2026/9/21 19:12:19

mybatis sql where a=#{a},如果a为null,会返回什么

在 MyBatis 中&#xff0c;当使用 #{a}占位符且参数 a为 null时&#xff0c;SQL 语句会变成&#xff1a;WHERE a null实际执行结果&#xff1a;不会有任何数据被查询出来&#xff0c;因为 SQL 中 null null的结果是 unknown&#xff08;相当于 false&#xff09;。详细说明1.…

作者头像 李华