*/
public $test = false;
+ /**
+ * @var bool Асинхронный режим: отправка через очередь без блокирующих retry
+ */
+ public bool $async = false;
+
public function actionYandex() {
$infoForMarketplace = MarketplaceService::infoForMarketplace(MarketplaceStore::YANDEX_WAREHOUSE_ID);
$options[] = 'seen';
$options[] = 'unseen';
$options[] = 'test';
+ $options[] = 'async';
return $options;
}
* Команды:
* - Стандартный режим: 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 = частичный успех)
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);
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);
// Вывод результатов
// Статус отправки
$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);
+ }
}
// Итоговый статус
$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);
}