Flowable的使用

  1. 什么是Flowable

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

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

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

  1. Flowable核心特性
  • 流程定义‌:
    • 使用BPMN 2.0(业务流程建模标准)标准定义业务流程,支持图形化建模。
  • 流程部署‌:
    • 将定义好的流程模型部署到Flowable中,生成流程定义。
  • 流程执行‌:
    • 启动流程实例,按照预定义的流程执行,包括任务分配、执行、监控等。
  • 流程监控‌:
    • 提供实时监控和管理流程实例的工具和API,支持历史数据查询。
  • 灵活扩展‌:
    • 支持多种流程引擎的选择和集成,可以根据项目需求进行定制化开发。

3.Flowable核心组件‌

流程引擎‌:负责流程实例的执行和管理。

  • 模型器‌:提供图形化的流程设计器,支持BPMN 2.0标准。
  • 任务应用‌:用于启动流程实例、编辑任务表单、完成任务等。
  • 管理应用‌:提供对流程实例、任务、作业等的查询和管理功能。
  • 身份管理应用‌:提供用户、用户组的管理功能,支持单点登录。

4.绘制流程模型

4.1流程建模符号

  • 开始节点

    • 表明从此处开始流程
  • 任务节点

    • 其中包含了很多种任务,其中最常用的就是用户任务。指定审批人都需要此选项。
  • 网关组件

    • 网关相当于判断(与,或,非),最常用的三种网关分别是互斥/排他网关,并行网关,相容网关。
      • 互斥网关:用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为 true 的顺序流(当没有设置条件时,认为顺序流为true)继续流程。使用排他网关时,只会选择一条顺序流。当多条顺序流的条件都计算为true时,会且仅会选择在XML中最先定义的顺序流继续流程。
      • 并行网关:并行网关不计算条件,如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件。并行网关可以将执行分支为多条路径,也可以合并多条入口路径的执行,并行网关的功能取决于其入口与出口顺序流。如果并行网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有入口顺序流,然后分裂为多条并行执行路径。
      • 包容网关:可看做排他网关与并行网关的组合。与排他网关一样,可以在包容网关的出口顺序流上定义条件,包容网关会计算条件。然而主要的区别是,包容网关与并行网关一样,可以同时选择多于一条出口顺序流。包容网关的汇聚行为比并行网关更复杂。
  • 结束节点

    • 表明从此处结束流程

4.2基础审核模型

申请人提交 -> 审批人 -> 结束

4.2加入条件判断

申请人提交 -> 审批人 -> 通过 -> 结束/申请人提交 -> 审批人 -> 驳回 -> 申请人

使用网关配合跳转条件控制流程流转,比如通过:${approve==true},驳回则为 ${approve==false},其中 approve 是自定义流程变量,名称可自定义,需要在流程用到该变量前写入流程引擎

4.3单人审批任务

4.4多人审批任务

多人 任务需配置多实例

  • 集合:有多少个元素就会创建多少个任务实例,这里代表的是所有审批人
  • 元素变量:集合中的每一个元素的命名
  • 完成条件:会签和或签的完成条件
    • 会签任务:${nrOfCompletedInstances==nrOfInstances}
    • 或签任务:${nrOfCompletedInstances>=1}

4.4监听器

  • 执行监听器:针对整个流程实例的事件监听器,它可以监听流程实例启动、结束、活动开始、活动结束、连线选择等事件。ExecutionListener 的事件类型和执行时机都是固定的,它不能直接访问任务相关的信息(例如任务的候选人、任务的执行者等),因此通常用于处理与流程实例相关的事件。

  • 任务监听器:针对任务的事件监听器,它可以监听任务的创建、分配、完成等事件。TaskListener 的事件类型和执行时机是与任务相关的,它可以访问任务相关的信息,并可以对任务进行操作(例如设置任务的执行人、指定任务的代理人等),因此通常用于处理与任务相关的事件。

  1. 如何开发

<!--flowable工作流依赖-->
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.4.0</version>
</dependency>

5.1Flowable数据库表结构

  • ACT_RE_*:存储库表,包含静态信息,如流程定义和流程资源。
  • ACT_RU_*:运行时表,存储运行时信息,如流程实例、用户任务、变量等。
  • ACT_HI_*:历史表,存储历史数据,如已完成的流程实例、变量、任务等。
  • ACT_GE_*:通用数据表,包含bpmn.xml、流程图等文件。
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_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:流程实例的变量历史

5.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.startProcessInstanceById(modelId,variables) 发起流程
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(); 获取审批组的具体信息

5.3具体使用

5.3.1常用接口
  • 部署模型
    • repositoryService.createDeployment().deploy();
  • 启动流程
    • runtimeService.startProcessInstanceById(modelId,variables) modelId流程模型ID;variables:流程变量
  • 完成任务
    • taskService.complete()
  • 任务签收
    • taskService.claim(taskId, userId); taskId:任务ID;userId:签收人ID
  • 任务转交
    • taskService.setAssignee(taskId,userId) taskId:任务ID;userId:被转交人ID
  • 结束流程
    • runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState(); executionIds:当前流程实例中所有活动执行ID;endId:终止节点ID

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        if (processInstance != null) {
            //1、获取终止节点
            List<EndEvent> endNodes =findEndFlowElement(processInstance.getProcessDefinitionId());
            String endId = endNodes.get(0).getId();
            //2、执行终止
            List<Execution> executions = runtimeService.createExecutionQuery().parentId(processInstanceId).list();
            List<String> executionIds = new ArrayList<>();
            executions.forEach(execution -> executionIds.add(execution.getId()));
            runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds, endId).changeState();
            log.info("终止processInstanceId:{}成功",processInstanceId);
        }else {
            throw new FebsException("不存在运行的流程实例processInstanceId:" + processInstanceId);
        }

5.3.2监听器
  • 执行监听器:在自定义监听器中继承ExecutionListener ,在 notify 方法中实现业务逻辑
  • 任务监听器:在自定义监听器中继承TaskListener ,在 notify 方法中实现业务逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘世中-迷途小书童

欢迎IT从业者的头脑风暴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值