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 实际项目中的组合策略
在实际项目中,这五种模式很少单独使用。我参与过的一个数据治理平台,审批节点是这样设计的:
- 第一步:申请人直属上级单签(快速过滤低风险申请)
- 第二步:数据安全组或签(谁有空谁批)
- 第三步:合规、法务、业务部门会签(高风险必须全员通过)
- 第四步:数据负责人可加签(如果觉得需要额外意见)
- 第五步:所有审批人可转签(处理异常情况)
设计原则:风险越高的节点,控制越严(会签);风险越低的节点,效率优先(单签/或签)。加签和转签作为「安全阀」,只在必要时启用。