projects/org/@biz-lideravto/it/docs/import/CATALOG_LOAD_ARCHITECTURE.md

Архитектура загрузки каталога — 2 слоя

← Назад в оглавление

Версия: 1.0.0
Дата: 2026-03-14
Проект: new.lideravto.ru — Drupal 11.3.3 + Commerce 3.x


Обзор

Загрузка каталога разделена на два независимых слоя с разными задачами и расписаниями:

BAZON CSV (поставщик)
    ↓
┌──────────────────────────────────────────────────────┐
│  СЛОЙ 1А — Карточки деталей (dru_lider_importer)     │
│  Когда: при каждом получении нового файла от Bazon    │
│  Задача: создать/обновить карточки, слить OEM/кросс  │
└──────────────────────────────────────────────────────┘
    ↓
┌──────────────────────────────────────────────────────┐
│  СЛОЙ 1Б — Товары/SKU (dru_lider_products)           │
│  Когда: после Слоя 1А, при том же импорте            │
│  Задача: загрузить/обновить вариации Commerce Product │
└──────────────────────────────────────────────────────┘
    ↓
┌──────────────────────────────────────────────────────┐
│  СЛОЙ 2 — Адреса и редиректы (lider:rebuild)         │
│  Когда: ежедневно (cron), независимо от импорта      │
│  Задача: URL aliases, 301-редиректы, перелинковка    │
└──────────────────────────────────────────────────────┘

Слой 1А — Управление карточками

Модуль: dru_lider_importer
Drush-команда: drush lider:import-products
Входные данные: строки из CATALOG.csv (Bazon)

Что такое карточка (lider_part node)

Карточка — единица каталога, соответствующая одному OEM-номеру. Одна карточка хранит:
- Canonical name (нормализованное название типа детали)
- OEM-номер (основной идентификатор)
- Список кросс-номеров cross_numbers[] — другие артикулы той же детали
- Список совместимых моделей compatible_models[] — для какой техники подходит
- Статус детали (used / contract / new)

Алгоритм Слоя 1А

Для каждой строки из CATALOG.csv:

  1. Нормализовать OEM
     - Убрать пробелы, спецсимволы
     - Привести к стандартному виду

  2. Найти существующую карточку:
     a) Искать по основному OEM
        → Нашли → переходим к шагу 4 (обновление)
     b) Нет → искать этот OEM в cross_numbers[] всех карточек
        → Нашли → этот OEM является кроссом другой карточки → шаг 4
     c) Нет нигде → создаём новую карточку → шаг 3

  3. Создать новую карточку:
     - oem = основной OEM из строки
     - name = canonical name (из parts_dictionary.csv)
     - compatible_models = [модель из строки]
     - cross_numbers = [кросс-номера из строки CSV]
     - Статус = published / pending (если название не нормализовано)

  4. Обновить существующую карточку:
     - Добавить модель в compatible_models[] (если её там нет)
     - Добавить кросс-номера в cross_numbers[] (слияние без дублей)
     - Обновить canonical name (если новый вариант точнее)
     - НЕ удалять существующие модели — только добавлять

  5. Карточка НЕ трогает URL и alias — это работа Слоя 2

Правила слияния карточек

Ситуация Действие
OEM уже есть как основной Обновить карточку
OEM найден как кросс другой карточки Добавить модель/кросс к той карточке
OEM нигде не найден Создать новую карточку
Два разных OEM — одна деталь (по кроссам) Объединить: первый = основной, второй = кросс
Разные canonical names для одного OEM Оставить более конкретное (длиннее)

Слой 1Б — Загрузка товаров (SKU)

Модуль: dru_lider_products
Drush-команда: drush lider:import-sku
Входные данные: те же строки CATALOG.csv + ссылка на карточку из Слоя 1А

Что такое товар (SKU / Product Variation)

Товар — конкретный физический экземпляр детали на складе. На одну карточку может быть несколько товаров (разные состояния, источники, фото).

Алгоритм Слоя 1Б

Для каждой строки из CATALOG.csv (после выполнения Слоя 1А):

  1. Найти карточку (lider_part node) по OEM
     → уже определено в Слое 1А, передаётся как card_id

  2. Найти или создать Commerce Product:
     - Один Commerce Product на карточку
     - Привязан к lider_part через поле field_part_ref

  3. Найти или создать Product Variation (SKU):
     - Ключ: bazon_sku_id (внутренний номер Bazon)
     - Поля: цена, остаток, статус (used/contract/new), донор

  4. Обновить Variation:
     - price = актуальная цена из строки
     - qty = остаток из строки
     - Если qty = 0 → status = out_of_stock (не удалять)
     - Если qty > 0 и был out_of_stock → status = available
       → триггер алерта "появилось в наличии" для подписчиков

  5. Фото (опционально):
     - Если есть путь к фото → загрузить в Media, привязать к Variation
     - Если фото уже есть → не перезаписывать

