2

我在 Magento 1.7.0.2 上。我使用“货到付款”作为我的付款方式。我会准确地告诉你我在任何订单上遵循的步骤。下订单时(数量减少 1 件),我为它创建一个装运,如果客户支付了订单总价。我为该订单创建发票。

我的问题,如果下订单(数量减少 1 件),我会为此订单创建一个发货。如果客户拒绝付款,我打开这个订单并“取消”它,在这种情况下,“数量”没有增加,所以我怎样才能让它增加?

4

2 回答 2

2

如果订单状态为处理中

为“order_cancel_before”创建一个带有观察者的自定义模块(参见示例@Change Magento default status for duplicate products change<catalog_model_product_duplicate> to <order_cancel_before>

因为<order_cancel_before>在 app/code/core/Mage/Sales/Model/Order.php 中没有定义

您可以覆盖/重写订单模型类,例如http://phprelated.myworks.ro/how-to-override-rewrite-model-class-in-magento/

在你的本地模块做

public function cancel()
{
    if ($this->canCancel()) {
        Mage::dispatchEvent('order_cancel_before', array('order' => $this));
        $this->getPayment()->cancel();
        $this->registerCancellation();

        Mage::dispatchEvent('order_cancel_after', array('order' => $this));
    }

    return $this;
}

或者您可以在模型中创建一个新方法 increaseProductQty() 并将下面的代码复制到其中(这样您就不需要观察者了)。然后将 Mage::dispatchEvent('order_cancel_before'... 行替换为 $this->increaseProductQty()

在您的观察者方法中(伪代码)

$curr_date = date('Y-m-d H:i:s');
$order = $observer->getEvent()->getOrder();

foreach ($order->getItemsCollection() as $item) 
{ 
    $productId  = $item->getProductId();
    $qty = $item->getQty();

    // you need to check order status to make sure it processing
    //$order->getStatus() (assuming you are canceling entire order)
    //$order->getPayment();

    $product = Mage::getModel('catalog/product')->load($product_id);
    $stock_obj = Mage::getModel('cataloginventory/stock_item')->load($product_id);
    $stockData = $stock_obj->getData();
    $product_qty_before = (int)$stock_obj->getQty();
    $product_qty_after = (int)($product_qty_before + $qty); 
    $stockData['qty'] = $product_qty_after;

    $productInfoData = $product->getData();
    $productInfoData['updated_at'] = $curr_date;
    $product->setData($productInfoData);
    $product->setStockData($stockData);
    $product->save();
}

如果您在更新库存时遇到问题,请参阅在 Magento 1.7 中添加新产品时设置默认产品值

参考http://pragneshkaria.com/programatically-change-products-quantity-after-order-cancelled-magento/

如果订单状态为待处理

看看系统>配置>库存

取消订单时将项目的状态设置为有库存— 控制如果订单被取消,待处理订单中的产品是否自动返回库存。范围:商店视图。

阅读更多 @

如何管理 Magento 商店库存?

管理员:系统 → 配置 → 库存选项卡

于 2012-11-11T11:05:20.033 回答
1

感谢 RS,因为他对我的帮助越来越多。

我遵循了 RS 回复https://stackoverflow.com/a/13330543/1794834上的所有说明,并且只更改了观察者代码。这是在 Magento 1.7.0.2 上与我一起工作的观察者代码。

$curr_date = date('Y-m-d H:i:s');
$order = $observer->getEvent()->getOrder();

foreach ($order->getItemsCollection() as $item) 
{ 
    $productId  = $item->getProductId();
    $qty = (int)$item->getQtyOrdered();
    $product = Mage::getModel('catalog/product')->load($productId);
    $stock_obj = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
    $stockData = $stock_obj->getData();
    $product_qty_before = (int)$stock_obj->getQty();
    $product_qty_after = (int)($product_qty_before + $qty); 
    $stockData['qty'] = $product_qty_after;
    /*
     * it may be case that admin has enabled product add in stock, after product sold,
     * he set is_in_stock = 0 and if order cancelled then we need to update only qty not is_in_stock status.
     * make a note of it
     */
    if($product_qty_after != 0) {
        $stockData['is_in_stock'] = 1;
    }else{
        $stockData['is_in_stock'] = 0;
    }

    $productInfoData = $product->getData();
    $productInfoData['updated_at'] = $curr_date;
    $product->setData($productInfoData);
    $product->setStockData($stockData);
    $product->save();
}
于 2012-11-12T13:07:06.740 回答