跳到主要内容

RPC 资源

启用审批模块后,框架会注册下面六个 RPC 资源。它们全部挂载在 /api 下, 使用 API 中的标准 envelope(resourceactionversionparamsmeta)。这些操作都不是公开接口:调用者必须已认证; 表中列出 RequiredPermission 时还会校验对应权限点。生成的 运行时 API 索引 包含每个请求/响应 DTO 的 完整 JSON 字段清单。

本页使用的约定:

  • 命令式操作(approval/flowapproval/instanceapproval/myapproval/admin)的参数结构体嵌入 api.P,字段从请求的 params 对象解码。
  • CRUD 读操作(approval/categoryapproval/delegation)的搜索结构体嵌入 crud.Sortable(一个 meta 结构体),因此过滤字段从请求的 meta 对象 解码,与 meta.page / meta.sizepage.Pageable)和 meta.sort 并列。
  • 分页响应使用 page.Page[T]pagesizetotalitems
  • 持久化模型在响应中携带标准审计列(idcreatedAtcreatedByupdatedAtupdatedBy),下面的字段表不再重复列出。
  • 枚举词汇(InstanceStatusTaskStatus、节点语义)的定义见 实例运行时流程设计

approval/category

流程分类管理(apv_flow_category)。读操作按租户隔离:super-admin 可见 所有租户,其他调用者只能看到自己租户的数据,无租户时直接拒绝(fail closed)。

