AAYMA
RU
Войти

Контур закупок

Сервис для закупщика Электрокомплекта: по продажам и остаткам прогнозирует спрос и рекомендует заказы поставщикам.

Рабочий MVP
Команда «Луксмаксеры» 10💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Луксмаксеры
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Рабочий MVP

Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером

Суть

Сервис для закупщика Электрокомплекта: по продажам и остаткам прогнозирует спрос и рекомендует заказы поставщикам. Менеджер корректирует количество с указанием причины, утверждает заказ и выгружает CSV.

Как устроено

Генератор синтетики (120 SKU, 2 склада, 8 поставщиков, 24 месяца, seed=42) и CSV-контракт из 9 файлов подают данные в пайплайн: валидация, очистка продаж, оценка скрытого спроса при stockout. Прогноз статистический, без ML и LLM: сезонный профиль SKU или категории, ограниченный тренд, дневная проекция запаса. Размер заказа учитывает свободный остаток, поставки в пути, срок поставщика, период пересмотра, резерв, MOQ и кратность. Расчёты, заказы и аудит хранятся в SQLite, React-интерфейс показывает формулу и календарь остатка.

Ключевые решения

  • сезонный профиль спроса
  • ограниченный тренд
  • оценка спроса при stockout
  • очистка выбросов клиентских событий
  • MOQ и кратность
  • проекция запаса
  • синтетический генератор данных

Особенности

Скрытый спрос и scenario_type синтетики хранятся отдельно и расчётному ядру недоступны, чтобы не было утечки ответа. Для каждого расчёта сохраняется неизменяемый CSV-снимок входов, утверждённый заказ заблокирован от правок, одновременные правки ловит проверка версии. Дефицит до прихода новой поставки выделен отдельно как неустранимый обычным заказом.

Стек

Python · FastAPI · React · TypeScript · Vite · SQLite · PowerShell


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-95b86b43-team.

README

README.md

Контур закупок · HACKALEM AI

Демонстрационный сервис для закупщика ТОО «Электрокомплект»: продажи и остатки → объяснимый прогноз → рекомендации по поставщикам → корректировка менеджером → утверждённый CSV. Автоматической отправки поставщику нет.

Запуск

Windows: нужен стандартный CPython 3.11+ и Node.js 22+. Из корня проекта:

.\setup.ps1
.\start.ps1

setup.ps1 устанавливает зависимости и собирает интерфейс. Если всё уже установлено, нужен только start.ps1. Открыть http://127.0.0.1:8000/. Backend отдаёт собранный React-интерфейс: отдельный frontend-сервер для демо не нужен.

Скрипт выбирает рабочее окружение .venv или .venv-win. Если PowerShell запрещает выполнение скриптов, можно выполнить команды вручную:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -c requirements-dev.lock.txt -e ".[dev]"
npm.cmd --prefix frontend ci
npm.cmd --prefix frontend run build
.\.venv\Scripts\python.exe -m backend.run

На этой машине также доступно .venv-win\Scripts\python.exe. Не используйте MSYS2 Python: его платформенные пакеты несовместимы с обычными Windows wheels. Дождитесь успешного завершения pip; отменённая установка не создаёт готовое окружение.

Повторный запуск обнаруживает работающий API и не создаёт вторую копию. Если порт занят чужим сервисом: .\start.ps1 -Port 8001. Остановка — Ctrl+C. После изменения backend-кода остановите старый процесс и запустите заново. После изменения frontend выполните npm.cmd --prefix frontend run build.

Linux/macOS: обычный venv, pip install -e '.[dev]', npm --prefix frontend ci, npm --prefix frontend run build, python -m backend.run.

Что демонстрировать

  1. Открыть обзор: активный набор явно подписан как синтетический.
  2. Выбрать склад/категорию и выполнить расчёт. Первый запуск подготавливает историю; прогресс отображается. Следующие сценарии используют кеш подготовки.
  3. Просмотреть рекомендации по поставщику и раскрыть SKU: история, сезонность, тренд, stockout, клиентские события, формула и календарь остатка.
  4. Изменить настройки коррекций и сравнить количество с предыдущим сценарием.
  5. Создать черновик для поставщика, скорректировать количество с причиной, утвердить и скачать CSV.
  6. Во вкладке данных можно проверить источник, скачать 9 CSV и импортировать другой набор того же контракта.

