Skip to content

数据源-通过脚本获取

概述

对于一些复杂的数据获取场景,例如需要从关联系统通过接口的形式获取数据或者是对系统中数据做计算后获取的情况下可以使用通过脚本获取 来实现。开启后需要设置数据计算脚本的路径,脚本中需要导出以下函数

javascript
/**
 * 通过id查询记录详情,返回值为对象
 */
export function executeQueryById(ctx) {
    return obj;
}

/**
 * 通过条件查询记录列表,返回值为数组
 */
export function executeQueryList(ctx) {
    return list;
}

/**
 * 通过条件查询记录数量,返回值为整数。如果返回值小于0,则页面不会使用分页模式渲染数据
 */
export function executeQueryListCount(ctx) {
    return size;
}

ctx的定义

typescript
interface OrderBy {
    field: string; // 字段名
    order: 'ASC' | 'DESC'; // 排序方式,升序或降序
}

interface Filter {
    field: string; // 字段名
    condition: string; // 条件
    value: any; // 条件值
}

interface Query {
    id: string; // 记录ID
    pageIndex: number; // 起始页码,第一页从1开始
    pageSize: number; // 分页大小
    includeFields: Array<string>; // 查询字段列表
    orderByList: Array<OrderBy>; // 排序列表
    childrenFieldId?: string; // 属性结构字段的标识符,可以为空
    childrenShowParent?: boolean; // 树形结构的查询结果中是否包含父节点
    childrenRootRecordId?: string; // 树形结构的查询中根节点的ID
    filter?: Filter; // 过滤条件
    filterId?: string; // 组合筛选过滤器ID
    pathFilterId?: string; // 地址栏筛选过滤器ID
    pathFilterQuery?: object; // 地址栏筛选过滤器条件
}

interface RequestParams {
    appId: string; // 应用ID
    tableId: string; // 数据表标识符
    id: string; // 记录ID,executeQueryById方法会使用
    query: Query;
}

关于OrderBy Filter的定义请参见informat.table

脚本获取数据示例

javascript
//
export function executeQueryById(ctx) {
    console.log('id', ctx.id);//记录id
    const obj = { id: '1', name: 'data1' }
    return obj;
}

//
export function executeQueryList(ctx) {
    const result = [
        { id: '1', name: 'data1' },
        { id: '2', name: 'data2' },
        { id: '3', name: 'data3' }
    ]
    return result;
}

//
export function executeQueryListCount(ctx) {
    return 3;
}

当过滤器中有组合过滤器或路径过滤器时,系统会把过滤条件组装成filter对象

脚本获取数据示例-使用jdbc获取数据

javascript
//
export function executeQueryById(ctx) {
    const connection = informat.jdbc.tableConnection();
    const list = [];
    console.log(ctx);
    connection.select(`select * from script_and_view_source_dep_data where id = ? limit 1;`, (resultSet) => {
        list.push(handleData({
            id: resultSet.getString('id'),
            name: resultSet.getString('name'),
            sex: resultSet.getString('sex'),
            post: resultSet.getString('post'),
            score: resultSet.getDouble('score'),
            mobileNo: resultSet.getString('mobile_no'),
            createTime: resultSet.getString('create_time')
        }));
    }, ctx.id);
    if (list.length === 0) {
        informat.app.abort('数据不存在或已被删除');
        return;
    }
    return list[0];
}

//
export function executeQueryList(ctx) {
    const {
        pageIndex,
        pageSize
    } = ctx.query;
    const connection = informat.jdbc.tableConnection();
    const list = [];
    let pageStart = (pageIndex - 1) * pageSize;
    if (Number.isNaN(pageStart) || pageStart < 0) {
        pageStart = 0;
    }
    connection.select(`select * from script_and_view_source_dep_data limit ? offset ?;`, (resultSet) => {
        list.push(handleData({
            id: resultSet.getString('id'),
            name: resultSet.getString('name'),
            sex: resultSet.getString('sex'),
            post: resultSet.getString('post'),
            score: resultSet.getDouble('score'),
            mobileNo: resultSet.getString('mobile_no'),
            createTime: resultSet.getString('create_time')
        }));
    }, pageSize, pageStart);
    return list;
}

//
export function executeQueryListCount(ctx) {
    const connection = informat.jdbc.tableConnection();
    let count = 0;
    connection.select(`select count(1) as counts from script_and_view_source_dep_data;`, (resultSet) => {
        count = resultSet.getLong('counts');
    });
    return count;
}