Awizacja swobodna i okienka czasowe
System awizacji transportu może pracować w dwóch trybach. W pierwszym kontrahent podaje dowolny czas rozpoczęcia i zakończenia wizyty. W drugim wybiera okienko, czyli zdefiniowany przedział niezbędny do zrealizowania załadunku albo rozładunku konkretnego transportu. Kalendarz obsługuje oba tryby i pokazuje dyspozytorowi wszystkie zaplanowane wizyty pojazdów w jednym widoku.
| Cecha | Awizacja swobodna | Okienka czasowe |
|---|---|---|
| Początek i koniec wizyty | dowolne, wpisane przez kontrahenta | zdefiniowane w konfiguracji kalendarza |
| Siatka kalendarza | nieregularne luki między wizytami | regularne sloty, na przykład co 20 minut |
| Typowe zastosowanie | transport nietypowy albo jednorazowy | dostawy powtarzalne o znanym czasie obsługi |
| Główne ryzyko | nakładanie się wizyt i porozrywane wolne przedziały | okienko za krótkie albo za długie dla danego ładunku |
Okienka dobiera się do rodzaju transportu. Firmy kurierskie, które realizują małe dostawy do kilku palet, dostają inne okienka niż dostawy większe. Dla transportów powyżej 10 palet obowiązuje osobna pula. Obejmuje ona przesyłki całopaletowe, a także kontenery i cysterny. O tym, jak firmy kurierskie wpisują się w harmonogram magazynu, pisze artykuł o firmach kurierskich w magazynie.
Reguła: rodzaj transportu wybiera pulę okienek, a nie odwrotnie. Kurier z kilkoma paletami nie powinien zajmować okna zaprojektowanego dla cysterny.
Dzięki takiemu podziałowi dostawca i odbiorca wiedzą, kiedy ładunek zostanie obsłużony. Magazyn planuje obsadę na podstawie znanych okienek, a przewoźnik układa trasy z realnymi punktami zatrzymania. Ogólne zasady długości okna omawia artykuł o oknach czasowych, a podział kalendarza między awizacje jednorazowe i cykliczne opisuje tekst o module awizacji VSS.net.
Awizacja swobodna zawsze musi zostać przełożona na siatkę, bo rampa jest rezerwowana w całych slotach. Czas obsługi zaokrągla się w górę do pełnej liczby slotów. Wizyta trwająca 50 minut zajmie w siatce 20-minutowej trzy sloty, czyli godzinę, a dziesięć minut zapasu będzie niedostępne dla innych. Przykład w T-SQL: SELECT CEILING(50 / 20.0) AS Slots; zwraca 3.
Definicja kalendarza w kartotekach
Kalendarze konfiguruje się w sekcji Kartoteki, w pozycji Kalendarze. Formularz ustawień ma trzy zakładki. Pierwsza nosi nazwę Dane podstawowe, druga Uprawnienia, trzecia Zdarzenia. Zakładka podstawowa zawiera pola, które opisują, skąd kalendarz bierze zasoby i jak wyświetla czas. Znaczenie pól wynika z ich nazw oraz wartości widocznych w formularzu.

