有兴趣了解一下审批工作流欢迎来讨论!!!!!

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

第1关

一天,老板找到我,说要做个简单的工作流引擎。

我查了一天啥是工作流,然后做出了如下版本:

  • 按顺序添加任意个审批人组成一个链表,最后加一个结束节点
  • 记录当前审批人,当审批完后,审批人向后移动一位
  • 当审批人对应结束节点时,流程结束

老板:简陋了点。

第2关

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

我又查了一天啥是会签节点,发现会签节点就是一个大节点,里面有很多审批人,当这个大节点里的所有人都审批通过后,才能进入下一个节点。

我想了一个星期,推翻了原来的链表式设计:

结构上我做了如下调整:

  • 把节点分为两大类:简单节点(上图中长方形)和复杂节点(上图中圆形)。
  • 用一棵树表示整个流程,其中叶子节点都是简单节点,简单节点都是叶子节点。
  • 每个简单节点里都有且仅有有一个审批人。
  • 复杂节点包含若干个子节点。
  • 加入会签节点: 会签节点激活后,所有的子节点都可以审批,当所有的子节点都审批完毕后,会签节点完成。
  • 加入串行节点:子节点只能从左到右依次进行审批,当最后一个子节点审批完成后,串行节点完成。
  • 所有的工作流最外层都是一个串行节点,该节点完成后代表整个工作流完成。

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

  • Ready: 可以进行审批操作的简单节点是Ready状态。
  • Complete: 已经审批完成的节点状态。
  • Future: 现在还没有走到的节点状态。
  • Waiting: 只有复杂节点有该状态,表示在等待子节点审批。

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


老板:有点意思。

第3关

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

我查了一下午啥是并行节点,发现并行节点是一个包含很多审批人的大节点,这个大节点里任何一个人审批通过,则该节点就完成。

然后很快就加入了并行节点:

  • 并行节点是一个复杂节点,该节点激活时,任何一个子节点都可以进行审批,且任何一个子节点是完成状态时,该节点完成。

加入新状态 Skip:

  • 当一个并行节点的子节点状态为非(Ready, Waiting)时,其它兄弟节点及其子节点的状态被置为Skip。

举个栗子🌰:

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

第4关

老板又来了:节点要支持嵌套,比如会签节点里有个并行节点,并行节点里又有个复杂节点,要可以嵌套任意层的那种。

我:其实已经支持了~

  • 能无限扩展的树形结构可以支持任意复杂流程。

老板:小伙子有点东西!

第5关

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

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

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

  • 条件节点类似并行节点,只不过只有满足条件的子节点才能进入接下来的审批。

老板:已阅。

第6关

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

经过一番考虑,我把简单节点分成了3类:

  • 第一种:审批人是写死的。
  • 第二种:审批人从表单中读取。
  • 第三种:根据发起人和一个映射函数,算出审批人。比如 get_主管(“钱某”) 得到钱某的主管 李某。

老板:嗯。

第7关

老板又来了:节点可以从前往后审批,那能不能从后往前驳回?

我: ……

首先实现了驳回到发起人的功能,相当于一切从头开始:

  • 只有Ready状态的节点有权利驳回。(就像只有Ready状态的节点有权利审批一样)

老板:你小子偷懒。

第8关

老板又来了:先实现驳回到上一个审批人吧。

驳回到上一个审批人其实是个很复杂的逻辑,因为工作流中的节点可以无限嵌套,所以如何确定上一个状态有哪些审批人并不简单。

牺牲了一些头发,我终于实现了驳回上一级的功能:

老板:阅。

第9关

老板又来了:实现一个驳回到任意节点的功能。

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

  • 不断的驳回上一级,直到Ready状态的节点包含要驳回到的节点为止。

老板:嗯。

第10关

老板又来了:在普通节点加一个时间限制,要是在规定时间内没完成就显示已超时。

我:还有这种需求?

不过还是实现了。

此时我明白了需求和头发呈负相关,需求越多,头发越少。

第11关

老板又来了:加一个代理功能,比如有件事让你审批,但是你拿不准,那就转给拿得准的人审批。

马上我发现这个需求跟以往有本质的不同,以往的工作流的节点关系一开始就是固定的,就是在发起流程之前确定的,

但是现在要在审批过程中更改。

无非是加了一些班,掉了一些头发,最终设计了如下方案:

  • 代理操作的本质是,新建一个并行节点作为本节点的父节点,再新建一个兄弟节点放代理人,这样自己和代理人都能审批通过。
  • 代理操作可以无限嵌套,即代理人也可以找人代理。

第12关

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

。。。我已经宠辱不惊了,加就加:

  • 取消代理是代理的逆操作
  • 如果代理人审批过了那就不能取消代理

第13关

表如何设计的尼 ??

以下是我的设计

工作流分类表
id
name

工作流表
id
name   流程名称
type  工作流分类表
status   禁用 / 正常
order   排序
create_time
user_id
desc  描述





工作节点表

id  节点id
flow_id   审批工作流的ID
name  审批节点的名称
node_type    1顺序 2 会签 3 并行(或签) 4 条件
node_status 状态   Ready   Complete   Future    Skip(或签的时候才会有)
upper_node_id  上一个节点ID
lower_node_id   下一个节点ID

approve_role  指定审批角色
approver   指定审批人
approver_rule  自定义审批的规则 (发起人的主管或者表单里的条件)

