Co pokazuje harmonogram platformy do awizacji

Platforma do awizacji SoftwareStudio jest modułem klasy systemu YMS, który planuje wizyty pojazdów i porządkuje pracę na placu manewrowym. Jej centralnym ekranem jest harmonogram okien czasowych. Dyspozytor widzi na nim, które pojazdy są zapowiedziane, które czekają przed bramą, a które stoją już przy rampie, więc decyzje o kolejności obsługi opierają się na jednym obrazie sytuacji.

Widok Okna czasowe grupuje wizyty w kolumnach według statusu, a kolor nagłówka kolumny odpowiada kolorowi w legendzie pod tabelą. Godziny biegną w pionie, więc zagęszczenie wizyt w danym przedziale widać od razu. Wersję platformy zorientowaną na moduł YMS opisuje odrębny artykuł o platformie do awizacji YMS, a zasady definiowania reguł okien zbiera tekst o zarządzaniu oknami czasowymi.

Kolumna statusu w widoku Okna czasoweZnaczenie dla dyspozytora
1. Awizo czekamy na transportwizyta zapowiedziana, pojazd jeszcze nie dojechał
2. Brama oczekuje na wjazdpojazd zgłosił się przy bramie i czeka na wpuszczenie
3. Magazyn rampypojazd obsługiwany przy rampie magazynu
4. Magazyn rampa wolna / wyjazdobsługa zakończona, pojazd opuszcza rampę i teren
5. Parkingpojazd oczekuje na parkingu przed obsługą
6. Agencja Celnawizyta obsługiwana w punkcie odprawy celnej
9. Awizacja zamkniętawizyta zakończona, wpis trafia do historii

Reguła: wizyta ma w danej chwili jeden status, a każda zmiana statusu zostawia wpis z godziną i nazwą użytkownika, bo tylko taki ślad pozwala później policzyć czas oczekiwania.

Legenda na zrzucie ekranu zawiera statusy od 1 do 6 oraz 9. Numeracja sugeruje, że system rezerwuje jeszcze dwie pozycje, ale w tym widoku nie mają one własnych kolumn, więc nie wchodzą do opisu.

Kontrola przejść między statusami

Numerowane statusy zapraszają do prostego modelu maszyny stanów. Dozwolone przejścia zapisuje się w małej tabeli słownikowej, a procedura zmiany statusu sprawdza, czy para stan bieżący i stan docelowy istnieje. Dzięki temu wizyta nie przeskoczy z pierwszej kolumny do zamkniętej bez zapisu o wjeździe, a reguła żyje w danych, więc administrator może ją zmienić bez wdrożenia kodu. Macierz poniżej jest przykładowa i nie odwzorowuje ustawień produktu.

CREATE TABLE dbo.StatusTransition (
    FromStatus tinyint NOT NULL,
    ToStatus   tinyint NOT NULL,
    PRIMARY KEY (FromStatus, ToStatus)
);

INSERT INTO dbo.StatusTransition (FromStatus, ToStatus)
VALUES (1, 2), (1, 5), (5, 2), (2, 3), (3, 4), (4, 9);

-- w procedurze zmiany statusu
IF NOT EXISTS (SELECT 1 FROM dbo.StatusTransition
               WHERE FromStatus = @Current AND ToStatus = @Target)
    THROW 50001, N'Niedozwolone przejście statusu wizyty.', 1;

Komunikat błędu warto przekładać na język użytkownika, na przykład „Pojazd nie wjechał jeszcze na teren zakładu”. Dostawca albo ochroniarz rozumie taki komunikat i wie, jaki krok wykonać jako następny.

Widoki harmonogramu w pracy dyspozytora

Harmonogram przełącza się między dniem i tygodniem, a także agendą. Widok dzienny służy do pracy w trakcie zmiany, kiedy liczy się kolejność najbliższych godzin. Widok tygodniowy pokazuje obciążenie bramy w kolejnych dniach, więc nadaje się do rozkładania wizyt na mniej zajęte doby. Agenda porządkuje wizyty w prostą listę według godzin, a oś czasu z dnia bieżącego pasuje do dużych ekranów w hali.

