AAYMA
RU
Войти

Закупки ekt.kz — AI-планировщик закупок

Сервис загружает по 6 отчётов 1С на поставщика (Systeme Electric, IEK), считает рекомендуемый заказ по каждому SKU с обоснованием и срочностью, даёт…

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

О проекте

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

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

Суть

Сервис загружает по 6 отчётов 1С на поставщика (Systeme Electric, IEK), считает рекомендуемый заказ по каждому SKU с обоснованием и срочностью, даёт менеджеру поправить и утвердить заказ с выгрузкой в Excel.

Как устроено

Kotlin/Spring Boot backend парсит Excel-отчёты (динамика продаж, продажи и остатки, товар в пути, сезонность, кратность), детектор аномалий очищает спрос от разовых крупных продаж. Прогноз спроса на горизонт «срок поставки + период между заказами» с сезонным коэффициентом, трендом и страховым запасом, минус остаток и товар в пути, округление до кратности упаковки. React-фронт показывает план по поставщикам, карточку с пошаговым обоснованием и экспорт утверждённого заказа в .xlsx.

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

  • детектор аномальных продаж
  • сезонный коэффициент
  • тренд
  • страховой запас
  • lead time + review period
  • округление по кратности

Особенности

Один из немногих бэкендов на Kotlin/Spring Boot, с обширными юнит-тестами парсеров и расчёта на XML-фикстурах отчётов; фронт работает на MSW-моках независимо от бэкенда.

Стек

Kotlin · Spring Boot · Java 21 · Gradle · React 19 · TypeScript · Vite · TanStack Query · nginx · Docker Compose · Python (прототип)


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

README

README.md

Трек · 05 Логистика

Автоматический расчет заказов поставщикам для пополнения склада

Наша платформа не просто помогает формировать заказ, а сама сообщает о том, что необходимо отправить заявку.

Интегрируясь с 1С(или любой другой CRM) она всегда имеет доступ к актуальным данным, что поможет быстро реагировать на разовые крупные продажи и оперативно пополнять запасы на складах.

Система учитывает: динамику продаж, тенденции, сроки поставок, цены поставщиков, объем складов, наличие на складах, товары в пути и юнит экономику.

Каждая крупная продажа высвечивается у менеджера, и он решает учитывать ли её для будущих расчетов, на случай если он знает что подобные заказы будут стабильными.

А когда товары на исходе, система выбирает поставщика, исходя из цены, сроки их доставки и прогнозируемом убытке, для того чтобы выбрать наиболее выгодный вариант исходя из большого количества данных

Сущности(свойства):

  • Поставщик товаров(Название поставщика, реквизиты, срок поставки товаров, дни заявок(если есть определенные), минимальная сумма заказа)
  • Товары(Наименование, Поставщик(список, на случай если один и тот же товар у нескольких поставщиков), Код(возможно несколько в зависимости от поставщика), цена закупки(возможно несколько в зависимости от поставщика), цена продажи, Количество на складе(список в зависимости от количества складов), количество в пути на склад(список в зависимости от количества складов))
  • Склады(Общий объем, свободный объем)

Закупки ekt.kz — AI-планировщик закупок

Загрузите выгрузки из 1С — получите готовый заказ поставщику с обоснованием по каждой позиции.

Сервис сам считает, что и сколько дозаказать по каждому SKU: очищает спрос от разовых всплесков, учитывает сезонность, тренд, товар в пути, страховой запас и кратность упаковки — и объясняет каждую строку. Менеджеру остаётся проверить, поправить и выгрузить заказ в Excel.

План заказа

Загрузка выгрузок 1СОбоснование по позиции
Загрузка данныхКарточка позиции

Зачем это

Закупщик вручную сводит десяток отчётов по каждому поставщику, чтобы понять, что заканчивается. Это долго и субъективно. Наш сервис:

  • считает заказ автоматически — прогноз спроса на горизонт «срок поставки + период между заказами», минус остаток и товар в пути, с округлением до кратности упаковки;
  • объясняет каждую цифру — очищенный спрос, сезонный коэффициент, тренд, страховой запас — видно, почему рекомендовано именно столько;
  • подсвечивает срочное — позиции, которые вот-вот закончатся, отмечаются приоритетом;
  • держит менеджера у руля — разовые крупные продажи можно исключить из спроса, любое количество — поправить с указанием причины;
  • отдаёт результат в 1С — утверждённый заказ выгружается в Excel-файл.

