golang 每日一庫之 go-workflow
go-workflow 是一個基於 Go 語言開發的超輕量級工作流引擎,設計靈感來源於 Java 的 Activiti,但進行了深度簡化和解耦,特別適用於微服務架構下的流程控制需求。
特點
-
微服務架構友好
:go-workflow 僅關注流程流轉邏輯,完全解耦用戶、組織等業務數據,便於與各類系統集成。
-
JSON 流程定義
:採用 JSON 數組替代傳統的 BPMN 模型,簡化流程配置,靈感來源於釘釘 OA 系統。
-
輕量高效
:相比 Activiti 更加精簡,部署簡單,運行效率高,適合中小型企業或對流程控制有定製需求的場景。
-
前後端分離
:提供獨立的前端流程設計器 go-workflow-UI,支持可視化流程配置。
表結構
go-workflow 使用多張表來管理流程定義、實例、任務等核心數據:
-
procdef
:流程定義表,存儲流程名稱、版本、JSON 配置等信息。
-
proc_inst
:流程實例表,記錄每次流程啓動的實例信息,如當前節點、審批人等。
-
execution
:執行流表,保存流程的執行路徑,確保流程按預定順序流轉。
-
task
:任務表,記錄每個節點的任務詳情,包括審批人、審批狀態等。
-
identitylink
:任務與用戶或用戶組的關聯表,支持候選人、參與者等角色配置。
-
歷史表
:包括 execution_history、identitylink_history、proc_inst_history、task_history 等,用於存儲已完成流程的歷史數據。
使用流程
-
部署服務
:啓動 go-workflow 微服務,默認監聽端口爲 8080。
-
定義流程
:通過 POST 請求向
/workflow/procdef/save
接口提交 JSON 格式的流程定義,或使用前端工具進行可視化配置。 -
啓動流程
:調用
StartProcessInstanceByID
方法,傳入流程定義 ID、標題等參數,創建新的流程實例。 -
任務審批
:使用
Complete()
方法完成任務審批,系統根據配置自動流轉到下一個節點。 -
任務撤回
:如需撤回任務,可調用
WithDrawTask()
方法,流程將回退到上一步。
示例與文檔
以下是使用 go-workflow/go-workflow
的一個完整使用示例,展示瞭如何:
-
定義一個流程;
-
啓動流程實例;
-
提交任務;
-
查看流程走向。
場景示例:請假審批流程
假設流程如下:
申請人 → 直屬主管審批 → 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) 來設計和部署流程定義的完整演示:
- 獲取 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
添加流程節點
- 點擊左側工具欄,選擇:
-
StartEvent
(開始節點)
-
UserTask
(用戶任務節點)
-
EndEvent
(結束節點)
-
在畫布中拖動節點並放置。
-
使用箭頭連接節點,自動生成
SequenceFlow
。
編輯屬性
點擊節點後在右側面板中編輯屬性,例如:
-
節點 ID(必須唯一)
-
名稱(如 “主管審批”)
-
類型(userTask、start、end 等)
保存流程
點擊右上角【導出 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