@agile-team/mach-report 2.4.1 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -13
- package/dist/ReportPreview-Dk-28QAi.js +2946 -0
- package/dist/ReportPreview-FSvcBLjH.cjs +6 -0
- package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
- package/dist/analytics.cjs +1 -0
- package/dist/analytics.d.cts +276 -0
- package/dist/analytics.d.ts +276 -0
- package/dist/analytics.js +223 -0
- package/dist/assets-66UBlhES.cjs +1 -0
- package/dist/assets-NVA_sftu.js +163 -0
- package/dist/capabilities-CNjIirfo.js +36 -0
- package/dist/capabilities-D4xeVYSR.cjs +1 -0
- package/dist/designer.cjs +1 -0
- package/dist/designer.d.cts +753 -0
- package/dist/designer.d.ts +753 -0
- package/dist/designer.js +372 -0
- package/dist/grid-geometry-BNptEcMm.js +65 -0
- package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
- package/dist/index.cjs +8 -5
- package/dist/index.d.cts +413 -8
- package/dist/index.d.ts +413 -8
- package/dist/index.js +1016 -1501
- package/dist/param-validation-BWNjLcN0.js +116 -0
- package/dist/param-validation-CiTxFeZ8.cjs +1 -0
- package/dist/pdf.cjs +48 -48
- package/dist/pdf.d.cts +111 -1
- package/dist/pdf.d.ts +111 -1
- package/dist/pdf.js +3931 -3868
- package/dist/{plugin-DwKr8oF6.cjs → plugin-BqBkn_kI.cjs} +1 -1
- package/dist/{plugin-CKnSVuVe.js → plugin-Ds10VnQO.js} +2 -2
- package/dist/render-plan-CckPEQyf.cjs +1 -0
- package/dist/{render-plan-CXBWRog4.js → render-plan-uzZYYSy1.js} +11 -10
- package/dist/report-params-B_VCihAh.js +12 -0
- package/dist/report-params-CjWrjPl6.cjs +1 -0
- package/dist/report-source-B9bENO0F.js +750 -0
- package/dist/report-source-BbNkkBDy.cjs +1 -0
- package/dist/server/node.d.cts +297 -0
- package/dist/server/node.d.ts +297 -0
- package/dist/server-node.cjs +1 -0
- package/dist/server-node.js +270 -0
- package/dist/server.cjs +1 -0
- package/dist/server.d.cts +643 -0
- package/dist/server.d.ts +643 -0
- package/dist/server.js +237 -0
- package/dist/style-CpwiOPyB.cjs +1 -0
- package/dist/style-Dv5o_x6b.js +67 -0
- package/dist/style.css +1 -1
- package/dist/template-registry-DWExx0gU.cjs +1 -0
- package/dist/template-registry-NpOakidD.js +354 -0
- package/dist/textwrap-CnGsEum6.cjs +4 -0
- package/dist/textwrap-DOl04hCQ.js +110 -0
- package/dist/validate-DfHPD8wX.cjs +1 -0
- package/dist/validate-S6CgIm5d.js +148 -0
- package/dist/vue/async.d.cts +694 -54
- package/dist/vue/async.d.ts +694 -54
- package/dist/vue/index.d.cts +1212 -111
- package/dist/vue/index.d.ts +1212 -111
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +167 -80
- package/dist/worker.cjs +1 -0
- package/dist/worker.d.cts +302 -0
- package/dist/worker.d.ts +302 -0
- package/dist/worker.js +133 -0
- package/dist/xlsx/node.d.cts +47 -0
- package/dist/xlsx/node.d.ts +47 -0
- package/dist/xlsx-node.cjs +221 -0
- package/dist/xlsx-node.js +36409 -0
- package/dist/xlsx.cjs +20 -20
- package/dist/xlsx.d.cts +78 -1
- package/dist/xlsx.d.ts +78 -1
- package/dist/xlsx.js +5974 -5831
- package/package.json +62 -2
- package/dist/ReportPreview-BVTpw9Tb.cjs +0 -6
- package/dist/ReportPreview-XF8iSUG1.js +0 -1910
- package/dist/grid-geometry-BNIvw52m.cjs +0 -1
- package/dist/grid-geometry-C8hGoe9o.js +0 -130
- package/dist/render-plan-CCTL4F9v.cjs +0 -1
- package/dist/report-params-B3Fia6JO.js +0 -10
- package/dist/report-params-D1gZ1DME.cjs +0 -1
- package/dist/textwrap-nH0UYU6D.js +0 -108
- package/dist/textwrap-oD-t4b4B.cjs +0 -4
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 列值格式化(声明式、JSON 可序列化)。
|
|
3
|
+
* 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
|
|
4
|
+
* 三后端(DOM/Canvas/PDF)零改动。
|
|
5
|
+
*
|
|
6
|
+
* 语义约定(v0.9 固化):
|
|
7
|
+
* - number.digits 显式给出 → 精确保留(12.5 + digits:2 → "12.50")
|
|
8
|
+
* - number.thousands 默认 false(千分位显式开启)
|
|
9
|
+
* - date 字符串按"本地时区的日历日"解析(YYYY-MM-DD / YYYY/MM/DD 直取年月日,
|
|
10
|
+
* 不经 Date 字符串构造——后者按 UTC 零点,负时区环境会少一天)
|
|
11
|
+
*/
|
|
12
|
+
declare type ColumnFormat = {
|
|
13
|
+
kind: "number";
|
|
14
|
+
thousands?: boolean;
|
|
15
|
+
digits?: number;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "percent";
|
|
18
|
+
digits?: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "date";
|
|
21
|
+
pattern?: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
declare type ComponentKind = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
|
|
25
|
+
|
|
26
|
+
declare interface ComponentStyle {
|
|
27
|
+
fontSizePx?: number;
|
|
28
|
+
fontSize?: number;
|
|
29
|
+
fontFamily?: string;
|
|
30
|
+
bold?: boolean;
|
|
31
|
+
italic?: boolean;
|
|
32
|
+
underline?: boolean;
|
|
33
|
+
color?: string;
|
|
34
|
+
backgroundColor?: string;
|
|
35
|
+
align?: "left" | "center" | "right" | "justify";
|
|
36
|
+
verticalAlign?: "top" | "middle" | "bottom";
|
|
37
|
+
lineColor?: string;
|
|
38
|
+
borderColor?: string;
|
|
39
|
+
lineWidthPt?: number;
|
|
40
|
+
borderTop?: boolean;
|
|
41
|
+
borderRight?: boolean;
|
|
42
|
+
borderBottom?: boolean;
|
|
43
|
+
borderLeft?: boolean;
|
|
44
|
+
lineHeight?: number;
|
|
45
|
+
letterSpacing?: number;
|
|
46
|
+
opacity?: number;
|
|
47
|
+
rotateDeg?: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** 无 Vue、无 HTTP 框架的可选服务端外观;PDF/Excel 仅在对应 export 调用时加载。 */
|
|
51
|
+
export declare function createReportRuntime(options: ReportRuntimeOptions): ReportRuntime;
|
|
52
|
+
|
|
53
|
+
/** 有界、无重试的进程内任务队列;取消不会提前归还仍在执行的 CPU 任务并发槽位。 */
|
|
54
|
+
export declare function createReportTaskQueue(options?: {
|
|
55
|
+
concurrency?: number;
|
|
56
|
+
maxQueued?: number;
|
|
57
|
+
}): ReportTaskQueue;
|
|
58
|
+
|
|
59
|
+
declare interface DatasetContract {
|
|
60
|
+
fields: readonly ReportFieldContract[];
|
|
61
|
+
rowKey?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
declare type DatasetRows = Record<string, Record<string, unknown>[]>;
|
|
65
|
+
|
|
66
|
+
declare interface DatasetValidationOptions {
|
|
67
|
+
path?: string;
|
|
68
|
+
maxRows?: number;
|
|
69
|
+
maxCells?: number;
|
|
70
|
+
maxIssues?: number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
declare interface GridCell {
|
|
74
|
+
text?: string;
|
|
75
|
+
rawText?: string;
|
|
76
|
+
/** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
|
|
77
|
+
value?: string | number | boolean | null;
|
|
78
|
+
/** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
|
|
79
|
+
numberFormat?: string;
|
|
80
|
+
/** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
|
|
81
|
+
valueType?: "text" | "number" | "boolean";
|
|
82
|
+
/** 单元格级编辑控制;预览仍需显式开启 editing。 */
|
|
83
|
+
editable?: boolean;
|
|
84
|
+
source?: ReportCellSource;
|
|
85
|
+
/** Excel 公式保留元数据;当前引擎不计算公式,公式格始终只读。 */
|
|
86
|
+
formula?: string;
|
|
87
|
+
children?: PlanComponent[];
|
|
88
|
+
colSpan?: number;
|
|
89
|
+
rowSpan?: number;
|
|
90
|
+
style?: ComponentStyle;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
|
|
94
|
+
declare type ListAlignment = NonNullable<ComponentStyle["align"]> | "auto";
|
|
95
|
+
|
|
96
|
+
declare interface ListColumn {
|
|
97
|
+
header: string;
|
|
98
|
+
field: string;
|
|
99
|
+
widthMm: number;
|
|
100
|
+
style?: ComponentStyle;
|
|
101
|
+
/** 内容对齐,优先于 style.align;数值字符串不会自动判为数字。 */
|
|
102
|
+
align?: ListAlignment;
|
|
103
|
+
/** 独立的表头对齐,不改变内容对齐。 */
|
|
104
|
+
headerAlign?: ComponentStyle["align"];
|
|
105
|
+
/** 独立的表头样式,优先于列表级表头样式。 */
|
|
106
|
+
headerStyle?: ComponentStyle;
|
|
107
|
+
/** 值格式化(声明式):千分位/小数位、百分比、日期 pattern */
|
|
108
|
+
format?: ColumnFormat;
|
|
109
|
+
/** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
|
|
110
|
+
rules?: StyleRule[];
|
|
111
|
+
/** 内容列编辑控制;仍需由预览显式开启 editing,不影响表头/小计只读规则。 */
|
|
112
|
+
editable?: boolean;
|
|
113
|
+
/** 空值列或特殊数据类型可显式声明编辑输入类型。 */
|
|
114
|
+
valueType?: GridCell["valueType"];
|
|
115
|
+
/** 字段语义用于 auto 对齐;明确声明编号,避免把数字编号当成度量。 */
|
|
116
|
+
semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
declare interface ListComponent {
|
|
120
|
+
kind: "list";
|
|
121
|
+
id?: string;
|
|
122
|
+
/** 宽表标记用于连续 Excel;不改变低层列表的列宽和分页算法。 */
|
|
123
|
+
layout?: "page" | "wide";
|
|
124
|
+
/** 逻辑表名称,供 Excel Sheet 命名;不额外生成标题组件。 */
|
|
125
|
+
title?: string;
|
|
126
|
+
leftMm: number;
|
|
127
|
+
topMm: number;
|
|
128
|
+
widthMm: number;
|
|
129
|
+
dataset: string;
|
|
130
|
+
/** 数据集中稳定业务主键的字段名;省略时编辑仅有计划内坐标。 */
|
|
131
|
+
rowKey?: string;
|
|
132
|
+
revisionField?: string;
|
|
133
|
+
sourceTokenField?: string;
|
|
134
|
+
columns: ListColumn[];
|
|
135
|
+
fontSizePt?: number;
|
|
136
|
+
headerBold?: boolean;
|
|
137
|
+
rowHeightMm?: number;
|
|
138
|
+
paddingMm?: number;
|
|
139
|
+
headerEveryPage?: boolean;
|
|
140
|
+
headerBackgroundColor?: string;
|
|
141
|
+
/** 内容默认对齐,列配置可覆盖;低层模板缺省仍为 left。 */
|
|
142
|
+
align?: ListAlignment;
|
|
143
|
+
/** 表头默认对齐,列配置可覆盖。 */
|
|
144
|
+
headerAlign?: ComponentStyle["align"];
|
|
145
|
+
headerStyle?: ComponentStyle;
|
|
146
|
+
/** 可选多行合并表头;列宽按列表物理列对齐,供 Excel 业务模板复用。 */
|
|
147
|
+
headerGrid?: PlanGrid;
|
|
148
|
+
border?: boolean;
|
|
149
|
+
/** 分组小计(组头/组尾小计/组头防孤行) */
|
|
150
|
+
groupBy?: ListGroupBy;
|
|
151
|
+
/** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
|
|
152
|
+
grandTotal?: ListGrandTotal;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
declare type ListGrandTotal = boolean | {
|
|
156
|
+
label?: string;
|
|
157
|
+
style?: ComponentStyle;
|
|
158
|
+
/** 合计列(缺省沿用 groupBy.subtotal) */
|
|
159
|
+
fields?: string[];
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/** 分组小计配置(声明式,见 ListComponent.groupBy) */
|
|
163
|
+
declare interface ListGroupBy {
|
|
164
|
+
/** 分组字段(值变化即切组) */
|
|
165
|
+
field: string;
|
|
166
|
+
/** 组头文案模板,{value} 占位(默认 "{value}") */
|
|
167
|
+
headerTemplate?: string;
|
|
168
|
+
headerStyle?: ComponentStyle;
|
|
169
|
+
/** 需要小计的列字段(组尾输出合计行;数值列求和,其余输出首值/留空) */
|
|
170
|
+
subtotal?: string[];
|
|
171
|
+
subtotalStyle?: ComponentStyle;
|
|
172
|
+
subtotalLabel?: string;
|
|
173
|
+
/** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
|
|
174
|
+
keepWithNext?: boolean;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
declare interface PaginateOptions {
|
|
178
|
+
/** 每行额外占高(mm),压测专用钩子 */
|
|
179
|
+
mmPerRow?: number;
|
|
180
|
+
/** 文本测量器(默认启发式;浏览器端可注入 canvas 测量校准) */
|
|
181
|
+
measurer?: TextMeasurer;
|
|
182
|
+
/** 可选页数上限;在追加超限页前终止,避免先分配全部页面再检查。 */
|
|
183
|
+
maxPages?: number;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
declare interface PlanComponent {
|
|
187
|
+
kind: ComponentKind;
|
|
188
|
+
leftMm: number;
|
|
189
|
+
topMm: number;
|
|
190
|
+
widthMm: number;
|
|
191
|
+
heightMm: number;
|
|
192
|
+
nid?: string;
|
|
193
|
+
rkey?: string;
|
|
194
|
+
text?: string;
|
|
195
|
+
rawText?: string;
|
|
196
|
+
lines?: string[];
|
|
197
|
+
richParagraphs?: RichParagraph[];
|
|
198
|
+
imageData?: string;
|
|
199
|
+
/** 明确指定线段方向;省略保持历史水平线行为。 */
|
|
200
|
+
lineDirection?: "down" | "up";
|
|
201
|
+
grid?: PlanGrid;
|
|
202
|
+
table?: PlanTableFragment;
|
|
203
|
+
style?: ComponentStyle;
|
|
204
|
+
meta?: Record<string, unknown>;
|
|
205
|
+
/** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
|
|
206
|
+
fallbackText?: string;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
declare interface PlanGrid {
|
|
210
|
+
/** 行内允许 null 空位;渲染器按空单元格处理 */
|
|
211
|
+
cells: (GridCell | null)[][];
|
|
212
|
+
colWidthsMm?: number[];
|
|
213
|
+
rowHeightsMm?: number[];
|
|
214
|
+
gapMm?: number;
|
|
215
|
+
/** 单元格四边内距;旧静态网格默认 0.5mm,分页列表使用其真实测量内距。 */
|
|
216
|
+
paddingMm?: number;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
declare interface PlanPage {
|
|
220
|
+
/** wide 表示完整自然列宽;页面仅为预览的垂直窗口分段。 */
|
|
221
|
+
layout?: "page" | "wide";
|
|
222
|
+
pageWidthMm: number;
|
|
223
|
+
pageHeightMm: number;
|
|
224
|
+
marginTopMm?: number;
|
|
225
|
+
marginBottomMm?: number;
|
|
226
|
+
marginLeftMm?: number;
|
|
227
|
+
marginRightMm?: number;
|
|
228
|
+
components: PlanComponent[];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** 列表的逻辑行来源;用于连续 Excel 重组,避免按文本猜测重复表头。 */
|
|
232
|
+
declare interface PlanTableFragment {
|
|
233
|
+
/** 在整个计划中唯一的逻辑表身份;同一表的分页片段共享身份。 */
|
|
234
|
+
id: string;
|
|
235
|
+
/** 表头固定 -1;其余行(包括组头/小计/总计)从 0 连续递增。 */
|
|
236
|
+
rowIndex: number;
|
|
237
|
+
role: "header" | "body" | "group-header" | "subtotal" | "grand-total";
|
|
238
|
+
/** 按物理列顺序保存字段身份;不以表头显示文本判断列结构。 */
|
|
239
|
+
columnKeys: string[];
|
|
240
|
+
layout?: "page" | "wide";
|
|
241
|
+
title?: string;
|
|
242
|
+
/** 只有宿主声明稳定 rowKey 时生成,不能用显示顺序替代业务主键。 */
|
|
243
|
+
source?: Omit<ReportCellSource, "field" | "rowKey"> & {
|
|
244
|
+
rowKey?: string | number;
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export declare interface PreparedReport {
|
|
249
|
+
plan: RenderPlan;
|
|
250
|
+
diagnostics: ReportDiagnostic[];
|
|
251
|
+
stats: ReportRuntimeStats;
|
|
252
|
+
revisions: Record<string, {
|
|
253
|
+
revision?: string;
|
|
254
|
+
sourceToken?: string;
|
|
255
|
+
}>;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
declare interface RenderPlan {
|
|
259
|
+
schemaVersion: string;
|
|
260
|
+
pages: PlanPage[];
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** 预览中的物理坐标;合并单元格使用左上角坐标。 */
|
|
264
|
+
declare interface ReportCellAddress {
|
|
265
|
+
pageIndex: number;
|
|
266
|
+
componentIndex: number;
|
|
267
|
+
rowIndex: number;
|
|
268
|
+
columnIndex: number;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
declare interface ReportCellEdit {
|
|
272
|
+
address: ReportCellAddress;
|
|
273
|
+
table?: ReportCellTableIdentity;
|
|
274
|
+
source?: Readonly<ReportCellSource>;
|
|
275
|
+
previousValue: ReportCellValue;
|
|
276
|
+
previousText: string;
|
|
277
|
+
value: ReportCellValue;
|
|
278
|
+
text: string;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** 可持久化的业务身份与计划坐标独立;权限及并发校验仍由业务服务器执行。 */
|
|
282
|
+
declare interface ReportCellSource {
|
|
283
|
+
datasetId: string;
|
|
284
|
+
rowKey: string | number;
|
|
285
|
+
field: string;
|
|
286
|
+
revision?: string | number;
|
|
287
|
+
sourceToken?: string;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
declare interface ReportCellTableIdentity {
|
|
291
|
+
id: string;
|
|
292
|
+
/** 逻辑表行索引;跨分页的同一行保持不变。 */
|
|
293
|
+
rowIndex: number;
|
|
294
|
+
role: PlanTableFragment["role"];
|
|
295
|
+
columnKey?: string;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
declare type ReportCellValue = string | number | boolean | null;
|
|
299
|
+
|
|
300
|
+
declare interface ReportDefinition {
|
|
301
|
+
/** 静态模板或宿主提供的异步模板加载器;动态模板默认每次重新读取,不缓存版本。 */
|
|
302
|
+
template: ReportTemplate | ReportTemplateLoader;
|
|
303
|
+
/** 静态数据;load 存在时优先使用 load 的结果。 */
|
|
304
|
+
datasets?: DatasetRows;
|
|
305
|
+
load?: (context: ReportLoadContext) => DatasetRows | Promise<DatasetRows>;
|
|
306
|
+
/** 可选统一适配器;load 存在时仍优先 load,兼容已有定义。 */
|
|
307
|
+
provider?: ReportProvider;
|
|
308
|
+
/** 可选业务数据契约;声明的数据集缺失或字段不合法时,在分页前给出结构化错误。 */
|
|
309
|
+
dataSchema?: Record<string, DatasetContract>;
|
|
310
|
+
dataValidation?: Pick<DatasetValidationOptions, "maxRows" | "maxCells" | "maxIssues">;
|
|
311
|
+
/** 覆盖模板参数定义;动态模板应在此声明查询面板元数据,避免查询前先请求模板。 */
|
|
312
|
+
params?: ReportParamDef[];
|
|
313
|
+
pagination?: PaginateOptions;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export declare interface ReportDescription {
|
|
317
|
+
id: string;
|
|
318
|
+
params: ReportParamDef[];
|
|
319
|
+
paramsSchema: Record<string, unknown>;
|
|
320
|
+
datasetsSchema: Record<string, Record<string, unknown>>;
|
|
321
|
+
/** Provider 的可选远程能力;runtime 自身始终提供 PDF/XLSX 导出。 */
|
|
322
|
+
capabilities: {
|
|
323
|
+
save: boolean;
|
|
324
|
+
export: boolean;
|
|
325
|
+
templates: boolean;
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
declare interface ReportDiagnostic {
|
|
330
|
+
code: string;
|
|
331
|
+
message: string;
|
|
332
|
+
path?: string;
|
|
333
|
+
severity: "warning" | "error" | "info";
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
declare interface ReportFieldContract {
|
|
337
|
+
field: string;
|
|
338
|
+
label?: string;
|
|
339
|
+
type: "text" | "number" | "boolean" | "date" | "decimal";
|
|
340
|
+
required?: boolean;
|
|
341
|
+
nullable?: boolean;
|
|
342
|
+
enum?: readonly (string | number | boolean)[];
|
|
343
|
+
min?: number;
|
|
344
|
+
max?: number;
|
|
345
|
+
minLength?: number;
|
|
346
|
+
maxLength?: number;
|
|
347
|
+
semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
|
|
348
|
+
unit?: string;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/** 取数与排版共同使用的请求上下文;取消只影响本次调用。 */
|
|
352
|
+
declare interface ReportLoadContext {
|
|
353
|
+
reportId: string;
|
|
354
|
+
params: Record<string, string>;
|
|
355
|
+
signal?: AbortSignal;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
|
|
359
|
+
declare interface ReportParamDef {
|
|
360
|
+
/** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
|
|
361
|
+
field: string;
|
|
362
|
+
/** 显示名(缺省用 field) */
|
|
363
|
+
label?: string;
|
|
364
|
+
type?: "text" | "number" | "date" | "select";
|
|
365
|
+
/** select 选项 */
|
|
366
|
+
options?: Array<{
|
|
367
|
+
label: string;
|
|
368
|
+
value: string;
|
|
369
|
+
}>;
|
|
370
|
+
defaultValue?: string;
|
|
371
|
+
required?: boolean;
|
|
372
|
+
placeholder?: string;
|
|
373
|
+
/** 数字上下界;date 参数使用 YYYY-MM-DD 字符串(含边界)。 */
|
|
374
|
+
min?: number | string;
|
|
375
|
+
max?: number | string;
|
|
376
|
+
minLength?: number;
|
|
377
|
+
maxLength?: number;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
declare interface ReportParamIssue {
|
|
381
|
+
code: ReportParamIssueCode;
|
|
382
|
+
path: string;
|
|
383
|
+
field: string;
|
|
384
|
+
message: string;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
declare type ReportParamIssueCode = "definition" | "required" | "type" | "option" | "minimum" | "maximum" | "minLength" | "maxLength";
|
|
388
|
+
|
|
389
|
+
declare interface ReportParamValidation {
|
|
390
|
+
ok: boolean;
|
|
391
|
+
/** 保留历史取数契约的字符串形式;未知参数保留,不能代替接口权限白名单。 */
|
|
392
|
+
values: Record<string, string>;
|
|
393
|
+
/** JSON Schema 对应的规范值:number 参数转换为有限数字。 */
|
|
394
|
+
typedValues: Record<string, string | number>;
|
|
395
|
+
issues: ReportParamIssue[];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** 查询是唯一基础能力;权限、HTTP、数据库和事务都留在宿主适配器内。 */
|
|
399
|
+
declare interface ReportProvider {
|
|
400
|
+
query(context: ReportLoadContext): ReportQueryResult | Promise<ReportQueryResult>;
|
|
401
|
+
save?(input: ReportSaveInput): ReportSaveResult | Promise<ReportSaveResult>;
|
|
402
|
+
export?(input: ReportProviderExportInput): ReportProviderExportResult | Promise<ReportProviderExportResult>;
|
|
403
|
+
templates?: ReportTemplateProvider;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
declare interface ReportProviderExportInput extends ReportLoadContext {
|
|
407
|
+
format: "pdf" | "xlsx";
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
declare interface ReportProviderExportResult {
|
|
411
|
+
bytes: Uint8Array;
|
|
412
|
+
contentType: string;
|
|
413
|
+
fileName?: string;
|
|
414
|
+
diagnostics?: ReportDiagnostic[];
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
declare interface ReportQueryResult {
|
|
418
|
+
datasets: DatasetRows;
|
|
419
|
+
revision?: string;
|
|
420
|
+
sourceToken?: string;
|
|
421
|
+
diagnostics?: ReportDiagnostic[];
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
declare type ReportRegistry = Record<string, ReportDefinition>;
|
|
425
|
+
|
|
426
|
+
export declare interface ReportRuntime {
|
|
427
|
+
describe(reportIds?: string[]): ReportDescription[];
|
|
428
|
+
validate(input: Omit<ReportRuntimeInput, "signal">): ReportParamValidation;
|
|
429
|
+
prepare(input: ReportRuntimeInput): Promise<PreparedReport>;
|
|
430
|
+
export(input: ReportRuntimeExportInput): Promise<ReportRuntimeExportResult>;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
export declare interface ReportRuntimeBudget {
|
|
434
|
+
maxRows?: number;
|
|
435
|
+
maxPages?: number;
|
|
436
|
+
maxCells?: number;
|
|
437
|
+
maxOutputBytes?: number;
|
|
438
|
+
maxDurationMs?: number;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
export declare class ReportRuntimeError extends Error {
|
|
442
|
+
readonly code: "budget" | "timeout" | "queue-full" | "closed";
|
|
443
|
+
readonly path?: string | undefined;
|
|
444
|
+
constructor(code: "budget" | "timeout" | "queue-full" | "closed", message: string, path?: string | undefined);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/** 可用 worker_threads/进程/RPC 实现;接收可序列化请求,signal 由桥接层映射为取消消息。 */
|
|
448
|
+
export declare interface ReportRuntimeExecutor {
|
|
449
|
+
prepare(input: Omit<ReportRuntimeInput, "signal">, signal?: AbortSignal): Promise<PreparedReport>;
|
|
450
|
+
export(input: Omit<ReportRuntimeExportInput, "signal">, signal?: AbortSignal): Promise<ReportRuntimeExportResult>;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
export declare interface ReportRuntimeExportInput extends ReportRuntimeInput {
|
|
454
|
+
format: "pdf" | "xlsx";
|
|
455
|
+
/** PDF 中文需宿主显式提供有授权的字体;不隐式下载字体或资源。 */
|
|
456
|
+
pdf?: {
|
|
457
|
+
customFontBytes?: Uint8Array | ArrayBuffer;
|
|
458
|
+
customFontName?: string;
|
|
459
|
+
customFontFaces?: {
|
|
460
|
+
regular: Uint8Array | ArrayBuffer;
|
|
461
|
+
bold?: Uint8Array | ArrayBuffer;
|
|
462
|
+
italic?: Uint8Array | ArrayBuffer;
|
|
463
|
+
boldItalic?: Uint8Array | ArrayBuffer;
|
|
464
|
+
};
|
|
465
|
+
};
|
|
466
|
+
xlsx?: {
|
|
467
|
+
sheetMode?: "auto" | "pages" | "continuous";
|
|
468
|
+
valueMode?: "text" | "raw";
|
|
469
|
+
paperSize?: "auto" | "a3" | "a4" | "a5";
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
export declare interface ReportRuntimeExportResult extends Omit<PreparedReport, "plan"> {
|
|
474
|
+
bytes: Uint8Array;
|
|
475
|
+
format: "pdf" | "xlsx";
|
|
476
|
+
contentType: string;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export declare interface ReportRuntimeInput {
|
|
480
|
+
reportIds: string[];
|
|
481
|
+
params?: Record<string, string>;
|
|
482
|
+
signal?: AbortSignal;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export declare interface ReportRuntimeOptions {
|
|
486
|
+
reports: ReportRegistry;
|
|
487
|
+
budget?: ReportRuntimeBudget;
|
|
488
|
+
/** 各定义可覆盖默认分页配置;PDF自带字体时,自动使用字体字节度量以保持排版与输出一致。 */
|
|
489
|
+
pagination?: PaginateOptions;
|
|
490
|
+
executor?: ReportRuntimeExecutor;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export declare interface ReportRuntimeStats {
|
|
494
|
+
rows: number;
|
|
495
|
+
pages: number;
|
|
496
|
+
cells: number;
|
|
497
|
+
durationMs: number;
|
|
498
|
+
outputBytes?: number;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
declare interface ReportSaveInput extends ReportLoadContext {
|
|
502
|
+
requestId: string;
|
|
503
|
+
expectedRevision?: string;
|
|
504
|
+
sourceToken?: string;
|
|
505
|
+
edits: readonly ReportCellEdit[];
|
|
506
|
+
action?: "edit" | "undo" | "redo" | "restore";
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
declare interface ReportSaveResult {
|
|
510
|
+
revision: string;
|
|
511
|
+
sourceToken?: string;
|
|
512
|
+
conflicts?: Array<{
|
|
513
|
+
editIndex: number;
|
|
514
|
+
code: string;
|
|
515
|
+
message: string;
|
|
516
|
+
}>;
|
|
517
|
+
diagnostics?: ReportDiagnostic[];
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export declare interface ReportTask<T> {
|
|
521
|
+
readonly id: string;
|
|
522
|
+
readonly status: ReportTaskStatus;
|
|
523
|
+
readonly progress: {
|
|
524
|
+
completed: number;
|
|
525
|
+
total?: number;
|
|
526
|
+
} | undefined;
|
|
527
|
+
result: Promise<T>;
|
|
528
|
+
cancel(reason?: unknown): void;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
export declare interface ReportTaskContext {
|
|
532
|
+
signal: AbortSignal;
|
|
533
|
+
reportProgress(completed: number, total?: number): void;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export declare interface ReportTaskQueue {
|
|
537
|
+
readonly active: number;
|
|
538
|
+
readonly pending: number;
|
|
539
|
+
enqueue<T>(run: (context: ReportTaskContext) => T | Promise<T>, options?: {
|
|
540
|
+
id?: string;
|
|
541
|
+
signal?: AbortSignal;
|
|
542
|
+
}): ReportTask<T>;
|
|
543
|
+
/** 关闭后拒绝新任务并取消排队任务;运行任务按参数发送取消信号。 */
|
|
544
|
+
close(options?: {
|
|
545
|
+
cancelRunning?: boolean;
|
|
546
|
+
}): void;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
export declare type ReportTaskStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
|
|
550
|
+
|
|
551
|
+
declare interface ReportTemplate {
|
|
552
|
+
schemaVersion?: string;
|
|
553
|
+
/** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
|
|
554
|
+
params?: ReportParamDef[];
|
|
555
|
+
pages: TemplatePage[];
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/** 可存入数据库/文件的纯 JSON 模板;数据、接口与鉴权仍由宿主提供。 */
|
|
559
|
+
declare interface ReportTemplateDocument {
|
|
560
|
+
schemaVersion: "1.0";
|
|
561
|
+
id: string;
|
|
562
|
+
name: string;
|
|
563
|
+
/** 宿主的发布版本/乐观锁标识,不由引擎自动递增。 */
|
|
564
|
+
revision?: string;
|
|
565
|
+
description?: string;
|
|
566
|
+
template: ReportTemplate;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
declare type ReportTemplateLoader = (context: ReportLoadContext) => ReportTemplate | Promise<ReportTemplate>;
|
|
570
|
+
|
|
571
|
+
declare interface ReportTemplateProvider {
|
|
572
|
+
list(context: {
|
|
573
|
+
signal?: AbortSignal;
|
|
574
|
+
}): Promise<ReportTemplateSummary[]>;
|
|
575
|
+
get(id: string, context: {
|
|
576
|
+
signal?: AbortSignal;
|
|
577
|
+
}): Promise<ReportTemplateDocument | undefined>;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
declare type ReportTemplateSummary = Omit<ReportTemplateDocument, "template">;
|
|
581
|
+
|
|
582
|
+
declare interface RichParagraph {
|
|
583
|
+
segments: RichSegment[];
|
|
584
|
+
align?: ComponentStyle["align"];
|
|
585
|
+
lineHeight?: number;
|
|
586
|
+
spaceBeforeMm?: number;
|
|
587
|
+
spaceAfterMm?: number;
|
|
588
|
+
indentMm?: number;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
declare interface RichSegment {
|
|
592
|
+
kind?: "text" | "field";
|
|
593
|
+
text?: string;
|
|
594
|
+
field?: string;
|
|
595
|
+
style?: ComponentStyle;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/** 条件格式规则求值(声明式,见 ListColumn.rules) */
|
|
599
|
+
declare interface StyleRule {
|
|
600
|
+
when: {
|
|
601
|
+
field: string;
|
|
602
|
+
op: ">" | ">=" | "<" | "<=" | "==" | "!=";
|
|
603
|
+
value: number | string;
|
|
604
|
+
};
|
|
605
|
+
/** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
|
|
606
|
+
style: Record<string, unknown>;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
declare type TemplateComponent = PlanComponent | ListComponent;
|
|
610
|
+
|
|
611
|
+
declare interface TemplatePage {
|
|
612
|
+
widthMm: number;
|
|
613
|
+
heightMm: number;
|
|
614
|
+
/** 宽表保持全列自然宽度,页高只控制内部纵向分段。 */
|
|
615
|
+
layout?: "page" | "wide";
|
|
616
|
+
marginTopMm?: number;
|
|
617
|
+
marginBottomMm?: number;
|
|
618
|
+
marginLeftMm?: number;
|
|
619
|
+
marginRightMm?: number;
|
|
620
|
+
components: TemplateComponent[];
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
|
|
625
|
+
*
|
|
626
|
+
* 测量模型可注入(TextMeasurer):
|
|
627
|
+
* - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
|
|
628
|
+
* - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
|
|
629
|
+
*/
|
|
630
|
+
declare interface TextMeasureOptions {
|
|
631
|
+
fontSizePt: number;
|
|
632
|
+
fontFamily?: string;
|
|
633
|
+
bold?: boolean;
|
|
634
|
+
italic?: boolean;
|
|
635
|
+
letterSpacingPt?: number;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
|
|
639
|
+
declare interface TextMeasurer {
|
|
640
|
+
measureMm(text: string, options: TextMeasureOptions): number;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
export { }
|