Работает с двумя поставщиками — Systeme Electric и IEK. Можно загрузить одного или обоих.

Быстрый старт (Docker)

Нужен только Docker с плагином Compose. Из корня репозитория:

docker compose up --build

Откройте http://localhost:8081 — фронтенд и backend поднимаются вместе, /api/* проксируется на backend автоматически.

СервисЧто этоАдрес
frontendReact + Vite за nginxhttp://localhost:8081
backendSpring Boot, разбор Excel и расчёт заказовhttp://localhost:8080

Остановить: docker compose down.

Как это работает

  1. Загрузка — перетащите отчёты (по 6 на поставщика: динамика продаж, ежемесячные продажи и остатки, товар в пути, сезонность, кратность). Поставщик и тип определяются по имени файла; можно грузить одного поставщика или обоих.
  2. План заказа — сервис показывает рекомендованный заказ: сводка, вкладки по поставщикам, фильтр срочности, поиск. Клик по строке открывает карточку с пошаговым обоснованием.
  3. Утверждение — правите количества при необходимости и нажимаете «Утвердить» → скачивается Excel-файл заказа для 1С.

Как устроено

СлойТехнологии
FrontendReact 19, TypeScript, Vite, TanStack Query
BackendSpring Boot + Kotlin, Java 21, Gradle
ОбменREST + multipart/form-data, данные хранятся в памяти backend

Запуск без Docker

Backend (нужен JDK 21, Gradle не требуется — wrapper в проекте):

./gradlew bootRun      # http://localhost:8080

Frontend (нужен Node.js 20+):

cd frontend
npm install
npm run dev            # http://localhost:5173, работает на моках

Фронтенд по умолчанию работает на моках (бэкенд не нужен). Чтобы ходить в настоящий backend: VITE_USE_MOCKS=false BACKEND_URL=http://localhost:8080 npm run dev.

API

ЗапросНазначение
POST /api/excelЗагрузка отчётов (multipart/form-data, поля iekMoq, systemeSalesDynamics, …). Поставщик — все 6 отчётов либо ни одного; хотя бы один обязателен. Возвращает счётчики записей и замечания к ячейкам.
GET /api/ordersРекомендованный заказ по последней загрузке. Обязательные leadDays и reviewDays; опционально historyMonths, forecastGrowthPercent, supplierId, category.

Подробности: контракт расчёта, формулы и ограничения — в docs/order_calculation.md; типизированные модели Excel — в docs/excel_models.md; экраны и сценарии фронтенда — в frontend/README.md.

Что в репозитории

ПутьЧто это
frontend/Веб-интерфейс: загрузка, план заказа, карточка позиции, утверждение
src/main/kotlin/REST endpoints, Excel-парсеры, DTO, расчёт рекомендаций
src/test/kotlin/Тесты загрузки, разбора и расчёта
docs/Дизайн решения, контракт расчёта, модели данных
design/Макеты экранов

Команда

  • Nagmetulla Temirlan
  • Orynbassar Onggar
  • Gabit Bolatkhan

Hackathon team repository for VT2k15.

Звёзды
⭐ 2
Форки
0
Язык
Kotlin
Последний push
в прошлом месяце
Коммиты
44
Авторы
6
Файлы
113
Ветки
5

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

Nagmetulla Temirlan 22Onggar Orynbassar 10Bolatkhan 5Bolatkhan 4Temirlan Nagmetulla 4Onggar Orynbassar 1

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

  • 2026-09-23 18:03Update README.mdBolatkhan
  • 2026-09-23 18:02docs: keep the selling README on top (drop duplicated preamble from merge)Nagmetulla Temirlan
  • 2026-09-23 18:01Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
  • 2026-09-23 18:01docs(frontend): refresh screenshots to current UINagmetulla Temirlan
  • 2026-09-23 18:00Update README.mdBolatkhan
  • 2026-09-23 17:59Update README.mdBolatkhan
  • 2026-09-23 17:56Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
  • 2026-09-23 17:55feat(frontend): approve exports order to Excel (.xlsx); README as product pitchNagmetulla Temirlan
