BPMAXBPMAX
  • 快速入门
  • 核心概念
  • 管理员手册
  • 仿真和回放
  • 流程相关脚本
  • 表单相关脚本
  • 数据集相关脚本
  • 界面相关脚本
  • 系统相关脚本
  • 流程集成
  • 数据集
  • OpenAPI
  • 实体列表
  • 插件开发
  • 日志排查
  • 飞书平台

    • 同步组织架构
    • 同步团队组织架构
    • 一键拉群
    • 高级卡片消息
    • 服务台能力
  • 实用功能

    • 系统公告
    • 项目日历
    • 超时自动化
    • 报告自动生成
  • 文档更新记录
  • 系统更新说明
  • 快速入门
  • 核心概念
  • 管理员手册
  • 仿真和回放
  • 流程相关脚本
  • 表单相关脚本
  • 数据集相关脚本
  • 界面相关脚本
  • 系统相关脚本
  • 流程集成
  • 数据集
  • OpenAPI
  • 实体列表
  • 插件开发
  • 日志排查
  • 飞书平台

    • 同步组织架构
    • 同步团队组织架构
    • 一键拉群
    • 高级卡片消息
    • 服务台能力
  • 实用功能

    • 系统公告
    • 项目日历
    • 超时自动化
    • 报告自动生成
  • 文档更新记录
  • 系统更新说明
  • 数据集相关脚本

    • 数据集字段

数据集字段

后处理脚本

接口定义

type Result = any;
const fn = (ctx:IDataSetFieldContext): Promise<Result> | Result
const result = await fn(context);
// 返回值会替换对应字段
data[dsField.key] = result;

IDataSetFieldContext

export interface IDataSetFieldContext {
  /** 当前处理的数据集字段key */
  key: string;
  /** 当前数据集字段的值 */
  value: any;
  /** 单条es记录完整的数据 */
  data: Record<string, any>;
  /** 日志服务 */
  $logger: CommonLogger;
  /** lodash工具库 */
  $lodash: LoDashStatic;
  /** moment时间处理库 */
  $moment: Moment;
  /** 加密方法 */
  $encrypt: (text: string) => string;
  /** 解密方法 */
  $decrypt: (text: string) => string;
  /** 根据项目路径获取流程路径 */
  getFlowPathByProjectPath: (projectPath: string) => Promise<string>;
  /** 执行自定义SQL查询 */
  $query: (sql: string) => Promise<any>;
}

数据集

搜索前处理脚本

若返回值则整体替换搜索参数,也可以通过修改ctx.body来改变部分参数

type Result = { body: SearchRequest.body; }
type Fn = (ctx: PreprocessContext): Promise<Result?>;

PreprocessContext

