From: Vladimir Fomichev Date: Tue, 23 Dec 2025 10:09:24 +0000 (+0300) Subject: Правки по доставкам - сохранение очистка и обмен X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=5cb608be72024f4a9299933d66c8589137b6c3e8;p=erp24_rep%2Fyii-erp24%2F.git Правки по доставкам - сохранение очистка и обмен --- diff --git a/erp24/api2/controllers/DataController.php b/erp24/api2/controllers/DataController.php index 866a165a..5ceba167 100644 --- a/erp24/api2/controllers/DataController.php +++ b/erp24/api2/controllers/DataController.php @@ -898,7 +898,17 @@ class DataController extends BaseController $store_id = $eit->export_val ?? ''; $marketplaceOrderDelivery = MarketplaceOrderDelivery::find()->where(['order_id' => $marketplaceOrder->id])->one(); /* @var $marketplaceOrderDelivery MarketplaceOrderDelivery */ - $delivery_type = $marketplaceOrderDelivery && $marketplaceOrderDelivery->type == 'DELIVERY' ? 1 : 2; + if ($marketplaceOrderDelivery) { + if ($marketplaceOrderDelivery->type == 'DELIVERY') { + $delivery_type = MarketplaceOrderDelivery::DELIVERY_TYPE_DELIVERY; + } + if ($marketplaceOrderDelivery->type == 'PICKUP') { + $delivery_type = MarketplaceOrderDelivery::DELIVERY_TYPE_PICKUP; + } + } else { + $delivery_type = 0; + } + $deliveryAddress = ($marketplaceOrderDelivery->city ?? '') . ", " . ($marketplaceOrderDelivery->street ?? '') . ", " . ($marketplaceOrderDelivery->house ?? '') . diff --git a/erp24/commands/MarketplaceController.php b/erp24/commands/MarketplaceController.php index 3fbd9ae4..f3d2d606 100644 --- a/erp24/commands/MarketplaceController.php +++ b/erp24/commands/MarketplaceController.php @@ -26,6 +26,7 @@ use OpenAPI\Client\Api; use OpenAPI\Client\Model; use GuzzleHttp; use yii_app\services\WhatsAppService; +use yii_app\records\MarketplaceOrderDelivery; class MarketplaceController extends Controller { @@ -235,4 +236,126 @@ class MarketplaceController extends Controller return ExitCode::OK; } + + /** + * Удаляет дублирующие записи доставок. + * Оставляет самую позднюю запись (с максимальным id) для каждого order_id. + * + * Использование: + * php yii marketplace/remove-duplicates + * + * @return int Exit code + */ + public function actionRemoveDuplicates() + { + $this->stdout("Начало поиска и удаления дубликатов доставок...\n", BaseConsole::FG_YELLOW); + + $deletedCount = 0; + $duplicatesFound = 0; + + // Получаем все записи, сгруппированные по order_id + $deliveries = MarketplaceOrderDelivery::find() + ->orderBy(['order_id' => SORT_ASC, 'id' => SORT_ASC]) + ->all(); + + $this->stdout("Найдено записей доставок: " . count($deliveries) . "\n", BaseConsole::FG_CYAN); + + // Группируем по order_id + $groupedByOrderId = []; + foreach ($deliveries as $delivery) { + $groupedByOrderId[$delivery->order_id][] = $delivery; + } + + $this->stdout("Найдено уникальных order_id: " . count($groupedByOrderId) . "\n", BaseConsole::FG_CYAN); + + // Обрабатываем каждую группу + foreach ($groupedByOrderId as $orderId => $group) { + if (count($group) <= 1) { + continue; // Нет дубликатов + } + + // Группируем по содержимому полей + $contentGroups = []; + foreach ($group as $delivery) { + $contentKey = $this->getDeliveryContentKey($delivery); + $contentGroups[$contentKey][] = $delivery; + } + + // Удаляем дубликаты в каждой группе одинакового содержимого + foreach ($contentGroups as $contentKey => $duplicates) { + if (count($duplicates) > 1) { + $duplicatesFound += count($duplicates); + + $this->stdout( + " Order ID {$orderId}: найдено " . count($duplicates) . " дубликатов\n", + BaseConsole::FG_YELLOW + ); + + // Сортируем по id (последний элемент будет с максимальным id) + usort($duplicates, function($a, $b) { + return $a->id <=> $b->id; + }); + + // Удаляем все кроме последнего + for ($i = 0; $i < count($duplicates) - 1; $i++) { + if ($duplicates[$i]->delete()) { + $deletedCount++; + $this->stdout( + " Удалена запись ID {$duplicates[$i]->id}\n", + BaseConsole::FG_GREEN + ); + } else { + $this->stdout( + " Ошибка удаления записи ID {$duplicates[$i]->id}\n", + BaseConsole::FG_RED + ); + } + } + + $this->stdout( + " Оставлена запись ID {$duplicates[count($duplicates) - 1]->id}\n", + BaseConsole::FG_CYAN + ); + } + } + } + + $this->stdout("\n", BaseConsole::RESET); + $this->stdout("Результаты:\n", BaseConsole::FG_YELLOW); + $this->stdout(" Обнаружено дубликатов: {$duplicatesFound}\n", BaseConsole::FG_CYAN); + $this->stdout(" Удалено записей: {$deletedCount}\n", BaseConsole::FG_GREEN); + $this->stdout("\n", BaseConsole::RESET); + + return ExitCode::OK; + } + + /** + * Создает уникальный ключ на основе содержимого доставки. + * + * @param MarketplaceOrderDelivery $delivery + * @return string + */ + private function getDeliveryContentKey($delivery) + { + return md5(serialize([ + $delivery->type, + $delivery->service_name, + $delivery->partner_type, + $delivery->country, + $delivery->postcode, + $delivery->city, + $delivery->street, + $delivery->house, + $delivery->apartment, + $delivery->latitude, + $delivery->longitude, + $delivery->delivery_start, + $delivery->delivery_end, + $delivery->courier_full_name, + $delivery->courier_phone, + $delivery->courier_extension, + $delivery->courier_vehicle_number, + $delivery->courier_vehicle_description, + ])); + } } diff --git a/erp24/records/MarketplaceOrderDelivery.php b/erp24/records/MarketplaceOrderDelivery.php index 06061e12..bb6c6a21 100644 --- a/erp24/records/MarketplaceOrderDelivery.php +++ b/erp24/records/MarketplaceOrderDelivery.php @@ -31,6 +31,8 @@ use Yii; class MarketplaceOrderDelivery extends \yii\db\ActiveRecord { + const DELIVERY_TYPE_DELIVERY = 1; + const DELIVERY_TYPE_PICKUP = 2; /** * {@inheritdoc} diff --git a/erp24/records/MarketplaceStore.php b/erp24/records/MarketplaceStore.php index a231d385..76308659 100644 --- a/erp24/records/MarketplaceStore.php +++ b/erp24/records/MarketplaceStore.php @@ -13,6 +13,7 @@ use yii\db\Expression; * @property int $id * @property int $store_id * @property string $guid + * @property string $name * @property int $warehouse_id * @property string $warehouse_guid * @property string $firm