Commit addba62f by Vladislav

#20304 Проблемы на epl3

1 parent 83188a98
...@@ -45,18 +45,47 @@ class DictionaryCampaignsSyncByCampaign extends Command ...@@ -45,18 +45,47 @@ class DictionaryCampaignsSyncByCampaign extends Command
{ {
Campaigns::has('dictionaryCampaignSynchronizedNeedSynced')->forManaged()->get()->each(function (Campaigns $campaign) { Campaigns::has('dictionaryCampaignSynchronizedNeedSynced')->forManaged()->get()->each(function (Campaigns $campaign) {
$campaign->load([ $campaign->load([
'groups.keywords', 'groupsForNotKeywordsLoadable.keywords',
'dictionaryCampaignSynchronizedNeedSynced' 'dictionaryCampaignSynchronizedNeedSynced'
]); ]);
$campaign->dictionaryCampaignSynchronizedNeedSynced->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) { $campaign->dictionaryCampaignSynchronizedNeedSynced->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) { $campaign->groupsForNotKeywordsLoadable->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign); $goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
$adGroup->keywords->each(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) { $data_keywords = $adGroup->keywords->map(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign); return GoalKeyword::getDataByMain($keyword, $goalAdGroup, $dictionaryCampaign);
})->toArray();
GoalKeyword::upsert($data_keywords, [
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
], [
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
]);
$goalKeywordQuery = GoalKeyword::where('dictionary_campaign_id', $dictionaryCampaign->getKey())
->where('goal_ad_group_id', $goalAdGroup->getKey());
if (count($data_keywords)) {
$goalKeywordQuery->whereNotIn('keyword_id', array_column($data_keywords, 'keyword_id'));
}
$goalKeywords = $goalKeywordQuery->get();
$goalKeywords->each(function (GoalKeyword $goalKeyword) {
$goalKeyword->delete();
}); });
}); });
......
...@@ -281,9 +281,7 @@ class TokensController extends Controller ...@@ -281,9 +281,7 @@ class TokensController extends Controller
} }
$dictionary->token()->dissociate(); $dictionary->token()->dissociate();
$dictionary->dictionaryCampaigns->each(function (DictionaryCampaign $dictionaryCampaign) { $dictionary->dictionaryCampaigns()->delete();
$dictionaryCampaign->delete();
});
$dictionary->save(); $dictionary->save();
return Redirect::route('token.edit', $token->getKey())->with('success', 'City deleted.'); return Redirect::route('token.edit', $token->getKey())->with('success', 'City deleted.');
......
...@@ -50,6 +50,7 @@ use Illuminate\Support\Collection; ...@@ -50,6 +50,7 @@ use Illuminate\Support\Collection;
* @method static Builder|AdGroup whereMobileAppAdGroup($value) * @method static Builder|AdGroup whereMobileAppAdGroup($value)
* @method static Builder|AdGroup whereSmartAdGroup($value) * @method static Builder|AdGroup whereSmartAdGroup($value)
* @method static Builder|AdGroup forKeywordsLoadable() * @method static Builder|AdGroup forKeywordsLoadable()
* @method static Builder|AdGroup forNotKeywordsLoadable()
* @method static Builder|AdGroup forUpdatedSelf() * @method static Builder|AdGroup forUpdatedSelf()
* @method static Builder|AdGroup newModelQuery() * @method static Builder|AdGroup newModelQuery()
* @method static Builder|AdGroup newQuery() * @method static Builder|AdGroup newQuery()
...@@ -163,34 +164,6 @@ class AdGroup extends Model ...@@ -163,34 +164,6 @@ class AdGroup extends Model
public static function boot() public static function boot()
{ {
parent::boot(); parent::boot();
static::created(function (AdGroup $ad_group) {
if ($ad_group->campaign) {
$ad_group->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
});
static::updated(function (AdGroup $ad_group) {
if (GoalAdGroup::getPropertiesCopyWithPivot()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
if (self::getPropertiesWatch()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->goalGroups()->has('dictionaryCampaignSynchronized')->forExternal()->update([
'updated_need' => Carbon::now(),
]);
}
});
} }
/** /**
...@@ -211,6 +184,15 @@ class AdGroup extends Model ...@@ -211,6 +184,15 @@ class AdGroup extends Model
return $query->whereNull('keywords_loaded_at'); return $query->whereNull('keywords_loaded_at');
} }
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotKeywordsLoadable($query)
{
return $query->whereNotNull('keywords_loaded_at');
}
public function goalGroups() public function goalGroups()
{ {
return $this->hasMany(GoalAdGroup::class, 'ad_group_id'); return $this->hasMany(GoalAdGroup::class, 'ad_group_id');
......
...@@ -42,6 +42,7 @@ use Illuminate\Support\Collection; ...@@ -42,6 +42,7 @@ use Illuminate\Support\Collection;
* @property-read int|null $dictionaries_count * @property-read int|null $dictionaries_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groupsForKeywordsLoadable * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groupsForKeywordsLoadable
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groupsForNotKeywordsLoadable
* @property-read int|null $groups_count * @property-read int|null $groups_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables
* @property-read int|null $dictionary_campaign_variables_count * @property-read int|null $dictionary_campaign_variables_count
...@@ -222,41 +223,6 @@ class Campaigns extends Model ...@@ -222,41 +223,6 @@ class Campaigns extends Model
}); });
} }
public function copyGroupInGoalGroup()
{
$campaign = $this;
$campaign->dictionaryCampaignSynchronized->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
});
});
}
public function copyGroupInGoalKeyword()
{
$campaign = $this;
$campaign->dictionaryCampaignSynchronized->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$dictionaryCampaign->groups->each(function (GoalAdGroup $goalAdGroup) use ($campaign, $dictionaryCampaign) {
$goalAdGroup->group->keywords()->where('campaign_id', $campaign->getKey())->get()->each(function (Keyword $keyword) use ($dictionaryCampaign, $goalAdGroup) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign);
});
});
});
}
public function getBiddingStrategyAttribute($bidding_strategy) public function getBiddingStrategyAttribute($bidding_strategy)
{ {
$bidding_strategy = json_decode($bidding_strategy, true); $bidding_strategy = json_decode($bidding_strategy, true);
...@@ -343,6 +309,11 @@ class Campaigns extends Model ...@@ -343,6 +309,11 @@ class Campaigns extends Model
return $this->groups()->forKeywordsLoadable(); return $this->groups()->forKeywordsLoadable();
} }
public function groupsForNotKeywordsLoadable()
{
return $this->groups()->forNotKeywordsLoadable();
}
public function dictionaryCampaigns() public function dictionaryCampaigns()
{ {
return $this->hasMany(DictionaryCampaign::class, 'campaign_id'); return $this->hasMany(DictionaryCampaign::class, 'campaign_id');
......
...@@ -110,35 +110,6 @@ class Keyword extends Model ...@@ -110,35 +110,6 @@ class Keyword extends Model
{ {
parent::boot(); parent::boot();
static::created(function (Keyword $keyword) {
if ($keyword->campaign) {
$keyword->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
});
static::updated(function (Keyword $keyword) {
if (GoalKeyword::getPropertiesCopyWithPivot()->first(function ($property_name) use ($keyword) {
return $keyword->{$property_name} !== $keyword->getOriginal($property_name);
})) {
$keyword->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
if (self::getPropertiesWatch()->first(function ($property_name) use ($keyword) {
return $keyword->{$property_name} !== $keyword->getOriginal($property_name);
})) {
$keyword->goalKeywords()->update([
'updated_need' => Carbon::now(),
]);
}
});
static::deleted(function (Keyword $keyword) { static::deleted(function (Keyword $keyword) {
if (!$keyword->isForceDeleting()) { if (!$keyword->isForceDeleting()) {
$keyword->goalKeywords->each(function (GoalKeyword $goalKeyword) { $keyword->goalKeywords->each(function (GoalKeyword $goalKeyword) {
......
...@@ -117,7 +117,7 @@ class GoalAdGroup extends Pivot ...@@ -117,7 +117,7 @@ class GoalAdGroup extends Pivot
'dictionary_campaign_external_id' => $dictionaryCampaign->external_id, 'dictionary_campaign_external_id' => $dictionaryCampaign->external_id,
'ad_group_id' => $adGroup->getKey(), 'ad_group_id' => $adGroup->getKey(),
'deleted_at' => null, 'deleted_at' => null,
], GoalAdGroup::copyPropertyFromMain($adGroup)); ]);
} }
/** /**
...@@ -192,11 +192,6 @@ class GoalAdGroup extends Pivot ...@@ -192,11 +192,6 @@ class GoalAdGroup extends Pivot
return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id'); return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id');
} }
public function dictionaryCampaignSynchronized()
{
return $this->dictionaryCampaign()->synchronized();
}
public function goalKeywords() public function goalKeywords()
{ {
return $this->hasMany(GoalKeyword::class, 'goal_ad_group_id'); return $this->hasMany(GoalKeyword::class, 'goal_ad_group_id');
......
...@@ -122,16 +122,16 @@ class GoalKeyword extends Pivot ...@@ -122,16 +122,16 @@ class GoalKeyword extends Pivot
->all(); ->all();
} }
static public function updateOrCreateByMain(Keyword $keyword, GoalAdGroup $goalAdGroup, DictionaryCampaign $dictionaryCampaign) static public function getDataByMain(Keyword $keyword, GoalAdGroup $goalAdGroup, DictionaryCampaign $dictionaryCampaign)
{ {
return GoalKeyword::updateOrCreate([ return [
'dictionary_campaign_id' => $dictionaryCampaign->getKey(), 'dictionary_campaign_id' => $dictionaryCampaign->getKey(),
'dictionary_campaign_external_id' => $dictionaryCampaign->external_id, 'dictionary_campaign_external_id' => $dictionaryCampaign->external_id,
'goal_ad_group_id' => $goalAdGroup->getKey(), 'goal_ad_group_id' => $goalAdGroup->getKey(),
'goal_ad_group_external_id' => $goalAdGroup->external_id, 'goal_ad_group_external_id' => $goalAdGroup->external_id,
'keyword_id' => $keyword->getKey(), 'keyword_id' => $keyword->getKey(),
'deleted_at' => null, 'deleted_at' => null,
], GoalKeyword::copyPropertyFromMain($keyword)); ];
} }
/** /**
......
...@@ -83,6 +83,8 @@ class GetAdGroups extends DirectRequest ...@@ -83,6 +83,8 @@ class GetAdGroups extends DirectRequest
->keyBy('external_id'); ->keyBy('external_id');
} }
$campaign_ids_synced_need = [];
foreach ($response['result']['AdGroups'] as $ad_group) { foreach ($response['result']['AdGroups'] as $ad_group) {
$external_id = (string)$ad_group['CampaignId']; $external_id = (string)$ad_group['CampaignId'];
...@@ -122,13 +124,19 @@ class GetAdGroups extends DirectRequest ...@@ -122,13 +124,19 @@ class GetAdGroups extends DirectRequest
'updated_self' => null, 'updated_self' => null,
]; ];
AdGroup::updateOrCreate([ $ad_group = AdGroup::updateOrCreate([
'external_id' => $external_id, 'external_id' => $external_id,
], $data); ], $data);
$campaign->update([ if ($ad_group->wasRecentlyCreated) {
'groups_loaded_at' => Carbon::now(), $campaign_ids_synced_need[$ad_group->campaign_id] = true;
} elseif ($ad_group->wasChanged(['campaign_id'])) {
$campaign_ids_synced_need[$ad_group->campaign_id] = true;
} elseif ($ad_group->wasChanged($ad_group::getPropertiesWatch()->toArray())) {
$ad_group->goalGroups()->has('dictionaryCampaign')->forExternal()->update([
'updated_need' => Carbon::now(),
]); ]);
}
} else { } else {
$goalAdGroup = GoalAdGroup::firstWhere('external_id', $external_id); $goalAdGroup = GoalAdGroup::firstWhere('external_id', $external_id);
...@@ -149,6 +157,25 @@ class GetAdGroups extends DirectRequest ...@@ -149,6 +157,25 @@ class GetAdGroups extends DirectRequest
} }
if ($this->getToken()->isMain()) {
if (isset($this->getParams()['SelectionCriteria']['CampaignIds'])) {
Campaigns::whereIn('external_id', $this->getParams()['SelectionCriteria']['CampaignIds'])
->update([
'groups_loaded_at' => Carbon::now(),
]);
}
if (count($campaign_ids_synced_need)) {
Campaigns::findMany(array_keys($campaign_ids_synced_need))->each(function (Campaigns $campaign) {
$campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
});
}
}
} catch (\Exception $e) { } catch (\Exception $e) {
Log::debug($e); Log::debug($e);
throw $e; throw $e;
......
...@@ -4,6 +4,7 @@ namespace App\Service\Requests\Direct; ...@@ -4,6 +4,7 @@ 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\GoalAdGroup; use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword; use App\Models\Pivots\GoalKeyword;
...@@ -91,13 +92,15 @@ class GetKeywords extends DirectRequest ...@@ -91,13 +92,15 @@ class GetKeywords extends DirectRequest
} }
$ids = []; $ids = [];
$campaign_ids_synced_need = [];
foreach ($response['result']['Keywords'] as $keyword) { foreach ($response['result']['Keywords'] as $keyword) {
$ad_group = $ad_groups->get((string)$keyword['AdGroupId']); $ad_group = $ad_groups->get((string)$keyword['AdGroupId']);
if (!$ad_group) if (!$ad_group) {
continue; continue;
}
$external_id = (string)$keyword['Id']; $external_id = (string)$keyword['Id'];
...@@ -125,11 +128,17 @@ class GetKeywords extends DirectRequest ...@@ -125,11 +128,17 @@ class GetKeywords extends DirectRequest
'external_id' => $external_id 'external_id' => $external_id
], $data); ], $data);
$ids[] = $keyword->getKey(); if ($keyword->wasRecentlyCreated) {
$campaign_ids_synced_need[$keyword->campaign_id] = true;
$ad_group->update([ } elseif ($keyword->wasChanged(['campaign_id'])) {
'keywords_loaded_at' => Carbon::now(), $campaign_ids_synced_need[$keyword->campaign_id] = true;
} elseif ($keyword->wasChanged($keyword::getPropertiesWatch()->toArray())) {
$keyword->goalKeywords()->has('dictionaryCampaign')->forExternal()->update([
'updated_need' => Carbon::now(),
]); ]);
}
$ids[] = $keyword->getKey();
} else { } else {
$goalKeyword = GoalKeyword::firstWhere('external_id', $external_id); $goalKeyword = GoalKeyword::firstWhere('external_id', $external_id);
...@@ -154,6 +163,22 @@ class GetKeywords extends DirectRequest ...@@ -154,6 +163,22 @@ class GetKeywords extends DirectRequest
} }
if ($this->getToken()->isMain()) { if ($this->getToken()->isMain()) {
if (isset($this->getParams()['SelectionCriteria']['AdGroupIds'])) {
AdGroup::whereIn('external_id', $this->getParams()['SelectionCriteria']['AdGroupIds'])
->update([
'keywords_loaded_at' => Carbon::now(),
]);
}
if (count($campaign_ids_synced_need)) {
Campaigns::findMany(array_keys($campaign_ids_synced_need))->each(function (Campaigns $campaign) {
$campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
});
}
$keywordQuery = Keyword::query(); $keywordQuery = Keyword::query();
if (isset($this->getParams()['SelectionCriteria']['AdGroupIds'])) { if (isset($this->getParams()['SelectionCriteria']['AdGroupIds'])) {
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGoalKeywordsUnique extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('goal_keywords', function (Blueprint $table) {
$table->unique([
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
]);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!