# WorkFlow 工作流模块

WorkFlow 模块是 DarkM 框架的流程引擎模块,提供了完整的工作流管理系统。支持流程定义、任务管理、节点配置、流程代理、会签等功能,满足企业各种审批流程需求。


# 📋 模块概述

属性 说明
模块名称 WorkFlow(工作流)
模块类型 业务模块
依赖关系 依赖 Admin 模块、Common 模块
必需性 可选(审批流程必需)
Git 仓库 framework/darkm/darkm (opens new window)

# 🎯 核心功能

# 功能清单

功能分类 功能 说明 重要性
流程定义 流程管理 流程定义、版本管理 ⭐⭐⭐⭐⭐
节点管理 流程节点配置 ⭐⭐⭐⭐⭐
路径管理 节点间流转路径 ⭐⭐⭐⭐
流程参数 流程参数配置 ⭐⭐⭐⭐
任务管理 任务管理 流程任务处理 ⭐⭐⭐⭐⭐
任务提交 任务审批提交 ⭐⭐⭐⭐⭐
任务退回 任务退回到上节点 ⭐⭐⭐⭐
任务撤回 申请人撤回任务 ⭐⭐⭐⭐
流程控制 流程代理 任务代理处理 ⭐⭐⭐⭐
会签管理 多节点会签 ⭐⭐⭐⭐
流程委托 任务委托处理 ⭐⭐⭐
消息通知 流程消息 流程通知消息 ⭐⭐⭐⭐
消息队列 消息发送队列 ⭐⭐⭐

# 📦 安装配置

# NuGet 包安装

Install-Package DarkM.Module.WorkFlow.Web -Version 1.0.0
1

# NPM 包安装

npm i -S darkm-module-workflow
1

# 配置文件

