System analizuje historię magazynu, przewiduje, czego i kiedy zabraknie, a sztuczna inteligencja co cykl przygotowuje czytelny raport z rekomendacjami — co warto uzupełnić i dlaczego.
Zamiast ręcznie przeglądać setki produktów, magazynier i kierownik dostają gotowe odpowiedzi.
Dla każdego produktu w każdym punkcie system liczy przewidywany stan i ostrzega, gdy grozi brak — z informacją za ile dni.
System proponuje ilość uzupełnienia, tak aby pokryć prognozowane zapotrzebowanie i nie przekroczyć pojemności punktu.
AI co cykl streszcza sytuację po polsku i wskazuje priorytety — które pozycje wymagają reakcji w pierwszej kolejności.
ProductForecast) zawiera: średnie dzienne zapotrzebowanie, trend, prognozę popytu w horyzoncie (domyślnie 14 dni), przewidywany stan, dni do wyczerpania, poziom ryzyka (None/Low/Medium/High), rekomendowany załadunek i sugerowane minimum. Wyniki są zapisywane per organizacja (multi-tenant) i udostępniane przez API.Cztery kroki. Każdy klocek robi jedną rzecz i przekazuje wynik dalej.
Wydania, załadunki, zwroty i aktualne stany — prosto z modułów ASD Forecast.
GetProductOperationsRequest) i DistributionPoints (GetDistributionPointsStockRequest) — przez wewnętrzne kontrakty modułowe.Prosta matematyka: średnia zużycia + trend + reguły progowe. Bez uczenia maszynowego.
ProductForecast per produkt/punkt.Bierze gotowe prognozy i tworzy raport: streszczenie + priorytety + rekomendacje.
Tabela prognoz, wykresy, rekomendacje i raporty AI w aplikacji ASD Forecast.
Aplikacja woła model w chmurze AWS przez Amazon Bedrock. Bezpiecznie, bez wysyłania danych do zewnętrznych firm — wszystko zostaje w infrastrukturze AWS klienta.
W prezentowanej konfiguracji używamy Gemma 3 12B IT (google.gemma-3-12b-it) w regionie eu-west-1: dobry kompromis jakości, szybkości i kosztu.
Raport zapisuje wykorzystane tokeny, a koszt wynika z prostego wzoru: input tokens × cena wejścia + output tokens × cena wyjścia. Model można zmienić z konfiguracji.
Ustrukturyzowana odpowiedź — nie luźny tekst:
kondycja zapasów w 3–4 zdaniach
jeden wskaźnik „na pierwszy rzut oka"
lista najważniejszych zagrożeń
akcja, uzasadnienie, pewność
AWSSDK.BedrockRuntime, metoda ConverseAsync (uniwersalna dla modeli).google.gemma-3-12b-it w eu-west-1; ustawiany przez forecasting:ai:bedrock:modelId.forecasting:ai:provider=Bedrock; model musi być włączony na koncie AWS i dostępny w wybranym regionie.AllowLocalFallback=false), żeby nie udawać AI wynikiem z reguł — błąd Bedrock daje status Failed i widoczny generationError.
// Odpowiedź AI (zapisywana jako dokument AiReport) { "overallHealthScore": 58, "executiveSummary": "Umiarkowana kondycja...", "keyRisks": [ "Wiertło 10mm — brak za ~5 dni" ], "recommendations": [{ "scope": "Product", "actionType": "ReplenishNow", "priority": "Critical", "rationale": "Prognoza 32,6 przy stanie 10", "suggestedValue": 30, "confidence": 0.9 }] }
Converse: system prompt (rola + wymagany format) oraz user prompt (polecenie + zdystylowany kontekst w JSON). Wysyłamy tylko policzone prognozy i agregaty — żadnych surowych transakcji ani danych osobowych. Parametry wywołania: maxTokens=3000, temperature 0.3, modelId z konfiguracji.// rola modelu (skrót, wiernie) Jesteś starszym analitykiem zarządzania zapasami. Rola WYŁĄCZNIE doradcza — nie podejmujesz decyzji, tylko oceniasz dane i proponujesz priorytety (wdraża je człowiek). Dostajesz przetworzone prognozy (sygnał już policzony przez warstwę deterministyczną). Odpowiadaj tylko po polsku. Zwróć wyłącznie poprawny JSON o strukturze: { executiveSummary, overallHealthScore 0-100, overallAssessment, keyRisks[], recommendations[{ scope, actionType, priority, title, rationale, suggestedValue, confidence 0-1 }] }
// polecenie Przeanalizuj poniższe dane prognostyczne i wygeneruj raport doradczy w formacie JSON. Skup się na priorytetyzacji ryzyk i konkretnych, wykonalnych rekomendacjach. // kontekst — zdystylowany (przykład) { "periodFrom":"2026-05-17", "periodTo":"2026-06-16", "productsCovered":4, "distributionPointsCovered":1, "forecastsIncluded":4, "forecastsOmitted":0, "riskDistribution":{ "high":1,"medium":0,"low":1,"none":2 }, "loadingRecommendationCount":1, "slowMoverCount":2, "selectionPolicy":"wszystkie prognozy / wycinek wg ryzyka", "forecasts":[{ "distributionPointName":"Magazyn Hala A", "productName":"Wiertło 10mm", "productNumber":"NR-...", "averageDailyDemand":1.08, "demandTrendPerDay":0.04, "currentStock":10, "upperLimit":60, "forecastedDemand":32.6, "predictedStockLevel":-22.6, "daysUntilStockout":5, "shortageRisk":"High", "recommendedLoadingQuantity":30, "suggestedMinimumLevel":16 }] }
forecasts[] niesie 16 policzonych pól (popyt, trend, dni z popytem, stan, prognoza, dni do wyczerpania, ryzyko, rekomendowany załadunek, sugerowane minimum). Przy wielu produktach lista to priorytetowy wycinek (≤200) uporządkowany wg ryzyka i pilności, a pełną skalę opisują riskDistribution + liczniki — model dostaje o tym jawną informację w selectionPolicy.Koszt nie zależy od liczby wszystkich produktów w bazie wprost. Zależy od tego, ile prognoz wkładamy do payloadu AI, ile szczegółowych przykładów ryzyka dodajemy i jak długą odpowiedź wygeneruje model.
Gemma 3 12B IT google.gemma-3-12b-it w eu-west-1. W praktyce: zauważalnie szybsza niż 27B, a nadal wystarczająco dobra do polskiego raportu doradczego JSON.
W przykładowym raporcie analizowany był okres 90 dni (2026-03-19 – 2026-06-16). Do modelu trafiają agregaty dla całej organizacji oraz domyślnie maks. 12 szczegółowych prognoz (MaxForecastsInAiPayload=12) + przykłady ryzyk.
koszt = inputTokens / 1M × cenaInput + outputTokens / 1M × cenaOutput. Backend zapisuje dziś TokensUsed jako sumę tokenów; kalkulator rozdziela je jawnie na input/output.
TokensUsed| Model do testów | Model ID / uwaga | Input / 1M | Output / 1M | Koszt 1 raportu | Koszt / mies. |
|---|---|---|---|---|---|
| Wybrany Gemma 3 12B IT | google.gemma-3-12b-it | $0.11 | $0.34 | — | — |
| Gemma 3 4B IT | google.gemma-3-4b-it — szybki baseline | $0.05 | $0.09 | — | — |
| Gemma 3 27B IT | google.gemma-3-27b-it — wariant jakościowy | $0.27 | $0.45 | — | — |
| Claude Haiku 4.5 | eu.anthropic.claude-haiku-4-5... — cena publiczna Anthropic; Bedrock do potwierdzenia | $1.00 | $5.00 | — | — |
| GPT OSS 120B | openai.gpt-oss-120b-1:0 — test porównawczy | $0.1545 | $0.6180 | — | — |
MaxForecastsInAiPayload do setek pozycji.min(liczba prognoz, MaxForecastsInAiPayload) × ok. 70 tokenów + przykłady ryzyk + stały prompt systemowy.forecasting:ai:bedrock:MaxTokens.Zakładka „Ustawienia" steruje tym, jak liczone są prognozy. Te same wartości obowiązują przy generowaniu na żądanie i w nocnym przebiegu — nie ma sztywno zaszytych liczb.
Horyzont — na ile dni w przód prognozujemy (np. 7 / 14 / 30). Okno analizy — ile historii zasila średnią i trend. Pokrycie — bufor sugerowanego minimum.
Czas dostawy, poziom obsługi (z) i tłumienie trendu — sterują pokryciem na czas dostawy, zapasem bezpieczeństwa i ostrożnością ekstrapolacji.
Niezależne od horyzontu: po ilu dniach do wyczerpania pozycja jest wysokiego / niskiego ryzyka.
Konfiguracja cyklicznego raportu AI mieści się w tej samej zakładce — jedno miejsce na całą konfigurację modułu.
ForecastingSettings; gdy brak — obowiązują domyślne ForecastingOptions.HighRiskDays / LowRiskDays (0 = wyprowadź z horyzontu).GET/PUT /forecasting/settings (zapis: Administrator).
Ten sam algorytm co w produkcie, policzony w przeglądarce. Suwaki po lewej to dane wejściowe; po prawej widzisz, co system z nich wylicza — w czasie rzeczywistym.
MovingAverageTrendForecaster — średnia z pełnego okna analizy, istotny statystycznie i tłumiony trend, pokrycie czasu dostawy, zapas bezpieczeństwa z·σ·√(czas dostawy), oraz te same reguły ryzyka i rekomendacji.Withdrawal; w kalkulatorze suwaki generują przykładową serię danych, żeby dało się zobaczyć wpływ parametrów na żywo.
Ile ostatnich dni historii bierze algorytm. Dłuższe okno wygładza wynik, krótsze szybciej reaguje na zmianę zużycia.
Średni poziom zużycia w symulacji. W produkcji wynika z sumy wydań magazynowych podzielonej przez liczbę dni w oknie analizy.
Symulowany kierunek zmian popytu. Dodatni trend oznacza rosnące zużycie, ujemny malejące. Algorytm użyje go tylko wtedy, gdy jest statystycznie wiarygodny.
Jak bardzo dzienny popyt skacze wokół średniej. Zwiększa odchylenie standardowe σ, a więc zapas bezpieczeństwa i sugerowane minimum.
Symuluje produkty pobierane sporadycznie. Dużo dni zerowych obniża średnią i utrudnia zaufanie trendowi.
Wynik pomocniczy: ile dni w oknie miało zużycie większe od zera. Pokazuje, czy produkt rotuje regularnie, czy sporadycznie.
Ile sztuk jest teraz w danym punkcie dystrybucyjnym. Od tego odejmowana jest prognozowana konsumpcja w kolejnych dniach.
Maksymalna pojemność lub sensowny poziom zatowarowania. Rekomendowany załadunek nie przekroczy wolnego miejsca: limit - stan.
Stan po zakończeniu horyzontu: max(0, stan - prognozowany popyt). Spadek poniżej minimum daje ryzyko średnie.
Pierwszy dzień, w którym symulowany stan spada do zera lub niżej. To główny sygnał dla wysokiego i niskiego ryzyka.
Na ile dni do przodu liczymy popyt i stan. Wpływa na sumę prognozowanego popytu oraz przewidywany stan końcowy.
Ile dni zapasu chcemy mieć po uzupełnieniu. Razem z czasem dostawy buduje część deterministyczną sugerowanego minimum.
Ile dni mija od decyzji o uzupełnieniu do realnej dostępności towaru. Im dłuższy, tym większy zapas bezpieczeństwa.
Współczynnik ochrony przed brakiem. Wyższe z oznacza większy bufor dla produktów o zmiennym popycie.
Współczynnik φ od 0 do 1. Niższy szybciej wygasza trend, wyższy pozwala trendowi mocniej działać w kolejnych dniach.
Jeśli wyczerpanie nastąpi w ciągu tylu dni, produkt dostaje ryzyko wysokie i trafia na górę listy.
Jeśli wyczerpanie jest dalsze niż próg wysoki, ale nadal mieści się w tym progu, produkt dostaje ryzyko niskie.
Ilość potrzebna, żeby pokryć popyt w horyzoncie i zakończyć z zapasem co najmniej na poziomie sugerowanego minimum.
avg = suma(dzienny_popyt) / liczba_dni. Dni bez popytu zostają w oknie, więc produkty sporadyczne mają niższą średnią.σ = odchylenie standardowe(dzienny_popyt). Im większe wahania, tym większy bufor bezpieczeństwa.|slope| / se ≥ 2; inaczej slope = 0.forecast(t) = max(0, level + slope × Σφ^k). Suma Σφ^k tłumi trend, żeby nie rósł bez końca.forecastedDemand = Σ forecast(t) dla dni od 1 do horyzontu.stock(t) = stan_bieżący - Σ forecast(i). Pierwszy dzień z stock(t) ≤ 0 to dni do wyczerpania.minimum = ceil(avg × (pokrycie + czas_dostawy) + z × σ × √czas_dostawy). To połączenie pokrycia deterministycznego i bezpieczeństwa.High: wyczerpanie ≤ próg wysoki. Medium: stan końcowy < minimum. Low: wyczerpanie ≤ próg niski. W innym przypadku None.recommended = ceil(max(0, forecastedDemand + minimum - stan)), potem ograniczenie do wolnej pojemności: min(recommended, limit - stan).avg = 0, system nie rekomenduje załadunku. To chroni przed automatycznym zatowarowaniem pozycji, które nie rotują.W interfejsie ustawiasz, jak często system ma sam przygotować raport. Można też wygenerować go ręcznie w każdej chwili.
dla szybko rotujących magazynów
domyślny, najczęstszy wybór
przegląd strategiczny
dowolny własny interwał
AiReportSchedule (częstotliwość, nextRunAt, włączony tak/nie).GenerateScheduledAiReportsJob) co godzinę skanuje harmonogramy i uruchamia generację dla tych, których termin minął — następnie przesuwa nextRunAt o jeden okres.