Widok tygodniowy Awizacja bram w systemie YMS z wizytami rozłożonymi na dni i godziny, ikonami pojazdów i nazwami kontrahentów
Widok tygodniowy bramy: wizyty pojazdów ciężarowych na osi godzin od poniedziałku do niedzieli.

Na widoku tygodniowym bramy każda wizyta ma ikonę pojazdu oraz nazwę kontrahenta i numer awizacji. Dwa kolory ikon pozwalają odróżnić wizyty na pierwszy rzut oka. Legenda opisuje samą bramę, czyli wjazd dla pojazdów ciężarowych, a przegląd wjazdów tygodnia zastępuje pytania telefoniczne o to, kto i kiedy przyjedzie.

Plan dnia dla ochrony bramy

Osobny kalendarz dostaje pracownik ochrony. Kolumny odpowiadają jego zadaniom: transport awizowany, oczekujący na wjazd oraz oczekujący na wyjazd. Widok ma przełączniki Dzień i Tydzień oraz Agenda, a także oś czasu dnia, a zwykły wjazd nie wymaga wpisywania danych, bo pojazd jest już zapowiedziany.

Kalendarz plan dnia w roli Brama i ochrona z kolumnami transport awizowany, oczekujący na wjazd i oczekujące na wyjazd
Kalendarz ochrony bramy: kolumny transportów awizowanych, oczekujących na wjazd i oczekujących na wyjazd.

Czerwona linia pokazuje aktualną godzinę, więc ochrona widzi, które wizyty są spóźnione względem okna. Wizyty spoza harmonogramu trafiają do osobnej listy opisanej w artykule o transporcie nieawizowanym.

Rezerwacja slotu przez dostawcę

Dostawca po zalogowaniu do portalu samodzielnie wybiera wolny slot czasowy. Magazyn widzi zgłoszenie natychmiast po zatwierdzeniu. Podział pracy jest prosty: dostawca ma dostęp do wolnych terminów, a dyspozytor zajmuje się wyjątkami. Zasadę rezerwacji przedziałów czasowych rozwija artykuł o slot booking, a pojęcie samego przedziału definiuje tekst o slotach czasowych w logistyce.

Ograniczenie w bazie zamiast sprawdzania w kodzie

Największym ryzykiem przy rezerwacji online jest kolizja: dwóch dostawców wybiera ten sam slot w tej samej sekundzie. Sprawdzenie dostępności w aplikacji przed zapisem nie wystarcza, bo między odczytem a zapisem druga sesja zdąży zająć termin. Pewną ochroną jest ograniczenie w bazie. Indeks unikalny z filtrem obejmuje tylko rezerwacje aktywne, więc anulowana rezerwacja zwalnia slot, a druga próba zajęcia tego samego terminu kończy się błędem.

CREATE TABLE dbo.DockBooking (
    BookingId  int IDENTITY PRIMARY KEY,
    DockId     int          NOT NULL,
    SlotStart  datetime2(0) NOT NULL,
    CarrierId  int          NOT NULL,
    Status     tinyint      NOT NULL   -- 1 aktywna, 9 anulowana
);

CREATE UNIQUE INDEX UX_DockBooking_ActiveSlot
    ON dbo.DockBooking (DockId, SlotStart)
    WHERE Status <> 9;

Tabela i indeks są poglądowe, a mechanizm opisuje dokumentacja indeksów filtrowanych w Microsoft Learn. Po stronie bazy błąd naruszenia unikalności ma numer 2601 albo 2627. Warstwa aplikacji tłumaczy go na kod HTTP 409, a przeglądarka pokazuje dostawcy komunikat o zajętym terminie.

async function bookSlot(dockId, slotStart) {
  const res = await fetch('/api/bookings', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ dockId, slotStart })
  });
  if (res.status === 409) {
    alert('Ten termin został właśnie zajęty. Wybierz inny slot.');
    return null;
  }
  if (!res.ok) throw new Error('HTTP ' + res.status);
  return res.json();
}