import type { ConsoleLogger } from '@nestjs/common';
import * as _ from 'lodash';
import * as moment from 'moment';
import type { TransportRequestOptions, TransportRequestOptionsWithMeta, TransportRequestOptionsWithOutMeta } from '@elastic/elasticsearch';
import type searchApi from '@elastic/elasticsearch/lib/api/api/search';
type SearchApiParams  = Parameters<typeof searchApi>;
export type SearchType = {
  body: SearchApiParams[0],
  options?: TransportRequestOptions | TransportRequestOptionsWithMeta | TransportRequestOptionsWithOutMeta
}
interface EsQuery {
 data_set_id: number;
 data_set_key: string;
 flow_type?: string;
 flow_key?: string;
 body: SearchType['body'];
 options?: SearchType['options'];
}
type PreprocessContext = {
  $logger: ConsoleLogger;
  $lodash: _;
  $moment: moment;
  $query: (sql: string) => Promise<any>;
  // 搜索其他数据集数据
  $esQuery: (query: EsQuery, esIndex?: string) => Promise<any>
  // 权限校验
  $can: (point: string | string[]) => boolean;
  /** 加密辅助函数 */
  $encrypt:(str: string | string[]) => string | string[];
  /** 解密辅助函数 */
  $decrypt:(str: string | string[]) => string | string[];
  $redis: Redis;
  /**
   * 调用插件、主项目接口
   * 有些情况下搜索逻辑比较复杂,可以在插件内写好对应的查询接口,在预处理这边调用,获取返回sql
   * 用于查询es,插件内接口会收到当前用户凭证,并且baseUrl已经做了处理会默认指向插件服务
   * @example ctx$proxyRequest({ url: '/project/xxx', method: 'post', body: ctx.body }).then(data => ...)
   * 
   */
  $proxyRequest: (config: AxiosRequestConfig = {}) => Promise<any>
  /**
   * 动态引入插件脚本
   * 当一些逻辑比较复杂时又担心proxyRequest性能不好时可以再插件里面编写脚本,在预/后处理函数内
   * 动态调用对应脚本
   * 注意: 此函数调用改的脚本只是单纯作为脚本使用无法使用 think.model等thinkjs框架提供的特性
   * 此函数内部调用 import(${path})作为返回值
   * 对scriptPath拼接成对应的插件server端根目录路径
   * @example
   * 插件脚本 
   * /bpmax-plugins/plugin_xunjian/server/src/service/plugin_xunjian_report/test.js
   * export const add = () => { ... }
   * 预处理脚本
   * const { add } = await ctx.$importServerScript('service/plugin_xunjian_report/test.js')
   * const result = add(1, 2);
   */
  $importServerScript: (scriptPath: string) => Promise<module>;
  userInfo: UserEntity;
  /**
   * 前端请求/bpmax/project/list接口参数
   */
  clientPayload: ListDto;
  /**
   * 前端请求参数转化为的es搜索
   * 通常情况下除了在数据集预处理时修改请求到es参数时前端还会默认
   * 传进来一些参数(筛选器模板的筛选控件传入),这些参数不是标准的es查询参数
   * 在查询前会经过解析器解析成对应的es原生搜索参数,如果后端预处理搜索时还需要利用
   * 这些解析后的sql查询可以取这个字段
   */
  clientFormatQuery: QueryDslQueryContainer[]
   /**
   * esSearch参数
   */
   body: SearchRequest.body;
  /**
  * es搜索结果、返回数据的 source数据, 后处理会有此数据
  */
  data: SearchHit<unknown>[];
}

搜索后处理脚本

后处理脚本用于对ES搜索结果进行二次处理。脚本会接收搜索结果数据,可以对数据进行修改后返回。

接口定义

type Result = { data: any[] };
type Fn = (ctx: PostprocessContext): Promise<Result?>;

// 返回值会替换搜索结果数据
// 如果不返回值则使用ctx.data作为结果
return { data: processedData };

PostprocessContext

type PostprocessContext = {
  $logger: ConsoleLogger;
  $lodash: _;
  $moment: moment;
  /** 执行自定义SQL查询 */
  $query: (sql: string) => Promise<any>;
  /** 搜索其他数据集数据 */
  $esQuery: (query: EsQuery, esIndex?: string) => Promise<any>;
  /** 权限校验 */
  $can: (point: string | string[]) => boolean;
  /** 加密辅助函数 */
  $encrypt:(str: string | string[]) => string | string[];
  /** 解密辅助函数 */
  $decrypt:(str: string | string[]) => string | string[];
  /** Redis客户端 */
  $redis: Redis;
  /**
   * 调用插件、主项目接口
   * 有些情况下处理逻辑比较复杂,可以在插件内写好对应的处理接口,在后处理这边调用
   * 用于处理数据,插件内接口会收到当前用户凭证,并且baseUrl已经做了处理会默认指向插件服务
   * @example ctx.$proxyRequest({ url: '/project/xxx', method: 'post', body: ctx.data }).then(data => ...)
   */
  $proxyRequest: (config: AxiosRequestConfig = {}) => Promise<any>;
  /**
   * 动态引入插件脚本
   * 当一些逻辑比较复杂时又担心proxyRequest性能不好时可以在插件里面编写脚本,在预/后处理函数内
   * 动态调用对应脚本
   * 注意: 此函数调用的脚本只是单纯作为脚本使用无法使用 think.model等thinkjs框架提供的特性
   * 此函数内部调用 import(${path})作为返回值
   * 对scriptPath拼接成对应的插件server端根目录路径
   * @example
   * 插件脚本 
   * /bpmax-plugins/plugin_xunjian/server/src/service/plugin_xunjian_report/test.js
   * export const add = () => { ... }
   * 后处理脚本
   * const { add } = await ctx.$importServerScript('service/plugin_xunjian_report/test.js')
   * const result = add(1, 2);
   */
  $importServerScript: (scriptPath: string) => Promise<module>;
  /** 当前用户信息 */
  userInfo: UserEntity;
  /** 前端请求参数 */
  clientPayload: ListDto;
  /** 前端请求参数转化成的es搜索参数 */
  clientFormatQuery: QueryDslQueryContainer[];
  /** esSearch参数 */
  body: SearchRequest.body;
  /** es搜索结果数据 */
  data: SearchHit<unknown>[];
}

