一、功能概述与架构
1.1 打印中心是什么
自定义打印(打印中心)位于 infra 基础设施模块,是一套「一次配置、全模块复用」的单据套打体系。它解决三个问题:
| 问题 | 打印中心的答案 |
|---|---|
| 每个模块各写一套打印页,风格不统一 | 31 种单据共用一套模板引擎 + 一套渲染样式,风格天然统一 |
| 客户要求改版式(加 logo、改列宽、换纸) | 配置员在模板设计器里自助调整,不用改代码、不用发版 |
| 针式打印机要穿孔纸、收银要小票纸 | A4/A5/自定义纸张 + 圆孔穿孔纸 + 紧凑模式全支持 |
1.2 架构与渲染流程
打印中心采用「后端出数据、前端出版式」的分工:
业务模块 Provider(@Component,声明 billType + 变量契约 + 取数逻辑)
│ 启动时自动注册
▼
打印中心注册中心 PrintProviderRegistry(infra 模块,按 billType 路由)
│
├── GET /infra/print/bill-types 已注册的单据类型清单
├── GET /infra/print/variables 某单据类型的变量清单(bill/items/system 三组)
├── GET /infra/print/sample-data 样例单据数据(设计器预览用)
└── GET /infra/print/data 真实单据打印数据(bill 单头 + items 明细)
│
▼
前端模板设计器 / 打印预览页(本地渲染引擎完成占位符替换、二维码生成、大写金额转换)一次完整打印的时序:
- 用户在业务单据列表点【打印】;
- 前端按
billType拉取该类型已启用的模板列表; - 无模板 → 直接用兜底版式;一个模板 → 直接进预览;多个模板 → 弹窗让用户选(默认选中默认模板);
- 预览页并行拉取「模板内容 + 单据打印数据」,本地渲染成纸张版式;
- 用户点【打印】调起浏览器打印对话框,纸张尺寸由模板的
@page规则自动设定。
关键点:模板渲染发生在浏览器端(前端内置 mini 模板引擎 + qrcode 二维码库 + 人民币大写转换),后端只提供数据,因此改模板无需重启服务。
1.3 核心概念
| 概念 | 说明 |
|---|---|
| billType 单据类型 | 打印的最小单位,命名规范 模块_单据(如 erp_purchase_order、fin_voucher),由后端代码注册,全局唯一 |
| 模板 Template | 某个 billType 的一套版式。同一 billType 可建多套(默认模板唯一),内容存于 infra_print_template 表 |
| 模式 mode | simple 简单配置(JSON 勾选式)/ html 源码模式(HTML + {{}} 占位符) |
| 变量 Variable | 模板可引用的数据字段,分三组:bill 单头、items 明细行、system 系统变量 |
| 系统变量 | 打印中心统一注入的 5 个变量:租户名称、打印时间、打印人、单号二维码、大写金额 |
| 默认模板 | 多模板时弹窗自动选中、直接打印时优先使用的那套;同 billType 内唯一,通过「设默认」切换 |
| 兜底版式 | 该 billType 一个模板都没有时,系统自动生成的通用版式(单头前 24 字段两列 + 明细全列 + 合计 + 签字栏),保证任何单据都能打 |
1.4 与其他打印功能的边界
系统里还有几套独立的打印实现,不要与打印中心混淆:
| 功能 | 入口 | 是否用打印中心模板 |
|---|---|---|
| 自定义打印(本手册) | 各业务单据列表行内【打印】按钮,共 31 处 | 是 |
| BPM 流程审批单打印 | 流程详情页打印弹窗(模板配在流程模型上) | 否,独立 HTML 模板 |
| WMS 四种单据专用打印页 | 仓储模块出库/入库/盘点/移库 | 否,独立实现 |
| 资产条码标签打印 | AMS 资产管理(条码/二维码标签) | 否,独立实现 |
判断方法:打印按钮打开后跳转到 /print/preview 新窗口页 = 打印中心;弹窗或组件内直接出内容 = 独立实现。
1.5 角色分工
| 角色 | 用到的能力 |
|---|---|
| 业务员 | 只在业务单据页点【打印】→ 选模板 → 预览 → 打印(见第二章) |
| 配置员/管理员 | 模板管理页建模板、设计器调版式、设默认、复制(需要菜单 + 按钮权限,见第三章) |
| 开发人员 | 新单据类型接入打印中心(见第八章) |