{
  "Db": {
    "Modules": [
      {
        "Name": "WorkFlow",
        "Database": "Nm_WorkFlow",
        "Prefix": ""
      }
    ]
  },
  "WorkFlow": {
    // 是否开启流程引擎
    "Enable": true,
    // 流程超时时间(分钟)
    "TimeoutMinutes": 30,
    // 是否开启流程代理
    "EnableDelegation": true
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

配置说明:

配置项 说明 默认值
Enable 是否开启流程引擎 true
TimeoutMinutes 流程超时时间(分钟) 30
EnableDelegation 是否开启流程代理 true

# 🗄️ 数据库表结构

# 流程定义表

表名 说明 主键
Flow 流程定义表 Id (Guid)
FlowParam 流程参数表 Id (long)
FlowOperator 流程操作员表 Id (long)
FlowDelegation 流程代理表 Id (long)

# 节点配置表

表名 说明 主键
Node 流程节点表 Id (Guid)
NodeAttribute 节点属性表 Id (long)
NodeCountersign 节点会签表 Id (long)
Path 节点路径表 Id (Guid)

# 任务管理表

表名 说明 主键
Task 流程任务表 Id (Guid)
TaskParam 任务参数表 Id (long)
TaskKey 任务密钥表 Id (long)
TaskQueue 任务队列表 Id (long)

# 消息通知表

表名 说明 主键
ProcessMessage 流程消息表 Id (long)
MessageSendQueue 消息发送队列表 Id (long)
ProcessOperator 流程操作员表 Id (long)

# 内部领用表

表名 说明 主键
InternalPickUpHeader 内部领用主表 Id (long)
InternalPickUpDetail 内部领用明细表 Id (long)

# 🔐 权限系统设计

# Controller 定义

# 1. 流程定义管理

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using DarkM.Lib.Auth.Web.Attributes;
using DarkM.Lib.Utils.Core.Models;

namespace DarkM.Module.WorkFlow.Web.Controllers
{
    [Description("流程定义管理")]
    public class FlowController : ModuleController
    {
        private readonly IFlowService _service;

        public FlowController(IFlowService service)
        {
            _service = service;
        }

        [HttpGet]
        [Description("查询")]
        public Task<IResultModel> Query([FromQuery]FlowQueryModel model)
        {
            return _service.Query(model);
        }

        [HttpPost]
        [Description("添加")]
        public Task<IResultModel> Add(FlowAddModel model)
        {
            return _service.Add(model);
        }

        [HttpDelete]
        [Description("删除")]
        public Task<IResultModel> Delete([BindRequired]Guid id)
        {
            return _service.Delete(id);
        }

        [HttpGet]
        [Description("编辑")]
        public Task<IResultModel> Edit([BindRequired]Guid id)
        {
            return _service.Edit(id);
        }

        [HttpPost]
        [Description("修改")]
        public Task<IResultModel> Update(FlowUpdateModel model)
        {
            return _service.Update(model);
        }

        [HttpGet]
        [Description("下拉列表")]
        [Common(CommonPermissionType.All)]
        public Task<IResultModel> Select()
        {
            return _service.Select();
        }

        [HttpGet]
        [Description("流程版本下拉列表")]
        [Common(CommonPermissionType.All)]
        public Task<IResultModel> SelectVersion(int? flowNo)
        {
            return _service.SelectVersion(flowNo == null ? 0 : flowNo.Value);
        }

        [HttpPost]
        [Description("发起任务")]
        public async Task<IResultModel> Start(StartFlowModel model)
        {
            return await _service.Start(model.FlowNo, model.FlowVersion, model.Application);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

# 2. 任务管理

[Description("流程任务管理")]
public class TaskController : ModuleController
{
    private readonly ITaskService _service;

    public TaskController(ITaskService service)
    {
        _service = service;
    }

    [HttpGet]
    [Description("查询")]
    public Task<IResultModel> Query([FromQuery] TaskQueryModel model)
    {
        return _service.Query(model);
    }

    [HttpPost]
    [Description("进入任务")]
    public async Task<IResultModel> Enter(TaskCommitModel model)
    {
        return await _service.Enter(model.TaskId, model.OriginalHandler);
    }

    [HttpPost]
    [Description("提交任务")]
    public async Task<IResultModel> Submit(TaskCommitModel model)
    {
        return await _service.Submit(model.TaskId, model.OpinionMessage, model.OpinionType, model.OriginalHandler);
    }

    [HttpPost]
    [Description("退档任务")]
    public async Task<IResultModel> Rollback(TaskCommitModel model)
    {
        return await _service.Rollback(model);
    }

    [HttpPost]
    [Description("撤回任务")]
    public async Task<IResultModel> Revocation(TaskCommitModel model)
    {
        return await _service.Rollback(model, false, FlowTaskStatus.Revocation);
    }

    [HttpPost]
    [Description("取消任务")]
    public async Task<IResultModel> Cancel(TaskCommitModel model)
    {
        return await _service.Cancel(model.TaskId, model.OpinionMessage, model.OpinionType, model.OriginalHandler);
    }

    [HttpPost]
    [Description("否决任务")]
    public async Task<IResultModel> Reject(TaskCommitModel model)
    {
        return await _service.Reject(model.TaskId, model.OpinionMessage, model.OpinionType, model.OriginalHandler);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 权限解析结果

权限编码 说明 访问级别
workflow_flow_query_get 流程定义 - 查询 需授权
workflow_flow_add_post 流程定义 - 添加 需授权
workflow_flow_edit_get 流程定义 - 编辑 需授权
workflow_flow_update_post 流程定义 - 修改 需授权
workflow_flow_delete_delete 流程定义 - 删除 需授权
workflow_flow_start_post 流程定义 - 发起任务 需授权
workflow_task_query_get 任务管理 - 查询 需授权
workflow_task_enter_post 任务管理 - 进入任务 需授权
workflow_task_submit_post 任务管理 - 提交任务 需授权
workflow_task_rollback_post 任务管理 - 退档任务 需授权
workflow_task_revocation_post 任务管理 - 撤回任务 需授权
workflow_task_cancel_post 任务管理 - 取消任务 需授权
workflow_task_reject_post 任务管理 - 否决任务 需授权

# 🎨 核心功能详解

# 一、流程定义管理

# 1. 流程实体

[Table("Flow")]
public partial class FlowEntity : EntityBase
{
    /// <summary>
    /// 流程编号
    /// </summary>
    public int FlowNo { get; set; }

    /// <summary>
    /// 流程版本
    /// </summary>
    public int FlowVersion { get; set; }

    /// <summary>
    /// 流程名称
    /// </summary>
    [Length(100)]
    public string FlowName { get; set; }

    /// <summary>
    /// 流程编码
    /// </summary>
    [Length(50)]
    public string FlowCode { get; set; }

    /// <summary>
    /// 流程状态
    /// </summary>
    public FlowStatus Status { get; set; }

    /// <summary>
    /// 流程版本状态
    /// </summary>
    public FlowVersionStatus VersionStatus { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 2. 流程状态枚举

public enum FlowStatus
{
    /// <summary>
    /// 草稿
    /// </summary>
    Draft = 0,

    /// <summary>
    /// 已发布
    /// </summary>
    Published = 1,

    /// <summary>
    /// 已停用
    /// </summary>
    Disabled = 2
}

public enum FlowVersionStatus
{
    /// <summary>
    /// 无效版本
    /// </summary>
    Invalid = 0,

    /// <summary>
    /// 有效版本
    /// </summary>
    Valid = 1
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 二、任务管理

# 1. 任务操作类型

public enum OpinionType
{
    /// <summary>
    /// 同意
    /// </summary>
    Agree = 0,

    /// <summary>
    /// 驳回
    /// </summary>
    Reject = 1,

    /// <summary>
    /// 退回
    /// </summary>
    Rollback = 2,

    /// <summary>
    /// 撤回
    /// </summary>
    Revocation = 3,

    /// <summary>
    /// 取消
    /// </summary>
    Cancel = 4,

    /// <summary>
    /// 否决
    /// </summary>
    Veto = 5
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 2. 任务提交模型

public class TaskCommitModel
{
    /// <summary>
    /// 任务 ID
    /// </summary>
    [Required]
    public Guid TaskId { get; set; }

    /// <summary>
    /// 审批意见
    /// </summary>
    [Length(500)]
    public string OpinionMessage { get; set; }

    /// <summary>
    /// 意见类型
    /// </summary>
    public OpinionType OpinionType { get; set; }

    /// <summary>
    /// 原始处理人
    /// </summary>
    [Length(100)]
    public string OriginalHandler { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 三、流程代理

# 1. 代理配置

public class FlowDelegation
{
    /// <summary>
    /// 委托人
    /// </summary>
    public string Delegator { get; set; }

    /// <summary>
    /// 代理人
    /// </summary>
    public string Delegate { get; set; }

    /// <summary>
    /// 开始时间
    /// </summary>
    public DateTime StartTime { get; set; }

    /// <summary>
    /// 结束时间
    /// </summary>
    public DateTime EndTime { get; set; }

    /// <summary>
    /// 代理流程号
    /// </summary>
    public int? FlowNo { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 🔧 核心服务接口

# IFlowService(流程定义服务)

public interface IFlowService
{
    /// <summary>
    /// 查询流程列表
    /// </summary>
    Task<IResultModel> Query(FlowQueryModel model);

    /// <summary>
    /// 添加流程
    /// </summary>
    Task<IResultModel> Add(FlowAddModel model);

    /// <summary>
    /// 删除流程
    /// </summary>
    Task<IResultModel> Delete(Guid id);

    /// <summary>
    /// 编辑流程
    /// </summary>
    Task<IResultModel> Edit(Guid id);

    /// <summary>
    /// 修改流程
    /// </summary>
    Task<IResultModel> Update(FlowUpdateModel model);

    /// <summary>
    /// 加载流程配置
    /// </summary>
    Task<IList<IFlow>> Load(bool reload = false, int? flowNo = null);

    /// <summary>
    /// 获取当前有效流程版本
    /// </summary>
    Task<IFlow> GetCurrentFlow(int flowNo, int? flowVersion = null);

    /// <summary>
    /// 获取流程代理
    /// </summary>
    Task<IList<IFlowDelegation>> GetDelegation(FlowDelegationQueryBaseModel model);

    /// <summary>
    /// 获取下拉列表
    /// </summary>
    Task<IResultModel> Select();

    /// <summary>
    /// 获取流程版本列表
    /// </summary>
    Task<IResultModel> SelectVersion(int flowNo);

    /// <summary>
    /// 发起新流程
    /// </summary>
    Task<IResultModel<IWorkQueue>> Start(int flowNo, int? flowVersion = null, string application = null, bool isService = false);

    /// <summary>
    /// 导出
    /// </summary>
    Task<IResultModel<ExcelExportResultModel>> Export(FlowQueryModel model);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

# ITaskService(任务服务)

public interface ITaskService
{
    /// <summary>
    /// 查询任务列表
    /// </summary>
    Task<IResultModel> Query(TaskQueryModel model);

    /// <summary>
    /// 加载任务
    /// </summary>
    Task<IResultModel> LoadTask(Guid taskId);

    /// <summary>
    /// 进入任务
    /// </summary>
    Task<IResultModel> Enter(Guid taskId, string originalHandler);

    /// <summary>
    /// 提交任务
    /// </summary>
    Task<IResultModel> Submit(Guid taskId, string opinionMessage, OpinionType opinionType, string originalHandler);

    /// <summary>
    /// 退档任务
    /// </summary>
    Task<IResultModel> Rollback(TaskCommitModel model);

    /// <summary>
    /// 强制退档
    /// </summary>
    Task<IResultModel> RollbackForce(TaskCommitModel model);

    /// <summary>
    /// 撤回任务
    /// </summary>
    Task<IResultModel> Revocation(TaskCommitModel model);

    /// <summary>
    /// 取消任务
    /// </summary>
    Task<IResultModel> Cancel(Guid taskId, string opinionMessage, OpinionType opinionType, string originalHandler);

    /// <summary>
    /// 否决任务
    /// </summary>
    Task<IResultModel> Reject(Guid taskId, string opinionMessage, OpinionType opinionType, string originalHandler);

    /// <summary>
    /// 获取驳回目标节点列表
    /// </summary>
    Task<IResultModel> RollbackNodeSelect(Guid taskId, bool keyIsNodeNo = true, bool showNodeNo = true);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# 🖥️ 前端组件说明

# NPM 包信息

{
  "name": "darkm-module-workflow",
  "version": "1.5.0-beta-3.0",
  "code": "workFlow",
  "title": "流程引擎",
  "dependencies": {
    "d3": "^6.5.0",
    "darkm-module-admin": "^1.5.0-beta-2.0",
    "darkm-module-common": "^1.5.0-beta-2.0",
    "darkm-ui": "^1.5.0-beta-2.0"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 组件目录结构

src/UI/module-workflow/
├── src/
│   ├── views/                      # 页面组件
│   │   ├── flow/                   # 流程管理
│   │   ├── task/                   # 任务管理
│   │   ├── node/                   # 节点管理
│   │   └── ...
│   └── components/                 # 通用组件
│       ├── flow-select/            # 流程选择器
│       ├── flow-version-select/    # 流程版本选择器
│       ├── node-select/            # 节点选择器
│       ├── node-tree-select/       # 节点树选择器
│       ├── task-turn-over/         # 任务移交
│       ├── task-countersign/       # 任务会签
│       ├── task-rollback-node-select/ # 退档节点选择
│       └── flow-delegation-*       # 流程代理相关
└── package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 📦 通用组件详解

# 1. FlowSelect 流程选择器

组件路径: components/flow-select

功能: 下拉选择流程

使用示例:

<template>
  <flow-select v-model="flowId" />
</template>

<script>
import { components } from 'darkm-module-workflow'
const { FlowSelect } = components

export default {
  components: { FlowSelect },
  data() {
    return {
      flowId: ''
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Props 参数:

参数 类型 必填 默认值 说明
value String - 选中的流程 ID(v-model)
disabled Boolean false 是否禁用

Events 事件:

事件名 参数 说明
input (value: String) 选中值变化时触发(v-model)
change (value: String, data: Object) 选中值变化时触发,返回完整数据

特点:

  • ✅ 支持缓存(clientCacheKey: 'select-cache-workflow-flow')
  • ✅ 基于 mixins.select

# 2. FlowVersionSelect 流程版本选择器

组件路径: components/flow-version-select

功能: 下拉选择流程版本

使用示例:

<template>
  <flow-version-select 
    v-model="flowVersion"
    :flowNo="flowNo"
  />
</template>

<script>
import { components } from 'darkm-module-workflow'
const { FlowVersionSelect } = components

export default {
  components: { FlowVersionSelect },
  data() {
    return {
      flowVersion: '',
      flowNo: 1
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Props 参数:

参数 类型 必填 默认值 说明
value Number - 选中的流程版本(v-model)
flowNo Number - 流程编号
disabled Boolean false 是否禁用

Events 事件:

事件名 参数 说明
input (value: Number) 选中值变化时触发
change (value: Number, data: Object) 选中值变化时触发

# 3. NodeSelect 节点选择器

组件路径: components/node-select

功能: 下拉选择流程节点

使用示例:

<template>
  <node-select 
    v-model="nodeId"
    :flowNo="flowNo"
  />
</template>

<script>
import { components } from 'darkm-module-workflow'
const { NodeSelect } = components

export default {
  components: { NodeSelect },
  data() {
    return {
      nodeId: '',
      flowNo: 1
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Props 参数:

参数 类型 必填 默认值 说明
value String - 选中的节点 ID(v-model)
flowNo Number - 流程编号
disabled Boolean false 是否禁用

Events 事件:

事件名 参数 说明
input (value: String) 选中值变化时触发
change (value: String, data: Object) 选中值变化时触发

# 4. TaskCountersign 任务会签

组件路径: components/task-countersign

功能: 任务会签处理,支持多人会签

使用示例:

<template>
  <task-countersign 
    :taskId="taskId"
    @complete="handleComplete"
  />
</template>

<script>
import { components } from 'darkm-module-workflow'
const { TaskCountersign } = components

export default {
  components: { TaskCountersign },
  data() {
    return {
      taskId: 'xxx'
    }
  },
  methods: {
    handleComplete() {
      console.log('会签完成')
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Props 参数:

参数 类型 必填 默认值 说明
taskId String - 任务 ID
disabled Boolean false 是否禁用

Events 事件:

事件名 参数 说明
complete - 会签完成时触发

子组件:

  • replay - 会签回复组件

# 5. TaskRollbackNodeSelect 退档节点选择器

组件路径: components/task-rollback-node-select

功能: 选择退档的目标节点

使用示例:

<template>
  <task-rollback-node-select 
    v-model="targetNodeId"
    :taskId="taskId"
  />
</template>

<script>
import { components } from 'darkm-module-workflow'
const { TaskRollbackNodeSelect } = components

export default {
  components: { TaskRollbackNodeSelect },
  data() {
    return {
      targetNodeId: '',
      taskId: 'xxx'
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Props 参数:

参数 类型 必填 默认值 说明
value String/Number - 选中的节点 ID(v-model)
taskId String - 任务 ID
keyIsNodeNo Boolean true key 是否使用节点编号
showNodeNo Boolean true 是否显示节点编号
disabled Boolean false 是否禁用

Events 事件:

事件名 参数 说明
input (value: String/Number) 选中值变化时触发
change (value: String/Number, data: Object) 选中值变化时触发

# 📋 组件使用注意事项

# 1. 组件引入方式

// 方式一:引入单个组件
import { components } from 'darkm-module-workflow'
const { FlowSelect, TaskCountersign } = components

// 方式二:全局注册
import WorkFlow from 'darkm-module-workflow'
Vue.use(WorkFlow)
1
2
3
4
5
6
7

# 2. v-model 双向绑定

所有选择器组件都支持 v-model 双向绑定:

<!-- 推荐用法 -->
<flow-select v-model="flowId" />

<!-- 等价于 -->
<flow-select 
  :value="flowId" 
  @input="flowId = $event" 
/>
1
2
3
4
5
6
7
8

# 3. 级联选择

多个选择器可以级联使用:

<template>
  <div>
    <flow-select v-model="flowId" />
    <flow-version-select v-model="flowVersion" :flowNo="flowId" />
    <node-select v-model="nodeId" :flowNo="flowId" />
  </div>
</template>
1
2
3
4
5
6
7

# 4. 数据格式

所有组件返回的数据格式:

  • 单选: 返回 ID(String/Number)
  • change 事件: 返回 (value, data),data 为完整对象

# 5. 组件依赖

WorkFlow 模块依赖以下模块:

  • darkm-module-admin - 权限管理
  • darkm-module-common - 通用模块
  • darkm-ui - UI 组件库
  • d3 - 流程图绘制库

确保先安装依赖:

npm install darkm-module-admin --registry http://npm.woowis.com
npm install darkm-module-common --registry http://npm.woowis.com
npm install darkm-ui --registry http://npm.woowis.com
npm install d3 --registry http://npm.woowis.com
1
2
3
4

# 🔍 常见问题

# 1. 流程无法启动

问题: 点击发起任务报错

解决:

# 检查流程是否已发布
# 检查流程版本是否有效
# 检查申请人是否有权限

# 查看详细错误日志
tail -f logs/workflow.log
1
2
3
4
5
6

# 2. 任务提交失败

问题: 提交任务时提示错误

解决:

  1. 检查任务状态是否正确
  2. 检查当前处理人是否匹配
  3. 检查必填字段是否完整
  4. 查看后端日志错误信息

# 3. 流程图无法显示

问题: 流程图加载失败

解决:

# 检查 d3 库是否正确安装
npm list d3

# 检查流程节点数据是否完整
# 检查前端控制台错误信息
1
2
3
4
5

# 4. 流程代理不生效

问题: 设置了代理但任务未转交

解决:

  1. 检查代理时间范围是否有效
  2. 检查代理流程配置是否正确
  3. 检查代理人账户状态是否正常
  4. 清除缓存后重试

# 📚 相关文档


# 🔗 参考链接


最后更新: 2026-03-20