Commit 42b5942f by Vladislav

#19474 Синхронизация фраз

1 parent ee90794c
...@@ -8,7 +8,7 @@ use App\Service\API\API; ...@@ -8,7 +8,7 @@ use App\Service\API\API;
use App\Service\Requests\APIRequest; use App\Service\Requests\APIRequest;
use Illuminate\Console\Command; use Illuminate\Console\Command;
class AdGroupsLoadUpdated extends Command class AdGroupsLoadUpdated extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
......
<?php
namespace App\Console\Commands;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Console\Command;
class KeywordsAdd extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'keywords:add';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Добавление не созданных фраз с целевого аккаунта';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal')
->with([
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNotExternal.keyword',
])
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('Keyword', 'add')
->call([
'goalKeywords' => $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('goalKeywordsForNotExternal')
->collapse(),
]);
}
return 0;
}
}
<?php
namespace App\Console\Commands;
use App\Models\Tokens;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use Illuminate\Console\Command;
class KeywordsUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'keywords:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Изменение созданных фраз с целевого аккаунта';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNeedUpdated')
->with([
'dictionaryCampaignsEnabledForExternalSynchronized.goalKeywordsForNeedUpdated.keyword',
])
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$factory->getRequest('Keyword', 'update')
->call([
'goalKeywords' => $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('goalKeywordsForNeedUpdated')
->collapse(),
]);
}
return 0;
}
}
...@@ -15,6 +15,8 @@ use App\Console\Commands\CampaignsSuspend; ...@@ -15,6 +15,8 @@ use App\Console\Commands\CampaignsSuspend;
use App\Console\Commands\CampaignsUpdate; use App\Console\Commands\CampaignsUpdate;
use App\Console\Commands\DictionariesLoad; use App\Console\Commands\DictionariesLoad;
use App\Console\Commands\CampaignsLoadUpdated; use App\Console\Commands\CampaignsLoadUpdated;
use App\Console\Commands\KeywordsAdd;
use App\Console\Commands\KeywordsUpdate;
use App\Console\Commands\RefreshLimits; use App\Console\Commands\RefreshLimits;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
...@@ -54,6 +56,9 @@ class Kernel extends ConsoleKernel ...@@ -54,6 +56,9 @@ class Kernel extends ConsoleKernel
$schedule->command(CampaignsLoadGroups::class)->hourlyAt(40); $schedule->command(CampaignsLoadGroups::class)->hourlyAt(40);
$schedule->command(AdGroupsAdd::class)->hourlyAt(30); $schedule->command(AdGroupsAdd::class)->hourlyAt(30);
$schedule->command(AdGroupsUpdate::class)->hourlyAt(30); $schedule->command(AdGroupsUpdate::class)->hourlyAt(30);
$schedule->command(KeywordsAdd::class)->hourlyAt(40);
$schedule->command(KeywordsUpdate::class)->hourlyAt(40);
} }
/** /**
......
...@@ -21,6 +21,7 @@ use Illuminate\Support\Collection; ...@@ -21,6 +21,7 @@ use Illuminate\Support\Collection;
* @property string|null $user_param_2 * @property string|null $user_param_2
* @property int|null $bid * @property int|null $bid
* @property int|null $context_bid * @property int|null $context_bid
* @property string|null $strategy_priority
* @property string|null $state * @property string|null $state
* @property string|null $status * @property string|null $status
* @property string|null $serving_status * @property string|null $serving_status
...@@ -53,6 +54,10 @@ use Illuminate\Support\Collection; ...@@ -53,6 +54,10 @@ use Illuminate\Support\Collection;
*/ */
class Keyword extends Model class Keyword extends Model
{ {
const STRATEGY_PRIORITY_LOW = 'LOW';
const STRATEGY_PRIORITY_NORMAL = 'NORMAL';
const STRATEGY_PRIORITY_HIGH = 'HIGH';
const STATE_OFF = 'OFF'; const STATE_OFF = 'OFF';
const STATE_ON = 'ON'; const STATE_ON = 'ON';
const STATE_SUSPENDED = 'SUSPENDED'; const STATE_SUSPENDED = 'SUSPENDED';
......
...@@ -334,4 +334,14 @@ class DictionaryCampaign extends Pivot ...@@ -334,4 +334,14 @@ class DictionaryCampaign extends Pivot
return $this->hasMany(GoalKeyword::class, 'dictionary_campaign_id'); return $this->hasMany(GoalKeyword::class, 'dictionary_campaign_id');
} }
public function goalKeywordsForNotExternal()
{
return $this->goalKeywords()->forNotExternal();
}
public function goalKeywordsForNeedUpdated()
{
return $this->goalKeywords()->needUpdated();
}
} }
...@@ -149,4 +149,9 @@ class GoalKeyword extends Pivot ...@@ -149,4 +149,9 @@ class GoalKeyword extends Pivot
return $this->belongsTo(Keyword::class, 'keyword_id'); return $this->belongsTo(Keyword::class, 'keyword_id');
} }
public function dictionaryCampaign()
{
return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id');
}
} }
...@@ -57,6 +57,11 @@ class AddAdGroups extends DirectRequest ...@@ -57,6 +57,11 @@ class AddAdGroups extends DirectRequest
Log::debug($this->getParams()); Log::debug($this->getParams());
} }
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['AddResults'] as $key => $add_result) { foreach ($response['result']['AddResults'] as $key => $add_result) {
if (!isset($add_result['Id'])) { if (!isset($add_result['Id'])) {
Log::debug("AddAdGroup, empty Id"); Log::debug("AddAdGroup, empty Id");
...@@ -157,7 +162,7 @@ class AddAdGroups extends DirectRequest ...@@ -157,7 +162,7 @@ class AddAdGroups extends DirectRequest
} }
return $data; return $data;
})->all(), })->toArray(),
]); ]);
} }
......
...@@ -57,6 +57,11 @@ class AddCampaigns extends DirectRequest ...@@ -57,6 +57,11 @@ class AddCampaigns extends DirectRequest
Log::debug($this->getParams()); Log::debug($this->getParams());
} }
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['AddResults'] as $key => $add_result) { foreach ($response['result']['AddResults'] as $key => $add_result) {
if (!isset($add_result['Id'])) { if (!isset($add_result['Id'])) {
Log::debug("AddCampaigns, empty Id"); Log::debug("AddCampaigns, empty Id");
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Pivots\GoalKeyword;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
class AddKeywords extends DirectRequest
{
protected $max_count = 1000;
protected $timestamp;
/* @var Collection|GoalKeyword[] */
protected $goalKeywords;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function getObjectsCount()
{
return count($this->getParams()['Keywords']);
}
public function slice($maxObjects): ?APIRequest
{
$splinter = $this->sliceByKey($maxObjects, 'Keywords');
$splinter->putParams([
'goalKeywords' => $this->goalKeywords->slice($maxObjects)->values(),
]);
$this->putParams([
'goalKeywords' => $this->goalKeywords->slice(0, $maxObjects),
]);
return $splinter;
}
public function handle($response)
{
try {
if (!isset($response['result']['AddResults'])) {
Log::debug($response);
Log::debug($this->getParams());
}
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['AddResults'] as $key => $add_result) {
if (!isset($add_result['Id'])) {
Log::debug("AddKeywords, empty Id");
Log::debug($add_result);
Log::debug($this->getParams());
continue;
}
$external_id = (string)$add_result['Id'];
$goalKeyword = $this->goalKeywords->get($key);
$goalKeyword->update([
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
]);
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
public function putParams($params)
{
$this->goalKeywords = $params['goalKeywords'];
}
private function requestPrepare($params)
{
$this->setService('Keywords');
$this->setMethod('add');
$this->putParams($params);
$this->setParams([
'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) {
$keyword = $goalKeyword->keyword;
$data = [
'Keyword' => $keyword,
'AdGroupId' => $goalKeyword->goal_ad_group_external_id,
];
if ($keyword->bid) {
$data['Bid'] = $keyword->bid;
}
if ($keyword->context_bid) {
$data['ContextBid'] = $keyword->context_bid;
}
if ($keyword->strategy_priority) {
$data['StrategyPriority'] = $keyword->strategy_priority;
}
if ($keyword->state) {
$data['State'] = $keyword->state;
}
if ($keyword->state) {
$data['Status'] = $keyword->state;
}
if ($keyword->user_param_1) {
$data['UserParam1'] = $keyword->user_param_1;
}
if ($keyword->user_param_2) {
$data['UserParam2'] = $keyword->user_param_2;
}
return $data;
})->toArray(),
]);
}
}
...@@ -4,15 +4,12 @@ namespace App\Service\Requests\Direct; ...@@ -4,15 +4,12 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI; use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup; use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Keyword; use App\Models\Keyword;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup; use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword; use App\Models\Pivots\GoalKeyword;
use App\Service\Contract\APIRequest; use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest; use App\Service\Requests\DirectRequest;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class GetKeywords extends DirectRequest class GetKeywords extends DirectRequest
...@@ -116,6 +113,7 @@ class GetKeywords extends DirectRequest ...@@ -116,6 +113,7 @@ class GetKeywords extends DirectRequest
'user_param_2' => $keyword['UserParam2'], 'user_param_2' => $keyword['UserParam2'],
'bid' => $keyword['Bid'], 'bid' => $keyword['Bid'],
'context_bid' => $keyword['ContextBid'], 'context_bid' => $keyword['ContextBid'],
'strategy_priority' => $keyword['StrategyPriority'],
'state' => $keyword['State'], 'state' => $keyword['State'],
'status' => $keyword['Status'], 'status' => $keyword['Status'],
'serving_status' => $keyword['ServingStatus'], 'serving_status' => $keyword['ServingStatus'],
......
...@@ -47,6 +47,11 @@ class UpdateAdGroups extends DirectRequest ...@@ -47,6 +47,11 @@ class UpdateAdGroups extends DirectRequest
Log::debug($this->getParams()); Log::debug($this->getParams());
} }
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['UpdateResults'] as $key => $update_result) { foreach ($response['result']['UpdateResults'] as $key => $update_result) {
if (!isset($update_result['Id'])) { if (!isset($update_result['Id'])) {
Log::debug("UpdateAdGroup, empty Id"); Log::debug("UpdateAdGroup, empty Id");
......
...@@ -38,6 +38,11 @@ class UpdateCampaigns extends DirectRequest ...@@ -38,6 +38,11 @@ class UpdateCampaigns extends DirectRequest
public function handle($response) public function handle($response)
{ {
try { try {
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['UpdateResults'] as $key => $add_result) { foreach ($response['result']['UpdateResults'] as $key => $add_result) {
if (!isset($add_result['Id'])) { if (!isset($add_result['Id'])) {
Log::debug("UpdateCampaigns, empty Id"); Log::debug("UpdateCampaigns, empty Id");
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword;
use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use App\Service\StrReplaceByVariables;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
class UpdateKeywords extends DirectRequest
{
protected $max_count = 1000;
protected $timestamp;
/* @var Collection|GoalKeyword[] */
protected $goalKeywords;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function getObjectsCount()
{
return count($this->getParams()['Keywords']);
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, 'Keywords');
}
public function handle($response)
{
try {
if (!isset($response['result']['UpdateResults'])) {
Log::debug($response);
Log::debug($this->getParams());
}
if (isset($response['result']['Errors'])) {
Log::debug($response['Errors']);
Log::debug($this->getParams());
}
foreach ($response['result']['UpdateResults'] as $key => $update_result) {
if (!isset($update_result['Id'])) {
Log::debug("UpdateAdGroup, empty Id");
Log::debug($update_result);
Log::debug($this->getParams());
continue;
}
$external_id =(string) $update_result['Id'];
GoalKeyword::forExternal()->needUpdated()
->where('external_id', $external_id)
->update([
'updated_need' => null,
]);
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
private function requestPrepare($params)
{
$this->setService('Keywords');
$this->setMethod('update');
$this->setParams([
'Keywords' => $this->goalKeywords->map(function (GoalKeyword $goalKeyword) {
$keyword = $goalKeyword->keyword;
$data = [
'Id' => $goalKeyword->external_id,
'Keyword' => $keyword->keyword,
];
if ($keyword->user_param_1) {
$data['UserParam1'] = $keyword->user_param_1;
}
if ($keyword->user_param_2) {
$data['UserParam2'] = $keyword->user_param_2;
}
return $data;
})->toArray(),
]);
}
}
...@@ -42,6 +42,11 @@ class CreateKeywordsTable extends Migration ...@@ -42,6 +42,11 @@ class CreateKeywordsTable extends Migration
$table->string('user_param_2', 255)->nullable(); $table->string('user_param_2', 255)->nullable();
$table->bigInteger('bid')->nullable(); $table->bigInteger('bid')->nullable();
$table->bigInteger('context_bid')->nullable(); $table->bigInteger('context_bid')->nullable();
$table->enum('strategy_priority', [
Keyword::STRATEGY_PRIORITY_LOW,
Keyword::STRATEGY_PRIORITY_NORMAL,
Keyword::STRATEGY_PRIORITY_HIGH,
])->nullable();
$table->enum('state', [ $table->enum('state', [
Keyword::STATE_OFF, Keyword::STATE_OFF,
Keyword::STATE_ON, Keyword::STATE_ON,
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!