Полный сценарий на 4 минуты: docs/DEMO.md. Проверка MUST HAVE: docs/ACCEPTANCE.md.

Данные и алгоритм

По умолчанию: 120 SKU, 2 склада, 6 категорий, 8 поставщиков, 300 обезличенных клиентов, 24 месяца (2024-09-01…2026-08-31), 72 370 строк продаж при seed=42. Все уровни, профили и клиенты вымышлены; они не являются сведениями о бизнесе партнёра.

.\.venv\Scripts\python.exe -m backend.generate_synthetic --output data/synthetic --seed 42
.\.venv\Scripts\python.exe -m backend.validate_data --input data/synthetic --as-of-date 2026-09-01 --history-start 2024-09-01 --history-end 2026-08-31
.\.venv\Scripts\python.exe -m backend.preprocess_sales --input data/synthetic --output data/preprocessed

Первый запуск API создаёт стандартную синтетику, если её ещё нет. Скрытый спрос и scenario_type находятся отдельно и не читаются расчётным ядром. Реальные Excel в IEK/ и Systeme electric/ сохранены: прямые адаптеры сложных партнёрских Excel пока не реализованы. Реальные данные подключаются через согласованный CSV-контракт; отсутствующие поля нельзя подменять выдуманными значениями.

Метод статистический, без ML/LLM-сервисов: причинная очистка клиентских событий, оценка спроса при отсутствии, сезонный профиль SKU/категории, ограниченный устойчивый тренд, дневной прогноз и проекция запаса. Количество учитывает свободный остаток, даты и неполученную часть поставок, срок поставщика, период пересмотра, резерв, MOQ и кратность.

Расчёт отмечает дефицит до даты новой поставки: обычный заказ уже не может устранить эту часть потерь. Большая регулярная покупка сохраняется; неоднозначный выброс помечается для проверки. Параметры и числовые шаги доступны в карточке.

Проверки

.\.venv\Scripts\python.exe -m pytest -q
npm.cmd --prefix frontend run build

Тесты используют отдельные .test-runs/run-*, чтобы не конфликтовать с правами старого Windows TEMP. Каталоги исключены из Git. /health проверяет доступность API; /docs содержит его актуальный контракт.

Хранение и границы демо

  • data/runtime/workspace.sqlite3 — набор данных, результаты расчётов, заказы и аудит.
  • data/runtime/runs/ — неизменяемые CSV-снимки входов каждого расчёта.
  • data/synthetic/, data/preprocessed/, data/runtime/ — локальные генерируемые данные, исключены из Git.
  • Утверждённый заказ не редактируется. Проверка версии защищает от одновременных правок. CSV содержит утверждённые количества, UTF-8 BOM и стабильные коды товаров/складов/поставщиков.
  • Демонстрация предназначена для localhost и одного локального рабочего пространства. Полноценной аутентификации и промышленного развёртывания нет.
  • Совместимость CSV с конкретной обработкой загрузки 1С требует согласования шаблона. При открытии CSV в Excel задавайте артикулу тип «текст», чтобы сохранить ведущие нули.
  • Страховой запас в днях — явная политика, не обещание уровня сервиса; оценки спроса не являются гарантией будущих продаж.

Документация

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
20
Авторы
3
Файлы
87
Ветки
10

Авторы коммитов

Твоё имя 13pawa-pava 5mynbaev1989-cell 3

История коммитов

  • 2026-09-23 16:57finalmynbaev1989-cell
  • 2026-09-23 16:54фаыавpawa-pava
  • 2026-09-23 16:51фыффыфmynbaev1989-cell
  • 2026-09-23 16:51Create README.mdТвоё имя
  • 2026-09-23 16:5012Твоё имя
  • 2026-09-23 16:39fpawa-pava
  • 2026-09-23 16:381424Твоё имя
  • 2026-09-23 16:341Твоё имя
