From: fomichev Date: Fri, 21 Feb 2025 09:38:31 +0000 (+0300) Subject: Рефакторинг и улучшение метода X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=1991d6bf4e6920bff02e13743d94f601998dfade;p=erp24_rep%2Fyii-erp24%2F.git Рефакторинг и улучшение метода --- diff --git a/erp24/api2/controllers/YandexMarketController.php b/erp24/api2/controllers/YandexMarketController.php index 0e8a5143..4c92ff6b 100644 --- a/erp24/api2/controllers/YandexMarketController.php +++ b/erp24/api2/controllers/YandexMarketController.php @@ -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]; } }