Magento 2.4.2后台编辑订单提示‘请求数量不可用’问题求助
解决Magento 2.4.2后台编辑订单时零库存商品阻止编辑的问题
问题核心
Magento 2.4.2默认逻辑中,只要订单内存在可售数量为0且订单项数量为1的商品,管理员后台编辑订单时会直接触发“请求数量不可用”错误,导致无法修改订单的任何内容(哪怕只是改备注、地址)。我们需要调整验证逻辑:仅当主动修改该零库存商品的数量时才触发库存校验,其他编辑操作允许正常保存。
解决方案
通过重写核心验证类+调整前端校验逻辑实现,全程使用自定义模块避免修改核心代码:
1. 创建自定义模块(Vendor_OrderEditFix)
先搭建基础模块结构:
registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Vendor_OrderEditFix', __DIR__ );
etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Vendor_OrderEditFix" setup_version="1.0.0"> <sequence> <module name="Magento_Sales"/> <module name="Magento_CatalogInventory"/> </sequence> </module> </config>
2. 重写后端库存验证类
核心修改:仅当订单项数量被修改时,才执行库存校验。
etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Sales\Model\Order\Item\Validator\Quantity" type="Vendor\OrderEditFix\Model\Order\Item\Validator\Quantity"/> </config>
Model/Order/Item/Validator/Quantity.php
<?php namespace Vendor\OrderEditFix\Model\Order\Item\Validator; use Magento\CatalogInventory\Api\StockRegistryInterface; use Magento\Framework\Exception\LocalizedException; use Magento\Sales\Model\Order\Item; class Quantity extends \Magento\Sales\Model\Order\Item\Validator\Quantity { private $stockRegistry; public function __construct(StockRegistryInterface $stockRegistry) { $this->stockRegistry = $stockRegistry; parent::__construct($stockRegistry); } public function validate(Item $item) { // 获取原始订单中的商品数量 $originalQty = $item->getOrigData('qty_ordered'); $newQty = $item->getQtyOrdered(); // 数量未修改时,跳过库存校验 if ($originalQty == $newQty) { return; } // 数量修改后,执行原生库存校验逻辑 parent::validate($item); } }
3. 调整前端实时校验逻辑
后台编辑订单时前端会实时检查库存,需要同步修改该逻辑:
view/adminhtml/requirejs-config.js
var config = { map: { '*': { 'Magento_Sales/js/order/create/form': 'Vendor_OrderEditFix/js/order/create/form' } } };
view/adminhtml/web/js/order/create/form.js
define([ 'Magento_Sales/js/order/create/form' ], function (originalForm) { 'use strict'; return originalForm.extend({ checkQtyAvailability: function (item) { var originalQty = item.qty_ordered; var newQty = parseFloat(item.qty); // 数量未变化时,跳过前端库存检查 if (originalQty === newQty) { return; } // 执行原生前端校验逻辑 this._super(item); } }); });
4. 部署模块并清理缓存
执行以下命令使修改生效:
bin/magento setup:upgrade bin/magento setup:di:compile bin/magento setup:static-content:deploy -f bin/magento cache:flush
验证场景
- ✅ 不修改零库存商品数量,仅编辑订单备注、收货地址等信息,可正常保存
- ✅ 尝试修改零库存商品的数量时,会触发“请求数量不可用”错误,阻止保存
- ✅ 修改其他有库存商品的数量,正常执行库存校验
内容的提问来源于stack exchange,提问作者Anjaly K V
相关产品推荐
相关产品推荐

