单据打印功能手册
单据打印用于把业务表单、流程记录和明细表数据合并成可打印的审批单。本文以「出差申请单」为例,按实际页面截图说明从数据模型导入、流程模型配置、模板设计到页面打印按钮展示的完整链路。
适用场景:
- OA、HRM、合同、项目等业务单据需要审批后归档或线下签批。
- 业务表单包含主表字段和一张或多张明细表,例如出差行程、报销明细、用品明细。
- 打印内容需要包含单据编号、申请人、申请日期、所属部门、流程记录等通用信息。
功能边界
| 能力 | 说明 |
|---|---|
| 主表字段 | 来自流程模型绑定的代码生成主表,例如 oa_business_trip |
| 明细表 | 来自流程模型绑定的代码生成明细表,例如 oa_business_trip_item |
| 通用字段 | 系统自动提供单据编号、申请人、申请日期、流程名称、打印人、打印时间等 |
| 流程记录 | 系统自动读取流程审批记录,并在打印模板中按表格展示 |
| 打印入口 | 业务详情页底部展示「打印」按钮,点击后打开打印预览弹窗 |
一、导入数据模型
进入「基础设施 -> 代码生成」,确认业务主表和明细表已经导入代码生成器。以出差申请为例,需要至少包含:

| 表 | 用途 | 示例说明 |
|---|---|---|
oa_business_trip | 主表 | 出差申请单,承载申请人、出差事由、开始日期、结束日期、预计费用等字段 |
oa_business_trip_item | 明细表 | 出差申请行程明细,承载出发城市、到达城市、开始日期、结束日期、交通方式、备注等字段 |
如果列表中没有对应表,点击「导入」从数据库导入。导入后重点检查:
- 表名和表描述是否准确,表描述会作为后续下拉框和打印字段的中文来源。
- 实体名称是否和当前业务模块一致,例如
BusinessTrip、BusinessTripItem。 - 主表和明细表都已导入。只导入主表时,打印模板左侧不会出现明细表卡片。
二、配置流程模型
进入「流程中心 -> 流程设置 -> 流程模型」,打开目标流程的「修改流程」页面。

在「表单设计」步骤中按业务表单方式配置:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 表单类型 | 业务表单 | 使用业务模块自己的详情页和保存逻辑 |
| 表单提交路由 | /oa/trip/trip-apply-info | 发起流程时打开的前端路由 |
| 表单查看地址 | /oa/trip/tripapply/info/index.vue | 审批详情或流程详情读取的组件地址 |
| 关联数据模型 | 出差申请单(oa_business_trip) | 打印主表字段、字段权限等能力的数据来源 |
| 明细表 | 出差申请行程明细(oa_business_trip_item) | 打印模板中「明细表」区域的数据来源 |
这里的「关联数据模型」和「明细表」不是展示用备注,而是后续打印模板字段面板的数据来源。保存后,模板编辑器会读取这些表的字段,自动生成「主表字段」和「明细表」。
三、开启自定义打印模板
继续配置流程节点和审批规则后,进入「更多设置」步骤。

- 找到「自定义打印模板」。
- 打开开关。
- 点击「编辑模板」。
系统会打开「自定义模板」弹窗。若第一次启用,系统会生成一份基础模板,包含单据编号、打印时间、打印人员、申请人、申请日期、所属单位、所属部门和流程记录。
四、设计打印模板
模板编辑器分为左侧字段面板和右侧编辑区。

