Контур закупок
Сервис для закупщика Электрокомплекта: по продажам и остаткам прогнозирует спрос и рекомендует заказы поставщикам.
О проекте
Команда: Луксмаксеры
Кейс 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.
Что демонстрировать
- Открыть обзор: активный набор явно подписан как синтетический.
- Выбрать склад/категорию и выполнить расчёт. Первый запуск подготавливает историю; прогресс отображается. Следующие сценарии используют кеш подготовки.
- Просмотреть рекомендации по поставщику и раскрыть SKU: история, сезонность, тренд, stockout, клиентские события, формула и календарь остатка.
- Изменить настройки коррекций и сравнить количество с предыдущим сценарием.
- Создать черновик для поставщика, скорректировать количество с причиной, утвердить и скачать CSV.
- Во вкладке данных можно проверить источник, скачать 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 задавайте артикулу тип «текст», чтобы сохранить ведущие нули.
- Страховой запас в днях — явная политика, не обещание уровня сервиса; оценки спроса не являются гарантией будущих продаж.
Документация
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.