Skip to content

Method: ermittleUberbuchteTypenMitKalender(Map)

1: package simulation.SimulationsHelper;
2:
3: import maschine.Maschine;
4: import mensch.Mitarbeiter;
5: import rollenbelegung.Belegung;
6: import rollenbelegung.ErmittelteBelegungen;
7: import zeit.TypMitKalender;
8: import zeit.eintraege.BelegungsEintrag;
9:
10: import java.util.Collection;
11: import java.util.HashSet;
12: import java.util.Map;
13: import java.util.Set;
14:
15: /**
16: * Helperklasse, um bei den Belegungen von Mitarbeitern und Maschinen auf Überbuchungen dieser zu prüfen.
17: */
18: public final class UeberbuchungsHelper {
19:
20:         private UeberbuchungsHelper() {
21:                 // nur über create Methode erstellbar
22:         }
23:
24:         /**
25: *
26: * @return einen UeberbuchungsHelper.
27: */
28: public static UeberbuchungsHelper create() {
29: return new UeberbuchungsHelper();
30: }
31:
32:
33: /**
34: *
35: * @param ermittelteBelegungen Belegungen der Maschinen und Mitarbeiter
36: * @return alle überbuchten Mitarbeiter.
37: */
38: public Collection<Mitarbeiter> ermittleUeberbuchteMitarbeiter(final ErmittelteBelegungen ermittelteBelegungen) {
39: return this.ermittleUberbuchteTypenMitKalender(ermittelteBelegungen.getMitarbeiterbelegungen());
40: }
41:
42:
43: /**
44: *
45: * @param ermittelteBelegungen Belegungen der Maschinen und Mitarbeiter
46: * @return alle überbuchten Maschinen.
47: */
48: public Collection<Maschine> ermittleUeberbuchteMaschinen(final ErmittelteBelegungen ermittelteBelegungen) {
49: return this.ermittleUberbuchteTypenMitKalender(ermittelteBelegungen.getMaschinenbelegungen());
50: }
51:
52: private <T extends TypMitKalender, K extends Belegung<?>>
53: Collection<T> ermittleUberbuchteTypenMitKalender(final Map<T, K> belegungen) {
54:
55: final Set<T> uerbuchteM = new HashSet<>();
56:• for (final Map.Entry<T, K> typUndBelegung : belegungen.entrySet()) {
57:• if (this.istUeberbucht(typUndBelegung.getKey(), typUndBelegung.getValue().getBelegung())) {
58: final T key = typUndBelegung.getKey();
59: uerbuchteM.add(key);
60: }
61: }
62: return uerbuchteM;
63: }
64:
65: private <T extends TypMitKalender, K extends BelegungsEintrag>
66: boolean istUeberbucht(final T typ, final Collection<K> belegung) {
67:
68: final boolean istFuerAlleBelegungenVerfuegbar = belegung
69: .stream()
70: .allMatch(b -> typ.istVerfuegbar(b.getVon(), b.getBis()));
71:
72: return !(istFuerAlleBelegungenVerfuegbar && this.hatKeineUeberschneidendeBelegungen(belegung));
73: }
74:
75: private boolean hatKeineUeberschneidendeBelegungen(final Collection<? extends BelegungsEintrag> belegungen) {
76: for (final BelegungsEintrag belegungsEintrag : belegungen) {
77: for (final BelegungsEintrag belegungsEintragZumVergleichen : belegungen) {
78: if (this.liegtUeberschneigungVor(belegungsEintrag, belegungsEintragZumVergleichen)) {
79: return false;
80: }
81: }
82: }
83: return true;
84: }
85:
86: private boolean liegtUeberschneigungVor(final BelegungsEintrag belegungsEintrag,
87: final BelegungsEintrag belegungsEintragZumVergleichen) {
88: if (belegungsEintrag == belegungsEintragZumVergleichen) {
89: return false;
90: }
91: return belegungsEintrag.getZeitraum().ueberschneidet(belegungsEintragZumVergleichen.getZeitraum());
92: }
93: }