工作流管理软件 工作流系统

工作流系统(工作流管理软件)
一级有一天 , 老板找我 , 说要做一个简单的工作流引擎 。
我查了查什么是全天工作流 , 然后做了以下版本:
添加任何批准者以形成一个链接列表 , 最后添加一个结束节点 。
记录当前审批人 , 当审批完成后 , 审批人将后退一位 。
当批准人对应于结束节点时 , 流程结束 。
老板:有点简陋 。
第二级老板又来了:支持会签节点 。
我又查了一下什么是会签节点 , 发现会签节点是一个大节点 , 里面有许多批准人 。当这个大节点中的所有审批人都被批准后 , 他们可以进入下一个节点 。
我想了一个星期 , 推翻了原来的链表设计:
在结构上 , 我做了以下调整:
将节点分为两类:简单节点(上图中的矩形)和复杂节点(上图中的圆形) 。
用一棵树来表示整个过程 , 其中所有的叶节点都是简单节点 , 所有的简单节点都是叶节点 。
每个简单节点中只有一个审批者 。
【工作流管理软件 工作流系统】复杂节点包含几个子节点 。
加入会签节点:会签节点激活后 , 所有子节点都可以被审核 。当所有子节点都被批准时 , 联署节点就完成了 。
加入串行节点:只能从左到右批准子节点 。当最后一个子节点被批准时 , 串行节点就完成了 。
中所有工作流的最外层是一个串行节点 , 它表示整个工作流的完成 。
为了控制审批流程 , 我设计了一些节点状态:
就绪:可以审批的简单节点处于就绪状态 。
完成:已批准的节点状态 。
未来:尚未到达的节点状态 。
等待:只有复杂节点具有此状态 , 表明它们正在等待子节点的批准 。
借助上述规则 , 带有一次会签节点的工作流审批流程如下:

老板:有意思 。
第三级老板来了:支持并行节点 。
我查了一下午什么是平行节点 , 发现平行节点就是有很多审批人的大节点 。如果这个大节点中的任何一个人被批准 , 这个节点就完成了 。
然后迅速加入了平行节点:
并行节点是一个复杂的节点 。当节点被激活时 , 任何子节点都可以被批准 , 当任何子节点处于完成状态时 , 该节点是完成的 。
添加新状态跳过:
当并行节点的子节点的状态不是(就绪、等待)时 , 其他兄弟节点及其子节点的状态被设置为跳过 。
举个栗子:
老板:这个设计加新节点还是挺方便的 。
四级再次Boss:节点要支持嵌套 。例如 , 会签节点中有一个并行节点 , 并行节点中有一个复杂节点 。应该是可以嵌套任何层的那种 。
我:其实我已经支持了~
无限扩展的树形结构可以支持任何复杂的过程 。
老板:小伙子有东西!
第5级老板又来了:支持条件节点 。
工作流伴随着一个表单 , 需要根据表单的内容确定下一步进入哪个分支 。
经过几天的冥思苦想 , 我加入了条件节点:
节点类似于并行节点 , 只是只有满足条件的子节点才能进入下一个审批 。
老板:我看过了 。
6级老板又来了:又多了两类审批人 , 比如可以从表单中选择下一个审批人 , 可以根据不同的发起人选择不同的审批人 。
经过一番考虑 , 我将简单的节点分为3类:
第一种:审批人写死了 。
第二种:审批人读表 。
第三种方法是根据发起人和映射函数计算批准人 。比如get_ supervisor("钱")获取钱的主管李 。
老板:嗯 。
7级老板又来了:节点可以从前到后审批 , 那么可以从后到前拒绝吗?
我:......
首先实现了对发起方的拒绝功能 , 相当于从头再来:
只有处于就绪状态的节点有权拒绝 。(就像只有处于就绪状态的节点有权批准一样)
老板:你很懒 。
8级老板又来了:先给最后一个审批人否决吧 。
拒绝最后一个审批人实际上是一个复杂的逻辑 , 因为工作流中的节点可以无限嵌套 , 所以不容易确定哪些审批人处于最后状态 。
牺牲了一些头发 , 终于实现了拒绝下一级的功能:
老板:看 。
第九级老板又来了:实现对任意节点拒绝的功能 。
我发现这个需求不难实现:

推荐阅读