Magazyn firmy produkcyjnej obsługuje dwa przepływy, które przecinają się na hali. Surowce płyną z magazynu na linię, a wyroby gotowe wracają z linii do magazynu. Każdy przepływ ma inny rytm i inne ryzyka. System do magazynu musi rozpoznawać, z którym z nich ma do czynienia w danej chwili.

Ten tekst opisuje oba przepływy od strony dokumentów oraz transakcji w bazie. Dokumenty magazynowe omawia szerzej tekst o dokumentach magazynowych, a różnice między nimi wyjaśnia materiał o pięciu podstawowych dokumentach magazynowych.

System do magazynu a dwa przepływy produkcyjne

Firma produkcyjna kupuje surowce, a po ich przetworzeniu sprzedaje wyroby. W magazynie każdy z tych kroków zostawia dokument, a wszystkie zestawia tabela poniżej. Wysyłkę do klienta i jej zasady opisuje tekst o wydaniu z magazynu.

DokumentKierunekKto go inicjujeCo sprawdza system
PZDostawca do magazynu surowcówMagazynier przy rozładunkuZgodność z zamówieniem zakupu oraz dane partii
RWMagazyn surowców do produkcjiZlecenie produkcyjneDostępność partii, status jakościowy, zgodność ze składnikami zlecenia
PWProdukcja do magazynu wyrobówZgłoszenie ze zleceniaIlość względem zlecenia, numer partii wyrobu
WZMagazyn wyrobów do klientaZamówienie sprzedażyRezerwacja, rotacja FEFO, zgodność z wymaganiami odbiorcy
MMMiędzy magazynamiKierownik magazynu lub zlecenie uzupełnieniaStan w magazynie źródłowym, lokacja docelowa

Magazyny wielopoziomowe w zakładzie

Zakład rzadko ma jeden magazyn. Zwykle działają trzy poziomy, opisane jako osobne obszary w bazie. Pierwszy to surowce, drugi to bufor przy linii, trzeci to wyroby gotowe. Wydanie z magazynu surowców do przyprodukcyjnego nie zużywa jeszcze towaru. Zużycie następuje dopiero, gdy produkcja go pobierze lub gdy system rozliczy je wstecz.

Taki podział pozwala odróżnić surowiec, który czeka, od surowca w produkcji w toku. Ten drugi ma osobny stan i nie wchodzi do alokacji sprzedaży, choć księgowo pozostaje własnością firmy.

Lokacje przy linii wymagają własnych reguł. Bufor przy stanowisku ma niewielką pojemność i limit czasu, po którym niewykorzystany surowiec wraca do magazynu głównego. Reguła zapobiega sytuacji, w której towar wydany na zlecenie sprzed tygodnia leży przy maszynie, a system uznaje go za zużyty. Lokacje buforowe mają w bazie typ różny od regałowych, więc alokacja sprzedaży nigdy ich nie bierze pod uwagę.

Wydanie surowców na zlecenie produkcyjne

Zlecenie produkcyjne rozwija się na składniki według wykazu materiałowego. Dla każdego składnika system liczy zapotrzebowanie jako iloczyn ilości na sztukę i liczby sztuk zlecenia. Następnie tworzy listę wydań, na której partie dobrane są według reguły rotacji. Zasady doboru opisuje tekst o programie do magazynowania towarów.

Wydanie surowca na produkcję jest operacją, w której błąd kosztuje dwa razy: raz w stanie magazynu, drugi raz w kosztach zlecenia. Potwierdzenie takiego wydania zamyka więc w jednej transakcji trzy zmiany. Stan partii maleje, powstaje ruch w historii, a zlecenie odnotowuje zużycie.

