commit21
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Services\ReplenishmentQueue;
|
||||
use Illuminate\Console\Command;
|
||||
use Throwable;
|
||||
|
||||
class ReplenishmentHealth extends Command
|
||||
{
|
||||
protected $signature = 'sgc:replenishment-health {--json : Resultado técnico para integração operacional}';
|
||||
|
||||
protected $description = 'Consultar o estado técnico da reposição sem processar trabalhos ou aprovar compras';
|
||||
|
||||
public function handle(ReplenishmentQueue $queue): int
|
||||
{
|
||||
try {
|
||||
$result = $queue->health();
|
||||
} catch (Throwable $error) {
|
||||
report($error);
|
||||
$result = ['checked_at' => now()->toIso8601String(), 'ok' => false, 'reasons' => ['unavailable']];
|
||||
}
|
||||
if ($this->option('json')) {
|
||||
$this->line(json_encode($result, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR));
|
||||
} else {
|
||||
$this->line($result['ok'] ? 'Reposição: verificação técnica sem pendências observadas.' : 'Reposição: verificação técnica requer atenção.');
|
||||
$labels = ['not_installed' => 'Reposição durável não instalada nesta composição.', 'not_recent' => 'Sem passagem recente confirmada.',
|
||||
'last_run_not_successful' => 'Última passagem sem sucesso confirmado.', 'pending_signals' => 'Existem sinais duráveis por processar.',
|
||||
'failed_work' => 'Existem trabalhos a recuperar.', 'unbound_observation' => 'Passagem sem associação confirmada a esta instalação/base.', 'unavailable' => 'Não foi possível consultar. Verifique o registo técnico.'];
|
||||
foreach ($result['reasons'] as $reason) {
|
||||
$this->line($labels[$reason]);
|
||||
}
|
||||
}
|
||||
|
||||
return $result['ok'] ? self::SUCCESS : self::FAILURE;
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Services\ReplenishmentHeartbeat;
|
||||
use App\Services\ReplenishmentProcessLock;
|
||||
use App\Services\ReplenishmentQueue;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
@@ -24,10 +26,30 @@ class ReplenishmentTick extends Command
|
||||
|
||||
return self::INVALID;
|
||||
}
|
||||
$queue->discover();
|
||||
$result = $queue->drain((int) $limit);
|
||||
$this->info('Reposição: '.$result['processed'].' trabalhos conferidos; '.$result['failed'].' a recuperar.');
|
||||
$started = now()->toIso8601String();
|
||||
$exitCode = self::FAILURE;
|
||||
$lock = app(ReplenishmentProcessLock::class);
|
||||
if (! $lock->acquire()) {
|
||||
$this->info('Verificação periódica já em execução; aguarde a próxima passagem.');
|
||||
|
||||
return $result['failed'] === 0 ? self::SUCCESS : self::FAILURE;
|
||||
return self::FAILURE;
|
||||
}
|
||||
try {
|
||||
$queue->discover();
|
||||
$result = $queue->drain((int) $limit);
|
||||
$this->info('Reposição: '.$result['processed'].' trabalhos conferidos; '.$result['failed'].' a recuperar.');
|
||||
$exitCode = $result['failed'] === 0 ? self::SUCCESS : self::FAILURE;
|
||||
|
||||
return $exitCode;
|
||||
} finally {
|
||||
try {
|
||||
app(ReplenishmentHeartbeat::class)->record($started, $exitCode);
|
||||
} catch (\Throwable $error) {
|
||||
report($error);
|
||||
$this->warn('Não foi possível actualizar o acompanhamento técnico desta execução.');
|
||||
} finally {
|
||||
$lock->release();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user