flowable工作流所有业务概念

article/2025/10/7 7:01:09

在这里插入图片描述

1.什么是工作流审批

根据本人的理解,就是审批流程管理。

2.什么是flowable

1.官方解释

官方解释如下:

Flowable 项目提供了一套核心的开源业务流程引擎,这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管理 (BPM) 平台。

它的核心是一个闪电般快速、久经考验的动态 BPMN 流程引擎,伴随着 DMN 决策表和 CMMN 案例管理引擎,所有这些引擎都是用 Java 编写的。它们是 Apache 2.0 许可的开放源代码,拥有一个承诺社区。

所有引擎都可以嵌入在 Java 应用程序中运行,也可以作为服务器、集群和云中的服务运行。它们可以作为独立的引擎或服务运行,也可以集成在一起为业务流程管理提供丰富的套件。它们与 Spring 完美集成。凭借丰富的 Java 和 REST API,它们是编排人工或机器人自动化处理的理想基础。它们启用微服务编排或软连接微服务本身。

这里总结一下:

  1. 目的是管理业务审批工作流。
  2. 使用BPMN技术。
  3. 可方便嵌套在spring体系中。

2.显赫的家室

说起flowable还来自于activiti,因为activiti内部工作人员不合,一大堆小伙伴相约出去创业了。但是锅还是原来的锅,只不过做饭的方式不同了。所以在思想上,flowable与activiti相差不大。只不过功能更加强大了。

3.什么是BPMN

1.解释BPMN

官方解释如下:

标准的业务流程模型和符号 (BPMN) 将为企业提供以图形符号理解其内部业务程序的能力,并使组织能够以标准方式交流这些程序。此外,图形符号将有助于理解组织之间的绩效协作和业务交易。这将确保企业了解自身和业务参与者,并使组织能够快速适应新的内部和 B2B 业务环境。

这里总结一下:

  1. BPMN开发了一套标准的业务流程建模符号。如下图就是建模的符号。

在这里插入图片描述

  1. BPMN定义了一个流程图,该流程图使用上述符号编写。如下图就是通过BPMN规则绘画的图。
    在这里插入图片描述

说白了如上图规则的图就BPMN流程图。

2.BPMN常用符号

1.开始节点

表明从此处开始流程。

2.任务节点

其中包含了很多种任务,如图。其中最常用的就是用户任务。指定审批人都需要此选项。
在这里插入图片描述

3.网关组件

网关相当于判断(与,或,非),最常用的三种网关分别是互斥/排他网关,并行网关,相容网关。
在这里插入图片描述

  1. 互斥网关:相当于判断,举例说明,如果输入值大于20走A节点,小于20走B节点。
    在这里插入图片描述

  2. 并行网关:相容网关成对出现,表示网关中的人全部同意才能够进入下一节点。
    在这里插入图片描述
    3 .相容网关:互斥网关与并行网关的结合体,如果满足A,B都互斥条件,则都需要流转,如果只有一个满足,那么只流转满足条件的。
    在这里插入图片描述

3.来个例子

在这里插入图片描述

说明如下:

  1. 当审批申请人提交完成后进入审批阶段
  2. 两位项目经理进行审批,需要两人都同意后进入下一节点。
  3. 经理进行审批,此处业务为经理职位(manage)的人都可以执行审批。(此处有认领业务此处不描述)
  4. 此处总经理/董事长审批,如果大于20天需要董事长审批,如果小于20天总经理审批。

4.为什么选择flowable

在技术选择上,flowable较activiti更加新,功能更加完善。以用新不用旧的原则,建议使用flowable。但是相比于activiti来说,他的网上文档非常少。入门也更加困难。

当然可以自己开发审批流系统,设计提交人与审批人字段,通过sql查询可以完成。这种是最费时费力的方法,同时在功能上与开源架构完全没有可比性。而且开源的flowable/activiti已经形成了自己的体系,当与客户侃大山时,更加凸显系统的专业

5.通用的业务流程

标准的审批流系统都有一套标准化的业务流程下文,介绍如何操作审批流系统。

1.整体流程

业务流程主要分以下步骤:
在这里插入图片描述
一般在系统中的模块名如下,请各自对应。
在这里插入图片描述

这里的任务管理可以查看到一个流程每个审批节点的具体信息。非必要业务。