CREATE PROCEDURE dbo.usp_PotwierdzWydanieRW
    @ZlecenieId  int,
    @KodTowaru   varchar(30),
    @NumerPartii varchar(30),
    @LokacjaId   int,
    @Ilosc       decimal(18,3)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    BEGIN TRANSACTION;

    UPDATE dbo.StanPartii
    SET Ilosc = Ilosc - @Ilosc
    WHERE KodTowaru = @KodTowaru AND NumerPartii = @NumerPartii
      AND LokacjaId = @LokacjaId AND Ilosc >= @Ilosc;

    IF @@ROWCOUNT = 0
        THROW 50001, 'Stan partii w lokacji jest niższy niż ilość wydania.', 1;

    INSERT dbo.RuchLog (ZlecenieId, KodTowaru, NumerPartii, LokacjaId, TypRuchu, Ilosc)
    VALUES (@ZlecenieId, @KodTowaru, @NumerPartii, @LokacjaId, 'RW', -@Ilosc);

    UPDATE dbo.ZlecenieSkladnik
    SET IloscWydana = IloscWydana + @Ilosc
    WHERE ZlecenieId = @ZlecenieId AND KodTowaru = @KodTowaru;

    COMMIT TRANSACTION;
END;

Reguła: stan zmniejsza warunek w samym poleceniu UPDATE, a nie sprawdzenie w osobnym SELECT, bo między odczytem a zapisem inny użytkownik mógłby zabrać ten sam towar.

Opcja XACT_ABORT sprawia, że każdy błąd wykonania cofa całą transakcję, a instrukcja THROW zgłasza własny błąd z komunikatem dla aplikacji terminala. Nazwy tabel i kolumn w przykładzie są umowne i nie opisują schematu żadnego produktu.

Rezerwacja partii pod zlecenie

Zwolnienie zlecenia do produkcji rezerwuje partie surowców, zanim ktokolwiek je pobierze. Rezerwacja zmniejsza stan dostępny dla innych zleceń, ale nie zmienia stanu fizycznego. Dzięki temu dwa zlecenia planowane na ten sam dzień nie obiecują sobie tej samej partii. Zapas z terminem ważności rezerwuje się w kolejności FEFO, więc najkrótsze terminy trafiają do zleceń najbliższych w harmonogramie.

Bywa, że planowana partia jest niedostępna, na przykład z powodu kwarantanny. System proponuje wtedy zamiennik z innej partii tego samego składnika i zapisuje zmianę w historii zlecenia. Zamiana partii nie wymaga nowego zlecenia, ale wymaga zgody, jeśli receptura ogranicza dopuszczalne partie.

Zwrot nadwyżki i zużycie ponad normę

Rzeczywistość rzadko pokrywa się z normą. Produkcja zwraca niewykorzystany surowiec albo pobiera dodatkowy z powodu odpadu. Oba przypadki mają własne dokumenty: zwrot z produkcji zwiększa stan magazynu i zmniejsza zużycie zlecenia, a wydanie uzupełniające zwiększa zużycie ponad normę i wymaga powodu z listy.

Powody odpadu zapisane w słowniku, a nie w polu tekstowym, pozwalają później policzyć, które składniki są tracone najczęściej. Zlecenie, na którym zużycie przekracza normę o ustalony margines, trafia do przeglądu technologa.

Dwie pracownice pakują towar w folię przy paletach w strefie wydań magazynu
Wydanie surowców i wyrobów na hali: każde potwierdzenie skanem zamyka transakcję zmieniającą stan i zlecenie.

Przyjęcie wyrobu gotowego z produkcji

Przyjęcie z produkcji zaczyna się na linii, a nie przy rampie. Pracownik zgłasza ilość wyrobu ze zlecenia, system nadaje numer partii wyrobu i drukuje etykietę palety. Etykieta niesie kod GS1 z numerem SSCC, który identyfikuje jednostkę logistyczną w całym łańcuchu dostaw. Budowę etykiety opisuje tekst o etykiecie logistycznej GS1.

Numer SSCC ma osiemnaście cyfr, a ostatnia jest cyfrą kontrolną liczoną z poprzednich siedemnastu. Obliczenie jest proste, więc system może je wykonać w bazie i odrzucać błędnie wpisane numery. Poniższa funkcja pokazuje algorytm.

CREATE FUNCTION dbo.fn_SsccCyfraKontrolna (@dane char(17))
RETURNS tinyint
AS
BEGIN
    DECLARE @i int = 1, @suma int = 0;
    WHILE @i <= 17
    BEGIN
        -- pozycje nieparzyste liczone od prawej mają wagę 3, parzyste wagę 1
        SET @suma += CAST(SUBSTRING(@dane, @i, 1) AS int)
                     * CASE WHEN (18 - @i) % 2 = 1 THEN 3 ELSE 1 END;
        SET @i += 1;
    END;
    RETURN (10 - @suma % 10) % 10;
