Skip to content

BPM 流程库

基本概念

流程处理涉及到比较多的概念,为了实现一些复杂的流程处理,系统内部对象也被设计得较为灵活,初次使用时容易造成误解,因此在这里先梳理一次流程的关系图如下:

流程概念

首先我们看开发态。开发态方面主要有 3 个概念,分别是

  1. 流程定义,即我们定义的流程图,一般由各种节点组成,定义了流程应该如何流转;
  2. 用户任务节点,即流程图里的用户任务节点,是需要特别关注的特殊节点,表达了当流程执行到此处时,需要等待用户进行下一步的操作反馈才会继续的节点;
  3. 表单页面,即用户任务节点关联的表单页面定义。

为了让流程真正运行起来,每个开发态的概念又会映射为运行态的概念:

  1. 流程实例,即从流程定义中创建的用于记录流程状态信息的记录,一个流程定义可以产生多条实例记录;
  2. 任务实例,是由流程流转中从用户任务节点产生的用于记录任务状态的记录,一个用户任务节点可能创建出多条任务实例(例如会签场景,每个独立的会签人都会产生一个任务实例),因此,一个流程实例可以有多个任务实例;
  3. 页面渲染,由每个页面定义经过平台的渲染引擎生成的表单页面,可以是平台的标准页面或高级页面,甚至是自定义页面,主要用途是提供界面给用户进行接口调用。

流程的运行机制如下:首先,当用户启动一个新流程时,系统会根据流程定义信息生成一个流程实例,而流程流转到用户任务节点时,会根据用户任务节点的定义生成对应的一个或多个任务实例,流程至此则暂停,返回到调用方,等待任务实例被完成。任务实例的分配人可以从流程待办页面点击此流程实例关联的页面,在页面中完成任务,此时流程被重新拉起激活,继续根据流程定义执行剩余的节点,重复以上用户任务节点的执行过程,直至流程定义中没有新任务可以生成时,流程结束。

对于每个流程实例的创建和结束,都会对应一个 EV_FLOW_STARTEDEV_FLOW_TERMINATED 事件,而对于每个任务实例的创建和完成,都会对应一个 EV_TASK_STARTEDEV_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 仍在内测中,可能会有变化,请慎重使用。