当前位置: 首页 > 科技观察

酷,老板让我开发一个简单的工作流引擎...

时间:2023-03-19 19:39:53 科技观察

图片来自PexelsNO.1。第一关我查了一天什么是工作流,然后做了如上图的版本:依次添加任意数量的审批人组成一个链表,最后添加一个结束节点记录当前审批人。审批完成后,审批人向后移动。当审批人对应到结束节点时,流程结束。老板:有点简陋。2号。2级boss又来了:支持会签节点。又查了一天什么是签名节点,发现签名节点就是一个大节点,里面有很多审批人。当这个大节点的所有人都通过审批后,就可以进入下一个节点了。我想了一个星期,推翻了原来的链表设计:我做了如下结构调整:将节点分为两类:简单节点(上图中的矩形)和复杂节点(上图中的圆)。用一棵树来表示整个过程,其中叶子节点都是简单节点,简单节点都是叶子节点。每个简单节点只有一个批准人。复杂节点包含多个子节点。加入会签节点:激活会签节点后,即可对所有子节点进行审核,当所有子节点审核通过后,会签节点完成。加入一个串行节点:子节点只能从左到右依次被批准。当最后一个子节点被批准时,串行节点完成。所有工作流的最外层是一个串行节点,节点完成后代表整个工作流完成。为了控制审批流程,我设计了一些节点状态:Ready:一个简单的可以执行审批操作的节点就是Ready状态。Complete:节点状态已经通过。Future:尚未到达的节点状态。Waiting:只有复杂节点才会有这个状态,表示正在等待子节点审批。借助上述规则,具有会签节点的工作流的审批流程如下:老板:有兴趣。3号。3级boss来了:支持并行节点。查了一个下午什么是并行节点,发现并行节点就是一个大节点,审批人多。如果这个大节点中有人通过了审批,那么这个节点就完成了。然后快速添加了一个并行节点:并行节点是一个复杂的节点。当节点被激活时,任何一个子节点都可以被批准,当任何一个子节点处于完成状态时,该节点就完成了。添加新状态Skip:当并行节点的子节点状态不是(Ready,Waiting)时,其他兄弟节点及其子节点的状态设置为Skip。举个栗子:老大:这个设计加新节点还是挺方便的。4号。4级老大又来了:节点必须支持嵌套,比如会签节点中有一个并行节点,并行节点中有一个复杂节点,可以任意层级嵌套。我:其实已经支持了~无限扩展的树形结构可以支持任意复杂的流程。老板:小伙子有东西!5号。5级老大又来了:要支持条件节点。工作流带有一个表单,表单的内容决定了下一步要进行的分支。经过几天的苦思冥想,我加了一个条件节点:条件节点类似于并行节点,只是只有满足条件的子节点才能进入下一个审批流程。老板:我看过了。6号。6级老大又来了:增加了两种审批人,比如可以从表单中选择下一个审批人,可以根据不同的发起人选择不同的审批人。经过考虑,我把简单的节点分为3种:第一种:approver是硬编码的。第二:从表格中读取批准人。第三种方法:根据发起人和一个映射函数计算批准人。例如get_supervisor("Qian")获取Qian的主管Li。老板:是的。7号。7级老大又来了:节点可以从前到后批准,从后到前否决吗?我:……首先实现了向发起者拒绝的功能,相当于从头开始Start:只有处于Ready状态的节点才有拒绝的权利。(就像只有Ready状态的节点才有审批权一样)老板:你懒。8号。8级老大又来了:先执行对上一个审批人的拒绝。拒绝之前的审批人其实是一个很复杂的逻辑,因为工作流中的节点可以无限嵌套,所以如何判断哪些审批人是之前的状态并不简单。牺牲了一些毛,终于实现了解散上一级的功能:Boss:已读。9号。9级老大又来了:实现一个拒绝任意节点的功能。我发现这个需求并不难实现:一直拒绝上层,直到Ready状态的节点包含要拒绝的节点。老板:是的。10号。10级boss又来了:给普通节点加个时间限制,如果没有在规定时间内完成,就会显示超时。我:还有这个需求吗?但它已经实现了。至此我明白了需求和头发是反比的,需求越多,头发越少。11号。11级boss又来了:增加代理功能,比如你有事情要审批,但是你不确定,那就转给有把握的人。随即,我发现这个要求和以往有着根本的不同。过去,工作流的节点关系一开始是固定的,在流程启动前就确定了,现在需要在审批过程中改变。无非是加了点类,丢了点毛,最后设计了如下方案:代理运行的本质是创建一个并行节点作为这个节点的父节点,然后再创建一个兄弟节点放代理,这样代理人和被代理人都可以被批准。代理操作可以无限嵌套,即代理也可以找人代理。第12号。12楼老大又来了:能不能加个取消代理的功能?……我已经受宠若惊了,补充一下:取消代理就是代理有代理的逆操作已经通过了那你就不能取消13号代理了。13级boss又来了:给每个节点加一个前置条件。只有满足前置条件才能进入节点,只有满足后置条件才能批准节点。我的心:哦老板再见,哦老板再见再见再见!我嘴里:好的老板,收到收到。Later:后来真的给每个节点都加了前置条件和后置条件,同时审批逻辑相关的代码加倍了。第14号。14老板又来了:有些工作流程已经很复杂了,审批时间很长。您能否为每个正在进行的工作流程计算一个指标:直观地显示当前审批流程百分比。我收到了。其实这个和之前的需求相比并不复杂,因为不涉及核心逻辑的改动,本质只是输入一个树结构,然后根据不同节点的状态输出一个整数。经过测试和思考,最终确定的方案如下:工作流完成百分比是指处于就绪状态的最右边节点到树中最左边节点的距离/到最右边节点的距离。第15号。15级老大又来了:能不能在每个节点上挂两个可执行脚本,等节点审核通过后执行?我:采纳了。后来当然是实现了这个功能,同时我也发现自己在壮年的时候已经秃了。第16号。后记老板是清华大学毕业的天才学生。不然我大概也不会想到这么多巧妙的需求。后来老板把这套工作流系统卖给了广*证券等公司,我也去了其他公司分道扬镳,当然那个时候我觉得我还有未来。当我开始做这个工作流程的时候,我刚本科毕业,离开这家公司的时候,照镜子的时候我已经老了。这已经是三年前的事了,现在回想起当年加班加点改变工作流程的日子,还是很震撼。最后祝愿天下同仁无病无灾,身心健康,存够钱在一线城市买两套房子,在无病无灾的悠闲退休生活。几年。作者:MCTW编辑:陶佳龙来源:cnblogs.com/duck-and-duck/p/14436373.html

猜你喜欢