$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 ?? '') .
use OpenAPI\Client\Model;
use GuzzleHttp;
use yii_app\services\WhatsAppService;
+use yii_app\records\MarketplaceOrderDelivery;
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,
+ ]));
+ }
}