Towar wymagający stałej temperatury, z krótkim terminem ważności albo z klasą zagrożenia zmienia reguły pracy magazynu. Zwykły program do magazynowania odpowiada na pytanie, ile sztuk leży w której lokacji. W warunkach specjalnych dochodzą trzy dalsze pytania. W jakich warunkach towar leży, jak długo tam leży i czy wolno go jeszcze wydać.

Ten tekst opisuje dwie warstwy takiego programu. Pierwsza obejmuje fizyczne warunki: strefy temperaturowe i alarmy odchyleń. Druga dotyczy statusu zapasu: partii z terminami ważności oraz blokad jakościowych. Rozmieszczanie zwykłego asortymentu opisano osobno w tekście o programie do magazynowania towarów.

Program do magazynowania a strefy temperaturowe

Strefa temperaturowa jest w bazie danych atrybutem lokacji, a nie napisem na drzwiach chłodni. Każda lokacja należy do jednej strefy, a strefa niesie zakres dopuszczalnych temperatur i limit czasu, przez jaki odczyt może wykraczać poza zakres. Reguły odkładania i wydawania korzystają z tej jednej relacji.

Wymaganie temperaturowe ma również kartoteka towaru. Kartoteka wskazuje strefy dopuszczone dla indeksu, a program porównuje ten zapis ze strefą lokacji docelowej przy każdym odkładaniu. Towar wymagający chłodni nie trafi do strefy ogólnej, nawet gdy lokacja jest wolna i pasuje wymiarami. Sposób opisu takich cech omawia tekst o strukturze kartotek magazynowych.

StrefaTypowy zakresCo egzekwuje programSkutek naruszenia
Strefa ogólnaBrak wymaganiaZgodność typu nośnika i wymiarówBrak blokady
ChłodniaZwykle 2-8°COdkładanie tylko dla indeksów dopuszczonych, licznik czasu poza strefąKwarantanna partii po trwałym odchyleniu
Mroźnia-18°C lub niżejKrótki limit czasu na rampie i w kompletacjiOcena jakościowa palety po przekroczeniu limitu
Rampa i strefa przejściowaZależnie od procesuLimit czasu przebywania zamiast zakresuAlarm dla kierownika zmiany

Zgodność strefy towaru ze strefą lokacji

Zgodność sprawdza prosty warunek w procedurze odkładania: strefa lokacji musi należeć do zbioru stref dopuszczonych dla indeksu. Błąd wykryty na tym etapie kosztuje jedno skanowanie. Ten sam błąd wykryty po tygodniu kosztuje całą partię.

W praktyce trzeba odróżnić strefę stałą od przejściowej. Chłodnia jest strefą stałą. Rampa przyjęć i strefa kompletacji są przejściowe, bo towar spędza tam minuty, a nie tygodnie. Dla nich ważny jest limit czasu, a nie sam zakres temperatury.

Czas poza strefą przy przyjęciu i kompletacji

Przy towarze mrożonym o jakości decyduje nie tylko temperatura w komorze, lecz także czas, który paleta spędziła na rampie. Program może zapisywać znacznik czasu przy zdjęciu palety ze strefy chłodniczej i przy odłożeniu jej do strefy docelowej. Różnica między nimi jest czasem poza strefą. Gdy przekroczy limit zdefiniowany dla indeksu, paleta dostaje status do oceny jakościowej.

Kompletacja w komorze wymaga analogicznego podejścia. Lista pobrań grupuje pozycje tak, aby pracownik opuszczał komorę raz na zlecenie, a nie raz na pozycję. Mechanizm wyznaczania tras opisuje tekst o kompletacji zamówień.

Odczyty temperatury i alarmy odchyleń

Rejestratory zapisują odczyty w stałych odstępach, a program do magazynowania trzyma je w tej samej bazie co stany magazynowe. Wspólna baza pozwala jednym zapytaniem ustalić, które partie leżały w strefie w czasie odchylenia. Osobny system monitoringu tego nie umożliwia bez ręcznego łączenia danych. Ogólne zasady współpracy oprogramowania z urządzeniami opisano w tekście o automatyzacji w magazynie.

Poniższy przykład pokazuje schemat i procedurę alarmową w T-SQL. Nazwy tabel i kolumn są przykładowe, a nie opisem rzeczywistego schematu produktu. Procedura uznaje odchylenie za trwałe, gdy wszystkie odczyty z okna czasowego strefy leżą poza dopuszczalnym zakresem.

