From d332364631ccaba86220e68477ca8d0c29f4e7c6 Mon Sep 17 00:00:00 2001 From: fomichev Date: Tue, 12 Nov 2024 17:00:53 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=84?= =?utf8?q?=D0=B8=D0=B4=D0=B0=20=D0=B8=20=D1=87=D0=B8=D1=81=D1=82=D0=BA?= =?utf8?q?=D0=B0=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/services/MarketplaceService.php | 184 ++++++++++++++------------ 1 file changed, 101 insertions(+), 83 deletions(-) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 6aeefa2b..bb9aff04 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -19,47 +19,47 @@ use yii_app\records\ProductsClass; class MarketplaceService { - + // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива private const CATEGORIES_WITH_SUBCATEGORIES = [ "Цветы" => [ - "Монобукеты", - "Авторские букеты", - "Цветы в коробке", - "Цветы в корзине", - "Букеты невесты", - "Композиции из цветов", - "Мягкие игрушки", - "Подарочные наборы", - "Мишки из роз", - "Открытки", - "Стабилизированные цветы", - "Букеты из сухоцветов", - "Искусственные цветы", - "Цветы в ящиках", - "Другое", - "Цветы поштучно", - "Траурные цветы", - "Букеты из мыла", - "Цветы для интерьера", + 1 => "Монобукеты", + 2 => "Авторские букеты", + 3 => "Цветы в коробке", + 4 => "Цветы в корзине", + 5 => "Букеты невесты", + 6 => "Композиции из цветов", + 7 => "Мягкие игрушки", + 8 => "Подарочные наборы", + 9 => "Мишки из роз", + 10 => "Открытки", + 11 => "Стабилизированные цветы", + 12 => "Букеты из сухоцветов", + 13 => "Искусственные цветы", + 14 => "Цветы в ящиках", + 15 => "Другое", + 16 => "Цветы поштучно", + 17 => "Траурные цветы", + 18 => "Букеты из мыла", + 19 => "Цветы для интерьера", ], "Живые растения" => [ - "Цветы в горшках", - "Флорариумы", - "Суккуленты, кактусы", - "Бонсаи", - "Пальмы и деревья", - "Левитирующие растения", - "Саженцы и рассада", - "Фитокартины", - "Семена", - "Другое", - "Кашпо и горшки для цветов", - "Наборы для выращивания", - "Грунты и удобрения", - "Аксессуары для комнатных растений", - "Спатифиллумы", - "Замиокулькасы", - "Антуриумы" + 1 => "Цветы в горшках", + 2 => "Флорариумы", + 3 => "Суккуленты, кактусы", + 4 => "Бонсаи", + 5 => "Пальмы и деревья", + 6 => "Левитирующие растения", + 7 => "Саженцы и рассада", + 8 => "Фитокартины", + 9 => "Семена", + 10 => "Другое", + 11 => "Кашпо и горшки для цветов", + 12 => "Наборы для выращивания", + 13 => "Грунты и удобрения", + 14 => "Аксессуары для комнатных растений", + 15 => "Спатифиллумы", + 16 => "Замиокулькасы", + 17 => "Антуриумы", ] ]; @@ -86,11 +86,11 @@ class MarketplaceService $productsGuidsIds = array_column($productsGuids, 'id'); - //var_dump( $productsGuidsIds); + // 2. Получение цен на букеты - //$prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price'); + $prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price'); - $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]); + /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]); if (empty($allPrices)) { Yii::warning('Не найдено цен для GUID.'); @@ -105,9 +105,9 @@ class MarketplaceService } elseif (!is_scalar($productId)) { Yii::warning('Invalid productId type: ' . gettype($productId)); } - } + }*/ + - //var_dump($prices); // 3. Получение состава букетов $bouquetComposition = []; @@ -126,7 +126,7 @@ class MarketplaceService } } $componentsGuids = array_unique($componentsGuids); - //var_dump($componentsGuids); + // 4. Проверка остатков $marketplaceStores = array_column(MarketplaceStore::findAll(['warehouse_id' => $marketId]), null, 'guid'); @@ -145,7 +145,7 @@ class MarketplaceService $balance2Dim[$balance['store_id']][$balance['product_id']] = $balance['quantity']; $balanceStoreIds[] = $balance['store_id']; } - //var_dump( $balanceStoreIds ); + $balanceStoreIds = array_unique($balanceStoreIds); foreach ($bouquetComposition as $guid => $products) { @@ -175,11 +175,11 @@ class MarketplaceService $stocks[$guid] = ['count' => $bouquetCount, 'store' => $store]; } } - //var_dump(ArrayHelper::getColumn($productsGuids, 'id')); + // 5. Получение приоритетов $priorities = MarketplacePriority::find() ->where(['guid' => ArrayHelper::getColumn($productsGuids, 'id')])->indexBy('guid')->asArray()->all(); - //var_dump($priorities); + // 6. Массив для хранения гуидов, которые можно отправить $availableGuids = []; @@ -213,7 +213,7 @@ class MarketplaceService } } - // var_dump($availableGuids); + $distribution = []; foreach ($availableGuids as $product) { @@ -230,7 +230,7 @@ class MarketplaceService $koefRemain = $priority['reminder_koef']; $totalBouquets = intval($stock['count'] / $koefRemain); // С учетом коэффициента - // echo "
"; var_dump($availableGuids); var_dump($totalBouquets); var_dump($stock); die;
+
             if ($totalBouquets >= 2) {
                 // Равномерное распределение
                 foreach ($marketplaceStores as $store) {
@@ -256,7 +256,7 @@ class MarketplaceService
         }
       //  var_dump($distribution);
 
-        return Json::encode($distribution);
+        return $distribution;
     }
 
 
@@ -305,19 +305,17 @@ class MarketplaceService
             $price = MarketplaceService::getProductPrice($product->id);
 
 
-          /*  if ($price == 0) {
+            if ($price == 0) {
                 $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
                 Yii::error($message, __METHOD__);
-
-
-                InfoLogService::setInfoLog(
+              InfoLogService::setInfoLog(
                     __FILE__,
                     __LINE__,
                     $message,
                     'Zero price error'
                 );
                 continue;
-            }*/
+            }
 
             $components = json_decode($product->components, true);
             $composition = [];
