You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:42:31