@agile-team/mach-report 0.4.0

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.
Files changed (85) hide show
  1. package/dist/builder/template-builder.d.ts +53 -0
  2. package/dist/builder/template-builder.js +153 -0
  3. package/dist/builder/template-builder.js.map +1 -0
  4. package/dist/compat/jh4j-template.d.ts +12 -0
  5. package/dist/compat/jh4j-template.js +196 -0
  6. package/dist/compat/jh4j-template.js.map +1 -0
  7. package/dist/defaults.d.ts +27 -0
  8. package/dist/defaults.js +28 -0
  9. package/dist/defaults.js.map +1 -0
  10. package/dist/index.d.ts +13 -0
  11. package/dist/index.js +14 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/layout/paginate.d.ts +51 -0
  14. package/dist/layout/paginate.js +197 -0
  15. package/dist/layout/paginate.js.map +1 -0
  16. package/dist/layout/textwrap.d.ts +36 -0
  17. package/dist/layout/textwrap.js +173 -0
  18. package/dist/layout/textwrap.js.map +1 -0
  19. package/dist/manager/api.d.ts +45 -0
  20. package/dist/manager/api.js +101 -0
  21. package/dist/manager/api.js.map +1 -0
  22. package/dist/manager/index.d.ts +2 -0
  23. package/dist/manager/index.js +3 -0
  24. package/dist/manager/index.js.map +1 -0
  25. package/dist/manager/types.d.ts +50 -0
  26. package/dist/manager/types.js +8 -0
  27. package/dist/manager/types.js.map +1 -0
  28. package/dist/manager.d.ts +5 -0
  29. package/dist/manager.js +6 -0
  30. package/dist/manager.js.map +1 -0
  31. package/dist/pdf/font-loader.d.ts +5 -0
  32. package/dist/pdf/font-loader.js +84 -0
  33. package/dist/pdf/font-loader.js.map +1 -0
  34. package/dist/pdf/index.d.ts +2 -0
  35. package/dist/pdf/index.js +3 -0
  36. package/dist/pdf/index.js.map +1 -0
  37. package/dist/pdf/render-pdf.d.ts +19 -0
  38. package/dist/pdf/render-pdf.js +284 -0
  39. package/dist/pdf/render-pdf.js.map +1 -0
  40. package/dist/pdf.d.ts +6 -0
  41. package/dist/pdf.js +7 -0
  42. package/dist/pdf.js.map +1 -0
  43. package/dist/render/canvas.d.ts +61 -0
  44. package/dist/render/canvas.js +402 -0
  45. package/dist/render/canvas.js.map +1 -0
  46. package/dist/render/dom.d.ts +10 -0
  47. package/dist/render/dom.js +311 -0
  48. package/dist/render/dom.js.map +1 -0
  49. package/dist/render/grid-geometry.d.ts +41 -0
  50. package/dist/render/grid-geometry.js +131 -0
  51. package/dist/render/grid-geometry.js.map +1 -0
  52. package/dist/render/style.d.ts +40 -0
  53. package/dist/render/style.js +39 -0
  54. package/dist/render/style.js.map +1 -0
  55. package/dist/render/window.d.ts +23 -0
  56. package/dist/render/window.js +58 -0
  57. package/dist/render/window.js.map +1 -0
  58. package/dist/schema/render-plan.d.ts +96 -0
  59. package/dist/schema/render-plan.js +25 -0
  60. package/dist/schema/render-plan.js.map +1 -0
  61. package/dist/schema/validate.d.ts +15 -0
  62. package/dist/schema/validate.js +129 -0
  63. package/dist/schema/validate.js.map +1 -0
  64. package/dist/sql/ast-check.d.ts +14 -0
  65. package/dist/sql/ast-check.js +44 -0
  66. package/dist/sql/ast-check.js.map +1 -0
  67. package/dist/sql/compile.d.ts +31 -0
  68. package/dist/sql/compile.js +145 -0
  69. package/dist/sql/compile.js.map +1 -0
  70. package/dist/sql/expr.d.ts +21 -0
  71. package/dist/sql/expr.js +123 -0
  72. package/dist/sql/expr.js.map +1 -0
  73. package/dist/sql/index.d.ts +4 -0
  74. package/dist/sql/index.js +5 -0
  75. package/dist/sql/index.js.map +1 -0
  76. package/dist/sql/tokenizer.d.ts +25 -0
  77. package/dist/sql/tokenizer.js +124 -0
  78. package/dist/sql/tokenizer.js.map +1 -0
  79. package/dist/sql.d.ts +5 -0
  80. package/dist/sql.js +6 -0
  81. package/dist/sql.js.map +1 -0
  82. package/dist/units.d.ts +11 -0
  83. package/dist/units.js +26 -0
  84. package/dist/units.js.map +1 -0
  85. package/package.json +42 -0
