@agile-team/mach-report 2.0.0 → 2.2.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.
- package/LICENSE +2 -4
- package/LICENSING.md +15 -0
- package/README.md +317 -76
- package/dist/ReportPreview-BWrQCj9M.js +1643 -0
- package/dist/ReportPreview-DY0PGGqF.cjs +6 -0
- package/dist/grid-geometry-DBH9ExuY.cjs +1 -0
- package/dist/grid-geometry-DONcjshk.js +130 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +806 -13
- package/dist/index.d.ts +806 -13
- package/dist/index.js +1170 -653
- package/dist/page-window-index-CIuT4BAv.js +43 -0
- package/dist/page-window-index-DEjnM6IB.cjs +1 -0
- package/dist/pdf.cjs +48 -48
- package/dist/pdf.d.cts +159 -6
- package/dist/pdf.d.ts +159 -6
- package/dist/pdf.js +3542 -3466
- package/dist/plugin-BMoMUxrw.cjs +1 -0
- package/dist/plugin-CAcNe0FT.js +25 -0
- package/dist/report-params-B3Fia6JO.js +10 -0
- package/dist/report-params-D1gZ1DME.cjs +1 -0
- package/dist/sql.cjs +65 -64
- package/dist/sql.d.cts +109 -5
- package/dist/sql.d.ts +109 -5
- package/dist/sql.js +7947 -7922
- package/dist/style.css +1 -1
- package/dist/textwrap-DdaewxAd.js +117 -0
- package/dist/textwrap-DqiFwAV3.cjs +3 -0
- package/dist/vue/async.d.cts +820 -320
- package/dist/vue/async.d.ts +820 -320
- package/dist/vue/index.d.cts +1374 -14
- package/dist/vue/index.d.ts +1374 -14
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +11 -12
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +129 -49
- package/dist/xlsx.cjs +21 -21
- package/dist/xlsx.d.cts +2300 -5
- package/dist/xlsx.d.ts +2300 -5
- package/dist/xlsx.js +6390 -6347
- package/package.json +8 -3
- package/dist/ReportPreview-Cr0IH1Rz.cjs +0 -6
- package/dist/ReportPreview-DwknBgsJ.js +0 -1266
- package/dist/builder/template-builder.d.ts +0 -69
- package/dist/defaults.d.ts +0 -23
- package/dist/format.d.ts +0 -48
- package/dist/grid-geometry-BXpOxznT.cjs +0 -1
- package/dist/grid-geometry-Bs8QXz1X.js +0 -65
- package/dist/layout/paginate.d.ts +0 -97
- package/dist/layout/textwrap.d.ts +0 -36
- package/dist/pdf/font-loader.d.ts +0 -6
- package/dist/pdf/index.d.ts +0 -2
- package/dist/pdf/render-pdf.d.ts +0 -25
- package/dist/plugin-Cj3c2wJc.cjs +0 -1
- package/dist/plugin-DJf_6_fl.js +0 -18
- package/dist/render/canvas.d.ts +0 -76
- package/dist/render/dom.d.ts +0 -10
- package/dist/render/grid-geometry.d.ts +0 -41
- package/dist/render/style.d.ts +0 -33
- package/dist/render/window.d.ts +0 -23
- package/dist/schema/render-plan.d.ts +0 -88
- package/dist/schema/validate.d.ts +0 -15
- package/dist/sql/ast-check.d.ts +0 -14
- package/dist/sql/compile.d.ts +0 -31
- package/dist/sql/expr.d.ts +0 -21
- package/dist/sql/index.d.ts +0 -4
- package/dist/sql/tokenizer.d.ts +0 -25
- package/dist/style-CFZ-HE2s.cjs +0 -3
- package/dist/style-DnmtG7Gl.js +0 -180
- package/dist/units.d.ts +0 -11
- package/dist/vue/ReportParamPanel.d.ts +0 -19
- package/dist/vue/ReportPreview.d.ts +0 -200
- package/dist/vue/ReportToolbar.d.ts +0 -42
- package/dist/vue/adapters.d.ts +0 -34
- package/dist/vue/composables/useHighlight.d.ts +0 -8
- package/dist/vue/composables/usePageWindow.d.ts +0 -25
- package/dist/vue/composables/usePrintExport.d.ts +0 -40
- package/dist/vue/composables/useReportSearch.d.ts +0 -73
- package/dist/vue/composables/useZoom.d.ts +0 -15
- package/dist/vue/config.d.ts +0 -108
- package/dist/vue/controller.d.ts +0 -29
- package/dist/vue/errors.d.ts +0 -16
- package/dist/vue/injection-keys.d.ts +0 -14
- package/dist/vue/local-adapter.d.ts +0 -11
- package/dist/vue/pdf-exporter.d.ts +0 -13
- package/dist/vue/plugin.d.ts +0 -332
- package/dist/xlsx/render-xlsx.d.ts +0 -20
package/LICENSE
CHANGED
|
@@ -101,7 +101,5 @@ See LICENSING.md in the repository for the authorization request process. No
|
|
|
101
101
|
request, discussion, issue, payment, or contribution constitutes authorization
|
|
102
102
|
unless and until the Licensor issues explicit Written Authorization.
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
杩愯銆佹瀯寤恒€佸鍒躲€佷慨鏀广€侀泦鎴愩€侀儴缃层€佸垎鍙戙€佽浆鎺堟潈銆侀攢鍞€佸嚭绉熴€佹墭绠℃垨
|
|
107
|
-
浠ユ湇鍔″舰寮忔彁渚涙湰杞欢銆傚叕寮€浠撳簱銆佸厠闅嗕唬鐮佹垨涓嬭浇 npm 鍖呬笉浠h〃鑾峰緱鎺堟潈銆?
|
|
104
|
+
中文说明(仅为阅读便利;如有冲突,以英文条款为准):
|
|
105
|
+
本项目源码公开可查看,但不是 OSI 定义的开源软件。除查看、链接、讨论和善意提交问题外,任何个人、教育、研究、公益、政府、内部、测试、开发、生产或商业用途,均须事先取得作者明确的书面授权。未经授权,不得运行、构建、复制、修改、集成、部署、分发、转授权、销售、出租、托管或以服务形式提供本软件。公开仓库、克隆代码或下载 npm 包不代表获得授权。
|
package/LICENSING.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# MachReport 授权说明
|
|
2
|
+
|
|
3
|
+
MachReport 采用 [MachReport Source-Available License 1.0](./LICENSE)。源码公开供查看和评估,实际安装、运行、测试、修改、集成、部署、分发或商业使用须事先取得作者书面授权。具体权利与限制以 LICENSE 的英文条款及双方书面协议为准。
|
|
4
|
+
|
|
5
|
+
## 如何申请
|
|
6
|
+
|
|
7
|
+
通过[仓库维护者的 GitHub 联系方式](https://github.com/ChenyCHENYU)发起申请,并说明:
|
|
8
|
+
|
|
9
|
+
1. 申请人或组织名称及联系方式;
|
|
10
|
+
2. 使用场景、项目类型及是否商业用途;
|
|
11
|
+
3. 计划使用的版本、部署环境和用户范围;
|
|
12
|
+
4. 是否需要修改、再分发、SaaS、多租户或客户交付;
|
|
13
|
+
5. 期望授权期限和技术支持需求。
|
|
14
|
+
|
|
15
|
+
授权须由作者签发,明确被授权方、范围、用途、环境和期限,并以可长期保存的书面形式记录。咨询、提交 Issue 或 PR、付款、克隆仓库及收到代码副本本身均不构成授权。
|
package/README.md
CHANGED
|
@@ -1,135 +1,376 @@
|
|
|
1
|
-
<
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/ChenyCHENYU/MachReport/main/assets/mach-report-logo.svg" alt="MachReport Paginated Report Engine" width="920" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>面向业务单据、明细台账与打印场景的 TypeScript 报表引擎</strong><br />
|
|
7
|
+
框架无关内核 · 毫米级页面模型 · Vue 3 预览 · PDF / Excel 输出
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<img src="https://img.shields.io/badge/source-2.2.0-2563eb" alt="Source version 2.2.0" />
|
|
12
|
+
<a href="https://www.npmjs.com/package/@agile-team/mach-report"><img src="https://img.shields.io/npm/v/@agile-team/mach-report?label=npm&color=3178c6" alt="npm version" /></a>
|
|
13
|
+
<a href="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml"><img src="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
14
|
+
<a href="https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-authorization%20required-dc2626" alt="Authorization required" /></a>
|
|
15
|
+
<img src="https://img.shields.io/badge/core%20runtime%20dependencies-0-14b8a6" alt="Zero core runtime dependencies" />
|
|
16
|
+
<img src="https://img.shields.io/badge/TypeScript-first-6366f1" alt="TypeScript first" />
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="#60-秒开始"><strong>快速开始</strong></a> ·
|
|
21
|
+
<a href="#excel-报表能力与边界"><strong>Excel 能力</strong></a> ·
|
|
22
|
+
<a href="#对齐与可读性">对齐配置</a> ·
|
|
23
|
+
<a href="#模板配置与管理扩展">模板管理</a> ·
|
|
24
|
+
<a href="#接入项目数据">数据接入</a> ·
|
|
25
|
+
<a href="#按需加载与包边界">按需入口</a> ·
|
|
26
|
+
<a href="https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md">API</a> ·
|
|
27
|
+
<a href="https://github.com/ChenyCHENYU/MachReport/tree/main/examples">示例</a> ·
|
|
28
|
+
<a href="https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSING.md">授权说明</a>
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 为什么选择 MachReport
|
|
34
|
+
|
|
35
|
+
MachReport 把模板、数据和输出分开:用 TypeScript DSL 或 JSON 定义纸张与内容,由分页引擎生成统一的 `RenderPlan`,再交给预览、打印或文件导出。适合出入库单、工艺卡、订单明细和分组汇总等需要明确纸张尺寸与分页的业务场景。
|
|
36
|
+
|
|
37
|
+
| 维度 | 已具备的能力 |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| 页面模型 | 毫米单位、纸张预设与自定义尺寸、页边距、横纵向、文本与表格几何 |
|
|
40
|
+
| 明细与汇总 | 自动折行与分页、重复表头、连续分组小计、末尾总计、页码占位符 |
|
|
41
|
+
| 数据呈现 | 表头与内容独立对齐、类型自动对齐、数值 / 百分比 / 日期格式化、条件格式 |
|
|
42
|
+
| 预览交互 | 正文与缩略图双窗口渲染、缩放与适宽、可取消分片搜索、参数面板 |
|
|
43
|
+
| 模板配置 | 版本化 JSON 文档、导入导出校验、模板目录、异步加载与取消 |
|
|
44
|
+
| 输出 | 浏览器打印、HTML、PDF、真正的 `.xlsx`、逐页 PNG、Word 兼容 HTML `.doc` |
|
|
45
|
+
| 工程接入 | 局部组件、全局插件、异步入口、分层配置、结构化错误与导出告警 |
|
|
46
|
+
| 引擎复用 | 框架无关的分页与校验、DOM / Canvas 渲染;PDF / XLSX 可用于 Node.js |
|
|
2
47
|
|
|
3
|
-
|
|
48
|
+
数据接口、鉴权、查询与业务规则由宿主应用决定。模板管理提供可直接连接文件或后台接口的文档与目录 API;可视化设计器、管理页面、审批与持久化由宿主扩展。
|
|
4
49
|
|
|
5
|
-
|
|
50
|
+
## 安装:一个包,按需入口
|
|
6
51
|
|
|
7
|
-
|
|
52
|
+
```bash
|
|
53
|
+
pnpm add @agile-team/mach-report
|
|
54
|
+
```
|
|
8
55
|
|
|
9
|
-
|
|
10
|
-
[](https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml)
|
|
11
|
-
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
56
|
+
Vue 组件要求 Vue `^3.2.0`;主题样式在应用入口引入一次。只使用引擎、PDF 或 XLSX 时,Vue 是可选的,无需导入 `/vue`。发布包声明的 Node.js 要求为 `>=18.0.0`;仓库开发环境要求见[本地开发与验证](#本地开发与验证)。
|
|
12
57
|
|
|
13
|
-
|
|
58
|
+
## 60 秒开始
|
|
14
59
|
|
|
15
|
-
|
|
60
|
+
### Vue 3:本地模板与明细
|
|
16
61
|
|
|
17
|
-
|
|
62
|
+
```vue
|
|
63
|
+
<script setup lang="ts">
|
|
64
|
+
import { createTableTemplate, createLocalFetcher, ReportPreview } from "@agile-team/mach-report/vue";
|
|
65
|
+
import "@agile-team/mach-report/vue/style.css";
|
|
18
66
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
67
|
+
const template = createTableTemplate({
|
|
68
|
+
title: "产品出库单",
|
|
69
|
+
columns: [
|
|
70
|
+
{ header: "物料", field: "name", flex: 2 },
|
|
71
|
+
{ header: "数量", field: "qty" }
|
|
72
|
+
]
|
|
73
|
+
});
|
|
25
74
|
|
|
26
|
-
|
|
75
|
+
const fetcher = createLocalFetcher({
|
|
76
|
+
outbound: { template, datasets: { detail: [{ name: "物料 A", qty: 3 }] } }
|
|
77
|
+
});
|
|
78
|
+
</script>
|
|
27
79
|
|
|
28
|
-
|
|
80
|
+
<template>
|
|
81
|
+
<ReportPreview report-id="outbound" :fetcher="fetcher" height="70vh" />
|
|
82
|
+
</template>
|
|
83
|
+
```
|
|
29
84
|
|
|
30
|
-
|
|
85
|
+
标准明细只定义标题和列:默认 A4、10 mm 页边距、`detail` 数据集、表头居中,按内容类型对齐,自动分配列宽并分页。支持固定列宽、权重、横向纸张、分组与总计;复杂单据继续使用 `createTemplate()` 自由排版。
|
|
31
86
|
|
|
32
|
-
|
|
33
|
-
pnpm add @agile-team/mach-report
|
|
34
|
-
```
|
|
87
|
+
### 项目接入:注册一次,页面只传 ID 和参数
|
|
35
88
|
|
|
36
|
-
|
|
89
|
+
模板与业务取数集中注册,分页、校验、参数面板、多报表合并及请求生命周期交给包内处理。Vue 用户从同一个 `/vue` 入口获取组件和核心能力。
|
|
37
90
|
|
|
38
91
|
```ts
|
|
39
|
-
|
|
40
|
-
import { createApp } from "vue";
|
|
41
|
-
import App from "./App.vue";
|
|
42
|
-
import { createTemplate } from "@agile-team/mach-report";
|
|
43
|
-
import { createLocalFetcher, machReportPlugin } from "@agile-team/mach-report/vue";
|
|
92
|
+
import { machReportPlugin, defineReport } from "@agile-team/mach-report/vue";
|
|
44
93
|
import "@agile-team/mach-report/vue/style.css";
|
|
45
94
|
|
|
95
|
+
app.use(machReportPlugin, {
|
|
96
|
+
reports: {
|
|
97
|
+
outbound: defineReport({
|
|
98
|
+
template,
|
|
99
|
+
load: ({ params, signal }) => orderApi.report(params, { signal }),
|
|
100
|
+
mapData: (data) => ({ detail: data.items })
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```vue
|
|
107
|
+
<MachReportPreview report-id="outbound" :params="{ orderId }" height="70vh" />
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`template` 使用上例或项目自己的模板;`orderApi` 是项目现有业务请求客户端。接口已经返回数据集时,直接写 `load: ({ params, signal }) => reportApi(params, { signal })`,无需 `defineReport` 或字段映射。静态数据使用 `{ template, datasets }`。
|
|
111
|
+
|
|
112
|
+
模板的 `params` 会自动生成查询面板,显式 `paramDefs` 可覆盖。父页面用 `useMachReport()` 获得 `ref`、可等待的控制方法和只读响应式 `state`;例如 `report.state.canExport` 直接驱动外部按钮,加载、页数、导出、打印与错误无需另建状态。完整示例及接入边界见[项目接入指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/INTEGRATION.md)。旧 `fetcher` 与 `createLocalFetcher` 继续支持。
|
|
113
|
+
|
|
114
|
+
### 原生 TypeScript:生成并渲染页面
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { createTemplate, paginateTemplate, renderPlan } from "@agile-team/mach-report";
|
|
118
|
+
|
|
46
119
|
const template = createTemplate()
|
|
47
120
|
.page("a4")
|
|
48
121
|
.text("第一张报表", { leftMm: 20, topMm: 20, widthMm: 100, heightMm: 10 })
|
|
49
122
|
.build();
|
|
50
123
|
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
124
|
+
const { plan, warnings } = paginateTemplate(template, {});
|
|
125
|
+
if (warnings.length > 0) console.warn(warnings);
|
|
126
|
+
|
|
127
|
+
// 页面中提供 <div id="report"></div>。
|
|
128
|
+
document.querySelector("#report")!.replaceChildren(renderPlan(plan, document));
|
|
55
129
|
```
|
|
56
130
|
|
|
57
|
-
|
|
131
|
+
`paginateTemplate` 可在客户端或服务端运行。`renderPlan` 需要 DOM;Canvas、图片与浏览器打印同样需要浏览器环境。大量页面使用页窗口或 Vue 预览组件,避免一次创建全部页面节点。
|
|
58
132
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
133
|
+
## Excel 报表能力与边界
|
|
134
|
+
|
|
135
|
+
**支持生成真正的 Excel `.xlsx` 工作簿。** Vue 工具栏提供「导出 Excel」,组件控制器支持 `exportAs("xlsx")` / `exportAs("excel")`;原生与 Node.js 可从 `/xlsx` 使用 `renderPlanToXlsx`。
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
import { writeFile } from "node:fs/promises";
|
|
139
|
+
import { renderPlanToXlsx } from "@agile-team/mach-report/xlsx";
|
|
140
|
+
|
|
141
|
+
// plan 是 paginateTemplate 或业务接口生成的 RenderPlan。
|
|
142
|
+
const { buffer, warnings } = await renderPlanToXlsx(plan, {
|
|
143
|
+
valueMode: "raw",
|
|
144
|
+
sheetName: (pageIndex) => `报表${pageIndex + 1}`
|
|
145
|
+
});
|
|
146
|
+
if (warnings.length > 0) console.warn(warnings);
|
|
147
|
+
await writeFile("report.xlsx", new Uint8Array(buffer));
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
| 项目 | 当前行为 |
|
|
151
|
+
| --- | --- |
|
|
152
|
+
| 工作簿结构 | 每个报表页生成一张工作表,默认 `Sheet1`、`Sheet2`…,可自定义名称 |
|
|
153
|
+
| 表格结构 | 表头、明细、小计 / 总计的渲染结果,列宽、行高、跨行 / 跨列合并 |
|
|
154
|
+
| 基础样式 | 字号、字体族、加粗 / 斜体 / 下划线、颜色、水平 / 垂直对齐、换行、底色与边框开关 |
|
|
155
|
+
| 标题文本 | 按组件顺序写入合并行;页面绝对坐标转换为工作表行流 |
|
|
156
|
+
| 单元格类型 | 默认 `text` 保留显示文本;`raw` 保留列表原始数值、布尔、文本编号、空值和汇总数值 |
|
|
157
|
+
| 数字格式 | `raw` 模式沿用小数位、千分位和百分比格式,不猜测文本编号的类型 |
|
|
158
|
+
| 非表格内容 | 图片、条码、二维码、图表、嵌套组件和无文本回退的富文本等暂不导出,跳过时返回 `warnings` |
|
|
159
|
+
| 版式与打印 | 自动识别 A3 / A4 / A5,可配置 `paperSize`;自定义尺寸回退有告警,绝对坐标仍转为行流 |
|
|
160
|
+
| Excel 编辑工作流 | 尚无 `.xlsx` 模板导入、交互式工作簿编辑、公式计算或透视表 API |
|
|
161
|
+
|
|
162
|
+
列表自动保留原始值,Vue 可在配置中一次启用 `xlsx: { valueMode: "raw" }`;旧计划没有原始值时继续导出显示文本。日期对象、公式和自定义布局仍需业务明确处理。Excel 不做 PDF 坐标复刻;可使用返回的 ExcelJS `workbook` 继续处理并重新序列化。
|
|
163
|
+
|
|
164
|
+
完整示例、类型保留策略和注意事项见 [Excel 导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md)。
|
|
165
|
+
|
|
166
|
+
## 对齐与可读性
|
|
167
|
+
|
|
168
|
+
`createTableTemplate()` 提供适合业务报表的默认值,常规列无需逐个配置。表头和内容独立设置,整表配置可被单列覆盖。
|
|
169
|
+
|
|
170
|
+
| 内容 | 默认 / 建议 |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| 表头 | 标准明细默认居中;长说明列可单独居左 |
|
|
173
|
+
| 名称、描述、文本编号 | 居左;编码不会因长得像数字而自动变成数值 |
|
|
174
|
+
| 数量、金额、百分比 | 真实数字或明确指定数字格式时居右,便于比较位数 |
|
|
175
|
+
| 日期、布尔值 | 自动模式居中;字符串状态可显式设置 `align: "center"` |
|
|
176
|
+
| 统一业务要求 | `listOptions.align` / `headerAlign` 设置整表,列级配置优先 |
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
const template = createTableTemplate({
|
|
180
|
+
columns: [
|
|
181
|
+
{ header: "物料名称", field: "name", flex: 2, headerAlign: "left" },
|
|
182
|
+
{ header: "数量", field: "qty", format: { kind: "number", digits: 3 } },
|
|
183
|
+
{ header: "状态", field: "status", align: "center" }
|
|
184
|
+
]
|
|
185
|
+
});
|
|
63
186
|
```
|
|
64
187
|
|
|
65
|
-
|
|
188
|
+
`align` 支持 `auto / left / center / right / justify`;`headerAlign` 支持四种明确对齐。`headerStyle` 可独立配置表头字体、底色与垂直对齐。条件规则只覆盖内容;旧低层模板未配置新字段时保留原有行为。DOM、Canvas、PDF 和 Excel 使用同一份解析后的样式。
|
|
189
|
+
|
|
190
|
+
## 模板配置与管理扩展
|
|
191
|
+
|
|
192
|
+
模板文档只保存布局与描述,可存为 JSON 文件或交给现有后台。模板 ID、名称、修订号和布局形成明确契约;查询接口、数据与鉴权继续使用项目已有能力。
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
import {
|
|
196
|
+
defineReportTemplate, createTemplateRegistry,
|
|
197
|
+
parseReportTemplate, serializeReportTemplate
|
|
198
|
+
} from "@agile-team/mach-report/vue";
|
|
199
|
+
|
|
200
|
+
const templates = createTemplateRegistry([
|
|
201
|
+
defineReportTemplate({ id: "outbound", name: "产品出库单", revision: "1", template })
|
|
202
|
+
]);
|
|
203
|
+
|
|
204
|
+
// imported 是文件文本或后台返回的 JSON 对象;包内完成校验。
|
|
205
|
+
templates.register(parseReportTemplate(imported), { replace: true });
|
|
206
|
+
const json = serializeReportTemplate(templates.get("outbound")!);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`list / get / register / remove` 提供模板目录与独立快照;重复 ID 默认拒绝,更新显式声明替换。文档版本由 `defineReportTemplate` 自动补齐,未知版本、非法字段和非 JSON 内容会给出结构化校验错误。
|
|
210
|
+
|
|
211
|
+
远程管理只需让报表的 `template` 按需加载,页面写法保持不变:
|
|
212
|
+
|
|
213
|
+
```ts
|
|
214
|
+
app.use(machReportPlugin, {
|
|
215
|
+
reports: {
|
|
216
|
+
outbound: {
|
|
217
|
+
template: async ({ reportId, signal }) =>
|
|
218
|
+
parseReportTemplate(await templateApi.read(reportId, { signal })).template,
|
|
219
|
+
load: ({ params, signal }) => reportApi.data(params, { signal })
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
动态模板不隐式缓存,每次重载读取当前版本;需要自动查询面板时,在报表定义中声明 `params`。管理后台可接入草稿、发布、版本历史与回滚,服务端负责权限和修订号冲突检查。完整方案见[模板管理扩展指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/TEMPLATE_MANAGEMENT.md)。
|
|
226
|
+
|
|
227
|
+
## 大报表预览与性能
|
|
228
|
+
|
|
229
|
+
正文和缩略图均按可见窗口渲染,离屏画布及时释放;页尺寸索引按计划建立一次,滚动和跳页通过二分定位。搜索按文本块分片,输入新查询、换单据或卸载会取消旧任务,命中计数按页保存,避免为每次重复文字创建一个记录。
|
|
230
|
+
|
|
231
|
+
默认已启用,无需额外接入代码。需要调节时,统一放入配置中心:
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
defineMachReportConfig({
|
|
235
|
+
defaults: {
|
|
236
|
+
preview: { overscanPages: 1, searchDebounceMs: 200 },
|
|
237
|
+
xlsx: { valueMode: "raw", paperSize: "auto" }
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`overscanPages` 默认 1、限定 0–10;`searchDebounceMs` 默认 200、限定 0–2000 ms。应用、preset 与路由按字段继承。虚拟化控制渲染节点数量;完整数据仍需内存,首次分页和整本导出仍有计算成本。大业务范围应配合后端受控取数、日期范围和合理单元格内容,完整导出不能误用列表当前页数据。
|
|
243
|
+
|
|
244
|
+
## 一份清晰的应用配置
|
|
245
|
+
|
|
246
|
+
把通用文案、主题、页间距和 PDF 字体放入配置中心;具体数据源与报表参数由实例提供。
|
|
247
|
+
|
|
248
|
+
```ts
|
|
249
|
+
import { defineMachReportConfig, machReportPlugin } from "@agile-team/mach-report/vue";
|
|
250
|
+
|
|
251
|
+
const config = defineMachReportConfig({
|
|
252
|
+
defaults: {
|
|
253
|
+
gapPx: 18,
|
|
254
|
+
pdfFontUrl: "/fonts/NotoSansSC-Regular.ttf",
|
|
255
|
+
xlsx: { valueMode: "raw" },
|
|
256
|
+
messages: { title: "业务报表" }
|
|
257
|
+
},
|
|
258
|
+
presets: {
|
|
259
|
+
previewOnly: { showExport: false, showPrint: false, showPdfWindow: false }
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
app.use(machReportPlugin, { fetcher, config });
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
优先级为:内置值 → 应用 defaults → 命名 preset → 组件属性;路由级 `provideMachReportConfig` 会叠加应用配置。中文 PDF 需要部署覆盖所用字符的字体并配置 `pdfFontUrl`;Vue 出口遇到缺字或页面渲染错误会阻止下载。`.doc` 出口是 Word 兼容的 HTML 文档,并非 `.docx`。
|
|
267
|
+
|
|
268
|
+
有效报表显示后,组件对已启用的 PDF 出口自动做轻量 HEAD 字体检查,不下载字库或加载 PDF 引擎。结果通过 `state.pdfFont` 提供,资源异常显示可重试提示;实际导出再验证字体文件及文字覆盖范围。部署、跨域与缓存处理见 [PDF 字体指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PDF.md)。
|
|
66
269
|
|
|
67
270
|
## 接入项目数据
|
|
68
271
|
|
|
69
|
-
|
|
272
|
+
**后端可以只提供业务数据。** 宿主定义模板和取数函数,通过插件 `reports` 或核心 `createReportSource()` 注册;包内自动生成用于预览、打印和导出的 `RenderPlan`。后端无需安装 MachReport,也不必实现专用报表服务;模板也可以由后端存储后返回。
|
|
273
|
+
|
|
274
|
+
| 接入模式 | 后端返回 | 前端负责 |
|
|
275
|
+
| --- | --- | --- |
|
|
276
|
+
| 业务数据模式(常规项目优先) | 业务 JSON,如单据明细、查询结果 | 宿主提供模板、取数及字段映射;包内分页、校验、预览和导出 |
|
|
277
|
+
| 渲染计划模式 | 符合协议的 `RenderPlan` JSON | 宿主提供 fetcher;组件校验、预览和导出 |
|
|
278
|
+
|
|
279
|
+
内核、PDF 和 XLSX 出口不依赖前端框架;**现成的 `ReportPreview`、工具栏和参数面板依赖 Vue 3**。React、Angular 或原生 JavaScript 项目可调用核心 DOM / Canvas API 和导出 API,自行封装界面与生命周期。框架无关不代表各框架都已有预览组件。
|
|
280
|
+
|
|
281
|
+
常规业务接入使用上方的 `reports`,无需手写 `PlanFetcher` 或调用分页器。业务数据模式的完整示例见[项目接入指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/INTEGRATION.md)。接口路径、请求库、鉴权和字段映射由宿主项目管理。
|
|
282
|
+
|
|
283
|
+
如果已有接口直接返回渲染计划:
|
|
70
284
|
|
|
71
285
|
```ts
|
|
72
|
-
import type { RenderPlan } from "@agile-team/mach-report";
|
|
73
|
-
import type { PlanFetcher } from "@agile-team/mach-report/vue";
|
|
286
|
+
import type { RenderPlan, PlanFetcher } from "@agile-team/mach-report/vue";
|
|
74
287
|
|
|
75
|
-
const fetcher: PlanFetcher = async ({ reportIds, params }) => {
|
|
288
|
+
const fetcher: PlanFetcher = async ({ reportIds, params, signal }) => {
|
|
76
289
|
const response = await fetch("/api/report-plan", {
|
|
77
290
|
method: "POST",
|
|
78
291
|
headers: { "Content-Type": "application/json" },
|
|
79
|
-
body: JSON.stringify({ reportIds, params })
|
|
292
|
+
body: JSON.stringify({ reportIds, params }),
|
|
293
|
+
signal
|
|
80
294
|
});
|
|
81
295
|
if (!response.ok) throw new Error(`报表加载失败:HTTP ${response.status}`);
|
|
82
|
-
return (await response.json()) as RenderPlan;
|
|
296
|
+
return (await response.json()) as RenderPlan; // 预览组件负责计划校验
|
|
83
297
|
};
|
|
84
|
-
|
|
85
|
-
// 在 main.ts 中替换本地 fetcher 的注册;也可传给单个 ReportPreview。
|
|
86
|
-
app.use(machReportPlugin, { fetcher });
|
|
87
298
|
```
|
|
88
299
|
|
|
89
|
-
`/api/report-plan`
|
|
300
|
+
`/api/report-plan` 是示例路径,请替换为实际接口。`PlanFetcher` 是高级逃生口,返回 `RenderPlan`,并可接收 `signal` 和 `onWarning`;旧函数可忽略新增可选参数。`report-id` 选择报表定义,业务单据 ID 放在 `params` 中。模板参数随 `reports` 自动传递,原始计划接口则可通过 `paramDefs` 声明查询面板。
|
|
90
301
|
|
|
91
302
|
```text
|
|
92
303
|
模板 + 数据 ── paginateTemplate ──┐
|
|
93
|
-
├─ RenderPlan ─┬─
|
|
94
|
-
项目数据接口 ──
|
|
95
|
-
└─ 图片 / Word 兼容文档
|
|
304
|
+
├─ RenderPlan ─┬─ Vue / DOM / Canvas
|
|
305
|
+
项目数据接口 ── PlanFetcher ──────┘ ├─ 浏览器打印 / HTML
|
|
306
|
+
└─ PDF / XLSX / 图片 / Word 兼容文档
|
|
96
307
|
```
|
|
97
308
|
|
|
98
|
-
##
|
|
309
|
+
## 按需加载与包边界
|
|
99
310
|
|
|
100
|
-
|
|
|
311
|
+
| 入口 | 用途 |
|
|
101
312
|
| --- | --- |
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
313
|
+
| `@agile-team/mach-report` | 模板 DSL、模板文档 / 目录、报表数据源、分页、格式化、计划校验、DOM / Canvas、页窗口计算 |
|
|
314
|
+
| `@agile-team/mach-report/vue` | 重导出核心 API;Vue 组件、插件、配置中心、适配器和父页面控制句柄 |
|
|
315
|
+
| `@agile-team/mach-report/vue/async` | 异步全局组件插件与 `preloadMachReport` 预取 |
|
|
316
|
+
| `@agile-team/mach-report/vue/style.css` | Vue 预览样式 |
|
|
317
|
+
| `@agile-team/mach-report/pdf` | `renderPlanToPdf`、字体加载与缓存 |
|
|
318
|
+
| `@agile-team/mach-report/xlsx` | `renderPlanToXlsx`、工作簿与导出告警 |
|
|
319
|
+
| `@agile-team/mach-report/sql` | 动态 SQL 编译与单 SELECT 校验工具 |
|
|
107
320
|
|
|
108
|
-
|
|
321
|
+
内核保持零运行时依赖;ExcelJS、pdf-lib / fontkit、SQL parser 分别内联于对应构建入口。导入 `/xlsx` 才使用 Excel 能力,导入 `/pdf` 才使用 PDF 能力;Vue 不进入引擎主入口。npm 构建提供 ESM、CommonJS 与类型声明。
|
|
109
322
|
|
|
110
|
-
|
|
323
|
+
XLSX 的完整 Workbook 类型随声明打包,`@types/node` 为其 stream API 提供类型。Canvas / PNG 当前适合文本、表格和基础形状,图片型组件的绘制仍待完善;对输出保真度敏感时,请按具体组件验证 DOM 与 PDF 结果。
|
|
111
324
|
|
|
112
|
-
|
|
113
|
-
| --- | --- |
|
|
114
|
-
| [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md) | `RenderPlan`、模板 DSL、Vue 属性与事件、配置、导出 |
|
|
115
|
-
| [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal) | 本地报表、多页预览与交互 |
|
|
116
|
-
| [模块联邦示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/fed-host) | 远程加载报表组件 |
|
|
325
|
+
需要远程加载组件的项目,可部署 `packages/federation`,参考[模块联邦示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/fed-host)。普通 Vue 项目直接使用 npm 子入口。
|
|
117
326
|
|
|
118
|
-
##
|
|
327
|
+
## 本地开发与验证
|
|
119
328
|
|
|
120
|
-
|
|
329
|
+
仓库开发要求 Node.js `>=22.13.0`、pnpm `11.8.0`。运行以下命令建立本地质量基线:
|
|
121
330
|
|
|
122
331
|
```bash
|
|
123
|
-
pnpm install
|
|
124
|
-
pnpm
|
|
125
|
-
pnpm
|
|
126
|
-
pnpm test
|
|
127
|
-
pnpm build
|
|
128
|
-
pnpm exec playwright test
|
|
332
|
+
pnpm install --frozen-lockfile
|
|
333
|
+
pnpm verify
|
|
334
|
+
pnpm test:e2e
|
|
129
335
|
```
|
|
130
336
|
|
|
131
|
-
|
|
337
|
+
| 命令 | 用途 |
|
|
338
|
+
| --- | --- |
|
|
339
|
+
| `pnpm typecheck` | TypeScript 项目与 Vue SFC 类型检查 |
|
|
340
|
+
| `pnpm lint` | ESLint 检查 |
|
|
341
|
+
| `pnpm test` / `pnpm test:coverage` | Vitest 单元测试 / 覆盖率 |
|
|
342
|
+
| `pnpm build` | 引擎、Vue、联邦与示例构建 |
|
|
343
|
+
| `pnpm verify` | 类型、Lint、构建、覆盖率、文档与打包消费端校验 |
|
|
344
|
+
| `pnpm check:consumer` | npm 产物在隔离目录的 ESM / CJS 运行与类型验证 |
|
|
345
|
+
| `pnpm test:e2e` | Playwright 浏览器端到端验证 |
|
|
346
|
+
| `pnpm --filter @agile-team/example-minimal dev` | 启动本地报表示例 |
|
|
347
|
+
|
|
348
|
+
CI 使用同一套校验命令,并在构建后检查实际发布产物。协作边界、Changesets 与发布流程见 [AGENTS.md](https://github.com/ChenyCHENYU/MachReport/blob/main/AGENTS.md)。
|
|
349
|
+
|
|
350
|
+
最小示例已包含覆盖示例字符的中文 PDF 字体子集,来源和 OFL 授权见[字体说明](https://github.com/ChenyCHENYU/MachReport/blob/main/examples/minimal/public/fonts/README.md)。生产报表请配置覆盖实际数据的完整字体。
|
|
351
|
+
|
|
352
|
+
## 文档地图
|
|
353
|
+
|
|
354
|
+
| 目标 | 入口 |
|
|
355
|
+
| --- | --- |
|
|
356
|
+
| 接入与 API | [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md):数据模型、模板、Vue 属性 / 事件、配置与导出 |
|
|
357
|
+
| Excel | [导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md):能力边界、Node 示例与原始数据类型 |
|
|
358
|
+
| 模板管理 | [扩展指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/TEMPLATE_MANAGEMENT.md):JSON 文档、目录、动态版本与后台接入 |
|
|
359
|
+
| PDF | [字体与导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PDF.md):首次诊断、字库部署、缺字与缓存 |
|
|
360
|
+
| 本地报表 | [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal):出库单、工艺卡、多页与多模板预览 |
|
|
361
|
+
| 远程组件 | [模块联邦示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/fed-host) · [部署包](https://github.com/ChenyCHENYU/MachReport/tree/main/packages/federation) |
|
|
362
|
+
| 排版与字体 | [字体测量与校准](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/font-calibration.md) |
|
|
363
|
+
| 版本记录 | [Changelog](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/CHANGELOG.md) |
|
|
364
|
+
| 工程协作 | [AGENTS.md](https://github.com/ChenyCHENYU/MachReport/blob/main/AGENTS.md) |
|
|
365
|
+
| 产品演进 | [项目评审与优化优先级](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PROJECT_REVIEW.md) |
|
|
366
|
+
| 使用授权 | [许可证](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE) · [授权说明](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSING.md) |
|
|
367
|
+
|
|
368
|
+
## 版本与授权
|
|
369
|
+
|
|
370
|
+
当前源码版本为 `2.2.0`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
|
|
371
|
+
|
|
372
|
+
Copyright © 2026 ChenyCHENYU (Agile Team). All rights reserved.
|
|
132
373
|
|
|
133
|
-
|
|
374
|
+
MachReport 采用 [MachReport Source-Available License 1.0](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE)。源码公开可供查看,使用、运行、测试、修改、集成、部署、分发或商业使用须事先取得作者书面授权。申请流程见[授权说明](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSING.md)。
|
|
134
375
|
|
|
135
|
-
|
|
376
|
+
问题与建议请通过 [GitHub Issues](https://github.com/ChenyCHENYU/MachReport/issues) 提交。
|