Magento 创建发货不会更新项目发货数量,订单未完成
我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货 问题是,即使在创建装运后,订单状态仍保持为“正在处理”,而不是“完成”。 如果我从后端手动发货,则不会发生这种情况 我发现问题在于订单项目的发货数量没有更新,但在保存发货和订单后仍然为0 这是我正在使用的程序。 未发布任何异常,并且已正确创建装运Magento 创建发货不会更新项目发货数量,订单未完成,magento,magento2,shipping,orders,magento2.1,Magento,Magento2,Shipping,Orders,Magento2.1,我正在开发一个程序,该程序必须以编程方式为已经支付和开具发票的订单创建发货 问题是,即使在创建装运后,订单状态仍保持为“正在处理”,而不是“完成”。 如果我从后端手动发货,则不会发生这种情况 我发现问题在于订单项目的发货数量没有更新,但在保存发货和订单后仍然为0 这是我正在使用的程序。 未发布任何异常,并且已正确创建装运 $orders = $this->_orderCollectionFactory->create() ->addAttributeTo
$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?对我来说,它有效,否则我不会接受这个答案;)请参阅下面我的答案,以避免自己操作这些项目