@agile-team/mach-report 1.2.1 → 1.2.2

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 (2) hide show
  1. package/README.md +89 -250
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,304 +1,143 @@
1
1
  <div align="center">
2
2
 
3
- <img src="https://raw.githubusercontent.com/ChenyCHENYU/MachReport/main/assets/mach-report-logo.svg" alt="MachReport" width="760" />
3
+ <img src="https://raw.githubusercontent.com/ChenyCHENYU/MachReport/main/assets/mach-report-icon.svg" alt="MachReport 图标" width="72" height="72" />
4
4
 
5
- # @agile-team/mach-report
5
+ # MachReport
6
6
 
7
- **面向 B 端打印报表的高性能 TypeScript 引擎**:模板 → RenderPlan 单真相源 → 屏幕 / PDF / Excel / 打印四出口,
8
- 提供 jh4j-cloud-report 的 `gridPlan` 接入与迁移工具;具体模板是否可替换,以真实环境验收为准。
7
+ **面向打印报表的 TypeScript 引擎与 Vue 3 预览组件**
9
8
 
10
- [![npm](https://img.shields.io/npm/v/@agile-team/mach-report.svg?color=2d5fb8)](https://www.npmjs.com/package/@agile-team/mach-report)
9
+ 接入现有 jh4j `gridPlan`,或用本地模板生成报表;共用一份 RenderPlan 输出预览、PDF、Excel 和打印。
10
+
11
+ [![npm](https://img.shields.io/npm/v/@agile-team/mach-report.svg)](https://www.npmjs.com/package/@agile-team/mach-report)
11
12
  [![CI](https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml/badge.svg)](https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml)
12
- [![dependencies](https://img.shields.io/badge/dependencies-0-2ea44f)](https://www.npmjs.com/package/@agile-team/mach-report)
13
- [![node](https://img.shields.io/badge/node-%3E%3D18-2d5fb8)](https://www.npmjs.com/package/@agile-team/mach-report)
14
- [![license](https://img.shields.io/badge/license-Source--Available-4a4d52)](#-license)
13
+ [![Node.js](https://img.shields.io/badge/Node.js-%E2%89%A518-2455a6)](https://www.npmjs.com/package/@agile-team/mach-report)
15
14
 
16
- [快速开始](#快速开始) · [核心能力](#核心能力) · [配置中心](#配置中心) · [引擎 API](#引擎-api) · [从 jh4j 迁移](#从-jh4j-迁移)
15
+ [快速开始](#快速开始) · [接入方式](#接入方式) · [能力一览](#能力一览) · [使用边界](#使用边界) · [文档导航](#文档导航)
17
16
 
18
17
  </div>
19
18
 
20
- ---
19
+ ## 适合用在哪里
20
+
21
+ | 场景 | 用法 |
22
+ | --- | --- |
23
+ | 已有 jh4j 报表服务,需要在 Vue 页面预览和打印 | 传入已发布的 `tempId`,复用现有 `gridPlan` 接口 |
24
+ | 报表数据在前端或自有服务中 | 用模板 DSL / JSON 分页,或传入自定义 `PlanFetcher` |
25
+ | 定时归档、邮件附件等服务端任务 | 在 Node.js 中按需导入 PDF / XLSX 子路径 |
26
+
27
+ MachReport 提供渲染引擎和接入组件;目录、数据源、可视设计、权限与发布流程仍由现有报表平台负责。具体 jh4j 模板的版式需要逐张验收,见[对标与验收记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md)。
21
28
 
22
29
  ## 快速开始
23
30
 
31
+ **1. 安装**
32
+
24
33
  ```bash
25
- pnpm add @agile-team/mach-report # 唯一依赖:vue 为可选 peer,重能力全部子路径按需
34
+ pnpm add @agile-team/mach-report
26
35
  ```
27
36
 
37
+ 使用 Vue 组件时,宿主项目需要 Vue 3;只用引擎或 Node.js 导出时无需引入 Vue 子路径。
38
+
39
+ **2. 注册插件**(同源部署,浏览器请求已带鉴权)
40
+
28
41
  ```ts
29
- // main.ts —— 入口一次注册,业务页面从此零胶水代码
42
+ // main.ts
43
+ import { createApp } from "vue";
44
+ import App from "./App.vue";
30
45
  import { machReportPlugin } from "@agile-team/mach-report/vue";
31
46
  import "@agile-team/mach-report/vue/style.css";
32
47
 
33
- app.use(machReportPlugin); // 零配置:同源直连 jh4j 端点
34
- // 或 app.use(machReportPlugin, { baseUrl: "/sub/mach-report", request: axios });
35
- ```
36
-
37
- ```vue
38
- <!-- 任意业务页面:一行组件。打印 / PDF / Excel / 搜索 / 缩略图 / 参数面板全部内置 -->
39
- <MachReportPreview temp-id="CK_TEMPLATE_001" :params="{ id: '9' }" height="calc(100vh - 206px)" />
48
+ const app = createApp(App);
49
+ app.use(machReportPlugin);
50
+ app.mount("#app");
40
51
  ```
41
52
 
42
- 零配置适用于同源且浏览器请求已带鉴权的部署;宿主通过请求拦截器加 token 时,请传入宿主 `request`。中文 PDF 需部署支持中文的字体并配置 `pdfFontUrl`,缺字时导出会报错,避免下载不完整文件。完整验收边界见[对标与实用化验收](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md)。
43
-
44
- ## 核心能力
45
-
46
- | 域 | 能力 |
47
- |---|---|
48
- | **报表语义** | 分组小计 / 总合计(防孤行)、页码占位符 `{page}/{totalPages}`、列格式化(千分位 / 日期 / 百分比)、条件格式规则 |
49
- | **模板体系** | DSL / JSON / jh4j 存量导入三来源;多模板拼接;公共页眉页脚;参数面板(声明式查询条件)。存量导入的富文本、图片类和子报表可能降级,需按模板验收 |
50
- | **渲染性能** | 页级虚拟化;transform 缩放;Canvas 窗口化分页器;内部性能预算见下文 |
51
- | **导出出口** | PDF 前端矢量直出、Excel 真表格、Word 兼容 HTML `.doc`、图片 PNG/JPEG(每页一张)、逐页打印;复杂版式以 PDF 验收 |
52
- | **预览交互** | 搜索(跳页 + 高亮)、Ctrl+滚轮 / 键盘缩放翻页、缩略图侧栏、缩放记忆、调试面板 `?mrp-debug=1` |
53
- | **工程健壮性** | 加载竞态代际令牌、结构化错误码、请求超时、批量打印合并文档、渲染计划规模告警、导出保真提示 |
54
-
55
- <details>
56
- <summary><b>单包架构说明(为什么只有一个包)</b></summary>
57
-
58
- 框架组件在 `./vue` 子路径(vue 声明为 **optional peer**——React / Node 宿主不会被装上 vue);
59
- pdf-lib / node-sql-parser / exceljs 分别内联进 `./pdf` `./sql` `./xlsx` 子路径产物——**不导入不进依赖图**,
60
- 主入口零框架耦合零重依赖(ESLint 边界规则 + 产物守卫测试双保险)。
61
- 自引用(self-reference)让 `./vue` 静态复用引擎、PDF 懒加载走 `./pdf`,运行时引擎代码全局单份。
62
- ESM + CJS 双格式 + `.d.ts/.d.cts` 双声明,Node ≥ 18。
63
-
64
- </details>
65
-
66
- <details>
67
- <summary><b>三种集成姿势(全局插件 / 局部导入 / 异步入口)</b></summary>
68
-
69
- **① 全局插件(推荐)**:上文快速开始即是。插件注册全局组件 `<MachReportPreview>`(懒加载分片零首屏成本)、注入数据面 / PDF 导出器 / 配置中心。
70
-
71
- **② 局部导入**——单页面使用:
53
+ **3. 在业务页使用已发布的报表 ID**
72
54
 
73
55
  ```vue
74
- <script setup lang="ts">
75
- import { ReportPreview, createLocalFetcher } from "@agile-team/mach-report/vue";
76
- const fetcher = createLocalFetcher({
77
- T1: { tempId: "T1", template, datasets: { detail: rows } }
78
- });
79
- </script>
80
56
  <template>
81
- <ReportPreview temp-id="T1" :fetcher="fetcher" @loaded="onLoaded" @error="onError" />
57
+ <MachReportPreview
58
+ temp-id="CK_TEMPLATE_001"
59
+ :params="{ id: '9' }"
60
+ height="70vh"
61
+ />
82
62
  </template>
83
63
  ```
84
64
 
85
- **③ 异步入口**——首屏敏感页面(组件拆独立分片 + 预取):
65
+ 插件默认请求同源 `/report/codePrintReport/gridPlan`。如果宿主通过请求拦截器加 token,或有网关前缀,把第 2 步的 `app.use(machReportPlugin)` 替换为:
86
66
 
87
67
  ```ts
88
- import AsyncMachReportPlugin, { preloadMachReport } from "@agile-team/mach-report/vue/async";
89
- app.use(AsyncMachReportPlugin, { baseUrl: "/sub/mach-report" });
90
- void preloadMachReport(); // 路由 hover 时预取,正式渲染零等待
91
- ```
92
-
93
- </details>
68
+ import request from "@/utils/request"; // 宿主项目现有请求客户端
94
69
 
95
- <details>
96
- <summary><b>配置中心(presets / 文案 / 主题 / 日志通道)</b></summary>
97
-
98
- ```ts
99
- // src/config/mach-report.config.ts —— 集中到独立配置文件
100
- import { defineMachReportConfig, defineMachReportPreset } from "@agile-team/mach-report/vue";
101
-
102
- export default defineMachReportConfig({
103
- defaults: {
104
- gapPx: 18,
105
- pdfFontUrl: "/simhei.ttf",
106
- showParams: true, // 参数面板
107
- messages: { title: "Report Preview" }, // 全量文案可覆写(i18n)
108
- theme: { shellBg: "#2b2b2b", btnActiveBg: "#1677ff" }, // --mrp-* 主题变量
109
- logger: console // 校验告警通道(静默传 SILENT_LOGGER)
110
- },
111
- presets: {
112
- lean: defineMachReportPreset({ showExport: false, showPrint: false }), // 纯预览
113
- print: defineMachReportPreset({ showPdfWindow: false })
114
- },
115
- defaultPreset: "lean"
70
+ app.use(machReportPlugin, {
71
+ request,
72
+ baseUrl: "/sub/mach-report",
73
+ pdfFontUrl: "/fonts/NotoSansSC-Regular.ttf"
116
74
  });
117
75
  ```
118
76
 
119
- **优先级**:`组件 props` > `provideMachReportConfig(overlay)`(路由级响应式叠加)> `preset` > `defaults` > `内置缺省`。
120
-
121
- **参数面板**:模板声明 `.params([...])` 或 prop `:param-defs`,组件自动生成查询条件(text / number / date / select、必填、默认值、查询 / 重置 / 回车),查询时面板值与 `props.params` 合并;编程式 `setParams(values)` 同步面板并查询。
122
-
123
- **主题**也可不经配置中心,直接在宿主 CSS 覆写 `--mrp-shell-bg / --mrp-toolbar-bg / --mrp-btn-*`。
124
-
125
- </details>
126
-
127
- <details>
128
- <summary><b>模板 DSL 与报表语义</b></summary>
129
-
130
- ```ts
131
- const template = createTemplate()
132
- .params([ // 参数面板:声明式查询条件
133
- { field: "whCode", label: "仓库", type: "select", required: true,
134
- options: [{ label: "全部仓库", value: "ALL" }], defaultValue: "ALL" },
135
- { field: "date", label: "日期", type: "date", defaultValue: "2026-09-30" }
136
- ])
137
- .page("a4", { landscape: true, margins: { marginTopMm: 12 } }) // 纸张预设 + 横向
138
- .text("出库单", { leftMm: 70, topMm: 2, widthMm: 70 }, { fontSize: 16, bold: true, align: "center" })
139
- .text("第 {page} 页 / 共 {totalPages} 页", { leftMm: 65, topMm: 285, widthMm: 80 }, { align: "center" })
140
- .barcode("CK-001", { leftMm: 12, topMm: 14, widthMm: 40, heightMm: 12 })
141
- .list("detail", { leftMm: 12, topMm: 32, widthMm: 186 }, [
142
- { header: "物料", field: "name", widthMm: 96 },
143
- { header: "数量", field: "qty", widthMm: 45, format: { kind: "number", thousands: true } },
144
- { header: "金额", field: "amount", widthMm: 45,
145
- format: { kind: "number", thousands: true, digits: 2 },
146
- rules: [{ when: { field: "amount", op: "<", value: 0 }, style: { color: "#cc0000" } }] },
147
- { header: "日期", field: "date", widthMm: 45, format: { kind: "date", pattern: "YYYY-MM-DD" } }
148
- ], {
149
- groupBy: { field: "wh", headerTemplate: "仓库:{value}", subtotal: ["qty", "amount"] },
150
- grandTotal: true
151
- })
152
- .build();
153
- ```
154
-
155
- 语义要点:格式化在进 RenderPlan 前完成(三后端零感知,`digits` 显式精确保留、日期按本地日历日解析);
156
- 分组 Map 归组与数据顺序无关;条件规则命中才克隆样式(热路径驻留不破坏);含占位符的文本转为页锚,每个输出页克隆注入。
157
-
158
- </details>
159
-
160
- <details>
161
- <summary><b>数据面(fetcher 生态:零配置 / jh4j / 本地 / 自定义)</b></summary>
162
-
163
- | 工具 | 场景 |
164
- |---|---|
165
- | 内置(零配置) | 插件不传 request / fetcher 时自动用全局 fetch 同源请求 `/report/codePrintReport/gridPlan` |
166
- | `createFetchRequest({ baseUrl, headers, credentials, timeoutMs })` | 零依赖 fetch 适配(AbortController 超时 + 错误语义) |
167
- | `createJh4jGridPlanFetcher({ request, baseUrl })` | 接宿主 axios 风格客户端,消费 jh4j gridPlan(路径 / 出入参契约兼容) |
168
- | `createLocalFetcher({ [tempId]: { template, datasets } })` | 本地模板(离线 / 单测 / 无后端);面板参数用 `:param-defs="template.params"` 直取 |
169
-
170
- 自定义数据面只需实现:`type PlanFetcher = (input: { tempIds, furnitureTempId?, params }) => Promise<RenderPlan>`——
171
- 任何后端能吐 RenderPlan JSON 就能接(schema 有校验器与文档)。
172
-
173
- </details>
174
-
175
- <details>
176
- <summary><b>引擎 API(框架无关,子路径按需)</b></summary>
177
-
178
- ```ts
179
- import {
180
- createTemplate, paginateTemplate, // 模板 DSL / 分页计算
181
- renderPlan, renderPage, // RenderPlan → DOM
182
- renderPlanToCanvas, createCanvasPager, // 位图渲染 / 窗口化分页器(大报表)
183
- computePageWindow, validateRenderPlan, // 虚拟化窗口 / 计划校验(JSON path 定位)
184
- importJh4jTemplateContent, // jh4j 模板 content → 本地模板
185
- wrapText, createCanvasMeasurer // 文本测量(可注入,三端折行一致)
186
- } from "@agile-team/mach-report";
187
- import { renderPlanToPdf } from "@agile-team/mach-report/pdf"; // PDF 直出(pdf-lib 已内联)
188
- import { renderPlanToXlsx } from "@agile-team/mach-report/xlsx"; // Excel 导出
189
- import { renderDynamicSql } from "@agile-team/mach-report/sql"; // 动态 SQL(AST 校验)
190
- import { createReportAdminClient } from "@agile-team/mach-report/manager"; // 管理端 API
191
- ```
192
-
193
- **渲染管线(单真相源)**:
194
-
195
- ```
196
- 模板 JSON ──+──> paginateTemplate(template, datasets) ──> RenderPlan
197
- │ ├──> DOM 虚拟化预览
198
- jh4j gridPlan ──(契约兼容消费) ├──> Canvas 窗口化分页器
199
- ├──> PDF 矢量直出
200
- └──> print(named pages)
201
- ```
202
-
203
- **大报表 Canvas**:`createCanvasPager(plan, { dpr, overscan }).attach(scrollContainer)` —— 视口窗口 + 画布池复用 + 每帧限量绘制 + resize 自适应。
204
-
205
- **批量打印**:`printPlans([plan1, plan2], { onProgress })` 多单合并单文档(混合纸张 named pages),只弹一次打印框。
77
+ 其中 `request` 是宿主已有的 Axios 风格客户端。中文 PDF 需部署包含所用汉字的字体;缺字时导出会报错,避免下载残缺文件。
206
78
 
207
- </details>
79
+ ## 接入方式
208
80
 
209
- <details>
210
- <summary><b>性能预算与比较边界</b></summary>
81
+ | 需要的数据来源 | 选择 | 入口 |
82
+ | --- | --- | --- |
83
+ | 同源 jh4j 服务 | 插件默认 fetch | `@agile-team/mach-report/vue` |
84
+ | 宿主网关、鉴权拦截器 | 插件传 `request` / `baseUrl` | `machReportPlugin` |
85
+ | 本地模板与数据 | `createLocalFetcher` | `@agile-team/mach-report/vue` |
86
+ | 自有服务已生成 RenderPlan | 实现 `PlanFetcher` | `@agile-team/mach-report/vue` |
87
+ | 不使用 Vue | 模板、渲染与导出函数 | 主入口及 `/pdf`、`/xlsx` 子路径 |
211
88
 
212
- `perf-budget.test.ts` 是内部回归门槛:5,000 行分页 < 600ms、DOM 渲染 < 120ms/页、1,000 页窗口计算 100 次 < 50ms(测试环境口径)。它不含网关取数、真实字体加载、打印机或浏览器下载耗时。与 jh4j / FineReport 的性能比较需使用相同模板、数据、机器和网络做端到端测量;方法见[验收文档](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md)。
89
+ 完整的参数、事件、插槽、局部导入和异步入口示例见 [API 文档](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md)。
213
90
 
214
- </details>
91
+ ## 能力一览
215
92
 
216
- <details>
217
- <summary><b>Node 无头导出通道(同一引擎两端执行)</b></summary>
93
+ | 环节 | 已提供的能力 |
94
+ | --- | --- |
95
+ | 输入与分页 | jh4j `gridPlan`;本地 DSL / JSON;明细分页、分组小计、总计、页码、条件格式 |
96
+ | 预览 | DOM / Canvas、页级虚拟化、缩放、搜索、缩略图、参数面板 |
97
+ | 输出 | 浏览器打印、前端 PDF、真正的 `.xlsx`、逐页 PNG / JPEG、Word 兼容 HTML `.doc` |
98
+ | 接入与诊断 | Vue 插件、自定义数据获取器、结构化错误、导出进度与保真告警 |
99
+ | 扩展入口 | Node.js PDF / XLSX 导出、动态 SQL 工具、报表管理 API 客户端 |
218
100
 
219
- 引擎框架无关——`renderPlanToPdf` / `renderPlanToXlsx` 及 `loadFontWithCache` 均可在 **Node 18+** 直接运行
220
- (无 IndexedDB 环境自动降级内存缓存),解锁服务端场景而**不需要另写一套渲染**:
221
-
222
- ```ts
223
- // server.ts —— 定时任务 / 邮件推送 / 归档,无浏览器环境
224
- import { renderPlanToPdf } from "@agile-team/mach-report/pdf";
225
- import { loadFontWithCache } from "@agile-team/mach-report/pdf";
226
- import { renderPlanToXlsx } from "@agile-team/mach-report/xlsx";
227
-
228
- const font = await loadFontWithCache("/path/to/simhei.ttf"); // 读文件系统可自行替换
229
- const { bytes } = await renderPlanToPdf(plan, font ? { customFontBytes: font } : {});
230
- await fs.writeFile("archive.pdf", bytes);
101
+ ```text
102
+ 本地模板 + 数据 ── 分页 ──┐
103
+ ├─ RenderPlan ─┬─ 预览 / 打印
104
+ jh4j gridPlan ────────────┘ ├─ PDF / Excel
105
+ └─ 图片 / Word 兼容文档
231
106
  ```
232
107
 
233
- 与 jh4j"服务端另写一套渲染"本质不同:**一份渲染代码两端执行**,服务端只做无头宿主(定时生成、批量归档、合规留档回传)。
108
+ 包按子路径拆分:`/vue`、`/pdf`、`/xlsx`、`/sql`、`/manager` 按需导入。主入口只包含框架无关的引擎能力。
234
109
 
235
- </details>
110
+ ## 使用边界
236
111
 
237
- <details>
238
- <summary><b>从 jh4j 迁移(契约对照)</b></summary>
112
+ - **真实模板保真**:富文本、图片类组件和子报表的存量模板导入可能降级;应以同一业务单据的 jh4j PDF 为基准,逐张检查跨页、合并单元格、字体和打印。
113
+ - **导出格式**:XLSX 保留表格数据与结构,不承诺 PDF 式像素排版;`.doc` 是 Word 可打开的 HTML 文档,并非 `.docx`。
114
+ - **性能结论**:仓库里的性能测试是内部回归门槛。与其他报表产品比较,应使用同一模板、数据和环境进行端到端测量。
115
+ - **真实环境验证**:当前仓库缺少已脱敏的真实 `gridPlan` 样本,相关契约测试会跳过;采集和验收步骤见[验收记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md)。
239
116
 
240
- | 契约项 | 对齐方式 |
241
- |---|---|
242
- | 组件 props / 事件 / ref | `temp-id / furniture-temp-id / params / height / auto-load / show-*`;`loaded / error`;`reload / print / exportAs / openPdfWindow / gotoPage / setParams` |
243
- | 数据接口 | `/report/codePrintReport/gridPlan` 路径与出入参兼容 |
244
- | 存量模板 | `importJh4jTemplateContent` 逆向 schema 直接转换(含告警清单) |
245
- | 存量 SQL | `#{}` `${}` `{if}` 三语法零改写;AST 级单 SELECT 校验加严 |
246
- | 模块联邦 | expose 名对齐,宿主配 `/sub/mach-report/` 网关即可灰度共存 |
117
+ ## 文档导航
247
118
 
248
- </details>
119
+ | 文档 | 内容 |
120
+ | --- | --- |
121
+ | [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md) | Vue 属性 / 事件、配置中心、模板 DSL、导出与管理 API |
122
+ | [对标与验收记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md) | 与 jh4j / FineReport 的范围对比、真实模板验收方法 |
123
+ | [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal) | Vue 接入与预览交互 |
124
+ | [进展记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PROGRESS.md) | 已实现变更与验证记录 |
249
125
 
250
- <details>
251
- <summary><b>打印兼容性指引(实战排障)</b></summary>
126
+ ## 本地开发
252
127
 
253
- | 现象 | 原因与处理 |
254
- |---|---|
255
- | 表格底色打印丢失 | 浏览器默认关闭"背景图形"——打印对话框勾选*背景图形* |
256
- | 混合纸张按 A4 输出 | named pages 需较新内核(Chrome 85+ / Safari 16+ / Firefox 133+),旧内核退化统一纸张 |
257
- | iOS App 内打印无效 | WKWebView 限制——引导用户走"分享 → 打印"或导出 PDF |
258
- | 字体首载后失效 | PDF 字体走 IndexedDB 缓存(15s 超时回退内置西文字体),清理站点数据后重新拉取 |
259
-
260
- </details>
261
-
262
- <details>
263
- <summary><b>架构与质量门禁</b></summary>
264
-
265
- ```
266
- MachReport(pnpm monorepo · TS strict · 单 npm 包)
267
- ├── packages/
268
- │ ├── mach-report/ # 唯一发布包(零运行时依赖,ESM+CJS)
269
- │ │ └── src/
270
- │ │ ├── layout/ render/ schema/ builder/ compat/ format.ts # 引擎核心
271
- │ │ └── pdf/ sql/ manager/ xlsx/ vue/ # 子路径域(重依赖/框架按需隔离)
272
- │ └── federation/ # 模块联邦远程入口(部署产物,不发 npm)
273
- ├── examples/ # minimal 演示 + fed-host 联邦宿主实证
274
- ├── e2e/ docs/ assets/
275
- ```
128
+ 需要 Node.js ≥ 18 和 pnpm ≥ 11。
276
129
 
277
130
  ```bash
278
- pnpm typecheck && pnpm lint && pnpm test && pnpm build && pnpm exec playwright test
279
- # TS strict(含 vue-tsc) · ESLint 0 错 0 警 · 全量单测(纯逻辑 node 环境分流) · 真 Chromium E2E(0 重试) · 七入口构建
131
+ pnpm install
132
+ pnpm typecheck
133
+ pnpm lint
134
+ pnpm test
135
+ pnpm build
136
+ pnpm exec playwright test
280
137
  ```
281
138
 
282
- 关键设计决策:单真相源渲染 / 单包子路径架构 / 自引用复用 / 三后端共享几何与样式解析 / 性能预算门禁 / 变更日志(changesets)。
283
-
284
- </details>
285
-
286
- ## 路线图
287
-
288
- - v1.0(已完成):单包架构 · 报表语义四件套 · 参数面板 · 交互完整面 · 双远端 + npm 定版
289
- - 设计器画布(拖拽 / 属性面板 / 撤销栈)——独立立项,规划中
290
- - 管理端控制台 UI(`./manager` API 已就绪)——独立立项,规划中
291
- - 交叉表 / 公式列——按真实需求排期
292
-
293
- ---
294
-
295
- <div align="center">
296
-
297
- **Mach 家族**:[MachTable](https://www.npmjs.com/package/@agile-team/mach-table)(数据表格)→ **MachReport**(打印报表)
298
-
299
- Source-available © ChenyCHENYU (Agile Team). 使用需事先取得书面授权,详见 [LICENSE](LICENSE)。
300
-
301
- </div>
139
+ 工作区包含唯一发布包 `packages/mach-report`、模块联邦部署件和示例应用。发布流程与协作约定见 [AGENTS.md](https://github.com/ChenyCHENYU/MachReport/blob/main/AGENTS.md)。
302
140
 
141
+ ## 许可
303
142
 
304
- **v1.2.1** · 单包多入口 · 类型、单测与浏览器验证 · 语义化版本演进
143
+ Source-available © ChenyCHENYU (Agile Team)。使用需事先取得书面授权,详见 [LICENSE](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/mach-report",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "MachReport 报表引擎单包:RenderPlan 模型 + 分页 + DOM/Canvas/PDF 渲染 + 动态 SQL + 管理端 API + Vue 3 契约组件(零运行时依赖;./vue 为框架子路径,vue 为可选 peer)",
5
5
  "type": "module",
6
6
  "sideEffects": [