agent_approver  代理人审批

create_time  创建时间
update_time  修改时间
create_id  创建流程设计的人



审批记录表

id
node_id  节点ID
user_id
content  审批的内容
create_time
status  审批结果


回退(驳回)表
id
uid
node_start_id     驳回的起始节点ID
node_end_id        驳回到哪一个节点
reason              驳回的原因


会签、或签表
id
type   会签、或签
uid     审批人
node_id
is_agree   核意见:1同意;2不同意',
content

希望大家给点建议哈!!

本作品采用《CC 协议》,转载必须注明作者和本文链接
有梦想的人睡不着,没有梦想的人睡不醒。
本帖由系统于 2年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 39

Laravel
laravel 我做了一套!基本是你想要的发个图给你参考一下:

Laravel

file

file

file

file

file

file

2年前 评论
91it 2年前
liziyu 2年前
xini2603 (作者) 2年前
rfxiong 2年前
playmaker 2年前

之前搞过oa这种

2年前 评论

wiki.tita.com/pages/viewpage.actio... 之前参考这个做了一套,你可以看看,希望对你有帮助

2年前 评论

mark。是贴合OA审批流形式。信乎OA表 形式也可作为参考。不过该产品递加的也是比较多。
还有就是你们老板真 tm 事 :joy:

2年前 评论

不知道钉钉的审批流能否符合你的需求,分享一个模仿钉钉审批流的前端 github.com/StavinLi/Workflow

Laravel

2年前 评论
thebestxt

好活,马了

2年前 评论

以前做过类似的,不过当时是基于现有的流程管理做的 1、节点(起始、下一步、审批、回退、完成之类) 2、流程(由后台管理人员指定流程 比如 起始->下一步->完成),简单的理解就是如果下一步或者审批需要指定用户或者属于某个岗位来完成。那么就必须在下一步或者审批指定相关的操作人员。 发起流程 1、新建子流程并记录当前节点 2、当客户选好指定的发送人 下一步 并保存下一步的节点。其他的节点类似。 3、为每一个节点编写具体的业务逻辑。也就是当用户点击回退的时候执行的逻辑或者完成执行的逻辑。

2年前 评论

Laravel
laravel 我做了一套!基本是你想要的发个图给你参考一下:

Laravel

file

file

file

file

file

file

2年前 评论
91it 2年前
liziyu 2年前
xini2603 (作者) 2年前
rfxiong 2年前
playmaker 2年前

刚给公司开发一个OA,审批流更复杂。

2年前 评论

symfony 也有一个 workflow 组件。

2年前 评论
liziyu 2年前
mowangjuanzi (作者) 2年前
from_2033 1年前
liziyu 1年前
pndx

这么复杂的逻辑用啥设计模式?

2年前 评论

tpflow 开源的工作流引擎,laravel composer就可以引用
www.gadmin8.com/
推荐 Gadmin 企业级开发平台

1年前 评论

工作节点表里的approval_rule具体指什么?类型是怎样的?哪位能举个例子吗?

1年前 评论

麻烦请教一下,数据表结构有更详细的参考吗?比如我发起一个审批,这个审批当前的节点和状态应该记录到哪儿呢,还望大佬指教一下

1年前 评论

为上一家公司开发一套OA系统

9个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
88
粉丝
21
喜欢
134
收藏
267
排名:228
访问:4.2 万
私信
所有博文
博客标签
redis
1
php
1
laravel
7
docker
3
orm
2
sync
1
pivot
1
detach
2
attach
2
算法
1
递归
1
多对多
1
lnmp环境搭建
1
GO变量
1
GO数据类型
1
IOC注入反转
1
IOC容器的绑定解析过程(绑定单例)
1
原生微信网页授权登录(natapp穿墙)
1
VMwareNAT网卡配置
1
MySQL基础架构
1
redis 主从搭建
1
Sentinel哨兵模式解决故障转移
1
elasticsearch安装
1
elasticsearch集群安装3台
1
安装kibana
1
必须了解的mysql三大日志-binlog、redo log和undo log
1
何处理数据恢复 数据丢失 面试tx的架构师的岗位问的
1
分库分表插入数据
1
创建分库分表(在主从复制的基本上)
1
分库分表总结
1
mysql总结
1
haproxy状态检测脚本(完成高可用)
1
mysql高可用衡搭建(Keepalived)
1
mysql负载均衡搭建(haproxy)
1
mysql主从恢复数据一致性(pt工具-t-table-checksum和pt-table-sync)
1
终于解决了《====》记一次mysql热备份xtrabackup(没有解决问题)
1
mysql事务
1
MYSQL8.0安装
1
Redis-cluster分布式集群搭建部署
1
比Redis-cluster还好的redis分布式集群(twemproxy)
1
Redis缓存穿透/缓存雪崩/缓存击穿(案例:产生的原因 解决方案利/弊)
1
数据结构之MySQL独爱B+树(二叉树、AVL树、红黑树、B树对比)
1
B-tree
1
B+tree
1
Mycat实现mysql的负载均衡读写分离
2
mysql双主双从 搭建配置
1
mycat 双主双从-负载均衡-高可用
1
Mycat垂直分库
1
记一次mysql高可用技术分享
1
【rabbitmq】安装ampq的扩展的踩坑总结
1
PHP操作MongoDB(增删改查)
1
golang总结
5
社区赞助商