工作流模块说明
2026/8/12大约 10 分钟
工作流模块说明
1. 模块总览
工作流模块提供一套低代码 + 可视化设计的审批流能力:
- 流程设计:可视化流程设计器,提供两种模式——LogicFlow(自由画布)拖拽节点/连线,与Simple(antflow 卡片流)纵向审批链(点「+」插节点、自动连线、抽屉配属性),两种模式数据结构等价可互切;并支持 AI 自然语言生成流程。
- AI 智能能力:自然语言生成流程、审批智能建议、审批摘要(落库
WfFlowRecord.AiSummary)、流程体检、自然语言填单、AI 风险检查(详见《AI 工作流专栏》)。 - 动态表单:流程定义内嵌轻量动态表单(
FormItemsJSON),无需独立开发页面即可发起申请。 - 字段权限:可按节点配置表单字段的可见 / 可编辑范围(
WfFieldPermission,白名单 / 黑名单),不同审批人只看 / 改自己关心的字段(详见《引擎设计文档》§5.1)。 - 流程引擎:基于节点 + 连线的状态机,支持顺序、条件分支、并行分叉 / 汇聚、或签 / 会签 / 依次审批 / 比例会签、转办、加签、撤回、重新提交。
- 多端协同:Web 管理端负责设计与审批管理;uni-app 移动端负责发起、待办审批、抄送查看。
2. 数据模型与 ER 图
ER 图
图例说明:
- 实线关系(
||--o{/||--o|)表示运行态实例 / 任务 / 记录按InstanceId/NodeId/TaskId/FlowId关联。wf_flow_node与wf_node_link均按FlowId归属同一份流程定义,复制 / 版本 / 另存新版本时连带迁移。wf_form_template与wf_flow_definition为拷贝语义(载入模板即将FormItems复制到定义),不强制共享。
表清单
核心表(前缀 wf_),由 WorkflowTenantInitializer 在租户初始化时建表 / 补列:
| 表 | 实体 | 职责 |
|---|---|---|
wf_flow_definition | WfFlowDefinition | 流程定义(名称、版本、表单 FormItems、设计器 DesignJson) |
wf_flow_node | WfFlowNode | 流程节点配置(审批人 / 条件 / 并行分组 / 签类型) |
wf_node_link | WfNodeLink | 节点连线(有向边),流转的唯一事实来源 |
wf_flow_instance | WfFlowInstance | 流程实例(一次具体申请 + 当前活动节点集) |
wf_flow_task | WfFlowTask | 审批任务 / 抄送任务(节点待办) |
wf_flow_record | WfFlowRecord | 操作流水轨迹(含抄送知会记录) |
wf_flow_comment | WfFlowComment | 审批评论 / 批注(不推进流程) |
wf_form_template | WfFormTemplate | 可复用表单模板,供设计器载入复用 |
wf_webhook | WfWebhook | Webhook 端点配置(Url/Enabled/Secret),节点经 EnterWebhookId / LeaveWebhookId 引用 |
wf_webhook_delivery | WfWebhookDelivery | Webhook 投递 Outbox 记录(EventId/Payload/重试次数/状态,失败转死信) |
关键字段说明
WfFlowNode.ApproverId/ApproverNames:审批人 / 抄送人稳定标识 + userName 快照。快照用于展示,避免运行时反查用户表;运行态任务以userId外键关联(统一落SysUser.UserId)。WfFlowInstance.CurrentNodeId/CurrentNodeIds:CurrentNodeIds(JSON 数组)是权威的活动节点集,用于并行多分支同时高亮;CurrentNodeId仅取活动集Min()作兼容单值,供列表 / 旧查询使用。WfNodeLink:前端为每条边(含直线)生成一条连线(直线ConditionJson留空)。引擎按连线 +ConditionJson决定走向;节点无出边 = 流程终点。WfFlowDefinition.FormItems:JSON 字段数组[{ field, label, type, required, options }]。type 支持input|textarea|number|date|datetime|select|radio|checkbox|switch|image|user;select/radio/checkbox的options为逗号分隔文本(label即value);user类型存昵称字符串(展示型选人)。
3. 流程引擎能力(WfEngineService)
流转状态机、枚举字典、字段级数据模型等实现细节,详见《工作流引擎设计文档》。本节仅列模块能力。
统一流转状态机,公共入口遵循「pre-flight 校验 → RunInTx 事务 → 落库 → ArriveNode / AdvanceToNext 推进」模式。
公共入口
| 方法 | 触发方 | 说明 |
|---|---|---|
Start | 发起申请 | 校验为已发布 / 启用 / 非草稿版本;插入实例、写提交记录、到达首节点 |
Approve | 通过 | 校验任务属于当前用户且待审;置已审、写记录、节点完成则推进 |
Reject | 驳回 | 写记录、实例置「驳回」、跳过其余待办(保留当前节点指针供重新提交) |
Resubmit | 重新提交 | 仅申请人、仅驳回态;回首节点重新审批,历史轨迹保留 |
Withdraw | 撤回 | 仅申请人、仅审批中且当前节点未审批;跳过待办、实例置「撤回」 |
Transfer | 转办 | 将待办转移给目标用户(节点不变) |
AddSign | 加签 | 当前节点追加审批人,新待办纳入完成判定(按 userId 去重) |
Delegate | 委托代审 | 待办仍归属原审批人,仅记 DelegateId/DelegateName,代审人凭其代审 |
RemoveSign | 减签 | 从当前节点移除某加签/会签待审批人,操作人须为该节点审批人之一 |
Urge | 催办 | 申请人发起,仅审批中实例,24h 同实例限一次 |
AdminTerminate/Suspend/Resume | 管理员终止/挂起/恢复 | 流程级运维(仅管理员),对应 action=13/11/12 |
AdminReassign | 管理员改派 | 未完成任务改派目标用户(action=14) |
AdminJump | 管理员跳转 | 跳转目标节点(action=15);跳并行组内成员仅激活该节点(其余分支置 Skipped,不卡死) |
流转规则(ArriveNode / AdvanceToNext)
- 条件网关 (4):透传,按出边
ConditionJson选一路;无条件出边为默认分支;可作流程首节点。每条连线支持多条件组合:WfLinkCondition.Conditions数组 +LogicType(0=AND 全部满足、1=OR 任一满足);旧单条件结构(ConditionField/Op/Value)仍兼容。 - 并行分叉 (7):fork,同时激活全部出边目标分支,各自独立推进(双真实节点模型,分叉 7 + 汇聚 8,配合
CurrentNodeIds活动节点集)。 - 并行汇聚 (8):join,所有入边分支(真实业务节点审批 / 抄送)均完成才继续。
- 并行分组 (
ParallelGroup>0):首次到达时 fork 组内所有满足条件节点,整组完成才汇聚(IsNodeComplete:或签任一 Done / 会签全部 Done / 抄送无 Pending 即完成)。 - 抄送节点 (2):生成抄送任务 + 抄送记录 + 通知,立即继续。
- 审批节点 (1):生成待办并等待;审批人为空时自动跳过(留痕)避免卡死。
- 节点无出边:流程终点 → 实例置「通过」;绝不 fallback 到
NodeOrder(条件分支叶子天然无出边,顺延会错误流入其他分支)。仅当整个流程完全无link(存量老数据)才 fallbackNodeOrder。 - 活动节点集:并行期间多节点同时活动,维护于
CurrentNodeIds(CurrentNodeId取Min()作兼容)。 - 超时自动处理:审批节点可设超时时长与超时动作(自动通过 / 自动驳回 / 转交指定人);后台定时任务扫描到期待办自动执行并留痕,无需人工介入。
审批人解析(ResolveApprovers)
统一返回 (UserId, UserName, NickName),运行态任务 / 记录直接用 userId,避免 userName 改名后鉴权失效。审批权限比对统一用 WfFlowTask.AssigneeId。
支持 6 种审批人来源(WfApproverType):指定用户(0) / 角色(1) / 部门(2) / 表单字段(3) / 部门负责人(4) / 发起人主管(5)。当上述来源最终解析为空时,按节点 EmptyApproverStrategy 兜底:0=自动通过(节点 AutoSkip,留痕 action=8),1=指定默认审批人(DefaultApproverId/Name)。完整字段与解析方式见《引擎设计文档》§4。
通知
通过 ISysUserMsgService 落库 + SignalR 实时推送(异常不影响主流程)。
4. 流程设计器(前端 Web)
路径:/src/views/workflow/flowDefinition/
WfFlowDesigner.vue:设计器外壳,按DesignType切换 LogicFlow(WsLogicFlowDesigner.vue)或 Simple(WsSimpleDesigner.vue)两种画布。- LogicFlow 模式:核心设计器(渲染 / 布局 / 连线 / 拖拽 / 保存),基于 LogicFlow。
- Simple 模式(
WsSimpleDesigner.vue):antflow 风格的纵向卡片流,节点下方「+」插入、自动连线;属性在右侧抽屉(NodeProperties复用)配置;自带撤销 / 重做(useHistory)、缩放(useCanvasZoom)、「N 个节点待完善」完整性徽标(useFlowTopology计算)。 AiGenerateDialog.vue:设计器顶部「AI 生成」对话框,自然语言生成流程草稿并采纳。flowDict.js(单一数据源):NODE_TYPE/NODE_DEFS/NODE_TYPE_COLORS/APPROVER_TYPE/CONDITION_OP_OPTIONS等全部字典集中维护。- 节点注册:
graph/wfNodes.js(wf-approve/wf-cc/wf-condition/wf-parallel-fork/wf-parallel-join)。 - 保存逻辑:
composables/useWorkflowGraphModel.js的buildSaveLinks展开条件分支为全量link。 - 属性面板:
NodeProperties.vue,配置审批人类型 / 条件 / 签类型 / 并行分组。
设计要点:
- 新增节点必须用唯一负数临时 id(如
tempNodeId()自减),绝不能用0(会互相覆盖导致连线重映射错乱);编辑节点用旧正数nodeId。 - 并行骨架:建议通过连线中点「+」菜单的「并行网关」一键生成(分叉 7 + 汇聚 8 配对)。
DesignJson保存完整设计器状态,便于重新打开还原。
5. 前端功能(Web / 移动端)
具体菜单 / 页面入口由后端菜单种子(
WorkflowSeedService.EnsureMenuSeedData)与移动端WfMenuController按角色权限动态生成,不同用户可见范围不同,此处只描述能力而非固定目录。
Web 管理端能力
- 流程定义管理:列表 + 可视化设计器(新增 / 编辑 / 复制 / 版本管理)。
- 表单模板管理:可复用表单,设计器载入复用。
- 我发起的:发起申请、撤回、驳回后重新提交。
- 待我审批:通过 / 驳回 / 转办 / 加签 / 批量通过 / 标记已读。
- 已办任务:查看已处理任务。
- 抄送给我:查看抄送知会、标记已读。
- 数据面板:待办 / 已办 / 我发起 / 抄送统计、流程效率(平均审批时长、节点耗时、完成率趋势)。
- 审批记录 / 评论:流水轨迹 + 节点内批注(不推进流程)。
流程版本管理(后端 WfFlowDefinitionService)
- 复制:Copy 改
FlowCode(加_copy后缀)生成停用副本。 - 另存新版本:保持
FlowCode,Version自增,旧版本冻结保留。 - 现行版本:同
FlowCode下唯一启用且非草稿的版本(IsCurrent查询时计算)。 - 发布:草稿(
IsDraft=1)→ 正式(IsDraft=0)。 - 回滚:指定历史版本复制为新的最高版本(草稿态)。
