1. 软件包开发
  2. 流程触发器

流程触发器与 触发器 一样,也是一种特殊的微代码,主要用于编写流程流转过程中一些自定义业务逻辑,两者主要区别如下:

  • 监听的主体对象不同:对象上的触发器是绑定到特定对象上的,而流程触发器是绑定到特定流程上的。
  • 触发机制不同:对象上的触发器是在特定对象中的数据发生变化时触发,而流程触发器是在特定流程中的审批单流转状态发生变化时触发。

流程触发器定义

流程触发器文件名称以.processTrigger.js结尾,格式如下:

module.exports = {
    listenTo: '流程API名称',
    beforeDraftInsert: [async] Function,
    afterDraftInsert: [async] Function,
    beforeDraftSubmit: [async] Function,
    afterDraftSubmit: [async] Function,
    beforeStepSubmit: [async] Function,
    afterStepSubmit: [async] Function,
    cacluateNextStepUsers: [async] Function,
    beforeCancel: [async] Function,
    afterCancel: [async] Function,
    beforeTerminate: [async] Function,
    afterTerminate: [async] Function,
    beforeEnd: [async] Function,
    afterEnd: [async] Function,
}

其中

  • listenTo: 流程API名称,选填。如果没有定义此属性,则取文件名中第一个 . 之前的文字作为listenTo的值,支持通过通配符指向多个流程
  • beforeDraftInsert: 流程创建草稿前,初始化申请单,选填
  • afterDraftInsert: 流程创建草稿后,初始化申请单,选填
  • beforeDraftSubmit: 流程从草稿箱提交前执行,选填
  • afterDraftSubmit: 流程从草稿箱提交后执行,选填
  • beforeStepSubmit: 审批表单提交前执行, 选填
  • afterStepSubmit : 审批表单提交后执行, 选填
  • cacluateNextStepUsers: 计算审批表单下一步骤处理人后执行,用于重写下一步骤处理人选项清单, 选填
  • beforeCancel: 取消申请前执行,选填
  • afterCancel: 取消申请后执行,选填
  • beforeTerminate: 流程被中止前执行,选填
  • afterTerminate: 流程被中止后执行,选填
  • beforeEnd: 流程结束前执行,选填
  • afterEnd: 流程结束后执行,选填

参数说明

所有脚本函数均为无参函数,所属数据可从this中获取,this结构如下:

  • id: 审批单的唯一标识[string],
  • userId: 当前用户唯一标识[string],
  • spaceId: 当前工作区唯一标识[string],
  • flowName: 当前流程API名称[string]
  • instance: 当前审批单[json],
  • step: 当前步骤[json],
  • nextStep: 下一步骤[json],
  • traceId: [string],
  • values: 当前审批单表单值[json],
  • nextUserIds: 下一步骤处理人选项清单[[string]],
  • nextUserId: 当前步骤已选下一步骤处理人[string],
  • instanceState: 审批单状态[string],draft/pending/completed/approved/rejected/terminated
  • traceState: 审核状态[string],pending/approved/rejected
  • approveState: 审核状态[string],pending/approved/rejected
  • broker: 微服务实例

流程微服务 API

流程微服务提供以下 API 供调用。

  • getFlow
  • getForm
  • getFormVersion
  • getInstance
  • getTrace
  • getApprove
  • getStep
  • getUserRoles
  • getNextSteps
  • createInstance
  • submitInstance
  • sendRemindSMS
  • relocate

触发器函数的返回值

如果return的是false,则中断操作,如在beforeSubmit里return false,则不执行提交操作。

流程触发器示例

afterSubmit: async function () {
    const instanceName = this.instance.name,
        spaceId = this.spaceId,
        instanceId = this.instance._id;
    let deadLine = ...;
    let userIds = ...;
    await this.broker.call(`WorkflowService.sendRemindSMS`, {
        instanceName, deadLine, userIds, spaceId, instanceId
    });
},