CREATE TABLE dbo.StrefaTemp (
    StrefaId             int          NOT NULL PRIMARY KEY,
    Nazwa                nvarchar(40) NOT NULL,
    TempMin              decimal(4,1) NOT NULL,
    TempMax              decimal(4,1) NOT NULL,
    MaxMinutPozaZakresem int          NOT NULL
);

CREATE TABLE dbo.OdczytTemp (
    StrefaId    int          NOT NULL REFERENCES dbo.StrefaTemp (StrefaId),
    CzasOdczytu datetime2(0) NOT NULL,
    Wartosc     decimal(4,1) NOT NULL,
    CONSTRAINT PK_OdczytTemp PRIMARY KEY (StrefaId, CzasOdczytu)
);
GO

CREATE PROCEDURE dbo.usp_BlokujPoOdchyleniu
    @StrefaId int
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @razem int, @poza int;

    SELECT @razem = COUNT(*),
           @poza  = SUM(CASE WHEN o.Wartosc < s.TempMin
                              OR o.Wartosc > s.TempMax THEN 1 ELSE 0 END)
    FROM dbo.OdczytTemp AS o
    JOIN dbo.StrefaTemp AS s ON s.StrefaId = o.StrefaId
    WHERE o.StrefaId = @StrefaId
      AND o.CzasOdczytu >= DATEADD(MINUTE, -s.MaxMinutPozaZakresem, SYSDATETIME());

    IF @razem > 0 AND @poza = @razem
        UPDATE sp SET StatusKod = 'KWARANTANNA'
        FROM dbo.StanPartii AS sp
        JOIN dbo.Lokacja AS l ON l.LokacjaId = sp.LokacjaId
        WHERE l.StrefaId = @StrefaId AND sp.StatusKod = 'DOSTEPNY';
END;

Okno czasowe eliminuje fałszywe alarmy. Otwarcie drzwi komory na kilka minut podnosi odczyt czujnika przy wejściu, ale nie oznacza utraty partii. Limit MaxMinutPozaZakresem jest więc parametrem strefy, a nie stałą w kodzie.

Reguła: alarm zależy od czasu trwania odchylenia, a nie od pojedynczego odczytu.

Progi ostrzegawcze i alarmowe

Dwa progi dają lepszą kontrolę niż jeden. Próg ostrzegawczy leży wewnątrz zakresu i powiadamia kierownika zmiany, gdy temperatura zbliża się do granicy. Próg alarmowy leży na granicy zakresu i uruchamia zmianę statusu partii. Powiadomienie trafia na terminal mobilny operatora.

Odczyty przechowuje się dłużej niż stany dzienne, bo służą jako dowód w sporze z dostawcą lub przewoźnikiem. Tabela odczytów rośnie szybko, dlatego jej klucz klastrowy zaczyna się od strefy i czasu, a starsze dane trafiają do partycji archiwalnych. Zasady partycjonowania opisuje dokumentacja Microsoft o tabelach i indeksach partycjonowanych.

Partie i terminy ważności w towarze wrażliwym

Stan magazynowy towaru z terminem ważności nie jest jedną liczbą. Jest zbiorem wierszy o kluczu: indeks, partia, lokacja. Każdy wiersz ma własny termin ważności i własny status. Wydanie wybiera wiersze według najkrótszego terminu (FEFO), a nie według daty przyjęcia (FIFO).

Przy przyjęciu system wymusza podanie partii i terminu, jeśli kartoteka oznacza indeks jako partyjny. Numer partii i termin trafiają na etykietę palety, a skanowanie etykiety przy odkładaniu i pobraniu wiąże fizyczną jednostkę z wierszem stanu. Zasady zapisu partii w ewidencji omawia tekst o partiach produkcyjnych w ewidencji magazynowej. Śledzenie tych samych partii w produkcji opisuje artykuł o traceability.

Karton z kodem QR na etykiecie identyfikującej partię towaru na tle regałów
Etykieta z kodem partii, którą skanuje się przy przyjęciu i odkładaniu; kod wiąże paletę z wierszem stanu.

Minimalny pozostały okres przydatności

Odbiorcy z sieci handlowych często wymagają, aby towar opuszczał magazyn z określonym minimalnym procentem okresu przydatności. Program porównuje termin ważności partii z datą planowanej wysyłki i odrzuca partie poniżej progu przy alokacji zlecenia. Próg jest parametrem odbiorcy, więc ta sama partia może być dostępna dla jednego klienta i niedostępna dla drugiego.

