前些天在群里聊工作流和Activiti,群里有人分享了自己的工作流引擎开源项目,大伙纷纷问这问那(比如为什么突然自己搞个process engine、有没有eclipse plugin、能不能绘制流程图等等)。

现实生活中的工作流程,我们也经常碰到需要会签的情况,支持会签是很必要的。
正好有两个人问道:支持会签吗?
也有人也问道:什么是会签?

如果从process engine的角度上讲呢?
可以说一个task节点下有多个task instance。
而不是一个从task节点执行到多个task节点(这样就是ParallelGateway了)。

如何让一个Task节点创建出多个instance?官网是这样说的:

To make an activity multi-instance, the activity xml element must have a multiInstanceLoopCharacteristics child element.

既然是创建多个实例,我们就需要用一个集合去存放。
我们可以在multiInstanceLoopCharacteristics标签中加入一个attribute —— activiti:collection=""。
该attribute的值是当前流程实例的变量名,也就是启动该引擎实例时传入的Map的key。
而这个Map的value必须是java.util.List类型的。但我们无需在意这个List的泛型是什么。
假如泛型是String的话,act_ru_variable中变量的TYPE_字段值是string。
也许我可以让泛型是Map,那么该变量的TYPE_字段值是serialize,仅此而已。
本文中activiti:collection="assigneeList"

我们在数据库里记录了这个集合,但我们也需要记录这个记录中的每一个元素。
记录每一个元素时他们的名字应该是什么?
我们可以用activiti:elementVariable=""
比如我设置:

    activiti:elementVariable="assignee"

假设我们现在要的效果是:有三个人可以会签,但只要两个人签署便可通过。
我们需要设置特定的条件来结束当前这个task。
这时我们需要在multiInstanceLoopCharacteristics下增加一个子节点——completionCondition
比如我是这样设置的:

    <completionCondition>
${signCount >= 2 }
</completionCondition>

好了,这样就是整个Task的定义了。(事实上我完全可以不用signCount实现这个效果。)

<userTask id="counterTask_1" name="COUNTERTASK">
<multiInstanceLoopCharacteristics
isSequential="false"
activiti:collection="assigneeList"
activiti:elementVariable="assignee">
<completionCondition>${signCount >= 2 }</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>

部署后的结果如下:

此处省略部署流程的操作,我们来看一下如何申请该流程。
如下我在页面中定义了三个审核人员:

<label>
<input type="checkbox" name="assigneeList" value="kim"/>kim
</label>
<label>
<input type="checkbox" name="assigneeList" value="jin"/>jin
</label>
<label>
<input type="checkbox" name="assigneeList" value="king"/>king
</label>

然后在java中接收并start:

private String[] assigneeList;
Map<String, Object> processInstVar = new HashMap<String, Object>();
//必须是List
processInstVar.put("assigneeList", Arrays.asList(assigneeList));
processInstVar.put("signCount", 0);
runtimeService.startProcessInstanceById(processId, processInstVar);

启动结果如下:

然后是执行,method只接收一个taskId:

List<Task> taskResultList = taskService.createTaskQuery().taskId(taskId)
.list();
//当前executionId
String currentExecutionId = taskResultList.get(0).getExecutionId();
//当前签署总数
String currentSignCount = StringUtils.defaultString(runtimeService
.getVariable(currentExecutionId, "signCount").toString(), "0");
//签署数+1
runtimeService.setVariable(currentExecutionId, "signCount",
Integer.parseInt(currentSignCount) + 1); //完成
taskService.complete(taskId);

我们执行了刚才创建的三个实例之一,结果是:

再执行一次,会签节点的实例已经不存在于actrutask表了,因为我设置的是“有两个人签署便通过”。
如下图,当前task已经不是会签的task了,相关的变量也消失不见了。

最后说我之前为什么说道‘事实上我完全可以不用signCount实现这个效果’,因为我们有:

所以我完全没有必要自己去定义一个变量去记录执行了多少次

Activiti - 设置会签的更多相关文章

  1. Activiti 工作流会签开发设计思路

    http://man1900.iteye.com/blog/1607753 在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务.这种业务需求也很常见 ...

  2. activiti设置customSessionFactories时的一个小坑

    现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...

  3. Activiti实现会签功能

    一个任务需要多个角色进行审批或者表决,根据这些审批结果来决定流程的走向.实现以上任务,activiti已经提供了支持,可以使用BPMN规范的多实例活动来实现. 1.Activiti多实例: 多实例节点 ...

  4. activiti 5.13 使用activiti设置用户组任务的 工作流的角色

    1.设置activiti 流程引擎的用户,组别,关系/**在部署流程定义和启动流程实例的中间,设置组任务的办理人,向Activiti表中存放组和用户的信息*/ IdentityService iden ...

  5. activiti设置流程变量

    public static void mian(String args[]){ ProcessEngine processEngine  = ProcessEngine.getDefaultProce ...

  6. JSAAS的Activiti会签开发扩展处理

    1.什么是会签? 在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务.这种业务需求很常见,如一个请款单,领导审批环节中,就需要多个部门领导签字.在流 ...

  7. activiti会签 多实例例子

    在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节.此时就可以用到activiti的多实例来解决此问题. 一.将一个节点设置成多实例的方法: ...

  8. Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

  9. A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

随机推荐

  1. DataAnnotations 验证

    转自:http://blog.sina.com.cn/s/blog_c21a857b0102wcus.html 常用的 DataAnnotations 1.Required :属性值必须非空或者不能只 ...

  2. 爬虫Scrapy指令学习

    1.新建一个新的爬虫项目指令 scrapy startproject xxx 2.在项目/spider目录下创建一个名为XXX的爬虫,并指定爬取域的范围  scrapy genspider XXX & ...

  3. 上云、微服务化和DevOps,少走弯路的办法

    本文由  网易云发布. 作者:张亮 如果说一个项目的发展历程就像一段未知的旅程,那<云原生应用架构实践>就像一张地图,基于前人的探索标明了在这段旅途中将会碰到的障碍,并注明了越过这些障碍的 ...

  4. akka开发(一)HelloWorld

    package com.hfi.helloakka; import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.Un ...

  5. C博客第03次作业---函数

    1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 首先,对于学习了函数的我来说是很开心的,因为学了函数之后可以解决很多以前不懂的问题,可以说函数是C语言中 ...

  6. day 69 ORM 多表增删改查操作

    http://www.cnblogs.com/liwenzhou/p/8660826.html 下面的代码是在 python console中配置的. 关闭pycharm会消失. from app01 ...

  7. 基础Network Request

    1:NSData + NSURL - (void)FF_LoadImageWithURLString:(NSString *)urlStr imageBlock:(ImageBlock)imageRe ...

  8. 用0x077CB531计算末尾0的个数

    http://www.matrix67.com/blog/archives/3985 unsigned int v;  // find the number of trailing zeros in ...

  9. robot_framework Authorization 解决登录超时问题(token)

    写rf的接口时,遇到总是报错提示: 登录超时 解决过程: 1 . 通过对同一个接口进行手机抓包对比,发现该接口请求时,多了Authorization,需要HTTP Basic Authenticati ...

  10. elasticsearch5.x安装中一些问题的解决办法

    1.root超级用户不能正常启动 由于elasticsearch2.0版本以后不能使用root来启动,所以需要创建一个普通用户来启动. [root@bogon ~]# groupadd elastic ...