| Problem: | Keine integrierte Lösung für Fahrzeugbeladung und Tourenplanung in Odoo |
| Lösung: | LKW und Anhänger als "mobile Lager" mit vollständiger Bestandsverwaltung |
| Kernfunktion: | Drag & Drop Beladungsplanung mit Echtzeit-Kapazitätsüberwachung |
disposition.order
fleet.vehicle (erweitert)
stock.picking (erweitert)
stock.location (erweitert)
# Model Inheritance
_inherit = 'fleet.vehicle'
# Computed Fields → Automatische Neuberechnung
@api.depends('assigned_picking_ids')
# Domain Filter → Dynamische Filterung
domain="[('is_mobile_warehouse', '=', True)]"
📍 Navigation: Disposition → Fahrzeug Beladung
<kanban default_group_by="vehicle_id"
class="o_vehicle_loading_kanban"
js_class="vehicle_loading_kanban">
<progressbar field="vehicle_loading_status"
colors="{ok: success, warning: warning, overloaded: danger}"/>
</kanban>
export class VehicleLoadingKanbanRenderer extends KanbanRenderer {
// Lädt Fahrzeugdaten nach jeder Änderung
onWillUpdateProps(async () => {
await this.loadVehicleData();
});
// CSS-Klassen basierend auf Auslastung
getGroupClasses(group) {
if (vehicle.is_overloaded) return "o_vehicle_overloaded";
if (vehicle.weight_utilization > 80) return "o_vehicle_warning";
}
}
@api.depends('assigned_picking_ids.shipping_weight',
'assigned_picking_ids.shipping_volume')
def _compute_picking_stats(self):
for vehicle in self:
# Summe aller zugewiesenen Pickings
total_weight = sum(p.shipping_weight for p in vehicle.assigned_picking_ids)
# Berechnung Restkapazität
vehicle.remaining_weight_capacity = vehicle.effective_max_weight_capacity - total_weight
# Überladung prüfen
vehicle.is_overloaded = vehicle.remaining_weight_capacity < 0
/* Roter Header bei Überladung */
.o_vehicle_overloaded .o_kanban_header {
background-color: #dc3545 !important;
}
/* Pulsier-Animation als Warnung */
.o_vehicle_overloaded {
animation: pulse-danger 2s infinite;
}
@keyframes pulse-danger {
0%, 100% { box-shadow: 0 0 0 0 rgba(220,53,69,0.4); }
50% { box-shadow: 0 0 0 10px rgba(220,53,69,0); }
}
# Effektive Kapazität = Eigene + Anhänger
effective_max_weight_capacity = fields.Float(
compute='_compute_effective_capacity'
)
@api.depends('attached_trailer_id', 'max_weight_capacity')
def _compute_effective_capacity(self):
for vehicle in self:
base = vehicle.max_weight_capacity
trailer_cap = vehicle.attached_trailer_id.max_weight_capacity or 0
vehicle.effective_max_weight_capacity = base + trailer_cap
<header>
<button name="action_confirm" string="Bestätigen"
invisible="state != 'draft'"/>
<field name="state" widget="statusbar"
statusbar_visible="draft,confirmed,in_progress,done"/>
</header>
<!-- Zeilen mit visueller Dekoration -->
<list decoration-success="stop_status == 'done'"
decoration-warning="stop_status == 'in_progress'">
| Schicht | Technologie | Zweck |
|---|---|---|
| Frontend | OWL Framework | Reaktive UI-Komponenten |
| Styling | CSS3 + SCSS | Animationen, Farbcodes |
| JavaScript | ES6 Modules | Kanban-Erweiterung |
| Backend | Python 3.10+ | Business Logic |
| ORM | Odoo ORM | Datenbank-Abstraktion |
| Views | XML | Deklarative UI-Definition |
onWillUpdateProps Hook!important und spezifische SelektorenDas Disposition Management Modul ermöglicht eine intuitive, visuelle Beladungsplanung mit automatischer Kapazitätsüberwachung.
❓ Ich stehe für Ihre Fragen zur Verfügung.