Partie zbliżające się do progu trafiają na listę sprzedaży priorytetowej. Lista jest wynikiem zapytania po dacie ważności, a nie ręcznego przeglądu półek. Zasady rotacji dla różnych grup asortymentu porównuje wspomniany wcześniej tekst o rozmieszczaniu towarów.

Blokady i statusy jakościowe zapasu

Status jakościowy jest polem wiersza stanu i decyduje, czy alokacja wydania może ten wiersz wziąć pod uwagę. Zapasy w kwarantannie i partie wstrzymane po odchyleniu temperatury pozostają w magazynie, ale nie biorą udziału w kompletacji. Przykładowy zestaw czterech statusów wystarcza w większości magazynów.

  • DOSTEPNY - wiersz uczestniczy w alokacji wydań.
  • KWARANTANNA - towar czeka na decyzję jakości; ruchy wewnętrzne są dozwolone, wydania nie.
  • ZABLOKOWANY - wstrzymanie po odchyleniu lub reklamacji; zmienić je może tylko rola z uprawnieniem jakościowym.
  • DO_UTYLIZACJI - towar wykluczony ze stanu dostępnego, czeka na dokument rozchodu.

Reguła: blokadę egzekwuje kod alokacji wydania w bazie, a nie ukrycie pozycji na ekranie terminala.

Zapytanie alokacji czyta głównie wiersze dostępne, więc opłaca się dla nich osobny indeks. Indeks filtrowany obejmuje tylko wiersze spełniające warunek i jest mniejszy od pełnego. Zapytanie musi zawierać identyczny warunek w treści, bo przy wartości przekazanej parametrem optymalizator może z indeksu nie skorzystać. Szczegóły opisuje dokumentacja indeksów filtrowanych.

CREATE NONCLUSTERED INDEX IX_StanPartii_Dostepne
ON dbo.StanPartii (KodTowaru, DataWaznosci)
INCLUDE (LokacjaId, Ilosc)
WHERE StatusKod = 'DOSTEPNY';
GO

CREATE PROCEDURE dbo.usp_ZmienStatusPartii
    @KodTowaru   varchar(30),
    @NumerPartii varchar(30),
    @NowyStatus  varchar(20),
    @Uzytkownik  sysname,
    @Powod       nvarchar(200)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    BEGIN TRANSACTION;

    UPDATE dbo.StanPartii
    SET StatusKod = @NowyStatus
    OUTPUT inserted.KodTowaru, inserted.NumerPartii,
           deleted.StatusKod, inserted.StatusKod,
           @Uzytkownik, @Powod, SYSDATETIME()
    INTO dbo.StatusLog (KodTowaru, NumerPartii, StatusPrzed, StatusPo,
                        Uzytkownik, Powod, Czas)
    WHERE KodTowaru = @KodTowaru AND NumerPartii = @NumerPartii;

    COMMIT TRANSACTION;
END;

Dziennik zmian powstaje w tej samej transakcji co zmiana statusu, dzięki klauzuli OUTPUT. Nie da się więc zmienić statusu bez śladu i nie da się zapisać śladu bez zmiany. Prawo do wywołania procedury przypisuje się rolom, jak w opisie ról i użytkowników w systemie WMS.

Towary ADR i segregacja w strefach

ADR reguluje przewóz drogowy towarów niebezpiecznych. W magazynie te same dane wejściowe, czyli klasa zagrożenia i numer UN, służą do zbudowania reguł segregacji, które obiekt ustala na podstawie przepisów pożarowych oraz karty charakterystyki. Numer UN jest czterocyfrowym identyfikatorem substancji lub grupy substancji. Klasy zagrożeń oznacza się numerami od 1 do 9.

Karta charakterystyki (SDS) ma szesnaście sekcji. Dla magazynu istotna jest sekcja 7 o postępowaniu i magazynowaniu oraz sekcja 14 z informacjami transportowymi, w której podano numer UN i klasę. Program przechowuje te wartości jako pola kartoteki, a sam plik SDS jako załącznik indeksu.

