Flowable完整教程之多实例会签

  • 前言
  • 1、BladeX流程设计器
    • 1.1、BladeX工作流设计
    • 1.2、parallel多实例流程设计
    • 1.3、 BladeX多实例任务节点参数设置
  • 2、部署测试
    • 2.1、部署流程定义
    • 2.2、测试流程定义是否部署成功
    • 2.3、启动流程实例
    • 2.4、完成任务
    • 2.5、任务查询
    • 2.6 流程跟踪

前言

以下内容皆是本人原创,创作不易,感谢帮忙点赞、转发,我是爱写代码的成成呀
首先要理解什么是会签?比如一个任务需要多人审批,比如需要5个人审批,都审批通过就算通过,一人反对则不通过;再比如多人审批,只要经理审批通过或者其他成员9成审批通过,就算通过,这就是会签。
提示:以下是本篇文章正文内容,下面案例可供参考

1、BladeX流程设计器

1.1、BladeX工作流设计


配置多实例类型:sequential 串行 parallel 并行 ,这里我们先研究parallel 。

1.2、parallel多实例流程设计


从流程图中我们可以看到,这个流程有四个节点,分别是开始节点、多实例任务节点、普通的用户节点以及结束节点.。

<!--上述流程Bpmn文件:多实例会签.bpmn20.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"><process id="Multi-instanceCountersigning" name="多实例会签" isExecutable="true"><documentation>勿删除</documentation><startEvent id="startEvent1"></startEvent><userTask id="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" name="多实例任务UserTask"><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"><loopCardinality>5</loopCardinality><completionCondition>${nrOfCompletedInstances/nrOfInstances &gt;= 0.50}</completionCondition></multiInstanceLoopCharacteristics></userTask><sequenceFlow id="sid-436F11E8-B070-4857-B5A6-A3CB94D4F138" sourceRef="startEvent1" targetRef="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C"></sequenceFlow><userTask id="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" name="普通UserTask"></userTask><sequenceFlow id="sid-8F6E3D87-82DA-487E-8C71-53E983BD255A" sourceRef="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" targetRef="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36"></sequenceFlow><endEvent id="sid-613CA134-8467-4145-A6B3-3995AD7332A3"></endEvent><sequenceFlow id="sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92" sourceRef="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" targetRef="sid-613CA134-8467-4145-A6B3-3995AD7332A3"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_Multi-instanceCountersigning"><bpmndi:BPMNPlane bpmnElement="Multi-instanceCountersigning" id="BPMNPlane_Multi-instanceCountersigning"><bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1"><omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C" id="BPMNShape_sid-1F4BB62E-5C2B-46C3-AA67-7067FC1F752C"><omgdc:Bounds height="80.0" width="99.99999999999997" x="205.04945732883417" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-E1E11E67-991E-40E5-950A-86A4C94F1C36" id="BPMNShape_sid-E1E11E67-991E-40E5-950A-86A4C94F1C36"><omgdc:Bounds height="80.0" width="100.0" x="441.6449850159505" y="138.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-613CA134-8467-4145-A6B3-3995AD7332A3" id="BPMNShape_sid-613CA134-8467-4145-A6B3-3995AD7332A3"><omgdc:Bounds height="28.0" width="28.0" x="630.9214071656436" y="164.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sid-436F11E8-B070-4857-B5A6-A3CB94D4F138" id="BPMNEdge_sid-436F11E8-B070-4857-B5A6-A3CB94D4F138"><omgdi:waypoint x="129.94999906825288" y="178.0"></omgdi:waypoint><omgdi:waypoint x="205.04945732883417" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92" id="BPMNEdge_sid-7AD7B298-FAEC-40AA-B5E8-CFB919A72B92"><omgdi:waypoint x="541.5949850158808" y="178.0"></omgdi:waypoint><omgdi:waypoint x="630.9214071656436" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-8F6E3D87-82DA-487E-8C71-53E983BD255A" id="BPMNEdge_sid-8F6E3D87-82DA-487E-8C71-53E983BD255A"><omgdi:waypoint x="304.99945732876284" y="178.0"></omgdi:waypoint><omgdi:waypoint x="441.6449850159505" y="178.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

会签的场景是多人参与的场景,意味着这是一个多实例任务,什么是多实例任务?就是这个任务会产生多少实例,可以理解成Java类和对象的关系。这里实例指的是执行实例,你想要多少的执行实例,可以通过配置参数,来决定执行任务时会产生多少个一样任务的实例,然后给每个指定的人执行,再把结果汇总,最后会根据汇总的结果来根据条件判断是否通过。

