发现很多教程很乱,有的是浅尝则止比如说就是一个demo就完事了,有的是比较乱,可能是之前使用过别的工作流,很多东西就直接带过,看的云里雾里的。比如说一些名词,都不清楚怎么回事。

这里发现还是官方的文档不错,这里推荐一个材料是一个flowable的中文文档,涉及到的比较全面,不一定全看,但是可以当工具书一样查找使用。

Flowable BPMN用户手册

一 表结构

前面一章的关于spring的demo,我们配置好数据库,第一次会自动为我们给的数据库生成对应的表,但是表实在是太多,网上一些资料比较过时,举个例子有的材料列举了二十几个,但实际上我这个版本不止,我随便数了一下都七十几个了。

还有就是Flowable的表很多创建的名字也是为了能“见词知意”,会有前缀或者类似“词根”之类的来拼接。同样很多人的资料博客关于这些,好像抄的是同一份一样。都是常见的几个,你想DMN这些都没人提及。

这里以我现在的flow able表结构做一个大概的总结介绍:

首先上个图


大概表名分三段
XXX_XXX_XXXX

第一段

第一段以ACT_APP_APPDEF 和 FLW_CHANNEL_DEFINITION为例子
ACT代表的Activiti 毕竟是同一批人另起的炉灶,另一方面遵循的都是BPMN还要考虑到兼容人家,方便客户转移过来。

ACT_APP_APPDEF看字面意思是应用定义表。

FLW估计就是Flowable的自己的时缩写。

FLW_CHANNEL_DEFINITION这个的意思是,Flowable支持JMS、Kafka和RabbitMQ源和目标,但也可以使用其他适配器类型进行扩展。部署通道定义时,新定义将插入到FLW_CHANNEL_DEFINITION表中,表明翻译过来Flowable的渠道定义。

第二段

APP指的是应用

CO 我认为是connection连接的意思,我看内容大部分跟连接数据库这些相关

act_cmmn_:CMMN流程引擎数据

act_dmn_ : DMN流程引擎

act_evt_log: 事件日志

act_fo_:表单引擎数据

act_ge_: 通用数据

act_hi_:表包含历史数据

act_id_:存储与用户身份相关数据

act_prodef_info:流程定义的信息

act_re_: 流程定义相关数据的存储库

act_ru__:流程实例运行时数据,流程结束删除数据

第三段

实际上这一段,如果不是太长,有的很多就是整个单词,DEF就是定义的意思,DECISION就是描述的意思,JOB就是任务等,总之就是相对第二段比较容易看出来,像DMN谁能一眼看出来到底是什么。

怎么说呢,太多了这些,基本是遇到问题看那个,记住几个常用的就可以了,不一定都能接触的到,同样也能想象出这个工作流设计要多复杂,我们自己的一些审批任务,基于人家的又是都觉得有点绕,何况人家提供的基础的服务支持设计的。

流程变量

流程实例执行时,要保存数据,这些都被称作变量variable,流程变量分两种:运行时变量,历史变量。

运行时变量
就是还在运行的流程实例的持有的变量,流程实例结束了,这个实例的变量也就在这个表的被剔除了,变成历史变量。

运行时变量,存的表是act_ru_variable

#定义时就设置了变量ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);#或者运行中设置变量void setVariable(String executionId, String variableName, Object value);void setVariableLocal(String executionId, String variableName, Object value);void setVariables(String executionId, Map<String, ? extends Object> variables);void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);#都运行时变量,这个如果实例运行完了就查不到留在这个表Map<String, Object> getVariables(String executionId);Map<String, Object> getVariablesLocal(String executionId);Map<String, Object> getVariables(String executionId, Collection<String> variableNames);Map<String, Object> getVariablesLocal(String executionId, Collection<String> variableNames);Object getVariable(String executionId, String variableName);<T> T getVariable(String executionId, String variableName, Class<T> variableClass);

历史变量
历史变量其实算是比较多的,一般来说除非是运行时实例,自己这边出问题直接看问题看的是运行时的变量(其实这个也能在历史变量中看到)。如果是对已经审批完的流程有疑问基本看的都是历史变量。