左侧字段分组:
| 分组 | 来源 | 常见字段 |
|---|---|---|
| 通用字段 | 流程实例和当前打印上下文 | 单据编号、申请人、申请日期、所属单位、所属部门、流程名称、打印人、打印时间 |
| 主表字段 | 关联数据模型主表 | 出差事由、出差开始日期、出差结束日期、预计费用、备注 |
| 明细表 | 已选择的代码生成明细表 | 出差申请行程明细,可配置显示列和列顺序 |
| 特殊块 | 流程引擎 | 流程记录 |
推荐设计方式:
- 先保留默认模板的表头字段,例如
@流程名称、@单据编号、@打印时间、@打印人。 - 在正文表格中插入主表字段,例如
@出差事由、@出差开始日期、@出差结束日期、@预计费用。 - 在「明细表」区域选择「出差申请行程明细」,点击「配置插入」,勾选需要打印的列并调整顺序。
- 插入「流程记录」,用于展示发起人、审批节点、审批意见和自动通过说明。
- 点击「确认」保存模板内容。
明细表建议只保留客户阅读需要的列,例如出发城市、到达城市、开始日期、结束日期、交通方式、备注。内部字段、租户字段、创建人、更新时间等审计字段默认不参与展示。
五、发布流程
模板保存后,回到流程模型页面,点击「保存」或「发布」。
注意事项:
- 新模板需要随流程模型一起发布后,业务页面才能读取到最新打印配置。
- 如果流程已经被发起过,历史流程实例可能仍按旧流程定义展示;建议用新发布版本重新发起一条单据验证。
- 修改模板后,应再次保存流程模型。只关闭弹窗但不保存流程模型,可能导致模板没有持久化。
六、页面打印按钮展示
打开业务详情页,例如:
/oa/trip/trip-apply-info?id=6当该单据已经关联流程实例,并且流程定义启用了自定义打印模板时,页面底部会显示「打印」按钮。点击后打开「打印流程」弹窗,预览内容包含:

- 单据标题,例如「出差申请单」。
- 单据编号、打印时间、打印人员。
- 申请人、申请日期、所属单位、所属部门。
- 业务主表字段,例如出差事由、出差日期、预计费用。
- 明细表数据,例如两条行程明细。
- 流程记录,例如发起人节点、审批通过、自动通过说明。
确认预览无误后,点击弹窗右下角「打印」调用浏览器打印。
七、验收清单
| 检查项 | 通过标准 |
|---|---|
| 数据模型 | 代码生成列表中存在主表和明细表 |
| 流程表单 | 流程模型选择「业务表单」,提交路由和查看地址正确 |
| 数据绑定 | 「关联数据模型」选择主表,「明细表」选择需要打印的明细表 |
| 模板字段 | 编辑模板时能看到通用字段、主表字段、明细表和流程记录 |
| 流程发布 | 修改后已保存并发布流程 |
| 业务页面 | 详情页底部展示「打印」按钮 |
| 打印预览 | 主表、明细表、流程记录都有真实数据 |
常见问题
编辑模板时没有主表字段
通常是流程模型没有绑定「关联数据模型」,或者对应表没有导入代码生成器。先到「基础设施 -> 代码生成」确认主表已导入,再回到流程模型「表单设计」保存绑定。
编辑模板时没有明细表
检查「表单设计」步骤里的「明细表」是否已选择。明细表需要先导入代码生成器,然后在流程模型里绑定;只在数据库存在但未导入代码生成器时,模板编辑器不会展示。
业务详情页没有打印按钮
重点检查三处:
- 流程模型「更多设置」是否开启「自定义打印模板」。
- 模板是否已确认保存,并且流程模型是否已发布。
- 当前业务详情是否已经关联流程实例。未发起流程或没有流程实例编号的草稿单据,通常不会展示流程打印入口。
打印预览有字段但值为空
先确认当前单据 ID 是否正确,再检查业务表数据是否已经保存。主表字段来自业务单据,流程记录来自流程实例,两个数据源都必须存在。
修改模板后页面仍显示旧内容
保存模板后需要保存或发布流程模型。若测试的是旧流程实例,建议重新发起一条单据验证新模板。
二开参考
当前流程自定义打印链路主要涉及:
| 位置 | 说明 |
|---|---|
ruoyi-office-vben/apps/web-antd/src/views/bpm/model/form/modules/form-design.vue | 业务表单关联数据模型和明细表 |
ruoyi-office-vben/apps/web-antd/src/views/bpm/model/form/modules/extra-setting.vue | 自定义打印模板开关、字段 Schema 构建 |
ruoyi-office-vben/apps/web-antd/src/views/bpm/model/form/modules/custom-print-template.vue | 模板编辑器、字段插入、明细表配置 |
ruoyi-office-vben/apps/web-antd/src/views/bpm/processInstance/detail/modules/process-print.vue | 打印预览与浏览器打印 |
ruoyi-office/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/service/print/BpmProcessPrintServiceImpl.java | 打印数据和打印 Schema 聚合 |
如果要扩展独立业务类型、hiprint 模板列表或移动端打印入口,可继续参考 BPM 打印平台。
