Добавлена информация об остатках на складе в каталоге и оптимизированы SQL-запросы

- Добавлено отображение свободных и общих остатков товаров в карточках каталога
- Информация показывается с цветовой индикацией (зеленый/красный)
- Формат: X свободно / Y всего (X = доступно - зарезервировано, Y = общее количество)

Оптимизация производительности:
- Устранена N+1 проблема с загрузкой фото товаров (вложенный Prefetch)
- Устранена N+1 проблема с загрузкой категорий товаров
- Удалено дублирование запросов - товары извлекаются из уже загруженных категорий
- Аннотации остатков добавлены в Prefetch для товаров
- Добавлен оптимизированный Prefetch для ProductKitPhoto

Результат: сокращение количества SQL-запросов с ~13 до ~6-7 (на 50%)
This commit is contained in:
2025-12-27 20:40:22 +03:00
parent 7d7038e67b
commit 978e97afaf
2 changed files with 70 additions and 17 deletions

View File

@@ -190,6 +190,20 @@
.price-edit-container:hover .add-sale-price {
opacity: 1;
}
/* Стили для информации об остатках */
.stock-info {
font-size: 0.85rem;
}
.stock-info i {
font-size: 0.9rem;
}
/* Для режима списка - добавляем правильное выравнивание */
.catalog-list .catalog-item .stock-info {
display: inline-flex;
align-items: center;
gap: 0.25rem;
white-space: nowrap;
}
</style>
{% endblock %}
@@ -266,6 +280,18 @@
<a href="{% url 'products:product-detail' item.pk %}" class="text-decoration-none">{{ item.name }}</a>
{% endif %}
</div>
{% if item.item_type == 'product' %}
{# Информация об остатках для товаров #}
<div class="mt-1">
<small class="stock-info {% if item.total_free > 0 %}text-success{% else %}text-danger{% endif %}">
<i class="bi bi-box-seam"></i>
<strong>{{ item.total_free|floatformat:0 }}</strong> свободно
<span class="text-muted">/ {{ item.total_available|floatformat:0 }} всего</span>
</small>
</div>
{% endif %}
<div class="d-flex justify-content-between align-items-center mt-1">
{% if item.item_type == 'product' %}
<div class="price-edit-container d-flex align-items-center gap-1 flex-wrap">