Интеграция с RocketWash¶
Модуль autodealer.integration.rocketwash обеспечивает маппинг между сущностями
RocketWash и справочниками AutoDealer, а также высокоуровневые функции создания
заказ-нарядов напрямую из данных RocketWash.
—
Маппинги¶
Категории автомобилей¶
RocketWash использует числовой car_type_id, AutoDealer — строковые категории.
RocketWash |
Категория |
Пример авто |
|---|---|---|
36 |
Кат.01 |
Седан / хетчбэк |
37 |
Кат.02 |
Внедорожник / кроссовер |
38 |
Кат.03 |
Микроавтобус |
35 |
Кат.04 |
Крупный внедорожник / минивэн |
Категории → дерево комплексных работ AutoDealer¶
Каждой категории соответствует service_complex_work_tree_id в Firebird:
Категория |
|
|---|---|
Кат.01 |
11 |
Кат.02 |
15 |
Кат.03 |
16 |
Кат.04 |
17 |
Услуги RocketWash → service_complex_work.name¶
Маппинг конкретных service_id RocketWash к названиям в справочнике AutoDealer.
Услуги без аналога в AutoDealer (Мойка ДВС, Очистка дисков и др.) молча
пропускаются при создании заказ-наряда.
—
Вспомогательные функции (autodealer.integration.rocketwash)¶
- autodealer.integration.rocketwash.resolve_complex_work(rw_service_id, car_type_id=None, car_type=None)¶
Полный резолв услуги RocketWash в запись
service_complex_workАвтоДилера. Ключевая функция для создания заказ-нарядов в «справочном» режиме (сrt_work_idи каноническим именем работы).Алгоритм:
rw_service_id→ каноническийnameчерез внутренний маппинг (только для услуг, присутствующих в обеих системах).car_type_id/car_type→ категория черезresolve_car_category().Категория →
service_complex_work_tree_id.В дереве ищется запись с совпадающим
name.
- Параметры:
rw_service_id (int) –
services.idиз RocketWash.car_type_id (int) –
reservations.car_type_id— и актуальный (35/36/37/38), и устаревшие значения (3/27/28/29).car_type (str) – Строка
reservations.car_type— fallback, когдаcar_type_idне в маппинге.
- Результат:
Кортеж
(service_complex_work_id, name, price)илиNone.
from autodealer.integration.rocketwash import resolve_complex_work resolve_complex_work(821459, car_type_id=37) # → (94, "Стандарт", 1200.0) resolve_complex_work(821459, car_type_id=27) # → тот же результат (устаревший id) resolve_complex_work(821459, car_type="Кат. 2") # → то же (по строке) resolve_complex_work(999999, car_type_id=37) # → None (нет в маппинге)
- autodealer.integration.rocketwash.resolve_car_category(car_type_id=None, car_type=None)¶
Определить категорию АвтоДилера по RW
car_type_idи/или строкеcar_type. Сначала ищет по id, потом fallback через нормализованную строку ("Кат. 2"→"Кат.02").- Результат:
"Кат.01"/"Кат.02"/"Кат.03"/"Кат.04"илиNoneесли не удалось определить.
from autodealer.integration.rocketwash import resolve_car_category resolve_car_category(27) # → "Кат.02" resolve_car_category(99, "Кат. 2") # → "Кат.02" (fallback) resolve_car_category(99, "мусор") # → None
- autodealer.integration.rocketwash.get_car_category_by_type_id(car_type_id)¶
Возвращает строку категории по
car_type_idRocketWash. Старая версия — выбрасываетKeyErrorна неизвестные id. Для нового кода предпочтительнееresolve_car_category().- Исключение:
KeyError – Если
car_type_idнеизвестен.
from autodealer.integration.rocketwash import get_car_category_by_type_id get_car_category_by_type_id(36) # → "Кат.01" get_car_category_by_type_id(35) # → "Кат.04"
- autodealer.integration.rocketwash.get_complex_work_tree_id(rocketwash_category)¶
Возвращает
service_complex_work_tree_idAutoDealer для категории RocketWash.- Исключение:
KeyError – Если категория неизвестна.
from autodealer.integration.rocketwash import get_complex_work_tree_id get_complex_work_tree_id("Кат.01") # → 11 get_complex_work_tree_id("Кат.04") # → 17
- autodealer.integration.rocketwash.resolve_complex_work_tree_id(rocketwash_category)¶
То же, что
get_complex_work_tree_id(), но возвращаетNoneдля неизвестных категорий вместо исключения. Удобно при обработке данных в batch-режиме.
- autodealer.integration.rocketwash.map_reservation_services(services_detail)¶
Маппит список услуг из JSON резервации RocketWash в
MappedServiceItem. Услуги без аналога в AutoDealer молча пропускаются.- Параметры:
services_detail (list[dict]) – Распарсенный список из
reservations.services_detail. Каждый элемент должен содержать ключи"id","name","price","duration","count".- Результат:
Список
MappedServiceItem.
import json from autodealer.integration.rocketwash import map_reservation_services raw = json.loads(reservation_row["services_detail"]) items = map_reservation_services(raw) for item in items: print(item.cw_name, item.price)
- autodealer.integration.rocketwash.get_services_for_car_category(car_category, *, db_path=..., exclude_no_price=True)¶
Загружает все услуги RocketWash с ценами для заданной категории авто из
rocketwash.db.- Параметры:
car_category (str) – Категория, напр.
"Кат.01".db_path (Path) – Путь к
rocketwash.db. По умолчанию —../RocketWash-parser/rocketwash.db.exclude_no_price (bool) – Пропустить услуги без цены (по умолчанию
True).
- Результат:
Список
RocketWashService.- Исключение:
FileNotFoundError – Если
rocketwash.dbне найден.
from autodealer.integration.rocketwash import get_services_for_car_category services = get_services_for_car_category("Кат.02") for s in services: print(s.name, s.price)
—
Типы данных¶
- class autodealer.integration.rocketwash.RocketWashService¶
Услуга RocketWash с ценой для конкретной категории авто.
- service_id: int
- name: str
- category: str
Категория услуги (напр.
"01. МОЙКА и КОМПЛЕКСЫ").
- car_type_id: int
- car_category: str
Строковая категория авто (напр.
"Кат.01").
- price: float | None
- duration: float | None
Длительность в минутах.
- class autodealer.integration.rocketwash.MappedServiceItem¶
Услуга RocketWash, смаппированная на AutoDealer
service_complex_work.- rw_service_id: int
- rw_name: str
Оригинальное название в RocketWash.
- cw_name: str
Название в
service_complex_workAutoDealer.
- price: float
- duration: float
Длительность в минутах.
- count: int