Преглед изворни кода

重构 common/components/delivery/platform/shunfeng/CallBackHandler.php:

主要改动是将重复的逻辑提取到了一个新的私有方法 processOrderCallback 中,并重构了原有的五个处理方法以调用该公共方法。

优化详情
1.新增 processOrderCallback 方法:
	封装了公共流程:日志记录、参数校验、查找配送订单、状态转换、更新配送订单状态、更新主订单(批发/零售)状态。
	支持传入 extraHandler 回调函数,用于处理特定场景下的额外逻辑(如确认送达、取消发货等)。
	统一了错误处理和日志格式。

2.重构原有方法:
	handleRiderStatus、handleRiderRecall:直接调用公共方法。
	handleOrderComplete:传入回调,处理批发订单的“确认送达”逻辑 (OrderClass::confirmReach)。
	handleSfCancel、handleRiderException:传入回调,处理批发订单的“取消发货”逻辑 (OrderClass::cancelOrderSend)。

3.代码清理:
	移除了 handleRiderStatus 中原本被注释掉的大段代码,使代码更整洁。
	修复了部分原有的缩进不一致问题。
shizhongqi пре 7 месеци
родитељ
комит
02affde868
1 измењених фајлова са 66 додато и 237 уклоњено
  1. 66 237
      common/components/delivery/platform/shunfeng/CallBackHandler.php

+ 66 - 237
common/components/delivery/platform/shunfeng/CallBackHandler.php

@@ -81,138 +81,101 @@ class CallBackHandler
     }
     
     /**
-     * 处理配送状态更改回调
-     * 状态包括:10-配送员接单/改派;12-配送员到店;15-配送员配送中
+     * 通用订单回调处理逻辑
      * 
      * @param array $data 回调数据
-     * @return bool 处理结果
+     * @param string $logDesc 日志描述
+     * @param string $orderIdField 订单ID字段名
+     * @param callable|null $extraHandler 额外处理逻辑,参数为 ($order, $sendStatus, $isGhs)
+     * @return bool
      */