| Pole formularza | Co ustala |
|---|---|
| Kod i nazwa kalendarza | identyfikator oraz nazwa, pod którą kalendarz pojawia się w menu |
| Zapytanie - RESOURCES | zapytanie SQL zwracające zasoby, na przykład rampy, które tworzą kolumny widoku |
| Warunek filtrowania danych | zapytanie ograniczające dane do zakresu użytkownika lub magazynu |
| Lista możliwych widoków i sposób prezentacji | widoki dostępne w kalendarzu oraz domyślny tryb pokazywania zdarzeń |
| Kolorystyka obiektów | schemat kolorów zdarzeń w kalendarzu |
| Pierwszy dzień tygodnia oraz godziny | granice siatki: godziny rozpoczęcia i zakończenia oraz czas pracy |
Pola zapytań przyjmują instrukcje SQL, więc kalendarz można podłączyć do dowolnego zestawu zasobów bez zmiany kodu aplikacji. Ta elastyczność ma cenę: zapytanie z formularza jest zwykłym zapytaniem do bazy, więc jego koszt zależy od indeksów. Zapytanie bez indeksu w kartotece z tysiącami rekordów spowolni cały widok, a nie tylko jednego użytkownika. Pozostałe słowniki systemu opisuje artykuł o kartotekach w VSS.net.
Zasoby kalendarza i zapytanie SQL
Każdy wiersz zwrócony przez zapytanie w polu RESOURCES staje się zasobem kalendarza. W kalendarzu według obiektów zasobem jest zwykle rampa, więc widok obiektu można podzielić na sloty odpowiadające poszczególnym rampom. Poniższe zapytanie zwraca rampy wybranego magazynu, ale tylko te, do których rola użytkownika ma dostęp. Nazwy tabel są poglądowe i nie odwzorowują schematu produktu.
SELECT d.DockCode AS ResourceId,
d.DockName AS ResourceTitle
FROM dbo.Dock AS d
WHERE d.WarehouseId = @WarehouseId
AND d.IsActive = 1
AND EXISTS (SELECT 1
FROM dbo.RoleWarehouse AS rw
WHERE rw.RoleId = @RoleId
AND rw.WarehouseId = d.WarehouseId)
ORDER BY d.DockCode;
Drugie zapytanie pobiera zdarzenia widoczne w oknie kalendarza. Warunek zakresu musi łapać także wizyty rozpoczęte przed początkiem widoku i kończące się po nim. Częsty błąd polega na filtrowaniu po samym początku wizyty, przez co blok trwający przez północ znika z widoku następnego dnia. Do przechowywania czasu nadaje się typ datetime2, który opisuje dokumentacja Microsoft Learn.
CREATE NONCLUSTERED INDEX IX_Advice_Dock_Slot
ON dbo.Advice (DockCode, SlotStart)
INCLUDE (SlotEnd, Status);
SELECT a.AdviceId, a.DockCode, a.SlotStart, a.SlotEnd
FROM dbo.Advice AS a
WHERE a.SlotStart < @RangeEnd
AND a.SlotEnd > @RangeStart
AND a.Status IN (0, 1);
Test nakładania się dwóch przedziałów sprowadza się do dwóch nierówności: zdarzenie zaczyna się przed końcem zakresu i kończy po jego początku. Indeks zaczyna się od kolumny rampy, bo kalendarz odpytuje jedną rampę naraz, a pole SlotEnd w klauzuli INCLUDE oszczędza odczytu z tabeli. Wydarzenia całodniowe nie trafiają do siatki godzinowej. Pojawiają się jako wpisy w nagłówkach dni.
Kalendarze według obiektów i sloty ramp
Menu kalendarza jest podzielone na sekcje, żeby łatwiej kontrolować obiekty magazynowe. Pierwsza obejmuje kalendarze według obiektów, a druga kalendarze pozostałe. Widok obiektu dzieli się dodatkowo na sloty, na przykład po jednym na rampę, dzięki czemu dyspozytor widzi obciążenie każdego stanowiska osobno, a nie sumę dla całego magazynu.

