Commit 1c27787c by Vladislav

#20794 Сделать чтобы в целевых РК оставалась одна карточка

1 parent 1477dd45
<?php
namespace App\Console\Commands;
use App\Models\Advertisement;
use App\Models\Pivots\GoalAdvertisement;
use App\Models\Tokens;
use App\Service\Requests\Direct\DeleteAds;
use Carbon\Carbon;
use Illuminate\Console\Command;
class AdvertisementsDelete extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'ads:delete';
/**
* 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()
{
$token = Tokens::firstWhere('type', '!=', Tokens::MAIN);
if ($token) {
$this->sendRequest($token, Advertisement::needDeleted()->forNotReserveDelete()->get());
}
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronized.goalAdvertisementsForNeedDeletedForNotReserveDelete')
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
$this->sendRequest($token, $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('goalAdvertisementsForNeedDeletedForNotReserveDelete')->collapse());
}
return 0;
}
private function sendRequest($token, $ads)
{
/* @var $ads Advertisement[]|GoalAdvertisement[] */
if (!$ads->count()) {
return;
}
foreach (array_chunk($ads->pluck('external_id')->toArray(), 1000) as $items) {
if ($token->isMain()) {
Advertisement::whereIn('external_id', $items)
->update([
'reserve_delete_at' => Carbon::now(),
]);
} else {
GoalAdvertisement::whereIn('external_id', $items)
->update([
'reserve_delete_at' => Carbon::now(),
]);
}
}
$request = new DeleteAds();
$request->setToken($token)
->call([
'ids' => $ads->pluck('external_id')->toArray(),
]);
}
}
......@@ -101,6 +101,8 @@ class Advertisement extends Model
'updated_self',
'archived_need',
'reserve_archive_at',
'deleted_need',
'reserve_delete_at',
];
protected $casts = [
......@@ -117,6 +119,8 @@ class Advertisement extends Model
'prefer_v_card_over_business' => 'boolean',
'archived_need' => 'datetime',
'reserve_archive_at' => 'datetime',
'deleted_need' => 'datetime',
'reserve_delete_at' => 'datetime',
];
/**
......@@ -198,6 +202,24 @@ class Advertisement extends Model
return $query->whereNull('reserve_archive_at');
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeNeedDeleted($query)
{
return $query->whereNotNull('deleted_need');
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotReserveDelete($query)
{
return $query->whereNull('reserve_delete_at');
}
public function groups()
{
return $this->hasMany(AdGroup::class, 'ad_group_id');
......
......@@ -506,6 +506,11 @@ class DictionaryCampaign extends Pivot
return $this->goalAdvertisements()->forExternal()->needArchived()->forNotReserveArchive()->forNotArchived();
}
public function goalAdvertisementsForNeedDeletedForNotReserveDelete()
{
return $this->goalAdvertisements()->forExternal()->needDeleted()->forNotReserveDelete();
}
public function goalBidModifiers()
{
return $this->hasMany(GoalBidModifier::class, 'dictionary_campaign_id');
......
......@@ -77,6 +77,8 @@ class GoalAdvertisement extends Pivot
'archive_at',
'archived_need',
'reserve_archive_at',
'deleted_need',
'reserve_delete_at',
];
protected $casts = [
......@@ -88,6 +90,8 @@ class GoalAdvertisement extends Pivot
'archive_at' => 'datetime',
'archived_need' => 'datetime',
'reserve_archive_at' => 'datetime',
'deleted_need' => 'datetime',
'reserve_delete_at' => 'datetime',
];
public $incrementing = true;
......@@ -111,6 +115,8 @@ class GoalAdvertisement extends Pivot
'updated_need',
'reserve_create_at',
'reserve_update_at',
'deleted_need',
'reserve_delete_at',
'archived_need',
'reserve_archive_at',
'archive_at',
......@@ -207,6 +213,24 @@ class GoalAdvertisement extends Pivot
return $query->whereNull('reserve_archive_at');
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeNeedDeleted($query)
{
return $query->whereNotNull('deleted_need');
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotReserveDelete($query)
{
return $query->whereNull('reserve_delete_at');
}
public function advertisement()
{
return $this->belongsTo(Advertisement::class, 'advertisement_id');
......
......@@ -42,10 +42,8 @@ class ArchiveAds extends DirectRequest
foreach ($response['result']['ArchiveResults'] as $key => $archive_result) {
if (!isset($archive_result['Id'])) {
Log::debug("ArchiveAds, empty Id");
Log::debug($archive_result);
$external_id = $this->getParams()['SelectionCriteria']['Ids'][$key];
Log::debug($external_id);
/*
* array (
......@@ -61,16 +59,25 @@ class ArchiveAds extends DirectRequest
if ($this->getToken()->isMain()) {
Advertisement::whereExternalId($external_id)
->update([
'deleted_need' => Carbon::now(),
'archived_need' => null,
'reserve_archive_at' => null,
]);
} else {
GoalAdvertisement::whereExternalId($external_id)
->update([
'deleted_need' => Carbon::now(),
'archived_need' => null,
'reserve_archive_at' => null,
]);
}
continue;
} else {
Log::debug("ArchiveAds, empty Id");
Log::debug($archive_result);
Log::debug($external_id);
}
if ($this->getToken()->isMain()) {
......
<?php
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Advertisement;
use App\Models\Pivots\GoalAdvertisement;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
use Illuminate\Support\Facades\Log;
class DeleteAds extends DirectRequest
{
protected $max_count = 10000;
protected $timestamp;
public function call($params = null)
{
$this->requestPrepare($params);
$process = new ProcessCallLimitedAPI($this);
dispatch($process)->onQueue('limits');
}
public function getObjectsCount()
{
return count($this->getParams()['SelectionCriteria']['Ids']);
}
public function slice($maxObjects): ?APIRequest
{
return $this->sliceByKey($maxObjects, ['SelectionCriteria', 'Ids']);;
}
public function handle($response)
{
try {
if (!isset($response['result']['DeleteResults'])) {
return;
}
foreach ($response['result']['DeleteResults'] as $key => $delete_result) {
if (!isset($delete_result['Id'])) {
if (
isset($delete_result['Errors'][0]['Code'])
&&
$delete_result['Errors'][0]['Code'] == 8800
) {
if ($external_id = $this->getParams()['SelectionCriteria']['Ids'][$key]){
if ($this->getToken()->isMain()) {
Advertisement::needDeleted()
->where('external_id', $external_id)
->delete();
} else {
GoalAdvertisement::forExternal()->needDeleted()
->where('external_id', $external_id)
->delete();
}
continue;
}
}
Log::debug("DeleteAds, empty Id");
Log::debug($delete_result);
$external_id = $this->getParams()['SelectionCriteria']['Ids'][$key];
Log::debug($external_id);
if ($this->getToken()->isMain()) {
Advertisement::whereExternalId($external_id)
->update([
'reserve_delete_at' => null,
]);
} else {
GoalAdvertisement::whereExternalId($external_id)
->update([
'reserve_delete_at' => null,
]);
}
continue;
}
$external_id = (string)$delete_result['Id'];
if ($this->getToken()->isMain()) {
Advertisement::needDeleted()
->where('external_id', $external_id)
->delete();
} else {
GoalAdvertisement::forExternal()->needDeleted()
->where('external_id', $external_id)
->delete();
}
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
}
}
public function failed()
{
if ($this->getToken()->isMain()) {
Advertisement::whereIn('external_id', $this->getParams()['SelectionCriteria']['Ids'])
->update([
'reserve_delete_at' => null,
]);
} else {
GoalAdvertisement::whereIn('external_id', $this->getParams()['SelectionCriteria']['Ids'])
->update([
'reserve_delete_at' => null,
]);
}
}
private function requestPrepare($params)
{
$this->setService('Ads');
$this->setMethod('delete');
$this->setParams([
'SelectionCriteria' => [
'Ids' => $params['ids'],
],
]);
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddAdvertisementsDeleteColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('advertisements', function (Blueprint $table) {
$table->timestamp('deleted_need')->nullable();
$table->timestamp('reserve_delete_at')->nullable();
});
Schema::table('goal_advertisements', function (Blueprint $table) {
$table->timestamp('deleted_need')->nullable();
$table->timestamp('reserve_delete_at')->nullable();
});
}
/**
* 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!