Flowable,自研混合架构翻车了

1 阅读4分钟

前年我们接了个OA系统的活,领导说要做审批流。我那时候年轻,心气高,想着这玩意儿不就是几张表的事么?自己写,多灵活。

开始确实顺。建个todo表,加个status字段,0是待办1是已办。前端画个列表,齐活了。老王抽着烟说:“小李,你这进度可以啊,三天顶人家一周。”

我心里得意,又给加了个priority字段,紧急程度高中低。再加个expire_time,超时自动提醒。表越来越胖,代码越写越嗨。

产品经理小张来了,说:“李哥,能不能加个会签?就是几个人一块批。”我说行,加了个approval_type字段。过两天他又来了:“能不能根据金额走不同流程?”我说行,加了个condition_expression字段。后来他再来,我都不问要啥了,直接说:“你说吧,要几个字段?”

我的TodoService长到了一千多行,里面if else套着if else,像一锅煮烂的面条。测试妹子小刘说:“李哥,你这代码我测不完,分支太多了。”我说:“没事,主要流程跑通就行。”

后来老王从外面开会回来,说现在流行Flowable,专业。我说:“老王,咱们这自研的挺好,灵活。”老王看看我那锅面条代码,没说话。

转折来得突然。领导说海外分公司要上个采购系统,流程贼复杂。老王说用Flowable吧,我说我自己能写。我俩争了一下午,最后领导拍板:“都要。简单的用自研,复杂的用Flowable,灵活。”

“灵活”这两个字,后来成了我们项目的紧箍咒。

我们搞了个UnifiedApprovalService,里面有个shouldUseCustom方法。这个方法成了玄学,谁也不敢动。有时候它说用自研,有时候用Flowable,像掷骰子。

第一次出事是个报销单。销售部老陈提交了,系统说用自研。批到第二个人,卡住了。老陈急,点了三次提交,第三次系统掷骰子掷到了Flowable。好嘛,一个报销单,生了三胞胎:一个在自研系统卡着,一个在Flowable走了一半,还有一个不知道去哪儿了。

那天晚上我们查数据,自研的todo表查一遍,Flowable那三十多张表查一遍。凌晨两点,眼睛看表名都重影:ACT_RU_TASK、ACT_HI_TASKINST、ACT_RU_EXECUTION……像进了阎王爷的生死簿。

老王说:“找,把那个鬼流程找出来。”我们找到了,在custom_todo表里,status是2。我问:“2是啥意思?”没人知道。文档?早没了。

第二次出事是审计来了。要查一个去年采购流程的历史记录。自研部分,我从operation_log表里扒拉出几条,字段都不全。Flowable部分,历史记录完整,谁几点几分干了啥,清清楚楚。审计的人问:“中间这一步怎么跳过去的?”我张张嘴,说不出话。能说啥?说我们系统有两套,数据没接上?

最绝的是进度条。同一个审批,自研系统算出来完成60%,Flowable算出来75%。前端小伙子问我:“李哥,显示哪个?”我说:“取平均吧。”他说:“那用户问为啥是67.5%,我咋说?”我点了根烟,没说话。

老王后来抽烟越来越凶。有天他看着监控图,突然说:“咱们这两条腿走路的系统,现在是一条腿骨折了,另一条腿在使劲蹦。”

我们想过修。但怎么修?动自研系统,怕影响旧流程。动Flowable,又不熟悉。中间那堆胶水代码,像蜘蛛网,一碰全屋灰尘落下来。

去年年底,我们终于决定全迁到Flowable。迁移的时候,我看到了自己三年前写的代码注释:“此处暂用简单逻辑,后续优化。”后面跟了二十多个“后续优化”,一个都没优化。

老王的头发白了一半。他说:“早知道一开始就用Flowable,现在孩子都上小学了。”我说:“现在用也不晚,就当给孩子找个后爹。”

自研系统的代码我们没删,打了个包,叫legacy-todo-system.tar.gz。解压密码是:wolunzaizaoyige。意思是:我伦(忍)栽(在)栽(再)一(也)个(不)自己造轮子了。

现在新来的同事问我审批流咋做,我都说:“用Flowable,别自己写。”他们问为啥,我就讲那个凌晨两点找鬼流程的故事。讲完了,补一句:“有些跟头,你听别人摔过,就不用自己再摔一遍了。”