Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/feature/DAVE-166-gesamtauswertun…
Browse files Browse the repository at this point in the history
…g-grafik-kfz-detektordaten' into feature/DAVE-166-gesamtauswertung-grafik-kfz-detektordaten
  • Loading branch information
Der-Alex-K committed Nov 27, 2024
2 parents 5751c8f + 6e6cbba commit c1a2d14
Show file tree
Hide file tree
Showing 5 changed files with 226 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ protected IntervalResponseDto ladeMesswerteIntervalle(final MessstelleOptionsDTO
public TagesaggregatResponseDto ladeTagesaggregate(final TagesTyp tagesTyp, final Set<String> mqIds, final Zeitraum zeitraum) {
final var request = new TagesaggregatRequestDto();
request.setMessquerschnittIds(mqIds.stream().map(Integer::valueOf).toList());
request.setStartDate(LocalDate.of(zeitraum.start.getYear(), zeitraum.start.getMonthValue(), 1));
request.setEndDate(LocalDate.of(zeitraum.end.getYear(), zeitraum.end.getMonthValue(), zeitraum.end.atEndOfMonth().getDayOfMonth()));
request.setStartDate(LocalDate.of(zeitraum.getStart().getYear(), zeitraum.getStart().getMonthValue(), 1));
request.setEndDate(LocalDate.of(zeitraum.getEnd().getYear(), zeitraum.getEnd().getMonthValue(), zeitraum.getEnd().atEndOfMonth().getDayOfMonth()));
request.setTagesTyp(tagesTyp.getTagesaggregatTyp());

final ResponseEntity<TagesaggregatResponseDto> response = messwerteApi.getMeanOfDailyAggregatesPerMQWithHttpInfo(request).block();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@Data
@AllArgsConstructor
public class Zeitraum {
YearMonth start;
YearMonth end;
AuswertungsZeitraum auswertungsZeitraum;
private YearMonth start;
private YearMonth end;
private AuswertungsZeitraum auswertungsZeitraum;
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,33 +48,42 @@ public List<MessstelleAuswertungDTO> getAllVisibleMessstellen() {
/**
* Ermittelt je Messstelle die in Zeiträume unterteilten Zähldaten.
*
* Die Zähldaten werden aufbereitet und zusätzlich als Tabellenkalkulationsdatei bereitgestellt.
* Die Zähldaten werden für die Darstellungen in einem Gangliniendiagramm aufbereitet.
* Zusätzlich werden die Informationen als Tabellenkalkulationsdatei bereitgestellt.
*
* @param options
* @return
* @param options zum Laden und Aufbereiten der Messstelleninformationen mit Zähldaten.
* @return die Zähldaten der Messstelleninformationen mitsamt der Tabellenkalkulationsdatei.
* @throws IOException
*/
@LogExecutionTime
public AuswertungMessstelleWithFileDTO ladeAuswertungMessstellen(final MessstelleAuswertungOptionsDTO options) throws IOException {
log.debug("#ladeAuswertungMessstellen {}", options);
final var auswertungMessstellen = new AuswertungMessstelleWithFileDTO();
final var auswertungenMqByMstId = this.ladeAuswertungGroupedByMstId(options);
final var zaehldatenMessstellen = this.ladeZaehldatenGanglinie(options.getFahrzeuge(), auswertungenMqByMstId);
final var zaehldatenMessstellen = this.createZaehldatenForGanglinie(options.getFahrzeuge(), auswertungenMqByMstId);
auswertungMessstellen.setZaehldatenMessstellen(zaehldatenMessstellen);
final var spreadsheet = this.createAuswertungMessstellenSpreadsheet(options, auswertungenMqByMstId);
final var spreadsheetBase64Encoded = Base64.getEncoder().encodeToString(spreadsheet);
auswertungMessstellen.setSpreadsheetBase64Encoded(spreadsheetBase64Encoded);
return auswertungMessstellen;
}

protected LadeZaehldatenSteplineDTO ladeZaehldatenGanglinie(
/**
* Bereitet die im Parameter gegebenen Zähldaten für die Gangliniendarstellung auf.
*
* @param fahrzeugOptions die Optionen zur Aufbereitung der Zähldaten für die Gangliniendarstellung.
* @param auswertungenMessstellen die Auswertungen der Messstellen zur Aufbereitung für die
* Gangliniendarstellung.
* @return die aufbereiteten Daten für die Gangliniendarstellung.
*/
protected LadeZaehldatenSteplineDTO createZaehldatenForGanglinie(
final FahrzeugOptionsDTO fahrzeugOptions,
final List<AuswertungMessstelle> auswertungenMessstellen) {
final var auswertungenProMessstelle = ListUtils.emptyIfNull(auswertungenMessstellen);
if (auswertungenProMessstelle.size() == 1) {
return ganglinieGesamtauswertungService.ladeGanglinieForSingleMessstelle(auswertungenProMessstelle.getFirst(), fahrzeugOptions);
return ganglinieGesamtauswertungService.createGanglinieForSingleMessstelle(auswertungenProMessstelle.getFirst(), fahrzeugOptions);
} else {
return ganglinieGesamtauswertungService.ladeGanglinieForMultipleMessstellen(auswertungenProMessstelle);
return ganglinieGesamtauswertungService.createGanglinieForMultipleMessstellen(auswertungenProMessstelle);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

Expand All @@ -27,12 +27,17 @@
@RequiredArgsConstructor
public class GanglinieGesamtauswertungService {

private static final DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern("MM.yyyy");

public LadeZaehldatenSteplineDTO ladeGanglinieForSingleMessstelle(
/**
* Erstellt die Repräsentation der Zähldaten zur Gangliniendarstellung für eine Messstelle.
*
* @param auswertungMessstelle mit den Zähldaten.
* @param fahrzeugOptions zur Steuerung der zu repräsentierenden Daten.
* @return die Repräsentation der Zähldaten für die Gangliniendarstellung.
*/
public LadeZaehldatenSteplineDTO createGanglinieForSingleMessstelle(
final AuswertungMessstelle auswertungMessstelle,
final FahrzeugOptionsDTO fahrzeugOptions) {
log.debug("#ladeGanglinieForSingleMessstelle");
log.debug("#createGanglinieForSingleMessstelle");

final var auswertungenProZeitraum = CollectionUtils.emptyIfNull(auswertungMessstelle.getAuswertungenProZeitraum());
final var zaehldatenStepline = GanglinieUtil.getInitialZaehldatenStepline();
Expand Down Expand Up @@ -129,16 +134,27 @@ public LadeZaehldatenSteplineDTO ladeGanglinieForSingleMessstelle(
zaehldatenStepline.setXAxisDataFirstChart(newXAxisData);

});

zaehldatenStepline.setSeriesEntriesFirstChart(seriesEntries.getChosenStepLineSeriesEntries(fahrzeugOptions));
return zaehldatenStepline;

}

public LadeZaehldatenSteplineDTO ladeGanglinieForMultipleMessstellen(final List<AuswertungMessstelle> auswertungMessstellen) {
log.debug("#ladeGanglinieForMultipleMessstellen");
/**
* Erstellt die Repräsentation der Zähldaten (Summe KFZ) zur Gangliniendarstellung für mehrere
* Messstellen.
*
* @param auswertungMessstellen mit den Zähldaten.
* @return die Repräsentation der Zähldaten (Summe KFZ) für die Gangliniendarstellung.
*/
public LadeZaehldatenSteplineDTO createGanglinieForMultipleMessstellen(final List<AuswertungMessstelle> auswertungMessstellen) {
log.debug("#createGanglinieForMultipleMessstellen");

final var zaehldatenStepline = GanglinieUtil.getInitialZaehldatenStepline();
final var auswertungByZeitraum = new HashMap<Zeitraum, AuswertungZeitraum>();

// Gruppieren der Auswertungen nach Zeitraum
// Jeder Zeitraum umfasst je Messstelle die Anzahl der KFZ
CollectionUtils
.emptyIfNull(auswertungMessstellen)
.forEach(auswertungMessstelle -> CollectionUtils
Expand All @@ -150,6 +166,7 @@ public LadeZaehldatenSteplineDTO ladeGanglinieForMultipleMessstellen(final List<
zeitraum,
new AuswertungZeitraum(zeitraum, new HashMap<>()));
}
// Hinzufügen der Messstelle mit der Summe an KFZ.
auswertungByZeitraum
.get(zeitraum)
.getSummeKfzByMstId()
Expand All @@ -158,44 +175,55 @@ public LadeZaehldatenSteplineDTO ladeGanglinieForMultipleMessstellen(final List<
auswertung.getDaten().getSummeKraftfahrzeugverkehr());
}));

auswertungByZeitraum.values().forEach(auswertungZeitraum -> {
auswertungZeitraum.summeKfzByMstId.forEach((mstId, summeKfz) -> {
final var stepLineSeriesEntryMessstelle = new StepLineSeriesEntryIntegerDTO();
stepLineSeriesEntryMessstelle.setName("MST " + mstId);
GanglinieUtil.setSeriesIndexForFirstChartValue(stepLineSeriesEntryMessstelle);
stepLineSeriesEntryMessstelle.getYAxisData().add(GanglinieUtil.getIntValueIfNotNull(summeKfz));
GanglinieUtil.setLegendInZaehldatenStepline(
zaehldatenStepline,
stepLineSeriesEntryMessstelle.getName());
GanglinieUtil.setRangeMaxRoundedToTwentyInZaehldatenStepline(
zaehldatenStepline,
GanglinieUtil.getIntValueIfNotNull(summeKfz));
});

final var currentXAxisData = zaehldatenStepline.getXAxisDataFirstChart();
final var newXAxisData = ZaehldatenProcessingUtil.checkAndAddToXAxisWhenNotAvailable(
currentXAxisData,
getZeitraumForXaxis(auswertungZeitraum.getZeitraum()));
zaehldatenStepline.setXAxisDataFirstChart(newXAxisData);

});
// Aufbereitung der im oberen Abschnitt gruppierten Zähldaten für Gangliniendarstellung.
auswertungByZeitraum
.values()
.stream()
.sorted(Comparator.comparing(auswertungZeitraum -> auswertungZeitraum.getZeitraum().getStart()))
.forEach(auswertungZeitraum -> {

final var stepLineSeriesEntryMessstelle = new StepLineSeriesEntryIntegerDTO();

auswertungZeitraum.summeKfzByMstId.forEach((mstId, summeKfz) -> {
stepLineSeriesEntryMessstelle.setName("MST " + mstId);
GanglinieUtil.setSeriesIndexForFirstChartValue(stepLineSeriesEntryMessstelle);
stepLineSeriesEntryMessstelle.getYAxisData().add(GanglinieUtil.getIntValueIfNotNull(summeKfz));
GanglinieUtil.setLegendInZaehldatenStepline(
zaehldatenStepline,
stepLineSeriesEntryMessstelle.getName());
GanglinieUtil.setRangeMaxRoundedToTwentyInZaehldatenStepline(
zaehldatenStepline,
GanglinieUtil.getIntValueIfNotNull(summeKfz));

zaehldatenStepline.getSeriesEntriesFirstChart().add(stepLineSeriesEntryMessstelle);
});

final var currentXAxisData = zaehldatenStepline.getXAxisDataFirstChart();
final var newXAxisData = ZaehldatenProcessingUtil.checkAndAddToXAxisWhenNotAvailable(
currentXAxisData,
getZeitraumForXaxis(auswertungZeitraum.getZeitraum()));
zaehldatenStepline.setXAxisDataFirstChart(newXAxisData);

});

return zaehldatenStepline;

}

/**
* Gibt die String-Repräsentation des Zeitraums zurück.
*
* @param zeitraum zur Stringerstellung.
* @return die String-Repräsentation des Zeitraums.
*/
public String getZeitraumForXaxis(final Zeitraum zeitraum) {
return new StringBuilder()
.append(zeitraum.getStart().format(YEAR_MONTH_FORMATTER))
.append(StringUtils.SPACE)
.append("-")
.append(StringUtils.SPACE)
.append(zeitraum.getEnd().format(YEAR_MONTH_FORMATTER))
.toString();
final var bezeichnerZeitraum = zeitraum.getAuswertungsZeitraum().getText();
return bezeichnerZeitraum
.concat(bezeichnerZeitraum.isEmpty() ? StringUtils.EMPTY : ".")
.concat(String.valueOf(zeitraum.getStart().getYear()));
}

/**
*
* Die Klasse repräsentiert für einen Zeitraum je Messstelle die Summe der Kfz.
*/
@Data
@AllArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package de.muenchen.dave.services.messstelle.auswertung;

import de.muenchen.dave.domain.dtos.laden.LadeZaehldatenSteplineDTO;
import de.muenchen.dave.domain.dtos.messstelle.auswertung.Auswertung;
import de.muenchen.dave.domain.dtos.messstelle.auswertung.AuswertungMessstelle;
import de.muenchen.dave.domain.enums.AuswertungsZeitraum;
import de.muenchen.dave.geodateneai.gen.model.TagesaggregatDto;
import de.muenchen.dave.services.messstelle.Zeitraum;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.time.YearMonth;
import java.util.ArrayList;

class GanglinieGesamtauswertungServiceTest {

private GanglinieGesamtauswertungService ganglinieGesamtauswertungService = new GanglinieGesamtauswertungService();

@Test
void createGanglinieForMultipleMessstellen() {
final var auswertungMessstellen = new ArrayList<AuswertungMessstelle>();
var auswertungMessstelle = new AuswertungMessstelle();
auswertungMessstelle.setMstId("1");

var auswertung = new Auswertung();
var zeitraum = new Zeitraum(YearMonth.of(2024, 1), YearMonth.of(2024, 3), AuswertungsZeitraum.QUARTAL_1);
var tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(100));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 4), YearMonth.of(2024, 6), AuswertungsZeitraum.QUARTAL_2);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(101));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 7), YearMonth.of(2024, 9), AuswertungsZeitraum.QUARTAL_3);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(102));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 10), YearMonth.of(2024, 12), AuswertungsZeitraum.QUARTAL_4);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(103));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2025, 1), YearMonth.of(2025, 3), AuswertungsZeitraum.QUARTAL_1);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(104));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertungMessstellen.add(auswertungMessstelle);

