概念
常见的流程
简单顺序流程
每个节点按顺序执行
条件流程一
决策节点输出边中存在表达式,流程向边表达式值为true行进。
条件流程二
使用决策节点,该表达式返回下一个节点的名称
分支合并流程
分支与合并要成对出现,由合并节点判断是否具备合并条件。
子流程
主流程中存在子流程,当所有子流程结束,主流程才结束。
流程元素
开始节点
流程最开始节点,整个流程由此节点开始,没有输入边。
结束节点
流程经过该节点后,流程将结束,没有输出边。
任务节点
在该节点上,会产生一些任务,可以是人工任务或者自动化任务,如果为人工任务,一般会产生阻塞,只有任务完成,达到一定条件,才能驱动流程往下一个节点行进。
决策节点
该节点存在决策表达式,流程经过该节点时,会执行决策表达式,决定下一步往哪个节点行进。
分支节点
当存在多条支线时,需要分支节点。
合并节点
与分支节点配合,多条支线最终会合并到该节点,由该节点决定是否可以往下一步行进。
子流程节点
主流程中衍生出的流程,该流程有自己的生命周期,子流程也会产生阻塞,所以只有子流程执行结束,才能驱动流程往下一节点行进。
输入/输出边
连接流程节点元素的边。
流程元素属性
名称 | 属性 | 行为 | 备注 |
---|---|---|---|
开始节点 | 编码 名称 前置拦截器 后置拦截器 | 执行节点 | 调用输出边的执行方法 |
任务节点 | 编码 名称 前置拦击器 后置拦截器 表单 参与者 参与者类 任务类型 参与类型 提醒时间 重复提醒间隔 期待完成时间 是否自动完成 | 执行节点 | 属性主要用于定义任务的,可执行扩展。节点行为主要判断是否可以继续往下一节点进行,如果可以,则调用输出边的执行方法 |
分支节点 | 编码 名称 | 执行节点 | 调用输出边的执行方法 |
合并节点 | 编码 名称 | 执行节点 | 判断是否可以合并(往下一节点进行)如果可以,则调用输出边执行方法 |
决策节点 | 编码 名称 前置拦截器 后置拦截器 决策表达式 | 执行节点 | 执行引擎表达式,找到输出边并执行输出方法 |
子流程节点 | 编码 名称 前置拦截器 后置拦截器 流程名称 流程版本 | 执行节点 | 调用输出边并执行方法 |
边节点【输入/输出】 | 编码 名称 表达式 | 执行输出边 | 如果下一节点是任务节点,则执行任务创建处理器方法; 如果下一节点是子流程,则会执行创建子流程处理器方法; 否则,直接调用下节点的执行方法。 |
结束节点 | 编码 名称 前置拦截器 后置拦截器 | 执行节点 | 主要修改流程实例状态及归档 |
流程定义
在工作流中,业内习惯使用bpmn规范来定义流程,但是因该规范过于庞大且复杂,所以本工作流的设计并不采用该定义规范。而是以LogicFlow流程编辑器框架为基础,进行自定义扩展。(省去前端再次技术选型的问题)这里做一下简单的介绍。
上文我们提到的流程元素就是构成流程的基础单元,其中各节点对应着LogicFlow的node,而输入/输出边则对应着LogicFlow的edge。
以下是LogicFlow的样例文件:
{
"nodes": [
{
"id": "90da8371-2179-4a98-a59f-f5455cb69ab4",
"type": "start",
"x": 260,
"y": 220,
"properties": [],
"text": {
"x": 260,
"y": 260,
"value": "开始"
}
},
{
"id": "02193cec-4030-4f79-9ff0-5559b6f58c00",
"type": "task",
"x": 440,
"y": 220,
"properties": {
"color": "#000000",
"field": [],
"scope": "5",
"theme": "#FFFFFF",
"width": "120",
"height": "40",
"stroke": "#000000",
"assignee": "",
"task_type": "Major",
"perform_type": "ANY",
"stroke_width": "2",
"back_permission": "1"
},
"text": {
"x": 440,
"y": 220,
"value": "申请人"
}
},
{
"id": "54f91ee1-307b-4a19-86c5-665a954e020b",
"type": "end",
"x": 820,
"y": 220,
"properties": [],
"text": {
"x": 820,
"y": 260,
"value": "结束节点"
}
},
{
"id": "d6485124-6297-42e3-b437-4d817709a22d",
"type": "task",
"x": 660,
"y": 220,
"properties": {
"assignee": "",
"back_permission": "1",
"perform_type": "ANY",
"scope": "1",
"task_type": "Major",
"field": {},
"width": "120",
"height": "40",
"theme": "#FFFFFF",
"stroke": "#000000",
"color": "#000000",
"stroke_width": "2"
},
"text": {
"x": 660,
"y": 220,
"value": "部门主管"
}
}
],
"edges": [
{
"id": "b9106c80-84b1-4c38-9e38-461aa055adb9",
"type": "transition",
"sourceNodeId": "90da8371-2179-4a98-a59f-f5455cb69ab4",
"targetNodeId": "02193cec-4030-4f79-9ff0-5559b6f58c00",
"startPoint": {
"x": 278,
"y": 220
},
"endPoint": {
"x": 380,
"y": 220
},
"properties": [],
"pointsList": [
{
"x": 278,
"y": 220
},
{
"x": 380,
"y": 220
}
]
},
{
"id": "f8bc64f0-2043-4598-8a3d-b1b5fc206ab8",
"type": "transition",
"sourceNodeId": "02193cec-4030-4f79-9ff0-5559b6f58c00",
"targetNodeId": "d6485124-6297-42e3-b437-4d817709a22d",
"startPoint": {
"x": 500,
"y": 220
},
"endPoint": {
"x": 600,
"y": 220
},
"properties": {},
"pointsList": [
{
"x": 500,
"y": 220
},
{
"x": 600,
"y": 220
}
]
},
{
"id": "da56bb2a-049a-47b7-900e-d229a7195e57",
"type": "transition",
"sourceNodeId": "d6485124-6297-42e3-b437-4d817709a22d",
"targetNodeId": "54f91ee1-307b-4a19-86c5-665a954e020b",
"startPoint": {
"x": 720,
"y": 220
},
"endPoint": {
"x": 802,
"y": 220
},
"properties": {},
"pointsList": [
{
"x": 720,
"y": 220
},
{
"x": 802,
"y": 220
}
]
}
]
}
最终渲染图如下:
##布局属性
流程定义布局属性,对应的是LogicFlow的基础属性,也就是生成流程图的必要属性。
节点属性
名称 | 数据类型 | 样例 | 说明 |
---|---|---|---|
id | string | uuid | 节点编码,同流程唯一。 |
type | string | circle、rect | 节点类型,呈现形状,可自定义 |
x | int | 740 | 节点中心x轴坐标 |
y | int | 160 | 节点中心y轴坐标 |
text | string | object | - | 节点文本描述 |
text.x | int | 740 | 文本描述中心点x轴坐标 |
text.y | int | 160 | 文本描述中心点y轴坐标 |
text.value | string | 开始、请假申请 | 文本描述 |
边属性
名称 | 数据类型 | 样例 | 说明 |
---|---|---|---|
id | string | uuid | 节点编码,同流程唯一。 |
type | string | circle、rect | 节点类型,呈现形状,可自定义 |
x | int | 740 | 节点中心x轴坐标 |
y | int | 160 | 节点中心y轴坐标 |
text | string | object | - | 节点文本描述 |
text.x | int | 740 | 文本描述中心点x轴坐标 |
text.y | int | 160 | 文本描述中心点y轴坐标 |
text.value | string | 开始、请假申请 | 文本描述 |
sourceNodeId | string | apply | 源节点ID |
targetNodeId | string | deptApprove | 目标节点ID |
业务属性
在工作流中我们需要业务属性来处理业务,举一个简单的例子,我们需要在任务节点上配置任务参与人、任务类型等参数,以便流程执行到该节点时,为该任务节点创建任务。除此之外,如果我们要给某个节点绑定一些前置事件、后置事件等,也需要通过配置业务属性实现。LogicFlow可以给节点或边绑定业务属性,这些业务属性存放在properties对象上。
节点业务属性样例
{
"id": "50984e89-a489-4064-bed7-5f8957c6a2d0",
"type": "rect",
"x": 740,
"y": 160,
"text": {
"x": 740,
"y": 160,
"value": "部门领导审批"
},
"properties": {
"taskType": 1,
"assignee": "assignee"
}
}
边业务属性样例
{
"id": "e02519a8-885e-4f1a-a7bb-e6e7745eda1d",
"type": "polyline",
"sourceNodeId": "50984e89-a489-4064-bed7-5f8957c6a2d0",
"targetNodeId": "",
"properties": {
"expr": "#day>3"
}
}
流程属性
上述的属性定义与LogicFlow的流程图定义数据格式是一致的,但是在工作流流程定义中,可能还缺少流程的基本属性。如:流程编码、流程名称等。为了定义文件的统一,这里基于LogicFlow的定义文件,进行自定义属性扩展。
LogicFlow数据格式
只有nodes和edges两个要素。
{
"nodes": [],
"edges": []
}
扩展后的LogicFlow数据格式
增加了流程基础属性。
{
"name": "leave",
"display_name": "请假流程",
"nodes": [],
"edges": []
}
属性详细说明
属性详细说明流程属性
名称 | 类型 | 样例 | 描述 |
name | string | leave | 流程定义唯一编码 |
display_name | string | 请假流程 | 流程定义显示名称 |
type | string | OA审批 | 流程类型 |
instance_url | string | leave_form | 启动实例要填写的表单key |
expire_time | int | 期待完成时间变量key | |
instance_no_class | string | xx.DefaultNoGenerator | 实例编号生成器实现类 |
开始节点
名称 | 类型 | 样例 | 描述 |
name | string | start | 节点定义唯一编码 |
display_name | string | 开始 | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
结束节点
名称 | 类型 | 样例 | 描述 |
name | string | end | 节点定义唯一编码 |
display_name | string | 开始 | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
任务节点
名称 | 类型 | 样例 | 描述 |
name | string | start | 节点定义唯一编码 |
display_name | string | 开始 | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
form | string | task_form | 任务节点填写的表单key |
assignee | string | - | 任务参与者:值或变量 |
assignment_handler | string | - | 任务参与者处理类 |
task_type | string | - | 任务类型(主办/协办) |
perform_type | string | - | 参与类型(普通参与/会签参与) |
reminder_time | string | - | 提醒时间 |
reminder_repeat | string | - | 重复提醒间隔 |
expire_time | string | - | 期待任务完成时间变量key |
auto_execute | string | - | 到期是否自动执行Y/N |
callback | string | - | 自动执行回调类 |
决策节点
名称 | 类型 | 样例 | 描述 |
---|---|---|---|
name | string | - | 节点定义唯一编码 |
display_name | string | - | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
expr | string | - | 决策表达式,由表达式引擎执行 |
handle_class | string | - | 决策处理类,自定义执行 |
分支节点
名称 | 类型 | 样例 | 描述 |
---|---|---|---|
name | string | - | 节点定义唯一编码 |
display_name | string | - | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
合并节点
名称 | 类型 | 样例 | 描述 |
---|---|---|---|
name | string | - | 节点定义唯一编码 |
display_name | string | - | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
子流程节点
名称 | 类型 | 样例 | 描述 |
---|---|---|---|
name | string | - | 节点定义唯一编码 |
display_name | string | - | 节点定义显示名称 |
pre_interceptors | string | - | 节点执行前置拦截器 |
post_interceptors | string | - | 节点执行后置拦截器 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
process_name | string | - | 父流程名称 |
version | integer | - | 父流程版本号,为空则使用最新版本 |
边属性
名称 | 类型 | 样例 | 描述 |
---|---|---|---|
name | string | start | 节点定义唯一编码 |
display_name | string | 开始 | 节点定义显示名称 |
layout | string | 20,20,100,50 | 布局属性(x,y,w,h) |
g | string | x1,y1;x2,y2;x3,y3;x4,y4 | 边拐点坐标(开始,中间1,中间2,结束) |
expr | string | - | 决策表达式,在决策节点输出边生效 |