@@ -0,0 +1,197 @@
1
+ import { RENDER_PLAN_SCHEMA_VERSION } from "../schema/render-plan";
2
+ import { DEFAULT_FONT_PT, LINE_HEIGHT } from "../defaults";
3
+ import { heuristicMeasurer, measureTextMm, wrapText } from "./textwrap";
4
+ function makeWorkingPage(page) {
5
+ return {
6
+ widthMm: page.widthMm,
7
+ heightMm: page.heightMm,
8
+ marginTopMm: page.marginTopMm ?? 0,
9
+ marginBottomMm: page.marginBottomMm ?? 0,
10
+ marginLeftMm: page.marginLeftMm ?? 0,
11
+ marginRightMm: page.marginRightMm ?? 0,
12
+ components: []
13
+ };
14
+ }
15
+ function toContentBottom(page, wp) {
16
+ return wp.heightMm - (page.marginBottomMm ?? wp.marginBottomMm);
17
+ }
18
+ function estRowHeightMm(list, lines) {
19
+ const fontSizePt = list.fontSizePt ?? DEFAULT_FONT_PT;
20
+ const lineMm = (fontSizePt * LINE_HEIGHT * 25.4) / 72;
21
+ const padding = (list.paddingMm ?? 1) * 2;
22
+ return Math.max(list.rowHeightMm ?? 0, lines * lineMm + padding);
23
+ }
24
+ function cellText(value) {
25
+ if (value == null)
26
+ return "";
27
+ if (typeof value === "string")
28
+ return value;
29
+ if (typeof value === "number")
30
+ return String(value);
31
+ if (typeof value === "boolean")
32
+ return value ? "是" : "否";
33
+ if (value instanceof Date)
34
+ return value.toISOString().slice(0, 10);
35
+ try {
36
+ return JSON.stringify(value);
37
+ }
38
+ catch {
39
+ return String(value);
40
+ }
41
+ }
42
+ function interList(list, measurer) {
43
+ const fontSizePt = list.fontSizePt ?? DEFAULT_FONT_PT;
44
+ const paddingMm = list.paddingMm ?? 1;
45
+ // 每列单元格样式只构造一次:{ align, verticalAlign, ...col.style }
46
+ const cellStyles = list.columns.map((col) => col.style
47
+ ? { align: "left", verticalAlign: "middle", ...col.style }
48
+ : { align: "left", verticalAlign: "middle" });
49
+ // 表头单元格样式(含底色/加粗),同样驻留
50
+ const headerCellStyles = list.columns.map((col) => ({
51
+ bold: list.headerBold ?? true,
52
+ align: "center",
53
+ verticalAlign: "middle",
54
+ backgroundColor: list.headerBackgroundColor,
55
+ ...(col.style || {})
56
+ }));
57
+ const headerTexts = list.columns.map((col) => col.header);
58
+ const headerLines = headerTexts.map((text, i) => wrapText(text, list.columns[i].widthMm - paddingMm * 2, { fontSizePt, bold: list.headerBold ?? true }, measurer));
59
+ const maxLines = Math.max(...headerLines.map((l) => l.length), 1);
60
+ const headerHeight = estRowHeightMm(list, maxLines);
61
+ const headerCells = headerTexts.map((text, i) => ({
62
+ text,
63
+ style: headerCellStyles[i]
64
+ }));
65
+ // border:false → 四边全关(下游 resolveBoxBorders 据此不画内外线)
66
+ const borderStyle = list.border === false
67
+ ? { borderTop: false, borderRight: false, borderBottom: false, borderLeft: false }
68
+ : { borderBottom: true, borderLeft: true, borderRight: true, borderTop: true };
69
+ return {
70
+ fontSizePt,
71
+ paddingMm,
72
+ cellStyles,
73
+ borderStyle,
74
+ headerHeightMm: headerHeight,
75
+ headerGrid: { cells: [headerCells], rowHeightsMm: [headerHeight] },
76
+ columns: list.columns
77
+ };
78
+ }
79
+ /** 单行 → 网格(复用驻留样式,无逐格对象分配) */
80
+ function buildRowGridFast(inter, row, measurer) {
81
+ const columns = inter.columns;
82
+ const texts = new Array(columns.length);
83
+ let maxLines = 1;
84
+ for (let i = 0; i < columns.length; i++) {
85
+ texts[i] = cellText(row[columns[i].field]);
86
+ }
87
+ // 折行只需算一次行数(宽度/字号同列恒定)
88
+ const lines = new Array(columns.length);
89
+ for (let i = 0; i < columns.length; i++) {
90
+ const wrapped = wrapText(texts[i], columns[i].widthMm - inter.paddingMm * 2, { fontSizePt: inter.fontSizePt }, measurer);
91
+ lines[i] = wrapped;
92
+ if (wrapped.length > maxLines)
93
+ maxLines = wrapped.length;
94
+ }
95
+ const lineMm = (inter.fontSizePt * LINE_HEIGHT * 25.4) / 72;
96
+ const height = Math.max(inter.rowHeightFloorMm, maxLines * lineMm + inter.paddingMm * 2);
97
+ const cells = new Array(columns.length);
98
+ for (let i = 0; i < columns.length; i++) {
99
+ cells[i] = { text: texts[i], style: inter.cellStyles[i] };
100
+ }
101
+ return { grid: { cells: [cells], rowHeightsMm: [height] }, heightMm: height };
102
+ }
103
+ export function paginateTemplate(template, datasets, optionsOrMmPerRow = {}) {
104
+ // 兼容旧签名 paginateTemplate(tpl, data, mmPerRow: number)
105
+ const options = typeof optionsOrMmPerRow === "number" ? { mmPerRow: optionsOrMmPerRow } : optionsOrMmPerRow;
106
+ const mmPerRow = options.mmPerRow ?? 0;
107
+ const measurer = options.measurer ?? heuristicMeasurer;
108
+ const warnings = [];
109
+ const pages = [];
110
+ let seq = 0;
111
+ const nextId = (prefix) => `${prefix}_${(++seq).toString(36)}`;
112
+ for (const tplPage of template.pages) {
113
+ const current = makeWorkingPage(tplPage);
114
+ const contentBottom = () => toContentBottom(tplPage, current);
115
+ const contentTop = current.marginTopMm;
116
+ const pushCurrent = () => {
117
+ pages.push({
118
+ pageWidthMm: current.widthMm,
119
+ pageHeightMm: current.heightMm,
120
+ marginTopMm: current.marginTopMm,
121
+ marginBottomMm: current.marginBottomMm,
122
+ marginLeftMm: current.marginLeftMm,
123
+ marginRightMm: current.marginRightMm,
124
+ components: current.components
125
+ });
126
+ };
127
+ for (const comp of tplPage.components) {
128
+ if (comp.kind !== "list") {
129
+ current.components.push(comp);
130
+ continue;
131
+ }
132
+ const list = comp;
133
+ const rows = datasets[list.dataset];
134
+ if (!Array.isArray(rows)) {
135
+ warnings.push(`数据集 ${list.dataset} 未提供数据,列表 ${list.id ?? ""} 输出为空`);
136
+ }
137
+ const dataRows = Array.isArray(rows) ? rows : [];
138
+ const columnsWidth = list.columns.reduce((s, c) => s + c.widthMm, 0);
139
+ const scale = columnsWidth > list.widthMm ? list.widthMm / columnsWidth : 1;
140
+ const scaledList = scale === 1 ? list : { ...list, columns: list.columns.map((c) => ({ ...c, widthMm: c.widthMm * scale })) };
141
+ const inter = {
142
+ ...interList(scaledList, measurer),
143
+ rowHeightFloorMm: scaledList.rowHeightMm ?? 0
144
+ };
145
+ const headerComp = {
146
+ kind: "rect",
147
+ leftMm: list.leftMm,
148
+ topMm: 0,
149
+ widthMm: list.widthMm,
150
+ heightMm: inter.headerHeightMm,
151
+ grid: inter.headerGrid,
152
+ nid: nextId("listh"),
153
+ style: inter.borderStyle
154
+ };
155
+ let y = list.topMm;
156
+ const placeHeader = (target, topMm) => {
157
+ target.components.push({ ...headerComp, topMm });
158
+ };
159
+ placeHeader(current, y);
160
+ y += inter.headerHeightMm + mmPerRow;
161
+ for (let i = 0; i < dataRows.length; i++) {
162
+ const rowGrid = buildRowGridFast(inter, dataRows[i], measurer);
163
+ if (y + rowGrid.heightMm > contentBottom()) {
164
+ pushCurrent();
165
+ const next = makeWorkingPage(tplPage);
166
+ current.components = next.components;
167
+ current.heightMm = next.heightMm;
168
+ if (scaledList.headerEveryPage !== false) {
169
+ placeHeader(current, list.topMm);
170
+ y = list.topMm + inter.headerHeightMm;
171
+ }
172
+ else {
173
+ y = contentTop;
174
+ }
175
+ }
176
+ current.components.push({
177
+ kind: "rect",
178
+ leftMm: list.leftMm,
179
+ topMm: y,
180
+ widthMm: list.widthMm,
181
+ heightMm: rowGrid.heightMm,
182
+ grid: rowGrid.grid,
183
+ nid: nextId("listr"),
184
+ style: inter.borderStyle
185
+ });
186
+ y += rowGrid.heightMm;
187
+ }
188
+ }
189
+ pushCurrent();
190
+ }
191
+ return {
192
+ plan: { schemaVersion: RENDER_PLAN_SCHEMA_VERSION, pages },
193
+ warnings
194
+ };
195
+ }
196
+ export { measureTextMm, wrapText };
197
+ //# sourceMappingURL=paginate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.js","sourceRoot":"","sources":["../../src/layout/paginate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
3
+ *
4
+ * 测量模型可注入(TextMeasurer):
5
+ * - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
6
+ * - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
7
+ */
8
+ export interface TextMeasureOptions {
9
+ fontSizePt: number;
10
+ bold?: boolean;
11
+ letterSpacingPt?: number;
12
+ }
13
+ /** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
14
+ export interface TextMeasurer {
15
+ measureMm(text: string, options: TextMeasureOptions): number;
16
+ }
17
+ export declare function charWidthEm(ch: string): number;
18
+ /** 启发式测量器:宽度模型与 jh4j 近似口径一致(默认实现) */
19
+ export declare const heuristicMeasurer: TextMeasurer;
20
+ /** 兼容旧 API:默认启发式测量 */
21
+ export declare function createHeuristicMeasurer(): TextMeasurer;
22
+ export declare function measureTextMm(text: string, options: TextMeasureOptions): number;
23
+ /**
24
+ * 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
25
+ * 无 2D 环境时自动回退启发式(Node/SSR 安全)。
26
+ */
27
+ export declare function createCanvasMeasurer(getCtx2d: () => CanvasRenderingContext2D | null): TextMeasurer;
28
+ /**
29
+ * 文本折行:
30
+ * - CJK 字符任意位置可断(与既有行为一致)
31
+ * - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
32
+ * 单词本身超宽时按字符硬拆(兜底,不无限溢出)
33
+ * - 换行符强制断行;行首不保留折行产生的空格
34
+ * - 可注入 TextMeasurer(默认启发式)
35
+ */
36
+ export declare function wrapText(text: string, maxWidthMm: number, options: TextMeasureOptions, measurer?: TextMeasurer): string[];
@@ -0,0 +1,173 @@
1
+ /**
2
+ * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
3
+ *
4
+ * 测量模型可注入(TextMeasurer):
5
+ * - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
6
+ * - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
7
+ */
8
+ const CJK_RE = /[\u3000-\u9fff\uff00-\uffef]/;
9
+ /** Latin 快速分类:0=默认 0.54em,1=窄字符 0.26,2=宽字符 0.95,3=数字 0.59,4=大写 0.67,5=空格 0.3 */
10
+ const LATIN_CLASS = new Uint8Array(128);
11
+ {
12
+ // 窄字符(i l j t f . , : ; ' ` | ! ( ) [ ])
13
+ for (const ch of "iljtf.,:;'`|!()[]")
14
+ LATIN_CLASS[ch.charCodeAt(0)] = 1;
15
+ // 宽字符(m w M W @)
16
+ for (const ch of "mwMW@")
17
+ LATIN_CLASS[ch.charCodeAt(0)] = 2;
18
+ // 数字 0.59
19
+ for (let c = 48; c <= 57; c++)
20
+ LATIN_CLASS[c] = 3;
21
+ // 大写 0.67
22
+ for (let c = 65; c <= 90; c++)
23
+ LATIN_CLASS[c] = 4;
24
+ LATIN_CLASS[32] = 5; // 空格
25
+ }
26
+ const LATIN_WIDTH = [0.54, 0.26, 0.95, 0.59, 0.67, 0.3];
27
+ export function charWidthEm(ch) {
28
+ const code = ch.charCodeAt(0);
29
+ // 快路径:ASCII 查表(O(1),无正则、无分配)
30
+ if (code < 128)
31
+ return LATIN_WIDTH[LATIN_CLASS[code]];
32
+ if (CJK_RE.test(ch))
33
+ return 1;
34
+ // 其余(带音符拉丁/西里尔等)走原启发式
35
+ if (/[A-Z]/.test(ch))
36
+ return 0.67;
37
+ return 0.54;
38
+ }
39
+ /** 启发式测量器:宽度模型与 jh4j 近似口径一致(默认实现) */
40
+ export const heuristicMeasurer = {
41
+ measureMm(text, options) {
42
+ const { fontSizePt, bold = false, letterSpacingPt = 0 } = options;
43
+ const ptToMm = 25.4 / 72;
44
+ let units = 0;
45
+ for (const ch of text) {
46
+ units += charWidthEm(ch);
47
+ }
48
+ if (bold)
49
+ units *= 1.04;
50
+ return (units * fontSizePt + letterSpacingPt * text.length) * ptToMm;
51
+ }
52
+ };
53
+ /** 兼容旧 API:默认启发式测量 */
54
+ export function createHeuristicMeasurer() {
55
+ return heuristicMeasurer;
56
+ }
57
+ export function measureTextMm(text, options) {
58
+ return heuristicMeasurer.measureMm(text, options);
59
+ }
60
+ /**
61
+ * 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
62
+ * 无 2D 环境时自动回退启发式(Node/SSR 安全)。
63
+ */
64
+ export function createCanvasMeasurer(getCtx2d) {
65
+ let ctx;
66
+ return {
67
+ measureMm(text, options) {
68
+ if (ctx === undefined)
69
+ ctx = getCtx2d();
70
+ if (!ctx)
71
+ return heuristicMeasurer.measureMm(text, options);
72
+ const px = (options.fontSizePt * 96) / 72;
73
+ ctx.font = `${options.bold ? "bold " : ""}${px}px sans-serif`;
74
+ // px → mm(96dpi 基准)
75
+ return (ctx.measureText(text).width * 25.4) / 96;
76
+ }
77
+ };
78
+ }
79
+ function tokenize(text, options, measurer) {
80
+ const atoms = [];
81
+ let word = "";
82
+ let wordWidth = 0;
83
+ const flush = () => {
84
+ if (word) {
85
+ atoms.push({ text: word, widthMm: wordWidth, cjk: false });
86
+ word = "";
87
+ wordWidth = 0;
88
+ }
89
+ };
90
+ for (const ch of text) {
91
+ if (ch === "\n") {
92
+ flush();
93
+ atoms.push({ text: "\n", widthMm: 0, cjk: false, br: true });
94
+ continue;
95
+ }
96
+ if (ch === " ") {
97
+ flush();
98
+ atoms.push({ text: ch, widthMm: measurer.measureMm(ch, options), cjk: false, space: true });
99
+ continue;
100
+ }
101
+ if (CJK_RE.test(ch)) {
102
+ flush();
103
+ atoms.push({ text: ch, widthMm: measurer.measureMm(ch, options), cjk: true });
104
+ continue;
105
+ }
106
+ word += ch;
107
+ wordWidth += measurer.measureMm(ch, options);
108
+ }
109
+ flush();
110
+ return atoms;
111
+ }
112
+ /**
113
+ * 文本折行:
114
+ * - CJK 字符任意位置可断(与既有行为一致)
115
+ * - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
116
+ * 单词本身超宽时按字符硬拆(兜底,不无限溢出)
117
+ * - 换行符强制断行;行首不保留折行产生的空格
118
+ * - 可注入 TextMeasurer(默认启发式)
119
+ */
120
+ export function wrapText(text, maxWidthMm, options, measurer = heuristicMeasurer) {
121
+ if (!text)
122
+ return [""];
123
+ const lines = [];
124
+ let current = "";
125
+ let currentWidth = 0;
126
+ const pushLine = () => {
127
+ lines.push(current);
128
+ current = "";
129
+ currentWidth = 0;
130
+ };
131
+ for (const atom of tokenize(text, options, measurer)) {
132
+ if (atom.br) {
133
+ pushLine();
134
+ continue;
135
+ }
136
+ if (currentWidth + atom.widthMm <= maxWidthMm) {
137
+ current += atom.text;
138
+ currentWidth += atom.widthMm;
139
+ continue;
140
+ }
141
+ if (atom.space) {
142
+ // 行尾放不下的空格直接丢弃断行(不保留到下一行行首)
143
+ pushLine();
144
+ continue;
145
+ }
146
+ if (atom.cjk) {
147
+ if (current.length > 0)
148
+ pushLine();
149
+ current = atom.text;
150
+ currentWidth = atom.widthMm;
151
+ continue;
152
+ }
153
+ // 拉丁词放不下:先断行,词本身超宽再按字符硬拆
154
+ if (current.length > 0)
155
+ pushLine();
156
+ if (atom.widthMm <= maxWidthMm) {
157
+ current = atom.text;
158
+ currentWidth = atom.widthMm;
159
+ continue;
160
+ }
161
+ for (const ch of atom.text) {
162
+ const chWidth = measurer.measureMm(ch, options);
163
+ if (currentWidth + chWidth > maxWidthMm && current.length > 0) {
164
+ pushLine();
165
+ }
166
+ current += ch;
167
+ currentWidth += chWidth;
168
+ }
169
+ }
170
+ pushLine();
171
+ return lines;
172
+ }
173
+ //# sourceMappingURL=textwrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textwrap.js","sourceRoot":"","sources":["../../src/layout/textwrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { DatasetRecord, ImportStrategy, PageResult, ParamRecord, ReportRecord, RequestFn } from "./types";
2
+ export declare function createReportAdminClient(options: {
3
+ request: RequestFn;
4
+ baseUrl?: string;
5
+ }): {
6
+ /** 模板列表(分页) */
7
+ listReports(query?: {
8
+ current?: number;
9
+ size?: number;
10
+ directoryId?: string;
11
+ keyword?: string;
12
+ }): Promise<PageResult<ReportRecord>>;
13
+ /** 模板详情(content 为 jh4j 私有模板 JSON 字符串,可喂给 importJh4jTemplateContent) */
14
+ getReport(id: string): Promise<ReportRecord>;
15
+ /** 保存模板(jh4j:PUT,body {id, code, name, content}) */
16
+ updateReport(input: {
17
+ id: string;
18
+ code?: string;
19
+ name?: string;
20
+ content: string;
21
+ }): Promise<unknown>;
22
+ /** 导出模板定义包(body = ID 数组,返回 ZIP blob) */
23
+ exportDefinition(ids: string[]): Promise<unknown>;
24
+ /** 导入模板定义包(multipart: file + strategy) */
25
+ importDefinition(file: File | Blob, strategy: ImportStrategy): Promise<unknown>;
26
+ /** 数据集列表 */
27
+ listDatasets(reportId: string): Promise<PageResult<DatasetRecord>>;
28
+ /** 参数列表 */
29
+ listParams(reportId: string): Promise<PageResult<ParamRecord>>;
30
+ /** 模板锁:进入设计器前获取(40s 心跳由 holdLock 驱动) */
31
+ acquireLock(reportId: string): Promise<unknown>;
32
+ lockHeartbeat(reportId: string): Promise<unknown>;
33
+ releaseLock(reportId: string): Promise<unknown>;
34
+ /**
35
+ * 持锁执行:acquire → fn(期间自动心跳)→ release(finally)。
36
+ * 返回 fn 的结果;获取锁失败时抛 ReportAdminError。
37
+ * 心跳连续失败(默认 2 次)视为锁丢失:触发 onLockLost 回调并停止心跳,
38
+ * fn 继续执行(避免中途丢弃用户编辑),由调用方决定是否提示/中止。
39
+ */
40
+ holdLock<T>(reportId: string, fn: () => Promise<T>, options?: {
41
+ onLockLost?: (reason: string) => void;
42
+ heartbeatFailLimit?: number;
43
+ }): Promise<T>;
44
+ };
45
+ export type ReportAdminClient = ReturnType<typeof createReportAdminClient>;
@@ -0,0 +1,101 @@
1
+ import { ReportAdminError } from "./types";
2
+ const BASE = "/report/codePrintReport";
3
+ const LOCK_BASE = "/report/codePrintReportLock";
4
+ function unwrap(response, url) {
5
+ const body = response;
6
+ if (body && body.code != null && body.code !== 200) {
7
+ throw new ReportAdminError(String(body.message || "请求失败"), url);
8
+ }
9
+ return (body?.data ?? body);
10
+ }
11
+ export function createReportAdminClient(options) {
12
+ const { request } = options;
13
+ const base = options.baseUrl ?? "";
14
+ return {
15
+ /** 模板列表(分页) */
16
+ async listReports(query = {}) {
17
+ const url = `${base}${BASE}/list`;
18
+ return unwrap(await request({ url, method: "get", params: { current: 1, size: 20, ...query } }), url);
19
+ },
20
+ /** 模板详情(content 为 jh4j 私有模板 JSON 字符串,可喂给 importJh4jTemplateContent) */
21
+ async getReport(id) {
22
+ const url = `${base}${BASE}/getById`;
23
+ return unwrap(await request({ url, method: "get", params: { id } }), url);
24
+ },
25
+ /** 保存模板(jh4j:PUT,body {id, code, name, content}) */
26
+ async updateReport(input) {
27
+ const url = `${base}${BASE}/update`;
28
+ return unwrap(await request({ url, method: "put", data: input }), url);
29
+ },
30
+ /** 导出模板定义包(body = ID 数组,返回 ZIP blob) */
31
+ async exportDefinition(ids) {
32
+ const url = `${base}${BASE}/exportDefinition`;
33
+ return request({ url, method: "post", data: ids });
34
+ },
35
+ /** 导入模板定义包(multipart: file + strategy) */
36
+ async importDefinition(file, strategy) {
37
+ const url = `${base}${BASE}/importDefinition`;
38
+ const form = new FormData();
39
+ form.append("file", file);
40
+ form.append("strategy", strategy);
41
+ return request({ url, method: "post", data: form });
42
+ },
43
+ /** 数据集列表 */
44
+ async listDatasets(reportId) {
45
+ const url = `${base}${BASE}Ds/list`;
46
+ return unwrap(await request({ url, method: "get", params: { reportId, current: 1, size: 999 } }), url);
47
+ },
48
+ /** 参数列表 */
49
+ async listParams(reportId) {
50
+ const url = `${base}${BASE}Param/list`;
51
+ return unwrap(await request({ url, method: "get", params: { reportId, current: 1, size: 999 } }), url);
52
+ },
53
+ /** 模板锁:进入设计器前获取(40s 心跳由 holdLock 驱动) */
54
+ async acquireLock(reportId) {
55
+ const url = `${base}${LOCK_BASE}/acquire`;
56
+ return unwrap(await request({ url, method: "post", data: { reportId } }), url);
57
+ },
58
+ async lockHeartbeat(reportId) {
59
+ const url = `${base}${LOCK_BASE}/heartbeat`;
60
+ return unwrap(await request({ url, method: "post", data: { reportId } }), url);
61
+ },
62
+ async releaseLock(reportId) {
63
+ const url = `${base}${LOCK_BASE}/release`;
64
+ return unwrap(await request({ url, method: "post", data: { reportId } }), url);
65
+ },
66
+ /**
67
+ * 持锁执行:acquire → fn(期间自动心跳)→ release(finally)。
68
+ * 返回 fn 的结果;获取锁失败时抛 ReportAdminError。
69
+ * 心跳连续失败(默认 2 次)视为锁丢失:触发 onLockLost 回调并停止心跳,
70
+ * fn 继续执行(避免中途丢弃用户编辑),由调用方决定是否提示/中止。
71
+ */
72
+ async holdLock(reportId, fn, options = {}) {
73
+ await this.acquireLock(reportId);
74
+ const failLimit = Math.max(1, options.heartbeatFailLimit ?? 2);
75
+ let consecutiveFailures = 0;
76
+ let lockLost = false;
77
+ const timer = setInterval(() => {
78
+ void this.lockHeartbeat(reportId)
79
+ .then(() => {
80
+ consecutiveFailures = 0;
81
+ })
82
+ .catch((e) => {
83
+ consecutiveFailures++;
84
+ if (!lockLost && consecutiveFailures >= failLimit) {
85
+ lockLost = true;
86
+ options.onLockLost?.(`模板锁心跳连续 ${consecutiveFailures} 次失败(${e instanceof Error ? e.message : String(e)}),锁可能已被释放`);
87
+ clearInterval(timer);
88
+ }
89
+ });
90
+ }, 40000);
91
+ try {
92
+ return await fn();
93
+ }
94
+ finally {
95
+ clearInterval(timer);
96
+ await this.releaseLock(reportId).catch(() => undefined);
97
+ }
98
+ }
99
+ };
100
+ }
101
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/manager/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ export * from "./api";
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export * from "./api";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manager/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
@@ -0,0 +1,50 @@
1
+ export interface ReportRecord {
2
+ id: string;
3
+ code?: string;
4
+ name?: string;
5
+ publishStatus?: string;
6
+ directoryId?: string;
7
+ updateTime?: string;
8
+ [key: string]: unknown;
9
+ }
10
+ export interface PageResult<T> {
11
+ records: T[];
12
+ total?: number;
13
+ current?: number;
14
+ size?: number;
15
+ }
16
+ export interface DatasetRecord {
17
+ id?: string;
18
+ reportId?: string;
19
+ code?: string;
20
+ name?: string;
21
+ type?: string;
22
+ datasourceCode?: string;
23
+ sqlText?: string;
24
+ apiUrl?: string;
25
+ fields?: unknown[];
26
+ [key: string]: unknown;
27
+ }
28
+ export interface ParamRecord {
29
+ id?: string;
30
+ reportId?: string;
31
+ name?: string;
32
+ defaultValue?: string;
33
+ [key: string]: unknown;
34
+ }
35
+ export type ImportStrategy = "overwrite" | "skip";
36
+ export type RequestFn = (config: {
37
+ url: string;
38
+ method: string;
39
+ params?: Record<string, unknown>;
40
+ data?: unknown;
41
+ }) => Promise<unknown>;
42
+ export interface ApiResponse<T = unknown> {
43
+ code?: number;
44
+ message?: string;
45
+ data?: T;
46
+ }
47
+ export declare class ReportAdminError extends Error {
48
+ readonly url: string;
49
+ constructor(message: string, url: string);
50
+ }
@@ -0,0 +1,8 @@
1
+ export class ReportAdminError extends Error {
2
+ constructor(message, url) {
3
+ super(message);
4
+ this.url = url;
5
+ this.name = "ReportAdminError";
6
+ }
7
+ }
8
+ //# sourceMappingURL=types.js.map