4. 审批节点配置:单签、会签、或签、加签、转签的规则与实现

审批节点怎么配,说白了就是「谁来批、怎么批」的问题。我见过不少团队,流程画得漂漂亮亮,一到审批节点就卡住——要么所有人都等着一个人,要么一个人签完就完事,完全不符合业务场景。

这一章,咱们就把五种审批模式掰开揉碎讲清楚。单签、会签、或签、加签、转签,每种模式我都踩过坑,今天一并告诉你。

核心观点:审批模式的选择,本质上是「控制权」与「效率」的平衡。控制越严,流程越慢;控制越松,风险越高。

4.1 五种审批模式概览

先看一张总图,把这五种模式的关系理清楚。

审批节点配置模式总览 审批节点配置模式总览 审批节点 单签 一人通过即完成 会签 全部通过才完成 或签 任一通过即完成 加签 动态增加审批人 转签 转交他人审批 💡 设计要点 单签/会签/或签是「静态模式」——审批人提前确定 加签/转签是「动态模式」——审批过程中发生变化

4.2 单签(单人审批)

单签是最简单的模式。指定一个人,他批了就过,他拒了就退。我在早期做数据权限申请流程时,默认就用的单签——结果发现,数据安全负责人出差一周,流程就卡一周。

适用场景:

  • 低风险的数据访问申请(如只读查询)
  • 审批人明确且唯一(如直属上级)
  • 紧急流程需要快速响应
我的建议:单签一定要配「超时自动转交」机制。我曾经吃过亏,一个单签节点卡了三天,业务方直接投诉到 VP 那里。后来我们加了 24 小时未审批自动转给上级的逻辑,问题才解决。

实现逻辑(伪代码):

// 单签审批逻辑
function approveSingle(approverId, action) {
  if (action === 'agree') {
    // 直接完成当前节点
    completeNode(currentNode);
    // 推进到下一节点
    moveToNextNode();
  } else if (action === 'reject') {
    // 退回申请人
    rejectToApplicant();
  }
}

4.3 会签(全员审批)

会签要求所有指定审批人都同意,流程才能继续。说白了就是「一票否决制」。我记得在金融行业做数据治理时,敏感数据导出必须经过安全、合规、业务三个部门会签,少一个都不行。

会签的两种实现方式:

方式 说明 优缺点
顺序会签 按指定顺序依次审批,前一个人完成后才轮到下一个人 流程清晰,但慢;适合有层级关系的审批
并行会签 所有审批人同时收到任务,各自独立审批 速度快,但需要汇总逻辑;适合平级部门

实现逻辑(并行会签):

// 并行会签审批逻辑
function approveCountersign(approverId, action) {
  // 记录当前审批人的意见
  recordVote(approverId, action);
  
  if (action === 'reject') {
    // 任一拒绝,直接退回
    rejectToApplicant();
    return;
  }
  
  // 检查是否所有审批人都已同意
  if (allApproversAgreed()) {
    completeNode(currentNode);
    moveToNextNode();
  }
  // 否则继续等待其他审批人
}
注意:并行会签要处理好「并发冲突」。我曾经遇到一个 case:两个审批人几乎同时点击「同意」,但数据库层面只记录了一个,导致流程卡死。解决方案是加分布式锁,或者用乐观锁机制。

4.4 或签(任一审批)

或签和会签正好相反——只要有一个审批人同意,节点就通过。你想想看,什么时候会用或签?比如数据查询申请,数据组三个人谁有空谁批就行,没必要等所有人。

实现逻辑:

// 或签审批逻辑
function approveOrSign(approverId, action) {
  if (action === 'agree') {
    // 任一同意,直接完成
    completeNode(currentNode);
    moveToNextNode();
  } else if (action === 'reject') {
    // 记录拒绝意见
    recordVote(approverId, action);
    // 检查是否所有人都拒绝了
    if (allApproversRejected()) {
      rejectToApplicant();
    }
  }
}
关键点:或签的「拒绝」逻辑要谨慎。一个人拒绝不代表流程结束,除非所有人都拒绝了。我见过一个设计缺陷:或签模式下,第一个拒绝的人直接退回了流程,导致其他审批人根本没机会看到申请。

4.5 加签(动态增加审批人)

加签是审批人在处理过程中,觉得需要增加其他人一起审批。比如数据安全负责人觉得某个申请涉及敏感字段,需要加签数据合规官。

加签的两种类型:

  • 前加签:新增的审批人在当前审批人之前审批。当前审批人需要等待新增审批人完成后,才能继续处理。
  • 后加签:新增的审批人在当前审批人之后审批。当前审批人先完成,然后新增审批人再处理。

实现逻辑(后加签):

// 后加签逻辑
function addApprover(currentApproverId, newApproverId, reason) {
  // 记录加签原因
  recordAddSign(currentApproverId, newApproverId, reason);
  
  // 当前审批人先完成
  completeCurrentApprover(currentApproverId);
  
  // 在节点中插入新的审批人
  insertApproverAfter(newApproverId, currentApproverId);
  
  // 通知新审批人
  notifyApprover(newApproverId);
}
避坑指南:加签要限制次数。我曾经见过一个流程被连续加签了 7 次,审批链变得极其冗长。建议限制每个节点最多加签 2 次,或者加签后需要原审批人确认。

4.6 转签(转交审批)

转签是审批人把任务转给其他人处理。常见场景:审批人休假、出差,或者觉得这个申请应该由更合适的人来批。

转签的两种模式:

模式 说明 适用场景
完全转签 原审批人完全退出,由新审批人全权处理 审批人休假、离职
代理转签 原审批人仍保留权限,但委托他人代为审批 审批人临时有事,但不想完全放弃控制权

实现逻辑(完全转签):

// 完全转签逻辑
function transferApproval(fromApproverId, toApproverId, reason) {
  // 记录转签信息
  recordTransfer(fromApproverId, toApproverId, reason);
  
  // 移除原审批人的待办任务
  removeTask(fromApproverId);
  
  // 创建新审批人的待办任务
  createTask(toApproverId);
  
  // 通知新审批人
  notifyApprover(toApproverId);
  
  // 记录审计日志
  auditLog('TRANSFER', fromApproverId, toApproverId);
}
注意:转签一定要留审计痕迹。我遇到过一个问题:审批人转签后,新审批人批了,但原审批人否认自己转签过。后来我们强制要求转签必须填写原因,并且记录 IP 和时间戳,才解决了扯皮问题。

4.7 五种模式对比总结

模式 通过条件 审批人数量 动态性 风险等级 典型场景
单签 一人同意 1 静态 低 普通查询申请
会签 全部同意 ≥2 静态 高 敏感数据导出
或签 任一同意 ≥2 静态 中 值班审批
加签 取决于主模式 动态增加 动态 中 需要额外专家意见
转签 取决于新审批人 替换 动态 低 审批人不在岗

4.8 实际项目中的组合策略

在实际项目中,这五种模式很少单独使用。我参与过的一个数据治理平台,审批节点是这样设计的:

  1. 第一步:申请人直属上级单签(快速过滤低风险申请)
  2. 第二步:数据安全组或签(谁有空谁批)
  3. 第三步:合规、法务、业务部门会签(高风险必须全员通过)
  4. 第四步:数据负责人可加签(如果觉得需要额外意见)
  5. 第五步:所有审批人可转签(处理异常情况)
设计原则:风险越高的节点,控制越严(会签);风险越低的节点,效率优先(单签/或签)。加签和转签作为「安全阀」,只在必要时启用。