mapEventTypeToOrderStatus($eventType); if ($orderStatus === null) { Yii::warning(sprintf('货拉拉事件未配置状态映射: event_type=%s, order_display_id=%s', $eventType, $orderDisplayId), 'huolala-callback'); return true; } $deliveryOrder = GhsDeliveryOrderClass::getByCondition([ 'deliveryId' => 'huolala', 'orderId' => $orderDisplayId, ], true); if (!$deliveryOrder) { Yii::error('货拉拉配送订单不存在: order_display_id=' . $orderDisplayId, 'huolala-callback'); return false; } $deliveryOrder->orderStatus = $orderStatus; if (!$deliveryOrder->save()) { Yii::error('更新配送订单状态失败: ' . json_encode($deliveryOrder->getErrors(), JSON_UNESCAPED_UNICODE), 'huolala-callback'); return false; } $order = OrderClass::getById($deliveryOrder->ghsOrderId, true, 'id,sendStatus,deliveryId,purchaseId,customId,status'); if ($order) { $order->sendStatus = $orderStatus; if (!$order->save()) { Yii::warning('更新主订单配送状态失败: ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE), 'huolala-callback'); } // 确认送达或取消订单,更新主订单状态 if ($orderStatus == 5) { OrderClass::confirmReach($order, ['staffId' => 0, 'staffName' => '']); } if ($orderStatus == -1 || $orderStatus == -2) { OrderClass::cancelOrderSend($order, ['staffId' => 0, 'staffName' => '']); } } else { Yii::warning('未找到主订单: ghsOrderId=' . $deliveryOrder->ghsOrderId, 'huolala-callback'); } Yii::info(sprintf('货拉拉配送状态更新成功: order_display_id=%s, event_type=%s, orderStatus=%s', $orderDisplayId, $eventType, $orderStatus), 'huolala-callback'); return true; } catch (\Throwable $e) { Yii::error('货拉拉回调处理异常: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString(), 'huolala-callback'); return false; } } /** * 事件到系统配送状态的映射 * * @param string $eventType * @return int|null */ protected function mapEventTypeToOrderStatus($eventType) { $map = [ 'order_cancel' => -1, 'pickup' => 20, 'driver_reject' => 2, 'order_complete' => 5, 'set_order_abnormal' => -2, 'loaded' => 4, 'auto_confirm_bill_pay' => 5, 'no_load_cancel' => -1, 'no_complete_cancel' => -1, 'loading' => 3, 'unloading' => 4, 'unload_finish' => 4, 'order_auto_complete' => 5, 'order_timeout' => -1, 'prepay_ok' => 2, 'rear_pay_ok' => 5, 'cash_received' => 5, ]; return $map[$eventType] ?? null; } }