各位好,我是兔老三,最近用go语言写了一个“中国式”的工作流引擎,目前已经发布到github上,地址如下:
gitHub - Bunny3th/easy-workflow: GO语言开发的简单易用工作流。
何谓"中国式流程”
咱们拿一个简简单单的请假流程来说说:
申请人-->本部门主管-->人事主管-->老板
有同学可能会说,这是一个最正常的流程啊,你别标题党。
别急,咱们听听客户的需求:
1、部门主管说了:假如申请人是我自己,为什么还要再有“本部门主管”这一步?我还审我自己?
2、人事主管说了:我身体不好要经常请假,但是又不想休假的时候把账号给别人,希望能设置一个功能,在我休假的时候,把我的审批委托给助手小王。
3、老板说了:我是老板我任性,驳回只能驳到人事,这不行,我希望能自由驳回到任何人。
4、给老板加上了自由驳回的功能,人事又不爽了。老板直接驳回到部门主管,部门主管又要提交到人事,这不是增加人事的工作量?
5、老板又说了:得加一个微信提醒的功能,谁收到审批任务1小时还没有动静的,得微信给我。咱要有效率。
6、然后老板又又又说了,IT部门特殊,这帮人怎么可以请假?IT部的人请假要先看工作年数,没到3年的不准请假。007才是他们的福报,年轻人不要整天想着躺平...
嗯...现在好像就不那么简单了吧?做过工作流项目的同学可能会沉重点头,很多是真事,甚至还有更脑洞大开,随心所欲的——谁让需求方是大爷呢。
为什么要自己写一个引擎
有同学说了,工作流引擎这个轮子又不是没有,比如activiti,你上面说的这些功能,也不是不能做啊。是的,工作流引擎不是黑科技,目前国外开源的以activiti为代表,很多功能网上找找资料也确实能做。
不过我当时遇到了几个困难:
1、老三是一名Gopher,目前项目也都是go语言开发的,而activiti是java写的。老三当初也写过java,就是因为觉得java代码比较啰嗦(抱歉,对广大java程序员没有不敬之意),才放弃java投入到go的世界。老码农的别扭劲上来了,如果有办法,自然不想用“混合”的方式完成项目。
2、找了一下目前go语言下的开源工作流引擎,发现确实有一些,但看了一些资料,似乎go语言中还没有一个工作流引擎如java世界中的activiti那样有丰富的文档和支持。各位也知道,使用一个开源库,如果没有文档支持,遇到坑是多么的痛苦。
更何况,中国人更懂中国需求,有些一板一眼的国外引擎,还真挺难伺候咱中国客户。
引擎设计功能介绍
无奈之下,挠挠头皮,突然想想,要不自己写一个呗!于是就写了一个叫做easy workflow的轻量级引擎。能力有限,不能和大佬比,不过所谓麻雀虽小,五脏俱全,这个引擎倒也是能跑一些复杂的流程,主要有那么一些设计点:
1、首先支持客户最爱的各种飞线跳转审批。这里做了两个小设计:
a、自由驳回。支持驳回上游任意节点;
b、直接(跳转)提交。可以跳过中间节点,直接提交到驳回我的那个节点。
2、支持复杂流程分支
要实现复杂流程的本质是”控制节点走向和流转逻辑“。在activiti中。是通过各类网关和连接线中条件判单实现的。老三比较懒,所以在我的项目中只用了一个”混合网关“(可视为activiti中排他、并行、包含网关和连接线的简单混合体)。
3、支持变量和条件表达式
这个是工作流引擎的标配对吧,没有这两小伙伴,根本没法设计复杂点的流程。
4、支持事件定义
目前版本支持4种事件,分别是:a、节点开始 b、节点结束 c、任务结束 d、流程撤销。
5、支持计划任务
计划任务是事件的辅助,有了它的补充,可以发挥更大的脑洞,满足更多的客户需求。比如:通知、自动过审、统计....等等等等。”人事请假时候委托给助理“这个需求,我就是用计划任务完成的。
6、支持直接以微服务方式运行
可以作为一个库嵌入自己的代码,也可以直接开启内置的WEB API服务,通过网络调用接口。
结语
虽然水平有限,但想想这个引擎也经过实际项目的折腾和考验了,不算是自娱自乐的产物。所以在此厚着脸皮开源出来,不敢指望大家能看得上,算是为中国的开源社区添一块小砖吧。