Skip to content

一、功能概述与架构 ​

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 明细)
        │
        ▼
前端模板设计器 / 打印预览页(本地渲染引擎完成占位符替换、二维码生成、大写金额转换)

一次完整打印的时序:

  1. 用户在业务单据列表点【打印】;
  2. 前端按 billType 拉取该类型已启用的模板列表;
  3. 无模板 → 直接用兜底版式;一个模板 → 直接进预览;多个模板 → 弹窗让用户选(默认选中默认模板);
  4. 预览页并行拉取「模板内容 + 单据打印数据」,本地渲染成纸张版式;
  5. 用户点【打印】调起浏览器打印对话框,纸张尺寸由模板的 @page 规则自动设定。

关键点:模板渲染发生在浏览器端(前端内置 mini 模板引擎 + qrcode 二维码库 + 人民币大写转换),后端只提供数据,因此改模板无需重启服务。

1.3 核心概念 ​

概念说明
billType 单据类型打印的最小单位,命名规范 模块_单据(如 erp_purchase_order、fin_voucher),由后端代码注册,全局唯一
模板 Template某个 billType 的一套版式。同一 billType 可建多套(默认模板唯一),内容存于 infra_print_template 表
模式 modesimple 简单配置(JSON 勾选式)/ html 源码模式(HTML + {{}} 占位符)
变量 Variable模板可引用的数据字段,分三组:bill 单头、items 明细行、system 系统变量
系统变量打印中心统一注入的 5 个变量:租户名称、打印时间、打印人、单号二维码、大写金额
默认模板多模板时弹窗自动选中、直接打印时优先使用的那套;同 billType 内唯一,通过「设默认」切换
兜底版式该 billType 一个模板都没有时,系统自动生成的通用版式(单头前 24 字段两列 + 明细全列 + 合计 + 签字栏),保证任何单据都能打

1.4 与其他打印功能的边界 ​

系统里还有几套独立的打印实现,不要与打印中心混淆:

功能入口是否用打印中心模板
自定义打印(本手册)各业务单据列表行内【打印】按钮,共 31 处是
BPM 流程审批单打印流程详情页打印弹窗(模板配在流程模型上)否,独立 HTML 模板
WMS 四种单据专用打印页仓储模块出库/入库/盘点/移库否,独立实现
资产条码标签打印AMS 资产管理(条码/二维码标签)否,独立实现

判断方法:打印按钮打开后跳转到 /print/preview 新窗口页 = 打印中心;弹窗或组件内直接出内容 = 独立实现。

1.5 角色分工 ​

角色用到的能力
业务员只在业务单据页点【打印】→ 选模板 → 预览 → 打印(见第二章)
配置员/管理员模板管理页建模板、设计器调版式、设默认、复制(需要菜单 + 按钮权限,见第三章)
开发人员新单据类型接入打印中心(见第八章)