轻量工作流模块的前世今生

背景:

在诸多系统中的存在流程的概念,这就引出一个概念系统-工作流系统,当今市场上存在很多工作流系统,Activiti和Flowable都是比较出名的产品。但是,如果我们想要在现有系统中引入工作流系统,现有的开源工作流又显得过于庞大且学习成本较高,在此背景下,笔者在工作外开始进行工作流方面的思考,于是引出了这篇文章。

所谓前世今生,前世是对工作流问题的总结,今生是工作流的设计。

前世

系统中节点流转中我们经常碰到几个问题:

  1. 没有完善的骨架支持整个流程,流程的更迭更多是在堆代码的行为下进行。
  2. 业务流和工作流强耦合,业务流常伴随工作流的信息,即业务逻辑中参杂大量的工作流信息,例如业务流直接声明下一节点,流程的变更必然引起代码的修改。
  3. 一致性问题,由于业务流程中存在各种未知问题,同时工作流系统也存在很多未知问题,若不能很好的控制事务,必然会导致大量的工作流和业务流信息不一致的问题。
  4. 开发难度大,正如背景所讲,Flowable本身作为一个庞大的系统,若想快速上手并投产使用需要掌握大量的知识,同时需要将现有系统业务流融入到工作流中。
  5. 缺少节点事件,更多的时候我们需要在流程流转或流程的关键节点设计回调机制,例如,当流程完成后发送短信发送审批结果。
  6. 可扩展性,如何快速且快捷的进行流程迭代也是重要的一环。

设计思路

工作流设计
明确工作流引擎基本功能
  1. 创建

    负责流程实例的初始化 【例】发起请假流程

  2. 签收

    签收当前节点的流程节点,可对当前节点进行操作 【例】主管自动签收组员的请假审批节点

  3. 完成

    完成当前的流程节点 【例】主管对请假审批节点给出审批意见

image-20250829000838087

工作流的扩展功能
  1. 指派流程,流程可以指定给某个用户进行审批等处理
  2. 权限控制,可以对签收、发起、审批等行为进行安全校验
  3. 关键节点回调,在流程处理到关键节点,留有扩展接口进行功能扩展。

image-20250829125852549

模块化设计
  1. 业务流程和工作流流程解耦

    工作流可以绑定业务事件

  2. 模块直接流转依赖配置,而不是代码

    例如出具 同意,则进入下一节点(无需关心下一节点是什么,依靠配置),而不是在代码中明确出下一节点。

流程设计中,各个流程是单独的模块,应该尽可能的消除节点之间的依赖关系,即使调整顺序,也可以正常进行流程流转

image-20250829131850452

实现方案
工作流参与实体
实体 描述 基础信息(部分信息)
流程定义信息 定义流程信息 流程代码、流程名称
流程节点信息 定义流程中的每个节点相关的信息 节点代码、节点名称、节点类型
流程路由信息 定义节点之间的流转信息 流程定义、当前节点、下一节点
流程实例信息 定义信息的实例化 业务参数、当前节点、审批时间
流程审批信息 每个节点的审批信息 审批结论、审批时间
业务事件绑定

我们在定义节点信息的时候,可以使用事件/bean的形式对该节点的业务行为进行补充,如组长审批节点,定义组长审批事件,当节点推进到组长审批的时候,自动执行组长审批事件,同时自定义审批事件【正常情况下】不会直接输出下一节点信息,使用审批结论进行流程流转。

数据一致性保障

我们有了业务流和工作流,数据一致性问题是个巨大的问题。

解决方案比较灵性, 需要一定的前置知识:Spring事务 | Yiwyn’s ~ShenZhi Blog

使用事务同步进行一致性操作,将工作流流程推进置于提交。