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
相关产品推荐
相关产品推荐

