目录

  • 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工作流之多实例任务会签相关推荐

  1. (经验总结)flowable工作流_01_流程实例管理

    文章目录 一.流程定义管理功能有哪些? 二.删除流程实例会删除哪些表中的数据? 三.流程实例做什么用? 四.流程定义涉及的表 一.流程定义管理功能有哪些? 类名:ApiFlowableProcessI ...

  2. 《Activiti/Flowable 深入BPM工作流》-流程实例怎么实现挂起?

    <Activiti/Flowable  深入BPM工作流>-流程实例怎么实现挂起? 一. 问题 1. 什么情况要进行流程的挂起? 2. 具体怎么将流程挂起? 二. 详情   1. 什么情况 ...

  3. flowable 任务节点多实例使用

    我们在使用Flowable 工作流引擎的时候,最常用的肯定是任务节点,因为在OA系统.审批系统.办公自动化系统中核心的处理就是流程的运转,在流程运转的时候,可能我们有这样的一个需求,在一个任务节点的时 ...

  4. flowable工作流技术学习

    一.flowable工作流引擎中文文档 Flowable BPMN 用户手册 (v 6.3.0) 这个文档内容太多,稍微看看就好,具体学习还得从demo里面去学习. 二.flowable项目下载地址与 ...

  5. Flowable工作流入门

    Flowable工作流入门 本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 下载地址:Flowable ...

  6. Flowable工作流引擎

    Flowable工作流引擎 Flowable-基础篇(根据BV1Pb4y1p7Ku整理) 一.简介 Flowable是BPMN的一个基于java的软件实现,不过Flowable不仅仅包括BPMN,还有 ...

  7. 初识flowable工作流-实现简单请假流程SpringBoot+VUE

    一.前言 大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程. 二.代 ...

  8. SpringBoot整合Flowable工作流引擎框架

    Flowable工作流引擎框架介绍 一个Java编写的轻量级业务流程引擎,为开发人员.系统管理员和业务用户提供工作流和业务流程管理(BPM)平台. 不仅包括BPMN,还有DMN决策表和CMMN Cas ...

  9. Flowable工作流实战快速入门(一)

    文章目录 1. 工作流入门介绍 1.1 什么是工作流? 1.2 工作流的原理 1.3 BPM 1.4 BPMN 1.5 Activiti 还是flowable? 2. flowable入门helloW ...

最新文章

  1. xilinx vivado烧录s29gl256p-bpi-x8
  2. POJ 1125 Stockbroker Grapevine
  3. python break -else 语句
  4. JVM学习01总体概述
  5. 如何用VC++开发读取网卡MAC地址的程序
  6. 消息映射的服务器的设计与实现
  7. 【剑指offer】包含min函数的栈
  8. jQueryEasyUi验证
  9. Android之ActivityManager与Proxy模式的运用
  10. MyGeneration代码生成工具
  11. 实现推拉ui样式_这推拉门隔断,我从没见过!直角设计同时划分3大功能区,太牛了...
  12. WannaCry病毒横行Windows,Mac用户不应幸灾乐祸!
  13. Linux 网卡驱动学习(二)(网络驱动接口小结)
  14. (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
  15. ASN1对象与OID之间转换的函数
  16. 机器学习项目实战----信用卡欺诈检测(一)
  17. 原因及解决办法:error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file
  18. VIM 快捷键汇总(持续更新)
  19. 全国市级城市拼音-中文对照表(json格式)
  20. 联想重装系统去掉保护_联想硬盘保护系统7.6卸载后PE还原系统步骤

热门文章

  1. HihoCoder 1830 Cheat ICPC2018 北京网络赛
  2. 马云谈“大数据”:很多人对这三个字有误解
  3. 【渝粤题库】陕西师范大学202501 法语(二)作业
  4. Java池化技术你了解多少?
  5. icloud是什么?
  6. TYPEC无协议芯片最高可输出5V3A
  7. [CSCCTF 2019 Qual]FlaskLight——直取flag?
  8. 公司该如何创建适合自己的区块链产品、联盟链、私链
  9. excel时间戳转换为时间格式
  10. 坐标反算用计算机怎么算,卡西欧5800计算器坐标正反算程序