Przejdź do głównej zawartości

Model zapasu

Cała magazynowa połowa Stockly stoi na jednym kształcie wiersza. Po jego zrozumieniu lista endpointów przestaje wyglądać na przypadkową.

Ilość mieszka w p2lab_stockly_warehouse_stock, a kluczem jest magazyn + bin + produkt:

PoleZnaczenie
warehouseIdktóry węzeł to trzyma
binLocationIdktóre miejsce w tym węźle
productIdktóry artykuł
stockile fizycznie tam stoi
reservedile z tego zamówienia już sobie przypisały

Zapas bez miejsca nie istnieje. Towar położony „nigdzie” trafia na bin unassigned danego magazynu, na prawdziwy wiersz z prawdziwym identyfikatorem, tworzony przy pierwszym użyciu. Każde wywołanie API z binLocationId: null rozwiązuje ten bin, zanim cokolwiek zrobi. Dlatego zdjęcie towaru „bez binu” bierze go dokładnie stamtąd, gdzie położyło go dodanie z null.

reserved to bufor pochodny. Prawdą o tym, co przypisało zamówienie, jest p2lab_stockly_reservation_line — jeden wiersz na pozycję zamówienia i miejsce. Zapis reserved bez zapisu linii rozsuwa te dwie liczby, a kontrola spójności ma na to osobne znalezisko.

Bin bez roli to zwykły bin magazynowy, jedyny, w który celuje odkładanie towaru. Pięć ról poniżej to bufory, po najwyżej jednym każdego rodzaju na magazyn:

RolaTrzymaLiczy się jako dostępne
receivingtowar z przyjęcia zamówienia zakupu, przed odłożeniemtak — jest w budynku
quarantinetowar przyjęty pod kontrolę jakości, czekający na ocenęnie
transittowar skompletowany do wysyłki międzymagazynowejnie
returnstowar wrócony od klienta, czekający na decyzjęnie
unassignedzapas księgowy, który nigdy nie został fizycznie położonytak

Jeden z nich jest zamknięty dla zwykłych wywołań. Bin transit napełnia się, gdy przewóz wyrusza, i opróżnia, gdy dojedzie albo zostanie anulowany; operacja add, remove czy move wskazująca go jako którykolwiek koniec jest odrzucana — ręcznie dołożona sztuka zablokowałaby przewóz, który uważa ten towar za swój.

returns celowo nie jest tą samą pulą co quarantine, a dla integracji różnica jest istotna: towaru w returns nie da się sprzedać. Nasłuchujący, który potraktuje przyjęty zwrot jako „zapas wrócił”, doprowadzi do nadsprzedaży; dostępność zmienia się dopiero wtedy, gdy ktoś zdecyduje o zwrocie i odeśle sztuki na półkę.

product.stock = SUMA(stock - reserved) po każdym binie, którego rola liczy się jako dostępna

product.stock jest wynikiem. Stockly przelicza go po każdej operacji i nadpisuje to, co tam zastanie. Zapis tego pola z zewnątrz nie jest ścieżką integracji; to awaria, którą wyłapuje strażnik obcych zapisów.

Rejestr ruchów działa odwrotnie: p2lab_stockly_warehouse_stock_movement jest tylko do dopisywania. Nic nie edytuje istniejącego wiersza; korekta to nowy wiersz z własnym typem. To właśnie sprawia, że historia potrafi odpowiedzieć: pytanie, dlaczego w danym binie leżą cztery sztuki, ma odpowiedź zbudowaną z wierszy, a nie z bieżącej wartości.

Ruch niesie oba końce i oba stany:

GrupaPola
Cotype, quantity, productId, batchId, lotId, batchNumber, expiresAt
SkądsourceWarehouseId, sourceBinLocationId, sourceBinLpCode
DokądtargetWarehouseId, targetBinLocationId, targetBinLpCode
Przed / posourceStockBefore, sourceStockAfter, sourceReservedBefore, sourceReservedAfter, targetStockBefore, targetStockAfter
Dlaczegocomment, event, reasonCode, meta, userId, userName
Jaki dokumentorderId, orderLineItemId, purchaseOrderId, purchaseOrderItemId, transferId, operationId, importId

Kierunek siedzi w końcach, nigdy w znaku: przyjęcie nie ma źródła, wydanie nie ma celu, przewóz ma oba. quantity jest zawsze dodatnie.

Cztery nazwy, które brzmią podobnie, a odpowiadają na różne pytania:

EncjaOdpowiada na
p2lab_stockly_warehouse_stock_batchile z ilości w tym binie ma który numer partii i termin — prawda operacyjna, przeciw której działa wydanie
p2lab_stockly_stock_lottożsamość lotu w całej sieci
p2lab_stockly_stock_lot_placementgdzie ten lot obecnie leży i na jakim nośniku
p2lab_stockly_handling_unitnośnik (LP): paleta albo karton, na którym towar jeździ i który może być włożony w inny

Partie decydują o tym, co konsumuje wydanie. Loty i umiejscowienia to lustro prowadzone obok nich, dzięki któremu jeden lot da się prześledzić przez biny i magazyny jednym zapytaniem. Operacja zapisuje jedno i drugie; od wywołującego nikt tego nie wymaga.

EncjaTrzyma
p2lab_stockly_warehousejeden węzeł: jego kod i polityki
p2lab_stockly_warehouse_bin_locationjedno miejsce: kod, współrzędne, pojemność, rola
p2lab_stockly_warehouse_stockwiersz ilości opisany wyżej
p2lab_stockly_warehouse_stock_batchpodział tego wiersza na partie
p2lab_stockly_warehouse_stock_movementrejestr ruchów
p2lab_stockly_handling_unitnośniki
p2lab_stockly_stock_lot / …_stock_lot_placementtożsamość lotu i miejsce, w którym leży
p2lab_stockly_reservation_lineco przypisało zamówienie, per miejsce
p2lab_stockly_order_allocationco jest zamówieniu należne i skąd jest brane
p2lab_stockly_external_stock_incidentobce zapisy product.stock, które strażnik złapał

To zwykłe encje Shopware, więc /api/search/p2lab-stockly-warehouse-stock i pokrewne działają dokładnie tak, jak wszędzie indziej.