]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Сохранение сообщений в БД
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 10 Jan 2025 14:28:32 +0000 (17:28 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 10 Jan 2025 14:28:32 +0000 (17:28 +0300)
erp24/commands/CronController.php
erp24/config/console.php
erp24/config/web.php
erp24/controllers/UsersMessageManagementController.php
erp24/jobs/SendTelegramMessageDBJob.php [new file with mode: 0644]
erp24/services/TelegramService.php

index f23f8545de2e32c18a689e7eced7ee8d634cc973..3f2c5991cbac04f7b42e55f48a9e60c0f97bcc29 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace yii_app\commands;
 
+use app\jobs\SendTelegramMessageDBJob;
+use app\jobs\SendTelegramMessageJob;
 use Yii;
 use yii\console\Controller;
 use yii\console\ExitCode;
@@ -225,7 +227,7 @@ class CronController extends Controller
         $stepsBack = $this->stepsBack ?? $step1;
 
         // Генерация для прошлых дат (от текущей даты на $step1 дней назад)
-        for ($i = $stepsBack; $i > 0; $i--) {
+       /* for ($i = $stepsBack; $i > 0; $i--) {
             $kogortDate = date('Y-m-d', strtotime("-$i days", strtotime($currentDate))); // Дата когорты
             $targetDate = date('Y-m-d', strtotime("+$step1 days", strtotime($kogortDate))); // Целевая дата
 
@@ -243,7 +245,7 @@ class CronController extends Controller
                     BaseConsole::FG_RED
                 );
             }
-        }
+        }*/
 
         // Генерация для текущей даты
         $kogortDate = $currentDate;
@@ -257,25 +259,47 @@ class CronController extends Controller
                 "Когорта таргета на {$kogortDate} для целевой даты {$targetDate} успешно сохранена.\n",
                 BaseConsole::FG_GREEN
             );
+            $countPhones = count($kogortPhones);
+            $this->stdout(
+                "Всего телефонов в когорте {$countPhones} записей.\n",
+                BaseConsole::FG_GREEN
+            );
             // Выбираем номера для отправки через бота
             $telegramUsers = UsersTelegram::find()
                 ->where(['is_blocked' => 0, 'is_registered' => 1])
                 ->andWhere(['phone' => $kogortPhones])
-                ->distinct('phone')
                 ->select(['phone', 'chat_id'])
-                ->column();
-
+                ->asArray()
+                ->all();
+            $phonesArray = array_column($telegramUsers, 'phone');
+            $chatIdsArray = array_column($telegramUsers, 'chat_id');
+            $countTelegramPhones = count($telegramUsers);
+            $this->stdout(
+                "Всего телефонов в когорте {$countTelegramPhones} записей.\n",
+                BaseConsole::FG_GREEN
+            );
             if (!empty($telegramUsers)) {
+                foreach ($telegramUsers as $telegramUser) {
+                    $messageData = [];
+                    $messageData['chat_id'] = $telegramUser['chat_id'];
+                    $messageData['phone'] = $telegramUser['phone'];
+                    $messageData['kogort_date'] = $kogortDate;
+                    $messageData['target_date'] = $targetDate;
+                    $messageData['type'] = 1;
+                    $messageData['message'] = $messagesSettings->replaceShortcodes($messagesSettings->offer_1);
+
+                        Yii::$app->queue->push(new SendTelegramMessageDBJob([
+                            'messageData' =>  $messageData,
+                        ]));
+                }
 
-                
-
-                $updatedCount = SentKogort::updateAll(
+                /*$updatedCount = SentKogort::updateAll(
                     ['status' => SentKogort::STATUSES['first']], // Устанавливаем статус "первая рассылка"
                     [
                         'kogort_date'   => $kogortDate,
                         'target_date'   => $targetDate,
                         'kogort_number' => SentKogort::KOGORT_NUMBERS['target'],
-                        'phone'         => $telegramUsers['phone'],
+                        'phone'         => $phonesArray,
                     ]
                 );
 
@@ -286,11 +310,11 @@ class CronController extends Controller
                     );
                 } else {
                     $this->stdout("Не найдено записей для обновления статуса на 'first'.\n", BaseConsole::FG_RED);
-                }
+                }*/
             }
 
             //Начисляем бонусы
-            $tip = "plus";
+            /*$tip = "plus";
             $bonus = 200;
             $ip = "tst";
             $tip_sale = "date";
@@ -314,7 +338,7 @@ class CronController extends Controller
                         BaseConsole::FG_RED
                     );
                 }
-            }
+            }*/
         } else {
             $this->stdout(
                 "Нет данных для формирования когорты для целевой даты {$targetDate}.\n",
@@ -323,7 +347,7 @@ class CronController extends Controller
         }
 
         // Генерация для будущих дат (от текущей даты на $step1 дней вперёд)
-        for ($i = 1; $i <= $step1; $i++) {
+        /*for ($i = 1; $i <= $step1; $i++) {
             $kogortDate = date('Y-m-d', strtotime("+$i days", strtotime($currentDate))); // Дата когорты
             $targetDate = date('Y-m-d', strtotime("+$step1 days", strtotime($kogortDate))); // Целевая дата
 
@@ -341,7 +365,7 @@ class CronController extends Controller
                     BaseConsole::FG_RED
                 );
             }
-        }
+        }*/
 
         $this->stdout("Генерация корорт завершена.\n", BaseConsole::FG_GREEN);
         return ExitCode::OK;
index 4018e33bca50149b6eef09628ada7ff1da6f8548..0e58d3640dddd8d5dd12deac839af0530b434494 100755 (executable)
@@ -47,6 +47,10 @@ $config = [
             'as log' => \yii\queue\LogBehavior::class,
             'ttr' => 300, // Время для выполнения задания
             'attempts' => 3, // Количество попыток
+            'exchangeName' => 'telegram-exchange',
+
+
+
         ],
         'cache' => [
             'class' => 'yii\caching\FileCache',
index aa75480e6c5e756ba6d9a4e35118fd71083cf60f..051d0b080fc500c243805072ae28411bb855065b 100644 (file)
@@ -46,6 +46,9 @@ $config = [
             'as log' => \yii\queue\LogBehavior::class,
             'ttr' => 300, // Время для выполнения задания
             'attempts' => 3, // Количество попыток
+            'exchangeName' => 'telegram-exchange',
+
+
 
         ],
         'cache' => [
index fda7cf377d3d57596a7cae3411279165fb12c3db..e185fef341f468a0bea648a1cac49d8e4027fa33 100644 (file)
@@ -183,7 +183,6 @@ class UsersMessageManagementController extends Controller
             $currentDate = strtotime('+1 day', $currentDate);
         }
 
-
         if ($request->isAjax) {
             return $this->renderPartial('_data_table', [
                 'links' => $dates,
@@ -291,7 +290,7 @@ class UsersMessageManagementController extends Controller
             );
         }
         $models = ArrayHelper::index($data, 'phone');
-       // var_dump($models); die();
+
         $dataProvider = new ArrayDataProvider([
             'allModels' => $models,
             'pagination' => [
diff --git a/erp24/jobs/SendTelegramMessageDBJob.php b/erp24/jobs/SendTelegramMessageDBJob.php
new file mode 100644 (file)
index 0000000..087165f
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+namespace app\jobs;
+
+
+use Yii;
+use yii\queue\JobInterface;
+use yii_app\services\TelegramService;
+
+class SendTelegramMessageDBJob extends \yii\base\BaseObject implements JobInterface
+{
+
+    public $messageData;
+
+    public static $messagesSent = 0;
+    public static $lastResetTime;
+
+    public function execute($queue)
+    {
+        if (!self::$lastResetTime || (microtime(true) - self::$lastResetTime) > 1) {
+            self::$lastResetTime = microtime(true);
+            self::$messagesSent = 0;
+        }
+
+        if (self::$messagesSent >= 3) {
+            $delay = 1 - (microtime(true) - self::$lastResetTime);
+            if ($delay > 0) {
+                usleep($delay * 1e6); // Спим оставшееся время
+            }
+            self::$lastResetTime = microtime(true);
+            self::$messagesSent = 0;
+        }
+        $chatId = ($this->messageData)['chat_id'];
+        $phone = ($this->messageData)['phone'];
+
+        try {
+            $result = TelegramService::saveSentMessageToDB($this->messageData);
+
+            if ($result) {
+                Yii::warning("Сообщение успешно сохранено для пользователя с ID {$chatId} телефон {$phone}", 'telegram');
+            } else {
+                Yii::warning("Сообщение не удалось сохранить для пользователя с ID {$chatId} телефон {$phone}", 'telegram');
+            }
+
+        } catch (\Exception $e) {
+            Yii::error(
+                "Сообщение не удалось сохранить для пользователя ID {$chatId} телефон {$phone}: " . $e->getMessage(),
+                'telegram'
+            );
+        }
+
+
+        self::$messagesSent++;
+    }
+}
index 321b688747bbab92f62b515be67b4cff1b554c03..b434a275ca8687e86419f2b280ea0f61982d8938 100644 (file)
@@ -122,7 +122,7 @@ class TelegramService
 
     public static function saveSentMessageToDB($messageData)
     {
-        $userMessage = new UsersTelegramMessage();
+        /*$userMessage = new UsersTelegramMessage();
         $userMessage->chat_id = $messageData['chat_id'];
         $userMessage->phone = $messageData['phone'];
         $userMessage->message = $messageData['message'];
@@ -130,7 +130,57 @@ class TelegramService
         $userMessage->target_date = $messageData['target_date'];
         $userMessage->type = $messageData['type'];
 
-        return $userMessage->save();
+        return $userMessage->save();*/
+
+        if (!extension_loaded('pdo_pgsql')) {
+            Yii::error("PDO PostgreSQL driver is not loaded. Невозможно сохранить сообщение.", 'telegram');
+            return false;
+        }
+
+        /** @var \yii\db\Connection $db */
+        $db = Yii::$app->db;
+
+        if (!$db->isActive) {
+            try {
+                $db->open();
+            } catch (\Exception $e) {
+                Yii::error("Не удалось открыть соединение с БД: " . $e->getMessage(), 'telegram');
+                return false;
+            }
+        }
+
+        // 3. Начинаем транзакцию
+        $transaction = $db->beginTransaction();
+        try {
+            $userMessage = new UsersTelegramMessage();
+            $userMessage->chat_id     = $messageData['chat_id'];
+            $userMessage->phone       = $messageData['phone'];
+            $userMessage->message     = $messageData['message'];
+            $userMessage->kogort_date = $messageData['kogort_date'];
+            $userMessage->target_date = $messageData['target_date'];
+            $userMessage->type        = $messageData['type'];
+
+            $saved = $userMessage->save();
+            if (!$saved) {
+                Yii::error("Ошибка сохранения сообщения: " . print_r($userMessage->getErrors(), true), 'telegram');
+                $transaction->rollBack();
+                return false;
+            }
+
+            $transaction->commit();
+            return true;
+
+        } catch (\Exception $e) {
+            // Если произошла ошибка — откатываем изменения
+            $transaction->rollBack();
+            Yii::error("Ошибка при сохранении сообщения: " . $e->getMessage(), 'telegram');
+            return false;
+        } catch (\Throwable $t) {
+            // PHP 7+ может пробрасывать Throwable (Error, TypeError и т.д.)
+            $transaction->rollBack();
+            Yii::error("Ошибка (Throwable) при сохранении сообщения: " . $t->getMessage(), 'telegram');
+            return false;
+        }
     }
 
 }
\ No newline at end of file