Skip to contentMethod: 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: }