2017-10-04 52 views
3

我正在開發一個程序,它必須以編程方式爲已支付和開具發票的訂單創建裝運。創建裝運不會更新物品的裝運數量和訂單不完整

問題是,即使在創建發貨後,訂單狀態仍然是「處理」而不是「完成」。 如果手動從後端運送,則不會發生這種情況。

我發現問題在於訂單商品的發貨數量未更新,但在保存裝運和訂單後仍爲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) { 

      } 
     } 
    } 

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

任何線索?

回答

2

經過兩天的努力,試圖瞭解問題所在,研究Magento核心類的模塊銷售,我發現有人在Magento社區誰擁有Magento API similar problems和開發patch

問題出自一年前,但似乎沒有在後續版本的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(); 
     } 
    } 

希望它可以成爲對別人的幫助。

相關問題