`

扩展Activiti-5.12轻松实现流程节点间自由跳转和任意驳回/撤回

阅读更多
由于项目需要,最近对开源工作流引擎Activiti-5.12的功能做了一下扩展,实现了以下功能:
1.自由流(流程节点间自由跳转和任意驳回/撤回)
2.流程会签任务串并行模式切换

一、自由流
在已有流程模型的的基础上,每个流程实例当前任务可以任意驳回/撤回或者向后续节点任意跳转而无需在相关的两个节点之间显示地画跳转路径(也就是所谓的“中国式”自由流),通过在Activiti的流程组件TaskService接口中增加以下两个方法来达到上述目的:
public void complateTask(String taskid,String destTaskKey)
public void complateTask(String taskid,Map<String,Object> vars,String destTaskKey)

这两个方法和以下原始方法相比较就是多了一个destTaskKey参数:
public void complateTask(String taskid)
public void complateTask(String taskid,Map<String,Object> vars)

destTaskKey参数告诉流程引擎在结束taskID任务后直接跳转到destTaskKey对应的任务节点,目前可以实现简单人工任务和会签人工任务的驳回/撤回或者向后连跳n个节点,暂不支持子流程任务和流程调用任务。

注意:我们只是对activiti进行了功能扩展,因此activiti原来所有功能没有受到任何影响,该怎么用还是怎么用,只是如果流程中临时有任意驳回/撤回需求或者任意跳转需求时(为了避免在流程图中画N X N条路径,同时也不想修改流程模型),就可以通过上述两个扩展接口轻松搞定。

另外在TaskService接口中增加了驳回到上个环节的默认接口:
/**
   * 将当前任务驳回到上一个任务处理人处,并更新流程变量参数
   * @param taskId
   * @param variables
   */
  void rejecttoPreTask(String taskId, Map<String, Object> variables);
 
  /**
   * 将当前任务驳回到上一个任务处理人处
   * @param taskId
   */
  void rejecttoPreTask(String taskId);

2.流程会签任务串并行模式切换
如果流程中存在多实例任务(会签任务),那么可以通过流程变量在处理任务时或者在发起流程实例的时候设置多实例任务执行的方式为串行还是并行。
切换方式一 在发起流程时设置对应的会签任务的是串行还是并行模式:
Map variables= new HashMap();
			variables.put("usertask1_user", Arrays.asList("user1".split(",")));
			variables.put("usertask2_user", Arrays.asList("user2,user22,user23".split(",")));
			variables.put("usertask3_user", Arrays.asList("user3,user32".split(",")));
			variables.put("usertask4_user", Arrays.asList("user4,user42".split(",")));
			params.put("usertask5_user", Arrays.asList("user5".split(",")));
			variables.put("businessType", "test");
			/**
			 * 会签任务usertask2流程模型中被定义并行模式,这里在流程实例启动时通过流程变量将会签任务usertask2的并行模式改为串行模式
			 * 然后该流程实例的对应会签任务usertask2将以串行方式执行
			 */
			variables.put("usertask2"+MultiInstanceActivityBehavior.multiInstanceMode_variable_const, MultiInstanceActivityBehavior.multiInstanceMode_sequential);
ProcessInstance processInstance = runtimeService
				.startProcessInstanceByKey(process_key, businessKey, map);


切换方式二 在完成任务时设置后续会签任务的是串行还是并行模式:
/**
					 * 会签任务usertask2在对应的流程实例启动时已经被切换为串行模式,这里在完成usertask1任务时通过流程变量将会签任务usertask2的串行模式再改为并行模式
					 * 然后该流程实例的对应会签任务usertask2将以并行方式执行
					 */
Map variables= new HashMap();					variables.put("usertask2"+MultiInstanceActivityBehavior.multiInstanceMode_variable_const, MultiInstanceActivityBehavior.multiInstanceMode_parallel);
taskService.claim(taskId, username);//领取任务
taskService.complete(taskId, variables);//完成任务并设置后续会签任务的执行模式


变量的命名规范为:
   * taskkey.bpmn.behavior.multiInstance.mode
   * 取值范围为:
   * parallel 对应于常量MultiInstanceActivityBehavior.multiInstanceMode_parallel
   * sequential MultiInstanceActivityBehavior.multiInstanceMode_sequential
   * 说明:taskkey为对应的任务的定义id,根据具体的会签任务来取值,.bpmn.behavior.multiInstance.mode部分是固定值,对应常量MultiInstanceActivityBehavior.multiInstanceMode_variable_const
   *
   * 会签多实例任务执行模式可以在设计流程时统一配置,在任务处理时每个实例中的会签任务都可以通过变量设置和改变串并行模式,变量可以启动流程实例时动态设置,也可以在上个活动任务完成时设置。

3.小花絮
为了在任务历史表act_hi_taskinst表delete_reason_字段的值更加具体和详细,特意为activiti增加了一个全局组件:
org.activiti.engine.impl.identity.UserInfoMap
public interface UserInfoMap {
	String getUserName(String userAccount);//根据账号获取用户中文名称
	Object getUserAttribute(String userAccount,String userAttribute);//根据账号获取用户的属性值
	Object getUserAttributeByID(String userID,String userAttribute);//根据ID获取用户的属性值

}


UserInfoMap用来为流程引擎中的相关功能提供获取流程处理人各种和业务相关的属性的方法。通过在流程全局配置文件activiti.cfg.xml中为流程引擎配置UserInfoMap组件:
<property name="userInfoMap" class="com.frameworkset.platform.sysmgrcore.purviewmanager.PDPUserInfoMapImpl"/>


具体配置请查看案例文件:activiti.cfg.xml

org.activiti.engine.impl.identity.UserInfoMapImpl是UserInfoMap组件的默认实现。

以下是应用UserInfoMap组件后act_hi_taskinst表delete_reason_字段的几个值内容实例:
[提交-usertask1]任务被[张三-zhangsan]完成
[会签并行-usertask2]任务被[李四-lisi]转到节点[提交-usertask1]
[提交-usertask1]任务被[张三-zhangsan]完成
[会签并行-usertask2]任务被[张三-zhangsan]完成
[会签并行-usertask2]任务被[李四-lisi]完成
[会签并行-usertask2]任务被[王五-wangwu]完成
[驳回测试-usertask5]任务被[阿甘-agan]完成
[审批校验-usertask6]任务被[欧巴马-oubama]完成


4.后记

本次改造是基于bboss 3.6.2分支和Activiti 5.12.0版本,都是目前两个开源项目的最新版本或者较新版本(activiti最新小版本为5.12.1)。

相关文档:
开源工作流引擎activiti与bboss整合使用方法浅析
分享到:
评论
14 楼 hxlzpnyist 2013-09-25  
标哥 我说怎么眼熟呢,原来在论坛帖子里见过 

对于 任务的退回(驳回)实现方式  我重新考虑了采用动态创建任务实例的方式去实现,不知是否合适可行,有时间麻烦看一下 http://hxlzpnyist.iteye.com/blog/1947162  
13 楼 yin_bp 2013-09-24  
十六瓣 写道
顺序流的驳回好实现,并行、排它分支和多实例的驳回如果不实现合并到官方主干意义不大啊。

bboss改造版的activiti不仅支持顺序流的驳回,而且能够很好地实现你所说的功能:

“分支中节点要驳回到分支外;分之外要向分支中驳回;分之外要从分支中取回;分支中节点要取回流到分支外的任务;更是有只驳回一条分支任务的业务”
12 楼 十六瓣 2013-09-23  
十六瓣 写道
顺序流的驳回好实现,并行、排它分支和多实例的驳回如果不实现合并到官方主干意义不大啊。

试想这样的场景:分支中节点要驳回到分支外;分之外要向分支中驳回;分之外要从分支中取回;分支中节点要取回流到分支外的任务;更是有只驳回一条分支任务的业务。望博主只招啊!
11 楼 十六瓣 2013-09-23  
顺序流的驳回好实现,并行、排它分支和多实例的驳回如果不实现合并到官方主干意义不大啊。
10 楼 flashcloud 2013-07-13  
flashcloud 写道
另外,楼主为何在GitHub上的项目不从Activiti的GitHub项目上直接Fork出来再改啊,这样官方有新版本时,也好同步你的扩展啊,强烈建议这样做

在github上找了下官方的activiti,好像没有,只找到我分享的bboss改造版的activiti 5.12引擎



Activiti在GitHub上的官方源码库:https://github.com/Activiti/Activiti
强烈建议楼主采用Fork的方式进行扩展,这样,对同步升级应该有莫大好处。
9 楼 yin_bp 2013-07-06  
flashcloud 写道
Activiti已经更新到5.13版本了,楼主什么时候也把github上的项目同步到5.13啊?


有时间就搞,目前基于5.12的改造还算够用,呵呵
flashcloud 写道
另外,楼主为何在GitHub上的项目不从Activiti的GitHub项目上直接Fork出来再改啊,这样官方有新版本时,也好同步你的扩展啊,强烈建议这样做


在github上找了下官方的activiti,好像没有,只找到我分享的bboss改造版的activiti 5.12引擎
flashcloud 写道
如果有两个并行的任务,在其中一个任务上作驳回会是什么结果呢?即支持并行任务的驳回吗?

这个是支持的,目前驳回/撤回并行任务的结果是所有并行任务全部驳回到相应的驳回点,驳回节点的处理人只会收到一个相关的待办任务。

8 楼 flashcloud 2013-07-04  
如果有两个并行的任务,在其中一个任务上作驳回会是什么结果呢?即支持并行任务的驳回吗
7 楼 flashcloud 2013-07-04  
另外,楼主为何在GitHub上的项目不从Activiti的GitHub项目上直接Fork出来再改啊,这样官方有新版本时,也好同步你的扩展啊,强烈建议这样做
6 楼 flashcloud 2013-07-04  
Activiti已经更新到5.13版本了,楼主什么时候也把github上的项目同步到5.13啊?
5 楼 yin_bp 2013-06-14  
chxkyy 写道
改得太多了,没几人会用。

activiti的功能本身没有改动,只是做了功能扩展,另外就是和bboss做了集成,如果你对activiti、bboss或者对spring较熟悉的话,估计会很快地上手和使用这个扩展版的activiti的,否则确实难以上手。
4 楼 chxkyy 2013-06-14  
改得太多了,没几人会用。
3 楼 yin_bp 2013-06-07  
实际使用Activiti过程中出现以下问题并修复:
1.任务处理complate方法空指针异常修复
2.流程定义解析excludegate节点时,当默认路径指定了条件时校验失败抛异常,去掉这个校验,改为校验通过
3.form中的user字段类型不被支持,导致流程部署失败,增加UserFormType
2 楼 yin_bp 2013-06-05  
kuaile777.happy 写道
可以共享这个demo吗

这个没搞demo,只有改造后的流程引擎,你可以在文中的共享的github地址获取,扩展的api使用文中也有相信的使用说明,如果你有工作流的使用基础应该可以轻松地使用这些为activiti扩展的额外的功能。
1 楼 kuaile777.happy 2013-06-04  
可以共享这个demo吗

相关推荐

    Activiti5实现任务撤回,任意跳转(代码+注释 spring-activiti-withdraw.zip)

    activiti没有撤回,由于业务的需求需要实现撤回,在参考别人代码后以两种方式实现了任意节点的跳转。代码真实可用,如有问题可联系我 第一种方式: 1、获取当前节点,获取跳转节点 2、获取节点的所有流出流向,把...

    activiti-bpmn-converter-5.12

    activiti-bpmn-converter-5.12

    activiti-engine-5.21.0-API文档-中文版.zip

    赠送jar包:activiti-engine-5.21.0.jar; 赠送原API文档:activiti-engine-5.21.0-javadoc.jar; 赠送源代码:activiti-engine-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-engine-5.21.0.pom; 包含...

    activiti-explorer-eclipse项目

    总结来说,activiti-explorer-eclipse项目为Eclipse开发人员提供了一站式的解决方案,以便他们在IDE内实现和管理基于Activiti的工作流程。通过这个项目,开发者不仅可以更高效地设计流程,还可以在本地环境中便捷地...

    activiti-5.22.0zip下载

    Activiti 是一个开源的工作流和业务流程管理(BPM)平台,它被广泛用于企业级应用中,以实现流程自动化和提升工作效率。标题中的 "activiti-5.22.0zip下载" 指的是Activiti的一个特定版本——5.22.0的压缩包文件,...

    activiti-5.22.0官方版本 用于activiti-explorer.zip

    Activiti 是一个开源的工作流和业务自动化引擎,它在企业级应用中被广泛使用,用于构建灵活、可扩展的业务流程。在这个特定的版本——activiti-5.22.0,我们关注的是一个用于流程设计的官方工具,即 activiti-...

    activiti-6.0.0.zip

    activiti-6.0.0.zip 工作流官网包 ...3. wars 三个工程 (activiti5的activiti-explorer没有了,多了activiti-admin 和activiti-app) activiti-admin的用户名密码:admin/admin activiti-app的用户名密码:admin/test

    Activiti6-流程跟踪监控图-节点-流程线高亮显示-支持通过、不通过、驳回、退回

    Activiti6-流程跟踪监控图-节点-流程线高亮显示-支持通过、不通过、驳回、退回 支持内容: 已完成节点高亮显示、当前执行中节点红色显示 支持一个节点多条流出线,包括通过、不通过、驳回、退回,按照已执行操作正确...

    activiti-json-converter-5.21.0-API文档-中英对照版.zip

    赠送jar包:activiti-json-converter-5.21.0.jar; 赠送原API文档:activiti-json-converter-5.21.0-javadoc.jar; 赠送源代码:activiti-json-converter-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-...

    activiti-image-generator-5.21.0-API文档-中文版.zip

    赠送jar包:activiti-image-generator-5.21.0.jar; 赠送原API文档:activiti-image-generator-5.21.0-javadoc.jar; 赠送源代码:activiti-image-generator-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-...

    activiti-app6-汉化.zip

    activiti6的流程设计汉化,解压后将里面的activiti-app放入tomcat中运行就可以了。默认使用的H2,如果要使用mysql等其它数据库需要修改activiti-app\WEB-INF\classes\META-INF\activiti-app包下的activiti-app....

    Activiti-activiti-5.12.1.zip

    在版本5.12.1中,这个引擎提供了一系列工具类来帮助开发者更有效地实现和管理工作流程。以下是关于"Activity-5.12.1工作流依赖的工具类汇总整理"的一些关键知识点: 1. **Activiti Engine**: Activiti 的核心组件,...

    activiti-json-converter-5.21.0-API文档-中文版.zip

    赠送jar包:activiti-json-converter-5.21.0.jar; 赠送原API文档:activiti-json-converter-5.21.0-javadoc.jar; 赠送源代码:activiti-json-converter-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-...

    activiti-app6.0中文版.zip

    总的来说,"activiti-app6.0中文版.zip"是一个方便中文用户使用的完整工作流管理解决方案,它结合了强大的工作流引擎和直观的Web应用,使得流程管理变得简单而高效。无论是小型项目还是大型企业的复杂业务流程,...

    activiti-common-rest-5.21.0-API文档-中英对照版.zip

    赠送jar包:activiti-common-rest-5.21.0.jar; 赠送原API文档:activiti-common-rest-5.21.0-javadoc.jar; 赠送源代码:activiti-common-rest-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-common-rest-...

    Activiti-5.4中实现会签

    总的来说,实现Activiti-5.4中的会签功能涉及到流程设计、配置、监听器使用以及代码实现等多个方面。通过理解和掌握这些知识点,你可以灵活地构建适应各种业务场景的并发签名流程,提高企业的协作效率。

    Activiti-APP最全汉化包

    Activiti-APP是Activiti工作流引擎的一个组成部分,它提供了用户友好的图形化界面,用于设计、执行和管理业务流程。用户可以通过这个APP来创建流程模型,定义任务流转规则,监控流程实例的状态,并进行相关的操作,...

    activiti-image-generator-5.21.0-API文档-中英对照版.zip

    赠送jar包:activiti-image-generator-5.21.0.jar; 赠送原API文档:activiti-image-generator-5.21.0-javadoc.jar; 赠送源代码:activiti-image-generator-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-...

    activiti-bpmn-model-5.21.0-API文档-中文版.zip

    赠送jar包:activiti-bpmn-model-5.21.0.jar; 赠送原API文档:activiti-bpmn-model-5.21.0-javadoc.jar; 赠送源代码:activiti-bpmn-model-5.21.0-sources.jar; 赠送Maven依赖信息文件:activiti-bpmn-model-...

    activiti-bpmn-converter-5.18.0-sources.jar

    activiti-bpmn-converter-5.18.0-sources.jar

Global site tag (gtag.js) - Google Analytics