]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки по ревью
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 27 Jan 2026 07:10:11 +0000 (10:10 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 27 Jan 2026 07:10:11 +0000 (10:10 +0300)
erp24/commands/MarketplaceController.php

index d13bc019f52ba85e2d528ee64b0478c378d87399..0962267ac038085184375a17cbee8b6d28257a34 100644 (file)
@@ -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);
             }