Nazwa jednoznacznie łączy markę ASD z modułem prognozowania zapasów i decyzji magazynowych.
ASD — spójność z marką i ekosystemem klienta. Forecast — jasna obietnica produktu: prognozowanie zapotrzebowania, ryzyka braków i rekomendacji uzupełnień.
Znak „rosnącego przepływu / prognozy" (węzły i strzałka w górę) — symbolizuje optymalizację i predykcję. Spójny z kolorystyką aplikacji.
popyt, przewidywany stan, ryzyko, rekomendacje, sugerowane minimum
raport po polsku + rekomendacje JSON; model Gemma 3 12B IT
tydzień / miesiąc / kwartał / co N dni + na żądanie
horyzont, okno analizy, progi ryzyka i zapas bezpieczeństwa — sterują prognozą na żądanie i nocną
4 zakładki w stylu ASD Forecast, wykresy, role i wielojęzyczność (PL/EN/DE)
Backend: .NET 8 (modularny monolit), nowy moduł Forecasting. Frontend: React + MUI, moduł forecasting. AI: AWS Bedrock. Dane: per-organizacja, bezpiecznie odseparowane.
uruchomienie środowiska demonstracyjnego lub produkcyjnego, konfiguracja infrastruktury i dostępów
przygotowanie miejsca na kod, historię zmian, dostęp zespołu i późniejszy proces CI/CD
System przewiduje i doradza — pokazuje, czego zabraknie i co warto zrobić. AI dokłada inteligentne streszczenie i priorytety, ale decyzję zawsze podejmuje człowiek.
module_forecasting):ProductForecast — prognoza per produkt/punktForecastingRun — metadane przebieguAiReport — raport AI (streszczenie + rekomendacje)AiReportSchedule — harmonogram per organizacjaForecastingSettings — parametry prognoz per organizacja
POST /forecasting/forecasts/generateGET /forecasting/forecasts · /recommendations · /summaryPOST /forecasting/ai-reports/generateGET/PUT /forecasting/ai-reports/scheduleGET/PUT /forecasting/settings