应用场景:
多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批。
流程如下:
<IGNORE_JS_OP style="WORD-WRAP: break-word">
要解决以上问题,需要实现多个子流程并行处理的功能。在Activiti5有一个比较强的节点属性就是多实例,它可以支持多实例的子流程,多实例任务,多实体脚本等。目前支持多实例的节点类型有:
- User task
- Script task
- Java service task
- Web service task
- Business rule task
- Email task
- Manual task
- Receive task
- (embedded) subprocess
- Call activity
多实例还有并行、串行区分。以下解释一下什么是并行与串行
并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响。
串行代表工作或任务由一个人完成后,再由另一个人去处理,直至全部完成,每个任务依赖于前一个任务完成。
会签任务即可以由activiti多实例任务节点来实现,(上一博客有介绍如何开发设计会签任务)
在Activiti的定义中,生成多实例的定义很简单,只需要如下类似去生成以下标签,则可以完成多实例的声明,如下所示,我们要支持并行节点的多实例的定义
多实例人工任务
Java代码 [url=][/url]
- <userTask activiti:assignee="${assignee}" id="SignTask2" name="财务主管会签">
- <extensionElements>
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener"
- event="create" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- </extensionElements>
- <multiInstanceLoopCharacteristics
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getSignUser(execution)}">
- <completionCondition>${signComplete.isComplete(execution) }
- </completionCondition>
- </multiInstanceLoopCharacteristics>
- </userTask>
多实例子流程
Java代码 [url=][/url]
- <subProcess activiti:assignee="${assignee}" id="SubProcess1"
- name="部门资金计划流程">
- <startEvent activiti:initiator="startUser" id="startEvent2"
- name="开始" />
- <endEvent id="endEvent1" name="结束1" />
- <userTask id="task3" name="助理填写">
- <documentation />
- <extensionElements>
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
- event="create" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- </extensionElements>
- </userTask>
- <userTask id="task4" name="部门领导审查">
- <documentation />
- <extensionElements>
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
- event="create" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- <activiti:taskListener
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- </extensionElements>
- </userTask>
- <sequenceFlow sourceRef="startEvent2" targetRef="task3"
- id="sequenceFlow1" name="" />
- <sequenceFlow sourceRef="task3" targetRef="task4" id="sequenceFlow2"
- name="" />
- <sequenceFlow sourceRef="task4" targetRef="endEvent1" id="sequenceFlow3"
- name="" />
- <extensionElements>
- <activiti:executionListener event="start"
- class="com.hotent.platform.service.bpm.listener.StartEventListener" />
- <activiti:executionListener event="end"
- class="com.hotent.platform.service.bpm.listener.EndEventListener" />
- </extensionElements>
- <multiInstanceLoopCharacteristics
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getMultipleUser(execution)}" />
- </subProcess>
所以关键的配置属性:
Java代码 [url=][/url]
- <multiInstanceLoopCharacteristics
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getSignUser(execution)}">
- <completionCondition>${signComplete.isComplete(execution) }
- </completionCondition>
- </multiInstanceLoopCharacteristics>
我们在控制多实例的个数或人数时,是通过taskUserAssignService的getSignUser获取或getMultipleUser(execution)其集合的个数,从而决定产生多少个实体任务或子流程。
如实现子流程多实例的获取人数,则来自:
Java代码 [url=][/url]
- /**
- * 获取多实体子流程的执行用户集合
- * @param execution
- * @return
- * @throws Execption
- */
- public List<String> getMultipleUser(ActivityExecution execution) throws Exception{
- String nodeId=execution.getActivity().getId();
- ExecutionEntity executionEnt=(ExecutionEntity) execution;
- List<String> userIds=(List<String>)execution.getVariable(BpmConst.SUBPRO_MULTI_USERIDS);
- if(userIds!=null) return userIds;
- Map<String,FlowNode> nodeMap= NodeCache.getByActDefId(executionEnt.getProcessDefinitionId());
- FlowNode subProcessNode=nodeMap.get(nodeId);
- FlowNode firstNode=subProcessNode.getSubFirstNode();
- FlowNode secodeNode=firstNode.getNextFlowNodes().get(0);
- List<String> userList=nodeUserMapLocal.get().get(secodeNode.getNodeId());
- logger.debug("userList size:" + userList.size());
- execution.setVariable(BpmConst.SUBPRO_MULTI_USERIDS, userList);
- return userList;
- }
因为该方法会被调用多次,所以其实现的思路是第一次其集合是来自用户的界面选择的人员列表,第一次之后,放到流程变量中去,在后续的获取中,直接从流程变量中获取。
然后在任务的创建的监听器中,从流程变量assignee中获取当前任务的执行人。以上的实现还有一细节就是要解决如何查找到子流程中的第一个任务节点,并且把对应的任务人员授给这任务节点。
最终实现的效果如下所示:
相关推荐
1. 流程模型:Flowable在BPMN 2.0标准的实现上更为完整,支持更多复杂的流程模型,如事件子流程、多实例任务等。 2. 社区与支持:Activiti有着更广泛的社区支持和丰富的文档,适合大型企业或项目,而Flowable则在...
### Activiti 5.16 流程管理中文版知识点概览 #### 1. 简介 - **协议**:Activiti采用Apache License 2.0协议。 - **下载**:可以从官方网站或第三方镜像站点下载Activiti 5.16版本。 - **源码**:GitHub上提供了...
例如,审批流程中可能需要多个部门同时审批。示例可能演示了如何配置多实例任务,以及如何处理它们的完成条件和并发性问题。 4. **Activiti6信号事件示例应用**: 信号事件(Signal Events)用于在流程实例间通信...
每个实例对应一个具体的流程执行,可以有多个实例同时运行。 5. **任务(Task)**:流程中的任务代表了工作流中的具体工作单元。它们可以分配给不同的用户或组,每个任务都有自己的属性,如任务名称、描述、参与者...
activeActivityIds这个list就是当前节点的id集合,如果是并行流程会有多个,其他情况只有一个。 走过的节点的获取可以从activiti的history表中获取,可以使用historyService组件的方法来获取历史记录。 Activiti...
在Activiti-5.22.0中,可能会包含对流程定义的版本控制,允许并行使用多个版本的流程,并在需要时切换到新版本。 10. **社区与文档**: Activiti 拥有活跃的社区,开发者可以在这里获取帮助、分享经验,以及获取...
此外,还要考虑并发控制,避免多个撤回请求同时操作同一个流程实例。 在实际开发中,你可以创建一个服务类,封装撤回操作的具体逻辑,然后通过 Spring Boot 集成 Activiti 来提供服务接口。在提供的代码示例 `demo-...
Activiti是一款开源的工作流引擎,它基于模型驱动的架构(MDA),专为现代企业应用程序设计,用于处理业务流程自动化。这个"Activiti工作流示例Activiti Demo"提供了完整的源代码,帮助开发者深入理解并实际操作...
在 Activiti-5.4 版本中,会签(Concurrent Signatures)是流程设计中的一个重要特性,允许多个参与者同时对同一任务进行处理,提高了工作效率。下面我们将详细探讨如何在Activiti-5.4中实现会签以及相关的技术细节...
- 支持多租户模式,便于在一个 Activiti 实例中管理多个独立的业务单元。 总结来说,Activiti 6.0 提供的这三个 WAR 包为企业构建和管理业务流程提供了全面的解决方案,涵盖了前端应用、后台管理以及 API 集成。...
每个实例代表了流程的一个具体运行过程,可以包含多个并发或串行的任务和活动。 3. **数据库表结构**:Activiti 使用一组特定的数据库表来存储各种运行时数据。例如: - `ACT_RE_*` 表存储静态信息,如流程定义和...
9. **版本控制**:Activiti 支持流程版本控制,这意味着可以部署多个版本的同一流程,并控制哪些实例运行哪个版本。 10. **社区支持**:作为开源项目,Activiti 有活跃的社区提供支持,包括在线论坛、文档和示例,...
Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级流程管理中。6.0 版本是 Activiti 的一个重要里程碑,它引入了诸多改进和新特性,以提升性能和用户体验。在这个“activiti 6.0版本源码(wars包01)...
这个流程可能涉及各种活动,如用户任务(员工填写申请)、服务任务(自动检查可用假期余额)、决策任务(根据请假天数决定审批级别)和并发任务(多个审批人同时审查)。 4. **源码分析**: 提供的源码可能包含...
Activiti提供了一系列API和模型元素来支持这些需求,如用户任务、服务任务、多实例、并发分支等。同时,SpringBoot的注解驱动和AOP特性可以帮助我们轻松地实现业务逻辑和流程控制的集成。 总结来说,本篇主要介绍了...
并行网关,也称为并发网关,允许流程实例同时沿着多个路径进行,这些路径可以是独立的,然后在某个汇聚点重新合并。这意味着当流程到达并行网关时,它将分成多个分支,每个分支都可以独立执行,直到所有分支都完成或...
Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级应用中,提供流程定义、执行、监控等全面的功能。在Activiti 6.0版本中,它引入了更多的改进和新特性,以提升性能和易用性。中文API文档是针对中国...
Activiti7是一个强大的开源工作流引擎,主要用于企业业务流程管理(BPM)系统。这个开源项目为开发者提供了丰富的工具和API,便于进行二次开发,实现高效的企业级流程自动化。在这个sunny-activiti-master压缩包中,...
Activiti 是一个开源的工作流...综上所述,Activiti 5.17.0 提供了一套完整的工作流解决方案,涵盖了流程设计、执行、监控等多个方面。通过学习和使用这个版本,开发者可以构建出高效、灵活的企业级业务流程管理系统。
会签(Multi-instance)支持并行处理多个子任务,`multi-instance` 属性在 BPMN 图形中可配置。 6. **信号与消息启动**:`SignalEventReceived()` 方法可用于发送信号,触发等待该信号的并发分支。而消息启动事件...