历史变量,存的是act_hi_varinst表act_hi_varinst
实例创建,历史变量有对应的变量,实力结束依旧能找到,可以说时变量的“永久”。

    historyService.createHistoricVariableInstanceQuery().processInstanceId("XXX").orderByVariableName.desc().list();

重要字段介绍
(1)processDefinitionId 流程定义Id

(2)processDefinitionKey 流程定义Key

(3)processDefinitionName 流程定义名称

(4)procInstId 流程实例Id

(5)taskId 任务Id

(6)executionId 执行Id

前三个都是流程定义的,就是说我们发起流程通过ID,key,name这些来发起流程。

你发起流程就会有一个实例,大概的例子就是Java的calss和对象一样,class定义了整体的结构和意义,但是真正用的还是被new出来并且赋值的一个个对象。流程就是class,你定义好了,去处理一个个具体的场景时,就是一个个具体的对象,也就是流程实例。

(4)(5)(6)其实是一级一级的关系,一个流程实例ID可以对应多个执行ID,一个执行对应多个task(这个我后面验证一下,暂时我这边也不太确定),反正大多数材料形容三个的关系是“面-》线-》点”。

表单

表单其实就是定义的部分,就是通过一种简单的方式去构造一个flowable流程引擎。
(看下面的官网最新的英文解释,更对味,可以参照后面某个版本的flowable的中文手册翻译)

The Flowable Form engine is structured in a very similar way to the Flowable process engine. As a result parts of the documentation have a resemblance with their process engine counterpart.

在实际业务中,流程伴随着各种各样的表单,Flowable引擎将表单数据统一作为流程变量存入变量表中。所以,对于Flowable引擎,可以完全独立于表单运行,因为可以用流程变量替代表单数据。

但一般的,我们需要结构化的数据,表单仍然是我们推荐的用法。

表单:内置表单,外部表单

内置表单
以请假为例,XML内容

<process id="leave" name="请假流程-内置表单"><startEvent id="start"><extensionElements><flowable:formProperty id="startDate" name="请假开始事件" type="date" datePattern="dd-MMM-yyyy" required="true" readable="true" writeable="true"/><flowable:formProperty id="endDate" name="请假结束事件" type="date" datePattern="dd-MMM-yyyy" required="true" readable="true" writeable="true"/><flowable:formProperty id="reason" name="请假原因" type="string" required="true" readable="true" writeable="true"/><flowable:formProperty id="leaveType" type="enum" name="请假类型"><flowable:value id="personalLeave" name="事假" /><flowable:value id="annualLeave" name="年假" /></flowable:formProperty></extensionElements></startEvent>
</process>
 StartFormData FormService.getStartFormData(String processDefinitionId)

 TaskFormData FormService.getTaskFormData(String taskId)

外部表单

根据表单文件自行渲染的任务表单,称为外部表单。

    <process id="leave" name="请假流程-内置表单"><startEvent id="start" flowable:formKey="form1"></startEvent></process>

外部表单的定义

  • 表单定义文件的后缀为.form。
  • 表单的JSON定义以key、name和description开头。
  • 表单引擎通过属性key来辨别表单在整个表单引擎中的唯一身份。对于来源相同的同一个表单定义的版本系统也是基于属性key运作的。
  • 第二部分是一个数组类型fields,表单定义的字段在这里阐明。
  • 第三部分是可选的,用来定义表单的结果outcomes。

xml文件例子

{"key": "form1","name": "My first form","fields": [{"id": "input1","name": "Input1","type": "text","required": false,"placeholder": "empty"}],"outcomes": [{"id": "null","name": "Accept"},{"id": "null","name": "Reject"}]
}

部署表单
在springboot环境下,resources/forms目录下任何.form后缀的表单定义文件都会被自动部署。

实际应用中,应当让前端流程设计器生成指定格式的表单定义文件,通过与前文提到的接口方式,更新部署流程定义及表单定义资源。

获取及提交表单参数
实际上,渲染表单所需的所有数据都组装在下面两个方法:

    StartFormData FormService.getStartFormData(String processDefinitionId)TaskFormdata FormService.getTaskFormData(String taskId)
 ProcessInstance FormService.submitStartFormData(String processDefinitionId, Map<String,String> properties)void FormService.submitTaskFormData(String taskId, Map<String,String> properties)

