1. Modello di simulazione delle operazioni di magazzino

Nel nostro script Python, replicheremo diversi processi di warehousing dal punto di vista dello scambio di messaggi EDI

  • Messaggi di spedizione in entrata contenenti dettagli come SKU e quantità
  • Conferme di stoccaggio con SKU e posizioni di stoccaggio

Operazioni logistiche — (Immagine dell’autore)

Questi messaggi abilitano il ERP E Sistemi di gestione del magazzino (WMS) sincronizzazione, guida l’efficienza e riduce gli errori.

  • Messaggio 1: informare i team del magazzino che una spedizione è in arrivo tramite il WMS (ERP -> WMS)
  • Messaggio 2: i team del magazzino informano il team di pianificazione della distribuzione che il pallet è stato messo in stock ed è pronto per essere ordinato (WMS -> ERP)

2. Costruisci un modello di simulazione con Python

Simuliamo questi scambi di messaggi utilizzando la norma EDI ANSI X12

  1. In entrata: la merce viene ricevuta in magazzino
    Un messaggio EDI (Ordine di spedizione magazzino — 940) notifica al magazzino una spedizione in arrivo e i suoi dettagli.
  2. Putaway: dopo la ricezione, la merce viene immagazzinata in un luogo specifico
    Un messaggio EDI di conferma (Avviso di ricevimento trasferimento stock magazzino – 944) viene restituito all’ERP per confermare lo stoccaggio.
  3. Prelievo: per un ordine, gli articoli vengono prelevati dalle ubicazioni di stoccaggio
    Questo messaggio EDI (Ordine di spedizione magazzino — 940) può essere utilizzato per istruire il magazzino su quali articoli prelevare.
  4. Outbound: spedizione al cliente
    Un messaggio EDI (Avviso di spedizione magazzino — 945) viene inviato all’ERP per confermare che la merce è stata spedita.

Ecco la versione semplificata dello script Python,

# Author: Samir Saci
# Note: this script has been simplified for educational purposes.

class EDIMessage:
def __init__(self, message_id):
self.message_id = message_id
self.content = ""

def add_segment(self, segment):
self.content += segment + "\n"

def get_message(self):
return f"ST*{self.message_id}*1\n{self.content}SE*2*1"

class Warehouse:
def __init__(self):
self.inventory = {}

def receive_inbound(self, message):
lines = message.content.split("\n")
for line in lines:
if line.startswith("N1"):
_, _, sku, quantity, unit = line.split("*")
self.inventory(sku) = self.inventory.get(sku, 0) + int(quantity)
print("Received Inbound Shipment:\n", message.content)

def process_putaway(self, sku):
message = EDIMessage("944")
if sku in self.inventory:
message.add_segment(f"N1*ST*{sku}*{self.inventory(sku)}*units")
print("Putaway Confirmation:\n", message.get_message())
return message
else:
print("SKU not found in inventory.")

def process_picking(self, message):
lines = message.content.split("\n")
for line in lines:
if line.startswith("N1"):
_, _, sku, quantity, unit = line.split("*")
if self.inventory(sku) >= int(quantity):
self.inventory(sku) -= int(quantity)
else:
print(f"Insufficient quantity for SKU {sku}")
print("Processed Picking Order:\n", message.content)

def process_outbound(self, picking_message):
message = EDIMessage("945")
lines = picking_message.content.split("\n")
for line in lines:
if line.startswith("N1"):
_, _, sku, quantity, unit = line.split("*")
message.add_segment(f"N1*ST*{sku}*{quantity}*boxes")
print("Outbound Shipment Confirmation:\n", message.get_message())
return message

Avvia il modello e crea il tuo ordine in entrata

  • 2 SKU diversi ricevuti in cartoni
  • {Qtà 1: 50 scatole, Qtà 2: 40 scatole}
# Initiate the model
warehouse = Warehouse()

# Inbound Process
inbound_message = EDIMessage("940")
inbound_message.add_segment("N1*ST*SKU123*50*boxes")
inbound_message.add_segment("N1*ST*SKU124*40*boxes")
warehouse.receive_inbound(inbound_message)
print("Inventory of {}: {} boxes".format("SKU123",warehouse.inventory("SKU123")))
print("Inventory of {}: {:,} boxes".format("SKU124",warehouse.inventory("SKU124")))

E l’output è simile a questo,

N1*ST*SKU123*50*boxes
N1*ST*SKU124*40*boxes

Inventory of SKU123: 50 boxes
Inventory of SKU124: 40 boxes

  • I due messaggi che sono stati trasmessi
  • Le scorte degli articoli ricevuti sono state aggiornate con la quantità ricevuta

Conferma di putaway

# Putaway Process
warehouse.process_putaway("SKU123")
  • Questo messaggio invia una conferma di stoccaggio per “SKU123”
ST*944*1
N1*ST*SKU123*50*units
SE*2*1

Picking ordini e spedizioni in uscita

  • I due SKU vengono prelevati con quantità inferiori al livello di inventario
# Picking Process (Picking goods for an order)
picking_message = EDIMessage("940")
picking_message.add_segment("N1*ST*SKU123*10*boxes")
picking_message.add_segment("N1*ST*SKU124*5*boxes")
warehouse.process_picking(picking_message)
print("Inventory of {}: {} boxes".format("SKU123",warehouse.inventory("SKU123")))
print("Inventory of {}: {:,} boxes".format("SKU124",warehouse.inventory("SKU124")))

# Outbound Process (Sending out goods)
warehouse.process_outbound()

Produzione,

N1*ST*SKU123*10*boxes
N1*ST*SKU124*5*boxes

Inventory of SKU123: 40 boxes
Inventory of SKU124: 35 boxes

ST*945*1
N1*ST*SKU123*10*boxes
N1*ST*SKU124*5*boxes
SE*2*1

  • 2 ordini di prelievo da 10 e 5 scatole per “SKU123” e “SKU124”
  • L’inventario è stato aggiornato
  • Gli ordini in uscita stanno prendendo le quantità prelevate

Rilevamento e gestione degli errori

Non abbiamo introdotto questo modello al solo scopo di codifica.

L’idea è capire come possiamo creare vari controlli per gestire gli errori durante la scrittura o la lettura dei messaggi.

L’EDI non è esente da problemi di qualità dei dati come

  • Dati mancanti, formato dati errato, codici non validi,…
  • Incoerenze logiche che causano significative interruzioni operative

Pertanto, l’implementazione di solidi controlli e convalide dei dati è fondamentale per garantire l’accuratezza e l’affidabilità dello scambio elettronico di dati.

Esempio di gestione degli errori per la ricezione degli ordini

def receive_inbound(self, message):
lines = message.content.split("\n")
for line in lines:
if line.startswith("N1"):
try:
_, _, sku, quantity, unit = line.split("*")

# SKU or quantity is missing
if not sku or not quantity:
print("Error: SKU or quantity missing.")
return

# Quantity is an integer
quantity = int(quantity)

# Negative or zero quantities
if quantity <= 0:
print("Error: Quantity must be positive.")
return

self.inventory(sku) = self.inventory.get(sku, 0) + quantity
except ValueError:
print("Error: Incorrect data format.")
return

print("Received Inbound Shipment:\n", message.content)

Questo pezzo di codice è:

  • Verifica se le quantità mancano o non sono nel formato intero
  • Verificare che tutte le quantità siano positive
  • Genera un errore se necessario

Con Python puoi supportare il tuo team dell’infrastruttura nell’automazione dei test per lo sviluppo di nuovi messaggi EDI.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *