From: fomichev Date: Fri, 10 Jan 2025 14:28:32 +0000 (+0300) Subject: Сохранение сообщений в БД X-Git-Tag: 1.7~67^2~11 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=f1fbacd9980104f6d867855ebd86ccbf269cc2be;p=erp24_rep%2Fyii-erp24%2F.git Сохранение сообщений в БД --- diff --git a/erp24/commands/CronController.php b/erp24/commands/CronController.php index f23f8545..3f2c5991 100644 --- a/erp24/commands/CronController.php +++ b/erp24/commands/CronController.php @@ -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; diff --git a/erp24/config/console.php b/erp24/config/console.php index 4018e33b..0e58d364 100755 --- a/erp24/config/console.php +++ b/erp24/config/console.php @@ -47,6 +47,10 @@ $config = [ 'as log' => \yii\queue\LogBehavior::class, 'ttr' => 300, // Время для выполнения задания 'attempts' => 3, // Количество попыток + 'exchangeName' => 'telegram-exchange', + + + ], 'cache' => [ 'class' => 'yii\caching\FileCache', diff --git a/erp24/config/web.php b/erp24/config/web.php index aa75480e..051d0b08 100644 --- a/erp24/config/web.php +++ b/erp24/config/web.php @@ -46,6 +46,9 @@ $config = [ 'as log' => \yii\queue\LogBehavior::class, 'ttr' => 300, // Время для выполнения задания 'attempts' => 3, // Количество попыток + 'exchangeName' => 'telegram-exchange', + + ], 'cache' => [ diff --git a/erp24/controllers/UsersMessageManagementController.php b/erp24/controllers/UsersMessageManagementController.php index fda7cf37..e185fef3 100644 --- a/erp24/controllers/UsersMessageManagementController.php +++ b/erp24/controllers/UsersMessageManagementController.php @@ -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 index 00000000..087165f8 --- /dev/null +++ b/erp24/jobs/SendTelegramMessageDBJob.php @@ -0,0 +1,55 @@ + 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++; + } +} diff --git a/erp24/services/TelegramService.php b/erp24/services/TelegramService.php index 321b6887..b434a275 100644 --- a/erp24/services/TelegramService.php +++ b/erp24/services/TelegramService.php @@ -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