@agile-team/mach-report 1.2.0 → 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.
- package/README.md +89 -250
- 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-
|
|
3
|
+
<img src="https://raw.githubusercontent.com/ChenyCHENYU/MachReport/main/assets/mach-report-icon.svg" alt="MachReport 图标" width="72" height="72" />
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# MachReport
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
契约级兼容 jh4j-cloud-report——换前端渲染层,后端零改动。
|
|
7
|
+
**面向打印报表的 TypeScript 引擎与 Vue 3 预览组件**
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
接入现有 jh4j `gridPlan`,或用本地模板生成报表;共用一份 RenderPlan 输出预览、PDF、Excel 和打印。
|
|
10
|
+
|
|
11
|
+
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
11
12
|
[](https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml)
|
|
12
|
-
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
14
|
-
[](#-license)
|
|
13
|
+
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
15
14
|
|
|
16
|
-
[快速开始](#快速开始) · [
|
|
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
|
|
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
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
+
## 接入方式
|
|
208
80
|
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
89
|
+
完整的参数、事件、插槽、局部导入和异步入口示例见 [API 文档](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md)。
|
|
213
90
|
|
|
214
|
-
|
|
91
|
+
## 能力一览
|
|
215
92
|
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
108
|
+
包按子路径拆分:`/vue`、`/pdf`、`/xlsx`、`/sql`、`/manager` 按需导入。主入口只包含框架无关的引擎能力。
|
|
234
109
|
|
|
235
|
-
|
|
110
|
+
## 使用边界
|
|
236
111
|
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
279
|
-
|
|
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
|
-
|
|
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
|
-
|
|
143
|
+
Source-available © ChenyCHENYU (Agile Team)。使用需事先取得书面授权,详见 [LICENSE](https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE)。
|
package/package.json
CHANGED