Commit 7ddeb34a by Vladislav

#20347 Синхронизация наборов минус фраз

1 parent e4cb12e3
......@@ -52,6 +52,7 @@ class AdGroupsAdd extends Command
return $query->has('group');
},
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternalForNotReserveCreate.group',
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForNotExternalForNotReserveCreate.goalNegativeKeywordSharedSets',
]);
$goalAdGroups = $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('groupsForNotExternalForNotReserveCreate')
......
......@@ -53,6 +53,7 @@ class AdGroupsUpdate extends Command
return $query->has('group');
},
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdatedForNotReserveUpdate.group',
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdatedForNotReserveUpdate.goalNegativeKeywordSharedSets',
]);
$goalAdGroups = $token->dictionaryCampaignsEnabledForExternalUpdated->pluck('groupsForExternalForNeedUpdatedForNotReserveUpdate')
......
......@@ -142,6 +142,21 @@ class DictionaryCampaignsSyncByCampaign extends Command
WHERE gag.ad_group_id is null
");
//грузим связь наборов минус-фраз к группам которых по какой то причне нет в целевых.
DB::insert("
INSERT INTO goal_ad_group_goal_negative_keyword_shared_sets(goal_ad_group_id, goal_negative_keyword_shared_set_id, created_at, updated_at)
SELECT gag.id, gnkss.id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
FROM ad_group_negative_keyword_shared_sets agnkss
INNER JOIN negative_keyword_shared_sets nkss on agnkss.negative_keyword_shared_set_id = nkss.id and nkss.deleted_at is null
INNER JOIN goal_negative_keyword_shared_sets gnkss on nkss.id = gnkss.negative_keyword_shared_set_id
INNER JOIN ad_groups ag on agnkss.ad_group_id = ag.id and ag.deleted_at is null
INNER JOIN goal_ad_groups gag on ag.id = gag.ad_group_id
INNER JOIN dictionary_campaigns dc on gag.dictionary_campaign_id = dc.id
INNER JOIN dictionaries d on dc.dictionary_id = d.id and d.token_id = gnkss.token_id
LEFT JOIN goal_ad_group_goal_negative_keyword_shared_sets gaggnkss on gnkss.id = gaggnkss.goal_negative_keyword_shared_set_id and gag.id = gaggnkss.goal_ad_group_id
WHERE gaggnkss.goal_negative_keyword_shared_set_id is null
");
//грузим ключевые фразы которых по какой то причне нет в целевых.
DB::insert("
INSERT INTO goal_keywords(dictionary_campaign_external_id, goal_ad_group_external_id, dictionary_campaign_id,
......@@ -191,7 +206,7 @@ class DictionaryCampaignsSyncByCampaign extends Command
WHERE gad.advertisement_id is null and ad.campaign_id is not null
");
//грузим связь объевлений к расширения которых по какой то причне нет в целевых.
//грузим связь объявлений к расширения которых по какой то причне нет в целевых.
DB::insert("
INSERT INTO goal_advertisement_goal_ad_extensions(goal_advertisement_id, goal_ad_extension_id, created_at, updated_at)
SELECT ga.id, gae.id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
......
<?php
namespace App\Console\Commands;
use App\Models\Pivots\GoalNegativeKeywordSharedSet;
use App\Models\Tokens;
use App\Service\Requests\Direct\AddNegativeKeywordSharedSets;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\HasMany;
class NegativeKeywordSharedSetsUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'negativekeywordsharedsets: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
* @throws \Exception
*/
public function handle()
{
$tokens = Tokens::whereHas('goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate.negativeKeywordSharedSet')
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$token->load([
'goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate' => function (HasMany $query) {
return $query->has('negativeKeywordSharedSet');
},
'goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate.negativeKeywordSharedSet',
]);
$goalNegativeKeywordSharedSets = $token->goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate;
foreach (array_chunk($goalNegativeKeywordSharedSets->pluck('id')->toArray(), 1000) as $items) {
GoalNegativeKeywordSharedSet::whereIn('id', $items)
->update([
'reserve_update_at' => Carbon::now(),
]);
}
$request = new AddNegativeKeywordSharedSets();
$request->setToken($token)
->call([
'goalNegativeKeywordSharedSets' => $goalNegativeKeywordSharedSets,
]);
}
return 0;
}
}
......@@ -26,6 +26,7 @@ use App\Console\Commands\KeywordsDelete;
use App\Console\Commands\KeywordsUpdate;
use App\Console\Commands\NegativeKeywordSharedSetsAdd;
use App\Console\Commands\NegativeKeywordSharedSetsLoad;
use App\Console\Commands\NegativeKeywordSharedSetsUpdate;
use App\Console\Commands\RefreshLimits;
use App\Console\Commands\SitelinksAdd;
use App\Console\Commands\SitelinksLoad;
......@@ -64,6 +65,7 @@ class Kernel extends ConsoleKernel
$schedule->command(NegativeKeywordSharedSetsLoad::class)->hourlyAt(10);
$schedule->command(NegativeKeywordSharedSetsAdd::class)->hourlyAt(15);
$schedule->command(NegativeKeywordSharedSetsUpdate::class)->hourlyAt(15);
$schedule->command(CampaignsAdd::class)->hourlyAt(15);
$schedule->command(CampaignsUpdate::class)->hourlyAt(15);
......
......@@ -2,6 +2,7 @@
namespace App\Models;
use App\Models\Pivots\AdGroupNegativeKeywordSharedSet;
use App\Models\Pivots\GoalAdGroup;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
......@@ -25,7 +26,7 @@ use Illuminate\Support\Collection;
* @property array|null $restricted_region_ids
* @property array|null $region_ids
* @property array|null $negative_keywords
* @property array|null $negative_keyword_shared_set_ids
* @property array|null $negative_keyword_shared_set_external_ids
* @property array|null $mobile_app_ad_group
* @property array|null $dynamic_text_ad_group
* @property array|null $dynamic_text_feed_ad_group
......@@ -109,7 +110,7 @@ class AdGroup extends Model
'name',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'negative_keyword_shared_set_external_ids',
'tracking_params',
'mobile_app_ad_group',
'dynamic_text_ad_group',
......@@ -129,7 +130,7 @@ class AdGroup extends Model
protected $casts = [
'region_ids' => 'array',
'negative_keywords' => 'json',
'negative_keyword_shared_set_ids' => 'json',
'negative_keyword_shared_set_external_ids' => 'array',
'mobile_app_ad_group' => 'json',
'dynamic_text_ad_group' => 'json',
'dynamic_text_feed_ad_group' => 'json',
......@@ -150,7 +151,7 @@ class AdGroup extends Model
'name',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'negative_keyword_shared_set_external_ids',
'tracking_params',
'mobile_app_ad_group',
'dynamic_text_ad_group',
......@@ -203,6 +204,14 @@ class AdGroup extends Model
return $this->hasMany(Keyword::class, 'ad_group_id');
}
public function negativeKeywordSharedSets()
{
return $this->belongsToMany(NegativeKeywordSharedSet::class, AdGroupNegativeKeywordSharedSet::getModel()->getTable(), 'ad_group_id', 'negative_keyword_shared_set_id')
->using(AdGroupNegativeKeywordSharedSet::class)
->withPivot(AdGroupNegativeKeywordSharedSet::getWithPivot())
->withTimestamps();
}
public function campaign()
{
return $this->belongsTo(Campaigns::class, 'campaign_id');
......
<?php
namespace App\Models\Pivots;
use App\Models\AdGroup;
use App\Models\NegativeKeywordSharedSet;
use Illuminate\Database\Eloquent\Relations\Pivot;
class AdGroupNegativeKeywordSharedSet extends Pivot
{
protected $table = 'ad_group_negative_keyword_shared_sets';
protected $fillable = [
'ad_group_id',
'negative_keyword_shared_set_id',
];
public $incrementing = true;
static public function getWithPivot()
{
return [
'id',
'ad_group_id',
'negative_keyword_shared_set_id',
];
}
public function adGroup()
{
return $this->belongsTo(AdGroup::class, 'ad_group_id');
}
public function negativeKeywordSharedSet()
{
return $this->belongsTo(NegativeKeywordSharedSet::class, 'negative_keyword_shared_set_id');
}
}
......@@ -26,7 +26,7 @@ class AdvertisementAdExtension extends Pivot
];
}
public function Advertisement()
public function advertisement()
{
return $this->belongsTo(Advertisement::class, 'advertisement_id');
}
......
......@@ -224,6 +224,14 @@ class GoalAdGroup extends Pivot
return $this->hasMany(GoalKeyword::class, 'goal_ad_group_id');
}
public function goalNegativeKeywordSharedSets()
{
return $this->belongsToMany(GoalNegativeKeywordSharedSet::class, GoalAdGroupGoalNegativeKeywordSharedSet::getModel()->getTable(), 'goal_ad_group_id', 'goal_negative_keyword_shared_set_id')
->using(GoalAdGroupGoalNegativeKeywordSharedSet::class)
->withPivot(GoalAdGroupGoalNegativeKeywordSharedSet::getWithPivot())
->withTimestamps();
}
public function goalAdvertisements()
{
return $this->hasMany(GoalAdvertisement::class, 'goal_ad_group_id');
......
<?php
namespace App\Models\Pivots;
use Illuminate\Database\Eloquent\Relations\Pivot;
class GoalAdGroupGoalNegativeKeywordSharedSet extends Pivot
{
protected $table = 'goal_ad_group_goal_negative_keyword_shared_sets';
protected $fillable = [
'goal_ad_group_id',
'goal_negative_keyword_shared_set_id',
];
public $incrementing = true;
static public function getWithPivot()
{
return [
'id',
'goal_ad_group_id',
'goal_negative_keyword_shared_set_id',
];
}
public function goalAdGroup()
{
return $this->belongsTo(GoalAdGroup::class, 'goal_ad_group_id');
}
public function goalNegativeKeywordSharedSet()
{
return $this->belongsTo(GoalNegativeKeywordSharedSet::class, 'goal_negative_keyword_shared_set_id');
}
}
......@@ -26,7 +26,7 @@ class GoalAdvertisementGoalAdExtension extends Pivot
];
}
public function GoalAdvertisement()
public function goalAdvertisement()
{
return $this->belongsTo(GoalAdvertisement::class, 'goal_advertisement_id');
}
......
......@@ -59,6 +59,7 @@ use Illuminate\Database\Eloquent\Model;
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalAdExtension[] $goalAdExtensionsForNotExternalForNotReserveCreate
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSets
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSetsForNotExternalForNotReserveCreate
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Limits[] $limits
* @property-read int|null $limits_count
* @property string|null $timestamp
......@@ -282,6 +283,11 @@ class Tokens extends Model
return $this->goalNegativeKeywordSharedSets()->forNotExternal()->forNotReserveCreate();
}
public function goalNegativeKeywordSharedSetsForExternalForNotReserveUpdate()
{
return $this->goalNegativeKeywordSharedSets()->forExternal()->forNotReserveUpdate();
}
public function goalSitelinks()
{
return $this->hasMany(GoalSitelink::class, 'token_id');
......
......@@ -177,9 +177,9 @@ class AddAdGroups extends DirectRequest
];
}
if ($goalAdGroup->group->negative_keyword_shared_set_ids && isset($goalAdGroup->group->negative_keyword_shared_set_ids['Items']) && count($goalAdGroup->group->negative_keyword_shared_set_ids['Items'])) {
if ($goalAdGroup->goalNegativeKeywordSharedSets->count()) {
$data['NegativeKeywordSharedSetIds'] = [
'Items' => $goalAdGroup->group->negative_keyword_shared_set_ids['Items'],
'Items' => $goalAdGroup->goalNegativeKeywordSharedSets->pluck('external_id')->toArray(),
];
}
......
......@@ -64,20 +64,22 @@ class AddNegativeKeywordSharedSets extends DirectRequest
Log::debug($add_result);
Log::debug($this->getParams()['NegativeKeywordSharedSets'][$key]);
$goalNegativeKeywordSharedSet->update([
'reserve_create_at' => null,
]);
GoalNegativeKeywordSharedSet::where('external_id', $goalNegativeKeywordSharedSet->external_id)
->update([
'reserve_create_at' => null,
]);
continue;
}
$external_id = (string)$add_result['Id'];
$goalNegativeKeywordSharedSet->update([
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
'reserve_create_at' => null,
]);
GoalNegativeKeywordSharedSet::where('external_id', $external_id)
->update([
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
'reserve_create_at' => null,
]);
}
} catch (\Exception $e) {
......
......@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\NegativeKeywordSharedSet;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Service\Contract\APIRequest;
......@@ -93,6 +94,8 @@ class GetAdGroups extends DirectRequest
if ($this->getToken()->isMain()) {
$negative_keyword_shared_sets = collect();
$data = [
'campaign_id' => $campaign->getKey(),
'external_id' => $external_id,
......@@ -100,7 +103,6 @@ class GetAdGroups extends DirectRequest
'name' => $ad_group['Name'],
'region_ids' => $ad_group['RegionIds'],
'negative_keywords' => $ad_group['NegativeKeywords'],
'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'],
'tracking_params' => $ad_group['TrackingParams'],
'mobile_app_ad_group' => $ad_group['MobileAppAdGroup'] ?? null,
'dynamic_text_ad_group' => $ad_group['DynamicTextAdGroup'] ?? null,
......@@ -117,10 +119,31 @@ class GetAdGroups extends DirectRequest
'updated_self' => null,
];
$negative_keyword_shared_set_external_ids_array = [];
foreach ($ad_group['NegativeKeywordSharedSetIds']['Items'] ?? [] as $negative_keyword_shared_set_external_id) {
$negative_keyword_shared_set_external_id = (string)$negative_keyword_shared_set_external_id;
$negativeKeywordSharedSet = NegativeKeywordSharedSet::firstWhere('external_id', $negative_keyword_shared_set_external_id);
if (!$negativeKeywordSharedSet) {
$negative_keyword_shared_set_external_ids_array[] = $negative_keyword_shared_set_external_id;
continue;
}
$negative_keyword_shared_sets->push($negativeKeywordSharedSet);
}
$data['negative_keyword_shared_set_external_ids'] = $negative_keyword_shared_set_external_ids_array;
$ad_group = AdGroup::updateOrCreate([
'external_id' => $external_id,
], $data);
$ad_group->negativeKeywordSharedSets()->sync($negative_keyword_shared_sets->pluck('id'));
if ($ad_group->wasRecentlyCreated) {
$campaign_ids_synced_need[$ad_group->campaign_id] = true;
} elseif ($ad_group->wasChanged(['campaign_id'])) {
......
......@@ -136,9 +136,9 @@ class UpdateAdGroups extends DirectRequest
];
}
if ($goalAdGroup->group->negative_keyword_shared_set_ids && isset($goalAdGroup->group->negative_keyword_shared_set_ids['Items']) && count($goalAdGroup->group->negative_keyword_shared_set_ids['Items'])) {
if ($goalAdGroup->goalNegativeKeywordSharedSets->count()) {
$data['NegativeKeywordSharedSetIds'] = [
'Items' => $goalAdGroup->group->negative_keyword_shared_set_ids['Items'],
'Items' => $goalAdGroup->goalNegativeKeywordSharedSets->pluck('external_id')->toArray(),
];
}
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\NegativeKeywordSharedSet;
use App\Models\Pivots\GoalNegativeKeywordSharedSet;
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 UpdateNegativeKeywordSharedSets extends DirectRequest
{
protected $max_count = 30;
protected $timestamp;
/* @var Collection|NegativeKeywordSharedSet[] */
protected $goalNegativeKeywordSharedSets;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function getObjectsCount()
{
return count($this->getParams()['NegativeKeywordSharedSets']);
}
public function slice($maxObjects): ?APIRequest
{
$splinter = $this->sliceByKey($maxObjects, 'NegativeKeywordSharedSets');
$splinter->putParams([
'goalNegativeKeywordSharedSets' => $this->goalNegativeKeywordSharedSets->slice($maxObjects)->values(),
]);
$this->putParams([
'goalNegativeKeywordSharedSets' => $this->goalNegativeKeywordSharedSets->slice(0, $maxObjects),
]);
return $splinter;
}
public function handle($response)
{
try {
if (!isset($response['result']['UpdateResults'])) {
return;
}
foreach ($response['result']['UpdateResults'] as $key => $update_result) {
$goalNegativeKeywordSharedSet = $this->goalNegativeKeywordSharedSets->get($key);
if (!isset($update_result['Id'])) {
Log::debug("UpdateNegativeKeywordSharedSet, empty Id");
Log::debug($update_result);
Log::debug($this->getParams()['NegativeKeywordSharedSets'][$key]);
GoalNegativeKeywordSharedSet::where('external_id', $goalNegativeKeywordSharedSet->external_id)
->update([
'reserve_update_at' => null,
]);
continue;
}
$external_id = (string)$update_result['Id'];
GoalNegativeKeywordSharedSet::where('external_id', $external_id)
->update([
'updated_need' => null,
'reserve_update_at' => null,
]);
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
public function failed()
{
GoalNegativeKeywordSharedSet::whereIn('id', $this->goalNegativeKeywordSharedSets->pluck('id')->toArray())
->update([
'reserve_update_at' => null,
]);
}
public function putParams($params)
{
$this->goalNegativeKeywordSharedSets = $params['goalNegativeKeywordSharedSets'];
}
private function requestPrepare($params)
{
$this->setService('NegativeKeywordSharedSets');
$this->setMethod('update');
$this->putParams($params);
$variables = Variable::all();
$lists = [];
$this->setParams([
'NegativeKeywordSharedSets' => $this->goalNegativeKeywordSharedSets->map(function (GoalNegativeKeywordSharedSet $goalNegativeKeywordSharedSet) use ($variables, &$lists) {
if (!isset($lists[$goalNegativeKeywordSharedSet->dictionary_campaign_id])) {
$list = Variable::getListVariablesByDictionaryCampaign($goalNegativeKeywordSharedSet->dictionary_campaign_id, $variables);
$lists[$goalNegativeKeywordSharedSet->dictionary_campaign_id] = $list;
} else {
$list = $lists[$goalNegativeKeywordSharedSet->dictionary_campaign_id];
}
return [
'Id' => $goalNegativeKeywordSharedSet->external_id,
'Name' => StrReplaceByVariables::getInstance($goalNegativeKeywordSharedSet->negativeKeywordSharedSet->name, $list)->get(),
'NegativeKeywords' => array_map(function ($negative_keyword) use ($list) {
return StrReplaceByVariables::getInstance($negative_keyword, $list)->get();
}, $goalNegativeKeywordSharedSet->negativeKeywordSharedSet->negative_keywords),
];
})->toArray(),
]);
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdGroupNegativeKeywordSharedSetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ad_group_negative_keyword_shared_sets', function (Blueprint $table) {
$table->id();
$table->bigInteger('ad_group_id')->unsigned();
$table->bigInteger('negative_keyword_shared_set_id')->unsigned();
$table->foreign('ad_group_id', 'agnkss_ad_group_id_foreign')->references('id')->on('ad_groups')
->cascadeOnDelete();
$table->foreign('negative_keyword_shared_set_id', 'agnkss_negative_keyword_shared_set_id_foreign')->references('id')->on('negative_keyword_shared_sets')
->cascadeOnDelete();
$table->timestamps();
});
Schema::table('ad_groups', function (Blueprint $table) {
$table->renameColumn('negative_keyword_shared_set_ids', 'negative_keyword_shared_set_external_ids');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ad_group_negative_keyword_shared_sets');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGoalAdGroupGoalNegativeKeywordSharedSetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('goal_ad_group_goal_negative_keyword_shared_sets', function (Blueprint $table) {
$table->id();
$table->bigInteger('goal_ad_group_id')->unsigned();
$table->bigInteger('goal_negative_keyword_shared_set_id')->unsigned();
$table->foreign('goal_ad_group_id', 'gaggnkss_ad_group_id_foreign')->references('id')->on('goal_ad_groups')
->cascadeOnDelete();
$table->foreign('goal_negative_keyword_shared_set_id', 'gaggnkss_negative_keyword_shared_set_id_foreign')->references('id')->on('goal_negative_keyword_shared_sets')
->cascadeOnDelete();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('goal_ad_group_goal_negative_keyword_shared_sets');
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!