From 53c597b1bedba706288605548880b030f119771c Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Thu, 18 Dec 2025 19:38:10 +0300 Subject: [PATCH] =?utf8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D1=81?= =?utf8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=82=D0=BE=D0=B2?= =?utf8?q?=D0=B0=D1=80=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0?= =?utf8?q?=20=D0=B8=20=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../MarketplaceOrdersController.php | 55 +++ erp24/services/MarketplaceService.php | 87 +++- erp24/views/marketplace-orders/index.php | 1 + .../marketplace-orders/test-process-order.php | 378 ++++++++++++++++++ 4 files changed, 509 insertions(+), 12 deletions(-) create mode 100644 erp24/views/marketplace-orders/test-process-order.php diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index e3d7a38c..a4a6c31f 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -13,6 +13,7 @@ use yii\data\ArrayDataProvider; use yii\db\Expression; use yii\db\Query; use yii\helpers\ArrayHelper; +use yii\helpers\Json; use yii_app\helpers\DataHelper; use yii_app\models\FlowwowOrdersForm; use yii_app\records\MarketplaceOrderDelivery; @@ -1074,4 +1075,58 @@ class MarketplaceOrdersController extends Controller 'testResults' => $testResults, ]); } + + /** + * Эмуляция обработки заказа из JSON (как будто получен через API) + * @return string + */ + public function actionTestProcessOrder() + { + $result = null; + $error = null; + $orderData = null; + $createdOrder = null; + + if (Yii::$app->request->isPost) { + $jsonData = Yii::$app->request->post('json_data'); + $campaignId = Yii::$app->request->post('campaign_id', 109969229); + + try { + // Декодируем JSON + $data = Json::decode($jsonData); + + // Десериализуем в OrderDTO + $orderDto = ObjectSerializer::deserialize($data, '\OpenAPI\Client\Model\OrderDTO', []); + + if (!$orderDto) { + throw new \Exception('Не удалось десериализовать данные в OrderDTO'); + } + + // Формируем структуру как в fetchOrder + $orderData = [$campaignId => [$orderDto]]; + + // Обрабатываем заказ + $result = \yii_app\services\MarketplaceService::processOrders($orderData); + + // Ищем созданный заказ + $createdOrder = MarketplaceOrders::find() + ->where(['marketplace_order_id' => (string)$orderDto->getId()]) + ->with(['items', 'delivery']) + ->one(); + + Yii::$app->session->setFlash('success', 'Заказ успешно обработан!'); + } catch (\Exception $e) { + $error = $e->getMessage(); + Yii::error("Ошибка обработки тестового заказа: " . $e->getMessage() . "\n" . $e->getTraceAsString()); + Yii::$app->session->setFlash('error', 'Ошибка: ' . $error); + } + } + + return $this->render('test-process-order', [ + 'result' => $result, + 'error' => $error, + 'orderData' => $orderData, + 'createdOrder' => $createdOrder, + ]); + } } diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 634e21e9..83c32835 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -1115,20 +1115,42 @@ class MarketplaceService } try { + Yii::warning( + "fetchOrder: Начало запроса к API - campaignId={$campaignId}, orderId={$orderId}", + 'marketplace_fetch_order' + ); + $response = $apiInstance->getOrder($campaignId, $orderId, $contentType); $order = $response->getOrder(); + if (!$order) { + Yii::error("fetchOrder: API вернуло NULL вместо заказа - campaignId={$campaignId}, orderId={$orderId}", 'marketplace_fetch_order'); + return []; + } + // Диагностика для проверки данных заказа $itemsCount = $order->getItems() ? count($order->getItems()) : 0; $hasDelivery = $order->getDelivery() !== null; Yii::warning( - "fetchOrder: orderId={$orderId}, campaignId={$campaignId}, items={$itemsCount}, delivery=" . ($hasDelivery ? 'YES' : 'NO'), + "fetchOrder SUCCESS: orderId={$orderId}, campaignId={$campaignId}, items={$itemsCount}, delivery=" . ($hasDelivery ? 'YES' : 'NO'), 'marketplace_fetch_order' ); return [$campaignId => [$order]]; } catch (ApiException $e) { - Yii::error('Ошибка при получении заказа: ' . $e->getMessage()); + Yii::error( + "fetchOrder ERROR: campaignId={$campaignId}, orderId={$orderId}, " . + "code={$e->getCode()}, message={$e->getMessage()}, " . + "response=" . $e->getResponseBody(), + 'marketplace_fetch_order' + ); + return []; + } catch (\Exception $e) { + Yii::error( + "fetchOrder EXCEPTION: campaignId={$campaignId}, orderId={$orderId}, " . + "error={$e->getMessage()}, line={$e->getLine()}, file={$e->getFile()}", + 'marketplace_fetch_order' + ); return []; } } @@ -1255,7 +1277,17 @@ class MarketplaceService } } + Yii::warning( + "Попытка сохранения нового заказа: marketplace_order_id={$marketplaceOrder->marketplace_order_id}, fake={$marketplaceOrder->fake}", + 'marketplace_order_creation' + ); + if ($marketplaceOrder->save()) { + Yii::warning( + "Заказ успешно сохранен, ID={$marketplaceOrder->id}", + 'marketplace_order_creation' + ); + self::sendMessageToTelegram($marketplaceOrder->guid, "Новый заказ из ЯМ"); $newOrdersCount += 1; @@ -1279,8 +1311,11 @@ class MarketplaceService // Сохраняем данные доставки $delivery = $order->getDelivery(); + $items = $order->getItems(); Yii::warning( - "Новый заказ #{$marketplaceOrder->id}: delivery=" . ($delivery ? 'present' : 'NULL') . ", items count=" . count($order->getItems() ?? []), + "Новый заказ #{$marketplaceOrder->id}: delivery=" . ($delivery ? 'present' : 'NULL') . + ", items=" . ($items ? count($items) : 'NULL') . + ", delivery type=" . ($delivery ? get_class($delivery) : 'N/A'), 'marketplace_order_creation' ); if ($delivery) { @@ -1302,6 +1337,10 @@ class MarketplaceService if ($gps) { $deliveryModel->latitude = $gps->getLatitude(); $deliveryModel->longitude = $gps->getLongitude(); + } else { + // GPS координаты отсутствуют, устанавливаем значения по умолчанию + $deliveryModel->latitude = 0.0; + $deliveryModel->longitude = 0.0; } } $shipments = $delivery->getShipments(); @@ -1365,8 +1404,18 @@ class MarketplaceService // Сохраняем позиции заказа $items = $order->getItems(); + Yii::warning( + "Начало создания товаров для заказа #{$marketplaceOrder->id}: items=" . + ($items ? (is_array($items) ? count($items) : 'not array') : 'NULL') . + ", items type=" . ($items ? gettype($items) : 'NULL'), + 'marketplace_order_creation' + ); + if (!empty($items)) { - foreach ($items as $item) { + Yii::warning("Товары найдены, начинаем цикл создания", 'marketplace_order_creation'); + foreach ($items as $idx => $item) { + Yii::warning("Создание товара #{$idx}: offerId={$item->getOfferId()}, name={$item->getOfferName()}", 'marketplace_order_creation'); + $orderItem = new MarketplaceOrderItems(); $orderItem->order_id = $marketplaceOrder->id; $orderItem->external_item_id = $item->getId(); @@ -1380,7 +1429,8 @@ class MarketplaceService $orderItem->vat = $item->getVat(); $orderItem->shop_sku = $item->getShopSku(); $orderItem->subsidy = $item->getSubsidy() ?? 0; - $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? ''; + // Если partner_warehouse_id отсутствует, устанавливаем значение по умолчанию + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? 'N/A'; $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); @@ -1395,8 +1445,9 @@ class MarketplaceService Yii::warning("Товар успешно создан для заказа #{$marketplaceOrder->id}: {$orderItem->offer_name}", 'marketplace_order_creation'); } } + Yii::warning("Завершен цикл создания товаров для заказа #{$marketplaceOrder->id}", 'marketplace_order_creation'); } else { - Yii::warning("Товары не созданы для заказа #{$marketplaceOrder->id}: items is empty", 'marketplace_order_creation'); + Yii::warning("Товары НЕ созданы для заказа #{$marketplaceOrder->id}: items is empty or NULL", 'marketplace_order_creation'); } // проверяем и устанавливаем ready_to = 1 $baseUrl = "https://partner.market.yandex.ru/order/"; @@ -1489,6 +1540,10 @@ class MarketplaceService if ($gps) { $deliveryModel->latitude = $gps->getLatitude(); $deliveryModel->longitude = $gps->getLongitude(); + } else { + // GPS координаты отсутствуют, устанавливаем значения по умолчанию + $deliveryModel->latitude = 0.0; + $deliveryModel->longitude = 0.0; } } $dates = $delivery->getDates(); @@ -1609,7 +1664,8 @@ class MarketplaceService $orderItem->vat = $item->getVat(); $orderItem->shop_sku = $item->getShopSku(); $orderItem->subsidy = $item->getSubsidy() ?? 0; - $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? ''; + // Если partner_warehouse_id отсутствует, устанавливаем значение по умолчанию + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? 'N/A'; $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); @@ -1637,8 +1693,9 @@ class MarketplaceService $orderItem->count = $item->getCount(); $orderItem->vat = $item->getVat(); $orderItem->shop_sku = $item->getShopSku(); - $orderItem->subsidy = $item->getSubsidy(); - $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId(); + $orderItem->subsidy = $item->getSubsidy() ?? 0; + // Если partner_warehouse_id отсутствует, устанавливаем значение по умолчанию + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? 'N/A'; $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); @@ -1702,8 +1759,9 @@ class MarketplaceService $orderItem->count = $item->getCount(); $orderItem->vat = $item->getVat(); $orderItem->shop_sku = $item->getShopSku(); - $orderItem->subsidy = $item->getSubsidy(); - $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId(); + $orderItem->subsidy = $item->getSubsidy() ?? 0; + // Если partner_warehouse_id отсутствует, устанавливаем значение по умолчанию + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? 'N/A'; $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); @@ -1763,6 +1821,10 @@ class MarketplaceService if ($gps) { $deliveryModel->latitude = $gps->getLatitude(); $deliveryModel->longitude = $gps->getLongitude(); + } else { + // GPS координаты отсутствуют, устанавливаем значения по умолчанию + $deliveryModel->latitude = 0.0; + $deliveryModel->longitude = 0.0; } } $shipments = $delivery->getShipments(); @@ -1876,7 +1938,8 @@ class MarketplaceService $orderItem->vat = $item->getVat(); $orderItem->shop_sku = $item->getShopSku(); $orderItem->subsidy = $item->getSubsidy() ?? 0; - $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? ''; + // Если partner_warehouse_id отсутствует, устанавливаем значение по умолчанию + $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? 'N/A'; $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE); $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE); diff --git a/erp24/views/marketplace-orders/index.php b/erp24/views/marketplace-orders/index.php index b00baff8..e5953097 100644 --- a/erp24/views/marketplace-orders/index.php +++ b/erp24/views/marketplace-orders/index.php @@ -44,6 +44,7 @@ YiiAsset::register($this); 'btn btn-success']) ?> 'btn btn-success']) ?> 'btn btn-success']) ?> + 'btn btn-warning']) ?>

diff --git a/erp24/views/marketplace-orders/test-process-order.php b/erp24/views/marketplace-orders/test-process-order.php new file mode 100644 index 00000000..d2f5fd68 --- /dev/null +++ b/erp24/views/marketplace-orders/test-process-order.php @@ -0,0 +1,378 @@ +title = 'Тест обработки заказа из JSON'; +$this->params['breadcrumbs'][] = ['label' => 'Заказы маркетплейсов', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; + +// Пример JSON для заполнения +$exampleJson = << + +
+

title) ?>

+ +
+

Инструкция:

+
    +
  1. Вставьте JSON данные заказа в поле ниже (пример уже заполнен)
  2. +
  3. Укажите Campaign ID (по умолчанию 109969229)
  4. +
  5. Нажмите "Обработать заказ"
  6. +
  7. Система эмулирует получение заказа через API и создаст его в БД
  8. +
+

Примечание: Если заказ с таким ID уже существует, он будет обновлен.

+
+ + session->hasFlash('success')): ?> +
+ + session->getFlash('success') ?> +
+ + + session->hasFlash('error')): ?> +
+ + session->getFlash('error') ?> +
+ + +
+
+
+
+

Входные данные

+
+
+ 'post']); ?> + +
+ + + ID кампании в Яндекс.Маркет +
+ +
+ + + JSON структура OrderDTO из Яндекс.Маркет API +
+ +
+ 'btn btn-primary btn-lg']) ?> + 'btn btn-default']) ?> +
+ + +
+
+
+ +
+ +
+
+