END;

Data ważności wyrobu wynika z daty produkcji i okresu przydatności zapisanego w kartotece. System liczy ją przy przyjęciu i drukuje na etykiecie, więc pracownik nie wpisuje jej ręcznie. Zapis w kartotece pozwala też odrzucić zgłoszenie, w którym data produkcji leży w przyszłości, co zdarza się przy błędnie ustawionym zegarze urządzenia.

Drukarka etykiet drukująca etykietę logistyczną w strefie przyjęcia wyrobów z produkcji
Etykieta palety drukowana przy zgłoszeniu wyrobu ze zlecenia; kod na etykiecie wiąże paletę z partią i zleceniem.

Status kontroli jakości po przyjęciu

Wyrób z linii nie musi być od razu dostępny dla sprzedaży. Jeśli proces wymaga kontroli jakości, dokument PW nadaje partii status kwarantanny, a zwolnienie następuje po decyzji kontrolera. Do tego czasu paleta leży w magazynie, ale alokacja wydań jej nie widzi. Mechanizm statusów opisano w tekście o programie do magazynowania w chłodni i przy towarach ADR, a proces kontroli w tekście o kontroli jakości w systemie produkcyjnym.

Produkcja zostawia też odpady i wyroby uboczne. Wyrób uboczny, na przykład skrawki nadające się do sprzedaży, dostaje własny indeks i dokument PW z tego samego zlecenia. Odpad trafia na osobną lokację o statusie do utylizacji, a jego ilość obciąża zlecenie jako strata. Bez tego rozdziału różnica między surowcem wydanym a wyrobem przyjętym nie ma wyjaśnienia w dokumentach.

Przyjęcie bywa częściowe. Zlecenie na tysiąc sztuk kończy się kilkoma paletami zgłaszanymi w ciągu zmiany, więc jedno zlecenie tworzy kilka dokumentów PW. System zamyka zlecenie dopiero po potwierdzeniu przez technologa lub po osiągnięciu zadanej ilości z tolerancją.

Produkcja w toku i rozliczenie wsteczne

Między wydaniem surowca a przyjęciem wyrobu towar żyje w produkcji w toku. Istnieją dwie metody rejestrowania jego zużycia, które różnią się momentem powstania dokumentu RW.

MetodaKiedy powstaje RWZaletaRyzyko
Zużycie rejestrowanePrzy każdym pobraniu na haliAktualny stan produkcji w tokuWięcej skanów, ryzyko pominięcia zgłoszenia
Rozliczenie wstecznePrzy zgłoszeniu ilości wyrobuMało skanów na haliZależność od dokładności wykazu materiałowego

Półprodukty komplikują ten obraz. Wyrób jednego zlecenia bywa surowcem drugiego, na przykład mieszanka przygotowana na pierwszej zmianie i zużyta na drugiej. Półprodukt dostaje wtedy własną kartotekę, dokument PW z pierwszego zlecenia i dokument RW na drugie. Numer partii półproduktu przechodzi do tabeli zużycia, więc łańcuch identyfikowalności nie urywa się na etapie pośrednim.

Rozliczenie wsteczne mnoży ilość zgłoszonego wyrobu przez normy z wykazu materiałowego i generuje RW dla każdego składnika. Sprawdza się przy składnikach tanich i masowych, na przykład opakowaniach. Drogie surowce lepiej rejestrować bezpośrednio, bo różnica między normą a rzeczywistością jest wtedy kosztowna. Zasady wykazów opisuje tekst o emisji zleceń produkcyjnych.

Partie i identyfikowalność w produkcji

Identyfikowalność wymaga połączenia dwóch numerów: partii surowca i partii wyrobu. Łączy je tabela zużycia partii, wypełniana przy każdym RW lub przy rozliczeniu wstecznym. Wystarczy jedno zapytanie, aby po wykryciu wadliwej partii surowca wskazać wyroby do wycofania.

SELECT DISTINCT w.NumerPartiiWyrobu, w.KodWyrobu
FROM dbo.ZuzyciePartii AS z
JOIN dbo.PartiaWyrobu AS w ON w.ZlecenieId = z.ZlecenieId
WHERE z.KodSurowca = @KodSurowca
  AND z.NumerPartiiSurowca = @NumerPartii;

