数据集字段
后处理脚本
接口定义
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;
}