一、基于workflow-core强势开发审批流【已成功流转50W笔单据】
一、基础概念
理论支撑概念:petri网络;DNG;弹性制造系统FMS.
Petri 1976年的异步系统理论。翻译过来的库所,托肯,变迁三个概念理解了就可以进入FMS系统实战理论学习。
DNG是设计流程图数据结构的理论基础。就是流程长什么样子,如何解析,如何读取,如何保存。美人鱼(mermaid)采用MD保存流程,理解其原理就可设计数据结构,在下面会讲解。
二、目标
因接触flowable有一年之久,被各种折腾,久而久之,发现实际业务又得上CMMN,太复杂了,不堪回首,符合BPMN的流程,但在小需求上费尽脑汁。细想半年,化繁为简,实际审批流仅仅需要以下几个:
2.1)任务节点。
2.2)网关。交叉网关,并行网关。条件网关。
2.3)任务。定时任务,节点审批后任务。
这三点就是我们的目标。
三、绘制流程图
3.1)根据mermaid结构例子如下:
A-->B
B-->C
D-->C
非常好理解,那么数据结构有了,一棵树就是一个流程图。
id pid type之类的就可以设计出来。
easyflow这个数据结构比较符合。可以学习扩展下。
四、根据目标
flowable 7个接口只要实现4个TaskInstance,TaskDefineInstance,ProcessInstance,ProcessDefinceInsance.具体代码不写了,具体来讲如何实现。
workflow-core仓库内实例挨个跑一遍,可以实施开发了。伪代码如下:
流程定义:
4.1定义模型:
交换模型(变迁) FlowModelStep
节点模型 (库所)InitStep
builder.StartWith<InitStep>().input(..提交流程传入InitStep).output(..输出交换模型).Onerror(出错重试,这个方法很给力,如果流程出错,仅需拷贝此流程数据到测试环境,即可实现异常重现)//初始化交换模型,返回结束标志,返回第一个审批节点数据到变迁模型。
.while(w=>w.未找到结束标志)
.Do(context=>context.StartWith<DealStep>()
.waitfor(workflow唯一事件,仅需修改一个源代码方法).input().output()
.Then<DealStep>().input().output()//提交审批核心业务可以写在这里。
.If()可以增加一些判断
.Then<ElseDealStep>()
.Then<SendMessageStep>()
..........
)
.Then<WorkflowEndStep>()
.EndWorkflow();
host.startEvent()//发起流程审批。
host.Register<,>//注册流程。
host.start()//开启流程。
五、总结:
提交消息无状态,状态管理比较麻烦,比如审批后告诉api已经审批通过,可以展示审批人信息和流程图了。可自行实现。
最爽的是,流程可以嵌套,可实现比较复杂的也无需求,思路很清晰。比如串联工作流。