Odoo 17 POS缺货商品点击即提示并禁止选中求助
Odoo 17 POS 缺货商品即时限制方案
修改思路
将原付款阶段的库存检查逻辑,前移至商品添加/数量修改环节,通过补丁覆盖POS核心交互方法,实现点击缺货商品时立即弹窗警告并禁止添加,同时防止手动调整数量绕过限制。
完整代码实现
import { patch } from '@web/core/utils/patch'; import { ErrorPopup } from '@point_of_sale/app/errors/popups/error_popup'; import { ProductScreen } from '@point_of_sale/app/screens/product_screen/product_screen'; import { Orderline } from '@point_of_sale/app/models/orderline'; import { _t } from '@web/core/l10n/translation'; // 补丁1:点击商品时检查库存,禁止缺货商品加入订单 patch(ProductScreen.prototype, { async add_product(product, options) { const posConfig = this.env.services.pos.config; if (posConfig.restrict_zero_qty && product.type === 'product') { if (product.qty_available <= 0) { this.env.services.pos.popup.add(ErrorPopup, { title: _t('商品缺货'), body: _t(`商品 "${product.display_name}" 已缺货,无法添加到订单。`), }); return; } } await super.add_product(product, options); }, }); // 补丁2:阻止手动修改订单行数量添加缺货商品 patch(Orderline.prototype, { async set_quantity(quantity, keep_price) { const product = this.product; const posConfig = this.env.services.pos.config; if (posConfig.restrict_zero_qty && product.type === 'product') { if (product.qty_available <= 0 && quantity > 0) { this.env.services.pos.popup.add(ErrorPopup, { title: _t('商品缺货'), body: _t(`商品 "${product.display_name}" 已缺货,无法修改数量。`), }); return; } } await super.set_quantity(quantity, keep_price); }, });
代码说明
- 商品添加拦截:覆盖
ProductScreen的add_product方法(POS点击商品触发的核心逻辑),提前校验库存,缺货则终止添加流程并弹窗提示。 - 数量修改拦截:覆盖
Orderline的set_quantity方法,防止用户手动调整订单行数量,将缺货商品重新加入订单。 - 兼容原配置开关:保留
restrict_zero_qty配置项,仅当POS配置开启该限制时,逻辑才会生效。 - 遵循Odoo 17规范:使用官方提供的
patch工具、弹窗组件及翻译函数,确保代码适配版本要求。
内容的提问来源于stack exchange,提问作者afrah naaz
相关产品推荐
相关产品推荐

