Java Lagerverwaltung - konzeptionelle Frage

b1gsh0w

Cadet 4th Year
Registriert
Mai 2009
Beiträge
91
Hallo an alle,

ich habe ein kleines konzeptionelles Problem bei der Erstellung einer Lagerverwaltung.
Es geht um folgenden Sachverhalt:

Wir sollen eine Lagerverwaltung für ein Lager mit einer festen Anzahl Slots als Lagerfläche für bestimmte Artikel erstellen. Mit dieser Verwaltung soll man aus verschiedenen Artikeln Produktionen erstellen (Produktionen entfernen die verwendeten Artikel aus dem Lager) und für die Artikel Bestellungen erzeugen, falls nicht genügend Artikel im Lager für Produktionen vorhanden sind. In dem Lager liegen nur die Artikel, die Produktionen sollen nicht berücksichtigt werden.

Mein Problem liegt bei der Bestellung der Artikel. Jeder Artikel hat eine Menge Slots, die er im Lager belegt, und eine Lieferzeit. Ich hänge momentan an der Stelle, wie man am besten überprüfen könnte, ob zu einem bestimmten Lieferdatum genug Slots für den Artikel im Lager vorhanden ist.

Hier mal ein Beispiel für das Problem:

Nehmen wir an das Lager hat 100 freie Slots.

Es wurde eine Bestellung (Bestellung1) für eine Menge von Artikeln aufgegeben, die insgesamt 50 Slots verbrauchen. Das Lieferdatum ist der 17.05.2011.

Nach Bestellung1 wurde eine zweite Bestellung (Bestellung2) mit dem Lieferdatum 20.05.2011 aufgegeben, die 40 Slots benötigen würde. Bis hier hin gibt es noch keine Probleme, da erst 90 Slots verbraucht werden würden und noch 10 Slots frei wären.

Nach diesen beiden Bestellungen wird eine neue Bestellung (Bestellung3) mit Artikeln aufgegeben, bei der das Lieferdatum zufällig auf den 18.05.2011 fällt, also zwischen die beiden oben stehenden Bestellungen. Durch diese Bestellung würden 30 Slots verbraucht werden.

Bestellung3 darf aber nicht ausgeführt werden, da sie Bestellung2 (die vor Bestellung3 durchgeführt wurde) behindern würde.

Man kann es sich auch ungefähr so vorstellen:

Bestellung------Lieferdatum------SlotsderBestellung------freieSlotsimLagernachBestellung
Bestellung1-----17.05.2011------------50-------------------------50
Bestellung2-----20.05.2011------------40-------------------------10

Um sicherzustellen, dass Bestellung2 nicht durch eine spätere Bestellung, wie hier Bestellung3, behindert wird, müsste man für den 18.05 und 19.05 die freien Slots im Lager auch auf 10 setzen. Somit wären am 18.05. noch 10 Slots frei und Bestellung3 würde abgelehnt werden, weil sie 30 Slots benötigt.

Ich hoffe man konnte verstehen, auf was ich hinaus will.

Da wir das ganze mit einer Datenbank realisieren wollten, habe ich mir erst eine Lösung überlegt, die die DB mit einbezieht. Der Überprüfungsprozess, so wie ich ihn mir überlegt hatte, wäre aber ziemlich kompliziert geworden.

Habe deshalb meinen Prof gefragt und er meinte, dass man intern einen Kalender erstellen und man den einzelnen Tagen die freien Slots zuordnen könnte. Bei Bestellungen wird dann die Anzahl freier Slots verringert und bei Produktionen entsprechend wieder erhöht.

Ich habe leider keinen blassen Schimmer, wie man das umsetzen könnte. Hat vllt jemand einen Tipp oder Anregungen, wie ich die Überprüfung realisieren könnte?

Grüße

PS: Ich habe es bestimmt ziemlich verwirrend beschrieben. Falls es Fragen gibt, dann fragt einfach und ich werde versuchen esverständlicher zu formulieren.
 
Ein Problem was mir dabei einfällt ist - hat man einen Schwellenwert an Tagen ab dem man davon ausgehen kann, dass das Lager wieder aufgefüllt wurde?

