我正在开发一个程序,必须以编程方式为已付款和开具发票的订单创建货件。
问题是即使在创建货件后,订单状态仍然是“处理”而不是“完成”。 如果我从后端手动发货,则不会发生这种情况。
我发现问题在于订单商品的发货数量未更新,但在保存货件和订单后仍为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) {
}
}
}
/*..........*/
有任何线索吗?
答案 0 :(得分:3)
经过2天的努力,试图了解问题是什么,研究模块销售的Magento核心课程,我在Magento社区找到了一个有similar problems Magento API并开发了{{3}的人}}。
问题出现在一年前,但在Magento的后续版本中似乎没有解决,因此我决定采用与扩展相同的解决方案,因此迫使订单项的发货数量相等到发货数量,然后再次保存订单。
嗯,这只是一个补丁和dunno,如果这是一个普遍的问题,但对我而言,这是使这项工作的唯一方法,并最终获得“完成”状态的订单。
我在第一次保存订单后添加了此代码:
api.execute_kw(db, uid, pwd, 'res.country', 'search_read', [[]], {'fields': ['id', 'name'], 'context' :{'lang': "fr_FR"}})
希望它可以为其他人提供帮助。
答案 1 :(得分:0)
如果您查看用于创建货运的SOAP API(Mage_Sales_Model_Order_Shipment_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_Shipment_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魔术师。
答案 2 :(得分:0)
我遇到了同样的问题,但在我的情况下,我发现在发货登记后,销售订单再次保存关系,使 qty_shipped 为 0。
所以我的解决方案是向 Magento\Sales\Model\Order\Shipment::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;
}