namespace yii_app\commands;
+use app\jobs\SendTelegramMessageDBJob;
+use app\jobs\SendTelegramMessageJob;
use Yii;
use yii\console\Controller;
use yii\console\ExitCode;
$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))); // Целевая дата
BaseConsole::FG_RED
);
}
- }
+ }*/
// Генерация для текущей даты
$kogortDate = $currentDate;
"Когорта таргета на {$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,
]
);
);
} else {
$this->stdout("Не найдено записей для обновления статуса на 'first'.\n", BaseConsole::FG_RED);
- }
+ }*/
}
//Начисляем бонусы
- $tip = "plus";
+ /*$tip = "plus";
$bonus = 200;
$ip = "tst";
$tip_sale = "date";
BaseConsole::FG_RED
);
}
- }
+ }*/
} else {
$this->stdout(
"Нет данных для формирования когорты для целевой даты {$targetDate}.\n",
}
// Генерация для будущих дат (от текущей даты на $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))); // Целевая дата
BaseConsole::FG_RED
);
}
- }
+ }*/
$this->stdout("Генерация корорт завершена.\n", BaseConsole::FG_GREEN);
return ExitCode::OK;
'as log' => \yii\queue\LogBehavior::class,
'ttr' => 300, // Время для выполнения задания
'attempts' => 3, // Количество попыток
+ 'exchangeName' => 'telegram-exchange',
+
+
+
],
'cache' => [
'class' => 'yii\caching\FileCache',
'as log' => \yii\queue\LogBehavior::class,
'ttr' => 300, // Время для выполнения задания
'attempts' => 3, // Количество попыток
+ 'exchangeName' => 'telegram-exchange',
+
+
],
'cache' => [
$currentDate = strtotime('+1 day', $currentDate);
}
-
if ($request->isAjax) {
return $this->renderPartial('_data_table', [
'links' => $dates,
);
}
$models = ArrayHelper::index($data, 'phone');
- // var_dump($models); die();
+
$dataProvider = new ArrayDataProvider([
'allModels' => $models,
'pagination' => [
--- /dev/null
+<?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++;
+ }
+}
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'];
$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