流水线
流水线
流水线是单个集合的导入或导出数据源,声明在集合旁的 src/data/collection/<m>/+pipeline.ts 中。它的行以调用方身份经由集合的写入管道进入,因此授权、transform 与审批全部适用。
// src/data/collection/roster/roster_entry/+pipeline.ts (templates/hr-payroll, excerpt)
import { pipeline } from '@norbital-ai/bolt';
/**
* The work-day sheet: one row per person-day — shift, clock, overtime, incentive hours, leave. …
*/
export default pipeline('roster_entry', {
import: {
description:
'The work-day sheet: per employee, the days it covers become exactly what it states — rows created or updated, unsettled days left out or blanked removed, a leave code recorded as a day of time off. …',
input: {
rows: {
kind: 'list',
max: 10_000,
of: {
kind: 'object',
fields: {
row: { kind: 'number' },
employee_number: { kind: 'text', label: SHEET_COLUMNS.employee_number },
work_date: { kind: 'date', label: SHEET_COLUMNS.work_date },
shift_code: { kind: 'text', label: SHEET_COLUMNS.shift_code, optional: true },
clock_in: { kind: 'time', label: SHEET_COLUMNS.clock_in, optional: true },
clock_out: { kind: 'time', label: SHEET_COLUMNS.clock_out, optional: true }
// …
}
}
}
},
records: (input) =>
input.rows.map((row): SheetRecord => ({
row: row.row,
employee_number: row.employee_number.trim(),
work_date: String(row.work_date)
// …
})),
known: function* (ctx, records, { context }) { … },
map: (record, { known }) => sheetRow(record, known),
onConflict: 'update'
// …
}
}); 导入
import 声明带类型的 input;records 把输入转换为远端记录;可选的 known 对已存在的行进行一次读取;map 把一条记录转换为一次插入,或返回 null 跳过;以及 onConflict(update 或 keep),当集合的模型声明了 key 时必填。
导出
export 声明 select、可选的 where 以及 format(csv、xlsx 或 json)。生成的文件是该次运行的输出,发起运行的成员可以读取。
运行
在浏览器中,每个数据源都是平台自动化 <collection>.pipeline 的一次运行,由授权允许的成员通过 bolt.start 发起:导入需要创建授权,导出需要读取授权。视图工具栏为查看者可以运行的数据源提供“导入…”与“导出”,运行会显示进度与生成的文件。
流水线不够用时
流水线只覆盖单个集合的数据源。需要解析或创建其他集合的行、或需要逐行说明拒绝原因的导入,应写成集合操作;需要组装关联行、文档或多个文件的导出,应写成在运行结果中返回文件的自动化。