常见的流程
简单顺序流程
每个节点按顺序执行
条件流程一
决策节点输出边中存在表达式,流程向边表达式值为true行进。
条件流程二
使用决策节点,该表达式返回下一个节点的名称
分支/合并流程
分支与合并要成对出现,由合并节点判断是否具备合并条件。
子流程
主流程中存在子流程,当所有子流程结束,主流程才结束。
流程元素
工作流中,会定义一些常用的流程元素。
开始节点
流程最开始节点,整个流程由此节点开始,没有输入边。
结束节点
流程经过该节点后,流程将结束,没有输出边。
任务节点
在该节点上,会产生一些任务,可以是人工任务或者自动化任务,如果为人工任务,一般会产生阻塞,只有任务完成,达到一定条件,才能驱动流程往下一个节点行进。
决策节点
该节点存在决策表达式,流程经过该节点时,会执行决策表达式,决定下一步往哪个节点行进。
分支节点
当存在多条支线时,需要分支节点。
合并节点
与分支节点配合,多条支线最终会合并到该节点,由该节点决定是否可以往下一步行进。
子流程节点
主流程中衍生出的流程,该流程有自己的生命周期,子流程也会产生阻塞,所以只有子流程执行结束,才能驱动流程往下一节点行进。
输入/输出边
连接流程节点元素的边。
流程元素分析
元素名称 | 元素属性 | 元素行为 | 备注 |
---|---|---|---|
开始节点 | 编码、名称、前置拦截器、后置拦截器 | 执行节点 | 元素行为主要是调用输出边的执行方法 |
结束节点 | 编码、名称、前置拦截器、后置拦截器 | 执行节点 | 元素行为主要是修改流程实例状态及归档。 |
任务节点 | 编码、名称、前置拦截器、后置拦截器、表单、参与者、参与者处理类、任务类型、参与类型、提醒时间、重复提醒间隔、期待完成时间、是否自动完成 | 执行节点 | 元素属性主要是用于定义任务的,可自行扩展。元素行为主要是判断是否可以往下一节点行进,如果可以,则调用输出边执行方法。 |
决策节点 | 编码、名称、前置拦截器、后置拦截器、决策表达式 | 执行节点 | 元素行为主要是执行决策表达式,找到输出边并执行输出边方法 |
分支节点 | 编码、名称 | 执行节点 | 元素行为调用输出边的执行方法 |
合并节点 | 编码、名称 | 执行节点 | 元素行为主要是判断是否可以合并(往下一节点行进)如果可以,则调输出边执行方法。 |
子流程节点 | 编码、名称、前置拦截器、后置拦截器、流程名称、流程版本号 | 执行节点 | 元素行为调用输出边的执行方法 |
输入/输出边 | 编码、名称、表达式 | 执行输出边 | 如果下一节点为任务节点,则会执行创建任务处理器方法;如果下一节点为子流程,则会执行创建子流程处理器方法;否则,直接调用下一节点的执行方法。 |
流程定义
在工作流中,业内习惯使用bpmn规范来定义流程,但是因该规范过于庞大且复杂,所以本工作流的设计并不采用该定义规范。而是以LogicFlow流程编辑器框架为基础,进行自定义扩展。(省去前端再次技术选型的问题)这里做一下简单的介绍。
上文我们提到的流程元素就是构成流程的基础单元,其中各节点对应着LogicFlow的node,而输入/输出边则对应着LogicFlow的edge。
以下是LogicFlow的样例文件:
{
"nodes": [{
"id": "start",
"type": "circle",
"x": 340,
"y": 160,
"text": "开始"
},
{
"id": "apply",
"type": "rect",
"x": 520,
"y":