Результат обработки

+
+
+

Статистика:

+
    +
  • Новых заказов:
  • +
  • Обновленных заказов:
  • +
+ + +
+

Созданный/обновленный заказ:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID в ERPid ?>
ID заказа МПmarketplace_order_id ?>
Магазинstore ? $createdOrder->store->name : '-' ?>
Маркетплейсmarketplace_name ?? '-' ?>
Статусstatus ? $createdOrder->status->code : '-' ?>
Подстатусsubstatus ? $createdOrder->substatus->code : '-' ?>
Суммаformatter->asCurrency($createdOrder->total, 'RUB') ?>
Тестовыйfake ? 'Да' : 'Нет' ?>
Дата созданияcreation_date ?>
+ +

Товары (items) ?>):

+ items)): ?> + + + + + + + + + + + + items as $item): ?> + + + + + + + + + +
IDАртикулНазваниеЦенаКол-во
id ?>offer_id) ?>offer_name) ?>formatter->asCurrency($item->price, 'RUB') ?>count ?>
+ +
Товары не созданы!
+ + +

Доставка:

+ delivery): ?> + + + + + + + + + + + + + + + + + +
Типdelivery->type) ?>
Сервисdelivery->service_name) ?>
Адрес + delivery->city) ?>, + delivery->street) ?> + delivery->house) ?> +
Период доставки + delivery->delivery_start ?? '-' ?> - + delivery->delivery_end ?? '-' ?> +
+ +
Доставка не создана!
+ + +
+ $createdOrder->id], ['class' => 'btn btn-success']) ?> + 'btn btn-default']) ?> +
+ +
+
+ + + +
+
+

Ошибка обработки

+
+
+
+
+
+ +
+
+ +
+
+

Проверка логов

+
+
+

Для просмотра детальных логов обработки выполните в контейнере:

+
tail -f erp24/runtime/logs/app.log | grep -E "marketplace_order_creation|marketplace_fetch_order"
+ +

Или проверьте последние записи:

+
tail -100 erp24/runtime/logs/app.log | grep marketplace_order_creation
+
+
+
+ + + -- 2.39.5