多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批。

流程如下:

要解决以上问题,需要实现多个子流程并行处理的功能。在Activiti5有一个比较强的节点属性就是多实例,它可以支持多实例的子流程,多实例任务,多实体脚本等。目前支持多实例的节点类型有:

多实例还有并行、串行区分。以下解释一下什么是并行与串行

并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响。

串行代表工作或任务由一个人完成后,再由另一个人去处理,直至全部完成,每个任务依赖于前一个任务完成。

会签任务即可以由activiti多实例任务节点来实现,(上一博客有介绍如何开发设计会签任务)

在Activiti的定义中,生成多实例的定义很简单,只需要如下类似去生成以下标签,则可以完成多实例的声明,如下所示,我们要支持并行节点的多实例的定义

多实例人工任务

Java代码 
  1. "${assignee}"  id= "SignTask2"  name= "财务主管会签" >
  2. class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener"
  3. event="create" />
  4. class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
  5. event="assignment" />
  6. class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
  7. event="complete" />
  8. activiti:elementVariable="assignee" isSequential="false"
  9. activiti:collection="${taskUserAssignService.getSignUser(execution)}">
  10. ${signComplete.isComplete(execution) }

多实例子流程

Java代码 
  1. "${assignee}"  id= "SubProcess1"
  2. name="部门资金计划流程">
  3. "startUser"  id="startEvent2"
  4. name="开始" />
  5. "endEvent1"  name="结束1" />
  6. "task3"  name="助理填写">
  7. class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
  8. event="create" />
  9. class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
  10. event="assignment" />
  11. class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
  12. event="complete" />
  13. "task4"  name="部门领导审查">
  14. class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
  15. event="create" />
  16. class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
  17. event="assignment" />
  18. class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
  19. event="complete" />
  20. "startEvent2"  targetRef="task3"
  21. id="sequenceFlow1" name="" />
  22. "task3"  targetRef="task4" id="sequenceFlow2"
  23. name="" />
  24. "task4"  targetRef="endEvent1" id="sequenceFlow3"
  25. name="" />
  26. "start"
  27. class="com.hotent.platform.service.bpm.listener.StartEventListener" />
  28. "end"
  29. class="com.hotent.platform.service.bpm.listener.EndEventListener" />
  30. activiti:elementVariable="assignee" isSequential="false"
  31. activiti:collection="${taskUserAssignService.getMultipleUser(execution)}" />

所以关键的配置属性:

Java代码 
  1. activiti:elementVariable="assignee" isSequential="false"
  2. activiti:collection="${taskUserAssignService.getSignUser(execution)}">
  3. ${signComplete.isComplete(execution) }

我们在控制多实例的个数或人数时,是通过taskUserAssignService的getSignUser获取或getMultipleUser(execution)其集合的个数,从而决定产生多少个实体任务或子流程。

如实现子流程多实例的获取人数,则来自:

Java代码 
  1. /**
  2. * 获取多实体子流程的执行用户集合
  3. * @param execution
  4. * @return
  5. * @throws Execption
  6. */
  7. public List  getMultipleUser(ActivityExecution execution)  throws Exception{
  8. String nodeId=execution.getActivity().getId();
  9. ExecutionEntity executionEnt=(ExecutionEntity) execution;
  10. List  userIds=(List )execution.getVariable(BpmConst.SUBPRO_MULTI_USERIDS);
  11. if(userIds!=null) return userIds;
  12. Map <string,flownode> nodeMap= NodeCache.getByActDefId(executionEnt.getProcessDefinitionId());
  13. FlowNode subProcessNode=nodeMap.get(nodeId);
  14. FlowNode firstNode=subProcessNode.getSubFirstNode();
  15. FlowNode secodeNode=firstNode.getNextFlowNodes().get(0);
  16. List  userList=nodeUserMapLocal.get().get(secodeNode.getNodeId());
  17. logger.debug("userList size:" + userList.size());
  18. execution.setVariable(BpmConst.SUBPRO_MULTI_USERIDS, userList);
  19. return userList;
  20. }

