Activiti(Flowable)流程克隆(运行时实例克隆)解决方案 一种订单制造中分裂与合并的核心技术实践...

Activiti(Flowable)流程克隆(运行时实例克隆)解决方案

一种订单制造中分裂与合并的核心技术实践

作者:长沙大东家 xiaohelong2005@126.com 2017-11-24 20:24 长沙

1.  背景

订单可视化系统是单位的一套基于业务流程引擎技术的智能制造信息系统,在公司领导的战略部署下,完全自主开发的一套适用于多品种、小批量订单式制造型企业。系统以对订单的全生命周期进行管控。通过对订单的售前、生产、售后及过程中产生的异常等进行记录并分析。再以此为基础,对各个业务环节逐步细化,由于是对一个企业进行全方位流程再造,涉及到企业所有方面,持续时间较长,并且随着企业的发展而发展的一套系统。

在对流程引擎技术选择中,我们选择了Activiti(现在作者重新Fok出叫Flowable的项目),开源、稳定,社区活跃。但外国人开发的流程系统并没有考虑到中国的实际使用情况,如驳回、任意跳转等。更不用说会想到中国制造型企业的特色流程需求,如订单随时分裂与合并。

2.  问题提出

订单在流程的执行过程中,企业中会在所有可能的环节出现订单分裂的需求。如因为采购的物料只来的一部分,客户同意先提走一部分;客户在设计环节或制造前突然取消几套设备都有可能;即使在机器制造完毕后,还有可能分不同批次发送,补生产之类。Activiti并不支持理想中类似于管道中跑包裹的情况,对,最理想的方式就是隧道中跑小汽车的模式,每一台设备每一个一个编号,再对编号进行分组成一个订单便可以解决这个问题。但Activiti很明显不支持这种模式,自己开发一个框架时间和成熟度上也不合适。只能在activiti基础上进行。

临时的解决方案便是将原来的流程挂起,再新开几个对应的流程,再跳转至原来的任务节点。这么做临时性解决了一些问题,但也带来了两个实际的问题:一、新的流程并没有携带以前的历史信息;二、跳转只能单线,当有并行多线路时,则只能跳到原来的一根线上,其它的线会断层。所以克隆是从最初至现在一直想要的实施方案,克隆可以完整地解决这些问题,订单拆分时可以克隆多份并配套至业务订单即可。因为时间与技术的熟悉程度,所以用了一点时间研究了Activiti机制,决定从直接更改数据库中的数据为总体思路。即将该流程所有信息复制一问,换用新的ID。

为什么要自己做呢?因数无论是哪里都找不到资料,只能靠自己来解决此事。

3.  第一次试错

在起初实施的时侯,我试图通过表之间的关系、字段之间的关系,逐层逐表进行替换。但在逐步的深入中,子流程、并行、递归及相互字段的更新等导致逻辑越来越复杂,最终不得不放弃此种实施思路。

4.  最终思路

在某一个瞬间,来了一个灵感,想到以前在做网页时全局将UUID替换成指定单词的经验,我们在Java代码中应用这种全局文本替换结合UUID的唯一性与特殊性,最终思路便是将该流程实例的所有信息全部读入,将每一个ID列入一个集合中,再配套分配一个新的ID反向存入数据,得以解决,逻辑思路上也很解单。

研究与实践就是研究需要试错10次,100次才能找到正确的一次方式。

具体思路如下:

1.    首先读取所有流程相关的记录,只要处理act_hi_*,act_ru_*,act__ge_bytearray。

2.    将所有id字段读入(有一些id字段要排除,如procDefId, bytearrayId)集合,如果是初次进入集合给定一个对应的新id,如果是已存在,则直接从集合中读取该id放入此记录中。

3.    读取完毕后,直接用新id替换对应的数据。

4.    批量存入数据库,流程克隆完成。(在insert时,act_ru_*的需要临时将数据库外键关闭)

5.    检测是否执行完毕,结束

对于子流程,进行递归调用处理。对于程序中没有克隆的表,大家参照这个思路进行添加处理,因为目前这些对我们够用了。

6.    其它

将act_ru_variable中对act_ge_bytearray中的外键进行修改,防止更新出错。删除时set null,更新时set null。

对于子流程,进行递归调用处理。对于程序中没有克隆的表,大家参照这个思路进行添加处理,因为目前这些对我们够用了。

5.  最佳实践

5.1.  Activiti(Flowable)5.21的数据表(Mysql and mybatis)基础(重点关注act_hi_*,act_ru_*的中id相关字段)

5.1.1.  基础说明

