Odoo v15 POS自定义按钮打印额外PDF单据的实现思路咨询
Odoo v15 POS 自定义打印方案分析与收据数据来源说明
两种打印实现思路的可行性分析
1. 复用OrderReceipt.xml,通过t-if控制打印内容
完全可行,适合逻辑不复杂的场景。
- 优势:不用新增模板文件,所有打印逻辑集中在原有文件,初期维护成本低。
- 实现方式:在原有模板中新增一个判断变量(比如
print_mode),用t-if/t-elif区分两种打印内容:
在JS的打印按钮事件里,调用打印方法时传入对应的<!-- 原有收据内容 --> <t t-if="print_mode === 'receipt'"> ... 原有OrderReceipt模板代码 ... </t> <!-- 新增票据打印内容 --> <t t-if="print_mode === 'ticket'"> ... 票据相关内容,可使用RPC获取的origin数据 ... </t>print_mode参数,渲染模板时带上这个变量即可。 - 注意点:如果后续票据逻辑复杂,会导致模板代码臃肿,容易和原有收据的渲染逻辑冲突,增加后期维护难度。
2. 新建独立XML模板
同样完全可行,推荐用于逻辑独立的场景。
- 优势:模板逻辑完全分离,不会干扰原有收据的代码,后续修改、扩展更清晰,也方便单独调试。
- 实现方式:
- 新建比如
OrderTicket.xml文件,编写专属的票据打印模板,直接使用RPC获取的票据数据。 - 在POS的assets配置中引入这个新模板,确保前端能加载到。
- 在JS的「打印票据」按钮事件里,单独加载这个新模板,传入票据数据后触发打印。
- 新建比如
- 注意点:需要额外维护一个模板文件,但整体架构更清晰,适合长期迭代的需求。
POS收据信息的获取来源
POS前端打印收据时,核心数据来自前端的order对象:
- 这个对象包含了订单的所有核心信息:订单号(
order.name)、商品明细(order.lines)、支付记录(order.paymentlines)、客户信息(order.partner)、折扣、税额等,这些数据要么是前端创建订单时生成的,要么是从后端同步过来的。 - 打印时,Odoo会把
order对象的属性作为上下文传入模板,模板通过t-foreach、t-esc等指令渲染内容。 - 如果你需要额外的票据信息,通过
receipt.origin调用RPC获取后端数据后,只需把这些数据合并到打印的上下文对象中,就能在模板里直接使用。
内容的提问来源于stack exchange,提问作者DZEUF
相关产品推荐
相关产品推荐

