Flowable工作流之多实例任务会签
目录
- 1. 会签
- 2. 多实例任务会签
- 2.1. 绘制流程图
- 2.1.1. 多实例类型
- 2.1.2. 集合(多实例)
- 2.1.3. 元素变量(多实例)
- 2.1.4. 分配用户
- 2.1.5. 完成条件(多实例)
- 2.1.6. 基数(多实例)
- 2.2. 部署并启动
- 2.3. 完成任务
- 2.3.1. 首先两个人完成审批任务
- 2.3.2. 其次一个人再次完成任务(三个人完成任务)
1. 会签
会签:在流程任务管理中,比如我们有一个任务,可能需要多人审批,审批通过的条件可能比较多样,比如 5
个人审批,3
个人审批通过就算过了(任务完成),再或者有一个人权限比较高,拥有一票否决权。即是其余所有人都审批通过了,他点了个否定就算不过了,这种就是会签
会签类型
- 按数量通过:达到一定数量的处理后,会签通过
- 按比例通过:达到一定比例的处理后,会签通过
- 一票否决:只要有一个人不同意时,会签不通过
- 一票通过:只要有一个人同意时,会签通过
Flowable
实现会签是基于 多实例任务
的,将节点设置成多实例,通过在 userTask
节点的属性配置
2. 多实例任务会签
2.1. 绘制流程图
绘制完成的流程图如下
详细的 xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"exporterVersion="6.7.2"><process id="MultiPersonCountersign" name="MultiPersonCountersign" isExecutable="true"><documentation>多实例会签</documentation><startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent><userTask id="dslId" name="多实例会签任务1" flowable:assignee="${assignee}" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements><multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList"flowable:elementVariable="assignee"><extensionElements></extensionElements><loopCardinality>5</loopCardinality><completionCondition>${nrOfCompletedInstances==3}</completionCondition></multiInstanceLoopCharacteristics></userTask><sequenceFlow id="sid-7B95551F-D5B8-4DDE-8A83-96364743CF9B" sourceRef="startEvent1"targetRef="dslId"></sequenceFlow><userTask id="userId" name="任务2" flowable:assignee="${user}" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="sid-4F6F67B0-2312-47AD-9A01-1272E61D30EC" sourceRef="dslId" targetRef="userId"></sequenceFlow><endEvent id="sid-D63DAAFE-BCCB-4339-9CF5-D0D9D35080AA"></endEvent><sequenceFlow id="sid-3EC3B10D-9A07-48F6-A380-D0707D6D70F0" sourceRef="userId"targetRef="sid-D63DAAFE-BCCB-4339-9CF5-D0D9D35080AA"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_MultiPersonCountersign"><bpmndi:BPMNPlane bpmnElement="MultiPersonCountersign" id="BPMNPlane_MultiPersonCountersign"><bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1"><omgdc:Bounds height="30.0" width="30.0" x="45.0" y="90.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="dslId" id="BPMNShape_dslId"><omgdc:Bounds height="80.0" width="100.0" x="195.0" y="65.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="userId" id="BPMNShape_userId"><omgdc:Bounds height="80.0" width="100.0" x="435.0" y="65.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-D63DAAFE-BCCB-4339-9CF5-D0D9D35080AA"id="BPMNShape_sid-D63DAAFE-BCCB-4339-9CF5-D0D9D35080AA"><omgdc:Bounds height="28.0" width="28.0" x="705.0" y="91.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sid-3EC3B10D-9A07-48F6-A380-D0707D6D70F0"id="BPMNEdge_sid-3EC3B10D-9A07-48F6-A380-D0707D6D70F0" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"><omgdi:waypoint x="534.95" y="105.0"></omgdi:waypoint><omgdi:waypoint x="705.0" y="105.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-4F6F67B0-2312-47AD-9A01-1272E61D30EC"id="BPMNEdge_sid-4F6F67B0-2312-47AD-9A01-1272E61D30EC" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="294.95000000000005" y="105.0"></omgdi:waypoint><omgdi:waypoint x="434.9999999999986" y="105.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-7B95551F-D5B8-4DDE-8A83-96364743CF9B"id="BPMNEdge_sid-7B95551F-D5B8-4DDE-8A83-96364743CF9B" flowable:sourceDockerX="15.0"flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="74.94999946593475" y="105.0"></omgdi:waypoint><omgdi:waypoint x="195.0" y="105.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>
多实例会签任务1
节点的属性配置
xml
文件中重点需要认识的地方
<userTask id="dslId" name="多实例会签任务1" flowable:assignee="${assignee}" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements><multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList"flowable:elementVariable="assignee"><extensionElements></extensionElements><loopCardinality>5</loopCardinality><completionCondition>${nrOfCompletedInstances==3}</completionCondition></multiInstanceLoopCharacteristics>
</userTask>
2.1.1. 多实例类型
- 并行会签
parallel
: 多个人同时执行任务。对应的xml
文件中的配置是isSequential="false"
- 顺序会签
sequential
:顺序执行任务。对应的xml
文件中的配置是isSequential="true"
2.1.2. 集合(多实例)
会签人员的集合变量,可以随意命名。对应的 xml
文件中的配置是 flowable:collection="assigneeList"
2.1.3. 元素变量(多实例)
循环集合多实例集合的变量名,可以随意命名,注意没有 ${}
。对应的 xml
文件中的配置是 flowable:elementVariable="assignee"
// 类似于这样的
for (String assignee : assigneeList) {}
2.1.4. 分配用户
需要和元素变量(多实例)的名称保持一致;对应的 xml
文件中的配置是 flowable:assignee="${assignee}"
与元素变量(多实例)的 "assignee"
是一致的
2.1.5. 完成条件(多实例)
Flowable
默认的流程变量:
nrOfInstances
:会签中总共的实例数量nrOfCompletedInstances
:已经完成的实例数量nrOfActiviteInstances
:当前活动的实例数量,即还未完成的实例数量
<-- 对应的 xml 文件中的配置是 -->
${nrOfCompletedInstances==3}
完成的任务实例
即 3
个人完成任务后,就算这个节点完成任务了,当然你也可以设置别的条件,可以通过 EL
表达式进行设置
<-- 表示所有人都需要完成任务会签才结束 -->
${nrOfInstances==nrOfCompletedInstances}<-- 是指必须审批人全部同意才会流转到下一个任务节点 -->
${nrOfCompletedInstances/nrOfInstances==1}
2.1.6. 基数(多实例)
<-- 对应的 xml 文件中的配置是 -->
<loopCardinality>5</loopCardinality>
表示这个任务循环的基数是多少,这个任务类型就是多实例任务,比如我们需要 5
个人审批投票,这里设置 5
就行了。为什么叫循环基数呢?就是因为如果我们的通过条件是 3
个人通过就 ok
的话,那么可能只需要 3
个实例就结束,进入到下一个环节了,而不是要 5
个实例
2.2. 部署并启动
// 部署流程
@Test
public void test1() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/MultiPersonCountersign.bpmn20.xml").name("多实例会签流程").deploy();System.out.println("deploy.getId() = " + deploy.getId());System.out.println("deploy.getName() = " + deploy.getName());
}// 启动流程
@Test
public void test2() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();// 给集合(多实例)变量assigneeList添加数据,它会遍历赋值给${assignee}去分配用户Map<String, Object> variables = new HashMap<>();variables.put("assigneeList", Arrays.asList("王一", "王二", "王三", "王四", "王五"));ProcessInstance processInstance = runtimeService.startProcessInstanceById("MultiPersonCountersign:2:19f46f6a-58e8-11ed-8da6-005056c00001", variables);System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());System.out.println("流程实例的ID:" + processInstance.getId());
}
成功启动后在 ACT_RU_TASK
表中,会签的流程会有 5
条任务,因为 assigneeList
变量集合只设置了 5
个人
2.3. 完成任务
2.3.1. 首先两个人完成审批任务
// 王一完成任务
@Test
public void test3() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery() .processInstanceId("5ad4ec62-58e2-11ed-9cf7-005056c00001").taskAssignee("王一").singleResult();// 给任务2变量分配用户Map<String, Object> variables = new HashMap<>();variables.put("user", "张一");if (task != null) {taskService.complete(task.getId(), variables);}
}// 王五完成任务
@Test
public void test4() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("5ad4ec62-58e2-11ed-9cf7-005056c00001").taskAssignee("王五").singleResult();if (task != null) {taskService.complete(task.getId());}
}
王一
和 王五
两个人首先完成任务之后,在 ACT_RU_TASK
表中查看数据,发现还有三个人没有完成任务,且任务节点没有发生流转;因为我们设置的完成条件(多实例)是${nrOfCompletedInstances==3}
,只有两个人完成了任务,还没有满足要求
2.3.2. 其次一个人再次完成任务(三个人完成任务)
// 王二完成任务
@Test
public void test5() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("829827be-58e8-11ed-b78f-005056c00001").taskAssignee("王二").singleResult();if (task != null) {taskService.complete(task.getId());}
}
王二
完成任务后,此时已经有 3
个人完成了任务,满足了完成条件(多实例)${nrOfCompletedInstances==3}
,此时再次查看 ACT_RU_TASK
表数据如下
此时已经发生了任务节点的流转,即该 多实例会签任务1
节点任务已经完成了,转到了 任务2
节点了
Flowable工作流之多实例任务会签相关推荐
- (经验总结)flowable工作流_01_流程实例管理
文章目录 一.流程定义管理功能有哪些? 二.删除流程实例会删除哪些表中的数据? 三.流程实例做什么用? 四.流程定义涉及的表 一.流程定义管理功能有哪些? 类名:ApiFlowableProcessI ...
- 《Activiti/Flowable 深入BPM工作流》-流程实例怎么实现挂起?
<Activiti/Flowable 深入BPM工作流>-流程实例怎么实现挂起? 一. 问题 1. 什么情况要进行流程的挂起? 2. 具体怎么将流程挂起? 二. 详情 1. 什么情况 ...
- flowable 任务节点多实例使用
我们在使用Flowable 工作流引擎的时候,最常用的肯定是任务节点,因为在OA系统.审批系统.办公自动化系统中核心的处理就是流程的运转,在流程运转的时候,可能我们有这样的一个需求,在一个任务节点的时 ...
- flowable工作流技术学习
一.flowable工作流引擎中文文档 Flowable BPMN 用户手册 (v 6.3.0) 这个文档内容太多,稍微看看就好,具体学习还得从demo里面去学习. 二.flowable项目下载地址与 ...
- Flowable工作流入门
Flowable工作流入门 本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 下载地址:Flowable ...
- Flowable工作流引擎
Flowable工作流引擎 Flowable-基础篇(根据BV1Pb4y1p7Ku整理) 一.简介 Flowable是BPMN的一个基于java的软件实现,不过Flowable不仅仅包括BPMN,还有 ...
- 初识flowable工作流-实现简单请假流程SpringBoot+VUE
一.前言 大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程. 二.代 ...
- SpringBoot整合Flowable工作流引擎框架
Flowable工作流引擎框架介绍 一个Java编写的轻量级业务流程引擎,为开发人员.系统管理员和业务用户提供工作流和业务流程管理(BPM)平台. 不仅包括BPMN,还有DMN决策表和CMMN Cas ...
- Flowable工作流实战快速入门(一)
文章目录 1. 工作流入门介绍 1.1 什么是工作流? 1.2 工作流的原理 1.3 BPM 1.4 BPMN 1.5 Activiti 还是flowable? 2. flowable入门helloW ...
最新文章
- xilinx vivado烧录s29gl256p-bpi-x8
- POJ 1125 Stockbroker Grapevine
- python break -else 语句
- JVM学习01总体概述
- 如何用VC++开发读取网卡MAC地址的程序
- 消息映射的服务器的设计与实现
- 【剑指offer】包含min函数的栈
- jQueryEasyUi验证
- Android之ActivityManager与Proxy模式的运用
- MyGeneration代码生成工具
- 实现推拉ui样式_这推拉门隔断,我从没见过!直角设计同时划分3大功能区,太牛了...
- WannaCry病毒横行Windows,Mac用户不应幸灾乐祸!
- Linux 网卡驱动学习(二)(网络驱动接口小结)
- (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
- ASN1对象与OID之间转换的函数
- 机器学习项目实战----信用卡欺诈检测(一)
- 原因及解决办法:error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file
- VIM 快捷键汇总(持续更新)
- 全国市级城市拼音-中文对照表(json格式)
- 联想重装系统去掉保护_联想硬盘保护系统7.6卸载后PE还原系统步骤