From fbcea0925750dfc7344fa4fe2e89e49715b870ce Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 5 Dec 2025 14:06:22 +0100 Subject: [PATCH] Refactor transport handling in TransportWorker: Updated ArrivedTransport struct to allow optional product_id for empty transports. Enhanced validation logic to differentiate between normal and empty transports, improving handling and processing of transport data. Added specific handling for empty transports in the database operations, ensuring accurate vehicle updates and transport deletions. --- src/worker/transport.rs | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/worker/transport.rs b/src/worker/transport.rs index 48ed1e9..8da4ca4 100644 --- a/src/worker/transport.rs +++ b/src/worker/transport.rs @@ -11,7 +11,7 @@ use super::base::{BaseWorker, Worker, WorkerState}; struct ArrivedTransport { id: i32, branch_id: i32, - product_id: i32, + product_id: Option, // NULL für leere Transporte size: i32, vehicle_id: i32, distance: f64, @@ -163,12 +163,25 @@ impl TransportWorker { for row in rows { let id = parse_i32(&row, "id", -1); let branch_id = parse_i32(&row, "branch_id", -1); - let product_id = parse_i32(&row, "product_id", -1); + // product_id kann NULL sein (für leere Transporte) + let product_id_str = row.get("product_id"); + let product_id = product_id_str + .and_then(|v| v.parse::().ok()); let size = parse_i32(&row, "size", 0); let vehicle_id = parse_i32(&row, "vehicle_id", -1); let distance = parse_f64(&row, "distance", 0.0); - if id >= 0 && branch_id >= 0 && product_id >= 0 && vehicle_id >= 0 && size > 0 { + // Für normale Transporte: product_id muss vorhanden sein und size > 0 + // Für leere Transporte: product_id ist NULL und size = 0 + let is_valid = if product_id.is_some() { + // Normaler Transport mit Produkt + id >= 0 && branch_id >= 0 && vehicle_id >= 0 && size > 0 + } else { + // Leerer Transport (ohne Produkt) + id >= 0 && branch_id >= 0 && vehicle_id >= 0 && size == 0 + }; + + if is_valid { result.push(ArrivedTransport { id, branch_id, @@ -184,10 +197,24 @@ impl TransportWorker { } fn handle_arrived_transport(pool: &ConnectionPool, t: &ArrivedTransport) -> Result<(), DbError> { + // Leere Transporte (ohne Produkt) werden anders behandelt + if t.product_id.is_none() { + // Leerer Transport: Nur Fahrzeug-Region aktualisieren und Transport löschen + eprintln!( + "[TransportWorker] Leerer Transport {} angekommen: Fahrzeug {} zurückgeholt", + t.id, t.vehicle_id + ); + Self::update_vehicle_after_transport(pool, t.vehicle_id, t.branch_id, t.distance)?; + Self::delete_transport(pool, t.id)?; + return Ok(()); + } + + // Normaler Transport mit Produkt: // 1) Waren in das Ziel-Branch-Lager einbuchen – wir erhalten die // tatsächlich verbleibende Menge im Transportmittel zurück. + let product_id = t.product_id.unwrap(); let remaining_quantity = - Self::add_to_inventory(pool, t.branch_id, t.product_id, t.size)?; + Self::add_to_inventory(pool, t.branch_id, product_id, t.size)?; let delivered = t.size.saturating_sub(remaining_quantity); @@ -214,7 +241,7 @@ impl TransportWorker { if let Err(err) = Self::insert_transport_waiting_notification( pool, user_id, - t.product_id, + product_id, remaining_quantity, ) { eprintln!(