1 Candidate-users 候选人

1.1需求

在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置
在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。
针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。
设置任务候选人
在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。

查看 bpmn 文件:

我们可以看到部门经理的审核人已经设置为 zhangsan,lishi 这样的一组候选人,可以使用
activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人 。

1.1.1 组任务办理流程

第一步:查询组任务
指定候选人,查询该候选人当前的待办任务。
候选人不能办理任务。
第二步:拾取(claim)任务
该组任务的所有候选人都能拾取。
将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
如果拾取后不想办理该任务?
需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
第三步:查询个人任务
查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。
第四步:办理个人任务

1.1.2 用户查询组任务

先部署项目

//1.部署流程定义
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday5.bpmn") //添加bpmn资源
// .addClasspathResource("diagram/holiday5.png")
.name("请假申请单流程")
.deploy(); //4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}

启动实例

 //2.启动流程实例
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService(); //3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1"); //4.输出实例的相关信息
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
System.out.println("流程实例ID"+processInstance.getId());//
}

填写请假单的任务要执行完成

//3.填写请假单的任务要执行完成
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("myProcess_1")
.taskAssignee("xiaozhang")
.singleResult(); //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
if(task!=null){
taskService.complete(task.getId());
System.out.println("用户任务执行完毕...");
} //5.输出任务的id
System.out.println(task.getId());
}

根据候选人查询组任务

//4.查询候选用户的组任务

    public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.设置一些参数,流程定义的key,候选用户
String key = "myProcess_1";
String candidate_users="zhangsan"; //4.执行查询
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidate_users)//设置候选用户
.list();
//5.输出
for(Task task :list){
System.out.println(task.getProcessInstanceId());
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
}
}

来拾取组任务
//5.测试zhangsan用户,来拾取组任务
//抽取任务的过程就是将候选用户转化为真正任务的负责人(让任务的assignee有值)
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.设置一些参数,流程定义的key,候选用户
String key = "myProcess_1";
String candidate_users="zhangsan"; //4.执行查询
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidate_users)//设置候选用户
.singleResult();
if(task!=null){
taskService.claim(task.getId(),candidate_users);//第一个参数任务ID,第二个参数为具体的候选用户名
System.out.println("任务拾取完毕!");
}
}

当前的用户查询自己的任务

//6.当前的用户查询自己的任务
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.设置一些参数,流程定义的key,用户
String key = "myProcess_1";
String assignee="zhangsan"; //4.执行查询
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //设置任务的负责人
.list();
//5.输出
for(Task task :list){
System.out.println(task.getProcessInstanceId());
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());//任务的执行人
}
}

当前用户完成自己的任务

 //7.当前用户完成自己的任务
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.设置一些参数,流程定义的key,用户
String key = "myProcess_1";
String assignee="zhangsan"; //4.执行查询
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //设置任务的负责人
.singleResult();
//5.执行当前的任务
if(task!=null){
taskService.complete(task.getId());
System.out.println("任务执行完毕!");
} }

归还组任务
如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人

// 归还组任务,由个人任务变为组任务,还可以进行任务交接
@Test
public void setAssigneeToGroupTask() {
// 查询任务使用TaskService
TaskService taskService = processEngine.getTaskService();
// 当前待办任务
String taskId = "6004";
// 任务负责人
String userId = "zhangsan2";
// 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
if (task != null) {
// 如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);
}
}

说明: 建议归还任务前校验该用户是否是该任务的负责人
也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议
不要这样使用)

任务交接

//8.任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.设置一些参数,流程定义的key,用户
String key = "myProcess_1";
String assignee="zhangsan"; //4.执行查询
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //设置任务的负责人
.singleResult();
//5.判断是否有这个任务
if(task!=null){
taskService.setAssignee(task.getId(),"lisi");//交接任务为lisi ,交接任务就是一个候选人拾取用户的过程
System.out.println("交接任务完成~!");
}
}


Activiti组任务(十)的更多相关文章

  1. 最新版PMBOK项目管理的五大过程组和十大知识领域

    PMBOK五大过程组是:启动过程.规划过程.执行过程.监控过程.收尾过程. 各用一句话概括项目管理知识体系五大过程组: 1.启动过程组:作用是设定项目目标,让项目团队有事可做: 2.规划过程组:作用是 ...

  2. PMBOK项目管理的五大过程组和十大知识领域

    PMBOK五大过程组是:启动过程.规划过程.执行过程.监控过程.收尾过程. 各用一句话概括项目管理知识体系五大过程组: 1.启动过程组:作用是设定项目目标,让项目团队有事可做: 2.规划过程组:作用是 ...

  3. Activiti组任务

    一.Candidate-users候选人 1.需求 在流程定义中在任务节点的assignee固定设置任务负责人,在流程定义时将参数者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义 ...

  4. Java实现第十届蓝桥杯JavaC组第十题(试题J)扫地机器人

    扫地机器人 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所 示. 走廊内部署了 K 台扫地机器人 ...

  5. 【PMP考试专栏】01、五大过程组和十大知识领域

  6. 第六届蓝桥杯java b组第十题

    10.压缩变换(程序设计) 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...

  7. 2015年蓝桥杯java b组第十题

    10. 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a ...

  8. 第八届蓝桥杯java b组第十题

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  9. 第七届蓝桥杯省赛JavaB组——第十题压缩变换

    题目: 压缩变换小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战.最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...

随机推荐

  1. iptables规则

    iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分 iptables文件设置路径:命令:vim /etc/sysconfig/iptables-config 0x02 ...

  2. 密码学 - MD5 - 生成|加密|解密|相关工具

    生成MD5 解密 工具 - findmyhash使用方法:-h 直接跟hash值 -f 指定hash文件 -g 通过google查找hash 加密方式识别工具 hash-identifier 支持识别 ...

  3. Service-Oriented Architecture,SOA(转)

    http://blog.csdn.net/WOOSHN/article/details/8036910 介绍: IT体系结构已非常成熟,它是一种成功处理典型IT问题的方法.体系结构中一个受到很大重视且 ...

  4. Javascript原型介绍

    原型及原型链 原型基础概念 function Person () { this.name = 'John'; } var person = new Person(); Person.prototype ...

  5. 洛谷 P5662 纪念品 & [NOIP2019普及组] (dp,完全背包)

    传送门 解题思路 本题首先要明白,在每一天时,最优策略是先进行操作2(卖),再进行操作1(买),才能是利益最大化. 本题很显然当只有两天时,是一个完全背包,就是把当日价钱当做体积,把明日价格和今日价格 ...

  6. 配置多个broker

    前言 什么是kafka?举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡 ...

  7. HDU 2196 Computer( 树上节点的最远距离 )

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. 根据日志来源的不同生成不同的index索引

    使用filebeat收集系统日志,不同应用的日志,然后把这些日志传输给Logstash,再然后交由elasticsearch处理,那么如何区分不同的日志来源呢? filebeat.yml配置文件中不启 ...

  9. ambari 2.5.0源码编译安装

    参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/index.html Ambari 是什么 Ambar ...

  10. 关于jsp删除成功,添加成功等之后 页面自动跳转的js写法

    因为比较常用,所以写在博客里保存起来,防止以后忘了不会写了: 删除成功,<span id="time" style="background:red"> ...