创建装运不更新项目装运数量和订单不完整
Creating shipment does not update items shipped quantity and order is not complete
我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货。
问题是,即使在创建发货后,订单状态仍然是 'processing',而不是 'complete'。
如果我从后端手动发货,则不会发生这种情况。
我发现问题是订单商品的发货数量没有更新,保存发货和订单后仍然为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 社区上找到了 similar problems with Magento API and developed a patch 的人。
这个问题是一年前的,但是Magento的后续版本似乎没有解决,所以我决定采用与扩展相同的解决方案,因此强制订单商品的发货数量为等于要发货的数量,然后再次保存订单。
好吧,这只是一个补丁,不知道它是否是一个普遍问题,但对我来说,这是完成这项工作并最终获得状态 'Complete' 的订单的唯一方法。
我在第一次保存订单后添加了这段代码:
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_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 魔术。
我遇到了同样的问题,但在我的情况下,我发现在发货登记后,销售订单再次保存关系使 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;
}
我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货。
问题是,即使在创建发货后,订单状态仍然是 'processing',而不是 'complete'。 如果我从后端手动发货,则不会发生这种情况。
我发现问题是订单商品的发货数量没有更新,保存发货和订单后仍然为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 社区上找到了 similar problems with Magento API and developed a patch 的人。
这个问题是一年前的,但是Magento的后续版本似乎没有解决,所以我决定采用与扩展相同的解决方案,因此强制订单商品的发货数量为等于要发货的数量,然后再次保存订单。
好吧,这只是一个补丁,不知道它是否是一个普遍问题,但对我来说,这是完成这项工作并最终获得状态 'Complete' 的订单的唯一方法。
我在第一次保存订单后添加了这段代码:
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_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 魔术。
我遇到了同样的问题,但在我的情况下,我发现在发货登记后,销售订单再次保存关系使 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;
}