目录
需要用户介入的节点,即:需要this.taskService.complete(taskid);完成。
1.Assignee
该任务节点的执行人。赋值方法如下:
1.1使用ID赋值
this.taskService.setAssignee("taskid", "userId");
1.2 根据任务DI,变量方式赋值
#{paramName}
流程流转到该节点时进行赋值,是从variables中获取,如果没有则报错。所以需要上一个步骤完成时就需要确定参数的值。否则:Cannot resolve identifier 'param2'。
设置方法:
// 设置参数param1,第一个节点,需要在启动流程的时候设置
Map<String, Object> map = new HashMap<String, Object>();
map.put("param1", 123);
ProcessInstance pi = this.runtimeService.startProcessInstanceByKey(PROCESS_KEY, "key1" ,map );
System.out.println(pi.getName());
// 完成param1节点 中间节点需要在上一步设定
Task task = this.taskService.createTaskQuery().taskAssignee("123").singleResult();
System.out.println(task.getName() + " " + task.getAssignee());
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("param2", "234");
this.taskService.complete(task.getId());
注意:设置的variables对整个流程有用,如果节点1,节点2,都设定:#{param},那么只需要在启动时确定就成。同理:中间两个节点也是一样。可以得出 变量的生命周期是伴随着流程的。这里的变量指的是全局变量。
变量存储表:act_ru_variable
1.3 当流程到该节点时,引擎自动调用获取
${leaveProcessAssignService.findUsersForSL(execution)},当然也可以设定参数
/*
* 指定受理人
* ${leaveProcessAssignService.findUsersForSL(execution)}
*/
public List<String> findUsersForSL(DelegateExecution execution){
Object leave_employee = execution.getVariable("leave_employee");
System.out.println("设置直接经理 ------------ 请假人:"+leave_employee);
// 根据 请假人 获取 直接经理信息
return Arrays.asList("李四1");
}
/*
* 指定受理人
* ${leaveProcessAssignService.findUsersForSL1(execution,"manager")}
*/
public List<String> findUsersForSL1(DelegateExecution execution,String kine){
Object leave_employee = execution.getVariable("leave_employee");
System.out.println("设置总经理 ------------ 请假人:"+leave_employee+" kine:"+kine);
// 根据 请假人 获取 直接经理信息
return Arrays.asList("王五1");
}
1.4 根据指定人获取待办任务
List<Task> list = this.taskService.createTaskQuery().taskAssignee("[李四1]").list();
2.Candidate User
候选人,赋值方法。可以设置多个候选人,使用逗号分隔,可以通过任何一个查询到该任务节点,执行后就算该节点执行了。
- 复制:根据taskid复制
- 变量复制
- 表达式
3. Multi instance
多实例设置,即:把改节点创建多个实例。一个网关或事件 不能成为多实例。
3.1 场景
- 投票:投票这个动作(节点),需要很多人来完成。
- 会签:一个公文需要多部门联合签署才生效。
3.2 属性
- isSequentia:多实例执行方式:true 并行;false(默认) 串行。
- collection:为此任务的任务办理人集合,只能设置为变量,不能设置为直接量(如设为用户id集合),变量只能传list<string>,不能传string数组
- elementVariable将collection集合的遍历并命名,命名后此变量可在会签任务其他地方引用,如此处在任务办理人处(activiti:candidateUsers)引用
- loopCardinality:创建多少个任务实例
- completionCondition设置会签任务结束条件
3.3 内置变量
(此变量是用来控制上面的功能的,相当于for中的那个i)
- nrOfInstances 实例总数。
- nrOfCompletedInstances 当前还没有完成的实例 nr是number单词缩写 。
- loopCounter 已经循环的次数。
- nrOfActiveInstances 已经完成的实例个数。
条件:${nrOfCompletedInstances/nrOfInstances >= 0.25} 四分之一执行了就算完成,当然也可以使用自定义变量,只是自定义变量的并发没法控制。
3.4并行示例
IsSequentia:true
CandidateUser:${list1} // user1,user2
Completion contidion:${count1>2}
loopCardinality:2
结果:会给user1和user2 各创建一个任务实例。
条件:流程变量count1,的数值大于2结束
3.5串行示例
IsSequentia:false
CandidateUser:${list1} // user1,user2
Completion contidion:${count1>2}
loopCardinality:3 三个任务实例
3.6 摘录
原文:https://blog.csdn.net/qq_30739519/article/details/51239818
我们在使用activiti 工作流引擎的时候,最常用的肯定是任务节点,因为在OA系统、审批系统、办公自动化系统中核心的处理就是流程的运转,在流程运转的时候,可能我们有这样的一个需求,在一个任务节点的时候,我们需要多个人对这个节点进行审批,比如实际中这样一个例子,假如是一个部门的投票,这个部门有5个人,那么当5个人都投票的时候大概分为如下几种:
- 部门所有人都去投票,当所有人都投票完成的时候,这个节点结束,流程运转到下一个节点。(所有的人都需要投票)
- 部门所有人都去投票,只要有任意2/3的人同意,这个节点结束,流程运转到下一个节点。(部分人投票只要满足条件就算完成)。
- 部门中有一个部门经理,只要部门经理投票过了,这个节点结束,流程运转到下一个节点(一票否决权)。
- 部门中根据职位不同,不同的人都不同的权重,当满足条件的时候,这个节点结束,流程运转到下一个节点。比如说所有的人员权重加起来是1,a有0.2的权重,其他的四个人分别是0.1的权重,我们可以配置权重达到0.3就可以走向下一个节点,换言之a的权重是其他人的2倍,那就是a的投票相当于2个人投票。这种需求还是很常见的。
- 部门所有人都去投票,a投票结束到b,b开始投票结束到c,一直如此,串行执行。最终到最后一个人再统计结果,决定流程的运转。
上面的五种情况,我们可以提取出来一些信息,我们的activiti 工作流引擎,必须支持如下功能,才能满足上面的需求:
- 任务节点可以配置自定义满足条件
- 任务节点必须支持串行、并行
- 任务节点必须支持可以指定候选人或者候选组
- 任务节点必须支持可以循环的次数
- 任务节点必须支持可以自定义权重
- 任务节点必须支持加签、减签。(就是动态的修改任务节点的处理人)
因为实际上的需求可能比上面的几种情况更加的复杂,上面的6个满足条件,工作流支持前4个,后面的2个条件是不支持的,所以我们必须要扩展activiti 工作流引擎才能使用5、6等的功能。下面我们将详细的介绍前四种条件的使用,在掌握基本使用之后,我们在后面的章节中将详细的介绍,5、6这两种功能以及可能更加复杂的操作。
我不是雷锋,我不记日记。