1.编辑流程

这部分主要是制作流程。

1.自定义表单

在申请人进行审批时,需要填写申请的项目和申请数据。如请假审批需要填写请假时间和请假原因。所以这个表单我们希望可以定制。
在这里插入图片描述

2.编辑流程模型

也就是使用BPMN绘制流程图,在图中会指定该审批流程的表单,下一审批节点人员与进入流程的流转条件。

当然也可以导入流程图。同时可以指定申请人在申请时需要填写的表单。(审批人如果需要添加审批表单也可以在此处配置)
在这里插入图片描述

3.部署成流程定义

流程模型在编辑/导入后,并不会生效。之后发布生成流程定义后才能够使用并发起审批。当然流程定义模块还有导出激活等功能。
在这里插入图片描述

2.执行审批

1.功能列表

当设计完流程之后,就可以发起审批和进行审批了,用户拥有以下功能。
在这里插入图片描述

2.功能解释

驳回:将审批重置发送给某节点,重新审批。

转办:A转给其B审批,B审批后,进入下一节点。

委派:A转给其B审批,B审批后,转给A,A审批后进入下一节点。

3.查询流程实例与任务

根据上图可见,当发起审批后,就会生成流程实例了。流程实例和任务管理就可以查看到已经发起的审批了。

  1. 每一套审批信息生成一条流程实例信息。
  2. 一条流程实例有多个审批节点(流程图中已画),每一个审批节点是一条任务管理信息。

请注意流程定义和流程实例概念。

6.如何开发

flowable其实很简单,但是因为市面上的资料比较少,说明白的更加的少,所以该技术栈流通的比较困难。

flowable为我们提供了47张表和7个常用api。

1.提供的表

Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。

  1. ACT_RE_*: 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。
  2. ACT_RU_*: 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
  3. ACT_HI_*: 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
  4. ACT_GE_*: 通用数据。在多处使用。
  5. ACT_ID_*: 表示组织信息,如用户,用户组,等等。(很少使用)
  6. FLW_*.未找到官方描述,且表中都为空。

1.ACT_GE_*

ACT_GE_BYTEARRAY:保存流程的bpmn的xml以及流程的Image缩略图等信息
ACT_GE_PROPERTY:Flowable相关的基本信息。比如各个module使用的版本信息。

2.ACT_RE_*

ACT_RE_DEPLOYMENT: 部署对象,存储流程名称
ACT_RE_MODEL:基于流程的模型信息
ACT_RE_PROCDEF:流程定义表

3.ACT_RU_*

ACT_RU_ACTINST:运行中实例的活动表
ACT_RU_DEADLETTER_JOB:当JOB执行很多次都无法执行,就会被记录在此表
ACT_RU_ENTITYLINK:还没使用到。后续更新此表。
ACT_RU_EVENT_SUBSCR:运行时的事件
ACT_RU_EXECUTION:运行的实例表
ACT_RU_HISTORY_JOB; 运行中的定时任务历史表
ACT_RU_IDENTITYLINK: 当前任务执行人的信息
ACT_RU_JOB:运行中的异步任务
ACT_RU_SUSPENDED_JOB:暂停的任务表。如果一个异步任务在运行中,被暂停。就会记录在词表
ACT_RU_TASK:运行中的正常节点任务
ACT_RU_TIMER_JOB:定时作业表
ACT_RU_VARIABLE:运行中的流程实例变量

4.ACT_ID_*

ACT_ID_BYTEARRAY:
ACT_ID_GROUP:用户组信息
ACT_ID_INFO:用户详情
ACT_ID_MEMBERSHIP:用户组和用户的关系
ACT_ID_PRIV:权限
ACT_ID_PRIV_MAPPING:用户组和权限之间的关系
ACT_ID_PROPERTY:用户或者用户组属性拓展表
ACT_ID_TOKEN:登录相关日志
ACT_ID_USER:用户

5.ACT_HI_*

ACT_HI_ACTINST: 流程实例历史
ACT_HI_ATTACHMENT:实例的历史附件,几乎不会使用,会加大数据库很大的一个loading
ACT_HI_COMMENT:实例的历史备注
ACT_HI_DETAIL:实例流程详细信息
ACT_HI_IDENTITYLINK: 实例节点中,如果指定了目标人,产生的历史
ACT_HI_PROCINST:流程实例历史
ACT_HI_TASKINST:流程实例的任务历史
ACT_HI_VARINST:流程实例的变量历史