Action权限入参出参
find_treeapproval.category.queryCategorySearch(meta)嵌套的 FlowCategory[](填充 children)
createapproval.category.createCategoryParams创建后的 FlowCategory
updateapproval.category.updateCategoryParams更新后的 FlowCategory
deleteapproval.category.delete主键参数(params.id成功

没有 find_tree_options 操作;选项列表请由 find_tree 构建。

CategorySearch(查询过滤,从 meta 解码):

字段类型匹配说明
namestringcontains按分类名称片段过滤
isActiveboolequals按启用状态过滤;省略则两者都匹配
sortOrderSpec[]排序声明(crud.Sortable

CategoryParams(create/update,从 params 解码):

字段类型必填说明
idstring仅 update要更新记录的主键
tenantIdstring所属租户。create 时非 super-admin 会以调用者自己的租户覆盖写入(提交值被忽略);update/delete 时调用者必须对记录的租户有权限
codestring分类业务编码
namestring显示名称
iconstring显示图标标识
parentIdstring父分类 id;null 表示根分类
sortOrderint同级排序权重
isActivebool停用分类仍可查询,宿主通常在选择器中隐藏
remarkstring备注

FlowCategory(响应模型):

字段类型说明
tenantIdstring所属租户
codestring分类业务编码
namestring显示名称
iconstring | null显示图标标识
parentIdstring | null父分类 id
sortOrderint排序权重
isActivebool启用标记
remarkstring | null备注
childrenFlowCategory[]子分类;find_tree 填充,其余场景缺省

approval/delegation

审批委托管理(apv_delegation)。强制所有权:非 super-admin 只能查看、 创建、更新、删除自己作为委托人的记录 —— create 时 delegatorId 以调用者 覆盖写入,update 时钉住原委托人,防止把记录转给他人。

Action权限入参出参
find_pageapproval.delegation.queryDelegationSearch + 分页 metapage.Page[Delegation]
createapproval.delegation.createDelegationParams创建后的 Delegation
updateapproval.delegation.updateDelegationParams更新后的 Delegation
deleteapproval.delegation.delete主键参数(params.id成功

DelegationSearch(查询过滤,从 meta 解码):

字段类型匹配说明
delegatorIdstringequals按委托人过滤(仅 super-admin 有意义 —— 其他人始终被限定为本人)
delegateeIdstringequals按受托人过滤
isActiveboolequals按启用状态过滤
sortOrderSpec[]排序声明

DelegationParams(create/update,从 params 解码):

字段类型必填说明
idstring仅 update要更新记录的主键
delegatorIdstring委托人。非 super-admin create 时以 principal 覆盖写入,update 时钉住原值
delegateeIdstring接收委托任务的用户
flowCategoryIdstring将委托限定到某个流程分类;null 覆盖全部分类
flowIdstring将委托限定到某个流程;null 覆盖全部流程
startsAtDateTime委托生效开始时间
endsAtDateTime委托生效结束时间
isActivebool停用的委托在办理人解析中被忽略
reasonstring委托原因,展示在被委托的任务上

Delegation(响应模型):业务字段与入参一致 —— delegatorIddelegateeIdflowCategoryIdflowIdstartsAtendsAtisActivereason —— 外加审计列。经委托产生的任务会把委托人作为独立的 人员快照携带(见下文 NodeParticipant.delegator)。

approval/flow

流程定义管理:可变的流程行、不可变的已部署版本、面向设计器的图查询。

Action权限入参出参审计
createapproval.flow.createCreateFlowParams创建后的 Flow
deployapproval.flow.deployDeployFlowParams创建的 FlowVersion(draft)
publish_versionapproval.flow.publishPublishVersionParams成功
updateapproval.flow.updateUpdateFlowParams更新后的 Flow
toggle_activeapproval.flow.updateToggleActiveParams成功
get_graphapproval.flow.queryGetGraphParamsFlowGraph
find_flowsapproval.flow.queryFindFlowsParamspage.Page[Flow]
find_versionsapproval.flow.queryFindVersionsParamsFlowVersionSummary[]
find_initiatorsapproval.flow.queryFindInitiatorsParamsFlowInitiator[]

CreateFlowParamscreate):

字段类型必填说明
tenantIdstring所属租户;空值回退为 "default",调用者必须对最终租户有权限
codestring全局唯一的流程业务编码;创建后不可变(start 以它定位流程)
namestring显示名称
categoryIdstring所属 FlowCategory id
iconstring显示图标标识
descriptionstring描述
labelsobject(string→string)宿主自有的选择元数据;按共享 label 规则校验 —— 见下方说明
bindingModestringstandalone(表单数据存审批自己的表)或 business(挂接既有业务行)
businessBindingBusinessBindingConfigbusiness 模式回写目标描述(见下);standalone 流程提交会被拒绝(ErrBindingUnexpected
adminUserIdsstring[]流程管理员(用于 transfer_admin 空办理人处理与管理可见性)
isAllInitiationAllowedbooltrue 允许所有用户发起;false 时只有 initiators 可发起
instanceTitleTemplatestring实例标题的 Go text/template,如 {{.applicantName}}的请假申请;可用绑定:flowNameflowCodeinstanceNoformDataapplicantIdapplicantName(以及嵌套的 flow.name / flow.codeapplicant.id / applicant.name)。留空回退为 流程名-实例编号;解析失败报 ErrInvalidTitleTemplate
initiatorsCreateInitiatorParams[]isAllInitiationAllowedfalse 时允许发起的人(见下)

CreateInitiatorParams 条目:

字段类型必填说明
kindstringuserroledepartment
idsstring[]所选用户 / 角色 / 部门的 id

BusinessBindingConfig

字段类型必填说明
tableNamestring接收审批状态的业务表;按 SQL 安全标识符校验(ErrInvalidBusinessIdentifier)并检查存在性(ErrBindingSchemaInvalid
keyColumnsstring[]定位绑定行的列;必须与某个非空主键或唯一键完全一致(ErrBindingKeyNotUnique
statusColumnstring接收(映射后)实例状态的列
instanceIdColumnstring接收当前实例 id 的列;作为 compare-and-set 栅栏,防止过期实例覆盖新一轮审批的状态
startedAtColumnstring接收实例开始时间的列
finishedAtColumnstring接收实例结束时间的列
statusMappingobject(InstanceStatus→string)把实例状态翻译成宿主业务词汇;缺失条目回退为状态字符串本身(未知键或空值报 ErrBindingStatusMappingInvalid

两个绑定字段指向同一列会报 ErrBindingColumnsConflict。已部署版本会对绑定 做快照,编辑流程的绑定不影响运行在旧版本上的实例。回写生命周期见 业务集成

params.labels 是流程上宿主自有的选择元数据 —— 在 find_flowsmy.find_available_flows 中可按相等过滤(提交的每一对都必须匹配), 在实例详情视图中透出,引擎从不解释其取值。校验为共享的 orm.ValidateLabels 规则:键为字母数字加内部 -/_(不允许点号), ≤ 63 字符;值 ≤ 256 字符,允许空值。update 时 labels 整体替换 —— 省略即清空流程的 labels。

DeployFlowParamsdeploy —— 创建新的 draft 版本):

字段类型必填说明
flowIdstring目标流程
descriptionstring展示在版本列表的版本描述
storageModestringjson(默认;表单数据留在 apv_instance.form_data)或 table(发布时生成专用物理投影表)
flowDefinitionFlowDefinition设计器图文档 —— 节点、边与每个节点的 data;部署时校验(ErrInvalidFlowDesign)。线上传输格式见 流程设计
formSchemaJSON 文档宿主自有的表单设计器文档,原样透传并存储;引擎消费的扁平字段清单在部署时从中推导(见 表单 Schema 与派生字段

PublishVersionParamspublish_version —— 将 draft 版本设为线上版本并归档 前一版本):

字段类型必填说明
versionIdstring要发布的 draft 版本(否则报 ErrVersionNotDraft

UpdateFlowParamsupdate —— 只修改流程行;已部署版本不可变):

字段类型必填说明
flowIdstring要更新的流程
namestring显示名称
iconstring显示图标标识
descriptionstring描述
labelsobject(string→string)整体替换;省略即清空
bindingModestring绑定模式(见 create);修改只影响后续部署
businessBindingBusinessBindingConfigbusiness 模式回写目标(见 create
adminUserIdsstring[]流程管理员
isAllInitiationAllowedbool发起开放性
instanceTitleTemplatestring实例标题模板
initiatorsCreateInitiatorParams[]发起人配置;整体替换

ToggleActiveParamstoggle_active):

字段类型必填说明
flowIdstring目标流程
isActivebool目标状态;停用的流程拒绝发起(ErrFlowNotActive),运行中的实例不受影响

GetGraphParamsget_graph):

字段类型必填说明
flowIdstring要加载图的流程
tenantIdstring可选预过滤;真正的跨租户闸门是调用者的租户权限
versionIdstring显式加载某个版本 —— 设计器从最新部署(无论是否已发布)继续编辑的场景;省略则解析最新已发布版本

get_graph 响应 FlowGraph

字段类型说明
flowFlow可变的流程行(字段见下)
versionFlowVersion解析出的版本,含 flowSchema(部署的 FlowDefinition)、formSchema(宿主文档,原样)与 formFields(推导出的扁平字段清单)
nodesFlowNode[]该版本持久化的节点行 —— 每个节点一行,携带全部已解析的节点配置(kind、执行类型、审批方式、通过规则、回退 / 加签 / 抄送开关、超时配置、分支)。各字段语义见 流程设计
edgesFlowEdge[]持久化的边行:keysourceNodeId / sourceNodeKeytargetNodeId / targetNodeKeysourceHandle(条件分支锚点)

FindFlowsParamsfind_flows):

字段类型必填说明
tenantIdstring租户过滤;非 super-admin 无论如何都被限定在自己租户
categoryIdstring按分类过滤
keywordstring对流程名称做 contains 匹配
isActivebool按启用状态过滤
labelsobject(string→string)label 相等过滤 —— 提交的每一对都必须匹配
bindingModestringstandalonebusiness;按绑定模式过滤
pageint页码(从 1 开始)
pageSizeint每页大小

find_flows 响应 page.Page[Flow]Flow(响应模型):

字段类型说明
tenantIdstring所属租户
categoryIdstring所属分类
codestring唯一流程业务编码(不可变)
namestring显示名称
iconstring | null显示图标标识
descriptionstring | null描述
labelsobject | 缺省宿主自有选择元数据
bindingModestringstandalonebusiness
businessBindingBusinessBindingConfig | 缺省当前回写配置(可变副本;各版本有自己的快照)
adminUserIdsstring[]流程管理员
isAllInitiationAllowedbool发起开放性
instanceTitleTemplatestring实例标题模板
isActivebool启用标记
currentVersionint最新已发布版本号;首次发布前为 0

FindVersionsParams / FindInitiatorsParamsfind_versionsfind_initiators):

字段类型必填说明
flowIdstring要查看的流程
tenantIdstring可选预过滤(跨租户闸门是调用者权限)

find_versions 返回 FlowVersionSummary 条目 —— 不含图文档 (flowSchema / formSchema / formFields)的版本列表,列表本就不渲染 它们。单个版本的完整定义通过 get_graph 携带 params.versionId 获取。

FlowVersionSummary 字段类型说明
idstring版本 id
flowIdstring所属流程
versionint单调递增的版本号
statusstringdraftpublishedarchived
descriptionstring | null版本描述
storageModestringjsontable
publishedAtDateTime | null发布时间
publishedBystring | null发布人用户 id
createdAtDateTime部署时间
createdBystring部署人用户 id

find_initiators 返回 FlowInitiator[]:每条携带 flowIdkinduser / role / department)与 ids(配置的 id 列表)。

approval/instance

实例生命周期命令。每次状态变更都记录在 action log 中;标记「审计」的操作 还会额外捕获框架级 IP / UA / request-id 审计条目。

Action权限入参出参审计
startapproval.instance.startStartParams创建的 Instance
process_taskapproval.task.processProcessTaskParams成功
withdrawapproval.instance.withdrawWithdrawParams成功
resubmitapproval.instance.resubmitResubmitParams成功
add_ccapproval.instance.ccAddCCParams成功
mark_cc_readapproval.instance.ccMarkCCReadParams成功
add_assigneeapproval.task.add_assigneeAddAssigneeParams成功
remove_assigneeapproval.task.remove_assigneeRemoveAssigneeParams成功
urge_taskapproval.task.urgeUrgeTaskParams成功限流:每分钟最多 10

process_task 有意把 approve / reject / transfer / rollback / handle 归在 同一个权限(approval.task.process)下:设计器的节点级开关 (isTransferAllowedisRollbackAllowed 等)已经决定了节点在运行时提供 哪些动作。

StartParamsstart):