Angenommen Bestellung 1 war am 17.05 und hat 50 slots reserviert, Bestellung 2 kommt rein und reserviert die anderen 50 für den 26.07. Damit ist das Lager theoretisch leer und kann keinen mehr beliefern. Wenn aber natürlich alle 3 Tage spätestens wieder aufgefüllt wird, dann würden Bestellungen, die dazwischen fallen, eher beliefert werden können. Das nur mal als Hinweis, falls du daran nicht gedacht hast.

Ansonsten würde ich vermutlich erst mal einen ganz einfachen Ansatz versuchen im Sinne von - jedes Objekt im Lager hat ein Attribut "verplant" und es gibt eine Queue von Bestellenden, die sich dort Einreihen und solange dort verbleiben, bis genügend Lagerobjekte verplant == false sind und somit verplant werden können. Genau an diesem Punkt müsste aber dieser Schwellenwert (s.o.) berücksichtigt werden und man bräuchte eine Priorisierung in der Warteschlange anhand des Termins.
 
Ohne jetzt darüber nachzudenken, wie du das in einer DB abbildest:

Ich würde eine Liste nehmen und dort für jede Bestellung entsprechend Objekte reinpacken. also bei dir z.b. 50 und dann 40. Dann kannst du bei einer neuen Bestellung überprüfen, ob noch genug Platz vorhanden ist. Jedes der Objekte sollte ein Datum "Lieferdatum" besitzen. Dieses gibt an, ab wann das Objekt verfügbar ist. Reserviert werden die Plätze aber bereits bei Bestellung.

Wenn du dann noch getimte Produktionen (z.B. am 18.05. werden 10 Objekte entfernt) benötigst, fügst du noch ein neues Datum hinzu (z.B. Ausgabedatum). Dies wird dann gesetzt.

Sobald nun eine neue Bestellung kommt, überprüfst du erst, ob genug Plätze frei sind. Wenn ja, kann die Bestellung direkt eingefügt werden.
Wenn nicht, rufst du auf deiner Liste die Methode "getFreiePlaetzeAnDatum(Date _date) auf. Diese kann dann über die Plätze iterieren und schauen, wieviele bis zu dem Zeitpunkt ausgeliefert wurden. Wenn da dann genug freie Plätze dazugekommen sind, hängst du an jedes Objekt, welches ausgeliefert werden soll das neue Objekt als "NaechsteLieferung" dran.

Beim entfernen von Objekten musst du dann halt immer schauen, ob ein Objekt eine "NaechsteLieferung" enthält, wenn ja, wird diese als neuer Eintrag ins Lager gepackt.

Fertig :)
 
Hi
Die Anzahlt der freien Slots wird unmittelbar nach Aufgabe der Bestellung verringert.
Das Lieferdatum ist dabei irrelevant.
Es kann nur bestellt werden, was zum Zeitpunkt der Bestellung reinpasst.


OT:
Warum bestellst Artikel nicht prinzipiell, wenn die Anzahl der verfügbaren unter eine bestimmte Menge fällt?
Stichworte Sollbestand, Meldebestand.

Diese Lösung bringt vielleicht Kreativpunkte ;)

mfg
 
Zuletzt bearbeitet:
xammu schrieb:
Die Anzahlt der freien Slots wird unmittelbar nach der Bestellung verringert.
Das Lieferdatum ist dabei irrelevant.

Das ist ja genau das Problem was ich beschrieben haben. Was machst du denn wenn einer für in 6 Monaten bestellt und 10 Minuten später bestellt einer für in 3 Tagen? Das wäre ja furchtbar ineffizient den letzteren abzuweisen bzw. warten zu lassen.
 
Ja, es ist ineffizient, aber der TE will da ja scheinbar so

<zitat>Bestellung3 darf aber nicht ausgeführt werden, da sie Bestellung2 (die vor Bestellung3 durchgeführt wurde) behindern würde.</zitat>
 
Zuletzt bearbeitet:
Tumbleweed schrieb:
Das ist ja genau das Problem was ich beschrieben haben. Was machst du denn wenn einer für in 6 Monaten bestellt und 10 Minuten später bestellt einer für in 3 Tagen? Das wäre ja furchtbar ineffizient den letzteren abzuweisen bzw. warten zu lassen.

