(int) $value, (array) $this->option('workspace'), ))); $workspaces = $this->resolveWorkspaces($workspaceFilter); $slotKey = CarbonImmutable::now('UTC')->format('YmdHi').'Z'; $queuedEvaluate = 0; $queuedDeliver = 0; $skippedEvaluate = 0; $skippedDeliver = 0; foreach ($workspaces as $workspace) { $evaluateRun = $operationRuns->ensureWorkspaceRunWithIdentity( workspace: $workspace, type: 'alerts.evaluate', identityInputs: ['slot_key' => $slotKey], context: [ 'trigger' => 'scheduled_dispatch', 'slot_key' => $slotKey, ], initiator: null, ); if ($evaluateRun->wasRecentlyCreated) { EvaluateAlertsJob::dispatch((int) $workspace->getKey(), (int) $evaluateRun->getKey()); $queuedEvaluate++; } else { $skippedEvaluate++; } $deliverRun = $operationRuns->ensureWorkspaceRunWithIdentity( workspace: $workspace, type: 'alerts.deliver', identityInputs: ['slot_key' => $slotKey], context: [ 'trigger' => 'scheduled_dispatch', 'slot_key' => $slotKey, ], initiator: null, ); if ($deliverRun->wasRecentlyCreated) { DeliverAlertsJob::dispatch((int) $workspace->getKey(), (int) $deliverRun->getKey()); $queuedDeliver++; } else { $skippedDeliver++; } } $this->info(sprintf( 'Alert dispatch scanned %d workspace(s): evaluate queued=%d skipped=%d, deliver queued=%d skipped=%d.', $workspaces->count(), $queuedEvaluate, $skippedEvaluate, $queuedDeliver, $skippedDeliver, )); return self::SUCCESS; } /** * @param array $workspaceIds * @return Collection */ private function resolveWorkspaces(array $workspaceIds): Collection { return Workspace::query() ->when( $workspaceIds !== [], fn ($query) => $query->whereIn('id', $workspaceIds), fn ($query) => $query->whereHas('tenants'), ) ->orderBy('id') ->get(); } }