Все коммиты (44)
  • 2026-09-23 17:50Update README.mdBolatkhan
  • 2026-09-23 17:48Merge remote-tracking branch 'origin/main'Onggar Orynbassar
  • 2026-09-23 17:48feat add anomaly detectorOnggar Orynbassar
  • 2026-09-23 17:46Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
  • 2026-09-23 17:46feat(frontend): connect order plan to real backend GET /api/ordersNagmetulla Temirlan
  • 2026-09-23 17:43Update README.mdBolatkhan
  • 2026-09-23 17:41fix(docker): publish frontend on :8081 to avoid clash with vite dev (5173); nginx listen IPv6Nagmetulla Temirlan
  • 2026-09-23 17:41Merge remote-tracking branch 'origin/main'Nagmetulla Temirlan
  • 2026-09-23 17:39feat addOnggar Orynbassar
  • 2026-09-23 17:38feat: connect frontend upload to real backend + Docker ComposeNagmetulla Temirlan
  • 2026-09-23 17:12Merge remote-tracking branch 'origin/main' into front/optional-supplier-dockerNagmetulla Temirlan
  • 2026-09-23 17:09feat: now optional fieldOnggar Orynbassar
  • 2026-09-23 17:02Merge remote-tracking branch 'origin/main' into front/optional-supplier-dockerNagmetulla Temirlan
  • 2026-09-23 17:02feat(frontend): optional single-supplier upload (all-or-nothing per supplier)Nagmetulla Temirlan
  • 2026-09-23 16:56feat: add backendOnggar Orynbassar
  • 2026-09-23 16:49add IDEA.mdBolatkhan
  • 2026-09-23 16:46Merge pull request #4 from BAITC-Hacks/front/two-suppliersTemirlan Nagmetulla
  • 2026-09-23 16:45Merge remote-tracking branch 'origin/main' into front/two-suppliersNagmetulla Temirlan
  • 2026-09-23 16:36docs: readme под приложениеOnggar Orynbassar
  • 2026-09-23 16:17Merge pull request #3 from BAITC-Hacks/front/mock-uiTemirlan Nagmetulla
  • 2026-09-23 16:00Merge pull request #2 from BAITC-Hacks/front/mock-uiTemirlan Nagmetulla
  • 2026-09-23 15:53fix_readmeBolatkhan
  • 2026-09-23 15:36docs: add front contractOnggar Orynbassar
  • 2026-09-23 14:35Merge pull request #1 from BAITC-Hacks/systemelectricTemirlan Nagmetulla
  • 2026-09-23 14:19docs: add docsOnggar Orynbassar
  • 2026-09-23 14:04Add Bolatkhan.md fileBolatkhan
  • 2026-09-23 14:02docs: heartbeat Stayin' AliveOnggar Orynbassar
  • 2026-09-23 13:06docs: testOnggar Orynbassar
  • 2026-09-23 12:58add team memberBolatkhan
  • 2026-09-23 12:23docs: Add Onggar to README.md and setup gitignoreOnggar Orynbassar
  • 2026-09-23 12:00docs: add team memberNagmetulla Temirlan
  • 2026-09-23 16:32feat(frontend): upload 12 reports for two suppliersNagmetulla Temirlan
  • 2026-09-23 16:01docs: remove links to live design docsNagmetulla Temirlan
  • 2026-09-23 15:59feat(frontend): data upload screen and README with screenshotsNagmetulla Temirlan
  • 2026-09-23 15:44feat(frontend): order plan UI on mock dataNagmetulla Temirlan
  • 2026-09-23 14:33docs: SystemElectric procurement planner design and prototypeNagmetulla Temirlan