6.FLW_*

FLW_CHANNEL_DEFINITION: 泳池管道定义表
FLW_EVENT_DEFINITION:事件定义
FLW_EVENT_DEPLOYMENT:事件必输
FLW_EVENT_RESOURCE:事件所需资源
FLW_EV_DATABASECHANGELOG:Liquibase执行的记录
FLW_EV_DATABASECHANGELOGLOCK:Liquibase执行锁
FLW_RU_BATCH:暂时未知
FLW_RU_BATCH_PART:暂时未知

2.提供的接口api

flowable提供了7个常见的api,这些api就对应着上文的所有逻辑,所以只要掌握这些api就可以完成审批业务的开发了。

1.FormService

表单数据的管理。

formService.getStartFormKey()  获取表单key
formService.getRenderedStartForm()查询表单json(无数据)

2.RepositoryService

提供了在编辑和发布审批流程的api。主要是模型管理和流程定义的业务api。

1.提供了带条件的查询模型流程定义的api
repositoryService.createXXXQuery()
例如:
repositoryService.createModelQuery().list() 模型查询 
repositoryService.createProcessDefinitionQuery().list() 流程定义查询repositoryService.createXXXXQuery().XXXKey(XXX) (查询该key是否存在)2.提供一大波模型与流程定义的通用方法
模型相关
repositoryService.getModel()  (获取模型)
repositoryService.saveModel()  (保存模型)
repositoryService.deleteModel() (删除模型)
repositoryService.createDeployment().deploy(); (部署模型)
repositoryService.getModelEditorSource()  (获得模型JSON数据的UTF8字符串)
repositoryService.getModelEditorSourceExtra()  (获取PNG格式图像)3.流程定义相关
repositoryService.getProcessDefinition(ProcessDefinitionId);  获取流程定义具体信息
repositoryService.activateProcessDefinitionById() 激活流程定义
repositoryService.suspendProcessDefinitionById()  挂起流程定义
repositoryService.deleteDeployment()  删除流程定义
repositoryService.getProcessDiagram()获取流程定义图片流
repositoryService.getResourceAsStream()获取流程定义xml流
repositoryService.getBpmnModel(pde.getId()) 获取bpmn对象(当前进行到的那个节点的流程图使用)4.流程定义授权相关
repositoryService.getIdentityLinksForProcessDefinition() 流程定义授权列表
repositoryService.addCandidateStarterGroup()新增组流程授权
repositoryService.addCandidateStarterUser()新增用户流程授权
repositoryService.deleteCandidateStarterGroup() 删除组流程授权
repositoryService.deleteCandidateStarterUser()  删除用户流程授权

3.RuntimeService

处理正在运行的流程。

runtimeService.createProcessInstanceBuilder().start() 发起流程
runtimeService.deleteProcessInstance() 删除正在运行的流程
runtimeService.suspendProcessInstanceById() 挂起流程定义
runtimeService.activateProcessInstanceById() 激活流程实例
runtimeService.getVariables(processInstanceId); 获取表单中填写的值
runtimeService.getActiveActivityIds(processInstanceId)获取以进行的流程图节点 (当前进行到的那个节点的流程图使用)runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); 终止流程

4.HistoryService

在用户发起审批后,会生成流程实例。historyService为处理流程实例的api,但是其中包括了已经完成的和未完成的流程实例。

historyService.createHistoricProcessInstanceQuery().list() 查询流程实例列表(历史流程,包括未完成的)
historyService.createHistoricProcessInstanceQuery().list().foreach().getValue() 可以获取历史中表单的信息
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); 根绝id查询流程实例
historyService.deleteHistoricProcessInstance() 删除历史流程
historyService.deleteHistoricTaskInstance(taskid); 删除任务实例
historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list()  流程实例节点列表 (当前进行到的那个节点的流程图使用)

如果处理正在运行的流程实例,请使用runtimeService。

5.TaskService

对流程实例的各个节点的审批处理。

