Appearance
用户指南 11 · 流程设计器
流程设计器 = 画流程图 + 配置节点属性的前端组件(npm 包
mldong-flow-designer-plus, 钉钉风格,canvas/dingtalk双模式)。设计器不依赖任何后端——它只产出 LogicFlow JSON;与引擎对接(保存/发布/启停)走 统一门面的
processDesign/*action(见 规范 06 · 统一门面)。 本文档说明:设计稿与流程定义的关系、生命周期、以及属性面板每个字段对应引擎的哪个配置项。
1. 设计器与流程定义(两个概念)
| 设计稿(processDesign) | 流程定义(processDefine) | |
|---|---|---|
| 本质 | 画布草稿 + 历史快照 | 可执行模型(版本化) |
| 存储 | processDesign 表 + processDesignHis 历史表 | processDefine 表 |
| 创建 | 设计器保存(save / updateDefine) | 发布产生(deploy / redeploy) |
| 状态 | isDeployed(1 已发布 / 0 未发布) | state(1 启用 / 0 停用)+ version |
| 变更影响 | 改草稿不影响运行中的流程 | 新版本只影响新发起的实例 |
关键规则:设计稿内容变更后
isDeployed自动置 0(防误用旧定义);发布后 同name的定义version+1——运行中的旧实例仍走旧版本,新发起走新版本。
2. 生命周期(画图 → 保存 → 发布 → 启停)
设计器画图 ──updateDefine──→ 设计稿快照(isDeployed=0)
│
├──deploy──→ 流程定义 v1(version+1,isDeployed=1)
│
└──改图──→ 快照 v2(isDeployed 又变 0)
├──deploy──→ 流程定义 v2(version+1)
└──redeploy──→ 原地替换 v1 内容(version 不变,运行中实例受影响)
│
└──upAndDown──→ 停用(state=0,不再发起新实例)| 动作 | 门面 action | 语义 |
|---|---|---|
| 新建/改基本信息 | processDesign/save | 无 id 新建;有 id 更新基本信息(内容快照可选) |
| 保存画布 | processDesign/updateDefine | 设计稿 JSON 入历史表 + 同步 name/displayName/type + 置未部署(与最新相同则不重复存) |
| 发布 | processDesign/deploy | 取最新快照 → 生成流程定义(version+1)→ 置已部署 |
| 重新发布 | processDesign/redeploy | 取最新快照 → 按 name 原地替换定义内容(version 不变) |
| 删除 | processDesign/remove | 删设计稿(不影响已发布定义) |
| 启停 | processDefine/upAndDown | 停用后不能发起新实例(运行中实例不受影响) |
3. 属性面板字段 ↔ 引擎配置项映射
设计器内置属性面板(可配置 fieldConfigs 扩展),各节点可编辑字段与引擎 properties 的对应关系(引擎侧完整字典见 规范 02 · 属性字典):
3.1 任务节点(审批节点)
| 面板字段 | 写入 properties | 引擎语义 |
|---|---|---|
| 唯一编码 | name(节点 id) | 节点编码 → 任务名 taskName |
| 显示名称 | text.value | 节点显示名 |
| 参与人 | assignee | 固定参与者(逗号分隔;applicant = 发起人) |
| 任务类型 | taskType(Major/Aidant → 0/1) | 0=主办 1=协办 |
| 参与类型 | performType(ANY/ALL → 0/1) | 0=普通 1=会签 |
| 表单 | form | 表单标识 → formKey |
| 前置拦截器 | preInterceptors | 节点执行前拦截器注册名 |
| 后置拦截器 | postInterceptors | 节点执行后拦截器注册名(persist 权限判定路径) |
面板未列出的属性(
assignmentHandler/autoExecute/callback/candidateUsers/countersignType/field等)编辑时原样保留——先写 JSON 再在设计器打开,或通过扩展fieldConfigs加入面板。 会签模式(PARALLEL/SEQUENTIAL)与候选人在钉钉版通过高级配置/扩展面板设置。
3.2 条件分支节点(决策节点)
| 面板字段 | 写入 properties | 引擎语义 |
|---|---|---|
| 唯一编码 / 显示名称 | name / text.value | 同上 |
| 决策表达式 | expr | 节点级默认表达式(出边条件见下) |
| 处理类 | handleClass | 自定义决策器注册名 |
| 决策类路径 | clazz | 决策处理类 |
| 方法名 / 参数变量 | methodName / args | 决策方法调用 |
分支条件(分支编辑面板):
| 面板字段 | 写入 | 引擎语义 |
|---|---|---|
| 分支名称 | text.value(边) | 分支标签(渲染在线上) |
| 条件表达式 | properties.expr(边) | 分支条件——首条为真者胜;无 expr 为默认分支 |
3.3 自定义节点 / 子流程 / 开始结束
| 节点 | 面板字段 | 写入 properties |
|---|---|---|
| 自定义 | 类路径/方法名/参数变量 | clazz / methodName / args |
| 子流程 | 表单/版本号 | form / version |
| 开始/结束 | 前置/后置拦截器 | preInterceptors / postInterceptors |
4. 设计器输出 JSON 与引擎模型对应
设计器导出即 LogicFlow JSON,结构与 规范 02 一致:
| 设计器元素 | 输出 JSON | 引擎模型 |
|---|---|---|
| 审批节点 | {type: "snaker:task", properties: {...}} | TaskModel |
| 条件分支容器 | {type: "snaker:decision", properties: {expr, handleClass}} | DecisionModel |
| 条件分支线 | edge {properties: {expr}, text: {value}} | TransitionModel.expr |
| 并行分支/合并 | snaker:fork / snaker:join | ForkModel / JoinModel |
| 自定义节点 | snaker:custom + clazz/methodName/args | CustomModel |
| 子流程 | snaker:subprocess + form/version | SubProcessModel |
type 兼容两种写法:
snaker:task(带前缀)与task(去前缀),引擎解析等价。 设计器属性面板实时生效(无需"保存"按钮),导出时未在面板编辑的原有 properties 字段不丢失。
5. 前端集成(宿主接入方式)
mldong-flow-designer-plus 是纯前端组件,宿主只需:
- 加载设计稿:
processDesign/detail→data.jsonObject喂给设计器 - 保存画布:设计器
getData()输出 JSON →processDesign/updateDefine(草稿) - 发布:
processDesign/deploy→ 得到processDefineId - 回显/预览:只读模式 + 高亮数据(
processInstance/highLight)
| 宿主 | 集成形态 |
|---|---|
| jeeflow-ui(演示站) | 内置 FlowViewer 只读预览 + 高亮 |
| mldong-vben5-wf | 完整设计器页面(canvas/dingtalk 双模式) |
6. 常见问题
| 问题 | 原因 | 处理 |
|---|---|---|
| 发布后流程没变化 | 改了草稿但没 deploy | updateDefine 后必须 deploy 才生成新版本定义 |
| 运行中的流程不受新版本影响 | 版本化语义(符合预期) | 已发起实例走发起时的版本;redeploy 可原地替换定义内容 |
| 停用后还能发起 | 发起页缓存了旧列表 | 发起前重新拉 processDesign/listByType,前端过滤 processDefineState=0 |
| 属性面板找不到某个属性 | 面板字段为内置默认集 | 用 fieldConfigs 扩展面板,或直接编辑 JSON 后回设计器(属性保留) |