Skip to content

流程定义格式

jeeflow 使用 LogicFlow JSON 作为流程定义格式,与 Java 版完全一致——同一份流程 JSON 六语言可移植 (Java / Go / Python / Node / PHP / Rust 各仓带 flows/ 副本驱动测试,唯一编辑源在 jeeflow-java 仓,执行时由 resolver 精确镜像)。

顶层结构

json
{
  "name": "leave",
  "displayName": "请假审批",
  "type": "approval",
  "nodes": [...],
  "edges": [...]
}

节点类型

type说明必填属性
snaker:start开始-
snaker:end结束-
snaker:task任务assignee
snaker:decision条件分支expr(节点级)
snaker:fork并行分支-
snaker:join并行合并-
snaker:custom自定义customClass

任务节点属性

json
{
  "id": "t1",
  "type": "snaker:task",
  "properties": {
    "assignee": "leader",
    "form": "leave-form",
    "taskType": 0,
    "performType": 0,
    "countersignType": "PARALLEL"
  },
  "text": { "value": "组长审批" }
}

参与者优先级:assigneeassignmentHandlercandidateUsers 仅供前端设计器展示,不生成 actor 记录。

条件分支

json
{
  "nodes": [
    {"id":"decision","type":"snaker:decision","properties":{"expr":"amount > 1000"},"text":{"value":"金额>1000?"}},
    {"id":"manager","type":"snaker:task","properties":{"assignee":"manager"},"text":{"value":"经理审批"}},
    {"id":"director","type":"snaker:task","properties":{"assignee":"director"},"text":{"value":"总监审批"}}
  ],
  "edges": [
    {"id":"e3","sourceNodeId":"decision","targetNodeId":"manager",
     "properties":{"expr":"amount > 1000"},"text":{"value":"金额>1000"}},
    {"id":"e4","sourceNodeId":"decision","targetNodeId":"director",
     "properties":{"expr":"amount <= 1000"},"text":{"value":"金额≤1000"}}
  ]
}

边的 text.value 用于钉钉模式分支标签展示,properties.expr 用于引擎求值 (默认内置求值器;可经 ServiceContext::with_expression_evaluator 替换)。

Rust 代码加载

流程 JSON 直接存 ProcessDefine.contentVec<u8>),引擎 start_process_instance 时解析:

rust
use jeeflow_core::model::ProcessDefine;
use jeeflow_core::spi::ProcessRepository;

let def = ProcessDefine {
    name: "leave".into(),
    display_name: "请假审批".into(),
    content: flow_json_bytes.clone(),   // LogicFlow JSON 原文
    ..Default::default()
};
repo.add_define(def);

jeeflow-core::parser 提供 JSON → ProcessModel(节点/边/条件)的解析;解析失败的负向断言 (未知节点类型 / 断边 / 环路)见 jeeflow-core 单测与合规测试。

jeeflow · 轻量级多语言工作流引擎