流转的节点审批
taskService.createTaskQuery().list() 待办任务列表
taskService.createTaskQuery().taskId(taskId).singleResult();  待办任务详情
taskService.saveTask(task); 修改任务
taskService.setAssignee() 设置审批人
taskService.addComment() 设置审批备注
taskService.complete() 完成当前审批
taskService.getProcessInstanceComments(processInstanceId); 查看任务详情(也就是都经过哪些人的审批,意见是什么)
taskService.delegateTask(taskId, delegater); 委派任务
taskService.claim(taskId, userId);认领任务
taskService.unclaim(taskId); 取消认领
taskService.complete(taskId, completeVariables); 完成任务任务授权
taskService.addGroupIdentityLink()新增组任务授权
taskService.addUserIdentityLink() 新增人员任务授权
taskService.deleteGroupIdentityLink() 删除组任务授权
taskService.deleteUserIdentityLink() 删除人员任务授权

6.ManagementService

主要是执行自定义命令。

managementService.executeCommand(new classA())  执行classA的内部方法 

在自定义的方法中可以使用以下方法获取repositoryService。

ProcessEngineConfiguration processEngineConfiguration =CommandContextUtil.getProcessEngineConfiguration(commandContext);
RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();

也可以获取流程定义方法集合 。

ProcessEngineConfigurationImpl processEngineConfiguration =CommandContextUtil.getProcessEngineConfiguration(commandContext);ProcessDefinitionEntityManager processDefinitionEntityManager =processEngineConfiguration.getProcessDefinitionEntityManager();
如findById/findLatestProcessDefinitionByKey/findLatestProcessDefinitionByKeyAndTenantId等。

7.IdentityService

用于身份信息获取和保存,这里主要是获取身份信息。

identityService.createUserQuery().userId(userId).singleResult();  获取审批用户的具体信息
identityService.createGroupQuery().groupId(groupId).singleResult(); 获取审批组的具体信息

http://chatgpt.dhexx.cn/article/0s2dyLhy.shtml

相关文章

微服务与工作流

本文主要想谈一谈工作流在微服务系统中的使用以及工作流能够为微服务系统带来的好处。 通过查找资料可得,微服务的编排主要分为两种形式,一种是“choreography”,有人将其翻译成微服务的编排;另一种是“orchestration”,有人将其翻…

Camunda工作流引擎入门

文档集合 1、camunda文档:https://docs.camunda.org/get-started/quick-start/ 2、camunda资源下载:https://camunda.com/download/ 3、camunda示例github仓库:https://github.com/camunda/camunda-bpm-examples 4、camunda 代码仓库&…

工作流设计详解

工作流 概念: workflow流程性通知和审批控制,业务流程中、发送、提供附加信息或进行附加业务处理,两个或两个以上的人为共同目标,连续以并行或串行的方式完成某一业务。 工作流 设计: 按照业务规划流程图&#xff0…

什么是工作流?为什么程序员要用它?

每一个程序员,在接触到工作流的时候,都会有这么一个疑问——我用一般的方法可以实现,为什么还要用工作流? 我曾经也问过这个问题,不过现在稍微有点明白了。别着急要答案,看过下面的例子,或许你…

什么是工作流

什么是工作流? 工作流是从英文单词work flow中直译过来的。最直白的意思就是日常工作中相对固定的流程计算机化。 在此列举两个工作流简例: 客户到银行开户的工作流: 客户索取开户资料单——资料填写——营业员核对个人证件——营业员核对帐款…

什么是工作流?如何利用工作流引擎实现业务流程

工作流引擎是用来实现工作流的一种组件化工具,它是一整套解决方案,比如说一般工作流引擎包含这些功能:流程节点管理、流向管理等,是为了减小开发成本而推出的。因为在软件开发过程中,如果是从零开始实现工作流&#xf…

什么是工作流,flowable 与 Activiti对比

工作流 什么是工作流工作流是复杂版本的状态机Java工作流开源框架工作流对比Activiti设计器 Flowable兼容性 Camunda设计器兼容性:小结: 社区活跃度FlowableActivitiCamunda 总结 什么是工作流 工作流,是指“业务​过程的部分或整体在​计算…

工作流是什么

刚入职一家公司不久,昨天去和经理与客户对接需求的之前,经理问我接触过工作流没有之前。作为一个20年毕业的老人了,只能尴尬的说一句没有我下去会去了解下。这里我就暂且找一下别人总结的文章和大家一起学习下。 一、什么是工作流 工作流&a…

