From 0cce76a92c1e1f894cb9cce24097077b16025123 Mon Sep 17 00:00:00 2001 From: fomichev Date: Fri, 7 Mar 2025 14:19:52 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?utf8?q?=D0=BA=D0=B0=20=D0=BA=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?utf8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/commands/CronController.php | 138 +++++++++----------------- erp24/jobs/SendWhatsappMessageJob.php | 2 +- erp24/records/Users.php | 38 +++---- erp24/services/WhatsAppService.php | 6 +- 4 files changed, 70 insertions(+), 114 deletions(-) diff --git a/erp24/commands/CronController.php b/erp24/commands/CronController.php index f277ea90..f2d6d53b 100644 --- a/erp24/commands/CronController.php +++ b/erp24/commands/CronController.php @@ -32,6 +32,7 @@ class CronController extends Controller */ public $time; public $stepsBack; + public $test; public function actions() { @@ -714,7 +715,7 @@ class CronController extends Controller ); return ExitCode::UNAVAILABLE; } - + $test = $this->test ? (bool)$this->test : false; if (!$messagesSettings->active) { $this->stdout( "Рассылка неактивна (поле active = 0). Отправка сообщений прервана.\n", @@ -726,17 +727,19 @@ class CronController extends Controller $this->stdout("Рассылка активна. Начинаем отправку второго сообщения...\n", BaseConsole::FG_GREEN); date_default_timezone_set('Europe/Moscow'); - $step1 = $messagesSettings ? $messagesSettings->day_before_step1 : 10; $step2 = $messagesSettings ? $messagesSettings->day_before_step2 : 4; - $currentDate = date('Y-m-d'); - $targetDate = date('Y-m-d', strtotime("+$step2 days", strtotime($currentDate))); - $kogortDate = date('Y-m-d', strtotime("-$step1 days", strtotime($targetDate))); + $limit = $messagesSettings ? $messagesSettings->channel_limit : 250; + $cascadeId = $messagesSettings ? $messagesSettings->cascade_id : 5686; + + $kogortDate = date('Y-m-d'); + $targetDate = date('Y-m-d', strtotime("+$step2 days", strtotime($kogortDate))); $kogortPhones = SentKogort::find() ->select('phone') - ->andWhere(['kogort_number' => 2]) + ->andWhere(['kogort_number' => SentKogort::KOGORT_NUMBERS['whatsapp']]) ->andWhere(['target_date' => $targetDate]) ->andWhere(['purchase' => 0]) + ->andWhere(['status' => SentKogort::STATUSES['created']]) ->column(); if (!empty($kogortPhones)) { @@ -745,93 +748,49 @@ class CronController extends Controller "Всего телефонов в когорте {$countPhones} записей.\n", BaseConsole::FG_GREEN ); - - $sentStatusKogort = SentKogort::find() - ->select('phone') - ->andWhere(['kogort_number' => 2]) - ->andWhere(['target_date' => $targetDate]) - ->andWhere(['status' => 3]) - ->column(); - - $phonesArray = array_diff($kogortPhones, $sentStatusKogort); - $countWhatsappPhones = count($phonesArray); - $this->stdout( - "Всего телефонов в рассылке телеграма {$countWhatsappPhones} записей.\n", - BaseConsole::FG_GREEN - ); - - $limit = $messagesSettings ? $messagesSettings->channel_limit : 250; - $cascadeId = $messagesSettings ? $messagesSettings->cascade_id : 5686; - $salesData = Sales::find() - ->select([ - 'phone', - 'dealsCount' => 'COUNT(*)' - ]) - ->where(['phone' => $phonesArray]) - ->groupBy('phone') - ->asArray() - ->indexBy('phone') - ->all(); - - $phoneSales = []; - foreach ($phonesArray as $phone) { - $phoneSales[$phone] = $salesData[$phone]['dealsCount'] ?? 0; + $messageText = $messagesSettings + ->replaceShortcodes($messagesSettings->offer_whatsapp, $targetDate); + $phonesSentArray = []; + foreach ($kogortPhones as $index => $phone) { + if ($index >= $limit) { + break; + } + $messageData = []; + $messageData['phone'] = $phone; + $messageData['kogort_date'] = $kogortDate; + $messageData['target_date'] = $targetDate; + $messageData['message'] = $messageText; + $messageData['cascade_id'] = $cascadeId; + + Yii::$app->queue->push(new SendWhatsappMessageJob([ + 'messageData' => $messageData, + 'isTest' => $test + ])); + $phonesSentArray[] = $phone; } - arsort($phoneSales); - $sortedPhones = array_keys($phoneSales); + //TODO - перенос в отправку + $updatedCount = SentKogort::updateAll( + [ + 'status' => SentKogort::STATUSES['second'], // Устанавливаем статус "вторая рассылка" + 'updated_at' => date('Y-m-d H:i:s'), + ], + [ + 'target_date' => $targetDate, + 'kogort_number' => SentKogort::KOGORT_NUMBERS['whatsapp'], + 'phone' => $phonesSentArray, + ] + ); - $phonesToSend = null; - if ($countWhatsappPhones > $limit) { - $phonesToSend = $sortedPhones; + if ($updatedCount) { + $this->stdout( + "Статус записей для когорты {$kogortDate} обновлён на 'second' для {$updatedCount} записей.\n", + BaseConsole::FG_GREEN + ); } else { - $phonesToSend = $phonesArray; - } - - if (!empty($phonesToSend)) { - $messageText = $messagesSettings - ->replaceShortcodes($messagesSettings->offer_whatsapp, $targetDate); - $phonesSentArray = []; - foreach ($phonesToSend as $index => $phone) { - if ($index >= $limit) { - break; - } - $messageData = []; - $messageData['phone'] = $phone; - $messageData['kogort_date'] = $kogortDate; - $messageData['target_date'] = $targetDate; - $messageData['message'] = $messageText; - $messageData['cascade_id'] = $cascadeId; - - Yii::$app->queue->push(new SendWhatsappMessageJob([ - 'messageData' => $messageData, - 'isTest' => false - ])); - $phonesSentArray[] = $phone; - } - //TODO - перенос в отправку - $updatedCount = SentKogort::updateAll( - [ - 'status' => SentKogort::STATUSES['second'], // Устанавливаем статус "вторая рассылка" - 'updated_at' => date('Y-m-d H:i:s'), - ], - [ - 'target_date' => $targetDate, - 'kogort_number' => SentKogort::KOGORT_NUMBERS['whatsapp'], - 'phone' => $phonesSentArray, - ] + $this->stdout( + "Не найдено записей для обновления статуса на 'second'.\n", + BaseConsole::FG_RED ); - - if ($updatedCount) { - $this->stdout( - "Статус записей для когорты {$kogortDate} обновлён на 'second' для {$updatedCount} записей.\n", - BaseConsole::FG_GREEN - ); - } else { - $this->stdout( - "Не найдено записей для обновления статуса на 'second'.\n", - BaseConsole::FG_RED - ); - } } } else { $this->stdout( @@ -978,6 +937,7 @@ class CronController extends Controller $options = parent::options($actionID); $options[] = 'time'; $options[] = 'stepsBack'; + $options[] = 'test'; return $options; } diff --git a/erp24/jobs/SendWhatsappMessageJob.php b/erp24/jobs/SendWhatsappMessageJob.php index 65cce5b8..f446b3ec 100644 --- a/erp24/jobs/SendWhatsappMessageJob.php +++ b/erp24/jobs/SendWhatsappMessageJob.php @@ -55,7 +55,7 @@ class SendWhatsappMessageJob extends BaseObject implements JobInterface $cascadeId = ($this->messageData)['cascade_id']; $requestId = DataHelper::uuid(); $whatsappService = new WhatsAppService($apiKey, $cascadeId); - + $response = null; try { if (!$this->isTest) { // $message = "Здравствуйте\nУзнать подробности вы можете на нашем сайте https://bazacvetov24.ru."; diff --git a/erp24/records/Users.php b/erp24/records/Users.php index 00b8faf8..5a9b175d 100755 --- a/erp24/records/Users.php +++ b/erp24/records/Users.php @@ -447,13 +447,20 @@ class Users extends \yii\db\ActiveRecord ]) ->column(); + $existingWhatsappKogort = SentKogort::find() + ->select('phone') + ->where([ + 'target_date' => $targetDate, + 'kogort_number' => SentKogort::KOGORT_NUMBERS['whatsapp'] + ]) + ->column(); if ($type === 'whatsapp' && !empty($existingTargetKogort)) { return self::processWhatsappKogort($existingTargetKogort, $targetDate); } - if ($type === 'call' && !empty($existingTargetKogort)) { - return self::processCallKogort($existingTargetKogort, $targetDate); + if ($type === 'call' && !empty($existingWhatsappKogort)) { + return self::processCallKogort($existingWhatsappKogort, $targetDate); } $monthDay = date('m-d', strtotime($targetDate)); @@ -518,9 +525,10 @@ class Users extends \yii\db\ActiveRecord return $targetKogortData; } + $whatsappResult = self::processWhatsappKogort($targetKogortData, $targetDate); return $type === 'whatsapp' - ? self::processWhatsappKogort($kogortData, $targetDate) - : self::processCallKogort($kogortData, $targetDate); + ? $whatsappResult + : self::processCallKogort($whatsappResult['whatsapp'], $targetDate); } /** @@ -532,10 +540,13 @@ class Users extends \yii\db\ActiveRecord $step1 = $messagesSettings ? $messagesSettings->day_before_step1 : 10; $step2 = $messagesSettings ? $messagesSettings->day_before_step2 : 4; + $testList = $messagesSettings ? $messagesSettings->test_phones_list : ''; + $testPhones = array_map('trim', explode(',', $testList)); $excludeRegistered = UsersTelegram::find() ->where(['is_blocked' => 0, 'is_registered' => 1]) ->andWhere(['phone' => $targetPhones]) + ->andWhere(['not in', 'phone', $testPhones]) ->distinct('phone') ->select('phone') ->column(); @@ -561,27 +572,10 @@ class Users extends \yii\db\ActiveRecord } $whatsappPhones = array_diff(array_diff($targetPhones, $excludeRegistered), $excludeSalesPhone); - if (!empty($messagesSettings->test_phones_list)) { - if ( - isset($messagesSettings->test_phones_active) - && - $messagesSettings->test_phones_active == 0 - ) { - $testPhones = array_map('trim', explode(',', $messagesSettings->test_phones_list)); - $whatsappKogortData = array_merge($whatsappPhones, $testPhones); - } else { - $testPhones = array_map('trim', explode(',', $messagesSettings->test_phones_list)); - $whatsappKogortData = $testPhones; - } - } else { - if ($messagesSettings->test_phones_active == 1) { - $whatsappKogortData = []; - } - } $secondTarget = array_diff($excludeRegistered, $excludeSalesPhone); - return ['whatsapp' => $whatsappKogortData, 'secondTarget' => $secondTarget]; + return ['whatsapp' => $whatsappPhones, 'secondTarget' => $secondTarget]; } /** diff --git a/erp24/services/WhatsAppService.php b/erp24/services/WhatsAppService.php index 357cfd4c..3cb2053b 100644 --- a/erp24/services/WhatsAppService.php +++ b/erp24/services/WhatsAppService.php @@ -170,15 +170,17 @@ class WhatsAppService 'text' => $this->escapeText($message), ]; - if (!$isTest) { + $whatsappContent['messageMatcherId'] = $messagesSettings ? $messagesSettings->template_id : 121254; + /* if (!$isTest) { $whatsappContent['messageMatcherId'] = $messagesSettings ? $messagesSettings->template_id : 121254; } else { + $whatsappContent['messageMatcherId'] = $messagesSettings ? $messagesSettings->template_id : 121254; $whatsappContent['keyboard'] = $buttons; $whatsappContent['messageMatcherId'] = self::getMessageMatcherIdBySubjectId( $subjectId, 'kogort_message' ) ?? 120669; - } + }*/ $payload = [ 'requestId' => $requestId, -- 2.39.5