From 1d6da89480a8cb5b146cdf682cf05c7e32afaa28 Mon Sep 17 00:00:00 2001 From: fomichev Date: Mon, 11 Nov 2024 13:23:51 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?utf8?q?=D0=B8=D0=B5=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/services/MarketplaceService.php | 254 ++++++++++++++++++-------- 1 file changed, 178 insertions(+), 76 deletions(-) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index c0ddbc2e..b99f3c85 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -2,11 +2,14 @@ namespace yii_app\services; +use Yii; use yii\helpers\ArrayHelper; use yii\helpers\Json; use yii_app\records\Balances; use yii_app\records\MarketplacePriority; use yii_app\records\MarketplaceStore; +use yii_app\records\MatrixErpMedia; +use yii_app\records\MatrixErpProperty; use yii_app\records\Prices; use yii_app\records\Products1c; use yii_app\records\ProductsClass; @@ -14,6 +17,50 @@ use yii_app\records\ProductsClass; class MarketplaceService { + + private const CATEGORIES_WITH_SUBCATEGORIES = [ + "Цветы" => [ + "Монобукеты", + "Авторские букеты", + "Цветы в коробке", + "Цветы в корзине", + "Букеты невесты", + "Композиции из цветов", + "Мягкие игрушки", + "Подарочные наборы", + "Мишки из роз", + "Открытки", + "Стабилизированные цветы", + "Букеты из сухоцветов", + "Искусственные цветы", + "Цветы в ящиках", + "Другое", + "Цветы поштучно", + "Траурные цветы", + "Букеты из мыла", + "Цветы для интерьера", + ], + "Живые растения" => [ + "Цветы в горшках", + "Флорариумы", + "Суккуленты, кактусы", + "Бонсаи", + "Пальмы и деревья", + "Левитирующие растения", + "Саженцы и рассада", + "Фитокартины", + "Семена", + "Другое", + "Кашпо и горшки для цветов", + "Наборы для выращивания", + "Грунты и удобрения", + "Аксессуары для комнатных растений", + "Спатифиллумы", + "Замиокулькасы", + "Антуриумы" + ] + ]; + public static function infoForMarketplace(int $marketId, bool $is_yandex) { if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId())) return; @@ -174,13 +221,15 @@ class MarketplaceService { $parents = ProductsClass::find() ->select('category_id') - ->where(['tip' => 'marketplace']) + ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE]) + ->orWhere(['ilike', 'tip', ProductsClass::MARKETPLACE_ADDITIONAL]) ->column(); $products = Products1c::find() ->where(['tip' => 'products']) ->andWhere(['not', ['components' => '']]) ->andWhere(['parent_id' => $parents]) + ->all(); $count = (int)$id; @@ -189,76 +238,39 @@ class MarketplaceService $result = []; foreach ($selectedProducts as $product) { - $price = self::getProductPrice($product->id); - // Логируем ошибку и пропускаем продукт, если цена равна 0 - if ($price == 0) { - $message = "Product ID {$product->id} has zero price and will be excluded from the feed."; + $properties = MarketplaceService::getProductPropertiesByGuid($product->guid); + if (!$properties) { + $message = "Товар с GUID {$product->guid} не имеет свойств в MatrixErpProperty и был исключен из фида."; Yii::error($message, __METHOD__); - // Запись ошибки в таблицу InfoLogs + InfoLogService::setInfoLog( __FILE__, __LINE__, $message, - 'Zero price error' + 'Missing properties error' ); - continue; // пропускаем продукт + continue; } - $components = json_decode($product->components, true); - $composition = []; + $price = MarketplaceService::getProductPrice($product->id); - foreach ($components as $componentId => $quantity) { - $component = Products1c::findOne(['id' => $componentId]); - if ($component && $quantity > 0) { - $composition[] = [ - 'name' => $component->name, - 'quantity' => $quantity, - 'unit' => 'шт' - ]; - } - } - - $result[] = [ - 'id' => $product->id, - 'name' => $product->name, - 'pictures' => self::getProductPictureUrl($product->id), - 'price' => $price, - 'oldprice' => self::getProductOldPrice($product->id), - 'description' => self::getProductDescription($product->id), - 'qty' => self::getProductQty($product->id), - 'amount' => self::getProductQty($product->id), - 'weight' => self::getProductWeight($product->id), - 'minorder' => self::getProductMinOrder($product->id), - 'composition' => $composition, - 'available' => self::getProductAvailability($product->id), - 'category_id' => self::getProductCategory($product->id), - 'params' => self::getProductParams($product->id) - ]; - } - - return $result; - } + if ($price == 0) { + $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида."; + Yii::error($message, __METHOD__); - /** - * Статический метод для получения информации о заданном количестве продуктов. - * - * @param int $limit Количество продуктов, которые нужно получить. - * @return array - */ - public static function getSomeProductsInfo($limit) - { - $products = Products1c::find() - ->where(['tip' => 'products']) - ->andWhere(['not', ['components' => '']]) - ->limit($limit) - ->all(); - $result = []; + InfoLogService::setInfoLog( + __FILE__, + __LINE__, + $message, + 'Zero price error' + ); + continue; + } - foreach ($products as $index => $product) { $components = json_decode($product->components, true); $composition = []; @@ -273,27 +285,32 @@ class MarketplaceService } } + $properties = MarketplaceService::getProductPropertiesByGuid($product->id); + $result[] = [ 'id' => $product->id, - 'name' => $product->name, - 'pictures' => self::getProductPictureUrl($product->id), - 'price' => self::getProductPrice($product->id), - 'oldprice' => self::getProductOldPrice($product->id), - 'description' => self::getProductDescription($product->id), - 'qty' => self::getProductQty($product->id), - 'amount' => self::getProductQty($product->id), - 'weight' => self::getProductWeight($product->id), - 'minorder' => self::getProductMinOrder($product->id), + 'name' => $properties['displayName'], + 'pictures' => MarketplaceService::getProductImageUrl($product->id), + 'price' => $price, + 'oldprice' => MarketplaceService::getProductOldPrice($product->id), + 'description' => MarketplaceService::getProductDescription($product->id), + 'qty' => MarketplaceService::getProductQty($product->id), + 'amount' => MarketplaceService::getProductQty($product->id), + 'weight' => MarketplaceService::getProductWeight($product->id), + 'minorder' => MarketplaceService::getProductMinOrder($product->id), 'composition' => $composition, - 'available' => self::getProductAvailability($product->id), - 'category_id' => self::getProductCategory($product->id), - 'params' => self::getProductParams($product->id) // Добавление параметров продукта + 'available' => MarketplaceService::getProductAvailability($product->id), + 'category_id' => MarketplaceService::getProductCategory($product->id), + 'category_name' => $properties['flowwowSubcategory'], + 'params' => MarketplaceService::getProductParams($product->id), + 'productLink' => MarketplaceService::getProductLinkByGuid($product->guid), ]; } return $result; } + /** * Статический метод для создания XML-фида на основе информации о продуктах. * @@ -318,11 +335,23 @@ class MarketplaceService $currency->addAttribute('rate', '1'); // Добавление категорий (пример добавления нескольких категорий) + $uniqueCategories = []; + foreach ($productsInfo as $product) { + $categoryId = $product['category_id']; + $categoryName = $product['category_name']; + + + if (!isset($uniqueCategories[$categoryId])) { + $uniqueCategories[$categoryId] = $categoryName; + } + } + + $categories = $shop->addChild('categories'); - $category1 = $categories->addChild('category', 'Букеты'); - $category1->addAttribute('id', '1'); - $category2 = $categories->addChild('category', 'Цветы'); - $category2->addAttribute('id', '2'); + foreach ($uniqueCategories as $id => $name) { + $category = $categories->addChild('category', htmlspecialchars($name)); + $category->addAttribute('id', $id); + } // Добавление офферов (продуктов) $offers = $shop->addChild('offers'); @@ -384,10 +413,43 @@ class MarketplaceService } + private static function getProductPropertiesByGuid($guid) { + $product = MatrixErpProperty::find() + ->where(['guid' => $guid]) + ->one(); + + if (!$product) { + return null; // Вернуть null, если продукт не найден + } + + return [ + 'id' => $product->id, + 'description' => $product->description, + 'imageUrl' => self::getProductImageUrl($product->image_id), + 'date' => $product->date, + 'displayName' => $product->display_name, + 'externalImageUrl' => $product->external_image_url, + 'productUrl' => $product->product_url, + 'flowwowCategory' => $product->flowwow_category, + 'flowwowSubcategory' => $product->flowwow_subcategory, + ]; + } + + private static function getProductImageUrl($imageId) { + $mediaRecord = MatrixErpMedia::find() + ->where(['name' => $imageId]) + ->one(); - private static function getProductPictureUrl($productId) { - return ['https://bazacvetov24.ru/products/8798/29-krasnykh-i-belykh-roz_10919_lg.jpg', 'https://bazacvetov24.ru/products/5339/51-roza-premium_3326_md.jpg']; + if ($mediaRecord && $mediaRecord->file_id) { + return 'https://media.dev.erp-flowers.ru/media/view?id=' . $mediaRecord->file_id; + } + + return null; // Возвращаем null, если изображение не найдено + } + private static function getProductLinkByGuid($guid) { + return 'https://media.dev.erp-flowers.ru/media/view-card?guid=' . urlencode($guid); } + private static function getProductPrice($productId) { $price = Prices::find() ->where(['product_id' => $productId]) @@ -395,14 +457,54 @@ class MarketplaceService return $price['price'] ?? 0; } private static function getProductOldPrice($productId) { return 300; } - private static function getProductDescription($productId) { return 'Описание'; } + private static function getProductDescription($productId) { + + $product = MatrixErpProperty::find() + ->where(['guid' => $productId]) + ->one(); + + if (!$product) { + return null; // Вернуть null, если продукт не найден + } + + return $product->description; + } private static function getProductQty($productId) { return 9; } private static function getProductWeight($productId) { return 0.5; } private static function getProductCategory($productId) { - return 1; + + $product = MatrixErpProperty::find() + ->where(['guid' => $productId]) + ->one(); + + if (!$product) { + return null; + } + + return self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory); + } + + public static function getCategorySubcategoryId($category, $subcategory) + { + $categories = self::CATEGORIES_WITH_SUBCATEGORIES; + + if (!array_key_exists($category, $categories)) { + return null; + } + + $categoryIndex = array_search($category, array_keys($categories)) + 1; + $subcategoryIndex = array_search($subcategory, $categories[$category]) + 1; + + if ($subcategoryIndex === false) { + return null; + } + + + return (string)$categoryIndex . (string)$subcategoryIndex; } + private static function getProductMinOrder($productId) { return 1; } -- 2.39.5