一级
有一天,老板来找我,说他会做一个简单的工作流引擎。
我整天查什么工作流程,然后做了以下版本:
按顺序添加任意数量的审批人,形成一个链表,最后添加一个结束节点
记录当前审批人,审批完成后,审批人将向后移动一位
当审批人对应到结束节点时,流程结束
老板:有点简陋。
二级
老板又来了:支持会签节点。
我又查了一天副署节点是什么,发现副署节点是一个有很多审批人的大节点。只有这个大节点的所有人都通过审批,才能进入下一个节点。
我想了一周,推翻了原来的链表设计:
我做了以下结构调整:
节点分为两类:简单节点和复杂节点。
整个过程用一棵树表示,其中叶节点为简单节点,简单节点均为叶节点。
每个简单节点中只有一个审批人。
复杂节点包含几个子节点。
加入会签节点:会签节点激活后,所有子节点都可以被审核,当所有子节点都被审核后,会签节点完成。
加入串行节点:子节点只能从左到右依次审批。最后一个子节点审批完成后,串行节点完成。
所有工作流的最外层是一个串行节点,代表整个工作流的完成。
为了控制审批流程,我设计了一些节点状态:
就绪:可以审批的简单节点处于就绪状态。
完成:已批准的节点状态。
未来:尚未达到的节点状态。
等待:只有复杂节点具有此状态,这表明它们正在等待子节点的批准。
借助上述规则,带会签节点的工作流审批流程如下:
老板:有意思。
三级
老板来了:支持并行节点。
我查了一下午什么是平行节点,发现平行节点是一个审批人多的大节点。如果这个大节点有人赞成,那就完了。
然后迅速加入了平行节点:
并行节点是一个复杂的节点。当节点被激活时,任何子节点都可以被批准,当任何子节点处于完成状态时,该节点就完成了。
添加新状态跳过:
当并行节点的子节点状态不是时,其他兄弟节点及其子节点的状态被设置为跳过。
举个栗子:
老板:这个设计增加新节点挺方便的。
四级
老板又来了:节点应该支持嵌套。例如,副署节点中有一个并行节点,并行节点中有一个复杂节点,可以嵌套在任何级别。
我:其实我已经支持了~
无限扩展的树形结构可以支持任何复杂的过程。
老板:小伙子有事!
5级
老板又来了:支持条件节点。
工作流自带表单,需要根据表单内容确定下一步进入哪个分支。
经过几天的冥想,我加入了条件节点:
条件节点类似于并行节点,只是只有满足条件的子节点才能进入下一次审批。
老板:是的。
6级
老板又来了:审批人有两种,比如可以从表单中选择下一个审批人,也可以根据不同的发起人选择不同的审批人。
经过一番考虑,我将简单的节点分为三类:
第一种类型:审批人被写死。
其次,审批者从表单中读取。
第三,根据发起者和映射函数计算批准者。比如get_ supervisor得到了钱的主管李。
老板:嗯。
7级
老板又来了:节点从头到尾都可以审批。能从头到尾拒绝吗?
我:......
首先实现拒绝发起方的功能,相当于从头开始:
只有处于就绪状态的节点才有权拒绝。
老板:你懒。
8级
老板又来了:先实现对上一个审批人的拒绝。
拒绝上一个批准人实际上是一个非常复杂的逻辑。因为工作流中的节点可以无限嵌套,所以不容易确定哪些审批人处于前一状态。
牺牲了一些头发,我终于实现了拒绝更高层次的功能:
老板:看。
9级
老板又来了:实现拒绝任何节点的功能。
我发现这个要求并不难实现:
连续拒绝上一级,直到就绪节点包含要拒绝的节点。
老板:嗯。
10级
老板又来了:给常用节点加个时间限制,如果在规定时间内没有完成成就,就说明已经超时了。
我:有这样的需求吗?
但它实现了。
这时,我意识到需求和头发是负相关的。需求越多,头发越少。
11级
老板又来了:增加一个代理功能,比如你对某件事不确定要审批,那就转交给能拿到审批的人。
随即,我发现这个要求和过去有着根本的不同。过去工作流的节点关系一开始是固定的,在流程启动之前就确定了。
但现在必须在审批过程中进行更改。
无非是加了一些类,掉了一些毛,最后设计了以下方案:
代理操作的本质是创建一个新的并行节点作为这个节点的父节点,然后创建一个新的兄弟节点来放代理,这样代理和自身都可以通过审批。
代理操作可以无限嵌套,即代理也可以找人代理。
12级
老板又来了:能不能再增加一个功能取消代理?
。。。我已经自我满足了,我再补充一句:
取消代理是代理的反向操作
如果代理已被批准,则不能取消代理
13级
老板又来了:给每个节点添加一个前置和后置条件。只有满足前置条件才能进入节点,满足后置条件才能完成审批。
我的心:再见,老板,再见,再见,再见!
我的嘴:好的老板,收到,收到。
后来:后来我真的给每个节点加了前置条件,同时审批逻辑相关的代码也翻倍了。
第14层
老板又来了:有些工作流程已经很复杂了,审批需要很长时间。您能否为每个正在进行的工作流计算一个指标:直观地显示当前的批准百分比?
我:收到。
其实和之前的需求相比,这并不复杂,因为不涉及核心逻辑的变化,本质是输入一个树形结构,然后根据不同节点的状态输出一个整数。
经过测试和思考,最终方案如下:
工作流完成百分比是指从树中最右边的就绪节点到最左边的节点/最右边的节点的距离。
15级
老板又来了:能不能给每个节点挂两个可执行脚本,节点审批启动完成后执行?
我:拿着...给你。
当然后来我实现了这个功能。与此同时,我发现我在壮年时就秃顶了。
版权声明:内容来源于网络,版权归原创作者所有。除非我们无法确认,否则我们将标记作者和来源。如有侵权,请告知,我们将立即删除并道歉。谢谢你
感谢阅读