前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FLOWABLE流程引擎分析

FLOWABLE流程引擎分析

作者头像
小锋学长生活大爆炸
发布2021-06-29 10:43:53
1.5K0
发布2021-06-29 10:43:53
举报

历史:  flowable工作流引擎是从jboss的jbpm->alfresco的activiti->flowable 逐步演化过来的, 核心开发人员是同一个团队. 都是因为与原公司的设计理念存在分歧,导致两次出走. flowable自16年fork之后,已经成为一个活跃的社区,逐步赢得的许多工作流引擎使用者的青睐.

原文件下载:https://download.csdn.net/download/sxf1061700625/19857372

  • 数据表分析
  • 概述:

引擎所需的数据表可以配置为在启动时进行生成,有以下规范:

表名约定

所有的表都以act_开头, 沿用了activiti的传统,

  • act_ge_* : 通用表,保存引擎自身的属性和字节数据/文件等
  • act_re_* : 保存引擎相对’静态’的资源, 例如流程定义与流程资源(图片、规则等
  • act_ru_* : 这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快.
  • act_hi_* : 这些表存储历史数据,例如已完成的流程实例、变量、任务等。

表字段约定/规范:

  • 表中所有字段使用 ‘_’(下划线)结尾
  • 大多数表使用 ID_ 作为主键, 类型为varchar(64)
  • 主键用橙色标出 如id_
  • 外键(或者事实上的外键,即引用其他表中字段,但是未建立外键关系)用淡蓝色标出, 如PROC_INST_ID
  • REV_ 用作乐观锁版本字段
  • VERSION_ :业务相关的版本
  • TENANT_ID_: 租户id,
  • CREATE_TIME_: 创建时间
  • LAST_UPDATED_TIME_ : 更新时间
  • SUSPENSION_STATE_: 挂起/停用状态, 1为激活/正常,2为挂起/停用
  • FORM*: 代表表单相关的字段,内置的表单引擎功能单一,在开发中一般用不到.
  • 通用表部分
  1. act_ge_property(属性表)

列名

类型

长度

备注

NAME_

varchar

64

属性名

VALUE_

varchar

300

属性值

REV_

int

11

表中 name_ 为 *.version的字段, 表示当前使用的flowable引擎的版本(初始化数据库的版本), 版本升级时要更新这些字段否则不能启动.

next.dbid 手动维护一个id生成的序列,集群高并发情况下可以通过配置使用uuid 生成器

  1. act_ge_bytearray (二进制资源表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

NAME_

varchar

255

资源名称

DEPLOYMENT_ID_

varchar

64

部署id

BYTES_

longblob

0

实际存储的内容

GENERATED_

tinyint

4

是否为自动生成资源

一些过大的数据(如流程模型的配置json, 很容易超过4000个字符),会放入此表然后用id(或者name_ + deployment_id_ )进行关联 ; 一些二进制数据, 如流程的设计图也是保存到此表

  • 资源(repository)表
  1. act_re_model (流程模型表):

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

NAME_

varchar

255

模型名称

KEY_

varchar

255

模型唯一标识

CATEGORY_

varchar

255

分类

CREATE_TIME_

timestamp

3

LAST_UPDATE_TIME_

timestamp

3

VERSION_

int

11

META_INFO_

varchar

4000

json格式的模型信息

DEPLOYMENT_ID_

varchar

64

部署id

EDITOR_SOURCE_VALUE_ID_

varchar

64

EDITOR_SOURCE_EXTRA_VALUE_ID_

varchar

64

TENANT_ID_

varchar

255

key_ 字段是模型的唯一标识, 业务场景中一般使用key来指定要启动哪个流程, 引擎的api 会保存一个模型的key+版本号version是表中唯一的, 没有数据库层的限制.

category_: 默认会取xml配置文件中的namespace,

meta_info_: 一个json字符串, 模型的一些比较 “外表” 的信息默认会在这个字段里保存一份,如模型的 “描述”信息.

deployment_id_: 模型最后一次部署的id , 如果还未被部署过, 则为null ; 部署模型后, 会更新模型的这个字段.

editor_source_value_id_ : 模型设计的核心, 模型设计器传过来的json数据, 会保存在 act_ge_bytearray 资源表里, 资源名称为固定的 “source”(调用api: repositoryService.addModelEditorSource), 通过外键引用 . 一个流程应该如何运行都由这些数据描述.

editor_source_extra_value_id_ : 流程模型的预览图, 由流程图生成器调用api生成, 通过repositoryService.addModelEditorSourceExtra 保存到act_ge_bytearray 资源表里, 资源名称为固定的 “source-extra”

  1. act_re_deployment(部署表)

记录用户的部署行为, 把一个流程(如果需要可以添加额外的资源文件,如一个审批中要引用的图片,专用文档等)转换为一个可以运行的流程定义. 一个流程模型部署后会在 act_re_procdef(流程定义表)中增加一条记录.

列名

类型

长度

备注

ID_

varchar

64

NAME_

varchar

255

这次部署的名称

CATEGORY_

varchar

255

KEY_

varchar

255

模型标识

TENANT_ID_

varchar

255

DEPLOY_TIME_

timestamp

3

部署时间

DERIVED_FROM_

varchar

64

直接派生自哪次部署

DERIVED_FROM_ROOT_

varchar

64

派生的根部署

ENGINE_VERSION_

varchar

255

版本兼容字段

默认的部署 一般会设置 部署名称, 其他的为空, 被部署的每个资源会保存到 act_ge_bytearray表中的一条记录,部署id为本次部署的id. 获取资源时, 使用 deploymentId + 资源名称进行查询.

DERIVED_FROM_和DERIVED_FROM_ROOT_ 在需要使用动态流程的时候会被用到(给一个运行的流程实例动态添加任务/调用子流程等),此时api会在流程实例原有的流程定义上进行修改, 然后保存为一个新的流程定义(目前没有研究),详细可以参见  DynamicInjectionCmd.

引擎api中,如果一次部署多个资源(可以是 一个bar包), 引擎会把每个以[‘.bpmn20.xml’,’.bpmn’] 结尾的文件尝试解析为一个流程定义实例(processDefinitionEntity), 并保存到 act_re_procdef表中; 其他类型的资源只保存在 act_ge_bytearray(二进制数据表)中, 如果这个部署的资源中, 没有名称匹配 $resourceName($key?)(png|svg|jpg|gif) 的, 则会根据配置生成一个默认的图片资源, 默认资源名为 $resourceName.$key.png;

  1. act_re_procdef (流程定义表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

CATEGORY_

varchar

255

类别 1

NAME_

varchar

255

流程名称 1

KEY_

varchar

255

流程标识 1

VERSION_

int

11

流程定义版本

DEPLOYMENT_ID_

varchar

64

部署id 2

RESOURCE_NAME_

varchar

4000

(*.xml)资源名称2

DGRM_RESOURCE_NAME_

varchar

4000

图片资源名称2

DESCRIPTION_

varchar

4000

描述

HAS_START_FORM_KEY_

tinyint

4

是否有开始表单

HAS_GRAPHICAL_NOTATION_

tinyint

4

是否有图形表示

SUSPENSION_STATE_

int

11

挂起 状态

TENANT_ID_

varchar

255

ENGINE_VERSION_

varchar

255

2

DERIVED_FROM_

varchar

64

2

DERIVED_FROM_ROOT_

varchar

64

2

DERIVED_VERSION_

int

11

2

用 1 标注的字段, 可以认为直接跟流程模型相关.直接从模型里复制,与act_re_model表中字段有相同含义.

用 2 标注的字段, 可以认为直接跟act_re_deployment(部署表)相关, 细节可以参见:org.flowable.engine.impl.bpmn.parser.handler.ProcessParseHandler#transformProcess

name/key/category/description 几个字段, 都是从流程定义xml文件中直接解析出来的. name.bpm20.xml或者name.bpmn会首先被引擎的各种 parser(解析器) 解析成对应的java对象, 其中流程会被解析成 process对象(org.flowable.bpmn.model.Process), process.name àname, process.idàkey, process.documentàdescription,

HAS_START_FORM_KEY_ 只有在使用flowable默认的表单处理引擎时才有用,可以忽略.

HAS_GRAPHICAL_NOTATION_,只要流程不是一个空模型,就应该有图形表示

SUSPENSION_STATE_: 挂起/停用状态, 停用后不能对其修改, 也不能用这个定义启动新的流程实例

ENGINE_VERSION_/DERIVED_FROM_/DERIVED_FROM_ROOT_ 这几个字段与部署表里的同名字段有相同的含义;包括DERIVED_VERSION_字段,都是在动态流程时使用的.

模型(model)到流程流义(procdef)需要经过如下过程:

1 json->model(org.flowable.engine.repository.Model)(从外部导入xml型的流程设计不需要这一步.

2.model->process

3.process-> xml + png

即act_re_model表里的流程保存的是json配置, act_re_procdef里保存的是xml配置

流程定义可以通过 DynamicService的api对其进行修改, 而不需要对其重新部署, 目前还没有想到合适的业务场景

  1. act_re_procdef_info

列名

类型

长度

备注

ID_

varchar

64

PROC_DEF_ID_

varchar

64

流程定义id

REV_

int

11

INFO_JSON_ID_

varchar

64

保存json配置信息的bytearry表id

此表中的数据在正常的部署操作中未使用, 通过代码跟踪知道 1动态修改流程时会用到此表;2流程的国际化相关的locale信息保存在这里. 运行细节有待进一步debug跟踪测试.

  • 运行时(runtime)数据表

作业(job)部分:

以下几张表都跟异步任务有关,在flowable 6.x版本进行了拆分细化,以提高异步任务查询的性能. 异步执行器会定时查询下面的表,比较到期时间,决定是否运行一个异步任务.

  1. act_ru_job

运行流程实例(即调用API)时插入数据库。如果当前Flowable引擎启用了异步执行器,则该异步作业将被锁定(locked)。即在ACT_RU_JOB表中插入一个作业条目,并设置其lock owner(锁持有人)与lock expiration time(锁到期时间)。在API调用成功后触发的事务监听器(transaction commit listener),将会触发同一引擎中的异步执行器,让其执行该作业(因此可以保证数据库中已经保存了数据)。为此,异步执行器使用(可配置的)线程池,从其中取出线程用于执行作业,并使流程可以异步进行。如果Flowable引擎未启用异步执行器,则异步作业仍会插入ACT_RU_JOB表,但不会被锁定

  1. act_ru_timer_job

定时器(例如边界事件或用户任务中的定时器), 保存在ACT_RU_TIMER_JOB表中,并带有给定的到期日期。异步执行器中有一个线程,周期性地检查是否有需要触发的定时器(也就是说,到期日期在当前时间“之前”)。当需要触发定时器时,从JOB表中移除该定时器,并创建一个异步作业(async job)

  1. act_ru_suspended_job

流程定义与流程实例都可以被暂停。这些定义或实例所关联的暂停作业,将被移至ACT_RU_SUSPENDED_JOB表,以确保用于获取作业的查询语句中的where条件尽量少

  1. act_ru_deadletter_job

如果在执行作业期间发生了异常,这个异步作业将会转化为一个定时器作业,并带有一个到期日期。之后,它将会像普通定时器作业一样被获取,并重新变回异步作业,以实现重试。当一个作业已经重试了(可配置)几次,仍然失败,则作业被视为“死亡(dead)”,并被移至ACT_RU_DEADLETTER_JOB表。“死信(deadletter)”的概念在各种其他系统中也广泛使用。管理员需要检查失败作业的异常信息,并进行相应操作

  1. act_ru_history_job

异步任务历史?, 默认不启用

  1. act_ru_event_subscr

事件订阅,如果流程配置为信号(signal)或消息(message)启动, 或流程定义了信号事件时,会在此表中插入记录 暂时未找到其他相关资料

作业部分总结:

异步执行器是一个高度可配置的组件,官方文档上介绍可以根据需要替换为自己的异步执行器,如使用消息队列.

任务(task)部分

以下几个表为用户审批任务的核心:

  1. act_ru_execution(执行表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

PROC_INST_ID_

varchar

64

流程实例id

BUSINESS_KEY_

varchar

255

业务key

PARENT_ID_

varchar

64

父级executionId

PROC_DEF_ID_

varchar

64

流程定义id

SUPER_EXEC_

varchar

64

子流程的父级id

ROOT_PROC_INST_ID_

varchar

64

根级流程实例id

ACT_ID_

varchar

255

流程定义时任务的key

IS_ACTIVE_

tinyint

4

是否活动

IS_CONCURRENT_

tinyint

4

是否并发

IS_SCOPE_

tinyint

4

范围还是全局

IS_EVENT_SCOPE_

tinyint

4

未知

IS_MI_ROOT_

tinyint

4

?

SUSPENSION_STATE_

int

11

挂起状态

CACHED_ENT_STATE_

int

11

TENANT_ID_

varchar

255

NAME_

varchar

255

未知,目前为空

START_ACT_ID_

varchar

255

启动任务的key

START_TIME_

datetime

3

开始时间

START_USER_ID_

varchar

255

启动用户

LOCK_TIME_

timestamp

3

IS_COUNT_ENABLED_

tinyint

4

EVT_SUBSCR_COUNT_

int

11

TASK_COUNT_

int

11

任务数量,如果代表一个流程,不为0

JOB_COUNT_

int

11

异步任务数

TIMER_JOB_COUNT_

int

11

定时异步任务数

SUSP_JOB_COUNT_

int

11

挂起的异步任务数

DEADLETTER_JOB_COUNT_

int

11

失败的异步任务数

VAR_COUNT_

int

11

变量数

ID_LINK_COUNT_

int

11

关系到的用户(组)数

CALLBACK_ID_

varchar

255

未知

CALLBACK_TYPE_

varchar

255

未知

一个流程启动之后, 所有开始运行且未结束的活动(org.flowable.bpmn.model.Activity-所有任务的父类),都会在此本中有相关记录, 包括流程实例本身.

流程启动后先把流程实例存为一个execution,然后是下一待处理任务, 任务结束(完成)之后从此表中删除, 并添加下一个任务, 直到所有任务都结束, 删除流程实例processInstace这条执行

BUSINESS_KEY_: 业务标识,用以区分不同的业务,可以与TenantId灵活组合区分不同业务场景

PARENT_ID_: 父级id, 如果这个执行是一个流程实例,为null

SUPER_EXEC_: 父级流程的执行id(但是实测中总为null, 需要验证)

PROC_DEF_ID_: 流程定义id

ACT_ID_ :对应PROC_DEF_ID_, 定义中节点的key

IS_ACTIVE_: 是否活动, 这里有特别的意义,因为结束的活动会被删除,而不是停用. 当一个任务配置了多实例时,或者是一个网关时,为0,

START_ACT_ID_:启动节点id,

执行表是维护引擎运行的核心表, 后面的任务表,变量表,以及所有的历史活动等, 都会有一个执行id

  1. act_ru_task(运行任务表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

EXECUTION_ID_

varchar

64

执行id

PROC_INST_ID_

varchar

64

流程实例id

PROC_DEF_ID_

varchar

64

流程定义id, 一般为空

TASK_DEF_ID_

varchar

64

任务定义id

SCOPE_ID_

varchar

255

范围

SUB_SCOPE_ID_

varchar

255

子范围

SCOPE_TYPE_

varchar

255

?

SCOPE_DEFINITION_ID_

varchar

255

?

NAME_

varchar

255

任务名称

PARENT_TASK_ID_

varchar

64

父任务id?

DESCRIPTION_

varchar

4000

任务描述

TASK_DEF_KEY_

varchar

255

流程定义key

OWNER_

varchar

255

任务拥有人

ASSIGNEE_

varchar

255

办理人

DELEGATION_

varchar

64

代理人

PRIORITY_

int

11

优先级

CREATE_TIME_

timestamp

3

创建时间

DUE_DATE_

datetime

3

到期时间

CATEGORY_

varchar

255

分类

SUSPENSION_STATE_

int

11

挂起状态

TENANT_ID_

varchar

255

FORM_KEY_

varchar

255

表单

CLAIM_TIME_

datetime

3

签收时间

IS_COUNT_ENABLED_

tinyint

4

是否计数

VAR_COUNT_

int

11

变量数

ID_LINK_COUNT_

int

11

相关用户数

SUB_TASK_COUNT_

int

11

子任务数

scope 相关字段: 引擎提供的信号(signal)机制,可以指一个范围, 让信号只发送到指定的范围, 而不是影响全部的流程/任务. 同理, 如果一个子任务运行出现异常, 补偿机制或者事务机制会在当前的范围内回退,而不会影响父级任务.

PARENT_TASK_ID_/SUB_TASK_COUNT: 父子任务的关系需要再验证.目前测试,调用子流程或用并行网关时都为空,没有产生父子任务

OWNER_(拥有人)/ASSIGNEE_(办理人)/DELEGATION_(代理人): 这三个概念可以一起谈.任务分配给某个人之后,有时候出于某原因无法进行处理,想委托他人处理,流程引擎提供内置的支持. 任务的办理人a可以调用 taskService#delegate 将任务委托给b, 这是a就是拥有人, b就是代理人; 代理人在处理任务时调用的api(taskService# resolveTask)与普通办理人略有不同(taskService#complete);即代理人将任务处理完后,会还给办理人,办理人在todo(待办任务)里再次调用complete确认完成

CLAIM_TIME_: 签收时间.先解释什么是签收,如果a是某任务的候选办理人, 在签收之前,所有该任务的候选人都可以在其待办任务里看到. 如果签收了,则其他候选人将看不到该任务.目前我们的处理省掉了这一步,即候选人处理一个任务先调用签收api. 这个字段就是签收的时间

VAR_COUNT_: 任务的局部变量(localVariable),处理任务时提交的表单中的数据,默认属于整个流程, 如果设置为局部变量,则在act_ru_variable(变量表)中任务id不为空, 这样可以记录整个表单在流程中的变动情况

  1. act_ru_identitylink(运行时身份关联表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

GROUP_ID_

varchar

255

用户组id

TYPE_

varchar

255

id类型

USER_ID_

varchar

255

用户id

TASK_ID_

varchar

64

任务id

PROC_INST_ID_

varchar

64

流程实例id

PROC_DEF_ID_

varchar

64

流程定义id

SCOPE_ID_

varchar

255

范围id

SCOPE_TYPE_

varchar

255

SCOPE_DEFINITION_ID_

varchar

255

此表维护流程运行中与人员相关的所有信息,详细可以分为以下几类:

  • 任务的候选办理人
  • 流程的发起人
  • 流程的所有参与人(即流程任务的所有办理人与候选人)
  • 流程定义(processDefinition) 的授权用户,如果一个流程定义指定了哪些用户可以发起,

scope*: 这几个代表范围的字段目前没有找到相关的资料

USER_ID_/GROUP_ID_: 两个字段互斥, 只能一个有值,另一个为空

TYPE_: 身份类型, 流程引擎默认定义了5种,这里用到3种

  • starter
  • candidate
  • participant

TASK_ID_/PROC_INST_ID_/PROC_DEF_ID_: 三个字段互斥, 只能一个有值.

  • task_id: 这条记录表示任务的一个候选人/组
  • proc_inst_id: 这条记录表示流程的一个启动人(starter)或参与人(participant)
  • proc_def_id: 这条记录表示流程定义的授权用户
  1. act_ru_variable(运行变量表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

TYPE_

varchar

255

变量类型

NAME_

varchar

255

变量名称

EXECUTION_ID_

varchar

64

外键-执行id

PROC_INST_ID_

varchar

64

外键-流程id

TASK_ID_

varchar

64

任务id

SCOPE_ID_

varchar

255

范围id

SUB_SCOPE_ID_

varchar

255

下级范围

SCOPE_TYPE_

varchar

255

范围类型

BYTEARRAY_ID_

varchar

64

外键-bytearray表id

DOUBLE_

double

0

浮点值

LONG_

bigint

20

整形值

TEXT_

varchar

4000

文本值

TEXT2_

varchar

4000

TYPE_: 变量类型,这里即不是指js里的类型, 也不是java里的class,而是由flowable预定义的十几种类型,用户实现接口自定义变量类型.默认的类型有 null,string,longstring,interger,long,double,date,jodadate,jodadatetime,json,longjson,uuid,jpa-entity,jpa-entity-list(jpa的实体类), serializable,…

EXECUTION_ID_/PROC_INST_ID_:如果变量属于流程(不是一个localVariable),这两个一般相同

TASK_ID_: 如果是一个局部变量(localVariable),此字段为所属的任务的id,否则为空

SCOPE*: 范围相关字段,待验证,

BYTEARRAY_ID_:如果变量过长(longstring,长度>4000),或是字节数组类型,或者最终存为serializable类型(java默认的序列化),先插入到bytearray表,这里存id

DOUBLE_: 如果变量是一个浮点型

LONG_: 如果是整型变量

TEXT: 变量的文本表示,如果变量本身就是字符类型(string,json..),只有这一个有值

TEXT2: 只有存储jpa实体类时会用到,存储实体类对象的id

  • 历史(history)数据表

历史表与运行时表有很明显的对应关系, 有一对一型(如act_ru_task -> act_hi_taskinst);有多对一型,即历史表对运行时表中内容进行了细化拆分,保存到多个表中, 如 act_ru_execution -> act_hi_procinst+act_hi_actinst .

  1. act_hi_actinst(节点/活动历史)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

PROC_DEF_ID_

varchar

64

流程定义id

PROC_INST_ID_

varchar

64

流程实例id

EXECUTION_ID_

varchar

64

执行id

ACT_ID_

varchar

255

活动节点定义id

TASK_ID_

varchar

64

任务id

CALL_PROC_INST_ID_

varchar

64

调用的子流程id

ACT_NAME_

varchar

255

活动节点名称

ACT_TYPE_

varchar

255

活动节点类型

ASSIGNEE_

varchar

255

办理人

START_TIME_

datetime

3

开始时间

END_TIME_

datetime

3

结束时间

DURATION_

bigint

20

持续时长

DELETE_REASON_

varchar

4000

删除(结束)原因

TENANT_ID_

varchar

255

流程启动后,所有流程定义上的任务节点都会同时保存到此表, 与act_hi_taskinst表最大的不同是后者只保存用户任务(usertask)类型的任务节点,而此表会保存启动节点/结束节点/网关/调用子流程/服务类任务等. 另外流程实例不存此表.

TASK_ID_/ASSIGNEE_: 只有活动类型为userTask时有这两个值.

CALL_PROC_INST_ID_: 当调用子流程时为子流程的id

DELETE_REASON_: 活动的结束原因, 正常结束为null

DURATION_: 此活动的持续时长—开始到结束

  1. act_hi_procinst(历史流程表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

PROC_INST_ID_

varchar

64

流程id

BUSINESS_KEY_

varchar

255

业务标识

PROC_DEF_ID_

varchar

64

流程定义id

START_TIME_

datetime

3

开始时间

END_TIME_

datetime

3

结束时间

DURATION_

bigint

20

持续时长

START_USER_ID_

varchar

255

启动用户id

START_ACT_ID_

varchar

255

开始活动key

END_ACT_ID_

varchar

255

结束活动key

SUPER_PROCESS_INSTANCE_ID_

varchar

64

上级流程id

DELETE_REASON_

varchar

4000

删除/结束原因

TENANT_ID_

varchar

255

NAME_

varchar

255

流程名称

CALLBACK_ID_

varchar

255

CALLBACK_TYPE_

varchar

255

流程启动时,流程实例数据同时写入一条记录此表.

DELETE_REASON_: 结束原因, 正常结束时为null

SUPER_PROCESS_INSTANCE_ID_: 父级流程id,如果当前记录是一个子流程(内嵌子流程/调用子流程…)

CALLBACK_ID_/CALLBACK_TYPE_: 目前没找到有价值的资料

  1. act_hi_taskinst(历史用户任务表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

PROC_DEF_ID_

varchar

64

流程定义id

TASK_DEF_ID_

varchar

64

任务定义id,目前为空

TASK_DEF_KEY_

varchar

255

任务定义key

PROC_INST_ID_

varchar

64

流程实例id

EXECUTION_ID_

varchar

64

执行id

SCOPE_ID_

varchar

255

范围id

SUB_SCOPE_ID_

varchar

255

SCOPE_TYPE_

varchar

255

SCOPE_DEFINITION_ID_

varchar

255

NAME_

varchar

255

任务名称

PARENT_TASK_ID_

varchar

64

父级任务id

DESCRIPTION_

varchar

4000

描述

OWNER_

varchar

255

拥有者

ASSIGNEE_

varchar

255

办理人

START_TIME_

datetime

3

开始时间

CLAIM_TIME_

datetime

3

签收时间

END_TIME_

datetime

3

结束时间

DURATION_

bigint

20

持续时间

DELETE_REASON_

varchar

4000

删除/结束原因

PRIORITY_

int

11

优先级

DUE_DATE_

datetime

3

到期时间

FORM_KEY_

varchar

255

内置表单key

CATEGORY_

varchar

255

TENANT_ID_

varchar

255

LAST_UPDATED_TIME_

datetime

3

对应act_ru_task表, 字段含义参见:act_ru_task(运行任务表)

  1. act_hi_identitylink(历史身份关联表)

列名

类型

长度

备注

ID_

varchar

64

GROUP_ID_

varchar

255

TYPE_

varchar

255

USER_ID_

varchar

255

TASK_ID_

varchar

64

CREATE_TIME_

datetime

3

PROC_INST_ID_

varchar

64

SCOPE_ID_

varchar

255

SCOPE_TYPE_

varchar

255

SCOPE_DEFINITION_ID_

varchar

255

对应act_ru_identitylink 参见act_ru_identitylink(运行时身份关联表)

相比act_ru_identitylink 少了 proc_def_id 字段

  1. act_hi_varinst(历史变量表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

PROC_INST_ID_

varchar

64

流程实例id

EXECUTION_ID_

varchar

64

执行id

TASK_ID_

varchar

64

任务id

NAME_

varchar

255

变量名

VAR_TYPE_

varchar

100

变量类型

SCOPE_ID_

varchar

255

SUB_SCOPE_ID_

varchar

255

SCOPE_TYPE_

varchar

255

BYTEARRAY_ID_

varchar

64

DOUBLE_

double

0

LONG_

bigint

20

TEXT_

varchar

4000

TEXT2_

varchar

4000

CREATE_TIME_

datetime

3

创建时间

LAST_UPDATED_TIME_

datetime

3

对应 act_ru_variable表,字段含义参见act_ru_variable(运行变量表)

  1. act_hi_comment(审批意见表)

列名

类型

长度

备注

ID_

varchar

64

TYPE_

varchar

255

event|comment两种

TIME_

datetime

3

操作时间

USER_ID_

varchar

255

用户id

TASK_ID_

varchar

64

任务id

PROC_INST_ID_

varchar

64

流程实例id

ACTION_

varchar

255

动作

MESSAGE_

varchar

4000

意见

FULL_MSG_

longblob

0

完整意见

本表除了记录完成任务的手动添加的审批意见(taskService#addComment)外,还会记录用户任务(userTask)相关的事件.

TYPE_: comment->用户添加的审批意见,event->引擎记录的任务事件

ACTION_(动作):包括AddUserLink(任务添加用户)、DeleteUserLink(任务删除用户)、AddGroupLink(任务添加用户组)、DeleteGroupLink(任务添加用户组)、AddComment(添加审批意见)、AddAttachment(添加附件)、DeleteAttachment(删除附件)

PROC_INST_ID_: TYPE_为comment时, 为流程实例的id,方便根据流程实例查询所有审批意见.

MESSAGE_: TYPE_为comment时,为审批意见的内容, TYPE_为event时,事件的简单描述. 事件描述的格式为 主体_|_类型; 如果MESSAGE替换多余空白后超过指定长度(163个字符),则MESSAGE会被截断为前160个字符加上省略号. ACTION_为AddAttachment时, 为附件的name

FULL_MSG_: 字节形式存储的完整意见

  1. act_hi_attachment(附件表)

列名

类型

长度

备注

ID_

varchar

64

REV_

int

11

USER_ID_

varchar

255

NAME_

varchar

255

用户id

DESCRIPTION_

varchar

4000

附件名

TYPE_

varchar

255

类型

TASK_ID_

varchar

64

任务id

PROC_INST_ID_

varchar

64

流程实例id

URL_

varchar

4000

附件地址

CONTENT_ID_

varchar

64

bytearray表的id

TIME_

datetime

3

操作时间

url _/content_id_: 附件可以是一个地址,也可以是一个流(文件), 如果只是一个地址则保存在url_里, 否则先保存在bytearray表里, content_id_保存前面的id

  1. act_hi_detail(历史详情表?)

列名

类型

长度

备注

ID_

varchar

64

TYPE_

varchar

255

PROC_INST_ID_

varchar

64

EXECUTION_ID_

varchar

64

TASK_ID_

varchar

64

ACT_INST_ID_

varchar

64

NAME_

varchar

255

VAR_TYPE_

varchar

255

REV_

int

11

TIME_

datetime

3

BYTEARRAY_ID_

varchar

64

DOUBLE_

double

0

LONG_

bigint

20

TEXT_

varchar

4000

TEXT2_

varchar

4000

与变量表字段大致相同,参见act_hi_varinst(历史变量表)

此表记录流程变量的变动历史,但是与流程的历史级别(historyLevel)配置有关, historyLevel 分为4级: none, activity,audit,full, 默认为none,

  • none(无):跳过所有历史的存档。这是流程执行性能最高的配置,但是不会保存任何历史信息。
  • activity(活动):存档所有流程实例与活动实例。在流程实例结束时,将顶级流程实例变量的最新值复制为历史变量实例。但不会存档细节。
  • audit(审计):默认级别。将存档所有流程实例及活动实例,并保持变量值与提交的表单参数的同步,以保证所有通过表单进行的用户操作都可追踪、可审计。
  • full(完全):历史存档的最高级别,因此也最慢。这个级别存储所有audit级别存储的信息,加上所有其他细节(主要是流程变量的更新)。
  • 身份(identity)数据表(略)
  • 实例演示
  • 模型设计

模型创建

  1. 查询key是否唯一

SELECT DISTINCT     count( RES.ID_ )

FROM ACT_RE_MODEL RES

WHERE

     RES.KEY_ = 'engine-analysis'

  1. 生成id ,保存到act_re_model表

INSERT INTO ACT_RE_MODEL ( ID_, REV_, NAME_, KEY_, CATEGORY_, CREATE_TIME_, LAST_UPDATE_TIME_, VERSION_, META_INFO_, DEPLOYMENT_ID_, EDITOR_SOURCE_VALUE_ID_, EDITOR_SOURCE_EXTRA_VALUE_ID_, TENANT_ID_ )

VALUES    ( '19049', 1, '引擎分析', 'engine-analysis', NULL, '2019-03-04T10:13:33.853+0800', '2019-03-04T10:13:33.853+0800', 1, '{"name":"引擎分析","description":"用于分析flowable引擎各生命周期 数据库的运行"}', NULL, NULL, NULL, NULL )

  1. 保存模型的json配置数据和图片. 注意, 这部分是前当项目增加的一步处理——给新建的模型创建一个只有一个启动节点的模型, 并用这个模型生成流程图。

INSERT INTO ACT_GE_BYTEARRAY ( ID_, REV_, NAME_, BYTES_, DEPLOYMENT_ID_ )

VALUES

     ( '19050', 1, 'source', 'java.io.ByteArrayInputStream@6a9e145c', NULL ),

     ( '19051', 1, 'source-extra', 'java.io.ByteArrayInputStream@5ee461dc', NULL )

其实这一步已经包含了模型的更新, 后面在模型设计后的保存跟这里一样

UPDATE ACT_RE_MODEL SET REV_ = 2,LAST_UPDATE_TIME_ = '2019-03-04T10:13:33.875+0800',

EDITOR_SOURCE_VALUE_ID_ = '19050',EDITOR_SOURCE_EXTRA_VALUE_ID_ = '19051'

WHERE

     ID_ = '19049' AND REV_ = 1

  1. 模型列表查询, 默认查询最新版本(版本只在保存模型为新版本时增加)

SELECT DISTINCT RES.*FROM ACT_RE_MODEL RES WHERE RES.VERSION_=(

SELECT max(VERSION_) FROM ACT_RE_MODEL WHERE KEY_=RES.KEY_)

ORDER BY RES.LAST_UPDATE_TIME_ DESC LIMIT 10 OFFSET 0

  • 模型部署
  1. 根据要部署的模型的id查询出模型和资源文件(json)

select * from ACT_RE_MODEL where ID_ = '19049'

select * from ACT_GE_BYTEARRAY where ID_ = '19050'

  1. 根据模型的流程标识(key)查询出已经部署的最新版本的流程定义(以便设置本次部署的流程定义的id)及其附加信息(作用不明…)

select *

    from ACT_RE_PROCDEF

    where KEY_ = 'engine-analysis' and

          (TENANT_ID_ = ''  or TENANT_ID_ is null) and

          DERIVED_FROM_ is null and

          VERSION_ = (select max(VERSION_) from ACT_RE_PROCDEF where KEY_ = 'engine-analysis' and (TENANT_ID_ = '' or TENANT_ID_ is null))

select * from ACT_PROCDEF_INFO where PROC_DEF_ID_ = 'engine-analysis:1:19085'

  1. 新增一个流程定义(processDefinition),这个流程定义是从前面的模型资源文件(json)中解析出来的

INSERT INTO ACT_RE_PROCDEF (ID_,REV_,CATEGORY_,NAME_,KEY_,VERSION_,DEPLOYMENT_ID_,

RESOURCE_NAME_,DGRM_RESOURCE_NAME_,DESCRIPTION_,HAS_START_FORM_KEY_,HAS_GRAPHICAL_NOTATION_,SUSPENSION_STATE_,DERIVED_FROM_,DERIVED_FROM_ROOT_,DERIVED_VERSION_,TENANT_ID_,ENGINE_VERSION_)

VALUES ('engine-analysis:1:19085',1,'http://www.activiti.org/processdef','引擎分析','engine-analysis',1,'19082','19049.bpmn20.xml','19049.engine-analysis.png',NULL,FALSE,TRUE,1,NULL,NULL,0,'',NULL)

  1. 新增一条部署

insert into ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_, DERIVED_FROM_, DERIVED_FROM_ROOT_, ENGINE_VERSION_)

values('19082', '19049.bpmn20.xml', '19049', NULL, '', '2019-03-04T11:18:50.263+0800', NULL, NULL, NULL)

  1. 保存xml和图片 到 bytearray(二进制数据)表

INSERT INTO ACT_GE_BYTEARRAY (ID_,REV_,NAME_,BYTES_,DEPLOYMENT_ID_,GENERATED_) VALUES ('19083',1,'19049.bpmn20.xml','java.io.ByteArrayInputStream@719de1c6','19082',FALSE),('19084',1,'19049.engine-analysis.png','java.io.ByteArrayInputStream@37e9c84c','19082',TRUE)

  1. 更新模型的部署id(DEPLOYMENT_ID_) 为本次部署的id

UPDATE ACT_RE_MODEL

SET REV_=4,DEPLOYMENT_ID_='19082' WHERE ID_='19049' AND REV_=3

  • 运行分析

以刚才的流程为例(包含了网关 ,流条件,多实例(会签)等常用元素)

假设现在某单位要招聘一位保洁(女)和一个专业技工(男),如果女就让人事审核个人条件,如果男就让技术岗的几个一起审核,确定是否通过

情形1 (人事分支)

  • 启动流程

报文如下:

{

    "processDefinitionKey": "engine-analysis",

    "variables": [

        {"name": "name","value": "王小丽"},

        {"name": "sex","value": "女"},

        {"name":"userIds","value":[827,913], "type":"json"}

    ]

}

以下为实际的数据库表操作作

  1. 根据 模型标识 engine-analysis 找出最新的流程定义

SELECT*FROM ACT_RE_PROCDEF WHERE KEY_='engine-analysis' AND (TENANT_ID_='' OR TENANT_ID_ IS NULL) AND DERIVED_FROM_ IS NULL AND VERSION_=(SELECT max(VERSION_) FROM ACT_RE_PROCDEF WHERE KEY_='engine-analysis' AND (TENANT_ID_='' OR TENANT_ID_ IS NULL))

  1. 找出上一步流程定义对应的模型(新版已弃用这种方式),目的是为了找到流程配置的关联表单的信息

SELECT m.*FROM act_re_model m JOIN act_re_deployment d ON d.CATEGORY_=m.ID_ JOIN act_re_procdef pd

ON pd.DEPLOYMENT_ID_=d.ID_ WHERE pd.ID_='engine-analysis:6:22635'

  1. 在历史变量表中插入提交的变量(initiator为流程启动人)

INSERT INTO ACT_HI_VARINST

(ID_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,NAME_,REV_,VAR_TYPE_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_,CREATE_TIME_,LAST_UPDATED_TIME_)

VALUES

('22724','22723','22723',NULL,'initiator',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'827',NULL,'2019-03-04T14:47:41.948+0800','2019-03-04T14:47:41.948+0800'),

('22726','22723','22723',NULL,'sex',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'女',NULL,'2019-03-04T14:47:41.948+0800','2019-03-04T14:47:41.948+0800'),

('22727','22723','22723',NULL,'userIds',0,'json',NULL,NULL,NULL,NULL,NULL,NULL,'[827,913]',NULL,'2019-03-04T14:47:41.949+0800','2019-03-04T14:47:41.949+0800'),

('22728','22723','22723',NULL,'name',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'王小丽',NULL,'2019-03-04T14:47:41.949+0800','2019-03-04T14:47:41.949+0800')

  1. 历史任务表中插入用户任务(这里为“人事审批”)

INSERT INTO ACT_HI_TASKINST

(ID_,REV_,TASK_DEF_ID_,PROC_DEF_ID_,PROC_INST_ID_,EXECUTION_ID_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,NAME_,PARENT_TASK_ID_,DESCRIPTION_,OWNER_,ASSIGNEE_,START_TIME_,CLAIM_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TASK_DEF_KEY_,FORM_KEY_,PRIORITY_,DUE_DATE_,CATEGORY_,TENANT_ID_,LAST_UPDATED_TIME_)

VALUES

('22733',1,NULL,'engine-analysis:6:22635','22723','22729',NULL,NULL,NULL,NULL,'人事审批',NULL,NULL,NULL,'827','2019-03-04T14:47:41.993+0800',NULL,NULL,NULL,NULL,'sid-51034C40-84DF-4B95-8E00-8AA1E319D907',NULL,50,NULL,NULL,'','2019-03-04T14:47:41.993+0800')

  1. 历史流程实例表中插入当前的流程实例

INSERT INTO ACT_HI_PROCINST

(ID_,REV_,PROC_INST_ID_,BUSINESS_KEY_,PROC_DEF_ID_,START_TIME_,END_TIME_,DURATION_,START_USER_ID_,START_ACT_ID_,END_ACT_ID_,SUPER_PROCESS_INSTANCE_ID_,DELETE_REASON_,TENANT_ID_,NAME_,CALLBACK_ID_,CALLBACK_TYPE_)

VALUES

('22723',1,'22723',NULL,'engine-analysis:6:22635','2019-03-04T14:47:41.948+0800',NULL,NULL,'827','startEvent1',NULL,NULL,NULL,'',NULL,NULL,NULL)

  1. 历史活动表中插入到“人事审批”为止的所有活动(这里包括启动节点、网关及用户任务)

INSERT INTO ACT_HI_ACTINST

(ID_,REV_,PROC_DEF_ID_,PROC_INST_ID_,EXECUTION_ID_,ACT_ID_,TASK_ID_,CALL_PROC_INST_ID_,ACT_NAME_,ACT_TYPE_,ASSIGNEE_,START_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TENANT_ID_) VALUES

('22730',1,'engine-analysis:6:22635','22723','22729','startEvent1',NULL,NULL,NULL,'startEvent',NULL,'2019-03-04T14:47:41.992+0800','2019-03-04T14:47:41.992+0800',0,NULL,''),

('22731',1,'engine-analysis:6:22635','22723','22729','sid-DED1A19D-155A-4DA0-9459-8DD35610D572',NULL,NULL,NULL,'exclusiveGateway',NULL,'2019-03-04T14:47:41.992+0800','2019-03-04T14:47:41.993+0800',1,NULL,''),

('22732',1,'engine-analysis:6:22635','22723','22729','sid-51034C40-84DF-4B95-8E00-8AA1E319D907','22733',NULL,'人事审批','userTask','827','2019-03-04T14:47:41.993+0800',NULL,NULL,NULL,'')

  1. 历史身份关系表中,插入启动人+下一任务的办理人及参与人( 这里都是同一个人)

INSERT INTO ACT_HI_IDENTITYLINK

(ID_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,CREATE_TIME_)

VALUES

('22725','starter','827',NULL,NULL,'22723',NULL,NULL,NULL,NULL),

('22734','assignee','827',NULL,'22733',NULL,NULL,NULL,NULL,'2019-03-04T14:47:41.993+0800'),

('22735','participant','827',NULL,NULL,'22723',NULL,NULL,NULL,NULL)

下面是运行时表部分

  1. 执行表中插入 流程实例+用户任务

INSERT INTO ACT_RU_EXECUTION

(ID_,REV_,PROC_INST_ID_,BUSINESS_KEY_,PROC_DEF_ID_,ACT_ID_,IS_ACTIVE_,IS_CONCURRENT_,IS_SCOPE_,IS_EVENT_SCOPE_,IS_MI_ROOT_,PARENT_ID_,SUPER_EXEC_,ROOT_PROC_INST_ID_,SUSPENSION_STATE_,TENANT_ID_,NAME_,START_ACT_ID_,START_TIME_,START_USER_ID_,IS_COUNT_ENABLED_,EVT_SUBSCR_COUNT_,TASK_COUNT_,JOB_COUNT_,TIMER_JOB_COUNT_,SUSP_JOB_COUNT_,DEADLETTER_JOB_COUNT_,VAR_COUNT_,ID_LINK_COUNT_,CALLBACK_ID_,CALLBACK_TYPE_)

VALUES

('22723',1,'22723',NULL,'engine-analysis:6:22635',NULL,TRUE,FALSE,TRUE,FALSE,FALSE,NULL,NULL,'22723',1,'',NULL,'startEvent1','2019-03-04T14:47:41.948+0800','827',TRUE,0,0,0,0,0,0,0,0,NULL,NULL),

('22729',1,'22723',NULL,'engine-analysis:6:22635','sid-51034C40-84DF-4B95-8E00-8AA1E319D907',TRUE,FALSE,FALSE,FALSE,FALSE,'22723',NULL,'22723',1,'',NULL,NULL,'2019-03-04T14:47:41.949+0800',NULL,TRUE,0,1,0,0,0,0,0,0,NULL,NULL)

  1. 用户任务表中插入当前流程的下一个用户任务

INSERT INTO ACT_RU_TASK (ID_,REV_,NAME_,PARENT_TASK_ID_,DESCRIPTION_,PRIORITY_,CREATE_TIME_,OWNER_,ASSIGNEE_,DELEGATION_,EXECUTION_ID_,PROC_INST_ID_,PROC_DEF_ID_,TASK_DEF_ID_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,TASK_DEF_KEY_,DUE_DATE_,CATEGORY_,SUSPENSION_STATE_,TENANT_ID_,FORM_KEY_,CLAIM_TIME_,IS_COUNT_ENABLED_,VAR_COUNT_,ID_LINK_COUNT_,SUB_TASK_COUNT_) VALUES ('22733',1,'人事审批',NULL,NULL,50,'2019-03-04T14:47:41.993+0800',NULL,'827',NULL,'22729','22723','engine-analysis:6:22635',NULL,NULL,NULL,NULL,NULL,'sid-51034C40-84DF-4B95-8E00-8AA1E319D907',NULL,NULL,1,'',NULL,NULL,TRUE,0,0,0)

  1. 运行时身份关联表中插入启动人和用户任务的参与人(候选人candidate或办理人assignee)

INSERT INTO ACT_RU_IDENTITYLINK ( ID_, REV_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_, SCOPE_ID_, SCOPE_TYPE_, SCOPE_DEFINITION_ID_ )

VALUES

     ( '22725', 1, 'starter', '827', NULL, NULL, '22723', NULL, NULL, NULL, NULL ),

     ( '22735', 1, 'participant', '827', NULL, NULL, '22723', NULL, NULL, NULL, NULL )

  1. 在运行变量表中插入变量(与历史变量表中相同)

INSERT INTO ACT_RU_VARIABLE (ID_,REV_,TYPE_,NAME_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_) VALUES

('22724',1,'string','initiator','22723','22723',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'827',NULL),

('22726',1,'string','sex','22723','22723',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'女',NULL),

('22727',1,'json','userIds','22723','22723',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'[827,913]',NULL),

('22728',1,'string','name','22723','22723',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'王小丽',NULL)

  • 查询待办任务

SELECT DISTINCT RES.*FROM ACT_RU_TASK RES LEFT JOIN ACT_RU_IDENTITYLINK I ON I.TASK_ID_=RES.ID_ WHERE RES.SUSPENSION_STATE_=1 AND (RES.ASSIGNEE_='827' OR (RES.ASSIGNEE_ IS NULL AND I.TYPE_='candidate' AND (I.USER_ID_='827' OR I.GROUP_ID_ IN ('58')))) ORDER BY RES.CREATE_TIME_ DESC LIMIT 10 OFFSET 0

  • 完成任务
  1. 查询任务

select * from ACT_RU_TASK where ID_ = '22733'

select * from ACT_RU_EXECUTION where ID_ = '22723'

  1. 插入审批意见

INSERT INTO ACT_HI_COMMENT ( ID_, TYPE_, TIME_, USER_ID_, TASK_ID_, PROC_INST_ID_, ACTION_, MESSAGE_, FULL_MSG_ )

VALUES

     ( '22736', 'comment', '2019-03-04T16:24:23.086+0800', '827', '22733', '22723', 'AddComment', '已审核', 'java.io.ByteArrayInputStream@44dba63a' )

  1. 查询所有变量(这里使用taskId查询, 得到的是本地变量)

SELECT*FROM ACT_RU_VARIABLE WHERE TASK_ID_='22733' AND NAME_=’变量名’

  • 插入新添加的变量到历史变量表

INSERT INTO ACT_HI_VARINST (ID_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,NAME_,REV_,VAR_TYPE_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_,CREATE_TIME_,LAST_UPDATED_TIME_)

VALUES

('22739','22723','22729','22733','sex',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'女',NULL,'2019-03-04T16:24:23.168+0800','2019-03-04T16:24:23.168+0800'),

('22740','22723','22729','22733','name',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'王小丽',NULL,'2019-03-04T16:24:23.169+0800','2019-03-04T16:24:23.169+0800'),

 ('22742','22723','22729','22733','comment',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'已审核',NULL,'2019-03-04T16:24:23.172+0800','2019-03-04T16:24:23.172+0800')

  1. 插入新添加的变量到变量表

INSERT INTO ACT_RU_VARIABLE (ID_,REV_,TYPE_,NAME_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_) VALUES ('22739',1,'string','sex','22723','22729','22733',NULL,NULL,NULL,NULL,NULL,NULL,'女',NULL),('22740',1,'string','name','22723','22729','22733',NULL,NULL,NULL,NULL,NULL,NULL,'王小丽',NULL),('22742',1,'string','comment','22723','22729','22733',NULL,NULL,NULL,NULL,NULL,NULL,'已审核',NULL),

  1. 更新变量数(有变量没有完全列出来)

UPDATE ACT_RU_TASK

SET REV_=2,VAR_COUNT_=8 WHERE ID_='22733' AND REV_=1

  1. 历史活动本中插入结束节点(因为这个流程只有一个审批节点)

INSERT INTO ACT_HI_ACTINST (ID_,REV_,PROC_DEF_ID_,PROC_INST_ID_,EXECUTION_ID_,ACT_ID_,TASK_ID_,CALL_PROC_INST_ID_,ACT_NAME_,ACT_TYPE_,ASSIGNEE_,START_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TENANT_ID_) VALUES ('22752',1,'engine-analysis:6:22635','22723','22729','sid-0FB2BB86-A4C7-42CD-A3EC-7FE0BC64FFAA',NULL,NULL,NULL,'endEvent',NULL,'2019-03-04T16:24:23.207+0800','2019-03-04T16:24:23.207+0800',0,NULL,'')

  1. 插入历史用户关系(这个参数人为当前的用户任务的办理人)

INSERT INTO ACT_HI_IDENTITYLINK (ID_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,CREATE_TIME_) VALUES ('22751','participant','827',NULL,NULL,'22723',NULL,NULL,NULL,NULL)

  1. 置空变量? 这个作用未知

UPDATE ACT_HI_VARINST

SET REV_=1,BYTEARRAY_ID_=NULL,LAST_UPDATED_TIME_='2019-03-04T16:24:23.200+0800' WHERE ID_='22726' AND REV_=0

  1. 同上

UPDATE ACT_HI_VARINST

SET REV_=1,BYTEARRAY_ID_=NULL,LAST_UPDATED_TIME_='2019-03-04T16:24:23.201+0800' WHERE ID_='22728' AND REV_=0

  1. 更新历史用户任务表,设置结束时间

UPDATE ACT_HI_TASKINST

SET REV_=2,END_TIME_='2019-03-04T16:24:23.204+0800',DURATION_=5801211,LAST_UPDATED_TIME_='2019-03-04T16:24:23.204+0800' WHERE ID_='22733' AND REV_=1

  1. 更新历史活动表

UPDATE ACT_HI_ACTINST

SET REV_=2,PROC_DEF_ID_='engine-analysis:6:22635',END_TIME_='2019-03-04T16:24:23.207+0800',DURATION_=5801214 WHERE ID_='22732' AND REV_=1

  1. 更新执行状态

UPDATE ACT_RU_EXECUTION

SET REV_=2,IS_ACTIVE_=FALSE WHERE ID_='22723' AND REV_=1

UPDATE ACT_RU_EXECUTION

SET REV_=2,ACT_ID_='sid-0FB2BB86-A4C7-42CD-A3EC-7FE0BC64FFAA',IS_ACTIVE_=FALSE,TASK_COUNT_=0 WHERE ID_='22729' AND REV_=1

  1. 更新历史流程实例表

UPDATE ACT_HI_PROCINST

SET REV_=2,END_TIME_='2019-03-04T16:24:23.288+0800',DURATION_=5801340,END_ACT_ID_='sid-0FB2BB86-A4C7-42CD-A3EC-7FE0BC64FFAA' WHERE ID_='22723' AND REV_=1

  1. 从运行时表中清除所有运行结束的任务/变量/流程/用户关联

delete from ACT_RU_VARIABLE where TASK_ID_ = '22733'

delete from ACT_RU_VARIABLE where EXECUTION_ID_ = '22723'

delete from ACT_RU_IDENTITYLINK where PROC_INST_ID_ = '22723'

delete from ACT_RU_TASK where ID_ = '22733' and REV_ = 2

delete from ACT_RU_TASK where EXECUTION_ID_ = '22723'

delete from ACT_RU_EXECUTION where ID_ = '22729' and REV_ = 2

delete from ACT_RU_EXECUTION where ID_ = '22723' and REV_ = 2

情形2( 会签分支)

  • 启动流程

报文如下:

{

    "processDefinitionKey": "engine-analysis",

    "variables": [

        {"name": "name","value": "王大力"},

        {"name": "sex","value": "男"},

        {"name":"userIds","value":[827,913], "type":"json"}

    ]

}

以下只列出与情形1 不同的部分

  1. 在历史变量表中插入提交的变量

INSERT INTO plumdo_flow.ACT_HI_VARINST (ID_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,NAME_,REV_,VAR_TYPE_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_,CREATE_TIME_,LAST_UPDATED_TIME_)

VALUES

('22794','22793','22793',NULL,'initiator',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'827',NULL,'2019-03-04T17:21:41.700+0800','2019-03-04T17:21:41.700+0800'),

('22796','22793','22793',NULL,'sex',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'男',NULL,'2019-03-04T17:21:41.700+0800','2019-03-04T17:21:41.700+0800'),

('22797','22793','22793',NULL,'userIds',0,'json',NULL,NULL,NULL,NULL,NULL,NULL,'[827,913]',NULL,'2019-03-04T17:21:41.700+0800','2019-03-04T17:21:41.700+0800'),

('22798','22793','22793',NULL,'name',0,'string',NULL,NULL,NULL,NULL,NULL,NULL,'王大力',NULL,'2019-03-04T17:21:41.700+0800','2019-03-04T17:21:41.700+0800'),

('22803','22793','22802',NULL,'nrOfInstances',0,'integer',NULL,NULL,NULL,NULL,NULL,2,'2',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22804','22793','22802',NULL,'nrOfCompletedInstances',0,'integer',NULL,NULL,NULL,NULL,NULL,0,'0',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22805','22793','22802',NULL,'nrOfActiveInstances',0,'integer',NULL,NULL,NULL,NULL,NULL,2,'2',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22808','22793','22806',NULL,'muser',0,'json',NULL,NULL,NULL,NULL,NULL,NULL,'827',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22809','22793','22807',NULL,'muser',0,'json',NULL,NULL,NULL,NULL,NULL,NULL,'913',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22810','22793','22806',NULL,'loopCounter',0,'integer',NULL,NULL,NULL,NULL,NULL,0,'0',NULL,'2019-03-04T17:21:41.760+0800','2019-03-04T17:21:41.760+0800'),

('22815','22793','22807',NULL,'loopCounter',0,'integer',NULL,NULL,NULL,NULL,NULL,1,'1',NULL,'2019-03-04T17:21:41.762+0800','2019-03-04T17:21:41.762+0800')

相比情形1, 多出上面用颜色本出的几个变量

nrOf* 这三个(蓝色标出),是控制多实例(会签)的核心,是当前多实例任务的整体状态

'nrOfInstances' : 实例数

'nrOfCompletedInstances' : 完成的实例数

'nrOfActiveInstances' :激活的实例数

绿色和紫色分别表示属于两个实例的变量, muser为设置的办理人, loopCounter为循环计数

  1. 在历史变量表中插入提交的变量

INSERT INTO plumdo_flow.ACT_HI_TASKINST (ID_,REV_,TASK_DEF_ID_,PROC_DEF_ID_,PROC_INST_ID_,EXECUTION_ID_,SCOPE_ID_,SUB_SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,NAME_,PARENT_TASK_ID_,DESCRIPTION_,OWNER_,ASSIGNEE_,START_TIME_,CLAIM_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TASK_DEF_KEY_,FORM_KEY_,PRIORITY_,DUE_DATE_,CATEGORY_,TENANT_ID_,LAST_UPDATED_TIME_)

VALUES

('22812',1,NULL,'engine-analysis:6:22635','22793','22806',NULL,NULL,NULL,NULL,'技术组会审',NULL,NULL,NULL,'827','2019-03-04T17:21:41.761+0800',NULL,NULL,NULL,NULL,'sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB',NULL,50,NULL,NULL,'','2019-03-04T17:21:41.761+0800'),

('22817',1,NULL,'engine-analysis:6:22635','22793','22807',NULL,NULL,NULL,NULL,'技术组会审',NULL,NULL,NULL,'913','2019-03-04T17:21:41.762+0800',NULL,NULL,NULL,NULL,'sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB',NULL,50,NULL,NULL,'','2019-03-04T17:21:41.762+0800')

这里比情形一多出一个任务

  1. 历史活动表

INSERT INTO plumdo_flow.ACT_HI_ACTINST (ID_,REV_,PROC_DEF_ID_,PROC_INST_ID_,EXECUTION_ID_,ACT_ID_,TASK_ID_,CALL_PROC_INST_ID_,ACT_NAME_,ACT_TYPE_,ASSIGNEE_,START_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TENANT_ID_)

VALUES

('22800',1,'engine-analysis:6:22635','22793','22799','startEvent1',NULL,NULL,NULL,'startEvent',NULL,'2019-03-04T17:21:41.759+0800','2019-03-04T17:21:41.759+0800',0,NULL,''),

('22801',1,'engine-analysis:6:22635','22793','22799','sid-DED1A19D-155A-4DA0-9459-8DD35610D572',NULL,NULL,NULL,'exclusiveGateway',NULL,'2019-03-04T17:21:41.759+0800','2019-03-04T17:21:41.759+0800',0,NULL,''),

('22811',1,'engine-analysis:6:22635','22793','22806','sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB','22812',NULL,'技术组会审','userTask','827','2019-03-04T17:21:41.760+0800',NULL,NULL,NULL,''),

('22816',1,'engine-analysis:6:22635','22793','22807','sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB','22817',NULL,'技术组会审','userTask','913','2019-03-04T17:21:41.762+0800',NULL,NULL,NULL,'')

同上,多出一个 “活动”

  1. 历史用户关联表

INSERT INTO plumdo_flow.ACT_HI_IDENTITYLINK (ID_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,CREATE_TIME_)

VALUES

('22795','starter','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL),

('22813','assignee','827',NULL,'22812',NULL,NULL,NULL,NULL,'2019-03-04T17:21:41.761+0800'),

('22814','participant','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL),

('22818','assignee','913',NULL,'22817',NULL,NULL,NULL,NULL,'2019-03-04T17:21:41.762+0800'),

('22819','participant','913',NULL,NULL,'22793',NULL,NULL,NULL,NULL)

  1. 执行表

INSERT INTO plumdo_flow.ACT_RU_EXECUTION (ID_,REV_,PROC_INST_ID_,BUSINESS_KEY_,PROC_DEF_ID_,ACT_ID_,IS_ACTIVE_,IS_CONCURRENT_,IS_SCOPE_,IS_EVENT_SCOPE_,IS_MI_ROOT_,PARENT_ID_,SUPER_EXEC_,ROOT_PROC_INST_ID_,SUSPENSION_STATE_,TENANT_ID_,NAME_,START_ACT_ID_,START_TIME_,START_USER_ID_,IS_COUNT_ENABLED_,EVT_SUBSCR_COUNT_,TASK_COUNT_,JOB_COUNT_,TIMER_JOB_COUNT_,SUSP_JOB_COUNT_,DEADLETTER_JOB_COUNT_,VAR_COUNT_,ID_LINK_COUNT_,CALLBACK_ID_,CALLBACK_TYPE_)

VALUES

('22793',1,'22793',NULL,'engine-analysis:6:22635',NULL,TRUE,FALSE,TRUE,FALSE,FALSE,NULL,NULL,'22793',1,'',NULL,'startEvent1','2019-03-04T17:21:41.700+0800','827',TRUE,0,0,0,0,0,0,0,0,NULL,NULL),

('22802',1,'22793',NULL,'engine-analysis:6:22635','sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB',FALSE,FALSE,FALSE,FALSE,TRUE,'22793',NULL,'22793',1,'',NULL,NULL,'2019-03-04T17:21:41.759+0800',NULL,TRUE,0,0,0,0,0,0,3,0,NULL,NULL),

('22806',1,'22793',NULL,'engine-analysis:6:22635','sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB',TRUE,FALSE,FALSE,FALSE,FALSE,'22802',NULL,'22793',1,'',NULL,NULL,'2019-03-04T17:21:41.760+0800',NULL,TRUE,0,1,0,0,0,0,2,0,NULL,NULL),

('22807',1,'22793',NULL,'engine-analysis:6:22635','sid-9ADB3DEF-36DB-49F6-AB8C-8C3B723031EB',TRUE,FALSE,FALSE,FALSE,FALSE,'22802',NULL,'22793',1,'',NULL,NULL,'2019-03-04T17:21:41.760+0800',NULL,TRUE,0,1,0,0,0,0,2,0,NULL,NULL)

扫行表中比情形1多出两条,有三个ACT_ID_相同的任务, 除了多实例多出来的一条之外, 还有一个状态是未激活(IS_ACTIVE_=FALSE)是多实例的父级任务.

  1. 运行时用户关系表

INSERT INTO plumdo_flow.ACT_RU_IDENTITYLINK (ID_,REV_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,PROC_DEF_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_)

VALUES

('22795',1,'starter','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL),

('22814',1,'participant','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL),

('22819',1,'participant','913',NULL,NULL,'22793',NULL,NULL,NULL,NULL)

  • 完成任务
  1. 历史用户关系表

INSERT INTO plumdo_flow.ACT_HI_IDENTITYLINK (ID_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_,CREATE_TIME_)

VALUES ('22939','participant','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL);

  1. 运行用户关系表

INSERT INTO plumdo_flow.ACT_RU_IDENTITYLINK (ID_,REV_,TYPE_,USER_ID_,GROUP_ID_,TASK_ID_,PROC_INST_ID_,PROC_DEF_ID_,SCOPE_ID_,SCOPE_TYPE_,SCOPE_DEFINITION_ID_)

VALUES ('22939',1,'participant','827',NULL,NULL,'22793',NULL,NULL,NULL,NULL);

  1. 历史任务表 设置完成时间

UPDATE plumdo_flow.ACT_HI_TASKINST

SET REV_=2,END_TIME_='2019-03-04T18:13:09.840+0800',DURATION_=3088079,LAST_UPDATED_TIME_='2019-03-04T18:13:09.840+0800' WHERE ID_='22812' AND REV_=1;

  1. 历史变量表

nrOfCompletedInstances(完成的实例数)

UPDATE plumdo_flow.ACT_HI_VARINST

SET REV_=1,BYTEARRAY_ID_=NULL,LONG_=1,TEXT_='1',LAST_UPDATED_TIME_='2019-03-04T18:13:09.849+0800' WHERE ID_='22804' AND REV_=0;

nrOfActiveInstances(激活的实例数)

UPDATE plumdo_flow.ACT_HI_VARINST

SET REV_=1,BYTEARRAY_ID_=NULL,LONG_=1,TEXT_='1',LAST_UPDATED_TIME_='2019-03-04T18:13:09.850+0800' WHERE ID_='22805' AND REV_=0;

nrOfCompletedInstances(完成的实例数)

UPDATE plumdo_flow.ACT_RU_VARIABLE

SET REV_=2,BYTEARRAY_ID_=NULL,LONG_=1,TEXT_='1' WHERE ID_='22804' AND REV_=1;

nrOfActiveInstances(激活的实例数)

UPDATE plumdo_flow.ACT_RU_VARIABLE

SET REV_=2,BYTEARRAY_ID_=NULL,LONG_=1,TEXT_='1' WHERE ID_='22805' AND REV_=1;

  1. 历吏活动表,更新完成时间

UPDATE plumdo_flow.ACT_HI_ACTINST

SET REV_=2,PROC_DEF_ID_='engine-analysis:6:22635',END_TIME_='2019-03-04T18:13:09.852+0800',DURATION_=3088092 WHERE ID_='22811' AND REV_=1;

  1. 更新扫行表,更新激活状态

UPDATE plumdo_flow.ACT_RU_EXECUTION

SET REV_=2,IS_ACTIVE_=FALSE,TASK_COUNT_=0 WHERE ID_='22806' AND REV_=1;

  1. 从运行任务表中删除

DELETE FROM plumdo_flow.ACT_RU_TASK WHERE ID_='22812' AND REV_=1;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表名约定
  • 表字段约定/规范:
  • 作业(job)部分:
  • 任务(task)部分
  • 情形1 (人事分支)
  • 情形2( 会签分支)
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档