参考地址(reference):http://lucaslz.com/2016/11/15/java/activiti/activiti-db-5-22/

ACT_RU_*:‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

ACT_HI_*:

’HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等

 

5.1.2.  表摘要

ACT_HI_ACTINST                历史节点表

ACT_HI_ATTACHMENT        历史附件表

ACT_HI_COMMENT            历史意见表

ACT_HI_DETAIL                   历史详情表,提供历史变量的查询

ACT_HI_IDENTITYLINK        历史流程人员表

ACT_HI_PROCINST             历史流程实例表

ACT_HI_TASKINST               历史流程任务表

ACT_HI_VARINST                历史变量表

ACT_RU_EVENT_SUBSCR    throwEvent、catchEvent时间监听信息表

ACT_RU_EXECUTION          运行时流程执行实例表

ACT_RU_IDENTITYLINK        运行时流程人员表,主要存储任务节点与参与者相关信息

ACT_RU_JOB                      运行时定时任务数据表

ACT_RU_TASK                    运行时任务节点表

ACT_RU_VARIABLE             运行时流程变量数据表

5.1.3.  表结构说明(关键ID字段加粗,要包括本身的ID_号)

5.1.3.1. ACT_HI_ACTINST(历史节点表)

历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容。

表结构说明

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

PROC_DEF_ID_     流程定义ID   varchar(64)    NO  流程定义ID

PROC_INST_ID_   流程实例ID  varchar(64)  NO 流程实例ID

EXECUTION_ID_  执行实例ID  varchar(64)  NO 执行实例ID

ACT_ID_ 节点ID   varchar(255)  NO  节点定义ID

TASK_ID_      节点实例ID  varchar(64)  YES 默认值 NULL,其他节点类型实例ID在这里为空

CALL_PROC_INST_ID_ 调用外部的流程实例ID     varchar(64)  YES 默认值NULL,调用外部流程的流程实例ID

ACT_NAME_  节点名称       varchar(255)  YES 默认值 NULL,节点定义名称

ACT_TYPE_    节点类型       varchar(255)  NO  如startEvent、userTask

ASSIGNEE_    签收人   varchar(255)  YES 默认值 NULL,节点签收人

START_TIME_ 开始时间       datetime(3)   NO  version版本,2016-11-15 11:30:00

END_TIME_   结束时间       datetime(3)   NO  默认值 NULL,2016-11-15 11:30:00

DURATION_  耗时       bigint(20)      YES 默认值 NULL,毫秒值

TENANT_ID_  租户标识       varchar(255)  YES 默认值``,

5.1.3.2. ACT_HI_ATTACHMENT(历史附件表)

历史附件表。

 

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

REV_      乐观锁   int(11)    YES 默认值 NULL,version版本

USER_ID_       用户ID   varchar(255)  YES 默认值 NULL,用户标识

NAME_   名称       varchar(255)  YES 默认值 NULL

DESCRIPTION_     描述       varchar(4000) YES 默认值 NULL

TYPE_     类型       varchar(255)  YES 默认值 NULL,附件类型

TASK_ID_      节点实例ID  varchar(64)  YES 默认值 NULL

PROC_INST_ID_   流程实例ID  varchar(64)  YES 默认值 NULL,

URL_      URL附件地址 varchar(4000) YES 默认值 NULL,附件地址

CONTENT_ID_      字节表的ID   varchar(64)    YES 默认值 NULL,ACT_GE_BYTEARRAY的ID

TIME_     乐观锁   datetime(3)   YES 默认值 NULL

5.1.3.3. ACT_HI_COMMENT(历史意见表)

历史意见表

 

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

TYPE_     类型       varchar(255)  YES 类型:event(事件)、comment(意见)

TIME_     时间       datetime(3)   NO  填写时间

USER_ID_       用户ID   varchar(255)  YES 填写人ID

TASK_ID_      节点实例ID  varchar(64)  YES 默认值 NULL

PROC_INST_ID_   流程实例ID  varchar(64)  YES 默认值 NULL

ACTION_ 行为类型       varchar(255)  YES 默认值 NULL,值为下列内容中的一种:AddUserLink、DeleteUserLink、AddGroupLink、DeleteGroupLink、AddComment、AddAttachment、DeleteAttachment

MESSAGE_    基本内容       varchar(4000) YES 默认值 NULL,用于存放流程产生的信息,比如审批意见

FULL_MSG_   全部内容       longblob YES 附件地址

5.1.3.4. ACT_HI_DETAIL(历史详情表)

历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。

 

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

REV_      乐观锁   int(11)    YES 默认值 NULL,version版本

