orderId = $orderId; } public function handle() { $order = ErpOrder::with('platformOrder', 'deliveryRecord')->find($this->orderId); if (!$order || $order->sync_status != 0) { return; } $platform = $order->platformOrder->platform_type; $delivery = $order->deliveryRecord; $limiter = new RateLimiter($platform, 'logistics_send'); if (!$limiter->waitForAvailability(30)) { $this->release(60); return; } try { switch ($platform) { case 'taobao': $this->syncToTaobao($order, $delivery); break; case 'jd': $this->syncToJd($order, $delivery); break; case 'pdd': $this->syncToPdd($order, $delivery); break; } $order->sync_status = 1; $order->sync_time = now(); $order->save(); $delivery->sync_status = 1; $delivery->sync_time = now(); $delivery->save(); Log::info('发货回传成功', ['order_id' => $order->id]); } catch (\Exception $e) { Log::error('发货回传失败', [ 'order_id' => $order->id, 'error' => $e->getMessage() ]); $order->sync_status = 2; $order->save(); $delivery->sync_status = 2; $delivery->sync_error = $e->getMessage(); $delivery->save(); if ($this->attempts() < 3) { $this->release(pow(2, $this->attempts()) * 60); } } } protected function syncToTaobao($order, $delivery) { $client = app(TaobaoClient::class); $params = [ 'tid' => $order->platformOrder->platform_order_no, 'company_code' => $this->getLogisticsCode($delivery->logistics_company), 'out_sid' => $delivery->tracking_no ]; $client->execute('alibaba.ascp.logistics.offline.send', $params); } protected function syncToJd($order, $delivery) { // TODO: 实现京东发货接口 } protected function syncToPdd($order, $delivery) { // TODO: 实现拼多多发货接口 } protected function getLogisticsCode($company) { $map = [ '顺丰' => 'SF', '圆通' => 'YTO', '中通' => 'ZTO', '韵达' => 'YD', '邮政' => 'YZ', ]; return $map[$company] ?? 'OTHER'; } }