]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки по доставкам - сохранение очистка и обмен
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 23 Dec 2025 10:09:24 +0000 (13:09 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 23 Dec 2025 10:09:24 +0000 (13:09 +0300)
erp24/api2/controllers/DataController.php
erp24/commands/MarketplaceController.php
erp24/records/MarketplaceOrderDelivery.php
erp24/records/MarketplaceStore.php

index 866a165a0bcedcf178f3dff087446353984e7625..5ceba1677d6aa395a0ed30c50652cc8fe56ad117 100644 (file)
@@ -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 ?? '') .
index 3fbd9ae4d8cb3fda03242332e9e8a6882fbff3f2..f3d2d606b43f7382999f3f793c0d5d6ffc6c4173 100644 (file)
@@ -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,
+        ]));
+    }
 }
index 06061e12fcb8f86f4829847e2d10877123a32c30..bb6c6a21362bceda47d9ec0bd80b2e1651b0c964 100644 (file)
@@ -31,6 +31,8 @@ use Yii;
 class MarketplaceOrderDelivery extends \yii\db\ActiveRecord
 {
 
+    const DELIVERY_TYPE_DELIVERY = 1;
+    const DELIVERY_TYPE_PICKUP = 2;
 
     /**
      * {@inheritdoc}
index a231d38592eb412ef8492c6d0d28b35a3d189bc6..76308659788f08ab0381cb390773aaad844b269d 100644 (file)
@@ -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