-    private function handleRiderStatus($data)
+    private function processOrderCallback($data, $logDesc, $orderIdField = 'sf_order_id', $extraHandler = null)
     {
-        Yii::info('顺丰配送状态更改回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-        
-        // 验证必要参数
-        if (empty($data['sf_order_id']) || !isset($data['order_status'])) {
-            Yii::error('顺丰配送状态回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-            return false;
-        }
-        
-        $orderId = $data['sf_order_id'];
-        
-        // 查找配送订单
-        $deliveryOrder = $this->getDeliveryOrder($orderId);
-        if (!$deliveryOrder) {
-            Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
-            return false;
-        }
-        
-        // 更新配送订单信息
-        // $updateData = [];
-        // 更新配送员信息
-        // $updateData['riderName'] = $data['operator_name'];
-        // $updateData['riderPhone'] = $data['operator_phone'];
-        // $updateData['riderLng'] = $data['rider_lng'];
-        // $updateData['riderLat'] = $data['rider_lat'];
-        // $updateData['statusDesc'] = $data['status_desc'];
-        // $updateData['pushTime'] = date('Y-m-d H:i:s', $data['push_time']);
-
-        $orderStatus = $data['order_status'];
-        // 转换顺丰订单状态到系统状态
-        $sendStatus = $this->convertOrderSendStatus($orderStatus);
-        $orderStatus = $this->convertOrderStatus($orderStatus);
-
-        if ($sendStatus !== null) {
-            // 更新配送订单
-            $deliveryOrder->orderStatus = $sendStatus;
-            $deliveryOrder->save();
-            
-            // 更新主订单的配送状态
-            if(isset($deliveryOrder->ghsOrderId)){ // 批发
-                util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
-
-                $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
-                if ($order) {
-                    $order->sendStatus = $sendStatus;
-                    $order->status = $orderStatus;
-                    $order->save();
-                }
-            }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
-                util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
+        Yii::info($logDesc . ': ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
 
-                $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
-                if ($order) {
-                    $order->sendStatus = $sendStatus;
-                    $order->status = $orderStatus;
-                    $order->save();
-                }
-            }
-        } else {
-            return false;
-        }
-        
-        return true;
-    }
-    
-    /**
-     * 处理订单完成回调
-     * 订单状态:17-配送员点击完成
-     * 
-     * @param array $data 回调数据
-     * @return bool 处理结果
-     */
-    private function handleOrderComplete($data)
-    {
-        Yii::info('顺丰订单完成回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-        
-        // 验证必要参数
-        if (empty($data['sf_order_id'])) {
-            Yii::error('顺丰订单完成回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
+        if (empty($data[$orderIdField]) || !isset($data['order_status'])) {
+            Yii::error($logDesc . '参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
             return false;
         }
+
+        $orderId = $data[$orderIdField];
         
-        $orderId = $data['sf_order_id'];
         // 查找配送订单
         $deliveryOrder = $this->getDeliveryOrder($orderId);
         if (!$deliveryOrder) {
-            Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
+            Yii::error('顺丰配送订单不存在: ' . $orderIdField . '=' . $orderId, 'shunfeng-callback');
             return false;
         }
-        
+
         $sendStatus = $this->convertOrderSendStatus($data['order_status']);
         $orderStatus = $this->convertOrderStatus($data['order_status']);
+
         if ($sendStatus === null) {
             Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
             return false;
         }
+
+        // 更新配送订单
         $deliveryOrder->orderStatus = $sendStatus;
         $deliveryOrder->save();
-        
-        // 更新主订单状态为已送达
-        if(isset($deliveryOrder->ghsOrderId)){ // 批发
-            util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
-            $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
+
+        // 更新主订单
+        if (isset($deliveryOrder->ghsOrderId)) { // 批发
+            util::checkRepeatCommit('ghs_' . $deliveryOrder->ghsOrderId . '_' . $sendStatus, 2);
+            $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
             if ($order) {
                 $order->sendStatus = $sendStatus;
                 $order->status = $orderStatus;
                 $order->save();
 
-                // 确认送达,更新主订单状态
-                if ($sendStatus == 5) {
-                    OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
+                if ($extraHandler) {
+                    call_user_func($extraHandler, $order, $sendStatus, true);
                 }
             }
-        }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
-            util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
+        } elseif (isset($deliveryOrder->hdOrderId)) { // 零售
+            util::checkRepeatCommit('hd_' . $deliveryOrder->hdOrderId . '_' . $sendStatus, 2);
             $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
             if ($order) {
                 $order->sendStatus = $sendStatus;
                 $order->status = $orderStatus;
                 $order->save();
+                
+                if ($extraHandler) {
+                    call_user_func($extraHandler, $order, $sendStatus, false);
+                }
             }
         }
         
         return true;
     }
+
+    /**
+     * 处理配送状态更改回调
+     * 状态包括:10-配送员接单/改派;12-配送员到店;15-配送员配送中
+     * 
+     * @param array $data 回调数据
+     * @return bool 处理结果
+     */
+    private function handleRiderStatus($data)
+    {
+        return $this->processOrderCallback($data, '顺丰配送状态更改回调');
+    }
+    
+    /**
+     * 处理订单完成回调
+     * 订单状态:17-配送员点击完成
+     * 
+     * @param array $data 回调数据
+     * @return bool 处理结果
+     */
+    private function handleOrderComplete($data)
+    {
+        return $this->processOrderCallback($data, '顺丰订单完成回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
+            if ($isGhs && $sendStatus == 5) {
+                OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']);
+            }
+        });
+    }
     
     /**
      * 处理顺丰原因取消回调
@@ -223,56 +186,11 @@ class CallBackHandler
      */
     private function handleSfCancel($data)
     {
-        Yii::info('顺丰取消订单回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-        
-        // 验证必要参数
-        if (empty($data['sf_order_id'])) {
-            Yii::error('顺丰取消回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-            return false;
-        }
-        
-        $orderId = $data['sf_order_id'];
-        // 查找配送订单
-        $deliveryOrder = $this->getDeliveryOrder($orderId);
-        if (!$deliveryOrder) {
-            Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
-            return false;
-        }
-        
-        $sendStatus = $this->convertOrderSendStatus($data['order_status']);
-        $orderStatus = $this->convertOrderStatus($data['order_status']);
-        if ($sendStatus === null) {
-            Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
-            return false;
-        }
-        $deliveryOrder->orderStatus = $sendStatus;
-        $deliveryOrder->save();
-        
-        // 更新主订单状态为取消
-        if(isset($deliveryOrder->ghsOrderId)) { // 批发
-            util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
-            $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
-            if($order) {
-                $order->sendStatus = $sendStatus;
-                $order->status = $orderStatus;
-                $order->save();
-
-                // 更新主订单状态为取消
-                if($sendStatus == -1) {
-                    OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
-                }
+        return $this->processOrderCallback($data, '顺丰取消订单回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
+            if ($isGhs && $sendStatus == -1) {
+                OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
             }
-        }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
-            util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
-            $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
-            if ($order) {
-            $order->sendStatus = $sendStatus;
-            $order->status = $orderStatus;
-            $order->save();
-            }
-        }
-        
-        return true;
+        });
     }
     
     /**
@@ -284,56 +202,11 @@ class CallBackHandler
      */
     private function handleRiderException($data)
     {
-        Yii::info('顺丰订单异常回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-        
-        // 验证必要参数
-        if (empty($data['sf_order_id'])) {
-            Yii::error('顺丰异常回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-            return false;
-        }
-        
-        $orderId = $data['sf_order_id'];
-        // 查找配送订单
-        $deliveryOrder = $this->getDeliveryOrder($orderId);
-        if (!$deliveryOrder) {
-            Yii::error('顺丰配送订单不存在: sf_order_id=' . $orderId, 'shunfeng-callback');
-            return false;
-        }
-        
-        $sendStatus = $this->convertOrderSendStatus($data['order_status']);
-        $orderStatus = $this->convertOrderStatus($data['order_status']);
-        if ($sendStatus === null) {
-            Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
-            return false;
-        }
-        $deliveryOrder->orderStatus = $sendStatus;
-        $deliveryOrder->save();
-
-        // 更新主订单状态为异常
-        if(isset($deliveryOrder->ghsOrderId)) { // 批发
-            util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
-            $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status');
-            if($order) {
-                $order->sendStatus = $sendStatus;
-                $order->status = $orderStatus;
-                $order->save();
-
-                // 更新主订单状态为异常
-                if($sendStatus == -2) {
-                    OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
-                }
+        return $this->processOrderCallback($data, '顺丰订单异常回调', 'sf_order_id', function($order, $sendStatus, $isGhs) {
+            if ($isGhs && $sendStatus == -2) {
+                OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']);
             }
-        }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
-            util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
-            $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
-            if ($order) {
-                $order->sendStatus = $sendStatus;
-                $order->status = $orderStatus;
-                $order->save();
-            }
-        }
-        
-        return true;
+        });
     }
     
     /**
@@ -345,51 +218,7 @@ class CallBackHandler
      */
     private function handleRiderRecall($data)
     {
-        Yii::info('顺丰骑士撤单回调: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-        
-        // 验证必要参数
-        if (empty($data['shop_order_id'])) {
-            Yii::error('顺丰撤单回调参数不完整: ' . json_encode($data, JSON_UNESCAPED_UNICODE), 'shunfeng-callback');
-            return false;
-        }
-        
-        $shopOrderId = $data['shop_order_id'];
-        // 查找配送订单
-        $deliveryOrder = $this->getDeliveryOrder($shopOrderId);
-        if (!$deliveryOrder) {
-            Yii::error('顺丰配送订单不存在: shop_order_id=' . $shopOrderId, 'shunfeng-callback');
-            return false;
-        }
-        
-        $sendStatus = $this->convertOrderSendStatus($data['order_status']);
-        $orderStatus = $this->convertOrderStatus($data['order_status']);
-        if ($sendStatus === null) {
-            Yii::error('顺丰订单状态转换失败: ' . $data['order_status'], 'shunfeng-callback');
-            return false;
-        }
-        $deliveryOrder->orderStatus = $sendStatus;
-        $deliveryOrder->save();
-
-        // 更新主订单状态为派单中
-        if(isset($deliveryOrder->ghsOrderId)) { // 批发
-            util::checkRepeatCommit('ghs_'.$deliveryOrder->ghsOrderId.'_'.$sendStatus, 2);
-            $order = OrderClass::getById($deliveryOrder->ghsOrderId, true);
-            if($order) {
-                $order->sendStatus = $sendStatus;
-                $order->status = $orderStatus;
-                $order->save();
-            }
-        }elseif(isset($deliveryOrder->hdOrderId)){ // 零售
-            util::checkRepeatCommit('hd_'.$deliveryOrder->hdOrderId.'_'.$sendStatus, 2);
-            $order = HdOrderClass::getById($deliveryOrder->hdOrderId, true);
-            if ($order) {
-                $order->sendStatus = $sendStatus;
-                $order->status = $orderStatus;
-                $order->save();
-            }
-        }
-        
-        return true;
+        return $this->processOrderCallback($data, '顺丰骑士撤单回调', 'shop_order_id');
     }
 
     /**