因为该方法会被调用多次,所以其实现的思路是第一次其集合是来自用户的界面选择的人员列表,第一次之后,放到流程变量中去,在后续的获取中,直接从流程变量中获取。

然后在任务的创建的监听器中,从流程变量assignee中获取当前任务的执行人。以上的实现还有一细节就是要解决如何查找到子流程中的第一个任务节点,并且把对应的任务人员授给这任务节点。

最终实现的效果如下所示:

Activiti 多个并发子流程的应用的更多相关文章

  1. 【Activiti学习之七】BPMN子流程、顺序流、流程关口

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.子流程 1.嵌入子流程2.调用子流程3.事件子流程4.事务子流程 二.顺序流1.条件 ...

  2. Hawk 6. 高级话题:子流程系统

    子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...

  3. visio子流程创建

    已经画好了流程,想将一部分抽取成子流程: 多选中要抽取成子流程的的框图,点 菜单栏  中的 进程 选项,点此选项卡下面的第三个按钮: 根据所选内容创建 这样就会自动生成子流程,子流程的具体位置在 左下 ...

  4. Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型

    开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...

  5. Activiti 查询最新版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  6. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...

  7. Activiti工作流(三)——流程变量

    流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...

  8. Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

    可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  war ...

  9. (六)Activiti之实现学生请假流程

    一.实现学生请假流程 1.1 用activiti插件生成bpmn和png文件 1.2 部署流程定义 package com.shyroke.activiti.firstActiviti; import ...

随机推荐

  1. ESASP 业界第一个最为完善的 ASP MVC框架(待续)

    EchoSong 疯狂了,竟然整ASP框架. ASP就是抛弃的孩子,没人养没人疼的, 智力.四肢不全.何谈框架?? 很多ASP的前辈们要么放弃ASP 投入 ASP.net 或者 PHP怀抱.要么直接用 ...

  2. android sdk启动报错error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:

    android sdk启动报错error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 问题原因: ...

  3. iOS开发--泛型

    一. 泛型函数 1.单一占位符泛型函数 下面就使用一个经典案例:两个数值进行交换.来使用泛型,写一个通用的函数,这个函数的功能就是交换两个变量的值.在Swift中不允许类型隐式转换,也就是说,如果你定 ...

  4. Keil MDK编译器(V4.03)与J-LINK使用

    前几天进手了一个J-LINK,因为H-JTAG毕竟对MDK支持的不是太完美,比如用keil mdk上面的下载按钮烧录程序,不是直接就能烧录进去,而是弹出H-Flash软件,再手工选择文件烧录:而且用H ...

  5. 私有虚函数的特点(C++和Java的机制还有所不同)

    多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位于vtbl中,只不过该函数的多态一般只能在基类的内部由其他非虚函数调用该函数的时候反映出来,访问限 ...

  6. PHPStorm IDE 快捷键(MAC)

    ⌘——Command ⌃ ——Control ⌥——Option/Alt ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 编辑 Command+alt+T 用 (if..else, ...

  7. JavaScript ECAMScript5 新特性——get/set访问器

    之前对get/set的理解一直有误,觉得get set 是对象属性方法.看了别人的博客也有很多疑问,今天系统的做了很多测试终于弄明白了.(自己通过看书和写demo测试的,如有不对欢迎大家批评指正) g ...

  8. Android 设置闹铃步骤和基础代码

    主要分三步: 1. 设置闹铃时间; 2. 接收闹铃事件广播; 3. 重开机后重新计算并设置闹铃时间;   1. 设置闹铃时间(毫秒) private void setAlarmTime(Context ...

  9. ColorDescriptor software v4.0 一个提取颜色特征描述子的软件包

    ColorDescriptor software v4.0 Created by Koen van de Sande, (c) University of Amsterdam Note: Any co ...

  10. Docker基础技术:DeviceMapper

    在上一篇介绍AUFS的文章中,大家可以看到,Docker的分层镜像是怎么通过UnionFS这种文件系统做到的,但是,因为Docker首选的AUFS并不在Linux的内核主干里,所以,对于非Ubuntu ...