基础篇

常见的流程

简单顺序流程

每个节点按顺序执行 简单顺序流程

条件流程一

决策节点输出边中存在表达式,流程向边表达式值为true行进。 条件流程一

条件流程二

使用决策节点,该表达式返回下一个节点的名称 条件流程二

分支/合并流程

分支与合并要成对出现,由合并节点判断是否具备合并条件。 合并与分支流程

子流程

主流程中存在子流程,当所有子流程结束,主流程才结束。 子流程

流程元素

工作流中,会定义一些常用的流程元素。

开始节点

流程最开始节点,整个流程由此节点开始,没有输入边。

结束节点

流程经过该节点后,流程将结束,没有输出边。

任务节点

在该节点上,会产生一些任务,可以是人工任务或者自动化任务,如果为人工任务,一般会产生阻塞,只有任务完成,达到一定条件,才能驱动流程往下一个节点行进。

决策节点

该节点存在决策表达式,流程经过该节点时,会执行决策表达式,决定下一步往哪个节点行进。

分支节点

当存在多条支线时,需要分支节点。

合并节点

与分支节点配合,多条支线最终会合并到该节点,由该节点决定是否可以往下一步行进。

子流程节点

主流程中衍生出的流程,该流程有自己的生命周期,子流程也会产生阻塞,所以只有子流程执行结束,才能驱动流程往下一节点行进。

输入/输出边

连接流程节点元素的边。

流程元素分析

元素名称元素属性元素行为备注
开始节点编码、名称、前置拦截器、后置拦截器执行节点元素行为主要是调用输出边的执行方法
结束节点编码、名称、前置拦截器、后置拦截器执行节点元素行为主要是修改流程实例状态及归档。
任务节点编码、名称、前置拦截器、后置拦截器、表单、参与者、参与者处理类、任务类型、参与类型、提醒时间、重复提醒间隔、期待完成时间、是否自动完成执行节点元素属性主要是用于定义任务的,可自行扩展。元素行为主要是判断是否可以往下一节点行进,如果可以,则调用输出边执行方法。
决策节点编码、名称、前置拦截器、后置拦截器、决策表达式执行节点元素行为主要是执行决策表达式,找到输出边并执行输出边方法
分支节点编码、名称执行节点元素行为调用输出边的执行方法
合并节点编码、名称执行节点元素行为主要是判断是否可以合并(往下一节点行进)如果可以,则调输出边执行方法。
子流程节点编码、名称、前置拦截器、后置拦截器、流程名称、流程版本号执行节点元素行为调用输出边的执行方法
输入/输出边编码、名称、表达式执行输出边如果下一节点为任务节点,则会执行创建任务处理器方法;如果下一节点为子流程,则会执行创建子流程处理器方法;否则,直接调用下一节点的执行方法。

流程定义

在工作流中,业内习惯使用bpmn规范来定义流程,但是因该规范过于庞大且复杂,所以本工作流的设计并不采用该定义规范。而是以LogicFlowopen in new window流程编辑器框架为基础,进行自定义扩展。(省去前端再次技术选型的问题)这里做一下简单的介绍。 上文我们提到的流程元素就是构成流程的基础单元,其中各节点对应着LogicFlow的node,而输入/输出边则对应着LogicFlow的edge。 以下是LogicFlow的样例文件:

{
	"nodes": [{
			"id": "start",
			"type": "circle",
			"x": 340,
			"y": 160,
			"text": "开始"
		},
		{
			"id": "apply",
			"type": "rect",
			"x": 520,
			"y": 160,
			"text": {
				"x": 520,
				"y": 160,
				"value": "请假申请"
			}
		},
		{
			"id": "deptApprove",
			"type": "rect",
			"x": 740,
			"y": 160,
			"text": {
				"x": 740,
				"y": 160,
				"value": "部门领导审批"
			}
		},
		{
			"id": "end",
			"type": "circle",
			"x": 920,
			"y": 160,
			"text": "结束"
		}
	],
	"edges": [{
			"id": "t1",
			"type": "polyline",
			"sourceNodeId": "start",
			"targetNodeId": "apply",
		},
		{
			"id": "t2",
			"type": "polyline",
			"sourceNodeId": "apply",
			"targetNodeId": "deptApprove",
		},
		{
			"id": "t3",
			"type": "polyline",
			"sourceNodeId": "deptApprove",
			"targetNodeId": "end"
		}
	]
}

