workflow-engine/README.md

430 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# workflow-engine
## 1. Flowable 官网文档
- [商业版](https://www.flowable.com/)
- [开源版](https://www.flowable.com/open-source)
> jBPM -> Activiti -> camunda -> Flowable 6.7.2
## 2. Flowable 概述
> Flowable的数据库名称以ACT_开头。第二部分是表用例的两个字符的标识。
**Activiti 标准延续:**
```text
- ACT_FO_*“FO“代表表单引擎相关库。包含表单定义部署实例等。
- ACT_RE_*“RE”代表存储库。具有此前缀的表包含“静态”信息例如流程定义和流程资源。
- ACT_RU_*“RU”代表运行时。这些是运行时表其中包含流程实例用户任务变量作业等的运行时数据。Flowable仅在流程实例执行期间存储运行时数据并在流程实例结束时删除记录。这样可以使运行时表较小而又快速。
- ACT_HI_*“HI”代表历史。这些表包含流程中的所有历史数据例如过去的流程实例变量任务等。
- ACT_GE_*“GE“代表自动生成的数据包括bpmn.xml、flowable自带流程图等文件用于各种用例。
```
[库表字段定义大致含义参考](https://blog.csdn.net/qq_31237581/article/details/130132221)
**Flowable 的扩展:**
```text
- flw_*Flowable 新版本扩展功能相关的表,流程迁移的表。
```
### 2.1 术语表
| 术语名称 | 描述 |
|----------|---------------------------------------------------------------------------------|
| 流程引擎 | 是一种按照某种特性配置或程序进行执行的工具, 在此特征 Flowable 业务框架。 |
| 流程模型 | 模型类似一种盒子,用来装东西,在 Flowable 中,模型用来装“流程定义”, 且只能装一个流程定义。 |
| 流程定义 | 流程定义是一种告诉流程引擎该如何运行、流转的元配置数据。通常它会产生 BPMN 协议文件和 png 的可视化流程图片文件。一个模型下的流程定义可以有多个版本。 |
| 活动(审批节点) | 特指流程定义中需要被外部介入的节点,例如"用户任务"节点。 |
| 网关 | 流程定义中的某种节点类型, 在流程实例中,主要是用于条件分支,协助引擎确定下一步的执行路径。 |
| 多实例任务 | 针对"任务"节点的特色树形,代表该任务分配多个人后可以会签/或签, 而如果未设置多实例树形,那么就是是多个候选人审批,也仅会只有一个人 |
| 租户 | 在本工程中,租户数据等于工作台 ID,主要用于较强判断相关数据的归属。 |
| 流程实例 | 按照流程定义创建的一个具体的实例,在业务场景实际使用过程中,通常都需要关注流程实例相关信息,如实例 ID。 |
| 流程任务 | 流程定义中标记的“审批节点"的实例,在业务场景实例使用过程中,某个人能审批一个或多个任务时,这个“任务”就是流程任务。 |
### 2.2 本工程常用的库表
```text
// 运行时(仅保存运行中的流程相关数据)
act_ru_execution (执行中的实体)
act_ru_task (执行中的任务)
act_ru_variable (执行中的变量)
// 元数据配置信息
act_re_model (流程模型)
act_re_procdef (流程定义)
act_re_deployment (流程部署)
// 历史数据 (运行时产生的数据也会及时写入历史)
act_hi_procinst (历史的流程实例)
act_hi_taskinst (历史的任务实例)
act_hi_varinst (历史的变量实例)
act_ge_bytearray (很多元数据)
```
## 3.国内工作流常用操作的名称解释
| 流程操作 | 描述 |
|-------|-------------------------------------------------------------------------------------------------------------|
| 认领 | 当前节点候选人或归属于候选组的人,对当前节点进行认领 |
| 取消认领 | 当前节点处理人,取消自己处理任务的权限,使任务进入待认领状态 |
| 审批 | 当前节点处理人,对当前流程任务(关联了一活动)进行审核操作,完成后进入下一节点 |
| 驳回/回退 | 当前节点处理人,将流程驳回至之前已经处理过的任务节点,要求重新处理 |
| 委派/委托 | 当前节点处理人,将自己的主办或者经办权限转移委托至别的用户代为处理,处理完后回到当前处理人手中,并由当前处理人处理完后进入下一节点 |
| 转办 | 当前节点处理人,将操作权限转给别人处理,处理完后进入下一节点(自己不再处理) |
| 催办 | 对于时效要求高的流程,发起人可催办提醒当前节点处理人,一般以消息通知方式提醒处理人 |
| 撤销 | 发起人操作,可以撤销当前流程 |
| 取回 | 当前节点上一节点处理人操作,当前节点处理人还未处理,上一节点处理人可以将其退回自己手中重新操作(取回重办) |
| 终止 | 当前节点处理人,终止当前流程 |
| 抄送 | 当前节点处理人,处理完成之后将处理结果抄送给其他人,这里创建备注信息,并给所有抄送人创建子任务(待阅),子任务不影响流程流转 |
| 向前加签 | 当前节点处理人,需要让其他人核对流程,其他人核对完成后,回到当前节点处理人手中,当前节点处理人处理完后进入下一节点 |
| 向后加签 | 当前节点处理人,需要让其他人核对流程,其他人核对完成后,直接进入下一节点 |
| 会签 | 一般的会签就是指在流程管理中发起人可以同时对多个人发起会签,多个人可以同时处理,只有所有负责人审批通过,审批节点才会通过。(支持一票否决/一票通过/投票按照百 分比给出结论通过或不通过) |
| 交接 | 流程管理员权限,管理员将离职或换岗员工的待执行、待领取、代办他人、委托他人代办的任务转交给接管人,并删除与该员工相关的委托代理关系。交接员工所有直接参与的流 程实例中对应的参与者将自动由系统修改为接管人。(强制) |
| 暂存 | 复杂表单,一次性填写不完,需要保存草稿功能,开始节点的暂存 |
## 4. 如何配置一个流程?
> 流程的运行依赖一种规则,得让引擎知道何时开始执行流程? 何时终止? 如何识别和控制每个步骤该怎么处理? 执行过程中如何走向不同的路径?
> 比如: 我们常见的需求, 某个节点需要会签/或签, 或者某个节点需要判断条件是否执行该步骤等等.
>
> 以上这些规则都需要再创建流程实例时, 提前就告诉引擎, 且运行过程和步骤中是不可变的. 引擎自己也未提供相应能力.
>
> 这种规则在 Flowable 的世界中,是以 BPMN2.0 协议规则进行编写和持久化.
## 4.1 简单识别流程定义
![流程定义 png](imgs/img.png)
```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="a1" name="1" isExecutable="true">
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<exclusiveGateway id="sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2" default="sid-6949581E-4B60-4263-9966-EF0C7D4D7D4F"></exclusiveGateway>
<userTask id="sid-6D86C326-54D1-4155-B564-9267C2E097BF" name="事业部审核" flowable:formFieldValidation="true"></userTask>
<sequenceFlow id="sid-5BFB5B2B-C9A8-42D2-9AB5-AD886D1E5235" sourceRef="sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2" targetRef="sid-6D86C326-54D1-4155-B564-9267C2E097BF"></sequenceFlow>
<userTask id="sid-08E30960-3B2C-40D4-8B8D-34BBC7213F2F" name="财务审核" flowable:formFieldValidation="true"></userTask>
<endEvent id="sid-DB91A9BE-D1AE-4410-B502-86331F330066"></endEvent>
<exclusiveGateway id="sid-86533789-DD27-4186-BB4F-4F9526CD930C"></exclusiveGateway>
<sequenceFlow id="sid-531523D8-9C8A-4F07-8786-D9389A9E693B" sourceRef="sid-6D86C326-54D1-4155-B564-9267C2E097BF" targetRef="sid-86533789-DD27-4186-BB4F-4F9526CD930C"></sequenceFlow>
<sequenceFlow id="sid-3D02CE81-4BBE-4611-AE68-6CF23DB0BB22" sourceRef="sid-86533789-DD27-4186-BB4F-4F9526CD930C" targetRef="sid-DB91A9BE-D1AE-4410-B502-86331F330066"></sequenceFlow>
<userTask id="sid-9134DB2B-33BF-423A-B916-1065A12A7D34" name="部门主管审核" flowable:formFieldValidation="true"></userTask>
<sequenceFlow id="sid-C62405A5-DC20-4273-A550-D5477143908E" sourceRef="startEvent1" targetRef="sid-9134DB2B-33BF-423A-B916-1065A12A7D34"></sequenceFlow>
<sequenceFlow id="sid-7C7099A5-12BA-4E87-BE02-3A70788A2DE9" sourceRef="sid-9134DB2B-33BF-423A-B916-1065A12A7D34" targetRef="sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2"></sequenceFlow>
<userTask id="sid-613723D4-E36F-4902-AE52-37F3CF6E75C9" name="董事会审核" flowable:formFieldValidation="true"></userTask>
<sequenceFlow id="sid-454E0650-77EE-4E00-AE5C-0A6CDFF8A975" sourceRef="sid-08E30960-3B2C-40D4-8B8D-34BBC7213F2F" targetRef="sid-613723D4-E36F-4902-AE52-37F3CF6E75C9"></sequenceFlow>
<sequenceFlow id="sid-3E71B6E4-5A4B-4066-B653-029CBD856D9D" sourceRef="sid-613723D4-E36F-4902-AE52-37F3CF6E75C9" targetRef="sid-86533789-DD27-4186-BB4F-4F9526CD930C"></sequenceFlow>
<sequenceFlow id="sid-6949581E-4B60-4263-9966-EF0C7D4D7D4F" sourceRef="sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2" targetRef="sid-08E30960-3B2C-40D4-8B8D-34BBC7213F2F"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_a1">
<bpmndi:BPMNPlane bpmnElement="a1" id="BPMNPlane_a1">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="120.0" y="193.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2" id="BPMNShape_sid-516CA2A3-F5BA-4AFF-8314-F87F2B9E2CF2">
<omgdc:Bounds height="40.0" width="40.0" x="370.0" y="188.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-6D86C326-54D1-4155-B564-9267C2E097BF" id="BPMNShape_sid-6D86C326-54D1-4155-B564-9267C2E097BF">
<omgdc:Bounds height="80.0" width="100.0" x="450.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-08E30960-3B2C-40D4-8B8D-34BBC7213F2F" id="BPMNShape_sid-08E30960-3B2C-40D4-8B8D-34BBC7213F2F">
<omgdc:Bounds height="80.0" width="100.0" x="450.0" y="285.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-DB91A9BE-D1AE-4410-B502-86331F330066" id="BPMNShape_sid-DB91A9BE-D1AE-4410-B502-86331F330066">
<omgdc:Bounds height="28.0" width="28.0" x="810.5" y="204.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-86533789-DD27-4186-BB4F-4F9526CD930C" id="BPMNShape_sid-86533789-DD27-4186-BB4F-4F9526CD930C">
<omgdc:Bounds height="40.0" width="40.0" x="720.0" y="198.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-9134DB2B-33BF-423A-B916-1065A12A7D34" id="BPMNShape_sid-9134DB2B-33BF-423A-B916-1065A12A7D34">
<omgdc:Bounds height="80.0" width="100.0" x="210.0" y="168.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-613723D4-E36F-4902-AE52-37F3CF6E75C9" id="BPMNShape_sid-613723D4-E36F-4902-AE52-37F3CF6E75C9">
<omgdc:Bounds height="80.0" width="100.0" x="595.0" y="285.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-454E0650-77EE-4E00-AE5C-0A6CDFF8A975" id="BPMNEdge_sid-454E0650-77EE-4E00-AE5C-0A6CDFF8A975" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="549.95" y="325.0"></omgdi:waypoint>
<omgdi:waypoint x="594.9999999999807" y="325.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-3D02CE81-4BBE-4611-AE68-6CF23DB0BB22" id="BPMNEdge_sid-3D02CE81-4BBE-4611-AE68-6CF23DB0BB22" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="759.5520035885168" y="218.38622754491018"></omgdi:waypoint>
<omgdi:waypoint x="810.5002402842656" y="218.08303445075305"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-6949581E-4B60-4263-9966-EF0C7D4D7D4F" id="BPMNEdge_sid-6949581E-4B60-4263-9966-EF0C7D4D7D4F" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="390.5" y="227.44187392795882"></omgdi:waypoint>
<omgdi:waypoint x="390.5" y="325.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="325.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-531523D8-9C8A-4F07-8786-D9389A9E693B" id="BPMNEdge_sid-531523D8-9C8A-4F07-8786-D9389A9E693B" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="549.95" y="100.0"></omgdi:waypoint>
<omgdi:waypoint x="740.0" y="100.0"></omgdi:waypoint>
<omgdi:waypoint x="740.0" y="198.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-7C7099A5-12BA-4E87-BE02-3A70788A2DE9" id="BPMNEdge_sid-7C7099A5-12BA-4E87-BE02-3A70788A2DE9" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="309.9499999999041" y="208.0"></omgdi:waypoint>
<omgdi:waypoint x="370.0" y="208.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement"sid-C62405A5-DC20-4273-A550-D5477143908E" id="BPMNEdge_sid-C62405A5-DC20-4273-A550-D5477143908E" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="149.94999883049306" y="208.0"></omgdi:waypoint>
<omgdi:waypoint x="209.99999999995785" y="208.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-5BFB5B2B-C9A8-42D2-9AB5-AD886D1E5235" id="BPMNEdge_sid-5BFB5B2B-C9A8-42D2-9AB5-AD886D1E5235" flowable:sourceDockerX="20.5" flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="390.5" y="188.5"></omgdi:waypoint>
<omgdi:waypoint x="390.5" y="100.0"></omgdi:waypoint>
<omgdi:waypoint x="450.0" y="100.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-3E71B6E4-5A4B-4066-B653-029CBD856D9D" id="BPMNEdge_sid-3E71B6E4-5A4B-4066-B653-029CBD856D9D" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="20.0" flowable:targetDockerY="20.0">
<omgdi:waypoint x="694.9499999999887" y="325.0"></omgdi:waypoint>
<omgdi:waypoint x="740.0" y="325.0"></omgdi:waypoint>
<omgdi:waypoint x="740.0" y="237.90928437792334"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
```
点击查看完整的[BPMN 协议规范](BPMN_Spec_2.0.2.pdf)文件
> 通过上面的 BPMN 协议的具体内容, 我们可以发现协议内容主要分为两大块, 一块是以`<process>`包裹, 它是主要的规则描述,
> 另一块是以`<bpmndi:BPMNDiagram>`包裹, 它是规则可视化的元数据, 这部分一般我们无需关心, 但只要我们的业务涉及到流程配置的反显,
> 它又必不可少.
### 4.2 Process 节点内容简易描述
> 通过上面的协议内容, 可以发现有以下节点, 我们对出现过的节点简单描述
- process 代表是一个可以被引擎处理的流程
- startEvent 开始事件节点(**这里的需要注意命名, Event 代表是事件, 也就是说一个流程实例的开始, 是基于事件的,截止 23 年, 在
Flowable 中开始事件分为 9 种, 我们只用了空启动事件**)
> - 空启动事件
> - 定时器事件
> - 信号启动事件
> - 消息启动事件
> - 异常启动事件
> - 注册开始事件
> - 开始变量监听事件
> - 升级开始事件
> - 条件启动事件
- exclusiveGateway 排它网关(**控制流程如何流转, 是最常用的一个基础组件,只要涉及到条件流转,都需要用它,在 Flowable 中,网关也有
4 种, 我们只用了排它网关和并行网关**)
> - 排它网关
> - 并行网关
> - 事件网关
> - 包容网关
- userTask 用户任务(**需要人为介入的节点,一般情况下只要人类不对该节点做动作,那么流程就永远卡在这里,不再执行**)
- sequenceFlow 顺序流(**用于连接两个节点间的连线,很重要的组件,如果连线不正确,或者中断,会直接影响引擎的执行**)
- endEvent 结束事件节点
### 4.3 流程模型与流程定义
> 以上仅仅是冰山一角, 大致了解了最初级的协议内容后, 同时我们也称上面的协议内容为**流程定义**, 流程定义是一种较为底层的元数据.
>
> 因为我们一般针对某个流程规则, 会时不时的修改和调整, 修改后如何保证使用方无感知, 但对于工作流来说又是可追溯的,
> 所以需要再抽象一层来保存同一个流程的所有修改过程, 我们称这个抽象层为**流程模型**.
> 也就是说, 一个流程模型是一个流程, 这个流程的的多次修改(多版本)都在这个模型下. 而使用方也就只用关心流程模型的唯一标识即可.
>
> 我们编辑好流程模型与流程定义后, 还需要对流程模型(定义)发布, 才能真正的被使用. 发布后, 这一次的流程定义将定型,不再允许改变当前版本的内容.
> 如需修改规则, 则会产生新的版本.
流程模型: 对应库表: act_re_model
流程定义: 对应库表: act_re_procdef
流程发布: 对应库表: act_re_deployment/act_ge_bytearray
以上仅仅是冰山一角, 大致了解了最初级的协议内容后, 同时我们也称上面的协议内容为`流程定义`, 我们再看看如何运行它?
## 5. 如何运行一个流程?
> 在介绍上面的协议内容时, 说了我们只用了空启动事件, 那我们怎么启动呢? 虽然说它是事件, 但我们实际发起流程并不是直接操作的事件,
> 而是操作引擎为我们提供API.
> `org.flowable.engine.RuntimeService#ProcessInstanceBuilder#start()`
### 5.1 简单了解 Flowable 引擎常用的 API (门面模式)
> API 的相关作用,都在对应类有注解, 自行查阅
- org.flowable.engine.RuntimeService 运行时相关
- org.flowable.engine.RepositoryService 元数据相关
- org.flowable.engine.HistoryService 历史数据相关
- org.flowable.engine.TaskService 审批任务相关
### 5.2 运行(前/中)的困惑?
> 有没有发现一个问题? 我们从头到现在几乎没有说审批人相关问题或配置, 包括 BPMN 协议内容中也没有审批人的信息. 能发起成功吗?
>
> 首先回答: 能正常发起,并且流程也能处理运转. 只是像之前说的没有人为操作, 流程会永远的停止在第一个审批节点,
> 然后这前提是规则里面至少有一个 userTask.
> 如果 BPMN 规则里面,只有 startEvent 直接连接的 endEvent, 那么发起即结束.
## 6. 流程引擎内部是如何运行的?
> Flowable 分为多个引擎, 包括 BPMN 引擎/CMMN 引擎/DMN 引擎/Form 引擎/IDM 引擎, 而我们主要关注 BPMN 引擎即可.
> 所有的引擎的内部功能统一的采用了命令模式, 引擎内部的每一步动作都是依靠一个Agenda(待办)
> 来临时存储后续动作的"命令".
>
> 所以我们研究引擎需要研究各种命令(XXXCmd). 这些命令是进入引擎内部的入口, 可以通过查看
> org.flowable.common.engine.impl.interceptor.Command 的继承关系看到具体的命令. 当然引擎还有更多的逻辑,
> 例如真正处理各种类型任务节点的是对应的行为(XXXBehavior),
> 可以通过查看 `org.flowable.engine.impl.delegate.ActivityBehavior`
> 的继承关系看到具体的行为.
>
> 例如: 想看发起过程需要研究: StartProcessInstanceCmd#execute
### 6.1 运行逻辑与操作库表总结
> 通常情况系下,业务要接入引擎,需要从模型配置开始,整体操作逻辑如下:
> 流程模型配置 -> 流程定义配置 -> 发布模型及定义 -> 业务发起指定模型 -> 引擎生成对应审批任务及事件 ->
> 业务操作任务通过/拒绝或撤销 -> 引擎流转节点直至结束.
>
> 大致逻辑了解后,再描述下具体调用 API 以及每个步骤操作的库表
### 6.2 创建模型
> 创建模型可以同步将定义传入,形成原子操作,当然操作上也是允许分步配置的.
>
API: cn.axzo.workflow.client.feign.bpmn.ProcessModelApi#create
操作的库表: act_re_model/act_ge_bytearray
### 6.3 创建/更新流程定义
> 如果未在模型创建时,同步传入定义内容, 则可以通过独立更新方式,仅更新定义内容. 需要注意的是流程定义是有版本概念的,
> 但激活的仅能只有一个版本,其他均为挂起
> API:
**(模型中更新)**: cn.axzo.workflow.client.feign.bpmn.ProcessModelApi#update
**(独立更新)**: cn.axzo.workflow.client.feign.bpmn.ProcessDefinitionApi#updateProcessDefinition
操作的库表: act_re_model/act_ge_bytearray
### 6.4 发布模型
> 发布模型的方式有很多,这里只列举了一种, 通过 ID 部署, 也可以通过 Key 部署, Key 是模型的必要属性, 业务也可以通过这个 Key
> 进行流程的发起.
>
API: cn.axzo.workflow.client.feign.bpmn.ProcessModelApi#deployById
操作的库表: act_re_procdef/act_re_deployment
### 6.5 创建流程实例
> 业务接入后,主要使用的 API, 基于某个流程模型进行实例的发起.
>
API: cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi#createProcessInstance
操作的库表:
**(运行时)**: act_ru_execution/act_ru_task/act_ru_actinst/act_ru_variable/
**(历史数据)**: act_hi_procinst/act_hi_taskinst/act_hi_actinst/act_hi_varinst/
### 6.6 流程任务审批
> 单纯操作流程任务相关的 API, 可以被业务使用.
>
API:
**(通过任务)**: cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi.approveTask
**(拒绝任务)**: cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi.rejectTask
操作的库表:
**(运行时)**: act_ru_task/act_ru_variable/act_ru_actinst/
**(历史数据)**: act_hi_taskinst/act_hi_varinst/act_hi_actinst/act_hi_procinst/
### 6.7 流程评论+附件
API:
**(添加评论)**: cn.axzo.workflow.core.service.BpmnProcessTaskService.commentTask
**(添加附件)**: cn.axzo.workflow.core.service.BpmnProcessTaskService.attachmentTask
操作的库表:
**(评论)**: act_hi_comment
**(附件)**: act_hi_attachment
## 7. 如何与外部交互?
> 工作流引擎作为服务端, 与外部系统交互分为两类, 一类是操作引擎, 一般提供 API 入口, 由外部推动. 另一类是引擎内部状态通知给使用方,
> 是由服务端广播出去.
### 7.1 外部操作引擎
> 本工程提供两种使用接入方式, 一种是 jar 包集成, 可参考[这个说明](workflow-engine-core/src/main/resources/readme.md),
> 另一种是 Feign API 集成, 主要参考`workflow-engine-server`module
> 中包路径为 `src/main/java/cn/axzo/workflow/server/controller/web` 下的文件.
### 7.2 引擎内部事件广播
> 引擎内部的事件类型非常多, org.flowable.common.engine.api.delegate.event.FlowableEngineEventType 通过这个类可以看到引擎会触发的事件类型.
>
> 本工程根据公司需要, 将引擎部分事件广播给使用方, 其他事件则不广播. 同时这些事件也被用于本工程的一些场景的消费.
**广播的事件接口**
- cn.axzo.workflow.core.listener.BpmnActivityEventListener
- cn.axzo.workflow.core.listener.BpmnTaskEventListener
- cn.axzo.workflow.core.listener.BpmnProcessEventListener
**以下总结哪些接口触发哪些事件**
- cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi.createProcessInstance
> 发起流程 MQ 触发规则:
> 1. 当前流程实例会依次触发 process-instance-created 和 process-instance-started 事件
> 2. 第一个审批任务会依次触发 process-task-assigned 和 process-task-created 事件
- cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi.cancelProcessInstance
> 取消流程 MQ 触发规则:
> 1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件
> 2. 当前流程实例会触发 process-instance-cancelled 事件
- cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi.approveTask
> 任务节点通过审批 MQ 触发规则:
> 1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
> 2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
> 2.2. 流程实例正常结束会触发 process-instance-completed 事件
- cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi.rejectTask
> MQ 触发规则:
> 1. 当前审批任务会触发 process-task-deleted 事件
> 2. 当前流程实例会触发 process-instance-rejected 事件
## 8. Flowable 过时的中文文档参考
[Flowable BPMN 用户手册 v6.3.0](https://tkjohn.github.io/flowable-userguide/)
## 99.建设状态(过时)
### 99.1 已完成:
1. 全新搭建工作流微服务
2. 工作流模型中 JSON 格式的协议支持
2. 嵌入式服务内开放审批人选择功能
3. 嵌入式服务内多种事件归类和抽象,以符合国内审批理解
4. 引入 Flowable Form 引擎
5. 重构工作流服务 Process 引擎相关接口,并按照框架简单接入和测试内置表单
6. 重构业务分类/流程状态/审批状态运行时以及历史数据的处理方式
### 99.2 待办项:
1. BPMN 协议兼容(XML/JSON已支持)
2. 工作流内部接入组织架构
3. 审批环节消息能力接入
4. 审批模型审批人配置管理与持久化
5. 审批模型表单能力的接入和调整
5. Flowable Event MQ 事件生产与消费