Para klas w jednej lokacjiPrzykładowy wynik regułyReakcja programu
Klasa 3 z klasą 3Dozwolone do limitu ilościOdkładanie z sumowaniem ilości w strefie
Klasa 3 z klasą 5.1Zakaz wspólnej lokacjiOdmowa na terminalu z przyczyną
Klasa 8 z klasą 3Wymaga decyzji osoby odpowiedzialnejOperacja czeka na zatwierdzenie
Klasa 9 z klasą 9DozwoloneOdkładanie bez dodatkowych kroków

Tabela pokazuje sposób zapisu reguł, a nie gotową macierz zgodności. Rzeczywiste wartości ustala osoba odpowiedzialna za bezpieczeństwo obiektu na podstawie przepisów i kart charakterystyki. Reguła ma trzy możliwe wyniki, a nie dwa. Oprócz dozwolone i zakaz istnieje wynik wymagający decyzji, na przykład inspektora bezpieczeństwa.

Limity ilości w strefie

Strefa ma także limit sumarycznej ilości substancji danej klasy. Przy odkładaniu program sumuje ilości w strefie i porównuje je z limitem, zanim potwierdzi lokację. Ta sama suma daje dane do raportu dla przeglądu przeciwpożarowego, bez ręcznego liczenia. Praktykę bezpieczeństwa w obiekcie opisuje tekst o bezpieczeństwie w magazynie.

Przykład wdrożenia dla magazynu substancji chemicznych, z wymianą danych z systemem klasy ERP, przedstawia materiał o wdrożeniu systemu WMS z integracją SAP dla magazynu chemicznego.

Terminal mobilny jako punkt kontroli

Wszystkie opisane reguły trafiają do pracownika przez terminal. Przy odkładaniu pracownik skanuje etykietę palety i etykietę lokacji. Aplikacja wysyła oba kody do serwera. Serwer sprawdza w jednej transakcji zgodność strefy oraz status partii, a potem segregację i limit, po czym odsyła zatwierdzenie albo odmowę.

Odmowa ma nieść przyczynę zapisaną w słowniku, na przykład brak zgodności strefy albo status kwarantanny. Sam komunikat o błędzie, bez przyczyny, prowadzi do tego, że pracownik odkłada towar w pierwszym wolnym miejscu i zgłasza problem dopiero po zmianie.

Pracownik w kamizelce odblaskowej omawia z zespołem towar na regałach paletowych w hali magazynowej
Odkładanie i pobranie pod kontrolą terminala: każdy skan przechodzi przez reguły strefy i statusu, a potem segregacji.

Wybór urządzeń i sposób pracy aplikacji opisują teksty o kolektorze danych Android WMS oraz o systemie WMS w mroźni. Chłodnia stawia terminalom dodatkowe wymagania. Bateria pracuje w niskiej temperaturze inaczej niż w hali ogólnej, a obsługa w rękawicach zmienia wymagania wobec klawiatury i ekranu.

Uruchomienie w magazynie o podwyższonych wymaganiach

Wdrożenie zaczyna się od inwentaryzacji tego, co już zainstalowano w obiekcie. Chodzi o czujniki oraz sterowniki chłodni. Analiza wskazuje strefy bez pomiaru i protokoły, którymi urządzenia się komunikują. W chłodniach stosuje się także mapowanie temperatury, czyli okresowy pomiar rozkładu temperatur w komorze, który wskazuje miejsca najcieplejsze i najzimniejsze.

Konfiguracja obejmuje cztery rodzaje parametrów, które powinny leżeć w tabelach konfiguracyjnych, a nie w kodzie procedur.

  • Strefy i limity czasu - zakresy temperatur oraz czas dopuszczalnego przekroczenia.
  • Progi alarmowe - wartości ostrzegawcze i graniczne, osobno dla każdej strefy.
  • Słowniki statusów - lista statusów wraz z regułami przejść między nimi.
  • Macierz segregacji - wyniki dla par klas zagrożeń i limity ilości.

Parametry ustawia administrator w panelu opisanym w tekście o konfiguracji programu Studio WMS.net. Testy przeprowadza się na jednej strefie, zanim reguły obejmą cały obiekt. Scenariusz testowy zawiera dwie próby wymuszenia błędu. Pierwsza to odłożenie towaru do niezgodnej strefy. Druga to wydanie partii w kwarantannie. Każda musi zakończyć się odmową.

Po teście rejestr odmów pokazuje, czy reguły działają w praktyce. Pusta lista odmów po tygodniu pracy nie oznacza sukcesu. Oznacza zwykle, że pracownicy obchodzą system poza terminalem.