Zapytanie w drugą stronę, od partii wyrobu do partii surowców, obsługuje reklamację klienta. Oba kierunki korzystają z tego samego zapisu, więc nie wymagają osobnych danych. Zasady ewidencji partii opisano w tekście o partiach produkcyjnych w ewidencji magazynowej.

Wiarygodność takiego zapytania sprawdza się w ćwiczeniu wycofania. Wybiera się jedną partię surowca i mierzy czas, w jakim system wskaże wszystkie wyroby oraz odbiorców, do których trafiły. Wynik zależy od kompletności zapisów: jeśli część zużycia rozliczono zbiorczo, zapytanie zwraca zbyt szeroką listę i trzeba wycofać więcej towaru, niż wymagałaby sytuacja. Ćwiczenie ujawnia takie luki, zanim pojawi się rzeczywista reklamacja.

Wymiana danych z planowaniem produkcji

Zlecenia produkcyjne powstają zwykle w systemie ERP lub w module planowania, a magazyn je wykonuje. System do magazynu odbiera zlecenie z listą składników i zwraca potwierdzenia wydanych ilości oraz przyjętych wyrobów. Wymiana odbywa się przez usługę REST lub kolejkę, a nie przez bezpośredni zapis do tabel drugiego systemu.

Ważna jest idempotentność. Ponowione potwierdzenie, na przykład po przerwaniu łączności, nie może utworzyć drugiego dokumentu PW. Zapewnia to unikalny klucz identyfikatora komunikatu w tabeli potwierdzeń, opisany w dokumentacji ograniczeń unikalności. Drugi zapis kończy się błędem klucza, który aplikacja odbiera jako sygnał, że komunikat został już przetworzony.

Reguła: każdy komunikat ma identyfikator, a jego powtórzenie nie zmienia stanu magazynu.

Drugim zagadnieniem jest kolejność zdarzeń. Potwierdzenie przyjęcia wyrobu może dotrzeć do ERP przed potwierdzeniem ostatniego wydania surowca, jeśli oba wysłano z różnych urządzeń. System odbiorczy powinien więc opierać się na znacznikach czasu i numerach dokumentów, a nie na kolejności nadejścia. Komunikaty niezgodne z aktualnym stanem zlecenia trafiają do kolejki błędów, którą przegląda administrator, a nie do cichego odrzucenia.

Ogólne zasady łączenia systemów przedstawia tekst o integracji systemów magazynowych, a rolę ERP w produkcji omawia artykuł o oprogramowaniu ERP w produkcji.

Uruchomienie magazynu w zakładzie produkcyjnym

Wdrożenie zaczyna się od odwzorowania przepływów na dokumenty i lokacje. Trzy poziomy magazynów opisuje się jako osobne obszary z własnymi regułami przyjęć i wydań. Statusy jakościowe i słowniki powodów odpadu definiuje się przed pierwszym zleceniem, bo późniejsza zmiana słowników wymaga przeliczenia historii.

  1. Odwzorowanie przepływów - trzy poziomy magazynów zapisane jako osobne obszary z własnymi regułami.
  2. Słowniki - statusy jakościowe i powody odpadu ustalone przed pierwszym zleceniem.
  3. Test bilansu - przejście kilku zleceń przez cały cykl i porównanie sum dokumentów.
  4. Praca równoległa - krótki okres, w którym nowy system i dotychczasowa ewidencja działają obok siebie.

Test odbiorczy opiera się na bilansie materiałowym. Dla jednego surowca suma przyjęć minus suma zużycia minus stan końcowy powinna wynosić zero, z dokładnością do udokumentowanych ubytków. Różnica wskazuje miejsce, w którym dokument nie powstał albo powstał dwa razy. Test przeprowadza się na dwóch zleceniach: jednym z pełnym przyjęciem, drugim z przyjęciem częściowym i zwrotem nadwyżki.

Po wdrożeniu porównuje się stan systemowy ze stanem policzonym w cyklicznej inwentaryzacji, opisanej w tekście o inwentaryzacji w magazynie. Rozbieżność większa od normy oznacza powtórne liczenie strefy, a nie korektę na oko.