当审批流程变成“击鼓传花”,低代码如何用技术手段终结办公室政治?
“这个环节不归我管,你找下家。”
“张总出差了,等他回来再说。”
“流程卡在哪个环节了?我也不知道,你挨个问吧。”
这些对话是不是听起来很耳熟?跨部门协作中的“踢皮球”现象,本质上是业务流程管理失控的外在表现。我把这种现象称为组织协同的“状态机坍塌”——当业务流程无法被系统化地定义、流转和监控时,责任边界就会模糊,执行效率就会断崖式下跌。
在传统的企业管理软件中,我们试图用硬编码的审批流来解决这个问题。结果呢?流程比人还死板,业务变了我得改代码,改代码就得排期,排期就要等,等着等着项目就黄了。
这是技术问题,更是架构问题。
一、扯皮的根源:流程逻辑的“硬编码之痛”
先聊聊为什么传统流程设计会让各部门理直气壮地“踢皮球”。
传统的流程审批系统,无论是OA自带的工作流还是定制开发的审批模块,大多采用固定链路设计——节点顺序写死、审批人写死、流转条件写死。这种设计的核心问题是:把业务规则固化在了代码逻辑里。
举个例子,一个典型的费用报销流程可能是这样的:
// 伪代码:传统硬编码流程
if (amount <= 5000) {
nextApprover = "部门主管";
} else if (amount <= 50000) {
nextApprover = "部门总监";
} else {
nextApprover = "CFO";
}
看起来没毛病,对吧?但现实业务中会出现多少例外?
- 紧急项目需要特批绕过常规审批链
- 部门主管出差,需要临时授权给副主管
- 跨部门协作项目,需要多个部门会签
- 采购金额不大但涉及敏感资产,需要法务介入
这些例外场景,每一个都需要开发人员修改代码、重新发版。业务等不了,开发改不动,流程就走不通——于是各部门开始在流程外“线下沟通”,系统的流程记录变成了一张废纸。
这就是典型的流程与业务的“阻抗失配”。
二、破局思路:工作流的声明式设计
要解决这个问题,我们需要换一个视角:流程引擎不应该执行业务逻辑,而应该描述业务逻辑。
这就是低代码平台工作流设计的核心思想——声明式流程定义。它把“怎么做”交给引擎,把“做什么”留给配置。
以JNPF平台为例,它的工作流设计完全遵循BPMN 2.0标准,但在实现上做了更深层的抽象。这套引擎的核心架构可以简化为:
┌─────────────────────────────────────────────────────┐
│ 流程定义层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │简单流程 │ │标准流程 │ │任务流程 │ │自由流程 │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
├─────────────────────────────────────────────────────┤
│ 引擎内核层 │
│ ┌─────────────────────────────────────────────┐ │
│ │ JNPF Flow Engine (BPMN标准) │ │
│ │ - 节点解析器 - 条件评估器 - 任务分发器 │ │
│ └─────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 运行时支撑层 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 数据源 │ │ 组织架构│ │ 消息中心│ │ 审计日志│ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────┘
关键在于,流程定义与流程执行是完全解耦的。流程定义只是一个JSON Schema或XML描述文件,引擎负责解析和执行。这意味着修改流程不需要动一行代码,只需要修改配置。
三、JNPF的五种流程类型:从“万能钥匙”到“手术刀”
在JNPF的设计体系中,没有一种流程能解决所有问题。他们把流程分成了五种类型,每种对应特定的业务场景。这种分类本身就是一种技术哲学:用对的工具解决对的问题,而不是用一把锤子去拧螺丝。
1. 简单流程:瀑布流的“极简主义”
简单流程是最接近传统审批流的一种模式,但它有一个关键区别:遵循BPMN标准规范,采用瀑布流设计,但完全可视化配置。
适用场景:员工请假、办公用品领用、用章申请等线性审批业务。
技术特点:
- 节点顺序固定,但审批人可动态配置
- 支持或签、会签、依次审批
- 审批意见支持必填/选填配置
从技术实现上看,简单流程的核心是一个有向无环图(DAG),每个节点包含审批人解析器、条件判断器和任务分发器。引擎在运行时动态解析“谁应该审批这个节点”,而不是预先把审批人写死在数据库里。
2. 标准流程:复杂业务的状态机
标准流程采用了直观的流程图设计,支持全新审批流。它和简单流程的本质区别在于:引入了条件分支和并行网关。
适用场景:项目管理、采购招标、合同审批等涉及多条件判断的复杂业务。
这里的技术难点在于条件表达式的动态评估。JNPF的实现方案是:条件配置支持关联前置数据节点的字段信息,系统根据实际业务数据自动匹配符合的流转路径。
举个例子,在“费用报销”流程中,可以在“金额校验”节点后设置两条连线条件:
- 报销金额 > 5000元 → 财务总监审批
- 报销金额 ≤ 5000元 → 财务专员审批
这个条件判断不是在代码里写if-else,而是在流程设计器中通过可视化配置完成。引擎在运行时动态解析表单数据,计算条件表达式,决定下一节点走向。
3. 任务流程:异步解耦的“消息驱动”
任务流是JNPF中比较特殊的一种类型,它的设计思想是:流程节点之间的流转可以不依赖即时响应。
V6.1版本的一个重要升级是:发起审批节点新增了同步/异步执行类型选择。
- 同步模式:需等待当前发起节点执行完成后,再进入下一环节
- 异步模式:发起节点提交后无需等待,可直接触发后续任务流转
这个设计解决了什么问题?
想象一个场景:销售发起“客户合同签约”流程。如果是紧急项目,异步模式下销售提交合同信息后,系统立即将审批任务推送给法务部,同时同步生成合同编号存档。两个任务并行执行,互不阻塞。
从技术实现上,这涉及到任务队列和事件驱动架构。JNPF底层应该集成了类似的消息中间件,将流程节点之间的调用从同步RPC改为异步消息,大幅提升了高并发场景下的吞吐能力。
4. 自由流程:流程民主化的技术尝试
这是JNPF V6.1最重磅的更新,也是最具争议的功能。
自由流程的核心架构极其简洁:开始节点 → 自由节点 → 结束节点,三大节点固定,不允许增删。
所有的灵活性都收敛在“自由节点”内部:
┌─────────────────────────────────────────────────┐
│ 自由节点 │
│ ┌───────────────────────────────────────────┐ │
│ │ 审批人自主指定下一节点责任人 │ │
│ │ 支持或签/依次审批/会签 │ │
│ │ 双结束规则:审批人自结 / 流转次数限制 │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
这个设计的技术精妙之处在于:用固定的框架保证流程基础安全,用灵活的内部配置适应非标场景。
双结束规则是一个亮点:
- 审批人自行结束:适用于灵活场景,审批人可根据实际情况提前终止流程
- 流转次数限制:1-50次可配置,默认10次,防止流程无限循环
从实现角度看,自由流程需要解决的核心问题是动态节点解析。传统的BPMN引擎在启动时就确定了完整的节点链路,而自由流程的节点链路是在运行时动态生成的。这要求引擎具备运行时节点插入能力,以及动态审批人解析机制。
5. 混合模式:自由与标准的统一
在实际业务中,很少有流程是纯粹的标准或纯粹的自由。JNPF的设计允许在标准流程中嵌入自由节点,实现刚性框架下的柔性流转。
比如在采购流程中,标准路径是“发起→部门审批→财务审批→结束”,但在部门审批环节,审批人可以决定是否跳过财务环节直接结束(如果采购金额极小且无财务影响)。
这种混合模式的技术实现需要引擎支持节点级别的执行策略覆盖,在标准流程框架内允许特定节点执行自由逻辑。
四、技术深潜:JNPF工作流引擎的底层实现
说完了五种流程类型,我们来聊聊底层实现。这部分对架构师和技术决策者更有价值。
4.1 BPMN标准的落地与扩展
JNPF的工作流引擎——JNPF Flow——深度遵循BPMN 2.0标准。BPMN的核心价值在于:提供了一套标准化的流程描述语言,使得流程定义可以在不同平台间迁移。
但遵循标准只是基础,真正的技术挑战在于标准之上的扩展能力。
JNPF在BPMN标准基础上增加了几个关键扩展:
连线条件配置:在标准BPMN中,Sequence Flow的条件表达式通常是固定写在XML里的。JNPF允许在触发节点后设置自定义条件规则,支持关联前置数据节点的字段信息,系统根据实际业务数据自动匹配流转路径。
审批意见精细化:审批节点新增“启用审批意见”和“审批意见必填”两项配置选项。核心审批节点强制填写意见,普通节点可选择不启用,既保障关键环节有迹可查,又简化常规审批操作。
4.2 处理人解析机制
流程引擎最复杂的模块之一就是处理人解析。JNPF引入了类似“处理人矩阵”的概念,核心能力包括:
多维属性匹配:根据发起人身份、所属部门、自定义标签等多维度属性,自动定位对应的处理人范围。
动态范围控制:当用户权限小于预设的处理人范围时,系统自动隐藏超出权限的数据,仅展示其可操作的内容。
流转规则配置:支持或签、会签、签收三种核心处理方式,以及顺序签和无序签两种顺序模式。
从技术实现看,这背后是一个规则引擎在运行。处理人解析规则被抽象成可配置的表达式,引擎在运行时动态执行:
// 处理人解析规则示例
rule "按金额匹配审批人"
when
$amount > 50000
then
setApprovers(["CFO", "CEO"]);
setApprovalMode("会签");
end
4.3 流程版本控制与灰度发布
在企业级应用中,流程变更是常态。JNPF V6.0引入了启用中和已归档版本不可修改任何属性的机制。
这意味着:
- 正在运行的流程实例不受新版本影响
- 新发起的流程使用最新版本定义
- 已归档的历史版本完全不可变
这个设计保证了流程变更不中断业务,同时满足了审计合规要求。
五、观点:低代码工作流不是银弹,但正在改变游戏规则
写到这里,我想抛出几个可能引发讨论的观点。
观点一:自由流程不是万能解药
自由流程的出现,本质上是对传统BPM“过度设计”的反思。但自由流程也有它的适用边界。
如果所有流程都变成自由流程,那就回到了“线下沟通、线上补录”的老路上。自由流程的价值在于处理例外,而不是取代标准。真正高效的组织,应该是80%的标准流程+20%的自由流程。
观点二:流程设计的民主化是双刃剑
低代码平台让业务人员可以自己设计流程,这是好事。但我也见过不少“业务人员设计的灾难流程”——节点冗余、逻辑混乱、甚至存在死循环。
技术赋能不等于技术放任。企业级低代码平台应该内置流程设计的最佳实践检查机制,在业务人员“自由发挥”的同时,给予必要的约束和引导。
观点三:流程引擎正在从“核心系统”变成“基础设施”
五年前,工作流引擎是企业的核心应用,需要专门的团队维护。现在,流程引擎正在变成类似数据库的基础设施——被嵌入到各种业务系统中,透明地为业务服务。
这种变化对架构师提出了新要求:流程引擎不应该成为系统的耦合点,而应该成为系统的解耦层。流程定义与业务逻辑分离、引擎执行与业务数据分离,这是低代码平台走向成熟的技术标志。
六、结语:从“踢皮球”到“一键流转”
回到文章开头的问题:跨部门协作扯皮,到底是人的问题还是技术的问题?
我的答案是:既有人的问题,但更多是技术的问题。
当流程不透明、节点不明确、异常无兜底时,推诿扯皮是必然的结果。人只是在这种系统缺陷下的理性反应者。
低代码工作流的价值,不在于它有多炫酷的技术,而在于它用技术手段重新定义了组织协作的规则:流程可定义、状态可追踪、异常可管控。
从“踢皮球”到“一键流转”,本质上是组织从“人治”走向“法治”的过程。而低代码平台,就是这场变革的技术载体。