什么是工作流?

这里说的工作流是狭义的管理工作流程。 现代企业的日常活动中,70%以上都是有两个或两个以上的员工共同参与协作的的任务,比如生产流程、业务流程、各类行政申请流程、财务审批流程、人事处理流程、质量控制及客服流程等。一项工作,经过一个步…

union用法和enum用法

1 union用法 C语言中的union在语法上与struct相似。 union只分配最大成员的空间&#xff0c;所有成员共享这个空间 2 union的注意事项 union的使用受系统大小端的影响 编程&#xff1a;判断系统的大小端 #include <stdio.h>// 1&#xff1a;小端&#xff0c;0&…

C语言 C++中的union用法总结(包懂)

开始的话 已经好长时间没有更新了&#xff0c;对不起自己&#xff0c;更对不起我亲爱的读者&#xff0c;同时也对不起自己开办的这个博客平台。忙&#xff0c;太忙了&#xff0c;忙于找工作&#xff0c;找一份好工作&#xff0c;纠结于去大城市闯呢&#xff0c;还是回到本省的首…

php union用法,SQL Union用法是什么?

sql union用法是什么&#xff1f; sql union用法的总结&#xff1a; UNION 运算符将多个 SELECT 语句的结果组合成一个结果集。 (&#xff11;)使用 UNION 须满足以下条件&#xff1a; &#xff21;&#xff1a;所有查询中必须具有相同的结构(即查询中的的列数和列的顺序必须相…

mysql union语法,mysql中的union用法

UNION在mysql中被称为集合操作,操作类型分为两种:UNION DISTINCT 和 UNION ALL;注意:UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。 集合操作时,两边的输入必须拥有相同的列数,如果数据类型不…

mysql得union使用方法_mysql中Union All使用方法

在mysql数据库使用UNION 时&#xff0c;会把结果集中重复的记录删掉&#xff0c;也正因为做了去重操作&#xff0c;所以效率相对Union All来讲稍微低一点&#xff0c;使用UNION ALL &#xff0c;MySQL 会把所有的记录返回&#xff0c;效率高于UNION。本文向大家介绍UNION ALL的…

SQL 中union的使用

采用where的解法 select name,population,area from World where area>3000000 or population>25000000 ;使用union的解法 select name,population,area from World where area>3000000 union select name,population,area from World where population>2500000…

C语言共用体(C语言union用法)详解

转载重点&#xff1a;共用体的所有成员占用同一段内存&#xff0c;修改一个成员会影响其余所有成员。图形分析影响过程 通过前面的讲解&#xff0c;我们知道结构体&#xff08;Struct&#xff09;是一种构造类型或复杂类型&#xff0c;它可以包含多个类型不同的成员。在C语言中…

C语言 union用法

我们知道结构体&#xff08;Struct&#xff09;是一种构造类型或复杂类型&#xff0c;它可以包含多个类型不同的成员。在C语言中&#xff0c;还有另外一种和结构体非常类似的语法&#xff0c;叫做共用体&#xff08;Union&#xff09;&#xff0c;它的定义格式为&#xff1a; …

c语言union(c语言union用法)

C语言-程序运行结果是&#xff1f;main(){unionstu{lon 我的机器&#xff0b;vc6运行的结果是12 我的理解是首先取最长的b的长度&#xff0c;但是b的长度比我的机器字长(32位即4个字节)整数倍要短&#xff0c;则sizeof(stu)的长度是12 不知道你的机器是不是64位的 如果是则证…

quartz mysql 配置_quartz的数据库配置

Quartz.net官方开发指南 第九课&#xff1a; JobStore JobStore负责保持对所有scheduler “工作数据”追踪&#xff0c;这些工作数据包括&#xff1a;job(任务),trigger(触发器),calendar(日历)等。为你的Quartz scheduler选择合适的JobStore是非常重要的一步&#xff0c;幸运的…

java 灵活配置quartz

项目背景&#xff1a; 最近项目上遇到个需求&#xff0c;需要我们在特定的事件做邮件和短信的发送。但时间并不固定&#xff0c;是根据用户配置的时间表来进行的定时发送任务。有点像闹钟&#xff0c;你设置的时间到了就响。这里我们采取的是每天凌晨定时取数据库里的时间表信…