睿阳知识库 睿阳知识库
首页
  • npm库配置
  • PC端

    • npm常用命令
    • vue问题记录
    • SEO基础知识及优化
    • 禁止别人调试我的前端页面代码
  • 移动端

    • 小程序
    • Risun.js使用说明
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
  • .NET

    • Nuget库配置
  • Python

    • Pypi库配置
  • 常见问题

    • Word转Pdf字体错乱
    • 使用Jacob进行Word导出PDF
  • 自动部署
  • 前端带路径
  • Linux

    • 应用部署
  • Windows

    • 应用部署
  • 视频监控
  • MySQL系列~
  • 应用高可用
  • 静态代码扫描
  • OpenSSH版本升级
  • 区块链~
  • 软件过程文档目录
  • 著作权申请须知及申报示例
  • 项目申报技巧
  • 项目竣工资料清单
  • 科技项目申报流程及注意事项
  • 初级职称申报
  • 产品需求文档基础知识
  • 产品经理需了解的技术知识
  • 墨刀原型设计指南
  • 文档规范
  • 文档规范
  • 投标工作总结(一)
  • 科技项目申报心得体会
  • 数字孪生
  • AI
  • RSP基础平台
  • RMCloud
  • 区块链
  • 网络态势感知
  • 国产化
  • 数据湖
  • 贡献度
  • 文档编写说明
  • Markdown教程
工作链接
首页
  • npm库配置
  • PC端

    • npm常用命令
    • vue问题记录
    • SEO基础知识及优化
    • 禁止别人调试我的前端页面代码
  • 移动端

    • 小程序
    • Risun.js使用说明
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
  • .NET

    • Nuget库配置
  • Python

    • Pypi库配置
  • 常见问题

    • Word转Pdf字体错乱
    • 使用Jacob进行Word导出PDF
  • 自动部署
  • 前端带路径
  • Linux

    • 应用部署
  • Windows

    • 应用部署
  • 视频监控
  • MySQL系列~
  • 应用高可用
  • 静态代码扫描
  • OpenSSH版本升级
  • 区块链~
  • 软件过程文档目录
  • 著作权申请须知及申报示例
  • 项目申报技巧
  • 项目竣工资料清单
  • 科技项目申报流程及注意事项
  • 初级职称申报
  • 产品需求文档基础知识
  • 产品经理需了解的技术知识
  • 墨刀原型设计指南
  • 文档规范
  • 文档规范
  • 投标工作总结(一)
  • 科技项目申报心得体会
  • 数字孪生
  • AI
  • RSP基础平台
  • RMCloud
  • 区块链
  • 网络态势感知
  • 国产化
  • 数据湖
  • 贡献度
  • 文档编写说明
  • Markdown教程
工作链接
  • Java

    • Maven库配置
    • RSP开发框架
    • RSP框架插件
    • 框架插件

      • 工作流
        • 一. 框架简介
        • 二. 集成插件
          • 1. 下载插件
          • 2. 集成操作
        • 三. 流程要素
        • 四. 设计说明
          • 1. 流程数据库
          • 2. 业务数据库
          • 3. 流程图
          • 4. 业务详情
          • 5. 流程事件
          • 6. 业务实现方法
        • 五、适用场景
          • 1. 适用场景
          • 2. 不适用场景
        • 六、示例运行
          • 1. 执行SQL
          • 2. 导入流程图
          • 3. 页面上配置流程类型
          • 4. 代码参考
      • Word、PDF、Excel增强
      • 消息提醒
      • 资源打包成ZIP下载
      • 区分多个项目Redis缓存
      • 留言评论
      • 内部消息队列
      • 文件预览增强
      • 在线Excel报表设计
      • 自定义高级查询
  • .NET

  • Python

  • 常见问题

  • 后端
  • Java
  • 框架插件
孙超
2022-11-18
目录

工作流

# 一. 框架简介

本框架基于睿阳RSP开发框架,集成工作流引擎 Flowable (opens new window) 6.7.2。框架包含工作流涉及的组件,需要按文档集成到你现有的项目中,适用于进行过程中,需要集成工作流的项目。

