Magento 创建发货不会更新项目发货数量,订单未完成

Magento 创建发货不会更新项目发货数量,订单未完成,magento,magento2,shipping,orders,magento2.1,Magento,Magento2,Shipping,Orders,Magento2.1,我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货 问题是,即使在创建装运后,订单状态仍保持为“正在处理”,而不是“完成”。 如果我从后端手动发货,则不会发生这种情况 我发现问题在于订单项目的发货数量没有更新,但在保存发货和订单后仍然为0 这是我正在使用的程序。 未发布任何异常,并且已正确创建装运 $orders = $this->_orderCollectionFactory->create() ->addAttributeTo

我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货

问题是,即使在创建装运后,订单状态仍保持为“正在处理”,而不是“完成”。 如果我从后端手动发货,则不会发生这种情况

我发现问题在于订单项目的发货数量没有更新,但在保存发货和订单后仍然为0

这是我正在使用的程序。 未发布任何异常,并且已正确创建装运

    $orders = $this->_orderCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addFieldToFilter( 'entity_id' , array('in' => $ordersIdsArr) )
        ->setOrder('created_at', 'desc' );   

    foreach ($orders as $index => $order) {
        if ($order->canShip()) { 
           $shipment = $this->_convertOrder->toShipment($order);;
           $orderItems = $order->getItemsCollection()->addAttributeToSelect('*')->load();

           foreach ($orderItems as $orderItem) {
                if (! $orderItem->getQtyToShip() || $orderItem->getIsVirtual()) {
                    continue;
                }
                $qtyShipped = $orderItem->getQtyToShip();
                $shipmentItem = $this->_convertOrder->itemToShipmentItem($orderItem)->setQty($qtyShipped);
                $shipment->addItem($shipmentItem); 
            }
            $shipment->register();
            $shipment->getOrder()->setIsInProcess(true);

            try {

                $saveTransaction = $this->_transactionFactory->create();
                $saveTransaction->addObject($shipment)
                    ->addObject($shipment->getOrder());
                $saveTransaction->save();
            } catch (\Exception $e) {

            }
        }
    }

    /*..........*/

有线索吗

经过两天的努力,试图了解问题所在,研究模块销售的Magento核心类,我在Magento社区找到了一位使用Magento API并开发了

这是一年前的问题,但在以后的Magento版本中似乎没有解决,因此我决定采用与扩展相同的解决方案,从而强制订单项目的发货数量等于发货数量,然后再次保存订单

好吧,这只是一个补丁,不知道这是否是一个普遍的问题,但对我来说,这是唯一的办法,使这项工作,并最终获得“完成”状态的订单

我在第一次保存订单后添加了以下代码:

try {
        $saveTransaction = $this->_transactionFactory->create();
        $saveTransaction->addObject($shipment)
             ->addObject($shipment->getOrder());
        $saveTransaction->save();

        $itemsCheck = $order->getItemsCollection()->addAttributeToSelect('*')->load();
        foreach ($itemsCheck as $item) {
            if (! $item->getQtyToShip() || $item->getIsVirtual()) { 
                   continue;
            }
            $item->setQtyShipped($item->getQtyToShip());
            $item->save();
            $Norder = $shipment->getOrder()->load( $shipment->getOrder()->getId() );
            $Norder->save();
        }
    } 

希望能对其他人有所帮助

如果查看用于创建发货的SOAP API(Mage\u Sales\u Model\u Order\u shipping\u API::create(…),您会发现在同一事务中保存订单时会自动执行此操作

    /* @var $shipment Mage_Sales_Model_Order_Shipment */
    $shipment = $order->prepareShipment($itemsQty);
    if ($shipment) {
        $shipment->register();
        $shipment->addComment($comment, $email && $includeComment);
        if ($email) {
            $shipment->setEmailSent(true);
        }
        $shipment->getOrder()->setIsInProcess(true);
        try {
            $transactionSave = Mage::getModel('core/resource_transaction')
                ->addObject($shipment)
                ->addObject($shipment->getOrder())
                ->save();
            $shipment->sendEmail($email, ($includeComment ? $comment : ''));
        } catch (Mage_Core_Exception $e) {
            $this->_fault('data_invalid', $e->getMessage());
        }
        return $shipment->getIncrementId();
    }
我还注意到,我可以创建跟踪(Mage_Sales_Model_Order_shipping_Track)并在保存之前将其添加到装运,还可以将跟踪添加到事务:

    $track = Mage::getModel('sales/order_shipment_track')
        ->setNumber($trackingNumber)
        ->setCarrierCode($carrier)
        ->setTitle($serviceTitle);

    $shipment->addTrack($track);
    $transactionSave = Mage::getModel('core/resource_transaction')
        ->addObject($shipment)
        ->addObject($shipment->getOrder())
        ->addObject($track)
        ->save();

因此,无需自己进行Magento magic操作。

我也遇到了同样的问题,但在我的案例中,我发现在发货登记后,销售订单保存关系后,发货数量再次为0

因此,我的解决方案是向Magento\Sales\Model\Order\Shipping::register()添加一个插件,如下所示:

public function aroundRegister(
    \Magento\Sales\Model\Order\Shipment $subject,
    \Closure $proceed
) {
    if ($subject->getId()) {
        throw new \Magento\Framework\Exception\LocalizedException(
            __('We cannot register an existing shipment')
        );
    }

    $totalQty = 0;

    $orderItems = [];
    /** @var \Magento\Sales\Model\Order\Shipment\Item $item */
    foreach ($subject->getAllItems() as $item) {
        if ($item->getQty() > 0) {
            $item->register();
            $orderItems[] = $item->getOrderItem();
            if (!$item->getOrderItem()->isDummy(true)) {
                $totalQty += $item->getQty();
            }
        }
    }

    //make sure the updated Item be set in order so the save order relation will be correct
    $subject->getOrder()->setItems($orderItems);

    $subject->setTotalQty($totalQty);

    return $subject;
}

这个答案是否正常工作并更新订单@sissy?对我来说,它有效,否则我不会接受这个答案;)请参阅下面我的答案,以避免自己操作这些项目