Правила работы с товарами

Ситуация Действие
Новая строка из Bazon Создать новую Variation
Строка уже есть (по bazon_sku_id) Обновить цену и остаток
Остаток = 0 Скрыть Variation, не удалять
Остаток появился снова Показать, отправить алерт подписчикам
Цена снизилась Обновить цену, отправить алерт подписчикам

Слой 2 — Управление адресами

Модуль: dru_lider_catalog (команда rebuild)
Drush-команда: drush lider:rebuild-catalog
Расписание: ежедневно в 02:00, независимо от импорта

Задача

Слой 2 не знает ничего о Bazon. Он берёт текущее состояние карточек в базе и приводит URL aliases и перелинковку в соответствие с правилами.

Алгоритм Слоя 2

Для каждой карточки (lider_part node):

  1. Прочитать compatible_models[]

  2. Определить тип URL:
     ┌─────────────────────────────────────────────────────┐
     │ 0 моделей   → unpublish (скрыть, не удалять)        │
     │ 1 модель    → /zapchasti/{marka}/{model}/{...}/{oem} │
     │ 2+ модели   → /zapchasti/{marka}/any/{...}/{oem}     │
     │ 2+ марки    → /zapchasti/any/any/{...}/{oem}         │
     └─────────────────────────────────────────────────────┘

  3. Сравнить с текущим URL alias:
     - Совпадает → ничего не делать (большинство случаев)
     - Изменился (напр. model → any):
         a) Создать 301: старый URL → новый URL
         b) Обновить alias на новый
     - Нет alias (новая карточка):
         a) Создать alias

  4. Обновить перелинковку:
     - Листинги узлов (/model/sistema/uzel/) → включить/исключить карточку
     - Страницы моделей → обновить счётчики деталей по узлам
     - Страницы систем → обновить счётчики
     - Мега-меню → обновить (кешировать)

  5. Обновить sitemap:
     - Добавить новые canonical URLs
     - Убрать unpublished карточки

  6. Лог:
     - Создано aliases: N
     - Обновлено aliases: M
     - Создано 301: K
     - Скрыто карточек: L

Правила изменения URL

Было Стало Причина Действие
/volvo/fh4/... /volvo/any/... Добавили совместимость с FM4 301 + обновить alias
/volvo/any/... /volvo/fh4/... Убрали совместимость с FM4 301 + обновить alias
Нет alias /volvo/fh4/... Новая карточка Создать alias
/volvo/fh4/... Unpublished Удалили все совместимости Скрыть (не 301)

Разделение ответственности

Действие 1А (Карточки) 1Б (SKU) 2 (Адреса)
Создать карточку
Найти карточку по OEM
Найти карточку по кроссу
Добавить модель в совместимые
Добавить кросс-номер
Слить canonical name
Создать Commerce Product
Создать/обновить Variation (SKU)
Обновить цену / остаток
Загрузить фото
Отправить алерт "цена упала"
Отправить алерт "появилось"
Назначить URL alias
Переключить model↔any
Создать 301-редирект
Скрыть карточку (0 моделей)
Обновить листинги узлов
Обновить мега-меню
Обновить sitemap

Расписание и порядок запуска

ИМПОРТ (при получении нового файла от Bazon):
  drush lider:import-products   ← Слой 1А: карточки
  drush lider:import-sku        ← Слой 1Б: SKU/цены

ЕЖЕДНЕВНО в 02:00 (cron):
  drush lider:rebuild-catalog   ← Слой 2: адреса и редиректы

ПЕРВОНАЧАЛЬНАЯ ЗАГРУЗКА (разовый запуск):
  drush lider:import-taxonomy   ← справочники: 8 систем / 61 узел
  drush lider:import-models     ← 62 модели грузовиков
  drush lider:import-products   ← 18 304 деталей (Слой 1А)
  drush lider:import-sku        ← SKU (Слой 1Б)
  drush lider:rebuild-catalog   ← URL aliases (Слой 2)

Связанные документы


← Назад в оглавление