Hier mal die Aufgabenstellung um etwas mehr Klarheit in die Sache zu bringen:

Erstellen Sie ein Software System zur Lagerverwaltung der Automobil AG. Das System soll in der Lage sein unterschiedliche Materialien die zur Produktion benötigt werden zu verwalten und sowohl die Produktionsplanung als auch den Einkauf zu unterstützen.
In dem Lager werden momentan folgende Dinge gelagert.
• Räder, Lieferzeit: 2 Tage, Platzbedarf: 1 Slot pro Stück
• Fahrwerk normal, Lieferzeit 5 Tage, Platzbedarf 4 Slots pro Stück
• Fahrwerk sportlich, Lieferzeit 6 Tage, Platzbedarf 5 Slots pro Stück
• Karosserie klein, Lieferzeit 4 Tage, Platzbedarf 6 Slots pro Stück
• Karosserie groß, Lieferzeit 4 Tage, Platzbedarf 8 Slots pro Stück
• Innenausstattungen Standard, Lieferzeit 3 Tage, Platzbedarf 2 Slots pro Stück
• Innenausstattungen Luxus, Lieferzeit 4 Tage, Platzbedarf 3 Slots pro Stück
• ... weitere Teile können jederzeit hinzukommen

Die Lagerkapazität umfasst insgesamt 10.000 Slots.
Aus diesen Teilen fertigt die Automobil AG Fahrzeuge. Alle Teile können beliebig kombiniert werden. Natürlich muss jedes Fahrzeug genau eine Karosserie, ein Fahrwerk und eine Innenausstattung enthalten. Die Anzahl der Räder ist variabel, muss aber mindestens 2 betragen.
Die Automobil AG hat folgende Vorstellungen über das Lagerverwaltungssystem:
Es soll zunächst 2 Personengruppen geben die mit der Software arbeiten. Die Produktionsplaner und die Einkäufer.

Die Produktionsplaner haben die Möglichkeit, eine Menge von zu produzierenden Fahrzeugen zu einem bestimmten Termin einzuplanen. Pro Produktionsauftrag kann immer nur eine Fahrzeugkonfiguration gefertigt werden. Es können aber pro Tag mehrere Produktionsaufträge eingegeben werden. Das System soll Auskunft darüber geben ob zu dem Zeitpunkt des Produktionstermins genügend Material zur Verfügung steht oder nicht.
Eine positive Auskunft muss auf jeden Fall eingehalten werden. Falls zum gewünschten Zeitpunkt nicht genug Material zur Verfügung steht, soll der frühest mögliche Produktionstermin angegeben werden. Wenn ein Produktionstermin erreicht ist, wird das Gesamte für diesen benötigte Material aus dem Lager entfernt.

Die Personengruppe der Einkäufer soll jederzeit Einsicht in die aktuelle Situation im Lager haben. Sie ist dafür verantwortlich das alle benötigten Materialien zu einem eingeplanten Produktionstermin verfügbar sind. Das System soll Sie dabei durch entsprechende Vorschläge und Hinweise für Bestellungen und Bestände bestmöglich unterstützen.

Die Aufgabenstellung lässt einem was die Bestellung angeht ja ziemlich viel Freiheit. Habe auch erst mit variablen Bestelldaten rumprobiert, man konnte also auch mehrere Wochen im Voraus bestellen. Außerdem habe ich ne Lösung mit der Datenbank ausprobiert. Hab sozusagen die Slots in verfügare und vorgemerkte aufgeteilt, mir ist das dann aber zu kompliziert geworden mit der Überprüfung, da man Bestellungen und Produktionen überprüfen musste.

Haben uns jetzt aber dazu entschieden, das Lieferdatum fest zu setzen. Lieferdatum = Tagesdatum+Lieferzeit sozusagen. Das stellt sich aber grad beim drüber Nachdenken iwie als blöd raus...ich würd lieber variable Termine setzen können.

Ich tu mich grad da bissle schwer.

Das soll jetzt übrigens kein Hausaufgaben-Thread werden. Mir gehts nur um die konzeptionelle Frage :D
 
Zuletzt bearbeitet:
Ich habe mir mal die Aufgabenstellung angeschaut.

