前些天在群里聊工作流和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. NetCore入门篇:(九)Net Core项目使用Session及用Redis做分布式

    一.简介 1.因为Net Core默认是没有启动Session功能的,如果需要使用,需要通过代码开启. 2.本篇说明如果启用默认Session实现,即Session存到内存中. 3.本篇扩展说明如何用 ...

  2. musql 添加字段语句

    修改表tax_version添加up_content属性为text类型非空,注释为“更新内容”,字段添加再“name”属性后面 ALTER TABLE `tax_version` ADD `up_co ...

  3. C#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点

    HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  4. sql service 备份

    declare @SqlBackupDataBase as nvarchar(1000)set @SqlBackupDataBase=N'BACKUP DATABASE YSKJ_Wechat TO ...

  5. odoo:开源ERP/安装和初始设置

    1.1 Odoo的结构 Odoo使用Web浏览器来访问Odoo服务,因此你的Odoo服务器可以部署在较远的地方(如另外一个城市),用户的计算机上只需安装谷歌.火狐或 IE9 以上的浏览器,所以Web客 ...

  6. Day 22 面向对象知识.

    https://www.cnblogs.com/bigberg/p/7252349.html #类方法,静态方法, 属性方法. 类有两种作用:属性引用 和实例化.属性引用(类名.属性)class pe ...

  7. Python中进程和线程的总体区别

    Num01–>线程 线程是操作系统中能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一个线程指的是进程中一个单一顺序的控制流. 一个进程中可以并发多条线程,每条线程并行 ...

  8. iOS - 安全

    1. CheckList http://www.jianshu.com/p/d3cc2d5c177d a 数据安全.分为数据传输安全和数据存储安全 数据存储安全为保存在App中的数据安全.不允许明文存 ...

  9. Django 项目 实现重定向并进行反向解析

    一.项目路由配置urls.py中 from django.conf.urls import include, url from django.contrib import admin # 匹配应用 u ...

  10. webpack快速入门——CSS文件打包

    1.在src下新建css文件,在css文件下新建index.css文件,输入以下代码 body{ background:pink; color:yellowgreen; } 2.css建立好后,需要引 ...