khanegi setting and prices records

This commit is contained in:
2026-06-13 17:35:40 +03:30
parent c70cda0b6b
commit 91a82c06e4
15 changed files with 509 additions and 73 deletions
+20
View File
@@ -0,0 +1,20 @@
<?php
namespace App\Console\Commands;
use App\Services\LivePriceTickService;
use Illuminate\Console\Command;
class PriceTickCommand extends Command
{
protected $signature = 'prices:tick';
protected $description = 'Fetch live prices, sync products, cache last/list, log snapshot (every 10s)';
public function handle(LivePriceTickService $tickService): int
{
$tickService->tick();
return self::SUCCESS;
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Console\Commands;
use App\Services\PriceSnapshotService;
use Illuminate\Console\Command;
class PrunePriceSnapshotsCommand extends Command
{
protected $signature = 'prices:prune';
protected $description = 'Downsample and prune price history (daily at midnight)';
public function handle(PriceSnapshotService $snapshots): int
{
$stats = $snapshots->pruneHistory();
$this->info(json_encode($stats, JSON_UNESCAPED_UNICODE));
return self::SUCCESS;
}
}
+4 -5
View File
@@ -2,19 +2,18 @@
namespace App\Console\Commands;
use App\Services\ProductPriceSyncService;
use App\Services\LivePriceTickService;
use Illuminate\Console\Command;
class SyncProductPrices extends Command
{
protected $signature = 'product:sync-prices';
protected $description = 'Fetch zaarbox price board + sync product DB (scheduler: every 30s)';
protected $description = 'Alias for prices:tick (backward compatible cron)';
public function handle(ProductPriceSyncService $syncService): int
public function handle(LivePriceTickService $tickService): int
{
// کران: GET https://price.zaarbox.ir/api/free (یا zaarbox_api_url) → کش + UPDATE محصولات
$syncService->syncAll(true);
$tickService->tick();
return self::SUCCESS;
}
+13 -19
View File
@@ -2,44 +2,38 @@
namespace App\Console;
use App\Console\Commands\Price;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
Price::class,
Commands\Price::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// همگام‌سازی قیمت محصولات متغیر (reading_method) — هر ۳۰ ثانیه
// تیک قیمت — هر ۱۰ ثانیه (۶ بار در دقیقه)
$schedule->call(function () {
for ($i = 0; $i < 2; $i++) {
\Illuminate\Support\Facades\Artisan::call('product:sync-prices');
if ($i < 1) {
sleep(30);
for ($i = 0; $i < 6; $i++) {
\Illuminate\Support\Facades\Artisan::call('prices:tick');
if ($i < 5) {
sleep(10);
}
}
})->everyMinute()->name('sync_product_prices_30s')->withoutOverlapping();
})->everyMinute()->name('prices_tick_10s')->withoutOverlapping();
$schedule->command('prices:refresh-zaarbox')
->everyThirtyMinutes()
->name('refresh_zaarbox_prices')
->withoutOverlapping();
// پاک‌سازی و downsample تاریخچه — ساعت ۱۲ شب
$schedule->command('prices:prune')
->dailyAt('00:00')
->name('prune_price_snapshots');
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');