Skip to content

概念

常见的流程

简单顺序流程

每个节点按顺序执行

img

条件流程一

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

img

条件流程二

使用决策节点,该表达式返回下一个节点的名称

img

分支合并流程

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

img 子流程

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

流程元素

开始节点

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

结束节点

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

任务节点

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

决策节点

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

分支节点

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

合并节点

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

子流程节点

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

输入/输出边

连接流程节点元素的边。

流程元素属性

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

流程定义

在工作流中,业内习惯使用bpmn规范来定义流程,但是因该规范过于庞大且复杂,所以本工作流的设计并不采用该定义规范。而是以LogicFlow流程编辑器框架为基础,进行自定义扩展。(省去前端再次技术选型的问题)这里做一下简单的介绍。

上文我们提到的流程元素就是构成流程的基础单元,其中各节点对应着LogicFlow的node,而输入/输出边则对应着LogicFlow的edge。

以下是LogicFlow的样例文件:

php
{

	"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
				}
			]
		}
	]
}

最终渲染图如下:

image-20240615085019927

##布局属性

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

节点属性

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

边属性

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

属性详细说明

属性详细说明流程属性

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

开始节点

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

结束节点

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

任务节点

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

决策节点

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

分支节点

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

合并节点

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

子流程节点

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

边属性

名称类型样例描述
namestringstart节点定义唯一编码
display_namestring开始节点定义显示名称
layoutstring20,20,100,50布局属性(x,y,w,h)
gstringx1,y1;x2,y2;x3,y3;x4,y4边拐点坐标(开始,中间1,中间2,结束)
exprstring-决策表达式,在决策节点输出边生效