流程任务-用户任务

user task 是最常用的任务,当流程到达用户任务时,用户任务将会被分配到特定用户或者用户组。

任务候选人是指有权限对该任务进行操作的潜在用户群体,这个群体有权限去处理或完成该任务。

任务受理人指真正执行该任务的人,一个可以有多个任务候选人,但是只能有一个任务受理人。

1.设置任务候选人

  代码设置

//设置候选人
taskService.addCandidateUser(...)
//设置组别
taskService.addCandidateGroup(...)

  xml配置

<userTask id="usertask1" name="Task1">
  <potentialOwner>
    <resourceAssignmentExpression>
	  <formalExpression>        user(angus), group(management), boss <!--不使用user或group时,直接被视作用户组的ID-->
	  </formalExpression>
    </resourceAssignmentExpression>
   </potentialOwner>
</userTask>

 查看:

// 根据用户组查询任务
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("boss").list();
System.out.println("分配到boss用户组下的任务数量:" + tasks.size());
// 根据用户查询任务
tasks = taskService.createTaskQuery().taskCandidateUser("angus").list();
System.out.println("用户angus下的任务数量为:" + tasks.size());

注:指定的用户组或用户,并不需要一定要在表中存在。

2.设置任务受理人

  代码

//对应ACT_RU_TASK的ASSIGNEE_字段
taskService.setAssignee(...)

  xml配置

<userTask id="usertask1" name="Task 1">
    <humanPerformer>
        <resourceAssignmentExpression>
            <formalExpression>user1</formalExpression>
        </resourceAssignmentExpression>
    </humanPerformer>
</userTask>

查看可用  taskQuery.taskAssignee(...)

3.使用acitivi权限分配扩展(activiti:assignee/activiti:candidateUsers/activiti:candidateGroups)

    <userTask id="usertask1" name="Assignee" activiti:assignee="user1"></userTask>
    <userTask id="usertask2" name="Candidate User" activiti:candidateUsers="user1,user2"></userTask>
    <userTask id="usertask3" name="Candidate Group" activiti:candidateGroups="group1,group2"></userTask>

4.业务系统中,用户组或用户都有可能发生变化,这时可编写任务监听器进行动态权限分配

  4.1实现TaskListener接口 

public class UserTaskListener implements TaskListener {
    public void notify(DelegateTask delegateTask) {
        System.out.println("使用任务监听器设置任务权限");
        delegateTask.setAssignee("user1");
        delegateTask.addCandidateGroup("group1");
    }
}

  4.2配置监听

<userTask id="usertask1" name="Assignee">
    <extensionElements>
        <activiti:taskListener
            event="create" <!--任务创建的时候执行-->
            class="org.bestmyself.activiti.UserTaskListener">
        </activiti:taskListener>
    </extensionElements>
</userTask>

查看:List<Task> tasks = taskService.createTaskQuery().taskAssignee("user1").list();

5.使用JUEL分配权限(activiti默认支持juel)

<userTask id="usertask2" name="Task 1"
    activiti:assignee="${authService.getUserAssignee()}">
</userTask>
<userTask id="usertask3" name="Task 2"
    activiti:candidateUsers="${authService.getCandidateUsers()}">
</userTask>
<userTask id="usertask4" name="Task 3"
    activiti:candidateGroups="${authService.getCandidateGroups()}">
</userTask>
<userTask id="usertask5" name="Task 4"
    activiti:assignee="${authService.lastUser}"> <!--要有相应的getter/setter方法-->
</userTask>
注:authService实例需要设置到流程参数中
   Map<String, Object> vars = new HashMap<String, Object>();
   vars.put("authService", new AuthService());
   // 启动流程,将authservice实例序列化到act_ge_bytearray中
   ProcessInstance pi = runtimeService.startProcessInstanceByKey("process1", vars);

                                                                                       

 

时间: 2024-10-14 04:44:39

流程任务-用户任务的相关文章

Activiti6.0工作流引擎深度解析与实战

第1章 课程介绍 本课程将系统且深入源码讲解Activiti6.0工作流引擎的使用.配置.核心api以及BPMN2.0规范.数据库设计及模型映射,Spring Boot2.0集成,工作流平台搭建.部署与运维等,通过本课程的学习,你将切实学会Activiti6.0工作流引擎开发,大大提升自己的业务建模能力,技术架构能力,开源库研究能力,流程梳理能力,从而进阶为Jav... 1-1 课程导学 第2章 工作流入门 本章首先介绍了工作流是什么,工作流技术选型,然后带大家快速体验activiti6.0,让