最终渲染如下: 渲染结果

布局属性

流程定义布局属性,对应的是LogicFlow的基础属性,也就是生成流程图的必要属性。

节点属性

名称数据类型样例说明
idstringstart、apply节点编码,同流程唯一。
typestringcircle、rect节点类型,呈现形状,可自定义
xint740节点中心x轴坐标
yint160节点中心y轴坐标
textstring | object-节点文本描述
text.xint740文本描述中心点x轴坐标
text.yint160文本描述中心点y轴坐标
text.valuestring开始、请假申请文本描述

边属性

名称数据类型样例说明
idstringstart、apply节点编码,同流程唯一。
typestringcircle、rect节点类型,呈现形状,可自定义
xint740节点中心x轴坐标
yint160节点中心y轴坐标
textstring | object-节点文本描述
text.xint740文本描述中心点x轴坐标
text.yint160文本描述中心点y轴坐标
text.valuestring开始、请假申请文本描述
sourceNodeIdstringapply源节点ID
targetNodeIdstringdeptApprove目标节点ID

业务属性

在工作流中我们需要业务属性来处理业务,举一个简单的例子,我们需要在任务节点上配置任务参与人、任务类型等参数,以便流程执行到该节点时,为该任务节点创建任务。除此之外,如果我们要给某个节点绑定一些前置事件、后置事件等,也需要通过配置业务属性实现。LogicFlow可以给节点或边绑定业务属性,这些业务属性存放在properties对象上。

节点业务属性样例

{
  "id": "deptApprove",
  "type": "rect",
  "x": 740,
  "y": 160,
  "text": {
    "x": 740,
    "y": 160,
    "value": "部门领导审批"
  },
  "properties": {
    "taskType": 1,
    "assignee": "deptApprove.assignee"
  }
}

边业务属性样例

{
  "id": "t2",
  "type": "polyline",
  "sourceNodeId": "apply",
  "targetNodeId": "deptApprove",
  "properties": {
    "expr": "#day>0"
  }
}

流程属性

上述的属性定义与LogicFlow的流程图定义数据格式是一致的,但是在工作流流程定义中,可能还缺少流程的基本属性。如:流程编码、流程名称等。为了定义文件的统一,这里基于LogicFlow的定义文件,进行自定义属性扩展。

LogicFlow数据格式

只有nodes和edges两个要素。

{
  "nodes": [],
  "edges": []
}

扩展后的LogicFlow数据格式

增加了流程基础属性。

{
  "name": "leave",
  "displayName": "请假流程",
  "nodes": [],
  "edges": []
}

属性详细说明

流程属性

名称类型样例描述
namestringleave流程定义唯一编码
displayNamestring请假流程流程定义显示名称
typestringOA审批流程类型
instanceUrlstringleave_form启动实例要填写的表单key
expireTimestringexpireTime期待完成时间变量key
instanceNoClassstringxx.DefaultNoGenerator实例编号生成器实现类

开始节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)

结束节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)

任务节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)
formstringtask_form任务节点填写的表单key
assigneestring-任务参与者:值或变量
assignmentHandlerstring-任务参与者处理类
taskTypestring-任务类型(主办/协办)
performTypestring-参与类型(普通参与/会签参与)
reminderTimestring-提醒时间
reminderRepeatstring-重复提醒间隔
expireTimestring-期待任务完成时间变量key
autoExecutestring-到期是否自动执行Y/N
callbackstring-自动执行回调类

决策节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)
exprstring-决策表达式,由表达式引擎执行
handleClassstring-决策处理类,自定义执行

分支节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)

合并节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)

子流程节点

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
preInterceptorsstring-节点执行前置拦截器
postInterceptorsstring-节点执行后置拦截器
layoutstring20,20,100,50布局属性(x,y,w,h)
processNamestring-父流程名称
versioninteger-父流程版本号,为空则使用最新版本

边属性

名称类型样例描述
namestringstart节点定义唯一编码
displayNamestring开始节点定义显示名称
layoutstring20,20,100,50布局属性(x,y,w,h)
gstringx1,y1;x2,y2;x3,y3;x4,y4边拐点坐标(开始,中间1,中间2,结束)
exprstring-决策表达式,在决策节点输出边生效
全栈工程师带你从0~1设计实现轻量级工作流引擎