settleOrder($orderId); }); } $job->delete(); } catch (HttpResponseException $e) { $data = $e->getResponse()->getData(); $message = $data ? ($data['msg'] ?? '') : $e->getMessage(); format_log_error($e, 'PartnerSettle.HttpResponseException', $message); $this->handleFailure($job, $orderId, $message); } catch (\Throwable $e) { $message = $e->getMessage(); format_log_error($e, 'PartnerSettle', $message); $this->handleFailure($job, $orderId, $message); } } /** * 生产级失败与阶梯重试处理,达到上限时持久化标记到订单 ext 并写入告警 */ protected function handleFailure(Job $job, $orderId, $errorMessage) { $attempts = $job->attempts(); $maxAttempts = 5; if ($attempts >= $maxAttempts) { \think\Log::record("[PartnerSettle CRITICAL] 订单 ID:{$orderId} 收益结算连续失败 {$attempts} 次已达上限: {$errorMessage}", 'error'); if ($orderId) { try { $freshOrder = Db::name('shopro_order')->where('id', $orderId)->find(); if ($freshOrder) { $ext = is_array($freshOrder['ext']) ? $freshOrder['ext'] : (json_decode($freshOrder['ext'] ?? '', true) ?: []); $ext['reward_settle_failed'] = 1; $ext['reward_settle_error'] = mb_substr($errorMessage, 0, 500); $ext['reward_settle_failed_time'] = time(); $ext['reward_settle_attempts'] = $attempts; Db::name('shopro_order')->where('id', $orderId)->update([ 'ext' => json_encode($ext, JSON_UNESCAPED_UNICODE), ]); } } catch (\Throwable $ex) { \think\Log::record("[PartnerSettle] 记录订单 {$orderId} 结算失败标记异常: " . $ex->getMessage(), 'error'); } } $this->failed([ 'job' => 'PartnerSettle@order', 'order_id' => $orderId, 'error' => $errorMessage, 'attempts' => $attempts, 'failed_time' => time(), ]); $job->delete(); } else { // 阶梯式延迟重试:5s, 10s, 15s, 20s $delay = min(60, $attempts * 5); $job->release($delay); } } }