Kompletní řešení pro správu skladových rolí materiálu s mobilní aplikací a REST API backendem.
Systém umožňuje:
- Příjem rolí - naskenování EAN kódu, vyplnění údajů, umístění na kolejnici
- Přesuny - rychlé přemístění role mezi kolejnicemi
- Odebrání - označení role jako odebrané ze skladu
- Vyhledávání - fulltext podle EAN, názvu, filtry
- Historie - kompletní auditní stopa všech pohybů
- Vizuální mapa - grafický přehled kolejnic a obsazenosti
- Export - CSV snapshot + NDJSON event stream pro integraci
warehouse-wms/
├── backend/ # Node.js + Express + PostgreSQL + Prisma
│ ├── src/
│ │ ├── index.ts
│ │ └── routes/ # API endpointy
│ ├── prisma/
│ │ └── schema.prisma
│ └── docker-compose.yml
│
└── mobile/ # React Native (Expo) aplikace
├── App.tsx
├── screens/ # UI obrazovky
├── services/ # API klient
└── contexts/ # Auth context
Backend:
- Node.js 20+ + TypeScript
- Express - REST API framework
- Prisma - ORM
- PostgreSQL 16 - relační databáze
- Docker - kontejnerizace
Mobile:
- React Native + Expo
- TypeScript
- React Navigation
- Expo Camera - skenování EAN
- AsyncStorage - lokální persistence
- Node.js 18+
- Docker & Docker Compose
- npm nebo yarn
- Expo CLI (pro mobile)
cd backend
# Instalace závislostí
npm install
# Vytvoření .env souboru
cp .env.example .env
# Spuštění PostgreSQL
docker-compose up -d
# Migrace databáze
npm run prisma:migrate
# Seed testovacích dat
npx tsx prisma/seed.ts
# Spuštění serveru
npm run devBackend běží na http://localhost:3000
cd mobile
# Instalace závislostí
npm install
# Vytvoření .env souboru
cp .env.example .env
# Úprava API_URL v .env (použijte lokální IP, ne localhost)
# Např: API_URL=http://192.168.1.100:3000/api
# Spuštění aplikace
npm startPoté stiskněte i (iOS) nebo a (Android) nebo naskenujte QR kód v Expo Go.
- Grafická mřížka všech kolejnic (5x8)
- Barevné odlišení: prázdná (zelená), obsazená (oranžová)
- Tap na kolejnici → detail s rolemi
- Kamera s automatickým rozpoznáním čárových kódů
- Pokud role existuje → zobrazí detail
- Pokud role neexistuje → nabídne příjem
- Fulltext podle EAN nebo názvu materiálu
- Filtry: Aktivní / Odebrané / Vše
- Zobrazení aktuální pozice role
- Kompletní informace (EAN, rozměry, gramáž, dodavatel, šarže)
- Aktuální umístění na kolejnici
- Historie pohybů (timeline)
- Operace: Přesunout / Odebrat
- Formulář s údaji o roli
- Vizuální výběr kolejnice z mapy
- Okamžitý sync
- Výběr cílové kolejnice z grafické mapy
- Validace (nelze přesunout odstraněnou roli)
- Historie aktualizována okamžitě
POST /api/users/register # Registrace zařízení/uživatele
GET /api/users/me # Získání info o uživateli
GET /api/rails # Seznam všech kolejnic
GET /api/rails/:code # Detail kolejnice
GET /api/rails/:code/inventory # Role na kolejnici
GET /api/rolls # Vyhledávání (query, status, railCode)
GET /api/rolls/:id # Detail + historie pohybů
POST /api/rolls/receive # Příjem nové role
POST /api/rolls/:id/move # Přesun role
POST /api/rolls/:id/remove # Odebrání role
GET /api/export/snapshot.csv # CSV export aktuálního stavu
GET /api/export/events.ndjson # NDJSON event stream
Warehouse - Sklad
- id, name, zones[]
Rail - Kolejnice
- id, code (R-001), name
- rowIndex, colIndex, posIndex (pozice v mřížce)
- x, y, width, height (geometrie pro mapu)
- isActive
Roll - Role materiálu
- id, ean (unique)
- materialName, description
- widthMm, grammageGm2, color
- supplier, batchNo
- status (active, removed)
Location - Aktuální umístění
- rollId (PK, 1:1)
- railId (nullable při removed)
- placedAt, lastMovedAt
Movement - Historie pohybů (append-only)
- id, type (RECEIVE, MOVE, REMOVE)
- rollId, fromRailId, toRailId
- at (timestamp)
- userId, deviceId
- attributes (JSON pro rozšíření)
User - Uživatel/zařízení
- id, name, role, deviceId (unique)
Kompletní snapshot inventáře:
roll_id,ean,material_name,width_mm,grammage_gm2,status,rail_code,last_moved_at
123,8595000001,Papír lesklý,1200,80,active,R-012,2025-11-23T10:15:00ZAppend-only event log pro replikaci:
{"event_id":"e-001","event_type":"ROLL_RECEIVED","occurred_at":"2025-11-23T08:15:00Z","payload":{"roll_id":"123","ean":"859...","to_rail_code":"R-012"}}
{"event_id":"e-002","event_type":"ROLL_MOVED","occurred_at":"2025-11-23T09:05:00Z","payload":{"roll_id":"123","from_rail_code":"R-012","to_rail_code":"R-020"}}Stejné event schéma lze později použít pro:
- REST webhooky
- Message queue (RabbitMQ, Kafka)
- Real-time WebSocket stream
- Všechny operace běží v DB transakcích
- Kontrola stavů před změnou
- Optimistické zámky (budoucí)
- Nelze přesunout odstraněnou roli
- Varování při přesunu na již plnou kolejnici (soft limit)
- Kontrola existence EAN při příjmu
- DeviceId + timestamp = idempotency key
- Prevence duplicitních zápisů
- Offline režim v mobile (SQLite + sync queue)
- QR kódy na kolejnicích (přímé skenování pozice)
- Role a oprávnění (worker/supervisor/admin)
- Kapacitní limity na kolejnicích (hard constraints)
- REST webhooky (subscription na eventy)
- Message queue publikování
- Read-only API do ERP (obohacení dat)
- Telemetrie a error tracking
- Batch operace (přesun více rolí)
- Foto rolí
- Tisk štítků
- Heatmapa obsazenosti
- Kapacitní planning
cd backend
# Spuštění testů (budoucí)
npm test
# Prisma Studio (prohlížení DB)
npm run prisma:studioTestování na fyzickém zařízení s Expo Go:
- Nainstalovat Expo Go z App Store/Google Play
- Spustit
npm startv mobile/ - Naskenovat QR kód
- Ujistit se, že API_URL používá lokální IP (ne localhost)
curl -X POST http://localhost:3000/api/rolls/receive \
-H "Content-Type: application/json" \
-d '{
"ean": "8595000000001",
"materialName": "Papír lesklý",
"widthMm": 1200,
"grammageGm2": 80,
"toRailCode": "R-001",
"userId": "user-123",
"deviceId": "device-001"
}'curl -X POST http://localhost:3000/api/rolls/{rollId}/move \
-H "Content-Type: application/json" \
-d '{
"toRailCode": "R-020",
"userId": "user-123",
"deviceId": "device-001"
}'curl "http://localhost:3000/api/rolls?query=papír&status=active"# Build backend image
cd backend
docker build -t warehouse-wms-backend .
# Run with docker-compose
docker-compose up -dPro production použít orchestraci (Kubernetes, Docker Swarm) nebo PaaS (Heroku, Railway, Fly.io).
- Backend README - API dokumentace, setup
- Mobile README - Aplikace, screens, funkcionalita
- Prisma schema:
backend/prisma/schema.prisma
- Fork repository
- Vytvořit feature branch (
git checkout -b feature/amazing-feature) - Commit změny (
git commit -m 'Add amazing feature') - Push do branch (
git push origin feature/amazing-feature) - Otevřít Pull Request
MIT
Vytvořeno pro správu skladových rolí materiálu s důrazem na jednoduchost, rychlost a škálovatelnost.