刷新项目数据集脚本

当项目数据发生变化时,可能需要刷新相关联的其他项目数据。例如子流程更新时需要刷新父流程数据集,或者父流程更新时需要刷新子流程数据集。

接口定义

type Result = {
  /** 流程类型 */
  flow_type: string;
  /** 流程标识 */
  flow_key: string;
  /** 需要刷新的数据集key列表,不传时刷新涉及到的所有数据集 */
  data_set_key?: string[];
  /** 待刷新的项目id列表,不传或为空时不刷新 */
  ids: number[];
}[];

type Fn = (ctx: RefreshContext) => Promise<Result>;

RefreshContext

type RefreshContext = {
  /** 当前更新的项目数据列表 */
  list: any[];
  /** 当前数据集信息 */
  dataSet: {
    id: number;
    es_index: string;
    flow_type: string; 
    flow_key: string;
    // ...其他数据集字段
  };
  /** 日志服务 */
  $logger: CommonLogger;
  /** lodash工具库 */
  $lodash: LoDashStatic;
  /** moment时间处理库 */
  $moment: Moment;
  /** 执行自定义SQL查询 */
  query: (sql: string) => Promise<any>;
}

数据集后处理脚本

数据集后处理脚本用于对数据集同步到ES前进行数据处理。脚本会接收原始数据,可以对数据进行修改后返回。

接口定义

type Result = any;
type Fn = (ctx: PostScriptContext) => Promise<Result?>;

// 返回值会替换当前处理的数据
// 如果不返回值则使用ctx.value作为结果
return processedData;

PostScriptContext

type PostScriptContext = {
  /** 当前处理的数据 */
  value: any;
  /** 完整的数据对象 */
  data: any;
  /** 日志服务 */
  $logger: CommonLogger;
  /** lodash工具库 */
  $lodash: LoDashStatic;
  /** moment时间处理库 */
  $moment: Moment;
  /** 加密辅助函数 */
  $encrypt:(str: string | string[]) => string | string[];
  /** 解密辅助函数 */
  $decrypt:(str: string | string[]) => string | string[];
  /** 执行自定义SQL查询 */
  $query: (sql: string) => Promise<any>;
}

数据集后处理Mapping

数据集后处理Mapping用于对ES索引的mapping进行自定义配置。脚本会接收默认mapping配置,可以进行修改后使用。

接口定义

type Fn = (ctx: PostMappingContext) => void;

PostMappingContext

type PostMappingContext = {
  /** ES索引的mapping配置 */
  mapping: {
    dynamic: boolean;
    properties: Record<string, any>;
  };
  /** 日志服务 */
  $logger: CommonLogger;
  /** lodash工具库 */
  $lodash: LoDashStatic;
  /** moment时间处理库 */
  $moment: Moment;
}