流程引擎的发展历史:

目前主流的开源框架就是Activiti/Camunda/Flowable,它们都源自于jbpm。 先是有了jbpm4,随后出来了一个Activiti5,Activiti5经过一段时间的发展,核心人员出现分歧,又分出来了一个Camunda。 activiti5发展了4年左右,紧接着就出现了Flowable。

flowHist

BPMN协议:

BPMN(Business Process Model and Notation)是一种业务流程建模和标记语言,用于描述和规划业务流程。BPMN被视为一种标准的业务流程建模语言,旨在帮助企业以一种可视化和易于理解的方式表示其业务流程。

BPMN协议提供了一种统一的图形表示方法,使企业能够更好地理解和分析其业务流程。它提供了一组图形符号,这些符号代表各种业务流程元素,如任务、网关、事件、流程、数据对象等。通过这些符号,企业可以更好地理解其业务流程的各个方面,从而更好地优化和管理其业务流程。

BPMN协议还提供了一种通用的方式来表示业务流程中的信息流动,这可以帮助企业更好地识别其业务流程中的瓶颈和问题,并提供改进的机会。因此,BPMN被广泛用于企业流程管理(BPM)和业务流程自动化(BPA)领域。

# 二. 集成插件

# 1. 下载插件

下载 工作流插件 (opens new window)

# 2. 集成操作

解压下载后的文件。(可以将project-flowable 修改为 [项目]-flowable)

  • 将project-flowable加入项目工程,并修改pom.xml
<parent>
    <groupId>com.risun</groupId>
    <artifactId>[项目]</artifactId>
    <version>3.0.1</version>
</parent>

<dependency>
    <groupId>com.risun</groupId>
    <artifactId>[项目]-framework</artifactId>
</dependency>
  • 修改项目根目录下的 pom.xml
<!-- 流程管理-->
<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>com.risun</groupId>
        <artifactId>project-flowable</artifactId>
        <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

<modules>
  <module>project-flowable</module>
</modules>
  • 修改<项目>-admin目录下的 pom.xml
<!-- 流程管理-->
<dependencies>
  <dependency>
      <groupId>com.risun</groupId>
      <artifactId>project-flowable</artifactId>
  </dependency>
</dependencies>
  • 修改 application.yml,添加配置

    注意: 当项目库中已经生成flowable相关表之后,将database-schema-update设置为false

## 工作流配置
flowable:
  database-schema-update: true
  • 修改 application-druid.yml,修改配置
## 修改 spring.datasource.druid.master.url,在最后添加配置
nullCatalogMeansCurrent=true
  • 添加前端依赖
npm i vkbeautify
npm i form-gen-parser
npm i workflow-bpmn-modeler
npm i diagram-js
  • 将ui下的文件加入到[项目]-ui模块下(已存在的文件进行覆盖)

    • 将styles文件夹复制到[项目]-ui/src/assets下
    • 将Process文件夹复制到[项目]-ui/src/components下
    • 将generator文件夹复制到[项目]-ui/src/utils下
    • 将flowable文件夹复制到[项目]-ui/src/views下
    • 将api/flowable文件夹复制到[项目]-ui/src/api下
    • 将build文件夹复制到[项目]-ui/src/views/tool下
    • 在<项目>-ui/src/router/index.js中,添加如下内容
      // export const constantRoutes 的最后,添加
      {
        path: '/flowable',
        component: Layout,
        hidden: true,
        children: [
          {
            path: 'definition/model',
            component: () => import('@/views/flowable/definition/model'),
            name: 'Model',
            meta: { title: '流程设计', activeMenu: '/flowable/definition' }
          }
        ]
      },
      {
        path: '/tool',
        component: Layout,
        hidden: true,
        children: [{
          path: 'build/index',
          component: () => import('@/views/tool/build/index'),
          name: 'FormBuild',
          meta: {
            title: '表单配置',
            icon: ''
          }
        }]
      }
      
  • 执行数据库脚本

    sql/flowable-schema.sql、sql/flowable-data.sql

