onQueue(config('restaurant-delivery.queue.queues.assignment', 'restaurant-delivery-assignment')); } /** * Execute the job. */ public function handle(): void { // Refresh delivery from database $delivery = $this->delivery->fresh(); // Skip if already assigned if ($delivery->rider_id && $delivery->status === DeliveryStatus::RIDER_ASSIGNED) { Log::info('Delivery already assigned, skipping timeout check', [ 'delivery_id' => $delivery->id, 'rider_id' => $delivery->rider_id, ]); return; } // Skip if cancelled or completed if (in_array($delivery->status, [DeliveryStatus::CANCELLED, DeliveryStatus::DELIVERED, DeliveryStatus::FAILED])) { Log::info('Delivery is no longer active, skipping assignment', [ 'delivery_id' => $delivery->id, 'status' => $delivery->status->value, ]); return; } // Check if max reassignments reached $maxReassignments = config('restaurant-delivery.assignment.max_reassignments', 3); if ($delivery->reassignment_count >= $maxReassignments) { Log::warning('Max reassignments reached for delivery', [ 'delivery_id' => $delivery->id, 'reassignment_count' => $delivery->reassignment_count, ]); return; } // Increment reassignment count $delivery->increment('reassignment_count'); // Retry assignment Log::info('Assignment timed out, retrying', [ 'delivery_id' => $delivery->id, 'attempt' => $delivery->reassignment_count, ]); dispatch(new AssignRiderJob($delivery)); } /** * Handle a job failure. */ public function failed(\Throwable $exception): void { Log::error('Assignment timeout check failed', [ 'delivery_id' => $this->delivery->id, 'error' => $exception->getMessage(), ]); } }