「扫码关注我,面试、各种技术(mysql、zookeeper、微服务、redis、jvm)持续更新中~」
背景
不知道大家在平时工作中有没有遇到过类似的问题?业务团队经常去线下收集各种业务表格,进行统计,然后进行部门、人员之间的流转、上报领导,我们在服务公司销售团队的时候遇到了以下问题。
问题一:通过手动、人工的方式进行收集信息会导致信息无法及时同步,影响工作效率,不利于团队共享管理。
问题二:工作中有很多申请和重要的信息变更,需要领导进行审批。
问题三:业务发展变化较快,页面表单也经常变动,固定的表单开发模式会影响业务发展的速度。
基于以上面临的问题,我们打算借助业内审批框架或者自建的方式来提高业务团队的整体工作效率,使流程线上化,提升流程合规性、达到记录可追溯、结果可复盘。同时针对页面表单经常变动的情况,我们计划打造一套用户自定义配置表单(拖拉拽)。整体设计向低代码平台进行探索。
实现目标
- 工单自定义模版,需支持用户自定义表单,拖拽式动态生成流转表单,打造低代码平台,降低了研发投入成本,提高整体人效;
- 工单流程需支持用户自定义配置流程,丰富的配置选项,包括流程节点处理人配置、节点操作配置、节点表单模版配置,相对于传统审批流框架更加灵活、修改及时生效,不需要研发修改流程图再发布上线的过程;
- 工单系统需支撑更多业务场景,部门流转包括部门组织架构自下而上流转到根部门,类似审批流场景,还有部门组织架构自上而下流转到叶子部门比如:销售主管拆分业绩目标给所负责的下级部门主管场景;
- 工单流程需提供丰富的节点处理人配置,包含按照组织部门架构配置处理部门,人员岗位角色和指定人员;
- 工单流程可以灵活配置节点处理人企微消息通知,比如及时通知或者几天后通知,减少工单处理时长,提高工单处理效率,及时触达用户;
- 工单系统需支持多种处理操作,包括工单提交、工单驳回、工单转交和工单废弃,支持业务方各种工单流转场景;
- 工单系统将表单和流程进行解耦,并将业务表单进行插件化配置,可支持更多业务场景并且不需要对工单系统进行额外开发,只需独立开发业务表单部分,完成业务产品快速上线,提高产品交付效率;
- 工单流程支持动态启用/停用流程,即时生效,满足业务方对工单流程的快速控制。
技术选型
我们调研了业务审批流相关开源框架,如:Activiti和Flowable等,特别是Activiti,但是Activiti存在一些弊端不能满足工单需求,主要包含以下几个方面:
-
Activiti是静态流程,对流程经常变动场景支持不灵活,需更改流程图发版上线;
-
Activiti更适合扁平简单的组织架构,对复杂、经常变动的组织架构的支持不足;
-
如果适配工单场景需大量二次开发,难度较大,耗时较久;
-
如果使用Activiti那么需要引入其相关数据库表,Activiti的查询是代码自动封装,复杂业务条件下自动生成的查询存在慢查询等性能问题;
-
Activiti审批流支持自下而上的审批方式,但是对于我们的业绩拆分场景,自上而下下发(按照部门树由高层级流向底层部门)目前是不支持的,而且对于我们部门层级变更不能灵活适配。
基于以上原因,于是决定自研工单引擎,在实现过程中很多思想也是参考审批流程框架来实现的,比如:
- 工单引擎也参考审批流需要提前预知流程和节点,以此来控制流转过程;
- 流程节点处理人设置(按照组织架构部门、岗位、指定人)、处理方式(或签、会签)和分支条件是参考Activiti来扩展的;
- 工单引擎在审批流程基础上,将流程节点操作和节点表单模版进行配置化设置,这样使得工单流程配置更加灵活,通用。
系统设计
页面设计
自定义表单设计
工单流程配置过程设计
工单引擎的设计核心就是在工单流程的灵活配置上,并且可以及时生效,不需要和传统审批流那样修改流程节点信息还需要发版才可以。
数据库设计
在设计工单引擎需要依赖部分基础数据,比如公司的部门架构、人员、岗位、基础业务表单等,所以我们整体列一下其中的表结构关系。
部门、人员组织架构表
工单流程表单配置和工单运行实例表
其中流程配置部分也是对应上面工单流程配置,是工单引擎设计的核心所在,因为在实际工单运行过程中,都是按照工单配置来流转的。
架构图
特性
经过整体设计和开发,工单引擎具有以下特性:
- 插件:针对依赖业务表单,打造可插拔配置业务表单,将业务表单和工单引擎进行解耦;
- 配置:用户可以灵活进行流程配置、处理人配置、表单配置、通知配置等,减少研发参与(相对传统审批流框架);
- 动态:支持用户动态修改流程配置状态,启用/停用流程,即时生效;
- 异步:借助MQ完成流程任务处理结束异步通知业务方,提升系统整体响应效率;
- 通知:流程任务到达可以配置支持动态天数方式通知;
- 通用:工单系统可以适配各种团队协作、审批等通用业务场景,支持快速接入;
- 扩展:系统使用多种设计模式,增强系统未来发展整体扩展性;