Magento 2 如何通过代码实现订单自动取消及现有代码问题排查
需求背景
若客户下单购买了3种不同商品,各自对应数量如下:
- 衬衫 2件
- 手表 1件
- 裤子 3件
客户会在不同时间点分别取消对应订单项,需求是当全部订单项都被取消后,自动将整笔订单的状态设置为已取消。
你提交的实现代码
if (isset($_POST['order'])) { $_orderCollectionFactory = $objectManager->create('\Magento\Sales\Model\ResourceModel\Order\CollectionFactory'); $collection = $_orderCollectionFactory->create() ->addFieldToSelect('*') ->addFieldToFilter('status', ['neq' => 'cancelled']); foreach ($collectionFactory as $order) { $items = $order->getAllVisibleItems(); foreach ($items as $items) { $totalitem = $totalitem + ($item['qty_canceled']); $itemcount = $order->getQtyOrdered(); if ($itemcount == ($totalitem)) { $order->setState("canceled"); $order->save(); } } } }
代码存在的问题汇总
- 遍历变量名错误:你创建的订单集合变量是
$collection,但遍历的时候用了未定义的$collectionFactory,直接会报致命错误,遍历不到任何订单数据。 - 订单项循环变量错误:第二层循环写的是
foreach ($items as $items),循环前后变量名都是$items,会覆盖原订单项集合,而且后续取值用的是$item['qty_canceled'],根本没有定义过$item变量,直接报变量未定义错误。 - 累加变量未初始化、未重置:统计总取消量的
$totalitem在使用前没有初始化为0,而且每次遍历新订单时没有重置数值,多个订单的取消量会叠加,统计结果完全错误。 - 判断逻辑位置错误:判断总取消量等于总下单量的代码放在了订单项循环内部,不需要等所有订单项统计完成,只要累加过程中数值匹配就会标记订单取消,逻辑完全不符合需求。
- 拼写不一致问题:筛选订单状态时用的拼写是
cancelled,设置状态时用的拼写是canceled,拼写不一致可能导致状态判断、设置出错。 - Magento开发规范问题:直接调用
$objectManager创建对象不符合Magento依赖注入的开发规范,版本升级时容易出现兼容问题;同时调用setState仅设置了订单状态,没有同步设置对应状态标签、也没有添加操作备注,后续无法追溯订单自动取消的记录。 - 性能问题:没有给订单集合添加分页限制,订单量较大时一次性拉取所有未取消订单会占用大量内存,严重时会导致程序崩溃。
- 冗余代码问题:获取订单总下单量的
$itemcount = $order->getQtyOrdered()写在了订单项循环内部,每次遍历订单项都会重复执行,属于无效的冗余代码。
内容的提问来源于stack exchange,提问作者Aniket Singh
相关产品推荐
相关产品推荐

