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.
This commit is contained in:
@@ -11,7 +11,7 @@ use super::base::{BaseWorker, Worker, WorkerState};
|
|||||||
struct ArrivedTransport {
|
struct ArrivedTransport {
|
||||||
id: i32,
|
id: i32,
|
||||||
branch_id: i32,
|
branch_id: i32,
|
||||||
product_id: i32,
|
product_id: Option<i32>, // NULL für leere Transporte
|
||||||
size: i32,
|
size: i32,
|
||||||
vehicle_id: i32,
|
vehicle_id: i32,
|
||||||
distance: f64,
|
distance: f64,
|
||||||
@@ -163,12 +163,25 @@ impl TransportWorker {
|
|||||||
for row in rows {
|
for row in rows {
|
||||||
let id = parse_i32(&row, "id", -1);
|
let id = parse_i32(&row, "id", -1);
|
||||||
let branch_id = parse_i32(&row, "branch_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::<i32>().ok());
|
||||||
let size = parse_i32(&row, "size", 0);
|
let size = parse_i32(&row, "size", 0);
|
||||||
let vehicle_id = parse_i32(&row, "vehicle_id", -1);
|
let vehicle_id = parse_i32(&row, "vehicle_id", -1);
|
||||||
let distance = parse_f64(&row, "distance", 0.0);
|
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 {
|
result.push(ArrivedTransport {
|
||||||
id,
|
id,
|
||||||
branch_id,
|
branch_id,
|
||||||
@@ -184,10 +197,24 @@ impl TransportWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_arrived_transport(pool: &ConnectionPool, t: &ArrivedTransport) -> Result<(), DbError> {
|
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
|
// 1) Waren in das Ziel-Branch-Lager einbuchen – wir erhalten die
|
||||||
// tatsächlich verbleibende Menge im Transportmittel zurück.
|
// tatsächlich verbleibende Menge im Transportmittel zurück.
|
||||||
|
let product_id = t.product_id.unwrap();
|
||||||
let remaining_quantity =
|
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);
|
let delivered = t.size.saturating_sub(remaining_quantity);
|
||||||
|
|
||||||
@@ -214,7 +241,7 @@ impl TransportWorker {
|
|||||||
if let Err(err) = Self::insert_transport_waiting_notification(
|
if let Err(err) = Self::insert_transport_waiting_notification(
|
||||||
pool,
|
pool,
|
||||||
user_id,
|
user_id,
|
||||||
t.product_id,
|
product_id,
|
||||||
remaining_quantity,
|
remaining_quantity,
|
||||||
) {
|
) {
|
||||||
eprintln!(
|
eprintln!(
|
||||||
|
|||||||
Reference in New Issue
Block a user