auswertungMessstelle = new AuswertungMessstelle();
auswertungMessstelle.setMstId("2");

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 1), YearMonth.of(2024, 3), AuswertungsZeitraum.QUARTAL_1);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(200));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 4), YearMonth.of(2024, 6), AuswertungsZeitraum.QUARTAL_2);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(201));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 7), YearMonth.of(2024, 9), AuswertungsZeitraum.QUARTAL_3);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(202));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2024, 10), YearMonth.of(2024, 12), AuswertungsZeitraum.QUARTAL_4);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(203));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertung = new Auswertung();
zeitraum = new Zeitraum(YearMonth.of(2025, 1), YearMonth.of(2025, 3), AuswertungsZeitraum.QUARTAL_1);
tagesaggregat = new TagesaggregatDto();
tagesaggregat.setSummeKraftfahrzeugverkehr(BigDecimal.valueOf(204));
auswertung.setZeitraum(zeitraum);
auswertung.setDaten(tagesaggregat);
auswertungMessstelle.getAuswertungenProZeitraum().add(auswertung);

auswertungMessstellen.add(auswertungMessstelle);

final var result = ganglinieGesamtauswertungService.createGanglinieForMultipleMessstellen(auswertungMessstellen);

final var expected = new LadeZaehldatenSteplineDTO();