@@ -359,21 +357,10 @@ class MarketplaceService
     }
 
 
-    public static function getProductsInfoForFeed(int $warehouseGuid, $storeData)
+    public static function getProductsInfoForFeed(int $warehouseGuid, array $storeData)
     {
 
 
-        if (is_string($storeData)) {
-            $storeData = json_decode($storeData, true);
-
-
-            if (json_last_error() !== JSON_ERROR_NONE) {
-                Yii::error('Невалидный JSON в storeData: ' . json_last_error_msg(), __METHOD__);
-                return [];
-            }
-        }
-
-
         if (!is_array($storeData)) {
             Yii::error('Invalid data format for storeData; expected array.', __METHOD__);
             return [];
@@ -420,7 +407,7 @@ class MarketplaceService
 
             $price = MarketplaceService::getProductPrice($product->id);
 
-            /*  if ($price == 0) {
+              if ($price == 0) {
                 $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
                 Yii::error($message, __METHOD__);
 
@@ -432,7 +419,7 @@ class MarketplaceService
                     'Zero price error'
                 );
                 continue;
-            }*/
+            }
 
             $components = json_decode($product->components, true);
             $composition = [];
@@ -463,7 +450,7 @@ class MarketplaceService
                 'weight' => MarketplaceService::getProductWeight($product->id),
                 'minorder' => MarketplaceService::getProductMinOrder($product->id),
                 'composition' => $composition,
-                'available' => MarketplaceService::getProductAvailability($product->id),
+                'available' => MarketplaceService::getProductAvailability($availableQty),
                 'category_id' => MarketplaceService::getProductCategory($product->id),
                 'category_name' => $properties['flowwowSubcategory'],
                 'params' => MarketplaceService::getProductParams($product->id),
@@ -528,42 +515,48 @@ class MarketplaceService
 
             // Добавление цены и валюты
             $offer->addChild('price', $product['price']);
-            $offer->addChild('oldPrice', $product['oldprice']);
+      //    $offer->addChild('oldPrice', $product['oldprice']);
             $offer->addChild('currencyId', 'RUB');
             $offer->addChild('categoryId', $product['category_id']);
 
             // Добавление доступности доставки
             $offer->addChild('delivery', 'true');
 
+            // Название продукта
+            $offer->addChild('name', $product['name']);
+
             // Описание продукта
             if (!empty($product['description'])) {
                 $offer->addChild('description', $product['description']);
             }
 
             // Добавление веса и количества
-            $offer->addChild('weight', $product['weight']);
-            $offer->addChild('qty', $product['qty']);
+      //    $offer->addChild('weight', $product['weight']);
+
+            if (!self::CATEGORIES_WITH_SUBCATEGORIES[0]) {
+                $offer->addChild('qty', $product['qty']);
+            }
+
 
             // $offer->addChild('amount', $product['amount']);
-            //   $offer->addChild('cost', $product['amount']);
+
 
             foreach ($product['composition'] as $component) {
                 $consist = $offer->addChild('consist', $component['quantity']);
                 $consist->addAttribute('name', $component['name']);
                 $consist->addAttribute('unit', $component['unit']);
-                //   $consist->addAttribute('cost', 12);
+
             }
 
             // Добавление параметров
-            if (!empty($product['params'])) {
+           /* if (!empty($product['params'])) {
                 foreach ($product['params'] as $paramName => $paramValue) {
                     $param = $offer->addChild('param', $paramValue);
                     $param->addAttribute('name', $paramName);
                 }
-            }
+            }*/
+
 
-            // Название продукта
-            $offer->addChild('name', $product['name']);
 
             // Добавление изображений продукта
             if (!empty($product['pictures'])) {
@@ -628,7 +621,7 @@ class MarketplaceService
             ->one();
 
         if (!$product) {
-            return null; // Вернуть null, если продукт не найден
+            return null;
         }
 
         return $product->description;
@@ -644,6 +637,14 @@ class MarketplaceService
             ->one();
 
         if (!$product) {
+            $message = "У товара {$product-> guid} отсутствует запись в таблице свойств.";
+            Yii::error($message, __METHOD__);
+            InfoLogService::setInfoLog(
+                __FILE__,
+                __LINE__,
+                $message,
+                'No MatrixErpProperty'
+            );
             return null;
         }
 
@@ -655,25 +656,42 @@ class MarketplaceService
         $categories = self::CATEGORIES_WITH_SUBCATEGORIES;
 
         if (!array_key_exists($category, $categories)) {
+
+            $message = "У категории {$category} отсутствует запись в таблице свойств.";
+            Yii::error($message, __METHOD__);
+            InfoLogService::setInfoLog(
+                __FILE__,
+                __LINE__,
+                $message,
+                'No CATEGORIES'
+            );
             return null;
         }
 
         $categoryIndex = array_search($category, array_keys($categories)) + 1;
-        $subcategoryIndex = array_search($subcategory, $categories[$category]) + 1;
+
+        $subcategoryIndex = array_search($subcategory, $categories[$category]);
 
         if ($subcategoryIndex === false) {
+            $message = "У подкатегории {$subcategoryIndex} отсутствует запись в таблице свойств.";
+            Yii::error($message, __METHOD__);
+            InfoLogService::setInfoLog(
+                __FILE__,
+                __LINE__,
+                $message,
+                'No subcategoryIndex'
+            );
             return null;
         }
 
-
         return (string)$categoryIndex . (string)$subcategoryIndex;
     }
 
     private static function getProductMinOrder($productId) {
         return 1;
     }
-    private static function getProductAvailability($productId) {
-        return true;
+    private static function getProductAvailability($availableQty) {
+        return $availableQty > 0;
     }
 
     private static function getProductMaterial($productId)
-- 
2.39.5