Przykład używa adresu /api/bookings jako miejsca zastępczego i nie opisuje interfejsu produktu. Ważny jest schemat obsługi: odpowiedź 409 nie jest awarią, tylko normalnym wynikiem wyścigu, więc formularz odświeża listę wolnych slotów zamiast wyświetlać błąd techniczny.

Siatka slotów i długość okna

Kalendarz opiera się na siatce slotów o stałej długości. Okno wizyty ma długość równą wielokrotności slotu: czas obsługi dzieli się przez długość slotu i zaokrągla w górę. Wizyta trwająca 50 minut przy siatce 20-minutowej zajmuje trzy sloty, czyli 60 minut. Krótsza siatka zmniejsza straty na zaokrągleniu, ale zwiększa liczbę wierszy w tabeli i utrudnia dyspozytorowi czytanie widoku. Wybór długości siatki jest więc kompromisem między dokładnością a czytelnością.

Sloty na wybrany dzień generuje się zapytaniem rekurencyjnym, które dokłada jedną siatkę na każdą rampę. Zapytanie wypełnia tabelę wolnych terminów, z której portal dostawcy odczytuje oferowane godziny.

DECLARE @From datetime2(0) = '2026-10-01 06:00',
        @To   datetime2(0) = '2026-10-01 22:00';

WITH t AS (
    SELECT @From AS SlotStart
    UNION ALL
    SELECT DATEADD(MINUTE, 20, SlotStart)
    FROM   t
    WHERE  DATEADD(MINUTE, 20, SlotStart) < @To
)
SELECT d.DockId, t.SlotStart
FROM   t
CROSS JOIN dbo.Dock AS d
OPTION (MAXRECURSION 0);

Opcja MAXRECURSION 0 wyłącza domyślny limit 100 poziomów rekurencji, który przy siatce 20-minutowej wystarczy na około 33 godziny. Dla dłuższych zakresów, na przykład na cały miesiąc, limit trzeba zdjąć albo generować sloty tabelą liczb.

Narzędzia dyspozytora w menu platformy

Poza harmonogramem menu roli Informacje zawiera pozycje pomocnicze, które domykają obieg wizyty. Nazwy pozycji pochodzą z ekranu platformy, a poniższa tabela opisuje ich zastosowanie w codziennej pracy.

Pozycja menuZastosowanie
Okna czasowestatusy wizyt w widoku dnia i tygodnia
Awizacja ramp oraz Awizacja bramharmonogramy osobno dla ramp magazynu i dla wjazdów przez bramę
Transporty i Transport nieawizowanylista wizyt oraz wizyty bez rezerwacji
Księga gościrejestr wejść z historią
Raporty i Zestawieniadane zbiorcze o wizytach, dostępne także w eksporcie do Excela i archiwum PDF
Raport TOP 10 w systemie awizacji z zestawieniem transportów według kontrahenta i przewoźnika oraz numeru rejestracyjnego i dnia tygodnia
Raport TOP 10: zestawienia według kontrahenta i przewoźnika oraz numeru rejestracyjnego, a także rozkład transportów według dni tygodnia.

Raport TOP 10 grupuje transporty według kontrahenta oraz przewoźnika, a także numeru rejestracyjnego. Dodatkowo pokazuje rozkład według dni tygodnia. Rozkład dziennych wizyt jest podstawą do przesuwania okien: jeśli poniedziałek obsługuje więcej wizyt niż środa, dyspozytor przenosi część rezerwacji, zanim powstanie kolejka.

Obciążenie według dnia i godziny

To samo zestawienie policzy zapytanie SQL, które grupuje rezerwacje po dniu tygodnia i godzinie. Wynik zasila mapę cieplną, w której najciemniejsze pola pokazują przeciążone przedziały. Funkcja DATEPART z argumentem WEEKDAY zależy od ustawienia DATEFIRST sesji, więc numery dni w raporcie warto ustalić jawnie.

SET DATEFIRST 1;  -- poniedziałek = 1

SELECT DATEPART(WEEKDAY, SlotStart) AS DayNo,
       DATEPART(HOUR,    SlotStart) AS HourNo,
       COUNT(*)                     AS Bookings
FROM   dbo.DockBooking
WHERE  Status <> 9
  AND  SlotStart >= DATEADD(DAY, -28, SYSDATETIME())
