golang,go,博客,开源,编程

golang每日一库之go-workflow

Updated on with 0 views and 0 comments

go-workflow 是一个基于 Go 语言开发的超轻量级工作流引擎,设计灵感来源于 Java 的 Activiti,但进行了深度简化和解耦,特别适用于微服务架构下的流程控制需求。


特点

  1. 微服务架构友好:go-workflow 仅关注流程流转逻辑,完全解耦用户、组织等业务数据,便于与各类系统集成。
  2. JSON 流程定义:采用 JSON 数组替代传统的 BPMN 模型,简化流程配置,灵感来源于钉钉 OA 系统。
  3. 轻量高效:相比 Activiti 更加精简,部署简单,运行效率高,适合中小型企业或对流程控制有定制需求的场景。
  4. 前后端分离:提供独立的前端流程设计器 go-workflow-UI,支持可视化流程配置。

表结构

go-workflow 使用多张表来管理流程定义、实例、任务等核心数据:

  • procdef:流程定义表,存储流程名称、版本、JSON 配置等信息。
  • proc_inst:流程实例表,记录每次流程启动的实例信息,如当前节点、审批人等。
  • execution:执行流表,保存流程的执行路径,确保流程按预定顺序流转。
  • task:任务表,记录每个节点的任务详情,包括审批人、审批状态等。
  • identitylink:任务与用户或用户组的关联表,支持候选人、参与者等角色配置。
  • 历史表:包括 execution_history、identitylink_history、proc_inst_history、task_history 等,用于存储已完成流程的历史数据。

使用流程

  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. 点击左侧工具栏,选择:
    • StartEvent(开始节点)
    • UserTask(用户任务节点)
    • EndEvent(结束节点)
  2. 在画布中拖动节点并放置。
  3. 使用箭头连接节点,自动生成 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