Версия: 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-редиректы, перелинковка │
└──────────────────────────────────────────────────────┘
Модуль: dru_lider_importer
Drush-команда: drush lider:import-products
Входные данные: строки из CATALOG.csv (Bazon)
Карточка — единица каталога, соответствующая одному OEM-номеру. Одна карточка хранит:
- Canonical name (нормализованное название типа детали)
- OEM-номер (основной идентификатор)
- Список кросс-номеров cross_numbers[] — другие артикулы той же детали
- Список совместимых моделей compatible_models[] — для какой техники подходит
- Статус детали (used / contract / new)
Для каждой строки из 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 | Оставить более конкретное (длиннее) |
Модуль: dru_lider_products
Drush-команда: drush lider:import-sku
Входные данные: те же строки CATALOG.csv + ссылка на карточку из Слоя 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, не удалять |
| Остаток появился снова | Показать, отправить алерт подписчикам |
| Цена снизилась | Обновить цену, отправить алерт подписчикам |
Модуль: dru_lider_catalog (команда rebuild)
Drush-команда: drush lider:rebuild-catalog
Расписание: ежедневно в 02:00, независимо от импорта
Слой 2 не знает ничего о Bazon. Он берёт текущее состояние карточек в базе и приводит URL aliases и перелинковку в соответствие с правилами.
Для каждой карточки (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
| Было | Стало | Причина | Действие |
|---|---|---|---|
/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)