# 三. 流程要素

一般情况下,业务审批流程包括以下要素:

  • 审批流程设计:确定流程中的节点和步骤,并建立流程图或流程模型,以明确整个流程的执行过程。

  • 角色和权限设置:确定各个参与方在流程中的角色和权限,以确保合适的人员参与到合适的步骤中。

  • 流程表单设计:

    • 业务表单:基于业务,设计用户输入表单,一般用于流程发起阶段。

    • 审批表单:设计各种审批表单,以便参与方能够快速而准确地提交审批信息。

  • 提交申请:提交审批请求,并提供所需的文档和信息。

  • 审批过程:根据流程的设计,审批人员在系统中完成各个审批步骤,包括审批、转交、退回、会签等操作。

  • 审批结果反馈:将审批结果及时反馈给申请人,包括审批通过或拒绝,以便后续流程的开展。

  • 记录和日志:记录和日志是指保存和跟踪提交文档和审批过程的信息。记录和日志可以帮助提高透明度和合规性,并便于分析和改进审批流程

# 四. 设计说明

# 1. 流程数据库

  • 流程组表(sys_flow_group、sys_flow_group_user)

    用于管理流程过程中的参与者(之前使用角色),例如:部门负责人、人事专员。 group

  • 流程类型表(sys_flow_type)

    用于管理每个流程的类型,初始发起组、权重。例如:请假流程(普通请假、领导请假),根据发起人所在组的不同进行区分,如果发起人同时属于普通组和领导组,则根据权重来判定发起人最终采用那个流程。

    type
  • 流程跟踪表 (sys_flow_trace)

    用于管理流程的提交人、提交时间、最新状态、审批结果。

    trace
  • 流程记录表 (sys_flow_record)

    用于记录整个流程的操作记录。

    record
  • 流程序号表 (sys_flow_seq)

    存储流程的最大序号,当前设置了两个序号,自然序号和日期序号(yyyyMMdd000001)。

# 2. 业务数据库

业务数据库设计原则,除了业务字段外,必须添加字段 uid。

uid varchar(64) not null comment '业务UID',
String uid = IdUtil.nanoId();

# 3. 流程图

本框架屏蔽了大部分Flowable相关的编程,但流程图必须会进行绘制。

    1. 需要选择下一步的审批人时
节点描述 说明
G_groupKey 下一步审批人属于流程组groupKey
D_deptKey|G_groupKey 下一步审批人属于部门deptKey,流程组groupKey (多个部门、流程组用逗号分隔,部门和流程组数量要一致)
D|G_groupKey 下一步审批人和当前处理人属于同部门,并且属于流程组groupKey
STARTER 下一步审批人是流程发起人(不支持多选)

说明:对于下一步审批人为多选的情况,在节点描述后添加 |M

    1. 节点Id

当某一个任务节点需要执行特定的业务逻辑时,可以自定义节点Id用于判断。

    1. 人员配置
    • 申请(流程发起)人员:人员类型:指定人员、指定方式:动态、指定人员:${INITIATOR}

    • 审批人员:人员类型:候选人员、指定方式:动态、候选人员:#{approval}

    1. 候选组

    人员类型:候选组、指定方式:固定、候选组:选择符合业务的流程组

    1. 网关条件

    通过和退回的参数必须是agree,${agree} 通过、${!agree} 退回

    1. 多实例

    用于设置会签操作,框架中只需要设置完成条件。

    multi

# 4. 业务详情

在src/views/flowable/task/flowdetail.vue下,通过flowType进行区分,例如:

<el-tab-pane label="基本信息" name="info" lazy>
  <FlowDemo :key="key" :uid="bizUid" :pageCtl="pageCtl" :taskId="taskId" :procDef="procDef" @closeWindow="closeWindow" v-if="flowType == 'leave' && loadBizDetail" />
  <span v-else>无相关业务</span>
</el-tab-pane>

