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

Odoo POS添加多行订单行失败及无this.pos设置订单方法问询

问题分析与解决方案

1. 仅能添加首个选中商品的修复

你当前代码直接克隆原订单行对象传入addLineToCurrentOrder的方式不兼容Odoo POS的订单行机制——POS订单行是Orderline类的实例,而非普通JSON对象,直接传递克隆的对象会丢失实例方法和内部状态,导致只有第一行能被正确处理。

正确做法是借助订单实例的add_product方法,基于商品实例和退款数量重新创建合法的订单行:

const filtered_lines = this.pos.get_order().lines;
// 用Map存储商品ID与对应退款数量,提升查找效率
const refundProductMap = new Map();

// 预处理退款行的商品ID和数量映射
for (const refundLine of refundLines) {
    const productId = refundLine[2].product_id;
    refundProductMap.set(productId, refundLine[2].qty);
}

// 创建新的退款订单
const refundOrder = this.pos.add_new_order();

// 批量添加符合条件的商品行
for (const line of filtered_lines) {
    const productId = line.product_id?.id || (line.product && line.product.id);
    if (productId && refundProductMap.has(productId)) {
        const refundQty = refundProductMap.get(productId);
        // 调用订单实例的add_product方法,自动创建合法的Orderline
        refundOrder.add_product(line.product, {
            quantity: refundQty,
            // 可按需复制原订单行的其他属性
            price: line.price,
            discount: line.discount,
        });
    }
}

2. 通过pos.order ID设置订单(无需修改this.pos全局状态)

可以实现,Odoo POS前端的所有订单都存储在this.pos.orders数组中,你可以通过后端pos.order的ID找到对应订单实例,直接调用实例方法操作,无需依赖全局当前订单的方法:

// 假设你已获取目标pos.order的后端ID
const targetOrderBackendId = 123;
// 从POS订单列表中定位目标订单
const targetOrder = this.pos.orders.find(order => order.id === targetOrderBackendId);

if (targetOrder) {
    // 示例:给目标订单添加商品行
    const targetProduct = this.pos.db.get_product_by_id(productId);
    targetOrder.add_product(targetProduct, { quantity: 2 });

    // 示例:修改订单其他属性(如客户、备注)
    const targetClient = this.pos.db.get_partner_by_id(clientId);
    targetOrder.set_client(targetClient);
    targetOrder.set_note("退款订单备注");
}

注意:前端订单实例的id对应后端pos.order的ID,仅当订单已同步到后端或前端已加载该订单时可通过此方式找到;前端新建的临时订单会使用负数临时ID,需注意区分处理。


内容的提问来源于stack exchange,提问作者Shohjaxon Qodiraliyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:20:05