1515import de .muenchen .dave .util .OptionsUtil ;
1616import de .muenchen .dave .util .messstelle .MesswerteBaseUtil ;
1717import java .time .LocalDate ;
18+ import java .time .LocalDateTime ;
19+ import java .time .LocalTime ;
1820import java .util .Collections ;
1921import java .util .List ;
22+ import java .util .Objects ;
2023import java .util .Set ;
2124import lombok .AllArgsConstructor ;
2225import lombok .extern .slf4j .Slf4j ;
3134@ AllArgsConstructor
3235public class MesswerteService {
3336
34- private static final String ERROR_MESSAGE = "Beim Laden der AverageMeasurementValuesPerIntervalResponse ist ein Fehler aufgetreten" ;
37+ private static final String ERROR_MESSAGE = "Beim Laden der Messwerte ist ein Fehler aufgetreten" ;
38+
3539 private final MessstelleService messstelleService ;
3640 private final MesswerteApi messwerteApi ;
3741 private final GanglinieService ganglinieService ;
@@ -51,31 +55,54 @@ public class MesswerteService {
5155 public LadeProcessedMesswerteDTO ladeMesswerte (final String messstelleId , final MessstelleOptionsDTO options ) {
5256 log .debug ("#ladeMesswerte {}" , messstelleId );
5357
54- final IntervalResponseDto response = this .ladeMesswerteIntervalle (options , messstelleService .getMessquerschnittIdsByMessstelleId (messstelleId ));
58+ final var response = this .ladeMesswerteIntervalle (options , messstelleService .getMessquerschnittIdsByMessstelleId (messstelleId ));
5559 final var isKfzMessstelle = messstelleService .isKfzMessstelle (messstelleId );
5660 final List <IntervalDto > intervals ;
61+ final List <IntervalDto > sumOfIntervalsForEachMessquerschnitt ;
5762
5863 if (OptionsUtil .isZeitauswahlSpitzenstunde (options .getZeitauswahl ())) {
5964 // Extrahieren der Intervalle welche die Spitzenstunde ausmachen.
6065 intervals = spitzenstundeService .getIntervalsOfSpitzenstunde (
61- ListUtils .emptyIfNull (response .getMeanOfMqIdForEachIntervalByMesstag ()),
66+ ListUtils .emptyIfNull (response .getMeanOfSummedUpMessquerschnitteForEachIntervalOverMesstage ()),
6267 isKfzMessstelle ,
6368 options .getIntervall ());
69+
70+ // Summieren der Intervalle je Messquerschnitt welche die Spitzenstunde ausmachen.
71+ final var uhrzeitVon = getEarliestUhrzeitVonOfIntervals (intervals );
72+ final var uhrzeitBis = getLatestUhrzeitBisOfIntervals (intervals );
73+
74+ sumOfIntervalsForEachMessquerschnitt = ListUtils .emptyIfNull (response .getMeanForEachIntervalAndEachMessquerschnittOverMesstage ())
75+ .stream ()
76+ .map (intervalsForMqId -> ListUtils .emptyIfNull (intervalsForMqId .getIntervals ())
77+ .stream ()
78+ .filter (interval -> isTimeToCompareEqualOrAfterStarttimeAndBeforeEndTime (
79+ interval .getDatumUhrzeitVon ().toLocalTime (),
80+ uhrzeitVon ,
81+ uhrzeitBis ))
82+ .reduce (
83+ new IntervalDto (),
84+ MesswerteBaseUtil ::sumIntervalsAndAdaptDatumUhrzeitVonAndBisAndReturnNewInterval ))
85+ .toList ();
6486 } else {
65- intervals = ListUtils .emptyIfNull (response .getMeanOfMqIdForEachIntervalByMesstag ());
66- }
87+ intervals = ListUtils .emptyIfNull (response .getMeanOfSummedUpMessquerschnitteForEachIntervalOverMesstage ());
6788
68- final var meanPerMessquerschnitt = ListUtils .emptyIfNull (response .getMeanOfIntervalsForEachMqIdByMesstag ())
69- .stream ()
70- .flatMap (intervalsForMqId -> ListUtils .emptyIfNull (intervalsForMqId .getMeanOfIntervalsByMesstag ()).stream ())
71- .toList ();
89+ sumOfIntervalsForEachMessquerschnitt = ListUtils .emptyIfNull (response .getMeanOfSummedUpDailyIntervalsForEachMessquerschnittOverMesstage ())
90+ .stream ()
91+ .flatMap (intervalsForMqId -> ListUtils .emptyIfNull (intervalsForMqId .getIntervals ()).stream ())
92+ .toList ();
93+ }
7294
95+ // Aufbereiten der Daten für die entsprechenden Auswertungen
7396 final var processedZaehldaten = new LadeProcessedMesswerteDTO ();
7497 processedZaehldaten .setZaehldatenStepline (ganglinieService .ladeGanglinie (intervals , options .getFahrzeuge ()));
7598 processedZaehldaten .setZaehldatenHeatmap (heatmapService .ladeHeatmap (intervals , options ));
7699 processedZaehldaten .setZaehldatenTable (listenausgabeService .ladeListenausgabe (intervals , isKfzMessstelle , options ));
77- processedZaehldaten
78- .setBelastungsplanMessquerschnitte (belastungsplanService .ladeBelastungsplan (intervals , meanPerMessquerschnitt , messstelleId , options ));
100+ processedZaehldaten .setBelastungsplanMessquerschnitte (
101+ belastungsplanService .ladeBelastungsplan (intervals ,
102+ sumOfIntervalsForEachMessquerschnitt ,
103+ messstelleId ,
104+ options ));
105+
79106 if (CollectionUtils .isNotEmpty (intervals )) {
80107 processedZaehldaten .setTagesTyp (TagesTyp .getByIntervallTyp (intervals .getFirst ().getTagesTyp ()));
81108 }
@@ -163,4 +190,30 @@ public TagesaggregatResponseDto ladeMeanOfTagesaggregatePerMq(final TagesTyp tag
163190 return response .getBody ();
164191 }
165192
193+ protected static boolean isTimeToCompareEqualOrAfterStarttimeAndBeforeEndTime (
194+ final LocalTime timeToCompare ,
195+ final LocalTime startTime ,
196+ final LocalTime endTime ) {
197+ return (timeToCompare .equals (startTime ) || timeToCompare .isAfter (startTime )) &&
198+ !(timeToCompare .equals (endTime ) || timeToCompare .isAfter (endTime ));
199+ }
200+
201+ protected static LocalTime getEarliestUhrzeitVonOfIntervals (final List <IntervalDto > intervals ) {
202+ return intervals .stream ()
203+ .map (IntervalDto ::getDatumUhrzeitVon )
204+ .filter (Objects ::nonNull )
205+ .map (LocalDateTime ::toLocalTime )
206+ .min (LocalTime ::compareTo )
207+ .orElse (null );
208+ }
209+
210+ protected static LocalTime getLatestUhrzeitBisOfIntervals (final List <IntervalDto > intervals ) {
211+ return intervals .stream ()
212+ .map (IntervalDto ::getDatumUhrzeitBis )
213+ .filter (Objects ::nonNull )
214+ .map (LocalDateTime ::toLocalTime )
215+ .max (LocalTime ::compareTo )
216+ .orElse (null );
217+ }
218+
166219}
0 commit comments