TYPE_     类型       varchar(255)  NO  默认值 NULL,表单:FormProperty,参数:VariableUpdate

PROC_INST_ID_   流程实例ID  varchar(64)  YES 默认值 NULL,附件类型

EXECUTION_ID_  执行实例ID  varchar(64)  YES 默认值 NULL,附件类型

TASK_ID_      节点实例ID  varchar(64)  YES 默认值 NULL,附件类型

ACT_INST_ID_      节点实例ID  varchar(64)  YES 默认值 NULL,附件类型

NAME_   名称       varchar(255)  NO  默认值 NULL,附件类型

VAR_TYPE_    参数类型       varchar(255)  YES 默认值 NULL, jpa-entity、boolean、bytes、serializable(可序列化)、自定义type(根据你自身配置)、CustomVariableType、date、double、integer、long、null、short、string,

TIME_     时间       datetime(3)   NO  默认值 NULL,创建时间

BYTEARRAY_ID_    字节表ID      varchar(64)    YES 默认值 NULL,ACT_GE_BYTEARRAY表的ID

DOUBLE_      Double   double   YES 默认值 NULL,存储变量类型为Double

LONG_   Long      bigint(20)    YES 默认值 NULL,存储变量类型为long

TEXT_     Text varchar(40000)     YES 默认值 NULL,存储变量值类型为String

TEXT2_   Text varchar(40000)     YES 默认值 NULL,此处存储的是JPA持久化对象时,才会有值。此值为对象ID

5.1.3.5. ACT_HI_PROCINST(历史流程实例表)

历史流程实例表。

 

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

PROC_INST_ID_   流程实例ID键     varchar(64)  NO 流程实例ID键

BUSINESS_KEY_    业务主键       varchar(255)  YES 业务主键,业务表单的ID

PROC_DEF_ID_     流程定义ID   varchar(64)    NO  流程定义ID

START_TIME_ 开始时间       datetime(3)   NO  开始时间

END_TIME_   结束时间       datetime(3)   YES 结束时间

DURATION_  耗时       bigint(20)      YES 耗时

START_USER_ID_  起草人   varchar(255)  YES 起草人

START_ACT_ID_    开始节点ID   varchar(255)  YES 开始环节ID

END_ACT_ID_ 结束节点ID   varchar(255)  YES 结束环节ID

SUPER_PROCESS_INSTANCE_ID_    父流程实例ID      varchar(64)  YES 父流程实例ID

DELETE_REASON_ 删除原因       varchar(4000) YES 删除原因

TENANT_ID_  租户ID   varchar(255)  YES 租户ID

NAME_   名称       varchar(255)  YES 名称

5.1.3.6. ACT_HI_IDENTITYLINK(历史流程人员表)

任务参与者数据表,主要存储历史节点参与者的信息。

 

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

GROUP_ID_   用户组ID      varchar(255)  YES 用户组ID

TYPE_     类型       varchar(255)  YES assignee、candidate、owner、starter、participant

USER_ID_       用户ID   varchar(255)  YES 用户ID

TASK_ID_      节点实例ID  varchar(64)  YES 节点实例ID

PROC_INST_ID_   流程实例ID  varchar(64)  YES 流程实例ID

5.1.3.7. ACT_HI_TASKINST(历史流程任务表)

表结构说明

 

字段名称       描述       数据类型       Nullable 取值说明

ID_  主键       varchar(64)  NO 主键ID

PROC_DEF_ID_     流程定义ID   varchar(64)    YES 流程定义ID

TASK_DEF_KEY_    节点定义ID   varchar(255)  YES 节点定义ID

PROC_INST_ID_   流程实例ID  varchar(64)  YES 流程实例ID

EXECUTION_ID_  执行实例ID  varchar(64)  YES 执行实例ID

NAME_   名称       varchar(255)  YES 名称

PARENT_TASK_ID_     父节点实例ID      varchar(64)  YES 父节点实例ID

DESCRIPTION_     描述       varchar(4000) YES 描述

OWNER_ 实际签收人 任务的拥有者 varchar(255)  YES 签收人(默认为空,只有在委托时才有值)

ASSIGNEE_    签收人或被委托   varchar(255)  YES 签收人或被委托

START_TIME_ 开始时间       datetime(3)   NO  开始时间

CLAIM_TIME_ 提醒时间       datetime(3)   YES 提醒时间

END_TIME_   结束时间       datetime(3)   YES 结束时间

DURATION_  耗时       datetime(3)   YES 耗时

DELETE_REASON_ 删除原因       varchar(4000) YES completed、deleted

PRIORITY_     优先级别       int(11)  &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值