SpringBoot 整合工作流Flowable 基础篇(一)

前言

工作流是啥,在这满天各种高并发的年代它就像个被遗弃的孤儿,不懂的小伙伴可以去提个OA流程体验一下,有机会可以去体检一下设计流程可以更好理解流程引擎,我暂时也没找到公开的流程设计体验网站(PS:找到就给大家分享)。

Flowable 是什么

Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。

Flowable 可以十分灵活地加入你的应用/服务/构架,也可以作为一个单独应用进行发布

搭建项目

创建一个 Springboot 项目,增加flowable依赖

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>
复制代码
启动前端项目

下载前端源码 flowable-vue

# 克隆项目
git clone https://gitee.com/Owater/flowable-vue.git

# 进入项目目录
cd flowable-vue

# 安装依赖
npm install --registry=https://registry.npmmirror.com

# 启动服务
npm run dev
复制代码
启动后端代码

下载后端代码

导入项目中 sql/demo_flowable.sql,运行DemoFlowableApplication即可

Flowable 数据库

  • Flowable的大部分数据库表以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。

  • ACT_RE_: 'RE'代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

  • ACT_RU_: 'RU'代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

  • ACT_HI_: 'HI'代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

  • ACT_GE_: 通用数据。在多处使用。

通用数据表(2个)
  • act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;
  • act_ge_property:属性数据表(不常用);
历史表(8个,HistoryService接口操作的表)
  • act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
  • act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
  • act_hi_comment:历史意见表;
  • act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
  • act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
  • act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
  • act_hi_taskinst:历史流程任务表,存储历史任务节点;
  • act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
用户相关表(4个,IdentityService接口操作的表)
  • act_id_group:用户组信息表,对应节点选定候选组信息;
  • act_id_info:用户扩展信息表,存储用户扩展信息;
  • act_id_membership:用户与用户组关系表;
  • act_id_user:用户信息表,对应节点选定办理人或候选人信息;
流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
  • act_re_deployment:部属信息表,存储流程定义、模板部署信息;
  • act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
  • act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
流程运行时表(6个,RuntimeService接口操作的表)
  • act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
  • act_ru_event_subscr:监听信息表,不常用;
  • act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
  • act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
  • act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
  • act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;

动态制定流程

  1. 设计流程

截图.png

实现逻辑:前端vue通过bpmn组件制定流程,生成xml,提交给后端,Flowable保存xml

// 保存流程bpmn
Deployment deploy = repositoryService.createDeployment().addString("流程名称.bpmn", "流程生成的bpmn xml")
                .tenantId("租户id").name(req.getName()).category(req.getCategory()).deploy();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
repositoryService.setProcessDefinitionCategory(definition.getId(), "流程类别");
复制代码

存储在act_re_procdef表

image.png

  1. 发起流程
// 查找对应的流程
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId("流程标识")
                .latestVersion().singleResult();
// 设置流程发起人Id到流程中
Map<String, Object> variables = new HashMap<>();
identityService.setAuthenticatedUserId("流程发起人ID");
variables.put(ProcessConstants.PROCESS_INITIATOR, "流程发起人ID");
runtimeService.startProcessInstanceById("流程标识", variables);
复制代码

发起流程效果图:

发起流程效果

发起流程操作如下几张表数据:

  • ACT_HI_VARINST 存储流程历史变量表

  • ACT_HI_PROCINST 存储流程实例历史数据 image.png

  • ACT_HI_IDENTITYLINK 存储流程流转节点人员信息 image.png

  • ACT_HI_TASKINST 存储历史任务节点

  • ACT_RU_EXECUTION 存储运行中流程运行的各个分支信息

  • ACT_RU_ACTINST 存储运行中各个节点的详细信息,关联任务 image.png

  • ACT_RU_TASK 存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用

  • ACT_RU_IDENTITYLINK 存储运行中人员信息,常用于查询人员或部门的待办任务时使用

  • ACT_RU_VARIABLE 存储运行中的流程各节点的变量信息

  1. 审批流程
// 查找任务
Task task = taskService.createTaskQuery().taskId("任务ID").singleResult();
// 任务增加审批意见
taskService.addComment("任务ID", "流程实例Id", FlowComment.NORMAL.getType(), "审批意见");
// 设置审批人 用户ID
taskService.setAssignee("任务ID", "审批人 用户ID");
taskService.complete("任务ID", "流程变量信息");
复制代码

审批流程操作如下几张表数据:

  • insert into ACT_HI_VARINST:存储上一个节点操作数据
  • insert into ACT_HI_IDENTITYLINK:存储上一个节点人员信息
  • insert into ACT_HI_TASKINST:存储上一个节点任务数据
  • insert into ACT_HI_ACTINST
  • insert into ACT_RU_ACTINST
  • insert into ACT_RU_TASK:插入下一个节点任务
  • insert into ACT_GE_BYTEARRAY
  • insert into ACT_RU_VARIABLE
  • update ACT_RU_ACTINST:主要是更新REV_字段,主要用于实现乐观锁,可参考下面文章的解释
  • update ACT_RU_EXECUTION
  • update ACT_HI_ACTINST
  • update ACT_HI_TASKINST
  • delete from ACT_RU_TASK:删除上个节点运行中的任务

Activiti 乐观锁实现过程

  1. 取消流程

实现逻辑:获取流程最后一个节点,改变节点状态

// 获取当前流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
        .processInstanceId(req.getInstanceId())
        .singleResult();
List<Execution> executions = runtimeService.createExecutionQuery()
                        .parentId(processInstance.getProcessInstanceId()).list();
// 所有的执行节点
List<String> executionIds = new ArrayList<>();
executions.forEach(execution -> executionIds.add(execution.getId()));

// 获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
Process process = bpmnModel.getMainProcess();
// 获取当前流程最后一个节点
String endId = endNodes.get(0).getId();
// 变更流程为已结束状态
runtimeService.createChangeActivityStateBuilder()
        .moveExecutionsToSingleActivityId(executionIds, endId).changeState();
复制代码
  1. 流程回退
// 查找任务
Task task = taskService.createTaskQuery().taskId("任务ID").singleResult();
// 回退操作
runtimeService.createChangeActivityStateBuilder()
            .processInstanceId(task.getProcessInstanceId())
            .moveActivityIdsToSingleActivityId("需退回任务列表", "回退到指定节点的key").changeState();
复制代码

参考

RuoYi-flowable

flowable 数据库表结构

猜你喜欢

转载自juejin.im/post/7222179242955751479