Структура репозитория (113 файлов)
.dockerignore
.gitattributes
.gitignore
Dockerfile
IDEA.md
README.md
build.gradle.kts
design/Main.dc.html
design/Risks.dc.html
design/Settings.dc.html
design/Sku.dc.html
design/canvas.json
docker-compose.yml
docs/data_dictionary.md
docs/design.md
docs/excel_models.md
docs/front data.txt
docs/iek_fields.json
docs/iek_fields.md
docs/mvp_backend.md
docs/order_calculation.md
docs/systeme_fields.json
docs/systeme_fields.md
frontend/.dockerignore
frontend/.env.example
frontend/.gitignore
frontend/.oxlintrc.json
frontend/Dockerfile
frontend/README.md
frontend/docs/screenshots/error.png
frontend/docs/screenshots/import-attach.png
frontend/docs/screenshots/import-empty.png
frontend/docs/screenshots/import-mobile.png
frontend/docs/screenshots/import-partial.png
frontend/docs/screenshots/import-result.png
frontend/docs/screenshots/item.png
frontend/docs/screenshots/plan.png
frontend/index.html
frontend/nginx.conf
frontend/package-lock.json
frontend/package.json
frontend/public/favicon.svg
frontend/public/mockServiceWorker.js
frontend/src/App.tsx
frontend/src/api/client.ts
frontend/src/api/reports.ts
frontend/src/api/types.ts
frontend/src/components/ApproveDialog.tsx
frontend/src/components/ItemDrawer.tsx
frontend/src/components/OrderTable.tsx
frontend/src/components/Sidebar.tsx
frontend/src/components/States.tsx
frontend/src/exportCsv.ts
frontend/src/format.ts
frontend/src/main.tsx
frontend/src/mocks/browser.ts
frontend/src/mocks/handlers.ts
frontend/src/mocks/orders.json
frontend/src/pages/ImportPage.tsx
frontend/src/pages/PlanPage.tsx
frontend/src/styles.css
frontend/tsconfig.app.json
frontend/tsconfig.json
frontend/tsconfig.node.json
frontend/vite.config.ts
gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
gradlew
gradlew.bat
prototype/order_prototype.py
prototype/requirements.txt
settings.gradle.kts
src/main/kotlin/kz/hackalem/backend/BackendApplication.kt
src/main/kotlin/kz/hackalem/backend/DemandForecastEngine.kt
src/main/kotlin/kz/hackalem/backend/ExcelFileStore.kt
src/main/kotlin/kz/hackalem/backend/ExcelReader.kt
src/main/kotlin/kz/hackalem/backend/ExcelUploadController.kt
src/main/kotlin/kz/hackalem/backend/IekData.kt
src/main/kotlin/kz/hackalem/backend/IekExcelParser.kt
src/main/kotlin/kz/hackalem/backend/IekOrderSource.kt
src/main/kotlin/kz/hackalem/backend/OrderPlanningController.kt
src/main/kotlin/kz/hackalem/backend/OrderPlanningData.kt
src/main/kotlin/kz/hackalem/backend/OrderPlanningService.kt
src/main/kotlin/kz/hackalem/backend/SaleAnomalyDetector.kt
src/main/kotlin/kz/hackalem/backend/SystemeData.kt
src/main/kotlin/kz/hackalem/backend/SystemeExcelParser.kt
src/main/kotlin/kz/hackalem/backend/SystemeOrderSource.kt
src/main/resources/application.properties
src/test/kotlin/kz/hackalem/backend/DemandForecastEngineTests.kt
src/test/kotlin/kz/hackalem/backend/ExcelFixtures.kt
src/test/kotlin/kz/hackalem/backend/ExcelReaderTests.kt
src/test/kotlin/kz/hackalem/backend/ExcelUploadTests.kt
src/test/kotlin/kz/hackalem/backend/IekExcelParserTests.kt
src/test/kotlin/kz/hackalem/backend/IekOrderSourceTests.kt
src/test/kotlin/kz/hackalem/backend/OrderPlanningControllerTests.kt
src/test/kotlin/kz/hackalem/backend/OrderPlanningServiceTests.kt
src/test/kotlin/kz/hackalem/backend/SaleAnomalyDetectorTests.kt
src/test/kotlin/kz/hackalem/backend/SourceWorkbooksTests.kt
src/test/kotlin/kz/hackalem/backend/SystemeExcelParserTests.kt
src/test/kotlin/kz/hackalem/backend/SystemeOrderSourceTests.kt
src/test/resources/excel/iekIncomingShipments.xml
src/test/resources/excel/iekMonthlySales.xml
src/test/resources/excel/iekMonthlyStocks.xml
src/test/resources/excel/iekMoq.xml
src/test/resources/excel/iekSalesDynamics.xml
src/test/resources/excel/iekSeasonality.xml
src/test/resources/excel/systemeIncomingShipments.xml
src/test/resources/excel/systemeMonthlySales.xml
src/test/resources/excel/systemeMonthlyStocks.xml
src/test/resources/excel/systemeMoq.xml
src/test/resources/excel/systemeSalesDynamics.xml
src/test/resources/excel/systemeSeasonality.xml
task spec/HackAlem AI_ Автоматизация формирования заказов поставщикам.docx.pdf
Ветки (5)

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

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

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