2017-10-04 53 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(); 
     } 
    } 

希望它可以成为对别人的帮助。

相关问题