工作流引擎 老板要我开发一个简单的工作流引擎

栏目:生活 2021-09-18 15:01:10
分享到:

一级

有一天,老板来找我,说他会做一个简单的工作流引擎。

我整天查什么工作流程,然后做了以下版本:

按顺序添加任意数量的审批人,形成一个链表,最后添加一个结束节点

记录当前审批人,审批完成后,审批人将向后移动一位

当审批人对应到结束节点时,流程结束

老板:有点简陋。

二级

老板又来了:支持会签节点。

我又查了一天副署节点是什么,发现副署节点是一个有很多审批人的大节点。只有这个大节点的所有人都通过审批,才能进入下一个节点。

我想了一周,推翻了原来的链表设计:

我做了以下结构调整:

节点分为两类:简单节点和复杂节点。

整个过程用一棵树表示,其中叶节点为简单节点,简单节点均为叶节点。

每个简单节点中只有一个审批人。

复杂节点包含几个子节点。

加入会签节点:会签节点激活后,所有子节点都可以被审核,当所有子节点都被审核后,会签节点完成。

加入串行节点:子节点只能从左到右依次审批。最后一个子节点审批完成后,串行节点完成。

所有工作流的最外层是一个串行节点,代表整个工作流的完成。

为了控制审批流程,我设计了一些节点状态:

就绪:可以审批的简单节点处于就绪状态。

完成:已批准的节点状态。

未来:尚未达到的节点状态。

等待:只有复杂节点具有此状态,这表明它们正在等待子节点的批准。

借助上述规则,带会签节点的工作流审批流程如下:

老板:有意思。

三级

老板来了:支持并行节点。

我查了一下午什么是平行节点,发现平行节点是一个审批人多的大节点。如果这个大节点有人赞成,那就完了。

然后迅速加入了平行节点:

并行节点是一个复杂的节点。当节点被激活时,任何子节点都可以被批准,当任何子节点处于完成状态时,该节点就完成了。

添加新状态跳过:

当并行节点的子节点状态不是时,其他兄弟节点及其子节点的状态被设置为跳过。

举个栗子:

老板:这个设计增加新节点挺方便的。

四级

老板又来了:节点应该支持嵌套。例如,副署节点中有一个并行节点,并行节点中有一个复杂节点,可以嵌套在任何级别。

我:其实我已经支持了~

无限扩展的树形结构可以支持任何复杂的过程。

老板:小伙子有事!

5级

老板又来了:支持条件节点。

工作流自带表单,需要根据表单内容确定下一步进入哪个分支。

经过几天的冥想,我加入了条件节点:

条件节点类似于并行节点,只是只有满足条件的子节点才能进入下一次审批。

老板:是的。

6级

老板又来了:审批人有两种,比如可以从表单中选择下一个审批人,也可以根据不同的发起人选择不同的审批人。

经过一番考虑,我将简单的节点分为三类:

第一种类型:审批人被写死。

其次,审批者从表单中读取。

第三,根据发起者和映射函数计算批准者。比如get_ supervisor得到了钱的主管李。

老板:嗯。

7级

老板又来了:节点从头到尾都可以审批。能从头到尾拒绝吗?

我:......

首先实现拒绝发起方的功能,相当于从头开始:

只有处于就绪状态的节点才有权拒绝。

老板:你懒。

8级

老板又来了:先实现对上一个审批人的拒绝。

拒绝上一个批准人实际上是一个非常复杂的逻辑。因为工作流中的节点可以无限嵌套,所以不容易确定哪些审批人处于前一状态。

牺牲了一些头发,我终于实现了拒绝更高层次的功能:

老板:看。

9级

老板又来了:实现拒绝任何节点的功能。

我发现这个要求并不难实现:

连续拒绝上一级,直到就绪节点包含要拒绝的节点。

老板:嗯。

10级

老板又来了:给常用节点加个时间限制,如果在规定时间内没有完成成就,就说明已经超时了。

我:有这样的需求吗?

但它实现了。

这时,我意识到需求和头发是负相关的。需求越多,头发越少。

11级

老板又来了:增加一个代理功能,比如你对某件事不确定要审批,那就转交给能拿到审批的人。

随即,我发现这个要求和过去有着根本的不同。过去工作流的节点关系一开始是固定的,在流程启动之前就确定了。

但现在必须在审批过程中进行更改。

无非是加了一些类,掉了一些毛,最后设计了以下方案:

代理操作的本质是创建一个新的并行节点作为这个节点的父节点,然后创建一个新的兄弟节点来放代理,这样代理和自身都可以通过审批。

代理操作可以无限嵌套,即代理也可以找人代理。

12级

老板又来了:能不能再增加一个功能取消代理?

。。。我已经自我满足了,我再补充一句:

取消代理是代理的反向操作

如果代理已被批准,则不能取消代理

13级

老板又来了:给每个节点添加一个前置和后置条件。只有满足前置条件才能进入节点,满足后置条件才能完成审批。

我的心:再见,老板,再见,再见,再见!

我的嘴:好的老板,收到,收到。

后来:后来我真的给每个节点加了前置条件,同时审批逻辑相关的代码也翻倍了。

第14层

老板又来了:有些工作流程已经很复杂了,审批需要很长时间。您能否为每个正在进行的工作流计算一个指标:直观地显示当前的批准百分比?

我:收到。

其实和之前的需求相比,这并不复杂,因为不涉及核心逻辑的变化,本质是输入一个树形结构,然后根据不同节点的状态输出一个整数。

经过测试和思考,最终方案如下:

工作流完成百分比是指从树中最右边的就绪节点到最左边的节点/最右边的节点的距离。

15级

老板又来了:能不能给每个节点挂两个可执行脚本,节点审批启动完成后执行?

我:拿着...给你。

当然后来我实现了这个功能。与此同时,我发现我在壮年时就秃顶了。

版权声明:内容来源于网络,版权归原创作者所有。除非我们无法确认,否则我们将标记作者和来源。如有侵权,请告知,我们将立即删除并道歉。谢谢你

感谢阅读