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
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
- 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. - 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. - 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. - 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*boxesInventory 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*boxesInventory 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.