字段类型必填说明
tenantIdstring发起所在租户;空值回退为 "default",且调用者必须对流程的租户有权限
flowCodestring要发起流程的业务编码;解析最新已发布版本(ErrFlowNotFound / ErrFlowNotActive / ErrNoPublishedVersion
businessRefstring(≤ 512)business 模式绑定业务行的不透明引用;业务绑定流程必填,除非注册的 BusinessRefProvider 提供(ErrBusinessRefRequired)。默认形状:单键直接取值、复合键为 JSON 对象
formDataobject按字段 key 组织的表单值;按已发布版本的派生字段清单校验(40401 系列),超过 64 KiB 拒绝;未知 key 会被拒绝(approval_form_field_not_defined

申请人身份与条件路由的全局变量在服务端从已认证 principal 解析 (PrincipalDepartmentResolverInstanceGlobalsResolver)—— 绝不接受请求体 提交,否则申请人可以伪造它们来操纵流程走向。

start 响应创建的 Instance

字段类型说明
tenantIdstring所属租户
flowId / flowCode / flowVersionIdstring实例运行所依据的流程与不可变版本快照
titlestring由流程的 instanceTitleTemplate 渲染
instanceNostring人类可读的实例编号
applicantId / applicantNamestring发起时的申请人快照
applicantDepartmentId / applicantDepartmentNamestring | null申请人部门快照
statusstringrunningapprovedrejectedwithdrawnreturnedterminated
currentNodeIdstring | null实例当前停留的节点
finishedAtDateTime | null实例到达终态时写入
businessRefstring | null不透明业务引用(业务绑定流程)
formDataobject提交的表单数据(校验后)
globalsobject发起时宿主提供的全局变量快照;条件求值读取它,保证路由在重复求值间确定
businessProjectionIdstring | 缺省发起时认领的持久回写状态(业务绑定流程)

ProcessTaskParamsprocess_task):

字段类型必填说明
taskIdstring要处理的待办任务;调用者必须是其办理人(ErrNotAssigneeErrTaskNotPending
actionstringapproverejecttransferrollbackhandle(办理节点以 handle 完结;语义同 approve)
opinionstring(≤ 2000)视节点处理意见;节点设置 isOpinionRequired 时必填(ErrOpinionRequired
formDataobject随动作写入的表单更新,按节点字段权限过滤
attachmentsstring[](≤ 20 × ≤ 512)存入 action log 的附件引用
transferToIdstringtransfer转办目标用户;必须非空且不同于操作者(ErrInvalidTransferTarget);仅节点开启 isTransferAllowed 时允许(ErrTransferNotAllowed
targetNodeIdstringrollback回退目标节点;必须是节点 rollbackType 与实例访问轨迹允许的目标之一(ErrInvalidRollbackTargetErrRollbackNotAllowed)。合法目标由 my.get_instance_detailmyTask.rollbackTargets 提供

WithdrawParamswithdraw —— 申请人撤回运行中的实例,或放弃被退回的实例):

字段类型必填说明
instanceIdstring要撤回的实例;调用者必须是申请人(ErrNotApplicant),状态必须允许(ErrWithdrawNotAllowed
reasonstring(≤ 2000)撤回原因,记入 action log

ResubmitParamsresubmit —— 重启被退回或已撤回的实例):

字段类型必填说明
instanceIdstring要重新提交的实例(returned / withdrawn 之外报 ErrResubmitNotAllowed
formDataobject表单更新,与实例现有 form data 合并后校验;合并后的负载校验同 start

AddCCParams / MarkCCReadParamsadd_ccmark_cc_read):

字段类型必填说明
instanceIdstring目标实例
ccUserIdsstring[](1–50)add_cc要抄送的用户;实例必须正在某个节点上运行(ErrInstanceCompleted),调用者必须是当前节点的办理人(ErrNotAssignee);仅当前节点开启 isManualCcAllowed 时允许(ErrManualCcNotAllowed

mark_cc_read 会把调用者在该实例上的所有未读抄送记录标记已读 —— 自助已读回执,因此不做审计。

AddAssigneeParamsadd_assignee —— 动态加签):

字段类型必填说明
taskIdstring调用者自己的待办任务
userIdsstring[](1–50)要添加的用户
addTypestringbefore(新办理人先办理,原任务等待)、after(原办理人完成后再办理)或 parallel(并入当前并行组)。必须在节点的 addAssigneeTypes 内(ErrAddAssigneeNotAllowed / ErrInvalidAddAssigneeType

RemoveAssigneeParamsremove_assignee):

字段类型必填说明
taskIdstring要取消的同组任务;必须是调用者本轮访问中仍可办理的同组任务,且不能是最后一个有效办理人(ErrLastAssigneeRemoval),节点须允许减签(ErrRemoveAssigneeNotAllowed)。可减签对象由 myTask.removableAssignees 提供

UrgeTaskParamsurge_task):

字段类型必填说明
taskIdstring要催办的待办任务
messagestring(≤ 500)随通知投递的催办消息

催办遵守节点按任务粒度的 urgeCooldownMinutes(过于频繁时报 40601; 非正配置默认为 30 分钟),此外该操作还有调用者每分钟 10 次的限流。 申请人和任何曾在该实例上持有任务的人(办理人或委托人)都可以对任意待办任务发起催办;仅抄送查看者不能催办。

approval/my

面向当前用户的自助查询。这些操作不声明 RequiredPermission —— 任何已认证 principal 都可调用;每个查询都在服务端锚定到调用者身份。

Action入参出参
find_available_flowsFindAvailableFlowsParamspage.Page[AvailableFlow]
get_start_formGetStartFormParamsStartForm
find_initiatedFindInitiatedParamspage.Page[InitiatedInstance]
find_pending_tasksFindPendingTasksParamspage.Page[PendingTask]
find_completed_tasksFindCompletedTasksParamspage.Page[CompletedTask]
find_cc_recordsFindCCRecordsParamspage.Page[CCRecord]
get_pending_countsGetPendingCountsParamsPendingCounts
get_instance_detailGetInstanceDetailParamsInstanceDetail

请求参数(全部从 params 解码):

Action字段类型必填说明
find_available_flowstenantIdstring租户过滤
keywordstring对流程名称做 contains 匹配
labelsobjectlabel 相等过滤 —— 每一对都必须匹配
page / pageSizeint分页
get_start_formtenantIdstring流程所在租户
flowCodestring要加载发起表单的流程
find_initiatedtenantIdstring租户过滤
statusstring实例状态过滤(running / approved / rejected / withdrawn / returned / terminated
keywordstring对实例标题做 contains 匹配
page / pageSizeint分页
find_pending_taskstenantIdstring租户过滤
page / pageSizeint分页
find_completed_taskstenantIdstring租户过滤
page / pageSizeint分页
find_cc_recordstenantIdstring租户过滤
isReadbool已读状态过滤
page / pageSizeint分页
get_pending_countstenantIdstring租户过滤
get_instance_detailinstanceIdstring要加载的实例;调用者必须是参与者 —— 申请人、(曾经的)办理人、委托人或抄送对象(ErrAccessDenied

响应 DTO(approval/my 包):

AvailableFlow —— 一条调用者可发起的流程:

字段类型说明
flowId / flowCode / flowNamestring流程标识
flowIconstring | 缺省显示图标
descriptionstring | 缺省流程描述
labelsobject | 缺省宿主自有选择元数据
categoryId / categoryNamestring所属分类标识

StartForm —— 流程的提交前视图。加载受到与发起实例完全一致的 闸门约束(流程启用、发起权限、存在已发布版本),因此能渲染出的表单必然 对应一个可发起的流程:

字段类型说明
flowId / flowCode / flowNamestring渲染发起页头部所需的流程标识
flowIconstring | 缺省显示图标
descriptionstring | 缺省流程描述
versionIdstring表单所属的已发布版本
versionint已发布版本号
formSchemaJSON 文档 | 缺省宿主表单设计器文档,原样返回

InitiatedInstance —— 一条调用者提交的实例:

字段类型说明
instanceId / instanceNo / titlestring实例标识
flowNamestring流程显示名称
flowIconstring | 缺省流程图标
labelsobject | 缺省流程的宿主自有选择元数据
statusstring实例状态
currentNodeNamestring | 缺省当前进行中节点的名称
createdAtDateTime提交时间
finishedAtDateTime | 缺省完成时间

PendingTask —— 一条等待调用者处理的任务:

字段类型说明
taskIdstring提交 process_task 时使用的任务 id
instanceId / instanceTitle / instanceNostring所属实例标识
flowNamestring流程显示标识
flowIconstring | 缺省流程图标
applicantUserInfo申请人快照
nodeNamestring任务所属节点
createdAtDateTime任务创建时间
deadlineDateTime | 缺省节点配置了超时时的截止时间
isTimeoutbool是否已超期

CompletedTask —— 一条调用者已处理的任务:标识字段与 PendingTask 相同(无 createdAt),另有 status(处理结果——恰好 approvedrejectedhandledtransferredrolled_back)、instanceStatus(实例当前状态)、 labels(流程的宿主自有选择元数据)与 finishedAt;没有 deadline / isTimeout

CCRecord —— 一条发给调用者的抄送通知:

字段类型说明
ccRecordIdstring抄送记录 id
instanceId / instanceTitle / instanceNostring所属实例标识
flowNamestring流程显示标识
flowIconstring | 缺省流程图标
applicantUserInfo申请人快照
nodeNamestring | 缺省产生抄送的节点;实例级抄送时缺省
isReadbool已读回执状态
createdAtDateTime投递时间

PendingCounts —— 角标计数:pendingTaskCount(待办任务数)与 unreadCcCount(未读抄送数)。

InstanceDetail —— 自助详情视图。每个顶层字段对应一个可渲染的关注点:

字段类型说明
instanceInstanceInfo运行时状态(见下)
formSchemaJSON 文档 | 缺省版本锁定的宿主表单设计器文档,原样返回 —— 实例提交时所依据的 schema
timelineTimelineEntry[]实例实际走过路径的逐节点记录(见下)
flowGraphInstanceFlowGraphReact Flow 就绪、标注进度的只读图(见下)
availableActionsstring[]面向当前查看者的动作提示(见下)
fieldPermissionsobject(字段→权限)查看者维度的字段交互投影:visible / editable / hidden / required,对每个顶层表单字段都物化;客户端原样应用,且 instance.formData 已剥除查看者无权看到的字段(见 节点字段权限
myTaskViewerTask | null查看者自己的可操作上下文(见下)

InstanceInfo

字段类型说明
instanceId / instanceNo / titlestring实例标识
flowId / flowCode / flowName / flowIconstring流程显示标识,查询时从可变流程行读取
labelsobject | 缺省流程的宿主自有选择元数据 —— 与 flowName 一样属于显示标识,不是版本锁定的快照
applicantUserInfo申请人快照
statusstring实例状态
currentNodeId / currentNodeNamestring | 缺省当前进行中的节点
businessRefstring | 缺省不透明业务引用(业务绑定流程)
formDataobject | 缺省表单数据,已剥除查看者无权看到的字段
createdAt / finishedAtDateTime生命周期时间戳

ViewerTask —— process_task 应指向的待办任务,加上客户端构建 操作 UI 所需的节点级配置,客户端无需重新推导引擎语义。查看者在该实例上 没有待办任务时为 null

字段类型说明
taskIdstring待办任务
nodeIdstring任务所在节点
isOpinionRequiredbool镜像节点配置:设置时 approve / reject 必须携带非空意见
addAssigneeTypesstring[]节点允许的加签位置(before / after / parallel);不允许加签时为空
rollbackTargets{nodeId, name}[]合法回退目标,按节点回退配置与实例访问轨迹解析,与回退命令的校验完全一致;不允许回退时为空
removableAssignees{taskId, assignee, status}[]查看者可减签的同组任务(statuspending / waiting),与减签命令的授权完全一致:本轮访问中仍可办理、排除查看者本人的同组任务;节点不允许减签时为空

RollbackTarget —— 一个合法的回退目标:

字段类型说明
nodeIdstring目标节点 id
namestring节点显示名称

RemovableAssignee —— 一个可减签的同组任务:

字段类型说明
taskIdstring同组任务 id
assigneeUserInfo办理人快照
statusstring任务状态(pending / waiting

availableActions 是查询层的 UI 提示。对申请人:实例可转入 withdrawn 时包含 withdraw,实例处于退回或已撤回状态时包含 resubmit。对待办任务: 办理节点为 handle,否则为 approve,然后是 reject,再加上当前节点允许 时的 transferrollbackadd_assigneeremove_assigneeadd_cc。 实例存在任何待办任务 时还会包含 urge;申请人和任何曾在该实例上持有任务的人(办理人或委托人)都可以催办;仅抄送查看者不能。命令处理器仍会做自己的校验。

approval/admin

管理端管理与可观测能力。对所有列表和指标查询:非 super-admin 提交的 tenantId 覆盖会被忽略,始终过滤到自己的租户;super-admin 可传 tenantId 过滤单个租户,或省略以获得跨租户视图。

Action权限入参出参审计
find_instancesapproval.instance.queryAdminFindInstancesParamspage.Page[Instance]
find_tasksapproval.task.queryAdminFindTasksParamspage.Page[Task]
get_instance_detailapproval.instance.detailAdminGetInstanceDetailParamsInstanceDetail
find_action_logsapproval.action_log.queryAdminFindActionLogsParamspage.Page[ActionLog]
get_metricsapproval.metrics.queryAdminGetMetricsParamsMetrics
find_business_projectionsapproval.binding.queryAdminFindBusinessProjectionsParamspage.Page[BusinessProjection]
terminate_instanceapproval.instance.terminateAdminTerminateInstanceParams成功
reassign_taskapproval.task.reassignAdminReassignTaskParams成功
retry_business_projectionapproval.binding.retryAdminRetryBusinessProjectionParams成功

请求参数(全部从 params 解码):

Action字段类型必填说明
find_instancestenantIdstring租户过滤(仅 super-admin 生效,见上)
applicantIdstring按申请人过滤
statusstring实例状态过滤
flowIdstring按流程过滤
keywordstring对实例标题做 contains 匹配
page / pageSizeint分页
find_taskstenantIdstring租户过滤
assigneeIdstring按办理人过滤
instanceIdstring按所属实例过滤
statusstring任务状态过滤(waiting / pending / approved / rejected / handled / transferred / rolled_back / canceled / removed / skipped
page / pageSizeint分页
get_instance_detailinstanceIdstring要加载的实例
find_action_logsinstanceIdstring要分页浏览审计轨迹的实例
tenantIdstring租户过滤
page / pageSizeint分页
get_metricstenantIdstring租户范围(super-admin 可省略以跨租户)
find_business_projectionstenantIdstring租户过滤
statusstring投影状态过滤:pendingprocessingappliedfailed
page / pageSizeint分页
terminate_instanceinstanceIdstring要强制终止的非终态实例(running / returned / withdrawn;已处于终态时报 ErrTerminateNotAllowed
reasonstring(≤ 2000)终止原因,记入 action log
reassign_tasktaskIdstring要改派的待办任务
newAssigneeIdstring替换的办理人(无效时报 ErrInvalidTransferTarget
reasonstring(≤ 2000)改派原因
retry_business_projectionprojectionIdstring要立即重试的投影(不存在时报 ErrBindingProjectionNotFound

响应 DTO(approval/admin 包):

Instance —— 管理列表中的一条实例:

字段类型说明
instanceId / instanceNo / titlestring实例标识
tenantIdstring所属租户
flowId / flowNamestring流程标识
applicantUserInfo申请人快照
statusstring实例状态
currentNodeNamestring | 缺省当前进行中的节点
createdAt / finishedAtDateTime生命周期时间戳

Task —— 管理列表中的一条任务:

字段类型说明
taskIdstring任务 id
instanceId / instanceTitlestring所属实例标识
flowNamestring流程显示名称
nodeNamestring任务所属节点
assigneeUserInfo办理人快照
statusstring任务状态
createdAtDateTime创建时间
deadlineDateTime | 缺省超时截止时间
finishedAtDateTime | 缺省完成时间

InstanceDetail —— my.get_instance_detail 的管理端对应视图,但没有查看者 维度的字段(availableActions / fieldPermissions / myTask):instanceInstanceDetailInfo)、formSchema(原样宿主文档)、timelineTimelineEntry[])与 flowGraphInstanceFlowGraph)。 InstanceDetailInfomy.InstanceInfo 一致,另加 tenantIdflowVersionId,且没有 flowIcon;其 formData 不做过滤。

InstanceDetailInfo —— 管理端实例详情载荷:

字段类型说明
instanceId / instanceNo / titlestring实例标识
tenantIdstring所属租户
flowId / flowCode / flowNamestring流程标识
flowVersionIdstring实例运行所依据的版本快照
labelsobject | 缺省流程的宿主自有选择元数据
applicantUserInfo申请人快照
statusstring实例状态
currentNodeId / currentNodeNamestring | 缺省当前进行中的节点
businessRefstring | 缺省不透明业务引用(业务绑定流程)
formDataobject | 缺省当前表单数据(不做过滤 —— 管理端视图)
createdAt / finishedAtDateTime生命周期时间戳

ActionLog —— 一条审计记录。人员引用统一为动作发生时捕获的 UserInfo 快照:

字段类型说明
logIdstring日志条目 id
actionstringActionType 字符串:submitapprovehandlerejecttransferwithdrawcancelrollbackadd_assigneeremove_assigneeexecuteresubmitreassignterminateadd_cc
nodeIdstring | 缺省动作发生的节点;实例级动作缺省
taskIdstring | 缺省动作针对的任务
operatorUserInfo操作者快照
transferToUserInfo | 缺省转办 / 改派接收人
rollbackToNodeIdstring | 缺省回退目标节点
addedAssignees / removedAssigneesUserInfo[] | 缺省动态加签 / 减签变更
ccUsersUserInfo[] | 缺省手动抄送的用户
opinionstring | 缺省动作意见 / 原因
attachmentsstring[] | 缺省附件引用
createdAtDateTime动作时间

Metrics —— 面向仪表盘与运维告警的引擎健康聚合:

字段类型说明
tenantIdstring快照的租户范围;跨租户快照(仅 super-admin)时为空
capturedAtDateTime指标物化时刻
instanceCountsobject(状态→int)InstanceStatus 字符串分组的实例计数
taskCountsobject(状态→int)TaskStatus 字符串分组的任务计数
timeoutTaskCountint已超期的待办任务数
avgCompletionSecondsfloat全部终态实例的端到端平均时长(createdAtfinishedAt);-1 表示「尚无完成的实例」
pendingBindingFailuresint最近一次写入失败、已排期重试的投影目标数
businessProjectionCountsobject(状态→int)按收敛状态分组的持久投影行数(pending / processing / applied / failed
pendingBusinessProjectionsint期望修订尚未应用的最终一致投影数

BusinessProjection —— 一条被绑定业务记录的运维收敛状态(回写模型见 业务集成):

字段类型说明
projectionIdstring投影行 id
tenantIdstring所属租户
flowId / flowVersionIdstring产生期望状态的流程与版本
ownerInstanceIdstring生命周期产生期望状态的实例
appliedOwnerInstanceIdstring | 缺省状态最近一次成功写入业务行的实例
businessTablestring目标业务表
recordKeyJSON 对象定位绑定行的键列取值
consistencystring配置的绑定一致性模式(synchronous / eventual
desiredStatusstring等待回写的实例状态
desiredStartedAtDateTime等待回写的生命周期时间戳
desiredFinishedAtDateTime | 缺省等待回写的生命周期时间戳
desiredRevision / appliedRevisionint单调修订号;两者相等即已收敛
statusstring收敛状态:pendingprocessingappliedfailed
attemptCountint已尝试写入次数
nextAttemptAtDateTime | 缺省下次排期重试时间
leaseUntilDateTime | 缺省processing 期间的 worker 租约到期时间
lastErrorstring | 缺省最近一次写入失败信息
appliedAtDateTime | 缺省期望状态最近一次应用时间
updatedAtDateTime最近状态变更时间

共享投影类型

详情视图(my.get_instance_detailadmin.get_instance_detail)共享公开 approval 包中的以下类型。

UserInfo —— 所有出现人员的地方使用的统一人员快照:

字段类型说明
idstring用户 id
namestring动作发生时的显示名称
departmentId / departmentNamestring | 缺省动作发生时的部门快照

TimelineEntry —— 实例时间线的一步:实例实际走过路径的按时间、逐节点 记录。条件分支互斥,走过的路径永远是一条线;回退后重新进入的节点会产生 第二条记录。条目终止于当前进行中的节点 —— 不预测未到达的节点:

字段类型说明
kindstring节点访问为 startapprovalhandleccend;实例级里程碑为 withdrawterminate。结构性节点 condition 从不出现;end visit 保留为时间线收尾标记
nodeIdstring | 缺省被访问的节点;里程碑条目缺省
namestring节点显示名称(或里程碑动作名)
statusstring节点访问状态:activepassedrejectedreturnedcanceled
executionTypestring节点执行类型(manual / auto_pass / auto_reject
approvalMethodstringsequential / parallel(审批节点)
passRulestringall / any / ratio(审批节点)
passRatiodecimal | 缺省passRuleratio 时的阈值
participantsNodeParticipant[]审批 / 办理节点上每个任务一条(见下)
ccRecipientsCCRecipient[]已投递的抄送:userUserInfo)加 readAt 已读回执
activitiesActivity[]节点上的旁路动作(见下);里程碑条目仅含一条描述谁、为何关闭实例的活动
startedAt / finishedAtDateTime访问区间;进行中时 finishedAt 缺省

NodeParticipant —— 一次访问中一位办理人的参与情况:

字段类型说明
taskIdstring任务标识(任务操作的目标)
userUserInfo办理人快照
delegatorUserInfo | 缺省任务经委托到达时的委托人
statusstring任务状态原样
deadlineDateTime | 缺省任务截止时间
isTimeoutbool任务由超时扫描器裁决或升级
opinion / attachments / actionTime从完结该任务的 action log 融合出的结果明细
transferToUserInfo | 缺省任务被转办时的接收人

Activity —— 节点上记录的旁路动作:action 携带 ActionType 字符串 (transferrollbackadd_assigneeremove_assigneeadd_ccreassignexecutesubmitresubmitwithdrawterminate), 外加催办记录的 urgeoperator 是操作者;opinion 是动作自由文本 (转办理由、撤回原因、催办消息);target 指向定向动作的对方(被催办的 办理人);transferTorollbackToNodeId / rollbackToNodeNameaddedAssigneesremovedAssigneesccUsersattachments 携带各动作的 明细,createdAt 是动作时间。决定本身(approve / handle / reject)不会在 活动中重复 —— 它们记录在做出决定的参与者上。

InstanceFlowGraph —— React Flow 就绪、只读的实例流程定义投影,标注运行 进度。nodesedges 直接映射 React Flow 的节点 / 边形状,唯节点种类 保留在 kind 字段(React Flow 的 type 属于客户端):

字段类型说明
nodes[].idstringReact Flow 标识 —— 位置与边引用的设计时节点 key
nodes[].nodeIdstring持久化流程节点 id —— 即 actionLog.nodeId / rollbackToNodeId 携带、process_task 回退 API 期望的 targetNodeId,客户端可据此映射并直接驱动回退
nodes[].kindstring节点种类(start / approval / handle / condition / cc / end
nodes[].position{x, y}设计器坐标
nodes[].dataFlowGraphNodeData节点标签、审批语义、进度 statuspending / active / passed / rejected / returned / canceled),以及按遍历顺序跨访问聚合的 participants / ccRecipients / activities,加 startedAt / finishedAt 区间
edges[]{id, source, target, sourceHandle}按 id 连接节点的 React Flow 边

错误面

可导入的 approval 包导出四个普通 Go 哨兵错误。它们可用 errors.Is 识别,但不是 result.Error 值,本身不携带 API code 或 HTTP 状态。

错误来源包含义
approval.ErrCrossTenantAccessapproval非 super-admin 调用者尝试跨租户访问
approval.ErrInvalidBusinessIdentifierapproval业务表 / 字段标识符未通过 SQL 标识符白名单
approval.ErrUnknownNodeKindapprovalNodeDefinition.ParseData 遇到不支持的 kind
approval.ErrNodeDataUnmarshalapprovalNodeDefinition.ParseData 无法解码节点 data

内置审批资源通过标准 API envelope 返回模块自有的 result.Error。这些值 位于 internal 包中,宿主应用应把下面的 code/message 对当作公开线上契约, 而不是导入内部 Go 符号。

CodeCode 常量错误值i18n message key说明
40001ErrCodeFlowNotFoundErrFlowNotFoundapproval_flow_not_found流程查找失败
40002ErrCodeFlowNotActiveErrFlowNotActiveapproval_flow_not_active流程已停用
40003ErrCodeNoPublishedVersionErrNoPublishedVersionapproval_no_published_version流程没有已发布版本
40004ErrCodeVersionNotDraftErrVersionNotDraftapproval_version_not_draft操作要求 draft 版本
40005ErrCodeInvalidFlowDesignErrInvalidFlowDesignapproval_invalid_flow_design图或节点设计校验失败
40006ErrCodeFlowCodeExistsErrFlowCodeExistsapproval_flow_code_exists流程编码重复
40007ErrCodeVersionNotFoundErrVersionNotFoundapproval_version_not_found流程版本查找失败
40008ErrCodeInvalidBusinessIdentifierErrInvalidBusinessIdentifierapproval_invalid_business_identifier业务表 / 字段标识符校验失败
40009ErrCodeInvalidTitleTemplateErrInvalidTitleTemplateapproval_invalid_title_template实例标题模板解析失败
40010ErrCodeInvalidFormDesignErrInvalidFormDesignapproval_invalid_form_design表单 schema 设计期校验失败
40011ErrCodeBindingIncompleteErrBindingIncompleteapproval_binding_incomplete业务绑定缺少必需的表 / 键 / 状态 / 实例 id 字段
40012ErrCodeInvalidBindingModeErrInvalidBindingModeapproval_invalid_binding_mode流程绑定模式不在枚举内
40013ErrCodeInvalidInitiatorKindErrInvalidInitiatorKindapproval_invalid_initiator_kind流程发起人类型不在枚举内
40014ErrCodeInvalidStorageModeErrInvalidStorageModeapproval_invalid_storage_modedeploy 请求了 json / table 之外的存储模式
40015未使用(原流程绑定锁);该编码不会被复用
40016ErrCodeBindingColumnsConflictErrBindingColumnsConflictapproval_binding_columns_conflict两个业务绑定字段指向同一列
40017ErrCodeBindingUnexpectedErrBindingUnexpectedapproval_binding_unexpectedstandalone 流程提交了业务绑定
40018ErrCodeBindingSchemaInvalidErrBindingSchemaInvalidapproval_binding_schema_invalid配置的绑定表或列在主库中不存在
40019ErrCodeBindingKeyNotUniqueErrBindingKeyNotUniqueapproval_binding_key_not_unique键列没有对应一个完整的非空主键或唯一键
40020ErrCodeBindingStatusMappingInvalidErrBindingStatusMappingInvalidapproval_binding_status_mapping_invalid状态映射包含未知状态或映射为空值
40021ErrCodeInvalidFlowLabelErrInvalidFlowLabelapproval_invalid_flow_label流程 label 键会无声破坏 JSON 或宿主工具
40022ErrCodeInitiatorsNotAllowedErrInitiatorsNotAllowedapproval_initiators_not_allowedisAllInitiationAllowed=trueinitiators 不能同时存在
40023ErrCodeInitiatorsRequiredErrInitiatorsRequiredapproval_initiators_required受限发起必须至少有一条 ids 非空的发起人规则
40101ErrCodeInstanceNotFoundErrInstanceNotFoundapproval_instance_not_found实例查找失败
40102ErrCodeInstanceCompletedErrInstanceCompletedapproval_instance_completed实例已经完结
40103ErrCodeNotAllowedInitiateErrNotAllowedInitiateapproval_not_allowed_initiate调用者不能发起该流程
40104ErrCodeWithdrawNotAllowedErrWithdrawNotAllowedapproval_withdraw_not_allowed当前状态不允许撤回
40105ErrCodeResubmitNotAllowedErrResubmitNotAllowedapproval_resubmit_not_allowed当前状态不允许重新提交
40106ErrCodeInvalidInstanceTransitionErrInvalidInstanceTransitionapproval_invalid_instance_transition实例状态迁移非法
40107ErrCodeBusinessRefRequiredErrBusinessRefRequiredapproval_business_ref_required业务绑定流程发起时缺少业务引用
40108ErrCodeBindingTargetBusyErrBindingTargetBusyapproval_binding_target_busy业务记录已被未完结的审批实例占用
40109ErrCodeInvalidBusinessRefErrInvalidBusinessRefapproval_invalid_business_ref业务引用无法解析为配置的记录键
40110ErrCodeBindingProjectionNotFoundErrBindingProjectionNotFoundapproval_binding_projection_not_found投影查找失败(管理端重试)
40201ErrCodeTaskNotFoundErrTaskNotFoundapproval_task_not_found任务查找失败
40202ErrCodeTaskNotPendingErrTaskNotPendingapproval_task_not_pending任务不是待处理状态
40203ErrCodeNotAssigneeErrNotAssigneeapproval_not_assignee调用者不是任务办理人
40204ErrCodeInvalidTaskTransitionErrInvalidTaskTransitionapproval_invalid_task_transition任务状态迁移非法
40205ErrCodeRollbackNotAllowedErrRollbackNotAllowedapproval_rollback_not_allowed回退被禁用或此处不可用
40206ErrCodeAddAssigneeNotAllowedErrAddAssigneeNotAllowedapproval_add_assignee_not_allowed动态加签被禁用
40207ErrCodeTransferNotAllowedErrTransferNotAllowedapproval_transfer_not_allowed转办被禁用
40208ErrCodeOpinionRequiredErrOpinionRequiredapproval_opinion_required必填意见为空
40209ErrCodeManualCcNotAllowedErrManualCcNotAllowedapproval_manual_cc_not_allowed手动抄送被禁用
40210ErrCodeRemoveAssigneeNotAllowedErrRemoveAssigneeNotAllowedapproval_remove_assignee_not_allowed动态减签被禁用
40211ErrCodeInvalidAddAssigneeTypeErrInvalidAddAssigneeTypeapproval_invalid_add_assignee_typeaddType 不是 beforeafterparallel 之一
40212ErrCodeNotApplicantErrNotApplicantapproval_not_applicant调用者不是申请人
40213ErrCodeInvalidRollbackTargetErrInvalidRollbackTargetapproval_invalid_rollback_target回退目标不被允许
40214ErrCodeLastAssigneeRemovalErrLastAssigneeRemovalapproval_last_assignee_removal减签将导致没有有效办理人
40215ErrCodeInvalidTransferTargetErrInvalidTransferTargetapproval_invalid_transfer_target转办或改派目标非法
40216ErrCodeNoUsersSpecifiedErrNoUsersSpecifiedapproval_no_users_specified用户列表操作没有收到目标用户
40301ErrCodeNoAssigneeErrNoAssigneeapproval_no_assignee无法解析出办理人
40302ErrCodeAssigneeResolveFailedErrAssigneeResolveFailedapproval_assignee_resolve_failed办理人解析器执行失败
40401ErrCodeFormValidationFailedErrFormValidationFailedapproval_form_validation_failed通用表单校验失败
40401ErrCodeFormValidationFailedErrFormDataTooLargeapproval_form_data_too_large同一编码;JSON 编码后的 formData 超过 64 KiB
40401ErrCodeFormValidationFailed动态表单校验 result.Errapproval_form_field_not_definedapproval_form_field_requiredapproval_form_field_must_be_stringapproval_form_field_must_be_numberapproval_form_field_must_be_integerapproval_form_field_min_lengthapproval_form_field_max_lengthapproval_form_field_invalid_validationapproval_form_field_pattern_mismatchapproval_form_field_min_valueapproval_form_field_max_valueapproval_form_field_emptyapproval_form_field_invalid_file_itemapproval_form_field_must_be_fileapproval_form_field_invalid_valueapproval_form_field_must_be_row_listapproval_form_field_must_be_row_objectapproval_form_field_min_rowsapproval_form_field_max_rowsapproval_form_field_table_cell字段级校验消息为动态构造
40601ErrCodeUrgeCooldown动态催办 result.Errapproval_urge_too_frequent无静态哨兵;消息用 minutes 渲染;非正的 urgeCooldownMinutes 默认 30 分钟
40701ErrCodeAccessDeniedErrAccessDeniedapproval_access_denied调用者缺少审批域访问权
40702ErrCodeTerminateNotAllowedErrTerminateNotAllowedapproval_terminate_not_allowed当前实例状态不允许终止

ErrEventRouteNotTransactionalErrTenantNotResolved 等启动与租户解析 诊断错误位于 internal/approval/... 下;它们不是可导入的公开 Go API,但事件 路由或租户 principal 配置有误时,运维人员可能在包装后的报错信息里看到它们。


下一步:流程设计 了解 deploy 背后的设计器传输格式,或 实例运行时 了解实例动作背后的生命周期语义。