<!--通过loopCardinality决定产生多少实例-->
<loopCardinality>5</loopCardinality>
<!--该属性表示将任务分配给谁,这里用的是EL表达式
,而且我们可能把5个任务分给5个不同的人,这里是不可预见的,是运行时确定-->
flowable:assignee="${assignee}"<!--false 表示并行 true 表示串行-->
<!--并行就是上面5个任务可以同时执行,并行就是5个任务一个个轮着轮着执行-->
isSequential="false" <!--这里是一个运行时的变量的名字
,举个例子我们运行时变量里面必须有个变量名字叫assigneeList-->
flowable:collection="assigneeList" <!--这里的assignee对应于上面的assigneeList, 如果 assigneeList是一个集合类型,
那么assignee就对应于集合中的一个单元,然后上面的EL表达式${assignee} 对应的就是这些单元。
类似于Mybatis中的foreach标签-->
flowable:elementVariable="assignee"
<multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee"><!--配置5个任务实例--><!--loopCardinality 代表该属性循环的基数是多少,这个任务就是多实例任务,这个属性就是设置有多少实例的地方!--><!--为什么叫循环基数?如果我们需要3个实例通过的,那可能3个实例就满足条件,到下一环节了--><loopCardinality>5</loopCardinality><!-- nr代表 number 这里指 完成的实例数量/全部实例数 >= 0.50 即可--><!-- 这里的变量nrOfCompletedInstances和nrOfInstances是系统自动生成的,要是你需要设置自己的变量吗,可以自己控制。--><!-- 当然也可以设置别的条件,通过EL表达式进行设置--><completionCondition>${nrOfCompletedInstances/nrOfInstances &gt;= 0.50}</completionCondition>
</multiInstanceLoopCharacteristics>

1.3、 BladeX多实例任务节点参数设置

对应bpmn文件,配置如下

2、部署测试

2.1、部署流程定义

部署成功,流程定义ID=Multi-instanceCountersigning:1:387494

2.2、测试流程定义是否部署成功

 @Test
public void testDeployQuery() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();ProcessDefinition processDefinition = processDefinitionQuery.deploymentId("387491").singleResult();System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId());System.out.println("processDefinition.getName() = " + processDefinition.getName());System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription());System.out.println("processDefinition.getId() = " + processDefinition.getId());}

控制台打印结果如下,说明部署成功。

2.3、启动流程实例

/*** 启动流程实例*/
@Test
public void testRunProcess() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();// 我们需要runtimeService来启动流程实例RuntimeService runtimeService = processEngine.getRuntimeService();// 构建流程变量Map<String, Object> varivales = new HashMap<>();ArrayList<String> assigneeList = new ArrayList<>();assigneeList.add("u1");assigneeList.add("u2");assigneeList.add("u3");assigneeList.add("u4");assigneeList.add("u5");varivales.put("assigneeList", assigneeList);// 启动流程实例ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("Multi-instanceCountersigning", varivales);System.out.println("Multi-instanceCountersigning.getProcessDefinitionId() = " + holidayRequest.getProcessDefinitionId());System.out.println("Multi-instanceCountersigning.getName() = " + holidayRequest.getName());System.out.println("Multi-instanceCountersigning.getActivityId() = " + holidayRequest.getActivityId());System.out.println("Multi-instanceCountersigning.getId() = " + holidayRequest.getId());
}

启动流程实例,控制台输入如下,流程实例Id:542501

进入到多实例任务节点之后,根据实例ID,我们看一下ACT_RU_TASK数据库表的数据变化。

我们可以看到上面自动生成了5个任务实例,assignee也是我们代码中传入的数据。
再看下工作流流程变量表 ACT_RU_VARIABLE

发现除了我们自己传入的assigneeList、assignee,还会自动生成一些属性。

2.4、完成任务

我们设置的多实例任务的判断条件是,完成人数大于50%到下一节点,也就是说,5人通过3人即可。

2.5、任务查询

/*** 测试任务查询*/
@Test
public void testQueryTask() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();List<Task> list = taskService.createTaskQuery()// 指定查询的流程key.processDefinitionKey("Multi-instanceCountersigning")// 查询这个任务的处理人.taskAssignee("u1").list();for (Task task : list) {System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());System.out.println("task.getAssignee() = " + task.getAssignee());System.out.println("task.getName() = " + task.getName());System.out.println("task.getDescription() = " + task.getDescription());}
}// 控制台打印结果如下
/**
task.getProcessDefinitionId() = Multi-instanceCountersigning:3:540004
task.getAssignee() = u1
task.getName() = 多实例任务UserTask
task.getDescription() = null
*/

接下来执行任务。

