# 项目概述

这是一个基于 Flowable 的工作流项目,名为 epkeeper-workflow

项目采用 Maven 多模块结构,包含两个主要模块:

  • epkeeper-workflow-api:API 接口模块
  • epkeeper-workflow-provider:服务提供者模块

# 技术栈

  • 核心工作流引擎:Flowable

  • 数据库:MySQL

  • 缓存:Redis

  • 服务发现:Nacos

  • 消息队列:RabbitMQ

  • ORM:MyBatis

# 项目结构

epkeeper-workflow-api 模块:

  • 包含核心领域模型(core)

  • Dubbo 接口定义

  • 数据模型和 POJO 对象

epkeeper-workflow-provider 模块:

  • 控制器层(Controller)
  • Flowable 相关配置和处理器
  • 服务实现层
  • MyBatis 数据访问层

# 主要功能

  • 工作流程管理

  • 任务处理

  • 流程定义和部署

  • 表单管理

  • 用户任务管理(发起、待办、已办、抄送等)

# 示例功能

  • 包含一个完整的请假流程示例

  • 展示了从流程设计到实现的完整流程

  • 包含表单设计、流程定义、任务处理等功能

# 特色功能

  • 支持流程变量管理

  • 提供任务状态管理

  • 支持流程监听和超时处理

  • 提供自定义命令扩展

  • 支持业务表与工作流的绑定

# 项目中用到的设计模式

  • 工厂模式(Factory Pattern)

    • 在 QueryUtils 类中使用了工厂模式创建各种查询对象

    • 例如:modelQuery ()、definitionQuery ()、deploymentQuery () 等方法都是工厂方法的实现

    • 这些方法封装了对象的创建过程,提供了统一的接口

  • 单例模式(Singleton Pattern)

    • 在 QueryUtils 类中使用了单例模式

    • 通过 private static final 确保 PROCESS_ENGINE 只有一个实例

<img src="image-20250416120059550.png" alt="image-20250416120059550" style="zoom:50%;" />

  • 观察者模式(Observer Pattern)

    • 在 GlobalFlowableListener 类中实现了 FlowableEventListener 接口

    • 用于监听工作流引擎的各种事件,如任务创建、任务到期等

    • 通过 onEvent 方法响应不同类型的事件

<img src="image-20250416121122134.png" alt="image-20250416121122134" style="zoom:50%;" />

  • 策略模式(Strategy Pattern)

    • 在 FlowableConfig 类中通过配置不同的处理器来实现不同的策略

    • 例如:自定义的 ID 生成器、事件监听器、任务处理器等

    • 这些都可以通过配置来灵活切换不同的实现策略

<img src="image-20250416121209328.png" alt="image-20250416121209328" style="zoom:50%;" />

  • 模板方法模式(Template Method Pattern)

    • 在 BaseEntity 类中定义了通用的实体类属性和方法

    • 子类可以继承这个基类,复用通用的字段和行为

    • 包含了创建时间、更新时间等通用字段的自动填充逻辑

<img src="image-20250416121303749.png" alt="image-20250416121303749" style="zoom:50%;" />

  • 建造者模式(Builder Pattern)

    • 在 PageQuery 类中使用了建造者模式

    • 通过 build () 方法构建分页对象

    • 支持链式调用设置各种参数

<img src="image-20250416121826481.png" alt="image-20250416121826481" style="zoom:50%;" />

  • 命令模式(Command Pattern)

    • 在工作流处理中使用了命令模式

    • 通过 TaskTimeoutJobHandler 等处理器封装了具体的任务处理逻辑

    • 将请求封装为对象,使得可以用不同的请求对客户进行参数化

<img src="image-20250416121543926.png" alt="image-20250416121543926" style="zoom:50%;" />