]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Рефакторинг и улучшение метода
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 21 Feb 2025 09:38:31 +0000 (12:38 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 21 Feb 2025 09:38:31 +0000 (12:38 +0300)
erp24/api2/controllers/YandexMarketController.php

index 0e8a5143b550da3ce800e82150d5ec868dcfb30f..4c92ff6bff8f9c46853189d519dcf8f8823763fd 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace app\controllers;
 
+use OpenAPI\Client\ObjectSerializer;
 use Yii;
 use yii\helpers\ArrayHelper;
 use yii\rest\Controller;
@@ -178,60 +179,132 @@ class YandexMarketController extends Controller
     public function actionGetOrders()
     {
         Yii::$app->response->format = Response::FORMAT_JSON;
-        $config = Configuration::getDefaultConfiguration()
-            ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
+        $request = Yii::$app->request;
+
+        $body = $request->getRawBody();
+        $content = json_decode($body, false, 512, JSON_THROW_ON_ERROR);
+        $testCampaignId = $request->get('campaign_id', 109969229);
+        $testData = ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\GetOrdersResponse', []);
+        if (!empty($testData) && isset($testData['orders'])) {
+            $ordersData[$testCampaignId] = $testData['orders'];
+            $result = $this->processOrders($ordersData);
+            return ['response' => 'OK (test data)', 'storeCount' => count($ordersData), 'result' => $result];
+        }
 
-        $campaignIds = MarketplaceStore::find()
-            ->select(['warehouse_guid'])
-            ->where(['warehouse_id' => 2])
-            ->column();
+        $fromDate = $request->get('from_date', date('d-m-Y'));
+        $toDate = $request->get('to_date', null);
 
-        $statuses = MarketplaceOrderStatusTypes::find()
-            ->select(['id', 'code'])
-            ->indexBy('code')
-            ->asArray()->all();
+        $status = $request->get('status', null);
+        $substatus = $request->get('substatus', null);
 
-        $statuses = ArrayHelper::map($statuses, 'code', 'id');
-        $statusCodes = array_unique(array_keys($statuses));
-        // var_dump($statusCodes);die();
 
+            $campaignIds = MarketplaceStore::find()
+                ->select(['warehouse_guid'])
+                ->where(['warehouse_id' => 2])
+                ->column();
 
+        $config = Configuration::getDefaultConfiguration()
+            ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
         $apiInstance = new Api\OrdersApi(new GuzzleHttp\Client(), $config);
-        //$apiModel = new Model\GetOrdersResponse();
+
+        $allOrders = [];
 
         foreach ($campaignIds as $campaignId) {
-            $result = $apiInstance->getOrdersWithHttpInfo($campaignId);
-            $pager = $result[0]->getPager();
-            if (empty($pager->getTotal())) {
-                continue;
+            $currentPage = 1;
+            $hasMore = true;
+            while ($hasMore) {
+                $result = $apiInstance->getOrdersWithHttpInfo(
+                    $campaignId,
+                    null,
+                    $status,                // строка, например, "DELIVERED"
+                    $substatus,             // строка, например, "CANCELLED"
+                    $fromDate,
+                    $toDate,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+                    null,
+
+                );
+                $pager = $result[0]->getPager();
+                if (empty($pager->getTotal())) {
+                    break;
+                }
+                $orders = $result[0]->getOrders();
+                if (!isset($allOrders[$campaignId]) || empty($allOrders[$campaignId])) {
+                    $allOrders[$campaignId] = $orders;
+                } else {
+                    $allOrders[$campaignId] = array_merge($allOrders[$campaignId], $orders);
+                }
+
+                $pager = $result[0]->getPager();
+                if ($pager && $pager->getPagesCount() > $currentPage) {
+                    $currentPage++;
+                    $hasMore = true;
+                } else {
+                    $hasMore = false;
+                }
             }
+        }
+        //var_dump($allOrders);die();
+        $result = $this->processOrders($allOrders);
+
+        return ['response' => 'OK', 'storeCount' => count($allOrders), 'result' => $result];
+    }
 
-            $orders = $result[0]->getOrders();
+    protected function processOrders(array $allOrders)
+    {
+        $statuses = MarketplaceOrderStatusTypes::find()
+            ->select(['id', 'code'])
+            ->indexBy('code')
+            ->asArray()
+            ->all();
+        $statuses = ArrayHelper::map($statuses, 'code', 'id');
+        $statusCodes = array_unique(array_keys($statuses));
+        $newOrdersCount = 0;
+        $updatedOrdersCount = 0;
+        foreach ($allOrders as $campaignId => $orders) {
             foreach ($orders as $order) {
-                $status = $statuses[$order->getStatus()] ?? null;
-                $substatus = $statuses[$order->getSubstatus()] ?? null;
+                $statusCode = $order->getStatus();
+                $substatusCode = $order->getSubstatus();
 
-                if (!in_array($order->getStatus(), $statusCodes)) {
+                if (!in_array($statusCode, $statusCodes)) {
                     $newStatus = new MarketplaceOrderStatusTypes();
-                    $newStatus->code = $order->getStatus();
+                    $newStatus->code = $statusCode;
                     if ($newStatus->save()) {
-                        $status = $newStatus->id;
-                        $statusCodes[] = $order->getStatus();
-                        $statuses[$order->getStatus()] = $newStatus->id;
+                        $statusId = $newStatus->id;
+                        $statusCodes[] = $statusCode;
+                        $statuses[$statusCode] = $newStatus->id;
                     } else {
                         Yii::error(
-                            'Ошибка сохранения статуса: ' . json_encode($newStatus->getErrors(), JSON_UNESCAPED_UNICODE)
+                            'Ошибка сохранения статуса: ' . json_encode(
+                                $newStatus->getErrors(),
+                                JSON_UNESCAPED_UNICODE
+                            )
                         );
+                        $statusId = null;
                     }
+                } else {
+                    $statusId = $statuses[$statusCode];
                 }
 
-                if (!in_array($order->getSubstatus(), $statusCodes)) {
+                if (!in_array($substatusCode, $statusCodes)) {
                     $newSubstatus = new MarketplaceOrderStatusTypes();
-                    $newSubstatus->code = $order->getSubstatus();
+                    $newSubstatus->code = $substatusCode;
                     if ($newSubstatus->save()) {
-                        $substatus = $newSubstatus->id;
-                        $statusCodes[] = $order->getSubstatus();
-                        $statuses[$order->getSubstatus()] = $newSubstatus->id;
+                        $substatusId = $newSubstatus->id;
+                        $statusCodes[] = $substatusCode;
+                        $statuses[$substatusCode] = $newSubstatus->id;
                     } else {
                         Yii::error(
                             'Ошибка сохранения подстатуса: ' . json_encode(
@@ -239,7 +312,10 @@ class YandexMarketController extends Controller
                                 JSON_UNESCAPED_UNICODE
                             )
                         );
+                        $substatusId = null;
                     }
+                } else {
+                    $substatusId = $statuses[$substatusCode];
                 }
 
                 $newRawData = json_encode($order);
@@ -248,6 +324,7 @@ class YandexMarketController extends Controller
                     ->one();
 
                 if (!$marketplaceOrder) {
+                    // Создание нового заказа
                     $marketplaceOrder = new MarketplaceOrders();
                     $marketplaceOrder->marketplace_order_id = (string)$order->getId();
                     $marketplaceOrder->creation_date = date('Y-m-d H:i:s', strtotime($order->getCreationDate()));
@@ -261,34 +338,37 @@ class YandexMarketController extends Controller
                     $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
 
                     $warehouseGuid = (string)$campaignId;
-                    $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
-                    $marketplaceOrder->store_id = $store ? $store->store_id : null;
-                    $marketplaceOrder->warehouse_guid = $warehouseGuid;
+                    if ($warehouseGuid) {
+                        $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
+                        $marketplaceOrder->store_id = $store ? $store->store_id : null;
+                        $marketplaceOrder->warehouse_guid = $warehouseGuid;
+                    }
 
-                    $marketplaceOrder->status_id = (int)$status;
-                    $marketplaceOrder->substatus_id = (int)$substatus;
+                    $marketplaceOrder->status_id = (int)$statusId;
+                    $marketplaceOrder->substatus_id = (int)$substatusId;
                     $marketplaceOrder->raw_data = $newRawData;
 
                     if ($marketplaceOrder->save()) {
+                        $newOrdersCount += 1;
+                        // Создаем запись истории статусов
                         $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
                         $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
-                        $newStatusHistoryRecord->status_id = (int)$status;
-                        $newStatusHistoryRecord->substatus_id = (int)$substatus;
+                        $newStatusHistoryRecord->status_id = (int)$statusId;
+                        $newStatusHistoryRecord->substatus_id = (int)$substatusId;
                         $newStatusHistoryRecord->active = 1;
                         $newStatusHistoryRecord->initiator = "ERP";
                         $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
                         $newStatusHistoryRecord->date_end = '2100-01-01 00:00:00';
-
                         if (!$newStatusHistoryRecord->save()) {
                             Yii::error(
-                                'Ошибка сохранения истории: ' . json_encode(
+                                'Ошибка сохранения истории статуса: ' . json_encode(
                                     $newStatusHistoryRecord->getErrors(),
                                     JSON_UNESCAPED_UNICODE
                                 )
                             );
                         }
 
-
+                        // Сохраняем данные доставки
                         $delivery = $order->getDelivery();
                         if ($delivery) {
                             $deliveryModel = new MarketplaceOrderDelivery();
@@ -305,10 +385,12 @@ class YandexMarketController extends Controller
                                 $deliveryModel->street = $address->getStreet();
                                 $deliveryModel->house = $address->getHouse();
                                 $deliveryModel->apartment = $address->getApartment();
-                                $deliveryModel->latitude = $address->getGps()->getLatitude();
-                                $deliveryModel->longitude = $address->getGps()->getLongitude();
+                                $gps = $address->getGps();
+                                if ($gps) {
+                                    $deliveryModel->latitude = $gps->getLatitude();
+                                    $deliveryModel->longitude = $gps->getLongitude();
+                                }
                             }
-
                             $dates = $delivery->getDates();
                             if ($dates) {
                                 $deliveryModel->delivery_start = date(
@@ -320,7 +402,6 @@ class YandexMarketController extends Controller
                                     strtotime($dates->getToDate() . ' ' . $dates->getToTime())
                                 );
                             }
-
                             $courier = $delivery->getCourier();
                             if ($courier) {
                                 $deliveryModel->courier_full_name = $courier->getFullName();
@@ -329,7 +410,6 @@ class YandexMarketController extends Controller
                                 $deliveryModel->courier_vehicle_number = $courier->getVehicleNumber();
                                 $deliveryModel->courier_vehicle_description = $courier->getVehicleDescription();
                             }
-
                             if (!$deliveryModel->save()) {
                                 Yii::error(
                                     'Ошибка сохранения доставки: ' . json_encode(
@@ -340,6 +420,7 @@ class YandexMarketController extends Controller
                             }
                         }
 
+                        // Сохраняем позиции заказа
                         $items = $order->getItems();
                         if (!empty($items)) {
                             foreach ($items as $item) {
@@ -379,6 +460,7 @@ class YandexMarketController extends Controller
                         );
                     }
                 } else {
+                    // Обновление существующего заказа, если данные изменились
                     if ($newRawData !== $marketplaceOrder->raw_data) {
                         $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
                         $marketplaceOrder->total = $order->getBuyerTotal();
@@ -389,45 +471,45 @@ class YandexMarketController extends Controller
                         $marketplaceOrder->payment_method = $order->getPaymentMethod();
                         $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
                         $marketplaceOrder->raw_data = $newRawData;
-
-                        $statusHistoryRecord = MarketplaceOrderStatusHistory::find()
-                            ->where(['order_id' => $marketplaceOrder->id])
-                            ->one();
+                        $marketplaceOrder->status_id = (int)$statusId;
+                        $marketplaceOrder->substatus_id = (int)$substatusId;
+                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
+                        $marketplaceOrder->save();
+                        $updatedOrdersCount += 1;
+                        // Обновление истории статусов, если изменился статус
+                        $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $marketplaceOrder->id])->one();
                         if (
-                            (!empty($statusHistoryRecord)) &&
-                            ($statusHistoryRecord->status_id !== $status
-                                || $statusHistoryRecord->substatus_id !== $substatus)
+                            $statusHistoryRecord &&
+                            ($statusHistoryRecord->status_id !== (int)$statusId ||
+                             $statusHistoryRecord->substatus_id !== (int)$substatusId)
                         ) {
                             $statusHistoryRecord->active = 0;
-                            $statusHistoryRecord->date_to = date();
+                            $statusHistoryRecord->date_to = date('Y-m-d H:i:s');
                             $statusHistoryRecord->save();
 
                             $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
                             $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
-                            $newStatusHistoryRecord->status_id = (int)$status;
-                            $newStatusHistoryRecord->substatus_id = (int)$substatus;
+                            $newStatusHistoryRecord->status_id = (int)$statusId;
+                            $newStatusHistoryRecord->substatus_id = (int)$substatusId;
                             $newStatusHistoryRecord->active = 1;
                             $newStatusHistoryRecord->initiator = "ERP";
                             $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
                             $newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
                             if (!$newStatusHistoryRecord->save()) {
                                 Yii::error(
-                                    'Ошибка сохранения' . json_encode(
+                                    'Ошибка сохранения новой истории статуса: ' . json_encode(
                                         $newStatusHistoryRecord->getErrors(),
                                         JSON_UNESCAPED_UNICODE
                                     )
                                 );
                             }
                         }
-                        $marketplaceOrder->status_id = (int)$status;
-                        $marketplaceOrder->substatus_id = (int)$substatus;
-                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
-                        $marketplaceOrder->save();
 
+                        // Обновление позиций заказа
                         $newItems = $order->getItems();
-                        $existingItems = MarketplaceOrderItems::find()->where(['order_id' => $marketplaceOrder->id])
+                        $existingItems = MarketplaceOrderItems::find()
+                            ->where(['order_id' => $marketplaceOrder->id])
                             ->all();
-
                         if (count($existingItems) !== count($newItems)) {
                             MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]);
                             foreach ($newItems as $item) {
@@ -528,6 +610,6 @@ class YandexMarketController extends Controller
                 }
             }
         }
-        return json_encode(["response" => "OK"]);
+        return ['newOrders' => $newOrdersCount, 'updateOrders' => $updatedOrdersCount];
     }
 }