Assertions.assertThat(result).isNotNull().isEqualTo(expected);

}

@Test
void getZeitraumForXaxis() {
var zeitraum = new Zeitraum(YearMonth.of(2024, 11), null, AuswertungsZeitraum.SEPTEMBER);
var result = ganglinieGesamtauswertungService.getZeitraumForXaxis(zeitraum);
Assertions.assertThat(result).isNotNull().isEqualTo("09.2024");

zeitraum = new Zeitraum(YearMonth.of(2024, 11), null, AuswertungsZeitraum.HALBJAHR_2);
result = ganglinieGesamtauswertungService.getZeitraumForXaxis(zeitraum);
Assertions.assertThat(result).isNotNull().isEqualTo("H2.2024");

zeitraum = new Zeitraum(YearMonth.of(2024, 11), null, AuswertungsZeitraum.QUARTAL_3);
result = ganglinieGesamtauswertungService.getZeitraumForXaxis(zeitraum);
Assertions.assertThat(result).isNotNull().isEqualTo("Q3.2024");

zeitraum = new Zeitraum(YearMonth.of(2024, 11), null, AuswertungsZeitraum.JAHRE);
result = ganglinieGesamtauswertungService.getZeitraumForXaxis(zeitraum);
Assertions.assertThat(result).isNotNull().isEqualTo("2024");
}

}

0 comments on commit c1a2d14

Please sign in to comment.