前些天在群里聊工作流和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. django drf 动态权限配置和动态seriaizer_class配置

    可以通过重写get_permissions方法和get_serializers_class方法来实现动态的配置权限和序列化 VIewDemo class RegUserSet(mixins.Creat ...

  2. NetCore入门篇:(四)Net Core项目启动文件Startup

    一.Startup介绍 1.Startup文件是Net Core应用程的启动程序,实现全局配置. 2.Net Core默认情况下,静态文件及Session都未启动,需要在Startup文件配置启动,否 ...

  3. c#常用的预处理器指令

    预处理器指令指导编译器在实际编译开始之前对信息进行预处理.所有的预处理器指令都是以 # 开始. #define 预处理器指令创建符号常量.#define 允许您定义一个符号,这样,通过使用符号作为传递 ...

  4. php不用递归完成无限分类,从表设计入手完整演示过程

    无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, ...

  5. 应用于电力电子变压器的双向DC_DC变换器综述(学习笔记)

    PET(Powerelectronictransformer):电力电子变压器 PET所具有的优点: (1)体积小.重量轻.无变压器油的污染: (2)具备功率因数调节能力,减小电网谐波污染: (3)能 ...

  6. Asp.Net MVC EF之一:使用Database类在EF框架中执行Sql语句

    引言 从EF6开始,增加了DateBase类,他通过从 DbContext 对象获取此类的实例.可用于管理支持数据库上下文或连接的实际数据库.这包括创建.删除和检查数据库的存在. 在6以前,我们使用E ...

  7. Django分页设置

    1. """ 分页组件使用示例: obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.pa ...

  8. Day 13 迭代器,生成器.

    一.迭代器 可以进行for循环的 数据类型 str ,list tuple dict set 文件句柄 什么是可迭代对象? 方法一:dir(被测对象) 如果他含有__iter__,那这个对象就叫做可迭 ...

  9. jieba库的使用与词云

    一.准备 在制作词云之前我们需要自行安装三个库,它们分别是:jieba, wordcloud, matplotlib 安装方法基本一致,下面我以安装wordcloud的过程为例. 第一步,按下Win+ ...

  10. 虚拟安装centos后无法上网、DNS无法解析问题解决

    1.保证拟机ip和VMnet8的ip在同一网段内 2.虚拟机网关和VMnet8相同