Hinweise:
Als Anwender beträgt der maximal mögliche Auswahlzeitraum 5 Jahre.
-
+
Alle Auswertungen stellen Durchschnittswerte des ausgewählten
Zeitraums dar.
@@ -79,11 +49,11 @@
-
+
1);
+
+const isDateRange = computed(() => {
+ const startDate = head(chosenOptionsCopy.value.zeitraum);
+ const isValidStartDate = moment(startDate, "YYYY-MM-DD", true).isValid();
+ const endDate = last(chosenOptionsCopy.value.zeitraum);
+ const isValidEndDate = moment(endDate, "YYYY-MM-DD", true).isValid();
+ return isValidStartDate && isValidEndDate && !isEqual(startDate, endDate);
+});
onMounted(() => {
const messstelleId = route.params.messstelleId as string;
@@ -163,46 +141,35 @@ const isAnwender = computed(() => {
});
const minDate = computed(() => {
- if (messstelleInfo.value.realisierungsdatum >= "2006-01-01")
- return messstelleInfo.value.realisierungsdatum;
- else return "2006-01-01";
-});
-
-const minDateRange = computed(() => {
- return dateUtils.formatDateToISO(nextDayOfVon.value);
-});
-
-const nextDayOfVon = computed(() => {
- const nextDay = new Date(dateVon.value);
- nextDay.setDate(dateVon.value.getDate() + 1);
- return nextDay;
+ const startdatum = new Date("2006-01-01");
+ const realisierungsdatum = new Date(messstelleInfo.value.realisierungsdatum);
+ if (
+ !isNil(messstelleInfo.value.realisierungsdatum) &&
+ realisierungsdatum >= startdatum
+ )
+ return realisierungsdatum;
+ else return startdatum;
});
const maxDate = computed(() => {
- const yesterday = new Date(new Date().setDate(new Date().getDate() - 1))
- .toISOString()
- .slice(0, 10);
- return messstelleInfo.value.abbaudatum ?? yesterday;
+ const yesterday = new Date(new Date().setDate(new Date().getDate() - 1));
+ return isNil(messstelleInfo.value.abbaudatum)
+ ? yesterday
+ : new Date(messstelleInfo.value.abbaudatum);
});
-const dateVon = computed({
- get() {
- return new Date(chosenOptionsCopy.value.zeitraum[0]);
- },
-
- set(value: Date) {
- saveDateValueVon(value);
- },
-});
-const dateBis = computed({
+const zeitraum = computed({
get() {
- return chosenOptionsCopy.value.zeitraum.length === 2
- ? new Date(chosenOptionsCopy.value.zeitraum[1])
- : nextDayOfVon.value;
+ return toArray(chosenOptionsCopy.value.zeitraum).map(
+ (date) => new Date(date)
+ );
},
- set(value: Date) {
- saveDateValueBis(value);
+ set(dates: Array | undefined) {
+ const newZeitraum = toArray(dates).map((date) =>
+ dateUtils.formatDateToISO(date)
+ );
+ chosenOptionsCopy.value.zeitraum = newZeitraum;
},
});
@@ -235,33 +202,4 @@ function calculateChoosableOptions(): void {
chosenOptionsCopy.value.zeitraum[0]
);
}
-
-function resetDates() {
- if (needRange.value) {
- saveDateValueBis(dateBis.value);
- } else {
- if (chosenOptionsCopy.value.zeitraum.length === 2) {
- chosenOptionsCopy.value.zeitraum.pop();
- }
- chosenOptionsCopy.value.tagesTyp = TagesTyp.UNSPECIFIED;
- }
-}
-
-function saveDateValueVon(toSave: Date) {
- const dateToSave = dateUtils.formatDateToISO(toSave);
- if (chosenOptionsCopy.value.zeitraum.length === 0) {
- chosenOptionsCopy.value.zeitraum.push(dateToSave);
- } else {
- chosenOptionsCopy.value.zeitraum[0] = dateToSave;
- }
-}
-
-function saveDateValueBis(toSave: Date) {
- const dateToSave = dateUtils.formatDateToISO(toSave);
- if (chosenOptionsCopy.value.zeitraum.length === 2) {
- chosenOptionsCopy.value.zeitraum[1] = dateToSave;
- } else {
- chosenOptionsCopy.value.zeitraum.push(dateToSave);
- }
-}
diff --git a/frontend/src/components/zaehlstelle/optionsmenue/OptionsmenueZaehlstelle.vue b/frontend/src/components/zaehlstelle/optionsmenue/OptionsmenueZaehlstelle.vue
index a75086be..9a6d97f3 100644
--- a/frontend/src/components/zaehlstelle/optionsmenue/OptionsmenueZaehlstelle.vue
+++ b/frontend/src/components/zaehlstelle/optionsmenue/OptionsmenueZaehlstelle.vue
@@ -162,9 +162,9 @@ const options = computed(() => {
const getContentSheetHeight = computed(() => {
if (display.xl.value) {
- return "650px";
+ return "750px";
}
- return "400px";
+ return "500px";
});
/**
From bd16ff633e2f766186cedbce6b6aeabc57fde48c Mon Sep 17 00:00:00 2001
From: Der-Alex-K <18263366+Der-Alex-K@users.noreply.github.com>
Date: Tue, 19 Nov 2024 14:26:43 +0100
Subject: [PATCH 6/6] Feat/dave 205 gesamtauswertungen ausgabe excel (#231)
* Download funktionalitaet fuer xlsx eingebaut und refactoring des FetchService
* umgestellt auf neue Datenstruktur
* Reviewanmerkungen umgesetzt
* Reviewanmerkungen umgesetzt
* linter
* Reviewanmerkungen umgesetzt
* Reviewanmerkungen umgesetzt
---
frontend/src/api/service/FetchService.ts | 85 ++++++++--------
.../src/api/service/GeneratePdfService.ts | 8 +-
.../service/MessstelleAuswertungService.ts | 4 +-
.../src/components/common/DateRangePicker.vue | 6 +-
.../messstelle/charts/MessstelleDiagramme.vue | 26 +++--
.../stepper/AuswertungStepper.vue | 41 +++++---
.../stepper/OrtStepContent.vue | 99 +++++++++++--------
.../zaehlstelle/ZaehldatenDiagramme.vue | 22 ++---
frontend/src/types/common/KeyValObject.ts | 4 +
.../auswertung/MessstelleAuswertungIdDTO.ts | 4 +
.../MessstelleAuswertungOptionsDTO.ts | 4 +-
frontend/src/util/DefaultObjectCreator.ts | 3 +-
frontend/src/views/AuswertungView.vue | 20 ++--
frontend/src/views/PdfReportView.vue | 8 +-
14 files changed, 184 insertions(+), 150 deletions(-)
create mode 100644 frontend/src/types/common/KeyValObject.ts
create mode 100644 frontend/src/types/messstelle/auswertung/MessstelleAuswertungIdDTO.ts
diff --git a/frontend/src/api/service/FetchService.ts b/frontend/src/api/service/FetchService.ts
index 7f4720cd..2bd34b8d 100644
--- a/frontend/src/api/service/FetchService.ts
+++ b/frontend/src/api/service/FetchService.ts
@@ -11,7 +11,7 @@ export default class FetchService {
static getData(endpoint: string, errorMessage: string): Promise {
const url = `${this.BASE}/${endpoint}`;
const request = FetchUtils.getGETConfig();
- return FetchService.sendRequest(url, request, errorMessage);
+ return FetchService.sendRequestForJson(url, request, errorMessage);
}
static postData(
@@ -21,7 +21,27 @@ export default class FetchService {
): Promise {
const url = `${this.BASE}/${endpoint}`;
const request = FetchUtils.getPOSTConfig(dataToSave);
- return FetchService.sendRequest(url, request, errorMessage);
+ return FetchService.sendRequestForJson(url, request, errorMessage);
+ }
+
+ static postForPdf(
+ dataToSave: any,
+ endpoint: string,
+ errorMessage: string
+ ): Promise {
+ const url = `${this.BASE}/${endpoint}`;
+ const request = FetchUtils.getPdfPOSTConfig(dataToSave);
+ return FetchService.sendRequestForBlob(url, request, errorMessage);
+ }
+
+ static postForBlob(
+ dataToSave: any,
+ endpoint: string,
+ errorMessage: string
+ ): Promise {
+ const url = `${this.BASE}/${endpoint}`;
+ const request = FetchUtils.getPOSTConfig(dataToSave);
+ return FetchService.sendRequestForBlob(url, request, errorMessage);
}
static patchData(
@@ -31,7 +51,7 @@ export default class FetchService {
): Promise {
const url = `${this.BASE}/${endpoint}`;
const request = FetchUtils.getPATCHConfig(dataToSave);
- return FetchService.sendRequest(url, request, errorMessage);
+ return FetchService.sendRequestForJson(url, request, errorMessage);
}
static putData(
@@ -41,14 +61,34 @@ export default class FetchService {
): Promise {
const url = `${this.BASE}/${endpoint}`;
const request = FetchUtils.getPUTConfig(dataToSave);
- return FetchService.sendRequest(url, request, errorMessage);
+ return FetchService.sendRequestForJson(url, request, errorMessage);
}
- private static sendRequest(
+ private static sendRequestForJson(
url: string,
request: RequestInit,
errorMessage: string
): Promise {
+ return this.sendRequest(url, request, errorMessage).then((response) => {
+ return response.json();
+ });
+ }
+
+ private static sendRequestForBlob(
+ url: string,
+ request: RequestInit,
+ errorMessage: string
+ ): Promise {
+ return this.sendRequest(url, request, errorMessage).then((response) => {
+ return response.blob();
+ });
+ }
+
+ private static sendRequest(
+ url: string,
+ request: RequestInit,
+ errorMessage: string
+ ): Promise {
return fetch(url, request)
.catch((error) => {
throw new ApiError(
@@ -93,41 +133,6 @@ export default class FetchService {
`Fehler: ${response.status} ${response.statusText}`
);
}
- return response.json();
- });
- }
-
- static postForPdf(
- dataToSave: any,
- endpoint: string,
- errorMessage: string
- ): Promise {
- const url = `${this.BASE}/${endpoint}`;
- const request = FetchUtils.getPdfPOSTConfig(dataToSave);
- return FetchService.sendRequestForPDF(url, request, errorMessage);
- }
-
- private static sendRequestForPDF(
- url: string,
- request: RequestInit,
- errorMessage: string
- ): Promise {
- return fetch(url, request)
- .catch((error) => {
- throw new ApiError(
- Levels.ERROR,
- `Die Verbindung zum Service konnte nicht aufgebaut werden.`,
- error
- );
- })
- .then((response) => {
- if (!response.ok) {
- throw new ApiError(
- Levels.ERROR,
- errorMessage,
- `Fehler: ${response.status} ${response.statusText}`
- );
- }
return response;
});
}
diff --git a/frontend/src/api/service/GeneratePdfService.ts b/frontend/src/api/service/GeneratePdfService.ts
index 6c0ba332..2ee6cc5b 100644
--- a/frontend/src/api/service/GeneratePdfService.ts
+++ b/frontend/src/api/service/GeneratePdfService.ts
@@ -8,7 +8,7 @@ export default class GeneratePdfService {
charttype: string,
zaehlungId: string,
data: FormData
- ): Promise {
+ ): Promise {
return this.postPdfCustomFetchTemplate(
"zaehlung",
charttype,
@@ -21,7 +21,7 @@ export default class GeneratePdfService {
charttype: string,
messstelleId: string,
data: FormData
- ): Promise {
+ ): Promise {
return this.postPdfCustomFetchTemplate(
"messstelle",
charttype,
@@ -35,7 +35,7 @@ export default class GeneratePdfService {
charttype: string,
fachId: string,
data: FormData
- ): Promise {
+ ): Promise {
return FetchService.postForPdf(
data,
`${this.ENDPOINT}/${type}?charttype=${charttype}&fach_id=${fachId}`,
@@ -43,7 +43,7 @@ export default class GeneratePdfService {
);
}
- static postPdfCustomFetchReport(data: FormData): Promise {
+ static postPdfCustomFetchReport(data: FormData): Promise {
return FetchService.postForPdf(
data,
`${this.ENDPOINT}/report`,
diff --git a/frontend/src/api/service/MessstelleAuswertungService.ts b/frontend/src/api/service/MessstelleAuswertungService.ts
index f8002b0c..6cf74db6 100644
--- a/frontend/src/api/service/MessstelleAuswertungService.ts
+++ b/frontend/src/api/service/MessstelleAuswertungService.ts
@@ -12,8 +12,8 @@ export default class MessstelleAuswertungService {
"Beim Laden der Messstellen ist ein Fehler aufgetreten."
);
}
- static generate(options: MessstelleAuswertungOptionsDTO): Promise {
- return FetchService.postData(
+ static generate(options: MessstelleAuswertungOptionsDTO): Promise {
+ return FetchService.postForBlob(
options,
`${this.ENDPOINT}`,
"Beim Laden der Auswertung ist ein Fehler aufgetreten."
diff --git a/frontend/src/components/common/DateRangePicker.vue b/frontend/src/components/common/DateRangePicker.vue
index 838a9bd0..4b52a8c7 100644
--- a/frontend/src/components/common/DateRangePicker.vue
+++ b/frontend/src/components/common/DateRangePicker.vue
@@ -1,8 +1,8 @@
{
- res.blob().then((blob) => {
- // Erster Buchstabe soll im Dateinamen groß geschrieben sein, also z. B. Ganglinie statt ganglinie.
- const typeForFilename: string =
- type.charAt(0).toUpperCase() + type.slice(1);
-
- // Beispiel: 251101K_15-11-2020_Belastungsplan.pdf
- const filename = `${reportTools.getFileName(
- Erhebungsstelle.MESSSTELLE,
- typeForFilename,
- options.value.zeitraum
- )}.pdf`;
- downloadUtils.downloadFile(blob, filename);
- });
+ .then((blob) => {
+ // Erster Buchstabe soll im Dateinamen groß geschrieben sein, also z. B. Ganglinie statt ganglinie.
+ const typeForFilename: string =
+ type.charAt(0).toUpperCase() + type.slice(1);
+
+ // Beispiel: 251101K_15-11-2020_Belastungsplan.pdf
+ const filename = `${reportTools.getFileName(
+ Erhebungsstelle.MESSSTELLE,
+ typeForFilename,
+ options.value.zeitraum
+ )}.pdf`;
+ downloadUtils.downloadFile(blob, filename);
})
.catch((error) => snackbarStore.showApiError(error))
.finally(() => (loadingFile.value = false));
diff --git a/frontend/src/components/messstelle/gesamtauswertung/stepper/AuswertungStepper.vue b/frontend/src/components/messstelle/gesamtauswertung/stepper/AuswertungStepper.vue
index ad8a5432..abaebe91 100644
--- a/frontend/src/components/messstelle/gesamtauswertung/stepper/AuswertungStepper.vue
+++ b/frontend/src/components/messstelle/gesamtauswertung/stepper/AuswertungStepper.vue
@@ -63,6 +63,7 @@
import type MessstelleAuswertungOptionsDTO from "@/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO";
import type { VStepperVerticalItem } from "vuetify/labs/components";
+import { head, isEmpty, toArray } from "lodash";
import { computed, ref, watch } from "vue";
import FahrzeugeStepContent from "@/components/messstelle/gesamtauswertung/stepper/FahrzeugeStepContent.vue";
@@ -117,16 +118,20 @@ const selectedTagesTypAsSummary = computed(() => {
return summary;
});
const selectedOrtAsSummary = computed(() => {
- const mstIds = auswertungOptions.value.mstIds;
+ const messstelleAuswertungIds = toArray(
+ auswertungOptions.value.messstelleAuswertungIds
+ );
let summary = ``;
- if (mstIds.length > 1) {
- summary = `Mst-Id's': ${mstIds.join(", ")}`;
- }
- if (mstIds.length === 1) {
- const mqIds = auswertungOptions.value.mqIds;
- summary = `Mst-Id: ${mstIds[0]}, MQ-Id${
- mqIds.length > 1 ? "'s" : ""
- }: ${mqIds.join(", ")} `;
+ const allMstIds: Array = messstelleAuswertungIds.map(
+ (value) => value.mstId
+ );
+ if (!isEmpty(messstelleAuswertungIds)) {
+ summary = `Mst-Id${allMstIds.length > 1 ? "'s" : ""}: ${allMstIds.join(", ")}`;
+ if (messstelleAuswertungIds.length === 1) {
+ const firstMessstelleAuswertungIdDTO = head(messstelleAuswertungIds)!;
+ const mqIds = toArray(firstMessstelleAuswertungIdDTO.mqIds);
+ summary = `${summary}, MQ-Id${mqIds.length > 1 ? "'s" : ""}: ${mqIds.join(", ")} `;
+ }
}
if (!isOrtMessstelleSelected()) {
summary = "Es muss mindestens eine Messstelle ausgewählt sein.";
@@ -138,7 +143,7 @@ const selectedOrtAsSummary = computed(() => {
});
function isJahreSelected(): boolean {
- return !(auswertungOptions.value.jahre.length === 0 && activeStep.value > 1);
+ return !(isEmpty(auswertungOptions.value.jahre) && activeStep.value > 1);
}
function isTagesTypSelected(): boolean {
@@ -148,19 +153,23 @@ function isTagesTypSelected(): boolean {
}
function isJahresintervallSelected(): boolean {
- return !(
- auswertungOptions.value.zeitraum.length === 0 && activeStep.value > 0
- );
+ return !(isEmpty(auswertungOptions.value.zeitraum) && activeStep.value > 0);
}
function isOrtMessstelleSelected(): boolean {
- return !(auswertungOptions.value.mstIds.length === 0 && activeStep.value > 3);
+ return !(
+ isEmpty(auswertungOptions.value.messstelleAuswertungIds) &&
+ activeStep.value > 3
+ );
}
function isOrtMessquerschnittSelected(): boolean {
+ const messstelleAuswertungIdDTOS = toArray(
+ auswertungOptions.value.messstelleAuswertungIds
+ );
return !(
- auswertungOptions.value.mstIds.length === 1 &&
- auswertungOptions.value.mqIds.length === 0 &&
+ messstelleAuswertungIdDTOS.length === 1 &&
+ head(messstelleAuswertungIdDTOS)!.mqIds.length === 0 &&
activeStep.value > 3
);
}
diff --git a/frontend/src/components/messstelle/gesamtauswertung/stepper/OrtStepContent.vue b/frontend/src/components/messstelle/gesamtauswertung/stepper/OrtStepContent.vue
index 7d1f1b14..24e35554 100644
--- a/frontend/src/components/messstelle/gesamtauswertung/stepper/OrtStepContent.vue
+++ b/frontend/src/components/messstelle/gesamtauswertung/stepper/OrtStepContent.vue
@@ -1,7 +1,7 @@
-
+
import type KeyVal from "@/types/common/KeyVal";
+import type KeyValObject from "@/types/common/KeyValObject";
import type MessquerschnittAuswertungDTO from "@/types/messstelle/auswertung/MessquerschnittAuswertungDTO";
import type MessstelleAuswertungDTO from "@/types/messstelle/auswertung/MessstelleAuswertungDTO";
+import type MessstelleAuswertungIdDTO from "@/types/messstelle/auswertung/MessstelleAuswertungIdDTO";
import type MessstelleAuswertungOptionsDTO from "@/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO";
+import { toArray } from "lodash";
import { computed, onMounted, ref, watch } from "vue";
import MessstelleAuswertungService from "@/api/service/MessstelleAuswertungService";
@@ -79,31 +82,39 @@ const allVisibleMessstellen = ref>([]);
const direction = ref(messstelleUtils.alleRichtungen);
watch(
- () => auswertungOptions.value.mstIds,
+ () => auswertungOptions.value.messstelleAuswertungIds,
() => {
setDefaultDirection();
setVerfuegbareVerkehrsarten();
}
);
-const messstellen = computed>(() => {
- const result: Array = [];
- allVisibleMessstellen.value.forEach((mst) => {
- result.push({
+const messstellen = computed>(() => {
+ const result: Array = allVisibleMessstellen.value.map((mst) => {
+ const item = {
+ mstId: mst.mstId,
+ mqIds: [],
+ } as MessstelleAuswertungIdDTO;
+
+ item.mqIds = toArray(mst.messquerschnitte).map((mq) => mq.mqId);
+ return {
title: `${mst.mstId}-${mst.standort ?? ""} (${
mst.detektierteVerkehrsarten ?? ""
})`,
- value: mst.mstId,
- });
+ value: item,
+ };
});
return result;
});
const richtungValues = computed>(() => {
const result: Array = [];
- if (auswertungOptions.value.mstIds.length === 1) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length === 1) {
for (const messstelle of allVisibleMessstellen.value) {
- if (messstelle.mstId === auswertungOptions.value.mstIds[0]) {
+ if (
+ messstelle.mstId ===
+ auswertungOptions.value.messstelleAuswertungIds[0].mstId
+ ) {
if (messstelle.messquerschnitte.length > 1) {
result.push({
title: messstelleUtils.alleRichtungen,
@@ -118,7 +129,11 @@ const richtungValues = computed>(() => {
"Fehler bei der Bestimmung der Himmelsrichtung.",
value: querschnitt.fahrtrichtung,
};
- if (!result.includes(keyVal)) {
+ if (
+ result.filter((entry) => {
+ return entry.title === keyVal.title;
+ }).length === 0
+ ) {
result.push(keyVal);
}
}
@@ -132,9 +147,12 @@ const richtungValues = computed>(() => {
const lageValues = computed>(() => {
const result: Array = [];
- if (auswertungOptions.value.mstIds.length === 1) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length === 1) {
for (const messstelle of allVisibleMessstellen.value) {
- if (messstelle.mstId === auswertungOptions.value.mstIds[0]) {
+ if (
+ messstelle.mstId ===
+ auswertungOptions.value.messstelleAuswertungIds[0].mstId
+ ) {
messstelle.messquerschnitte.forEach(
(querschnitt: MessquerschnittAuswertungDTO) => {
if (
@@ -164,14 +182,14 @@ const isLageReadonly = computed(() => {
const showSelectAllButton = computed(() => {
return (
- auswertungOptions.value.mstIds.length <=
+ auswertungOptions.value.messstelleAuswertungIds.length <=
allVisibleMessstellen.value.length / 2
);
});
const directionHint = computed(() => {
let hint = "";
- if (auswertungOptions.value.mstIds.length > 1) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length > 1) {
hint =
"Wenn mehrere Messstellen ausgewählt wurden, kann kein Messquerschnitt ausgewählt werden.";
}
@@ -180,7 +198,7 @@ const directionHint = computed(() => {
const messstelleHint = computed(() => {
let hint = "";
- if (auswertungOptions.value.mstIds.length > 1) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length > 1) {
hint =
"Wenn mehrere Messstellen ausgewählt wurden, kann kein Messquerschnitt ausgewählt werden.";
} else if (disableMessstelle.value) {
@@ -192,9 +210,9 @@ const messstelleHint = computed(() => {
const disableMessstelle = computed(() => {
return (
- auswertungOptions.value.mqIds.length !== 0 &&
+ auswertungOptions.value.messstelleAuswertungIds.length > 0 &&
+ auswertungOptions.value.messstelleAuswertungIds[0].mqIds.length > 0 &&
direction.value !== messstelleUtils.alleRichtungen &&
- auswertungOptions.value.mqIds.length > 0 &&
richtungValues.value.length > 1
);
});
@@ -212,10 +230,12 @@ function loadAllVisibleMessstellen(): void {
}
function setDefaultDirection(): void {
- resetMqsIfNecessary();
- if (auswertungOptions.value.mstIds.length === 1) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length === 1) {
for (const messstelle of allVisibleMessstellen.value) {
- if (messstelle.mstId === auswertungOptions.value.mstIds[0]) {
+ if (
+ messstelle.mstId ===
+ auswertungOptions.value.messstelleAuswertungIds[0].mstId
+ ) {
if (messstelle.messquerschnitte.length === 1) {
direction.value = messstelle.messquerschnitte[0].fahrtrichtung;
} else if (messstelle.messquerschnitte.length > 1) {
@@ -229,10 +249,10 @@ function setDefaultDirection(): void {
function setVerfuegbareVerkehrsarten() {
auswertungOptions.value.verfuegbareVerkehrsarten = [];
- if (auswertungOptions.value.mstIds.length > 0) {
+ if (auswertungOptions.value.messstelleAuswertungIds.length > 0) {
for (const messstelle of allVisibleMessstellen.value) {
if (
- auswertungOptions.value.mstIds.includes(messstelle.mstId) &&
+ existsMstIdInAuswertungIds(messstelle.mstId) &&
!auswertungOptions.value.verfuegbareVerkehrsarten.includes(
messstelle.detektierteVerkehrsarten
)
@@ -248,13 +268,17 @@ function setVerfuegbareVerkehrsarten() {
}
}
-function preassignMqIdsInOptions() {
- auswertungOptions.value.mqIds = [];
- lageValues.value.forEach((value) =>
- auswertungOptions.value.mqIds.push(value.value)
+function existsMstIdInAuswertungIds(mstId: string) {
+ return auswertungOptions.value.messstelleAuswertungIds.find(
+ (value) => value.mstId === mstId
);
}
+function preassignMqIdsInOptions() {
+ auswertungOptions.value.messstelleAuswertungIds[0].mqIds =
+ lageValues.value.map((value) => value.value);
+}
+
function buttonClick() {
if (showSelectAllButton.value) {
selectAllMessstellen();
@@ -264,19 +288,16 @@ function buttonClick() {
}
function selectAllMessstellen() {
- auswertungOptions.value.mstIds = [];
- allVisibleMessstellen.value.forEach((mst: MessstelleAuswertungDTO) => {
- auswertungOptions.value.mstIds.push(mst.mstId);
- });
+ auswertungOptions.value.messstelleAuswertungIds =
+ allVisibleMessstellen.value.map((mst) => {
+ const item = { mstId: mst.mstId, mqIds: [] } as MessstelleAuswertungIdDTO;
+ item.mqIds = mst.messquerschnitte.map((mq) => mq.mqId);
+ return item;
+ });
}
function deselectAllMessstellen() {
- auswertungOptions.value.mstIds = [];
-}
-
-function resetMqsIfNecessary() {
- if (auswertungOptions.value.mstIds.length > 1)
- auswertungOptions.value.mqIds = [];
+ auswertungOptions.value.messstelleAuswertungIds = [];
}
function REQUIRED(v: Array) {
diff --git a/frontend/src/components/zaehlstelle/ZaehldatenDiagramme.vue b/frontend/src/components/zaehlstelle/ZaehldatenDiagramme.vue
index ed414b3b..06a549bc 100644
--- a/frontend/src/components/zaehlstelle/ZaehldatenDiagramme.vue
+++ b/frontend/src/components/zaehlstelle/ZaehldatenDiagramme.vue
@@ -748,18 +748,16 @@ function fetchPdf(formData: FormData, type: string) {
selectedZaehlung.value.id,
formData
)
- .then((res) => {
- res.blob().then((blob) => {
- // Erster Buchstabe soll im Dateinamen groß geschrieben sein, also z. B. Ganglinie statt ganglinie.
- const typeForFilename: string =
- type.charAt(0).toUpperCase() + type.slice(1);
- const filename = `${reportTools.getFileName(
- Erhebungsstelle.ZAEHLSTELLE,
- typeForFilename,
- [selectedZaehlung.value.datum]
- )}.pdf`;
- downloadUtils.downloadFile(blob, filename);
- });
+ .then((blob) => {
+ // Erster Buchstabe soll im Dateinamen groß geschrieben sein, also z. B. Ganglinie statt ganglinie.
+ const typeForFilename: string =
+ type.charAt(0).toUpperCase() + type.slice(1);
+ const filename = `${reportTools.getFileName(
+ Erhebungsstelle.ZAEHLSTELLE,
+ typeForFilename,
+ [selectedZaehlung.value.datum]
+ )}.pdf`;
+ downloadUtils.downloadFile(blob, filename);
})
.catch((error) => snackbarStore.showApiError(error))
.finally(() => (loadingFile.value = false));
diff --git a/frontend/src/types/common/KeyValObject.ts b/frontend/src/types/common/KeyValObject.ts
new file mode 100644
index 00000000..31b3c3dd
--- /dev/null
+++ b/frontend/src/types/common/KeyValObject.ts
@@ -0,0 +1,4 @@
+export default interface KeyValObject {
+ title: string;
+ value: object;
+}
diff --git a/frontend/src/types/messstelle/auswertung/MessstelleAuswertungIdDTO.ts b/frontend/src/types/messstelle/auswertung/MessstelleAuswertungIdDTO.ts
new file mode 100644
index 00000000..8e635ac0
--- /dev/null
+++ b/frontend/src/types/messstelle/auswertung/MessstelleAuswertungIdDTO.ts
@@ -0,0 +1,4 @@
+export default interface MessstelleAuswertungIdDTO {
+ mstId: string;
+ mqIds: Array;
+}
diff --git a/frontend/src/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO.ts b/frontend/src/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO.ts
index bfb23a33..aa188e1b 100644
--- a/frontend/src/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO.ts
+++ b/frontend/src/types/messstelle/auswertung/MessstelleAuswertungOptionsDTO.ts
@@ -1,3 +1,4 @@
+import type MessstelleAuswertungIdDTO from "@/types/messstelle/auswertung/MessstelleAuswertungIdDTO";
import type FahrzeugOptions from "@/types/messstelle/FahrzeugOptions";
import { AuswertungsZeitraum } from "@/types/enum/AuswertungCategories";
@@ -7,8 +8,7 @@ export default interface MessstelleAuswertungOptionsDTO {
jahre: Array;
tagesTyp: TagesTyp;
zeitraum: Array;
- mstIds: Array;
- mqIds: Array;
+ messstelleAuswertungIds: Array;
fahrzeuge: FahrzeugOptions;
// Nicht fuer das Backend
diff --git a/frontend/src/util/DefaultObjectCreator.ts b/frontend/src/util/DefaultObjectCreator.ts
index bc3c7bf2..7bddf239 100644
--- a/frontend/src/util/DefaultObjectCreator.ts
+++ b/frontend/src/util/DefaultObjectCreator.ts
@@ -127,8 +127,7 @@ export default class DefaultObjectCreator {
jahre: [],
tagesTyp: "" as TagesTyp,
zeitraum: [],
- mstIds: [],
- mqIds: [],
+ messstelleAuswertungIds: [],
fahrzeuge: {
kraftfahrzeugverkehr: false,
schwerverkehr: false,
diff --git a/frontend/src/views/AuswertungView.vue b/frontend/src/views/AuswertungView.vue
index 2df57024..704fe752 100644
--- a/frontend/src/views/AuswertungView.vue
+++ b/frontend/src/views/AuswertungView.vue
@@ -49,6 +49,7 @@ import { useDisplay } from "vuetify";
import MessstelleAuswertungService from "@/api/service/MessstelleAuswertungService";
import AuswertungStepper from "@/components/messstelle/gesamtauswertung/stepper/AuswertungStepper.vue";
import DefaultObjectCreator from "@/util/DefaultObjectCreator";
+import { useDownloadUtils } from "@/util/DownloadUtils";
const minWidth = 600;
@@ -80,20 +81,11 @@ const isEverythingValid = computed(() => {
auswertungsOptions.value.zeitraum.length > 0 &&
auswertungsOptions.value.tagesTyp.length > 0 &&
auswertungsOptions.value.jahre.length > 0 &&
- areMstAndMqValid.value &&
+ auswertungsOptions.value.messstelleAuswertungIds.length > 0 &&
areFahrzeugeValid.value
);
});
-const areMstAndMqValid = computed(() => {
- return (
- (auswertungsOptions.value.mstIds.length > 1 &&
- auswertungsOptions.value.mqIds.length === 0) ||
- (auswertungsOptions.value.mstIds.length === 1 &&
- auswertungsOptions.value.mqIds.length > 0)
- );
-});
-
const areFahrzeugeValid = computed(() => {
return (
auswertungsOptions.value.fahrzeuge.kraftfahrzeugverkehr ||
@@ -118,6 +110,12 @@ function resetAuswertungsOptions() {
}
function auswertungStarten() {
- MessstelleAuswertungService.generate(auswertungsOptions.value);
+ MessstelleAuswertungService.generate(auswertungsOptions.value).then(
+ (blob) => {
+ // Beispiel: 251101K_15-11-2020_Belastungsplan.pdf
+ const filename = `Gesamtauswertung_${new Date().toISOString().split("T")[0]}.xlsx`;
+ useDownloadUtils().downloadFile(blob, filename);
+ }
+ );
}
diff --git a/frontend/src/views/PdfReportView.vue b/frontend/src/views/PdfReportView.vue
index dffe0fc4..bd99b882 100644
--- a/frontend/src/views/PdfReportView.vue
+++ b/frontend/src/views/PdfReportView.vue
@@ -426,11 +426,9 @@ function generatePdf() {
function fetchPdf(formData: FormData) {
formData.append("department", getDepartment.value);
GeneratePdfService.postPdfCustomFetchReport(formData)
- .then((res) => {
- res.blob().then((blob) => {
- pdfSourceAsBlob.value = blob;
- downloadPdf();
- });
+ .then((blob) => {
+ pdfSourceAsBlob.value = blob;
+ downloadPdf();
})
.catch((error) => snackbarStore.showApiError(error))
.finally(() => (loadingPdf.value = false));