Все коммиты (20)
  • 2026-09-23 16:1112Твоё имя
  • 2026-09-23 16:07Add PostgreSQL import storage and frozen datasetspawa-pava
  • 2026-09-23 16:00123Твоё имя
  • 2026-09-23 15:53Merge branch 'dastan-2'Твоё имя
  • 2026-09-23 15:49Create app.dbТвоё имя
  • 2026-09-23 15:42фыфmynbaev1989-cell
  • 2026-09-23 15:40Update replenishment.pyТвоё имя
  • 2026-09-23 15:36Merge branch '123' into Nurbol-2Твоё имя
  • 2026-09-23 15:321Твоё имя
  • 2026-09-23 15:27backend: add import profiling, forecasting & CLIpawa-pava
  • 2026-09-23 15:171Твоё имя
  • 2026-09-23 14:27Scaffold project architecture and docspawa-pava
Структура репозитория (87 файлов)
.gitignore
README.md
backend/README.md
backend/__init__.py
backend/app/api/runtime_api.py
backend/app/core/store.py
backend/app/engine/contracts.py
backend/app/engine/forecast.py
backend/app/engine/outliers.py
backend/app/engine/preprocessing/__init__.py
backend/app/engine/preprocessing/aggregation.py
backend/app/engine/preprocessing/models.py
backend/app/engine/preprocessing/report.py
backend/app/engine/preprocessing/sales_cleaning.py
backend/app/engine/replenishment.py
backend/app/engine/stockouts.py
backend/app/main.py
backend/app/modules/calculations/local_service.py
backend/app/modules/imports/csv_loader.py
backend/app/modules/imports/schemas.py
backend/app/modules/imports/validation.py
backend/generate_synthetic.py
backend/main.py
backend/preprocess_sales.py
backend/run.py
backend/synthetic/__init__.py
backend/synthetic/demand.py
backend/synthetic/generator.py
backend/validate_data.py
data/README.md
data/samples/minimal/categories.csv
data/samples/minimal/inbound.csv
data/samples/minimal/inventory.csv
data/samples/minimal/product_suppliers.csv
data/samples/minimal/products.csv
data/samples/minimal/sales.csv
data/samples/minimal/stockouts.csv
data/samples/minimal/suppliers.csv
data/samples/minimal/warehouses.csv
docs/ACCEPTANCE.md
docs/API_CONTRACT.md
docs/ARCHITECTURE.md
docs/DEMO.md
docs/RELEASE_CHECK.md
docs/SYNTHETIC_DATA.md
docs/TESTING.md
docs/data-contract.md
docs/forecasting.md
docs/preprocessing.md
frontend/README.md
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/public/favicon.svg
frontend/src/app/App.tsx
frontend/src/main.tsx
frontend/src/pages/CalculationPage.tsx
frontend/src/pages/DataPage.tsx
frontend/src/pages/OrdersPage.tsx
frontend/src/pages/ProductPage.tsx
frontend/src/pages/RecommendationsPage.tsx
frontend/src/shared/api/client.ts
frontend/src/shared/types/index.ts
frontend/src/shared/ui/Charts.tsx
frontend/src/shared/ui/index.tsx
frontend/src/styles.css
frontend/tsconfig.json
frontend/vite.config.ts
pyproject.toml
requirements-dev.lock.txt
setup.ps1
start.ps1
tests/__init__.py
tests/conftest.py
tests/helpers.py
tests/test_cli.py
tests/test_forecast_replenishment.py
tests/test_health.py
tests/test_ingestion.py
tests/test_preprocessing.py
tests/test_preprocessing_cli.py
tests/test_preprocessing_synthetic.py
tests/test_run.py
tests/test_runtime_api.py
tests/test_store.py
tests/test_synthetic.py
tests/test_validation.py
Ветки (10)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.