flowable流程引擎分析
历史: flowable工作流引擎是从jboss的jbpm->alfresco的activiti->flowable 逐步演化过来的, 核心开发人员是同一个团队. 都是因为与原公司的设计理念存在分歧,导致两次出走. flowable自16年fork之后,已经成为一个活跃的社区,逐步赢得的许多工作流引擎使用者的青睐.
- 数据表分析
- 概述:
引擎所需的数据表可以配置为在启动时进行生成,有以下规范:
表名约定
所有的表都以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*: 代表表单相关的字段,内置的表单引擎功能单一,在开发中一般用不到.
- 通用表部分
- act_ge_property(属性表)
列名 | 类型 | 长度 | 备注 |
NAME_ | varchar | 64 | 属性名 |
VALUE_ | varchar | 300 | 属性值 |
REV_ | int | 11 |
表中 name_ 为 *.version的字段, 表示当前使用的flowable引擎的版本(初始化数据库的版本), 版本升级时要更新这些字段否则不能启动.
next.dbid 手动维护一个id生成的序列,集群高并发情况下可以通过配置使用uuid 生成器
- 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)表
- 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”
- 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;
- 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对其进行修改, 而不需要对其重新部署, 目前还没有想到合适的业务场景
- 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版本进行了拆分细化,以提高异步任务查询的性能. 异步执行器会定时查询下面的表,比较到期时间,决定是否运行一个异步任务.
- act_ru_job
运行流程实例(即调用API)时插入数据库。如果当前Flowable引擎启用了异步执行器,则该异步作业将被锁定(locked)。即在ACT_RU_JOB表中插入一个作业条目,并设置其lock owner(锁持有人)与lock expiration time(锁到期时间)。在API调用成功后触发的事务监听器(transaction commit listener),将会触发同一引擎中的异步执行器,让其执行该作业(因此可以保证数据库中已经保存了数据)。为此,异步执行器使用(可配置的)线程池,从其中取出线程用于执行作业,并使流程可以异步进行。如果Flowable引擎未启用异步执行器,则异步作业仍会插入ACT_RU_JOB表,但不会被锁定
- act_ru_timer_job
定时器(例如边界事件或用户任务中的定时器), 保存在ACT_RU_TIMER_JOB表中,并带有给定的到期日期。异步执行器中有一个线程,周期性地检查是否有需要触发的定时器(也就是说,到期日期在当前时间“之前”)。当需要触发定时器时,从JOB表中移除该定时器,并创建一个异步作业(async job)
- act_ru_suspended_job
流程定义与流程实例都可以被暂停。这些定义或实例所关联的暂停作业,将被移至ACT_RU_SUSPENDED_JOB表,以确保用于获取作业的查询语句中的where条件尽量少
- act_ru_deadletter_job
如果在执行作业期间发生了异常,这个异步作业将会转化为一个定时器作业,并带有一个到期日期。之后,它将会像普通定时器作业一样被获取,并重新变回异步作业,以实现重试。当一个作业已经重试了(可配置)几次,仍然失败,则作业被视为“死亡(dead)”,并被移至ACT_RU_DEADLETTER_JOB表。“死信(deadletter)”的概念在各种其他系统中也广泛使用。管理员需要检查失败作业的异常信息,并进行相应操作
- act_ru_history_job
异步任务历史?, 默认不启用
- act_ru_event_subscr
事件订阅,如果流程配置为信号(signal)或消息(message)启动, 或流程定义了信号事件时,会在此表中插入记录 暂时未找到其他相关资料
作业部分总结:
异步执行器是一个高度可配置的组件,官方文档上介绍可以根据需要替换为自己的异步执行器,如使用消息队列.
任务(task)部分
以下几个表为用户审批任务的核心:
列名 | 类型 | 长度 | 备注 |
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
列名 | 类型 | 长度 | 备注 |
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不为空, 这样可以记录整个表单在流程中的变动情况
列名 | 类型 | 长度 | 备注 |
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: 这条记录表示流程定义的授权用户
列名 | 类型 | 长度 | 备注 |
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 .
列名 | 类型 | 长度 | 备注 |
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_: 此活动的持续时长—开始到结束
列名 | 类型 | 长度 | 备注 |
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_: 目前没找到有价值的资料
列名 | 类型 | 长度 | 备注 |
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(运行任务表)
列名 | 类型 | 长度 | 备注 |
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 字段
列名 | 类型 | 长度 | 备注 |
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(运行变量表)
- 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_: 字节形式存储的完整意见
- 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
- 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)数据表(略)
- 实例演示
- 模型设计
模型创建
- 查询key是否唯一
SELECT DISTINCT count( RES.ID_ )
FROM ACT_RE_MODEL RES
WHERE
RES.KEY_ = 'engine-analysis'
- 生成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 )
- 保存模型的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
- 模型列表查询, 默认查询最新版本(版本只在保存模型为新版本时增加)
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
- 模型部署
- 根据要部署的模型的id查询出模型和资源文件(json)
select * from ACT_RE_MODEL where ID_ = '19049'
select * from ACT_GE_BYTEARRAY where ID_ = '19050'
- 根据模型的流程标识(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'
- 新增一个流程定义(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)
- 新增一条部署
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)
- 保存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)
- 更新模型的部署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"}
]
}
以下为实际的数据库表操作作
- 根据 模型标识 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))
- 找出上一步流程定义对应的模型(新版已弃用这种方式),目的是为了找到流程配置的关联表单的信息
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'
- 在历史变量表中插入提交的变量(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')
- 在历史任务表中插入用户任务(这里为“人事审批”)
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')
- 在历史流程实例表中插入当前的流程实例
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)
- 在历史活动表中插入到“人事审批”为止的所有活动(这里包括启动节点、网关及用户任务)
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,'')
- 在历史身份关系表中,插入启动人+下一任务的办理人及参与人( 这里都是同一个人)
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)
下面是运行时表部分
- 在执行表中插入 流程实例+用户任务
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)
- 在用户任务表中插入当前流程的下一个用户任务
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)
- 在运行时身份关联表中插入启动人和用户任务的参与人(候选人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 )
- 在运行变量表中插入变量(与历史变量表中相同)
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
- 完成任务
- 查询任务
select * from ACT_RU_TASK where ID_ = '22733'
select * from ACT_RU_EXECUTION where ID_ = '22723'
- 插入审批意见
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' )
- 查询所有变量(这里使用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')
- 插入新添加的变量到变量表
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),
- 更新变量数(有变量没有完全列出来)
UPDATE ACT_RU_TASK
SET REV_=2,VAR_COUNT_=8 WHERE ID_='22733' AND REV_=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,'')
- 插入历史用户关系(这个参数人为当前的用户任务的办理人)
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)
- 置空变量? 这个作用未知
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
- 同上
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
- 更新历史用户任务表,设置结束时间
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
- 更新历史活动表
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
- 更新执行状态
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
- 更新历史流程实例表
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
- 从运行时表中清除所有运行结束的任务/变量/流程/用户关联
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 不同的部分
- 在历史变量表中插入提交的变量
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为循环计数
- 在历史变量表中插入提交的变量
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')
这里比情形一多出一个任务
- 历史活动表
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,'')
同上,多出一个 “活动”
- 历史用户关联表
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)
- 执行表
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)是多实例的父级任务.
- 运行时用户关系表
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)
- 完成任务
- 历史用户关系表
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);
- 运行用户关系表
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);
- 历史任务表 设置完成时间
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;
- 历史变量表
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;
- 历吏活动表,更新完成时间
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;
- 更新扫行表,更新激活状态
UPDATE plumdo_flow.ACT_RU_EXECUTION
SET REV_=2,IS_ACTIVE_=FALSE,TASK_COUNT_=0 WHERE ID_='22806' AND REV_=1;
- 从运行任务表中删除
DELETE FROM plumdo_flow.ACT_RU_TASK WHERE ID_='22812' AND REV_=1;