From f84bd703f2a6860ae79429b9598f574a1b5a3e9d Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Thu, 18 Dec 2025 17:28:07 +0300 Subject: [PATCH] =?utf8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../MarketplaceOrdersController.php | 3 + erp24/services/MarketplaceService.php | 242 +++++++++++++++++- 2 files changed, 237 insertions(+), 8 deletions(-) diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index 75d0629b..3f7e60b7 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -66,6 +66,9 @@ class MarketplaceOrdersController extends Controller $searchModel = new MarketplaceOrdersSearch(); $dataProvider = $searchModel->search($this->request->queryParams); + // Добавляем eager loading для items для проверки готовности к отправке в 1С + $dataProvider->query->with('items'); + $dataProvider->sort->defaultOrder = [ 'creation_date' => SORT_DESC, ]; diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 5b412387..d9935d1f 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -1117,6 +1117,14 @@ class MarketplaceService try { $response = $apiInstance->getOrder($campaignId, $orderId, $contentType); $order = $response->getOrder(); + + // Диагностика для проверки данных заказа + $itemsCount = $order->getItems() ? count($order->getItems()) : 0; + $hasDelivery = $order->getDelivery() !== null; + Yii::warning( + "fetchOrder: orderId={$orderId}, campaignId={$campaignId}, items={$itemsCount}, delivery=" . ($hasDelivery ? 'YES' : 'NO'), + 'marketplace_fetch_order' + ); return [$campaignId => [$order]]; } catch (ApiException $e) { @@ -1271,6 +1279,10 @@ class MarketplaceService // Сохраняем данные доставки $delivery = $order->getDelivery(); + Yii::warning( + "Новый заказ #{$marketplaceOrder->id}: delivery=" . ($delivery ? 'present' : 'NULL') . ", items count=" . count($order->getItems() ?? []), + 'marketplace_order_creation' + ); if ($delivery) { $deliveryModel = new MarketplaceOrderDelivery(); $deliveryModel->order_id = $marketplaceOrder->id; @@ -1339,12 +1351,16 @@ class MarketplaceService } if (!$deliveryModel->save()) { Yii::error( - 'Ошибка сохранения доставки: ' . json_encode( + 'Ошибка сохранения доставки для заказа #' . $marketplaceOrder->id . ': ' . json_encode( $deliveryModel->getErrors(), JSON_UNESCAPED_UNICODE ) ); + } else { + Yii::warning("Доставка успешно создана для заказа #{$marketplaceOrder->id}", 'marketplace_order_creation'); } + } else { + Yii::warning("Доставка не создана для заказа #{$marketplaceOrder->id}: delivery is NULL or empty", 'marketplace_order_creation'); } // Сохраняем позиции заказа @@ -1370,13 +1386,17 @@ class MarketplaceService if (!$orderItem->save()) { Yii::error( - 'Ошибка сохранения элемента заказа: ' . json_encode( + 'Ошибка сохранения элемента заказа для заказа #' . $marketplaceOrder->id . ': ' . json_encode( $orderItem->getErrors(), JSON_UNESCAPED_UNICODE ) ); + } else { + Yii::warning("Товар успешно создан для заказа #{$marketplaceOrder->id}: {$orderItem->offer_name}", 'marketplace_order_creation'); } } + } else { + Yii::warning("Товары не созданы для заказа #{$marketplaceOrder->id}: items is empty", 'marketplace_order_creation'); } // проверяем и устанавливаем ready_to = 1 $baseUrl = "https://partner.market.yandex.ru/order/"; @@ -1446,7 +1466,61 @@ class MarketplaceService $marketplaceOrder->substatus_id = (int)$substatusId; $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt())); $delivery = $order->getDelivery(); - $shipments = $delivery->getShipments(); + + // Проверяем и создаем/обновляем доставку + $existingDelivery = MarketplaceOrderDelivery::findOne(['order_id' => $marketplaceOrder->id]); + if (!$existingDelivery && $delivery) { + // Создаем новую доставку + $deliveryModel = new MarketplaceOrderDelivery(); + $deliveryModel->order_id = $marketplaceOrder->id; + $deliveryModel->type = $delivery->getType(); + $deliveryModel->service_name = $delivery->getServiceName(); + $deliveryModel->partner_type = $delivery->getDeliveryPartnerType(); + + $address = $delivery->getAddress(); + if ($address) { + $deliveryModel->country = $address->getCountry(); + $deliveryModel->postcode = $address->getPostcode(); + $deliveryModel->city = $address->getCity(); + $deliveryModel->street = $address->getStreet(); + $deliveryModel->house = $address->getHouse(); + $deliveryModel->apartment = $address->getApartment(); + $gps = $address->getGps(); + if ($gps) { + $deliveryModel->latitude = $gps->getLatitude(); + $deliveryModel->longitude = $gps->getLongitude(); + } + } + $dates = $delivery->getDates(); + if ($dates) { + $deliveryModel->delivery_start = date( + 'Y-m-d H:i:s', + strtotime($dates->getFromDate() . ' ' . $dates->getFromTime()) + ); + $deliveryModel->delivery_end = date( + 'Y-m-d H:i:s', + strtotime($dates->getToDate() . ' ' . $dates->getToTime()) + ); + } + $courier = $delivery->getCourier(); + if ($courier) { + $deliveryModel->courier_full_name = $courier->getFullName(); + $deliveryModel->courier_phone = $courier->getPhone(); + $deliveryModel->courier_extension = $courier->getPhoneExtension(); + $deliveryModel->courier_vehicle_number = $courier->getVehicleNumber(); + $deliveryModel->courier_vehicle_description = $courier->getVehicleDescription(); + } + if (!$deliveryModel->save()) { + Yii::error( + 'Ошибка сохранения доставки: ' . json_encode( + $deliveryModel->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); + } + } + + $shipments = $delivery ? $delivery->getShipments() : null; if ($shipments) { foreach ($shipments as $index => $shipment) { Yii::error("срок доставки: {$index}" . json_encode($shipment, JSON_UNESCAPED_UNICODE)); @@ -1518,7 +1592,37 @@ class MarketplaceService $existingItems = MarketplaceOrderItems::find() ->where(['order_id' => $marketplaceOrder->id]) ->all(); - if (count($existingItems) !== count($newItems)) { + + // Если товаров нет, создаем их + if (empty($existingItems) && !empty($newItems)) { + foreach ($newItems as $item) { + $orderItem = new MarketplaceOrderItems(); + $orderItem->order_id = $marketplaceOrder->id; + $orderItem->external_item_id = $item->getId(); + $orderItem->offer_id = $item->getOfferId(); + $orderItem->offer_name = $item->getOfferName(); + $orderItem->price = $item->getPrice(); + $orderItem->buyer_price = $item->getBuyerPrice(); + $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount(); + $orderItem->price_before_discount = $item->getPriceBeforeDiscount(); + $orderItem->count = $item->getCount(); + $orderItem->vat = $item->getVat(); + $orderItem->shop_sku = $item->getShopSku(); + $orderItem->subsidy = $item->getSubsidy() ?? 0; + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? ''; + $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); + $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); + + if (!$orderItem->save()) { + Yii::error( + 'Ошибка сохранения элемента заказа: ' . json_encode( + $orderItem->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); + } + } + } elseif (count($existingItems) !== count($newItems)) { MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]); foreach ($newItems as $item) { $orderItem = new MarketplaceOrderItems(); @@ -1636,7 +1740,90 @@ class MarketplaceService } } - if (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) { + // Проверяем и создаем доставку, если её нет + $existingDelivery = MarketplaceOrderDelivery::findOne(['order_id' => $marketplaceOrder->id]); + if (!$existingDelivery) { + $delivery = $order->getDelivery(); + if ($delivery) { + $deliveryModel = new MarketplaceOrderDelivery(); + $deliveryModel->order_id = $marketplaceOrder->id; + $deliveryModel->type = $delivery->getType(); + $deliveryModel->service_name = $delivery->getServiceName(); + $deliveryModel->partner_type = $delivery->getDeliveryPartnerType(); + + $address = $delivery->getAddress(); + if ($address) { + $deliveryModel->country = $address->getCountry(); + $deliveryModel->postcode = $address->getPostcode(); + $deliveryModel->city = $address->getCity(); + $deliveryModel->street = $address->getStreet(); + $deliveryModel->house = $address->getHouse(); + $deliveryModel->apartment = $address->getApartment(); + $gps = $address->getGps(); + if ($gps) { + $deliveryModel->latitude = $gps->getLatitude(); + $deliveryModel->longitude = $gps->getLongitude(); + } + } + $shipments = $delivery->getShipments(); + if ($shipments) { + foreach ($shipments as $index => $shipment) { + Yii::error("срок доставки: {$index}" . json_encode($shipment, JSON_UNESCAPED_UNICODE)); + } + + $deliveryDateTo = ($shipments[0])->getShipmentDate() ?? null; + $deliveryTimeTo = ($shipments[0])->getShipmentTime() ?? ''; + + if ($deliveryDateTo) { + $datetimeString = str_replace('-', '.', $deliveryDateTo) . ' ' . $deliveryTimeTo; + $timestamp = strtotime($datetimeString); + + if ($timestamp) { + $marketplaceOrder->delivery_to = date('Y-m-d H:i:s', $timestamp); + + if (!$marketplaceOrder->save()) { + Yii::error('Ошибка сохранения сроков доставки: ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE)); + } else { + $updatedOrdersCount += 1; + } + } else { + Yii::error('Ошибка преобразования даты и времени: ' . $datetimeString); + } + } else { + Yii::error('Отсутствует shipmentDate у первого элемента shipments'); + } + } + $dates = $delivery->getDates(); + if ($dates) { + $deliveryModel->delivery_start = date( + 'Y-m-d H:i:s', + strtotime($dates->getFromDate() . ' ' . $dates->getFromTime()) + ); + $deliveryModel->delivery_end = date( + 'Y-m-d H:i:s', + strtotime($dates->getToDate() . ' ' . $dates->getToTime()) + ); + } + $courier = $delivery->getCourier(); + if ($courier) { + $deliveryModel->courier_full_name = $courier->getFullName(); + $deliveryModel->courier_phone = $courier->getPhone(); + $deliveryModel->courier_extension = $courier->getPhoneExtension(); + $deliveryModel->courier_vehicle_number = $courier->getVehicleNumber(); + $deliveryModel->courier_vehicle_description = $courier->getVehicleDescription(); + } + if (!$deliveryModel->save()) { + Yii::error( + 'Ошибка сохранения доставки: ' . json_encode( + $deliveryModel->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); + } else { + $updatedOrdersCount += 1; + } + } + } elseif (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) { $delivery = $order->getDelivery(); $shipments = $delivery->getShipments(); if ($shipments) { @@ -1667,6 +1854,45 @@ class MarketplaceService } } } + + // Проверяем и создаем товары, если их нет + $existingItems = MarketplaceOrderItems::find() + ->where(['order_id' => $marketplaceOrder->id]) + ->all(); + if (empty($existingItems)) { + $items = $order->getItems(); + if (!empty($items)) { + foreach ($items as $item) { + $orderItem = new MarketplaceOrderItems(); + $orderItem->order_id = $marketplaceOrder->id; + $orderItem->external_item_id = $item->getId(); + $orderItem->offer_id = $item->getOfferId(); + $orderItem->offer_name = $item->getOfferName(); + $orderItem->price = $item->getPrice(); + $orderItem->buyer_price = $item->getBuyerPrice(); + $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount(); + $orderItem->price_before_discount = $item->getPriceBeforeDiscount(); + $orderItem->count = $item->getCount(); + $orderItem->vat = $item->getVat(); + $orderItem->shop_sku = $item->getShopSku(); + $orderItem->subsidy = $item->getSubsidy() ?? 0; + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? ''; + $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); + $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); + + if (!$orderItem->save()) { + Yii::error( + 'Ошибка сохранения элемента заказа: ' . json_encode( + $orderItem->getErrors(), + JSON_UNESCAPED_UNICODE + ) + ); + } else { + $updatedOrdersCount += 1; + } + } + } + } } self::setReadyMarketplaceOrders($marketplaceOrder); } @@ -2352,7 +2578,7 @@ class MarketplaceService Yii::warning('Не удалось извлечь данные заказа из HTML', __METHOD__); return []; } else { - Yii::info('Успешно распарен заказ №' . $orderNumber, __METHOD__); + Yii::warning('Успешно распарен заказ №' . $orderNumber, __METHOD__); return $order; } } @@ -2799,7 +3025,7 @@ class MarketplaceService if (!$order->save()) { Yii::error('Ошибка установки readyto_1c для заказа ID ' . $order->id . ': ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE)); } else { - Yii::info('Заказ ID ' . $order->id . ' подготовлен к отправке в 1С.'); + Yii::warning('Заказ ID ' . $order->id . ' подготовлен к отправке в 1С.'); } } @@ -2825,7 +3051,7 @@ class MarketplaceService if (!$order->save()) { Yii::error('Ошибка установки readyto_1c = 1 у заказа ID ' . $order->id . ': ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE)); } else { - Yii::info('Заказ ID ' . $order->id . ' автоматически помечен как готовый к отправке в 1C.'); + Yii::warning('Заказ ID ' . $order->id . ' автоматически помечен как готовый к отправке в 1C.'); } } } -- 2.39.5