# 5. 流程事件

流程处理过程中,可能需要处理一些业务逻辑,例如:短信提醒、业务更新等。为了解决这些需求,框架采用事件驱动的方式,对流程和业务进行解耦。

当发起、审批流程后,框架会发送事件消息,代码如下:

// 发布流程事件消息
sysFlowEventPublisher.publish(buildEvent(taskVo, curTasks));

相关业务操作,在事件监听器处进行处理,代码如下

public class SysFlowEventListener {
	
    private final IFlowDemoService flowDemoService;
	
    @Order
    @EventListener(SysFlowEvent.class)
    public void handleSysFlowEvent(SysFlowEvent<SysFlowEventBody> event) {
      SysFlowEventBody sysFlowBody = (SysFlowEventBody) event.getSource();
      SysFlowTypeEnum fromType = SysFlowTypeEnum.fromType(sysFlowBody.getFlowType());
      switch (fromType) {
      case FLOW_DEMO:
        // flowDemoService.selectFlowDemoByUid(sysFlowBody.getBizUid())
        log.info("FlowDemo 业务处理消息 ==> {}", event);
        break;
      default:
        break;
      }
	}
}

# 6. 业务实现方法

  • 删除流程:每个业务根据流程类型实现相关删除

    代码在com.risun.flowable.service.impl.SysFlowTaskServiceImpl下

    /**
       * 删除流程 
       * TODO: 每个业务根据流程类型实现相关删除
       * 
       * @param sysFlowTaskVo
       * @return
       */
      @Override
      @Transactional
      public int delete(SysFlowTaskVo sysFlowTaskVo) {
      	SysFlowTypeEnum flowTypeEnum = SysFlowTypeEnum.fromType(sysFlowTaskVo.getFlowType());
      	switch (flowTypeEnum) {
      	case FLOW_DEMO:
      		flowDemoService.deleteFlowDemoByUid(sysFlowTaskVo.getBizUid());
      		break;
    
      	default:
      		break;
      	}
      	if (StrUtil.isNotEmpty(sysFlowTaskVo.getProcInstId())) {
      		deleteFlowByProcInstId(sysFlowTaskVo.getProcInstId());
      	}
      	sysFlowAssignMapper.deleteSysFlowAssignByProcInstId(sysFlowTaskVo.getProcInstId());
      	sysFlowRecordService.deleteSysFlowRecordByBizUid(sysFlowTaskVo.getBizUid());
      	return sysFlowTraceService.deleteSysFlowTraceByBizUid(sysFlowTaskVo.getBizUid());
      }
    

# 五、适用场景

# 1. 适用场景

适用于流程定义、会签、会签一票否决、退回(逐级、跨级)、候选审批人、候选审批组、流程版本、历史记录。

# 2. 不适用场景

暂不支持加签、减签、转办。

# 六、示例运行

# 1. 执行SQL

INSERT INTO sys_flow_group (group_name,group_key,create_by,create_time) VALUES
('普通员工','GK_CN','fqyczadmin', sysdate()),
('部门领导','CK_BMLD','fqyczadmin', sysdate()),
('专员','GK_ZY','fqyczadmin', sysdate()),
('统管领导','GK_TGLD','fqyczadmin', sysdate()),
('Boss层','GK_BOSS','fqyczadmin', sysdate());

# 2. 导入流程图

sql\普通员工请假.bpmn20.xml、sql\领导请假.bpmn20.xml

# 3. 页面上配置流程类型

在流程管理 ——> 流程类型 下进行设置。

# 4. 代码参考

  • 后端:com.risun.flowable.demo 包下

  • 前端: src/views/flowable/demo/flowdemo.vue

RSP框架插件
Word、PDF、Excel增强

← RSP框架插件 Word、PDF、Excel增强→

最近更新
01
vue问题记录
10-11
02
RSP进度
10-09
03
贡献度
09-28
更多文章>
Copyright © 2014-2025 甘肃睿阳科技有限公司 陇ICP备15001783-1号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式