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