Odoo 14 POS模块:如何通过JavaScript获取订单对象的ticket_number字段值并显示在凭证界面
我来帮你搞定Odoo 14 POS凭证界面显示自定义ticket_number字段的问题,步骤很清晰,咱们一步步来:
第一步:确保订单对象能正确获取ticket_number或ID值
你已经通过models.load_fields加载了id和ticket_number字段,接下来需要扩展POS的Order模型,把这个字段传递到凭证渲染的环境中。修改你的JS文件:
odoo.define("custom_pos_order.models", function (require) { "use strict"; var models = require('point_of_sale.models'); var _super_order = models.Order.prototype; // 加载需要的字段(你已经写了,保留即可) models.load_fields('pos.order', ['id', 'ticket_number']); // 扩展Order模型,把ticket_number加入凭证渲染环境 models.Order = models.Order.extend({ get_receipt_render_env: function() { // 先调用父方法获取默认的渲染环境 var receipt_env = _super_order.get_receipt_render_env.apply(this, arguments); // 因为你的ticket_number和后台id关联,这里两种取值方式都可以 // 如果是已保存的订单,pos_order_id就是后台的记录ID,ticket_number也会同步过来 receipt_env.ticket_number = this.ticket_number || this.pos_order_id; return receipt_env; } }); });
第二步:修改凭证的QWeb模板,添加字段显示
接下来需要在POS的凭证模板里添加显示ticket_number的位置。创建一个XML文件(比如static/src/xml/pos_receipt_template.xml):
<?xml version="1.0" encoding="UTF-8"?> <templates id="template" xml:space="preserve"> <!-- 扩展默认的Receipt模板,在订单号下方添加票号 --> <t t-extend="Receipt"> <t t-jquery=".order-reference" t-operation="after"> <div class="ticket-number"> <strong>Ticket Number:</strong> <t t-esc="ticket_number"/> </div> </t> </t> </templates>
如果你想调整显示位置,只需要修改t-jquery的选择器,比如.pos-receipt是整个凭证容器,你可以选择合适的位置插入。
第三步:给字段加个简单样式(可选)
创建CSS文件static/src/css/style.css让显示更美观:
.ticket-number { margin: 8px 0; font-size: 14px; text-align: center; }
第四步:配置模块Manifest文件
最后确保你的模块__manifest__.py正确加载这些文件:
{ 'name': 'Custom POS Ticket Number', 'version': '1.0', 'depends': ['point_of_sale'], 'data': [ # 如果有其他视图文件可以加在这里 ], 'qweb': [ 'static/src/xml/pos_receipt_template.xml', ], 'css': [ 'static/src/css/style.css', ], 'js': [ 'static/src/js/models.js', ], 'installable': True, 'auto_install': False, }
额外说明
你提到在控制台找到了包含订单ID的对象,其实在POS的ReceiptScreen里,当前订单可以通过this.currentOrder获取,所以也可以通过扩展ReceiptScreen来传递值(不过上面的方法更简洁):
odoo.define("custom_pos_order.receipt", function (require) { "use strict"; var ReceiptScreen = require('point_of_sale.ReceiptScreen'); ReceiptScreen.include({ render_receipt: function() { var order = this.currentOrder; var receipt_env = order.get_receipt_render_env(); receipt_env.ticket_number = order.ticket_number || order.pos_order_id; return this._super(receipt_env); } }); });
这样配置完成后,重启Odoo服务、升级模块,结账后的凭证界面就会显示你的ticket_number字段啦!
内容的提问来源于stack exchange,提问作者southernegro
相关产品推荐
相关产品推荐

