From 2739d00846ec7b50ab082935a474bb7e4948e2c9 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Tue, 27 Jan 2026 10:10:11 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?utf8?q?=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/commands/MarketplaceController.php | 71 +++++++++++++++++++----- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/erp24/commands/MarketplaceController.php b/erp24/commands/MarketplaceController.php index d13bc019..0962267a 100644 --- a/erp24/commands/MarketplaceController.php +++ b/erp24/commands/MarketplaceController.php @@ -59,6 +59,11 @@ class MarketplaceController extends Controller */ public $test = false; + /** + * @var bool Асинхронный режим: отправка через очередь без блокирующих retry + */ + public bool $async = false; + public function actionYandex() { $infoForMarketplace = MarketplaceService::infoForMarketplace(MarketplaceStore::YANDEX_WAREHOUSE_ID); @@ -184,6 +189,7 @@ class MarketplaceController extends Controller $options[] = 'seen'; $options[] = 'unseen'; $options[] = 'test'; + $options[] = 'async'; return $options; } @@ -383,11 +389,17 @@ class MarketplaceController extends Controller * Команды: * - Стандартный режим: php yii marketplace/send-order-control-report * - Тестовый режим: php yii marketplace/send-order-control-report --test + * - Асинхронный режим: php yii marketplace/send-order-control-report --async * * Тестовый режим (--test): * - endDate = текущее время (вместо фиксированного 08:00/20:00) * - Полезно для проверки заказов в середине смены * + * Асинхронный режим (--async): + * - Отправка уведомлений через очередь (Yii Queue) + * - Повторные попытки через механизм RetryableJobInterface + * - Не блокирует выполнение команды при ошибках сети + * * @param int $hours Период выборки в часах (по умолчанию 12 — соответствует расписанию) * @param bool $onlyNew Отправлять только новые проблемы (по умолчанию true) * @return int Код завершения (0 = успех, 1 = ошибка, 2 = частичный успех) @@ -397,6 +409,7 @@ class MarketplaceController extends Controller set_time_limit(300); // 5 минут максимум $testMode = (bool)$this->test; + $asyncMode = $this->async; $this->stdout("Запуск отчёта контроля статусов заказов МП...\n", BaseConsole::FG_YELLOW); $this->stdout("Период: {$hours} часов\n", BaseConsole::FG_CYAN); @@ -404,9 +417,15 @@ class MarketplaceController extends Controller if ($testMode) { $this->stdout("Режим: ТЕСТОВЫЙ (endDate = текущее время)\n", BaseConsole::FG_YELLOW); } + if ($asyncMode) { + $this->stdout("Режим: АСИНХРОННЫЙ (отправка через очередь)\n", BaseConsole::FG_CYAN); + } try { - $service = new OrderControlReportService(); + // Внедряем конфигурацию через конструктор (Dependency Injection) + $config = Yii::$app->params['MARKETPLACE_ORDER_CONTROL_REPORT'] ?? []; + $service = new OrderControlReportService($config); + $service->setAsyncMode($asyncMode); $result = $service->generateControlReport($hours, $onlyNew, $testMode); // Вывод результатов @@ -429,18 +448,36 @@ class MarketplaceController extends Controller // Статус отправки $this->stdout("\nОтправка уведомлений:\n", BaseConsole::FG_YELLOW); - if ($result->telegramSent) { - $this->stdout(" Telegram: ✅ отправлено\n", BaseConsole::FG_GREEN); - } else { - $errorMsg = $result->telegramError ?? 'неизвестная ошибка'; - $this->stdout(" Telegram: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); - } + if ($asyncMode) { + // Асинхронный режим — задачи поставлены в очередь + if ($result->telegramSent) { + $this->stdout(" Telegram: ✅ поставлено в очередь\n", BaseConsole::FG_GREEN); + } else { + $errorMsg = $result->telegramError ?? 'не удалось поставить в очередь'; + $this->stdout(" Telegram: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); + } - if ($result->emailSent) { - $this->stdout(" Email: ✅ отправлено\n", BaseConsole::FG_GREEN); + if ($result->emailSent) { + $this->stdout(" Email: ✅ поставлено в очередь\n", BaseConsole::FG_GREEN); + } else { + $errorMsg = $result->emailError ?? 'не удалось поставить в очередь'; + $this->stdout(" Email: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); + } } else { - $errorMsg = $result->emailError ?? 'неизвестная ошибка'; - $this->stdout(" Email: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); + // Синхронный режим — отправлено сразу + if ($result->telegramSent) { + $this->stdout(" Telegram: ✅ отправлено\n", BaseConsole::FG_GREEN); + } else { + $errorMsg = $result->telegramError ?? 'неизвестная ошибка'; + $this->stdout(" Telegram: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); + } + + if ($result->emailSent) { + $this->stdout(" Email: ✅ отправлено\n", BaseConsole::FG_GREEN); + } else { + $errorMsg = $result->emailError ?? 'неизвестная ошибка'; + $this->stdout(" Email: ❌ ошибка - {$errorMsg}\n", BaseConsole::FG_RED); + } } // Итоговый статус @@ -449,12 +486,20 @@ class MarketplaceController extends Controller $this->stdout("\n", BaseConsole::FG_CYAN); if ($exitCode === 0) { if ($result->hasIssues()) { - $this->stdout("Отчёт успешно отправлен.\n", BaseConsole::FG_GREEN); + if ($asyncMode) { + $this->stdout("Отчёт поставлен в очередь на отправку.\n", BaseConsole::FG_GREEN); + } else { + $this->stdout("Отчёт успешно отправлен.\n", BaseConsole::FG_GREEN); + } } else { $this->stdout("Проблемных заказов не найдено.\n", BaseConsole::FG_GREEN); } } elseif ($exitCode === 2) { - $this->stdout("Отчёт отправлен частично (проверьте логи).\n", BaseConsole::FG_YELLOW); + if ($asyncMode) { + $this->stdout("Отчёт частично поставлен в очередь (проверьте логи).\n", BaseConsole::FG_YELLOW); + } else { + $this->stdout("Отчёт отправлен частично (проверьте логи).\n", BaseConsole::FG_YELLOW); + } } else { $this->stdout("Не удалось отправить отчёт.\n", BaseConsole::FG_RED); } -- 2.39.5