@Test
public void testCompleteTask() {ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery()// 指定查询的任务key = task.getName().processDefinitionKey("多实例任务UserTask").taskAssignee("u1").singleResult();// 创建流程变量Map<String, Object> map = new HashMap<>();map.put("approved", true);// 完成任务taskService.complete(task.getId(), map);
}

u1用户已经完成这个任务,我们再看下数据库。

u1数据消失了,再看下ACT_RU_VARIABLE数据库表,nrOfCompletedInstances属性=1了。

接着提交两个实例,任务结束,ACT_RU_TASK多实例任务节点数据全部清空。

2.6 流程跟踪

全网最全面工作流引擎Flowable完整教程之多实例会签相关推荐

  1. 史上最全的工作流引擎 Activiti 学习教程(值得收藏)

    点击关注公众号,实用技术文章及时了解 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则 ...

  2. drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」

    原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...

  3. 有关Drools业务规则引擎的完整教程

    与往常一样,我们在配套存储库EmailSchedulingRules中共享本教程中提供的代码. 业务规则很好地表现了某些领域的逻辑. 它们之所以有效,是因为它们可以直观直观地接近许多类型的领域专家的思 ...

  4. java 自定义表单 动态表单 表单设计器 工作流引擎 flowable

    自定义表单设计模块都有哪些? 1 定义模版:拖拽左侧表单元素到右侧区域,编辑表单元素,保存表单模版 2 表单模版:编辑维护表单模版,复制表单模版,修改模版类型,预览表单模版 3. 我的表单:选择表单模 ...

  5. Activiti7工作流引擎:进阶篇(十) 多实例

    一:多实例基本示例 @Test void testStartAndComplete() {Map<String, Object> variables = new HashMap<&g ...

  6. 分布式开源工作流引擎有什么特点?

    在竞争越来越激烈的社会中,拥有提质增效的办公软件,可以为企业带来更可观的市场价值.分布式开源工作流引擎在企业数字化发展进程中深受欢迎,在帮助企业提升办公效率上发挥了重要的作用.今天,我们就一起里盘点下 ...

  7. 可自管理的分布式工作流引擎的设计与实现

    <script type="text/javascript"></script> <script src="http://pagead2.g ...

  8. 工作流系列之可自管理的分布式工作流引擎的设计与实现

    这篇文章是偶在清华读研究生时发表在国家核心期刊CIMS("Design and implementation of self-managed distributed workflow eng ...

  9. Flowable工作流引擎

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

最新文章

  1. 《Linus Torvalds 自传》摘录
  2. gulp + webpack 构建多页面前端项目
  3. 数学2.Latex扫盲
  4. 基于matlab的退化图像复原(二)------逆滤波复原
  5. 如何分析802.11协议中的BA帧(block acknowledgement)
  6. Java EE 7 / JAX-RS 2.0 – REST上的CORS
  7. 配置java编译环境
  8. 辨异 —— 逻辑之辨、人文社科观念
  9. HGE引擎写的俄罗斯方块程序(附vc源码)[r]
  10. 【收集】个人认为比较实用的电脑工具软件(附带安装包下载)
  11. 怎么把mp3格式的音频文件转为文字?
  12. php编辑日历,【PHP】制作日历
  13. noi题目答案c语言,NOI2019基础知识题库
  14. xp系统启动时0x0000007B(0XF799A524,0XC0000034,0X00000000,0X00000000)错误
  15. Android性能优化系列:内存优化
  16. 笔记本显卡天梯图 2022
  17. 努比亚Z11系统服务器选择,又有新系统刷!努比亚Z11适配ZUI 2.5系统!
  18. 全智通A+常见问题汇总解答—A+采购入库保存一张入库单,页面显示两张入库单
  19. 江浙沪地区计算机考研高效排名,江浙沪地区,哪所大学的法硕容易考上?
  20. 数字1、2、3、4能组成多少个互不相同且无重复数字的三位数,并将其输出。

热门文章

  1. Slumdog Millionaire--《贫民窟的百万富翁》
  2. dlink打印服务器重置,DLink_DP310打印服务器用户手册.pdf
  3. 一本通1527欧拉回路
  4. html 5 触摸屏事件
  5. python xarray选中一年并删除其时间维度,返回所选年份数据
  6. 树莓派安装迅雷xware的失败经验
  7. 【助教工作】2021团队项目助教跟班全攻略
  8. 遇到《顺丰速运》app奔溃了,怎么回事呢?
  9. react 实现问卷调查(单选题目、多选题目)
  10. 【SpringBoot学习】5、SpringBoot 实现文件上传,图片上传并显示功能