跳到主要内容

审批模块

approval 模块提供完整的工作流引擎,用于构建基于审批的业务流程。支持可视化流程设计(兼容 React Flow)、多级审批链、条件分支、并行审批、委托、回退和事务性事件发布。

架构概览

流程分类 → 流程 → 流程版本 → 节点 + 边

实例 → 任务 → 操作日志
概念数据表说明
流程分类apv_flow_category流程的层级分组
流程apv_flow工作流定义(如"请假申请")
流程版本apv_flow_version版本快照,包含节点、边和表单 schema
流程节点apv_flow_node工作流中的一个步骤
流程边apv_flow_edge节点之间的有向连接
实例apv_instance流程的运行实例
任务apv_task分配给用户的审批/办理任务
操作日志apv_action_log所有操作的审计追踪

配置

[vef.approval]
auto_migrate = true
outbox_relay_interval = 5
outbox_max_retries = 10
outbox_batch_size = 100

详见配置参考

绑定模式

模式常量说明
独立BindingStandalone表单数据存储在审批模块自有表中
业务BindingBusiness关联到已有的业务数据表

业务绑定通过 BusinessTableBusinessPkFieldBusinessTitleFieldBusinessStatusField 将审批流程与业务表关联。

节点类型

节点类型常量说明
开始NodeStart工作流入口
审批NodeApproval需要审批人执行审批动作
办理NodeHandle需要处理人执行办理动作
条件NodeCondition基于条件进行分支
抄送NodeCC向指定用户发送通知
结束NodeEnd工作流终点

审批方式

当节点有多个审批人时:

方式常量行为
顺序ApprovalSequential审批人按顺序逐个处理
并行ApprovalParallel审批人同时处理

通过规则(并行模式)

规则常量行为
全部PassAll所有审批人必须同意
任意PassAny至少一人同意即通过
比例PassRatio达到一定比例即通过
一票否决PassAnyReject任何一人拒绝即失败

审批人类型

类型常量说明
指定用户AssigneeUser特定用户
角色AssigneeRole拥有某角色的用户
部门AssigneeDepartment部门负责人
申请人本人AssigneeSelf申请人自己
直接上级AssigneeSuperior直接上级
部门领导链AssigneeDepartmentLeader多级主管链
表单字段AssigneeFormField由表单字段值决定

实例生命周期

提交 → 运行中 → 同意/拒绝 → 已同意/已拒绝
→ 撤回 → 已撤回
→ 回退 → 已退回
→ 终止 → 已终止
→ 重新提交 → 运行中(再次)

实例状态

状态常量是否终态
运行中InstanceRunning
已同意InstanceApproved
已拒绝InstanceRejected
已撤回InstanceWithdrawn
已退回InstanceReturned
已终止InstanceTerminated

任务状态

状态常量是否终态
等待中TaskWaiting
待处理TaskPending
已同意TaskApproved
已拒绝TaskRejected
已办理TaskHandled
已转交TaskTransferred
已回退TaskRolledBack
已取消TaskCanceled
已移除TaskRemoved
已跳过TaskSkipped

操作类型

操作常量说明
提交ActionSubmit发起新实例
同意ActionApprove审批通过
办理ActionHandle完成办理任务
拒绝ActionReject审批拒绝
转交ActionTransfer转交给其他用户
撤回ActionWithdraw申请人撤回
取消ActionCancel取消任务
回退ActionRollback退回到上一节点
加签ActionAddAssignee动态添加审批人
减签ActionRemoveAssignee移除审批人
重新提交ActionResubmit重新提交已退回的实例
改派ActionReassign管理员改派任务
强制终止ActionTerminate管理员强制终止

回退配置

属性可选值
RollbackTypenonepreviousstartanyspecified
RollbackDataStrategyclear(重置表单)、keep(保留数据)

空审批人处理

当节点找不到审批人时:

操作常量
自动通过EmptyAssigneeAutoPass
转交管理员EmptyAssigneeTransferAdmin
转交上级EmptyAssigneeTransferSuperior
转交申请人EmptyAssigneeTransferApplicant
转交指定人EmptyAssigneeTransferSpecified

超时处理

操作常量行为
无操作TimeoutActionNone仅标记超时
自动通过TimeoutActionAutoPass自动审批通过
自动拒绝TimeoutActionAutoReject自动审批拒绝
发送通知TimeoutActionNotify仅发送通知
转交管理员TimeoutActionTransferAdmin转交给节点管理员

表单数据存储

模式常量存储位置
JSONStorageJSONapv_instance.form_data(JSONB 列)
数据表StorageTable动态表 apv_form_data_{flow_code}

事件发件箱

审批模块使用事务性发件箱模式实现可靠的事件发布。事件在审批操作的同一事务中写入 apv_event_outbox,然后异步中继。

委托

用户可以将审批权限委托给他人:

type Delegation struct {
DelegatorID string // 委托人
DelegateeID string // 被委托人
FlowCategoryID *string // 可选:限定分类
FlowID *string // 可选:限定特定流程
StartTime timex.DateTime // 委托开始时间
EndTime timex.DateTime // 委托结束时间
IsActive bool
}

流程定义(兼容 React Flow)

FlowDefinition 结构体兼容 React Flow 的 JSON 格式:

type FlowDefinition struct {
Nodes []NodeDefinition `json:"nodes"`
Edges []EdgeDefinition `json:"edges"`
}

实例编号生成

实现 InstanceNoGenerator 接口来自定义实例编号:

type InstanceNoGenerator interface {
Generate(ctx context.Context, flowCode string) (string, error)
}