Kalendarz z rysunku pochodzi z roli Brama i ochrona. Kolumny odpowiadają etapom: transport awizowany, oczekujące na wjazd i oczekujące na wyjazd, a ikony pojazdów układają się w rzędach godzin. Ochrona przy bramie widzi w ten sposób nie tylko plan, lecz także pojazdy, które już przeszły do kolejnego etapu. Pełną listę pozycji menu awizacji, w tym kalendarze, przedstawia artykuł o awizacjach VSS.net.
Widok Agenda z początku artykułu ustawia zdarzenia w kolejności godzin. Wpis zawiera nazwę kontrahenta i numer zamówienia, a pod nimi numer awizacji, numer rejestracyjny pojazdu oraz telefon kierowcy. Kolor wpisu wskazuje obiekt, więc magazynier przygotowujący rozładunek odczytuje z jednej linii, kogo się spodziewać. Telefon kierowcy ma pod ręką na wypadek opóźnienia. Agenda jest wygodna na odprawie porannej, a widok obiektów z rampami lepiej pokazuje obciążenie stanowisk.
Podział na obiekty i sloty ma konsekwencje dla wydajności i czytelności. Kalendarz jednej rampy z 20-minutowymi slotami ma 72 pola na dobę. Magazyn z ośmioma rampami ma ich już 576, dlatego widok obiektu warto zawężać do godzin pracy, które kalendarz przyjmuje jako parametr. Więcej o rozmieszczeniu ramp i przydziale bram mówi artykuł o zarządzaniu dokami w magazynie.
Rezerwacja okna bez udziału dyspozytora
Rezerwacja okna czasowego jest dostępna dla działu logistyki lub zaopatrzenia oraz dla dostawców i przewoźników. Wystarcza przeglądarka internetowa albo telefon z Androidem z aplikacją SoftwareStudio. Proces przebiega bez udziału dyspozytora, a system pokazuje dostawcy wyłącznie wolne terminy, więc nie ma ryzyka podwójnej rezerwacji tego samego okna.
- Dodanie awizacji - dwukrotne kliknięcie wybranej godziny otwiera formularz, w którym wypełnia się pola oznaczone pogrubioną czcionką.
- Wyświetlanie zdarzeń - utworzone wydarzenia pojawiają się w kalendarzu jako pola, a całodniowe jako wpisy w nagłówkach dni.
- Edycja szczegółów - dwukrotne kliknięcie pola otwiera formularz edycji, identyczny jak formularz dopisania.
- Zmiana terminu - przeciągnięcie bloku na inną godzinę lub inny zasób zastępuje edytowanie pól po kolei.
Kalendarz obsługuje awizacje jednorazowe oraz cykliczne. Czas dzieli się na okna, na przykład co 20 minut, a miejsca załadunku i rozładunku, czyli doki, wybiera się z listy. Awizację można powiązać z innymi dokumentami w systemie magazynowym, a potwierdzenie trafia do uczestników e-mailem lub SMS-em. Opis rejestracji awizacji dostaw przedstawia artykuł o awizacji dostaw, a wersję przeglądarkową kalendarza pokazuje aplikacja kalendarz do awizacji dostaw.
Dla dyspozytora oznacza to mniej rozmów telefonicznych z pytaniem o godzinę przyjazdu. Informacja jest widoczna w kalendarzu razem z historią wcześniejszych wizyt danego przewoźnika. Zmiana zapisana w kalendarzu jest od razu widoczna dla pozostałych osób w magazynie, więc nie trzeba przenosić zgłoszenia z osobnego dokumentu do harmonogramu. Rozwiązanie dla firm transportowych, które same planują sloty u wielu odbiorców, przedstawia artykuł o kalendarzu dla firmy transportowej.
Historia zapisana w kalendarzu przydaje się przy rozliczeniach z przewoźnikami. Gdy dojdzie do sporu o rzeczywisty czas przyjazdu albo długość rozładunku, dyspozytor ma zapis: kto zarezerwował okno oraz na jak długo, a także jak przebiegła obsługa pojazdu. Dane z poprzednich tygodni można też wykorzystać do korekty reguł długości okna.
Role i widoczność kalendarzy
Kalendarz jest wspólnym narzędziem wielu firm, więc nie każdy powinien widzieć wszystko. Zakładka Uprawnienia w definicji kalendarza pozwala zablokować dostęp do określonych widoków dla określonych ról. Taki podział ogranicza ryzyko przypadkowej zmiany cudzej awizacji i porządkuje pracę na wspólnym kalendarzu.
| Rola | Co widzi | Co może zrobić |
|---|---|---|
| Firma transportowa | wyłącznie własne awizacje | zakładać i edytować własne wizyty |
| Kierownik magazynu | kalendarze wszystkich firm | zarządzać ich widocznością w kalendarzu głównym |
| Ochrona przy bramie | plan dnia z etapami wizyty | zmieniać status wizyty w oknie Dyspozycja |
Bezpieczna kolejność nadawania dostępu zaczyna od zera. Nowe konto firmy transportowej powinno startować bez widoczności jakiegokolwiek kalendarza, a dostęp dostaje jawnie, po zatwierdzeniu przez kierownika magazynu. Odwrotna kolejność, czyli odbieranie uprawnień po fakcie, zostawia okres, w którym nowy partner widzi harmonogram konkurencji, a magazyn nie ma o tym informacji.
W bazie SQL Server ten sam efekt można uzyskać na poziomie wierszy, tak żeby ograniczenie działało nawet przy bezpośrednim zapytaniu do tabeli. Służy do tego funkcja Row-Level Security. Predykat filtra zwraca wiersz, jeśli należy do przewoźnika zapisanego w kontekście sesji albo jeśli sesja działa w roli dyspozytora. Przykład jest ilustracją mechanizmu, a nie opisem implementacji produktu.
CREATE FUNCTION dbo.fn_AdviceFilter (@CarrierId int)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS allowed
WHERE @CarrierId = CAST(SESSION_CONTEXT(N'CarrierId') AS int)
OR SESSION_CONTEXT(N'IsDispatcher') = 1;
GO
CREATE SECURITY POLICY dbo.AdvicePolicy
ADD FILTER PREDICATE dbo.fn_AdviceFilter(CarrierId) ON dbo.Advice
WITH (STATE = ON);
Aplikacja ustawia kontekst sesji po zalogowaniu użytkownika, a baza dopisuje filtr do każdego zapytania. Szczegóły składni i ograniczenia opisuje dokumentacja Row-Level Security w Microsoft Learn. Nadawanie ról w samej aplikacji przedstawia artykuł o module Administrator w VSS.net.
Reguła: ukrycie widoku w interfejsie nie jest zabezpieczeniem, dopóki baza zwraca dane każdemu, kto zna adres zapytania.
Widok dnia według etapów i widok bram
Sekcja Informacje udostępnia dwa widoki, które odpowiadają na inne pytania niż kalendarz roboczy. Widok Okna czasowe pokazuje wybrany dzień w kolumnach etapów wizyty. Zaczynają się od awiza czekającego na transport i bramy oczekującej na wjazd, po czym następują magazyn rampy oraz magazyn rampa wolna lub wyjazd. Dalej stoją parking i agencja celna, a ostatnia kolumna zbiera awizacje zamknięte. Kolumny odpowiadają kolejnym etapom wizyty, więc położenie bloku od razu wskazuje, gdzie pojazd się znajduje.

Widok Awizacja bram układa tydzień od poniedziałku do niedzieli i przypisuje bloki do godzin, a legenda wskazuje bramę, na przykład wjazd dla pojazdów ciężarowych. Kierownik logistyki porównuje nim obciążenie kolejnych dni i zauważa dzień, w którym wszystkie okna zbiegają się w tych samych godzinach. Wtedy przenosi część wizyt przeciągnięciem, zamiast prosić przewoźników o zmianę terminu jedną wiadomością na raz.
Oba widoki korzystają z tych samych rekordów awizacji co kalendarz roboczy, więc zmiana terminu w jednym miejscu jest widoczna w pozostałych. Konfiguracja kalendarza zdecyduje jednak, które z nich są dostępne dla danej roli. Pozostałe możliwości kalendarzy, w tym integrację z modułami wag samochodowych i bramy, przedstawia artykuł o funkcjach kalendarzy w VSS.net. Praktykę delegowania awizacji na kontrahentów omawia tekst o systemie VSS.net. Zakres modułu przedstawia strona aplikacji kalendarz, a działanie widoków można obejrzeć w demo online.



