Домен: Справочник услуг

Комплексные и обычные услуги, используемые при создании заказ-нарядов.

Схема связей

service_complex_work_tree          ← дерево категорий (напр. «Кат.01 Седан»)
    │
    └── service_complex_work_item  ← группа работ внутри категории
            │
            └── service_complex_work  ← конкретная работа (name, price, time_value)

service_common_work_tree           ← дерево каталога услуг
    │
    └── service_common_work        ← услуга в каталоге (bar_code, price)

ORM-модели

ServiceComplexWorkTree

Таблица service_complex_work_tree — корневые категории комплексных работ. Каждой категории RocketWash соответствует свой service_complex_work_tree_id.

service_complex_work_tree_id

Категория

11

Кат.01 — Седан / хетчбэк

15

Кат.02 — Внедорожник / кроссовер

16

Кат.03 — Микроавтобус

17

Кат.04 — Крупный внедорожник / минивэн

from autodealer.domain.service_complex_work_tree import ServiceComplexWorkTree
trees = ServiceComplexWorkTree.objects.all()

ServiceComplexWorkItem

Таблица service_complex_work_item — группа работ внутри дерева.

Поле

Тип

Описание

service_complex_work_item_id

int PK

Первичный ключ

service_complex_work_tree_id

int FK

Дерево / категория

name

str

Название группы

ServiceComplexWork

Таблица service_complex_work — конкретная работа в комплексе. Строки этой таблицы передаются в create_service_order как ServiceOrderItem.

Поле

Тип

Описание

service_complex_work_id

int PK

Первичный ключ

service_complex_work_item_id

int FK

Группа работ

name

str(255)

Название (макс. 255 символов)

price

Decimal

Цена за единицу

time_value

Decimal

Длительность в минутах

quantity

int

Количество (по умолчанию 1)

position_number

int

Порядок отображения

external_id

str(512)

Внешний ID

from autodealer.domain.service_complex_work import ServiceComplexWork
from autodealer.domain.service_complex_work_item import ServiceComplexWorkItem

# Все работы категории Кат.01
item_ids = [
    i.service_complex_work_item_id
    for i in ServiceComplexWorkItem.objects.filter(service_complex_work_tree_id=11).all()
]
works = ServiceComplexWork.objects.filter(service_complex_work_item_id__in=item_ids).all()

ServiceCommonWork

Таблица service_common_work — общий каталог услуг (не привязан к категориям авто). Используется функцией get_or_create_service.

Поле

Тип

Описание

service_common_work_id

int PK

Первичный ключ

service_common_work_tree_id

int FK

Папка каталога

name

str

Название

price

Decimal

Цена

time_value

Decimal

Длительность в минутах

bar_code

str

Уникальный ключ (напр. "rw:821460") — используется для идемпотентности

Высокоуровневые функции (services)

iter_complex_works_by_tree

autodealer.services.iter_complex_works_by_tree(tree_id)

Генератор всех работ из дерева service_complex_work_tree. Не загружает все записи в память сразу.

Параметры:

tree_id (int) – service_complex_work_tree_id.

Yields:

Экземпляры ServiceComplexWork.

from autodealer.services import iter_complex_works_by_tree

for work in iter_complex_works_by_tree(11):   # Кат.01
    print(work.name, work.price, work.time_value)

get_or_create_service

autodealer.services.get_or_create_service(name, price=None, time_value=None, bar_code=None, tree_id=None)

Найти услугу в service_common_work по bar_code или создать новую. Идемпотентно: повторный вызов с тем же bar_code вернёт существующую запись.

Параметры:
  • name (str) – Название услуги.

  • price (float) – Цена по умолчанию.

  • time_value (float) – Длительность в минутах.

  • bar_code (str) – Уникальный ключ (напр. "rw:821460").

  • tree_id (int) – FK → service_common_work_tree.

Результат:

service_common_work_id.

Тип результата:

int

from autodealer.services import get_or_create_service

svc_id = get_or_create_service(
    "Комплекс",
    price=2300.0,
    time_value=90,
    bar_code="rw:821460",
)