前语

工作流是啥,在这满天各种高并发的年代它就像个被遗弃的孤儿,不懂的小伙伴能够去提个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. 规划流程

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

完成逻辑:前端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表

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

  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);

建议流程作用图:

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

建议流程操作如下几张表数据:

  • ACT_HI_VARINST 存储流程前史变量表

  • ACT_HI_PROCINST 存储流程实例前史数据

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

  • ACT_HI_IDENTITYLINK 存储流程流通节点人员信息

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

  • ACT_HI_TASKINST 存储前史使命节点

  • ACT_RU_EXECUTION 存储工作中流程工作的各个分支信息

  • ACT_RU_ACTINST 存储工作中各个节点的详细信息,关联使命

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

  • 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 数据库表结构