Activiti实战04_简单流程

在Activiti实战03_Hello World中我们介绍了一个中间没有任何任务的流程,实现了流程的部署与查阅,而在本章中,将会为流程添加任务节点,是流程能够像个流程,变得更加丰满起来. 在上一节的基础上,我门将会为流程添加实际业务使其能够正常工作起来,先模拟一个很简单的请假流程. 首先,在上一节的流程图中为流程添加一个用户任务(userTask)来处理申请,根据申请内容来决定运行申请还是驳回申请.流程图如下: 代码清单,由于篇幅的原因,这里就不在列出任务的坐标位置等信息 <?xml vers

流程任务-概述

任务表示要在流程中完成的工作,类型主要有: service task:调用webservice或自动执行任务,如java service task.web service task.shell task. send task:处理向外部的流程参与人员发送消息工作,如email task.mule task. receive task:等待外部流程参与者发送消息的任务,. user task:需要业务人员参与的用户任务. manual task:手工任务,不需要任务的流程引擎或应用的驱动,会被自动

框架 day56 BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)

BOS项目笔记第10天 内容: 1.历史数据查询(历史流程实例数据.历史任务数据.历史活动数据) 2.流程变量 3.组任务(候选人.候选组) 4.监听器(执行.任务) 5.网关(排他.并行) 6.spring整合activiti 1.    历史数据查询 历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中. 在流程引擎配置对象中可以设置历史记录规则: 1.1   查询历史流程实例数据 表中内容包含已经完成的流程和正在进行

activiti 5.15.1 动态手动通过java编码方式,实现创建用户任务,动态指定个人,用户组,角色,指定监听的实现

因为我们的业务需要,最近一直在搞动态动过java程序实现为用户任务绑定监听程序.碰了很多壁,查看了API文档,最后终于在找到解决办法,所以贴出来,希望能够留个底,也能帮助有需要的人. ----------动态生成流程文件的工具类-------- package com.travesky.bluesky.activiti.utils; import java.io.File;import java.io.InputStream;import java.util.ArrayList;import j

Linux 开机流程详解

对于任何系统, 开机不仅仅是接通电源这么简单的事情, 在这短短的几秒或几十秒内将会发生许多事情, 了解这个完整的流程将是解决任何开机问题或提高开机速度的前提. 接下来, 我们就详细了解一下Linux的开机流程: 1. 加载 BIOS 的硬件信息并进行自我测试,并依据取得第一个可开机的装置; 2. 读取并执行第一个开机装置内 MBR 的 Boot Loader (如 grub, spfdisk 等程序); 3. 依据 Boot Loader 的设定加载 kernel, kernel 会开始侦测硬件

优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!

最近对Activiti做了一些深入的研究,对Activiti的流程机制有了些理解,对动态调整流程也有了一些实践方法. 现在好好总结一下,一来是对这段时间自己辛苦探索的一个记录,二来也是为后来者指指路~~~ 如下内容准备采用QA的方式写,很多问题都是当初自己极疑惑的问题,希望能为大家解惑! Q:可以动态调整流程吗? A:可以!可以动态更改流程指向,或者创建新的节点,等等... Q: 更改流程还需要注意什么? A: 必须要实现持久化!否则一旦应用重启,你的流程就犯糊涂了!譬如,你创建了一个新节点,但

获取Activiti所有用户任务

最近接到一个用户需求: 要求在流程部署完成后可通过手动配置各用户任务的处理候选组,来控制流程走向. 解决此需求要解决以下问题: 1,流程部署完成后,尚未有流程实例,如何获取所有用户任务? 2,设置完各节点的处理候选组后,如何动态分配? 第二个问题好解决,通过设置任务监听器,来获取当前的用户任务KEY,从配置表中获取处理组进行设置. 下面来解决第一个问题,代码如下: @Override public List<ProcessTaskVO> findProcessUserTaskByPdId(St

activiti自定义流程之整合(六):获取我的申请任务

流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置. 至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种. 而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务.区别就是我发起的任务,和别人提交给我的或者反馈给我的任务. 那么流程