Skip to content

中国式审批语义

加签、驳回、会签、转办、撤回——这些让国外 BPMN 引擎头疼的本土语义,在 rulego-bpm 里是一等公民。全部动作在 wf_task 上闭环,经 REST API 与 Go API 暴露。
审批方式
单人审批或签(任一通过)并行会签顺序会签依次审批票签(比例/票数)系统任务抄送
会签聚合规则
全票 all(一票否决)任一 any多数 majority百分比 percent固定票数 count顺序/并行可配
办理中动作
加签减签转办委托签收/抢单退回上一节点撤回评论附件
候选人类型
指定成员角色部门直属主管多级主管发起人自选发起人本人
实例级操作
挂起恢复终止撤回申请超时催办优先级流程跟踪
自审策略(审批人=发起人)
跳过转直属主管转部门主管允许自审

审批方式(approvalType)

节点 configuration.approvalType 取值(wf_task.approval_type 同值落库):

approvalType名称通过规则说明
single单人审批办理人处理即出结果默认值;assignee 为单个办理人
or或签任一人通过即过,一票拒绝即驳多候选人同时收到,先办先得
countersign会签approvalRule 聚合(全票/多数/比例/票数)配合规则字段,见下表
sequential依次审批前一人办理完,下一人才收到任务引擎按需逐个创建单人任务,前一人不出结果后一人不可见
vote票签approvalRule 的比例/票数出结果与会签共用规则结构,适合评审表决场景
system系统任务无人工投票自动节点内部使用
cc抄送任务不产生审批结果ccTask 节点专用

会签规则(approvalRule)

会签/票签的聚合规则写在 approval_rule(JSON 字符串),结构体为 CountersignRule

字段类型说明
typestring聚合方式:all / any / majority / percent / count
valuefloat规则值,percentcount 类型使用
isSequentialboolfalse 并行会签(默认)/ true 顺序会签

type 聚合方式明细:

type通过条件拒绝条件示例
all全员通过一票拒绝即驳{"type":"all","isSequential":false}
any任一人通过任一拒绝即驳(首个完成的票面即定结果){"type":"any"}
majority多数通过(total/2+1多数拒绝{"type":"majority","isSequential":true}
percent通过票占比 ≥ value(百分比,向上取整:3 人 60% 需 2 票)数学上已不可能达标即驳{"type":"percent","value":60}
count通过票数 ≥ value(固定票数)数学上已不可能达标即驳{"type":"count","value":3}

典型组合:

json
// 并行会签 · 全票通过(一票否决)
{ "type": "all", "isSequential": false }

// 顺序会签 · 多数通过(逐个审,过半出结果)
{ "type": "majority", "isSequential": true }

// 并行票签 · 60% 通过(评审表决)
{ "type": "percent", "value": 60 }

isSequential: true 时按 wf_task.sequence_order 逐人激活;并行时全员同时可见,先签收先办(见下文签收/抢单)。

审批人含发起人时(自审策略)

审批链路中出现发起人本人时,按节点配置的 selfApprovalType 处理,不会出现「自己审自己」:

selfApprovalType行为
skip跳过该审批人,直接到下一节点
delegate_to_manager转给直属主管(主管缺失时顺延部门主管,再兜底 candidateConfig 变量指定人)
delegate_to_department_manager转给部门主管审批
allow允许发起人自审(默认值,需合规要求时使用)

枚举中另有 auto_approve(自动通过)为预留值,当前实现等价于 allow

候选人解析

任务按以下 candidateType 发起,候选人池(wf_task_assignee)只存原始引用,查询时经 IdentityService 展开:

candidateType解析方式
usercandidateUsers 直接给用户 ID
role / dept按角色/部门查用户(可配部门主管审批)
direct_manager发起人的直属主管
multi_level_manager发起人的多级主管
initiator_select发起人提交时自选审批人
initiator_self发起人本人(自审场景)

办理中的动作

加签 / 减签

审批中途动态插入审批人(加签)或移除未办理的会签人(减签)。加签语义对齐钉钉的前加签:新加签人先审,加签子任务全部完成后原审批人再出结果。引擎通过 wf_task.parent_id + sequence_order 维护任务父子链,加签产生子任务,主任务等待链上任务全部完成。

退回

可退回到上一个已办审批节点重新办理:

  • 退回目标固定为最近一个已办 userTask(不能跨节点挑目标,也不能直接退发起人)
  • 被退回任务归档为 returned,目标节点任务重建,表单数据与变量随行带回
  • 需要「退回发起人」时,给节点配置驳回策略 rejectStrategy: rejectToStarter

转办 / 委托

  • 转办:任务转给他人办理,办理人变更,留痕写入任务变量 transfer_from / transfer_reason / transfer_time
  • 委托:受托人代办,owner 保留原拥有人、delegate_from 落表留痕;被委派人处理后经 resolve 归还原审批人

签收 / 抢单

角色/部门候选任务先到先签:候选池中任何人可签收(claimed_at 记录时间),签收后其他人不可再办。

撤回

发起人可撤回在途申请:实例终止(状态 terminatedend_reason 记「申请人撤回」),在途任务作废,之后可修改表单重新发起。

实例级操作

操作实例状态说明
挂起 / 恢复suspendedactive暂停全部未办任务,恢复时单节点恢复不丢父上下文
终止terminated管理员强杀,记录 end_reason
完成completed正常走完 end 节点,归档入历史表

超时催办

gflow 定时巡检 wf_task.due_date 已超期的在途任务,经内置通知中心自动发站内提醒(只提醒,不自动转办/自动通过)。任务的 due_dateTaskService.SetDueDate Go API 设置。

抄送

ccTask 节点生成抄送记录(不阻塞流程),经 CCTaskCreatedListener 回调;gflow 前端有「抄送我」列表,抄送人可评论。

动作权限

每个 userTask 可在 additionalInfo.actionPermissions 里精细开关审批人可用的动作。通过(approve)/驳回(reject)由后端强制开放,不可关闭;其余动作默认关闭,需显式开启:

json
{
  "transfer": true,
  "return": true,
  "delegate": true,
  "addSign": true,
  "reduceSign": true,
  "urge": true,
  "uploadAttachment": true
}

发起人侧另有 suspend / withdraw / terminate / resubmit 等实例级开关。设计器里逐节点可视化配置。

rulego-bpm 基于 Apache-2.0 许可开源 · gflow 商业授权