Appearance
BPM 流程库
基本概念
流程处理涉及到比较多的概念,为了实现一些复杂的流程处理,系统内部对象也被设计得较为灵活,初次使用时容易造成误解,因此在这里先梳理一次流程的关系图如下:
首先我们看开发态。开发态方面主要有 3 个概念,分别是
- 流程定义,即我们定义的流程图,一般由各种节点组成,定义了流程应该如何流转;
- 用户任务节点,即流程图里的用户任务节点,是需要特别关注的特殊节点,表达了当流程执行到此处时,需要等待用户进行下一步的操作反馈才会继续的节点;
- 表单页面,即用户任务节点关联的表单页面定义。
为了让流程真正运行起来,每个开发态的概念又会映射为运行态的概念:
- 流程实例,即从流程定义中创建的用于记录流程状态信息的记录,一个流程定义可以产生多条实例记录;
- 任务实例,是由流程流转中从用户任务节点产生的用于记录任务状态的记录,一个用户任务节点可能创建出多条任务实例(例如会签场景,每个独立的会签人都会产生一个任务实例),因此,一个流程实例可以有多个任务实例;
- 页面渲染,由每个页面定义经过平台的渲染引擎生成的表单页面,可以是平台的标准页面或高级页面,甚至是自定义页面,主要用途是提供界面给用户进行接口调用。
流程的运行机制如下:首先,当用户启动一个新流程时,系统会根据流程定义信息生成一个流程实例,而流程流转到用户任务节点时,会根据用户任务节点的定义生成对应的一个或多个任务实例,流程至此则暂停,返回到调用方,等待任务实例被完成。任务实例的分配人可以从流程待办页面点击此流程实例关联的页面,在页面中完成任务,此时流程被重新拉起激活,继续根据流程定义执行剩余的节点,重复以上用户任务节点的执行过程,直至流程定义中没有新任务可以生成时,流程结束。
对于每个流程实例的创建和结束,都会对应一个 EV_FLOW_STARTED
和 EV_FLOW_TERMINATED
事件,而对于每个任务实例的创建和完成,都会对应一个 EV_TASK_STARTED
和 EV_TASK_TERMINATED
事件,开发者可以通过监听这些事件对业务流程进行定制。
在 AppCube 脚本库中也分为两部分,一部分是用于构建流程定义的 bpmmeta 库,另一部分是用于操作实例的 bp 库,用户应该根据需要使用正确的库进行操作。
流程实例操作
AppCube 为流程实例和任务实例提供了丰富的操作能力,主要接口如下:
bp.newInstanceClient()
:对实例进行修改操作,即对流程实例进行简单查询和修改,例如终止流程等。bp.newTaskClient()
:对任务实例进行操作,例如完成任务、中止任务等。bp.newQueryTaskClient()
:对任务实例进行复杂查询,例如查询待办、按条件筛选任务实例等。
而 bp.newClientV1()
已被标记为过时,其 API 在未来可能不再提供,请不要使用此 API 。
以下列出一些比较常见的使用场景。
查询待办任务
查询待办一般指的是查询待我处理的任务实例,AppCube 已提供了预置接口实现此查询:
ts
import * as bp from 'bp';
let queryTaskClient = bp.newQueryTaskClient();
let res = queryTaskClient.queryMyLis({
rootID: '...', // 流程实例 ID
options: {
fields: [
'assignee',
'assigneeID',
'assigneeType',
'assigneeName',
'name',
'state',
'rootID',
'owner',
],
},
});
console.log(res.recs); // 数组结果
console.log(res.total); // 统计数
查询我提交的流程
查询我提交的流程一般指的是查询用户自己提交的流程实例列表,AppCube 已提供了预置接口实现此查询:
ts
import * as bp from 'bp';
let instClient = bp.newInstanceClient();
let recs = instClient.queryMyList({
fields: ['name', 'bpStatus', 'createdDate', 'owner'],
});
console.log(recs);
查询历史流程
查询历史流程指的是查询用户自己提交的已完成的流程实例列表,AppCube 已提供了预置接口实现此查询:
ts
import * as bp from 'bp';
let instClient = bp.newInstanceClient();
let recs = instClient.queryList({
creator: '...', // 用户的 ID
states: [bp.State.CompletedOk],
});
console.log(recs);
此接口也可以根据需要调整 states 和 creator 查询,查询不同状态和不同使用者的流程实例。
启动流程 / 创建流程实例
一般来说,启动流程和创建流程实例指的是一件事,即从指定的流程定义创建流程实例。
ts
import * as bp from 'bp';
let instClient = bp.newInstanceClient();
let res = instClient.start(
'NAME', // 流程名称
'VERSION', // 流程版本,填空字符串表示使用激活的流程版本,否则根据指定版本的流程定义启动
{
// 流程变量初始化赋值
key: 'value',
},
);
console.log(res);
其中 VERSION 一般指定为空字符串,只有极少数情况下需要指定启动流程的版本。
完成任务
当流程流转到指定责任人时,要想流程继续流转下去,需要调用任务的完成接口:
ts
import * as bp from 'bp';
let taskClient = bp.newTaskClient();
let res = taskClient.complete(
'ID', // 任务实例的 ID
'OUTCOME', // 任务的结果,例如 approve 、reject 等,如果流程没有定义结果,也可以留空
{
// 对任务实例变量的赋值
key: 'value',
},
);
console.log(res);
流程定义操作
bpmeta 库提供了流程定义相关操作 API 可以对给定的流程定义进行增删改查的操作。目前该部分 API 仍在内测中,可能会有变化,请慎重使用。