审批、任务与协作
审批协作覆盖用户处理任务时的全部动作,包括通过、驳回、转办、委派、协办、加签、减签、退回、撤回已办、催办和动态抄送。入口主要是「待我审批」「我已办」「抄送我的」「我的申请」和实例详情。
待办列表
「待我审批」按任务组织:同一实例的多条并行待办(如并行会签、加签)各占一行,可独立勾选和处理;列表总数与行数同口径。批量勾选以任务为粒度,提交前会拉取最新列表做陈旧检查,状态已变化的任务被剔除并提示刷新。
新待办通过 WS 实时推送并刷新列表缓存(见下文)。
待办处理
| 操作 | 说明 |
|---|---|
| 通过 | 当前任务通过;按审批方式判断是否推进节点 |
| 驳回 | 当前任务驳回;按按钮跳转配置或节点驳回策略处理 |
| 转办 | 把当前任务转给目标用户,当前处理人退出任务 |
| 委派 | 目标用户先给出建议,再回到最早委派人最终确认 |
| 加签 | 临时增加审批人,可前加签、后加签或并加签 |
| 减签 | 移除由加签产生且仍可处理的任务 |
| 退回 | 退回前序审批/办理节点 |
| 催办 | 对待处理任务发送提醒 |
| 协办 | 邀请其他用户提供意见,不代替审批 |
| 撤回已办 | 撤回本人已通过 / 驳回的正式意见;实例须仍运行,后续节点和补充审批不能已有正式处理。原任务保留意见与签名并增加「已撤回」标记,活动任务作废为 skipped(注释 [撤回重审] 原审批链作废),清理活动 Token 后回到该节点建立新的激活轮次与任务 |
| 修改可编辑字段 | 节点表单权限含「可编辑」字段时,处理人可在详情中修改并随「通过」提交(formUpdates),服务端按节点权限白名单过滤后写回实例表单 |
审批接口使用幂等防重复提交,批量审批与转办额外通过 Redis 动作去重,避免重复点击造成多次推进。通过、拒绝、转办、委派、加签、减签、退回七类动作在服务端按节点「操作按钮」配置强制校验启用态,未启用的动作即使绕过前端也会被拒绝。
重复处理人预检
转办、委派、加签、管理员改派和离职交接在写入前统一校验目标处理人:目标用户已在同节点同激活轮次持有 pending/waiting 任务时,返回 409 并附带姓名(如「赵六·财务主管 已是本节点待办处理人,无需重复指派」)。离职交接逐条改派时命中冲突的条目自动跳过、不阻断其余条目。数据库层的活动任务部分唯一索引作为最后防线(见实例生命周期)。
委派回执场景下,若最早委派人已在同节点同轮持有活动任务,由既有任务直接承接最终确认。
实时提醒与列表刷新
管理后台在 AdminLayout 挂载统一的 WS 消费 hook,按事件类型失效对应的 TanStack Query 缓存:
- 新待办推送
workflow:taskCreated:右上角弹出可点击提醒(直达「待我审批」并自动展开该任务),并刷新待办列表缓存。 - 自己的任务被超时自动通过 / 自动拒绝时推送
workflow:taskFinished(decision: approved | rejected),刷新待办列表。 - 流程结束(通过 / 驳回 / 撤回)向发起人推送
workflow:instanceFinished,刷新「我的申请」、待办与流程监控缓存;刻意不做全域失效,避免设计器编辑中的画布被 refetch 覆盖。
移动审批(approval.html)不走 WS,底部 TabBar 的待办 / 抄送未读角标由 30 秒轮询 GET /api/workflows/instances/pending-mine/count 与 GET /api/workflows/instances/cc-mine/unread-count 维持。
审批方式
| 方式 | 运行效果 |
|---|---|
| 或签 | 一份正式基础意见满足基础条件;跳过无关候选,仍等待必须处理的锚定席位及补充组 |
| 会签 | 全部基础席位正式同意,并满足补充组后节点通过 |
| 依次审批 | 只开放当前基础席位;其后签完成后才开放下一席位 |
| 比例会签 | 按冻结席位数计算通过阈值,达标后只跳过无关候选;加签人数不改变分母 |
| 随机一人 | 从候选人中选一人处理 |
| 自动通过 | 节点不产生人工待办,自动推进 |
同一次进入节点创建一个激活轮次(activationId),冻结基础审批方式、席位数和通过阈值;节点重入创建新轮。计票以正式审批席位为依据,任务记录、抄送、加签和委派建议不增加基础票数。转办及委派回执继续归属原席位。详情的「审批明细」展示基础意见、必须处理的席位和各补充加签组。
基础比例仍可能达标、或新增或签组仍有成员可能同意时,可以继续等待其它正式意见。必须处理的锚定席位拒绝或必办组失败时执行节点拒绝/退回策略;真正终止或退回时清理本轮未结束任务、席位及组。时间线按决策事实展示退回目标,不把部分拒绝或委派回执推断成退回/重审。
驳回与退回
驳回用于表达不同意,退回用于让前序节点补充处理。
| 能力 | 说明 |
|---|---|
| 终止流程 | 实例进入 rejected,全量清场(任务/Token/推进作业) |
| 退回上一节点 | 找到上一个审批/办理节点重新生成任务 |
| 退回发起人 | 全量清场后实例进入 returned,发起人修改后在原实例重新提交(见实例生命周期) |
| 退回指定节点 | 按节点 key 回到目标节点 |
| 按钮跳转 | 拒绝/退回按钮可配置跳转目标,优先于节点默认策略 |
| 回到原节点 | 被退回节点完成后直接回到发起退回的节点 |
被清场的待办都带来源注释,处理人在「我已办」和时间线中能看到任务因何作废。
转办与委派
转办、委派、管理员改派、离职交接、超时升级转交统一写入 workflow_task_transfers 明细表(移出方、接收方、操作人、原因、时间),完整回答"谁在何时因何把任务交给了谁":
| 字段 | 说明 |
|---|---|
originalAssigneeId | 任务最初处理人 |
transfers | 任务的转办明细列表(详情场景返回,时间线逐条展示) |
delegatedFromId | 委派期间指向最早委派人 |
系统禁止把任务转回曾经经手的人(基于转办明细的 from/to 并集判定),避免 A → B → A 的循环;转给同节点已有活动待办的人则被预检拦截(409 带姓名)。委派多次时,最终回执仍回到最早委派人。
加签与减签
| 加签位置 | 说明 |
|---|---|
| 前加签 | 新增组先处理,原席位等待;组通过或合法全减后原席位恢复,仍须形成正式意见 |
| 后加签 | 新增组先等待,原席位正式同意后才激活;建议制委派的回执不算正式同意 |
| 并加签 | 新增组与原席位同时处理;基础条件和全部必办新增组均满足后才能推进 |
三个位置都支持新增组的会签或或签,signMode 只控制本次新增组,不改写原节点策略或比例分母。前后加签将原席位标为必须处理;即使基础或签/比例已达标,也不能跳过该原席位和未完成的新增组。顺序会签中的后签完成后才开放下一原始席位。只允许原始审批席位创建组,同一席位可以创建多个组,新增组成员不再嵌套加签。
减签在「审批明细」中按组操作,原任务正在等待或已经办完都可以处理有权限的未办成员。接口为 POST /api/workflows/sign-groups/{groupId}/reduce,传 targetSlotIds;不能移除原始审批人或已办意见。全减记为取消关卡,不产生同意票。待办通知和超时从任务真正激活后开始,等待原因在审批链中明确展示。加签和减签分别触发 task.addSigned、task.reduceSigned 事件。
协办
协办用于收集意见,不改变任务处理人。审批人发起协办后,协办人在「我的协办」中回复意见,审批人在任务详情中查看并自行决定通过或驳回。
审批代理
审批代理(离岗委托)用于出差、休假等场景:委托人把自己的待审批任务在一段时间内自动转交给代理人。入口为 工作流引擎 → 审批中心 → 审批代理。
| 配置 | 说明 |
|---|---|
| 委托人 / 代理人 | 待办从委托人自动转交给代理人 |
| 适用流程 | 可限定单个流程定义;留空对全部流程生效 |
| 生效时间 | 开始 / 结束时间;留空表示立即生效 / 长期有效 |
| 原因 | 备注委托原因 |
| 启用状态 | 规则可随时停用 |
代理在任务生成时生效:引擎解析出的处理人命中启用中的代理规则时,待办直接指派给代理人,任务上保留 delegatedFromId 指向原处理人,时间线可见转交痕迹。已生成的历史待办不受新增规则影响。管理员执行离职交接时可一并停用离职人的代理规则。
催办
发起人和管理员可对运行中实例的 pending 任务催办。单个任务 5 分钟内只允许催办一次;实例级催办会对所有待办尝试提醒,并跳过命中节流的任务。节点开启超时「自动提醒」时,系统也会在每次到期提醒时向处理人自动发送催办通知。
催办记录写入 workflow_task_urges,并触发 task.urged 事件(系统超时提醒仅发事件,不写催办记录)。
抄送
抄送节点解析接收人后写入抄送任务,送达即完成,不阻塞流程:
- 「抄送我的」列表的抄送时间为 CC 任务的送达时间(运行中补加的抄送按补加时刻计),与实例发起时间无关;未读/已读状态独立维护,支持标记已读与转发。
- 所有运行态视图(节点列表、流程图卡片、审批时间线、监控任务明细)对已送达的抄送统一显示「已抄送」(成功色);流程尚未到达的抄送节点显示「待抄送」。
运行中的实例支持动态补加抄送:
POST /api/workflows/instances/{id}/cc/add调用者必须是发起人或管理员,目标节点必须是 ccNode,系统会自动去重已抄送过的用户。
常用语、附件与签名
| 能力 | 说明 |
|---|---|
| 常用语 | 用户维护自己的审批常用语,在审批弹窗中快速填入 |
| 附件 | 每个操作按钮(通过/拒绝/转办/委派/加签/退回)可独立配置附件策略:不显示 / 选填 / 必填,必填时未上传附件无法提交。审批与发起表单的附件统一走 POST /api/workflows/attachments(按工作流身份放行,见权限与范围控制) |
| 手写签名 | 按节点策略选择无需签名、确认使用个人签名或本次重新手写;字段签名不代替节点签名 |
| 意见必填 | 节点启用后,通过或驳回必须填写意见 |
签名策略为 reusable 时,可在审批操作中确认使用我的签名,也可重新手写。选择模板仅用于本次操作,不自动执行同意;handwritten 策略要求本次重写。提交失败可以在当前操作内重试,切换任务后按目标节点重新确认。
成功审批把图片写入任务 signature,来源、真实签署人、签署时间及模板版本写入 signatureEvidence。证据由服务端生成,详情、流程记录与打印读取固定结果;以后更换或删除个人模板不会改变已签记录。模拟登录期间不能签署。
沟通与通知深链
实例详情「沟通」页签支持:
| 能力 | 说明 |
|---|---|
| 自由评论 | 参与人(发起人/处理人/超管)可留言 |
| @提及 | 提及参与人并发送站内信 + WS 实时提醒(带实例详情深链) |
| 评论附件 | 每条评论最多 5 个附件,随评论展示 |
| 回复引用 | 对某条评论回复,展示被引用评论的作者与内容摘要(父评论删除后引用置空,本条保留) |
工作流站内信均带深链(link 字段):待办/催办/转交提醒跳「待我审批」并自动弹出对应任务详情;抄送提醒跳「抄送我的」;审批结果与 @提及跳「我的申请」实例详情。顶栏消息点击直达,WS 实时弹窗点击文案同样跳转。
批量处理
| 操作 | 说明 |
|---|---|
| 批量通过 | 对多个待办任务逐条审批通过,返回每条成功/失败结果 |
| 批量驳回 | 对多个待办任务逐条驳回,返回每条成功/失败结果 |
| 批量撤回 | 对多个自己发起的运行实例撤回 |
| 批量催办 | 对多个实例的待办批量催办 |
批量通过最多 200 个任务,签名输入只接受已保存模板引用。一次确认可以用于所选的可复用签名任务,服务端逐条核验本人、租户与版本并生成每条任务自己的证据:
none:正常审批,不记录传入的模板签名。reusable:未选择模板、模板失效或版本已变化时,该任务返回失败;其余符合条件的任务仍可成功。handwritten:返回需单独手写的提示,界面不允许加入批量同意。- 需要指定下一节点审批人或必填附件等逐条操作的任务,同样不能批量同意。
结果按任务返回 success/message,页面保留失败项和原因,不把部分成功当作全部成功。批量操作以任务为粒度(勾选的每行即一个任务),提交前做陈旧检查,遇 409 并发冲突自动刷新列表引导重选。
保存视图
「我的申请」「待我审批」「我已办」「抄送我的」和「流程监控」列表支持把当前筛选条件保存为个人视图,一键切换常用筛选组合;可设默认视图(进入页面自动套用)并调整排序。视图按用户隔离存储。
审批单打印
实例详情提供 PDF 预览、打印和下载,需同时具有实例可见性与 workflow:instance:print 权限。模板、脱敏、归档原件、实时重渲、验真二维码和批量导出统一见审批单打印与存证。