GROUP BY DATEPART(WEEKDAY, SlotStart), DATEPART(HOUR, SlotStart)
ORDER BY DayNo, HourNo;

Cztery tygodnie danych wystarczają, aby odróżnić stały wzorzec od jednorazowego szczytu. Okna, które przez cały okres pozostają puste, są kandydatami do skrócenia albo zamknięcia, a okna zawsze pełne wymagają dodatkowej rampy lub przesunięcia części dostaw.

Punktualność dostaw względem okna

Harmonogram ma sens tylko wtedy, gdy pojazdy zjawiają się w swoich oknach. Punktualność mierzy się jako odsetek wizyt, w których przyjazd mieści się w tolerancji wokół początku okna, na przykład plus minus 15 minut. Tolerancja jest parametrem biznesowym: krótka rampa z ciasnym harmonogramem potrzebuje mniejszej, a plac z dużym zapasem miejsca może przyjąć większą.

Wskaźnik liczy się dla przewoźnika albo kontrahenta, a jego wynik trafia do rozmów o jakości współpracy. Warto raportować go w dwóch przekrojach: według przewoźnika i według godziny okna, bo ta sama firma bywa punktualna rano i spóźniona po południu. Zapytanie łączy rezerwację z zapisem przyjazdu i porównuje dwie godziny.

WITH v AS (
    SELECT b.CarrierId,
           CASE WHEN ABS(DATEDIFF(MINUTE, b.SlotStart, a.ArrivedAt)) <= 15
                THEN 1 ELSE 0 END AS IsOnTime
    FROM   dbo.DockBooking AS b
    JOIN   dbo.Arrival     AS a ON a.BookingId = b.BookingId
    WHERE  b.Status <> 9
)
SELECT CarrierId,
       COUNT(*) AS Visits,
       CAST(100.0 * SUM(IsOnTime) / COUNT(*) AS decimal(5,1)) AS OnTimePct
FROM   v
GROUP BY CarrierId
ORDER BY OnTimePct;

Niski wynik nie zawsze oznacza winę przewoźnika. Jeżeli okna są krótsze niż realny czas obsługi, poprzednia wizyta wydłuża się i cała kolejka przesuwa, a kolejni kierowcy czekają mimo punktualnego przyjazdu. Zanim wskaźnik trafi do umowy z przewoźnikiem, trzeba więc porównać go z czasem trwania wizyt na rampie. Zasady wyznaczania długości okien opisuje artykuł o oknach czasowych.

Wdrożenie platformy do awizacji

Platformę wdraża się zwykle bez przebudowy infrastruktury informatycznej firmy. Wystarczy zdefiniować punkty integracji z systemem magazynowym oraz przeszkolić zespół ochrony i dyspozytorów. Z platformy korzystają najczęściej centra dystrybucyjne obsługujące wielu dostawców, zakłady produkcyjne pracujące w modelu just in time oraz firmy logistyczne zarządzające ruchem pojazdów wielu klientów. Zasady łączenia z magazynem opisuje artykuł o integracji systemów magazynowych.

Konfigurację przed pierwszą awizacją porządkują cztery grupy danych.

  • Rampy i bramy - lista stanowisk z kodami, do których kalendarz przypisuje wizyty.
  • Reguły slotów - długość siatki czasowej i zasady wyliczania długości okna dla pojazdu.
  • Konta i role - uprawnienia dyspozytora i ochrony oraz dostawców z przewoźnikami.
  • Punkty integracji - komunikaty do WMS i ERP oraz odbiór potwierdzeń dostawy.

Pełny obraz procesu przedstawia artykuł o awizacji dostaw, a ogólne cele systemu opisuje tekst o systemie awizacji. Kalendarze i ich widoki omawia artykuł o kalendarzach w VSS.net, a przegląd ramp i doków uzupełnia stronę o oknach czasowych w systemie YMS.

Demonstracja pozwala obejrzeć harmonogram na danych przykładowych, zanim zapadnie decyzja o wdrożeniu. Interaktywne demo awizacji działa w przeglądarce bez rejestracji, a producent publikuje też stronę o platformie do awizacji.