golang 每日一庫之 go-workflow

go-workflow 是一個基於 Go 語言開發的超輕量級工作流引擎,設計靈感來源於 Java 的 Activiti,但進行了深度簡化和解耦,特別適用於微服務架構下的流程控制需求。

特點

  1. 微服務架構友好

    :go-workflow 僅關注流程流轉邏輯,完全解耦用戶、組織等業務數據,便於與各類系統集成。

  2. JSON 流程定義

    :採用 JSON 數組替代傳統的 BPMN 模型,簡化流程配置,靈感來源於釘釘 OA 系統。

  3. 輕量高效

    :相比 Activiti 更加精簡,部署簡單,運行效率高,適合中小型企業或對流程控制有定製需求的場景。

  4. 前後端分離

    :提供獨立的前端流程設計器 go-workflow-UI,支持可視化流程配置。

表結構

go-workflow 使用多張表來管理流程定義、實例、任務等核心數據:

使用流程

  1. 部署服務

    :啓動 go-workflow 微服務,默認監聽端口爲 8080。

  2. 定義流程

    :通過 POST 請求向 /workflow/procdef/save 接口提交 JSON 格式的流程定義,或使用前端工具進行可視化配置。

  3. 啓動流程

    :調用 StartProcessInstanceByID 方法,傳入流程定義 ID、標題等參數,創建新的流程實例。

  4. 任務審批

    :使用 Complete() 方法完成任務審批,系統根據配置自動流轉到下一個節點。

  5. 任務撤回

    :如需撤回任務,可調用 WithDrawTask() 方法,流程將回退到上一步。

示例與文檔

以下是使用 go-workflow/go-workflow 的一個完整使用示例,展示瞭如何:

  1. 定義一個流程;

  2. 啓動流程實例;

  3. 提交任務;

  4. 查看流程走向。

場景示例:請假審批流程

假設流程如下:

申請人 → 直屬主管審批 → HR 審批 → 結束

1. 定義流程(JSON 格式)

流程定義結構參考 JSON,調用接口 /workflow/procdef/save 上傳:

{
"name""請假流程",
"key""leave_process",
"resource": [
    {
"id""start",
"name""開始",
"type""start"
    },
    {
"id""submit",
"name""填寫請假單",
"type""userTask"
    },
    {
"id""supervisor_approve",
"name""主管審批",
"type""userTask"
    },
    {
"id""hr_approve",
"name""HR審批",
"type""userTask"
    },
    {
"id""end",
"name""結束",
"type""end"
    },
    {
"id""flow1",
"name""",
"type""sequenceFlow",
"sourceRef""start",
"targetRef""submit"
    },
    {
"id""flow2",
"name""",
"type""sequenceFlow",
"sourceRef""submit",
"targetRef""supervisor_approve"
    },
    {
"id""flow3",
"name""",
"type""sequenceFlow",
"sourceRef""supervisor_approve",
"targetRef""hr_approve"
    },
    {
"id""flow4",
"name""",
"type""sequenceFlow",
"sourceRef""hr_approve",
"targetRef""end"
    }
  ]
}

2. 啓動流程實例

import (
    "github.com/go-workflow/go-workflow/workflow"
)
engine := workflow.NewWorkflowEngine()
procDefID := "leave_process"
title := "小明的請假流程"
starter := "xiaoming" // 啓動人
instance, err := engine.StartProcessInstanceByID(procDefID, title, starter, nil)
if err != nil {
    panic(err)
}
fmt.Println("流程實例 ID:", instance.ID)

3. 提交任務

審批人提交任務(例如主管通過):

taskID := "123456" // 當前任務 ID
user := "supervisor01"
err := engine.Complete(taskID, user, nil)
if err != nil {
    panic(err)
}
fmt.Println("任務完成")

任務完成後,流程會自動流轉到下一個任務(HR 審批)。

4. 查看流程狀態(數據庫或接口)

可以通過流程實例 ID 查詢當前處於哪個節點,或是否結束。例如查看 proc_inst 中的 cur_node_id 字段。

如果你希望,我還可以演示流程定義設計 UI 的使用,或者展示部署和數據庫初始化的具體步驟。需要哪一部分?

前端流程設計器

go-workflow 提供了前端流程設計器 go-workflow-UI,支持拖拽式流程配置,生成符合要求的 JSON 定義文件,提升流程配置效率。

下面是如何使用 go-workflow 的可視化流程設計器(go-workflow-UI) 來設計和部署流程定義的完整演示:

  1. 獲取 UI 項目

前端項目地址:

https://github.com/go-workflow/go-workflow-UI

克隆並運行:

git clone https://github.com/go-workflow/go-workflow-UI.git
cd go-workflow-UI
npm install
npm run dev

默認會啓動在 http://localhost:5173

2. 使用 UI 設計流程

打開設計器

瀏覽器訪問:http://localhost:5173

添加流程節點

  1. 點擊左側工具欄,選擇:
  1. 在畫布中拖動節點並放置。

  2. 使用箭頭連接節點,自動生成 SequenceFlow

編輯屬性

點擊節點後在右側面板中編輯屬性,例如:

保存流程

點擊右上角【導出 JSON】,將流程結構導出爲 JSON 數據。

3. 部署流程定義到後端

打開 go-workflow 後端服務(需運行),然後使用 Postman 或 curl 調用接口將流程定義上傳:

curl -X POST http://localhost:8080/workflow/procdef/save \
  -H "Content-Type: application/json" \
  -d '{
    "name""請假流程",
    "key""leave_process",
    "resource": [...從 UI 導出的 JSON 數組...]
  }

成功後,流程定義就可以在引擎中使用了

標題:golang 每日一庫之 go-workflow
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/05/27/1748308146285.html
聯繫:scotttu@163.com

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Ip_FTmBokp7qys57OWUGQw