BR 1.9 — Warehouse Service (с нуля)

Инициализация проекта

  • TC-WH-01: Инициализация Spring Boot проекта
    • Java 21, Spring Boot 3, PostgreSQL, Liquibase
    • Конфиг: порт 3008, database warehouse_db
    • Docker + docker-compose
    • Подключение к Kafka

Миграции

  • TC-WH-02: Таблица tech_cards

    • Колонки: id, franchise_id, product_id, product_version, modifier_option_id, name, output_weight, output_unit, cooking_description, status, created_at, updated_at
    • UNIQUE (product_id, product_version, modifier_option_id) — partial для NULL
    • Индексы: franchise_id, (product_id, product_version)
  • TC-WH-03: Таблица recipe_items

    • Колонки: id, tech_card_id, ingredient_product_id, gross_weight, net_weight, cold_loss_percent, hot_loss_percent, unit_of_measure, sort_order, created_at
    • FK tech_card_id → tech_cards ON DELETE CASCADE
    • Индекс: tech_card_id
  • TC-WH-04: Таблица unit_conversions

    • Колонки: id, franchise_id, product_id, from_unit, to_unit, factor, created_at, updated_at
    • UNIQUE (franchise_id, product_id, from_unit, to_unit)

Entity / Repository

  • TC-WH-05: Entity TechCard + TechCardRepository

    • findByProductIdAndProductVersion
    • findByProductIdAndProductVersionAndModifierOptionId
  • TC-WH-06: Entity RecipeItem + RecipeItemRepository

    • findByTechCardId (ordered by sort_order)
  • TC-WH-07: Entity UnitConversion + UnitConversionRepository

    • findByFranchiseIdAndProductId

Service

  • TC-WH-08: TechCardService — CRUD техкарт

    • create: валидация product exists (HTTP call → Catalog Service), product type=dish, unique check
    • update: partial update полей
    • delete
    • getById: с items, enrich ingredient names (HTTP → Catalog)
    • list: фильтры product_id, product_version, status, пагинация
  • TC-WH-09: RecipeItemService — CRUD строк рецепта

    • addItem: валидация ingredient exists (HTTP → Catalog), circular reference check
    • updateItem: partial update
    • deleteItem
    • Circular reference: рекурсивно проверить что dish-ингредиент не ссылается обратно на текущий product
  • TC-WH-10: CostCalculationService — расчёт себестоимости

    • calculateCost(techCardId): разворачивает полуфабрикаты до сырья
    • Рекурсивный обход: если ingredient_product_id → dish с техкартой → развернуть
    • average_cost per ingredient (на MVP: заглушка, реальные цены — при реализации складских операций)
    • Возвращает items + total_cost + warnings (если цена неизвестна)
  • TC-WH-11: UnitConversionService — CRUD конвертаций

    • CRUD + unique check
  • TC-WH-12: CatalogServiceClient — HTTP клиент к Catalog Service

    • getProductById(productId): name, type, version
    • searchProducts(type, search): для поиска ингредиентов
    • getModifierOptions(groupId, version): для per-size names

Controller

  • TC-WH-13: TechCardController

    • GET /tech-cards — список с фильтрами
    • GET /tech-cards/{id} — детали с items
    • POST /tech-cards — создание
    • PATCH /tech-cards/{id} — обновление
    • DELETE /tech-cards/{id} — удаление
  • TC-WH-14: RecipeItemController

    • POST /tech-cards/{id}/items — добавить ингредиент
    • PATCH /tech-cards/{id}/items/{itemId} — обновить
    • DELETE /tech-cards/{id}/items/{itemId} — удалить
  • TC-WH-15: CostController

    • GET /tech-cards/{id}/cost — расчёт себестоимости
  • TC-WH-16: UnitConversionController

    • GET /unit-conversions — список
    • POST /unit-conversions — создание
    • PATCH /unit-conversions/{id} — обновление

Events

  • TC-WH-17: Публикация warehouse.tech-card.updated
    • При создании/обновлении/удалении техкарты
    • Kafka producer config

Ссылки