Meine Idee wäre folgende: ich würde in die Datenbank mit dem Lager eine Tabelle anlegen, die den entsprechenden Lagerbestand enthält. Da kommt einfach ein Timestamp rein, ab wann das Teil verfügbar ist. Beispiel:

Typ | Timestamp
-------------------------------
Rad | 1234567890
Rad | 1234567891
Karosserie | 1234567889

Damit weißt du zu jeder Zeit, WANN die Teile verfügbar sind. Bei der Bestellung nimmst du einfach NOW() + X Tage (kannste Notfalls noch eine "Prüfung" einbauen, welcher Tag heute ist und wann das nächste Teil ankommt - da kannst du dann davon ausgehen, dass die Teile immer früh kommen; sollte für den Anfang aber irrelevant sein) und kannst zu jeder Zeit auslesen, WANN wie viele Slots belegt sein werden. Wenn du jetzt für den Timestamp 1234567890 für 10 Slots bestellst kannst du ja auslesen, wie viele Slots zu diesem Zeitpunkt belegt sein werden. Dafür bietet MySQL wenn ich nicht irre eine SUM-Funktion - die kannst du mit WHERE datum <= 1234567890 ja abprüfen.

Wenn die Teile verbraucht werden, einfach den Datensatz aus der DB löschen. Notfalls gibst du denen noch eine ID mit, damit du nicht 10 Datensätze löscht, obwohl du nur 1 Teil verbrauchst.

Oder hab ich was übersehen? Hoffe es war einigermaßen verständlich.

Variable Termine kannst du via Timestamp ja auch ganz einfach durch errechnen des Timestamp setzen - ist ja kein Problem. Und mit einer einfachen Abfrage hast du quasi die Slotzahl, die zu Zeitpunkt X verfügbar ist in einem einzigen SQL-Befehl zusammengepackt.

Produktion planen kann man ja auch machen - macht man notfalls eine 2. Tabelle in die man reinschreibt, zu welchem Zeitpunkt welche Mittel verbraucht werden. Muss man ggf. dann in beiden Tabellen vergleichen und prüfen, ob zu dem Zeitpunkt genug Platz vorhanden ist. Sind schlimmstenfalls 2 SQL-Statements und eine Addition/Subtraktion ;)
 
Zuletzt bearbeitet:
Wir haben uns jetzt für die Variante entschieden, dass es die Variablen freieSlots, belegteSlots und gesamteSlots gibt und diese direkt nach der Ausführung der Bestellung verändert werden. Somit ist ja auch egal, zu welchem Datum die Datenbank verändert wird. Vielen Dank für die hilfreichen Antworten. :)
 
Beispiel:
1. freieSlots = 0, belegteSlots = 400
2. Bestellung für 400 Slots am 25.05 freieSlots = 0, belegteSlots = 800
3. Produziere aber am 23.05. für 400 Slots

Damit kann ich also nicht erst meine Bestellungen abgeben, sondern muss IMMER abwechselnd erst das Material "verbrauchen" um dann neues bestellen zu können. Das ist so gesehen sicher ein wenig blöd für einen Planer.

Anderes Beispiel:
1. freieSlots = 400, belegteSlots = 0
2. Bestellung für den 25.06 = freieSlots = 0, belegteSlots = 400
3. Produktion für den 01.06 = freieSlots = 200, belegteSlots = 200
Nanu - dabei kommt doch erst am 25.06. das Material - dein Programm meint aber, es hätte schon genug Material.
Ob das soooo gut ist? BMW wäre damit sicher schon lange pleite ;)

Für ein Hochschulprojekt (klingt nach Belegarbeit) ist das schon ein wenig dünn von der Lösung her mMn. Sowas hätten wir nicht bringen dürfen :)
 
Ich hatte gerade via PN noch eine andere Idee vorgeschlagen - die vermutlich mega einfach ist und trotzdem funktioniert:
Speichere Ausgaben in deine Tabelle als negative Zahl, Bestellungen als positive.
Danach einfach zum entsprechenden Timestamp aufsummieren (a la "SELECT summe(anzahl) from `daten` WHERE timestamp < 2345678910").

name -- timestamp -- anzahl
karossiere -- 1234567890 -- +5
karosserie -- 2345678901 -- -5
 

Ähnliche Themen

Zurück
Oben