Flowable实战(二):表结构以及变量表单介绍相关推荐

  1. 列名 userid 不明确。 表结构_SQL-Server(三)表的创建和操作

    3.1表结构和数据类型 3.1.1表和表结构 表结构.组成表的各列的名称及数据类型,统称为表结构. 记录.每个表包含了若干行数据,它们是表的"值",表中的一行称为一个记录.因此表是 ...

  2. mysql查看表结构修改记录表_MySQL 表结构查看以及表结构修改

    使用MySql数据库时,如果对表字典不够熟悉,我们就需要查看表结构.如果数据库是在远程linux上部署,很多时候我们只能通过mysql的命令来查看表结构.同样,如果我们想要修改表结构,添加.删除.修改 ...

  3. php拷贝mysql表_MySQL复制表数据或表结构到新表中

    MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制 MySQL复制 ...

  4. mysql 表结构关系_mysql 表关系 与 修改表结构

    mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远是在多的那张表中设置外键 """ 从左边的表思 ...

  5. mysql 复制表结构到一个新表_MySQL复制表数据或表结构到新表中

    MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制 MySQL复制 ...

  6. mysql表结构定义_Mysql表结构定义及相关语法

    mysql语法及相关命令 1.每个sql命令都需要使用分号来完成 2.可以将一个命令写成多行 3.可以通过\c来取消本行命令 4.可以通过\g.exit.ctrl+c或者quit来退出当前客户端 5. ...

  7. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  8. Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)

    需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE - SELECT 命令,是无法实现的. 本章节将为大家介绍如何完整的复制MySQL数据表,步骤如 ...

  9. 根据数据库表结构生成Excel表设计——源码设计说明

    根据数据库表结构生成Excel表设计 在系统运维的过程中,很多时候大家都不喜欢改文档,修改了数据库字段后很少同步再更新表设计文档的,这就导致系统运行一段时间后,系统表设计与实际生产跑业务的设计出入很大 ...

最新文章

  1. 一款SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全
  2. Scenario 7 – HP C7000 VC FlexFabric Tunneled VLANs and SUS A/A vSphere
  3. struts2.1.6教程七、国际化
  4. JAVA-数据库之JDBC连接MySQL数据库
  5. Spring - Java/J2EE Application Framework 应用框架
  6. 作业1-四则运算题目生成程序
  7. 许多参数和丢失的信息
  8. 微博html天涯吴奇隆刘诗诗,吴奇隆深夜微博晒爱心,为刘诗诗庆生,网友:撒了一大把狗粮...
  9. iOS开发小技巧--学会包装控件(有些view的位置由于代码或系统原因,位置或者尺寸不容易修改或者容易受外界影响)...
  10. wordpress入门基本操作,网站安全防护及常用插件(建站必看教程)
  11. java工作愿景_2018年年终总结以及来年目标愿景
  12. arm架构下spinlock原理 (代码解读)
  13. Python自动化测试常用库整理
  14. 次世代游戏建模制作工作流程 1
  15. 只需简单几步 - 开始玩耍微信小程序
  16. Java工程师岗位职责有哪些 职业发展前景怎么样
  17. VisionMobile:三星如何争取开发者了解健康数据
  18. 【CV系列】图像算法之六:特征提取算法之LoG
  19. Python计算自由下落距离
  20. Java面试复盘之方案设计类试题

热门文章

  1. 【TensorFlow】人脸识别OpenFace、Face-recognition、Insightface和FaceNet源码运行
  2. Intel新i9憋足了吃奶的劲狂拉功耗,总算吊打苹果M1max
  3. 陈皓:程序员技术练级攻略
  4. 关于基金的各种名词含义及来源,小白如何入门基金
  5. AS3:fla swf 坐标 导出类
  6. 命令Javascript控制台
  7. vue+echarts5 实现中国地图
  8. 【企业资源计划ERP】益达医院ERP实施
  9. w10谷歌chrome关闭自动更新
  10. 拼多多什么是非官方交易行为判定