diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 3b980d4..f3be23a 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -66,6 +66,13 @@ mdi-counter {{ item.text }} + + mdi-cards-diamond + {{ item.text }} + @@ -94,6 +101,7 @@ ...)
* Straßen- / Platzname (Rosenheimerplatz, Dachauer Straße, ...)
+ * Messstellennummer / -name (4203,...)
@@ -194,6 +202,7 @@ import SucheWordSuggestDTO from "@/domain/dto/suche/SucheWordSuggestDTO"; import SucheComplexSuggestsDTO from "@/domain/dto/suche/SucheComplexSuggestsDTO"; import SucheZaehlungSuggestDTO from "@/domain/dto/suche/SucheZaehlungSuggestDTO"; import SucheZaehlstelleSuggestDTO from "@/domain/dto/suche/SucheZaehlstelleSuggestDTO"; +import SucheMessstelleSuggestDTO from "@/domain/dto/suche/SucheMessstelleSuggestDTO"; import DefaultObjectCreator from "@/util/DefaultObjectCreator"; import BaseUrlProvider from "@/api/util/BaseUrlProvider"; /* eslint-enable no-unused-vars */ @@ -207,6 +216,9 @@ export default class App extends Vue { private static readonly SUGGESTION_TYPE_ZAEHLSTELLE: string = "zaehlstelle"; private static readonly SUGGESTION_TYPE_ZAEHLUNG: string = "zaehlung"; + + private static readonly SUGGESTION_TYPE_MESSSTELLE: string = "messstelle"; + private static readonly URL_HANDBUCH_LINK: string = "https://wilma.muenchen.de/web/senders/af10dc2a-8da5-4d24-815a-b6a9df4c686b/documents/54ddf065-d01f-4965-9bdf-c66ea47927c8"; @@ -256,6 +268,10 @@ export default class App extends Vue { return App.SUGGESTION_TYPE_ZAEHLUNG; } + get suggestionTypeMessstelle(): string { + return App.SUGGESTION_TYPE_MESSSTELLE; + } + // Lifecycle hook created() { SsoUserInfoService.getUserInfo() @@ -270,12 +286,10 @@ export default class App extends Vue { return false; }); this.getFrontendVersion().then((version: string) => { - console.info("Frontend Version: ", version); this.frontendVersion = version; }); this.getBackendVersion().then((version: string) => { - console.info("Backend Version: ", version); this.backendVersion = version; }); } @@ -313,6 +327,7 @@ export default class App extends Vue { word.text, this.suggestionTypeVorschlag, "", + "", "" ) ); @@ -326,7 +341,8 @@ export default class App extends Vue { zaehlung.text, this.suggestionTypeZaehlung, zaehlung.zaehlstelleId, - zaehlung.id + zaehlung.id, + "" ) ); } @@ -339,11 +355,26 @@ export default class App extends Vue { zaehlstelle.text, this.suggestionTypeZaehlstelle, zaehlstelle.id, + "", "" ) ); } ); + + suggestions.messstellenSuggests.forEach( + (messstelle: SucheMessstelleSuggestDTO) => { + this.suggestions.push( + new Suggest( + messstelle.text, + this.suggestionTypeMessstelle, + "", + "", + messstelle.id + ) + ); + } + ); }) .catch((error) => this.$store.dispatch("snackbar/showError", error) @@ -390,11 +421,15 @@ export default class App extends Vue { } this.$store.commit("search/lastSearchQuery", this.searchQuery); - if (this.$route.name === "zaehlstelle" && this.searchQuery !== "") { + if ( + (this.$route.name === "zaehlstelle" || + this.$route.name === "messstelle") && + this.searchQuery !== "" + ) { this.$router.push(`/`); } - SucheService.searchZaehlstelle(this.searchQuery) + SucheService.searchErhebungsstelle(this.searchQuery) .then((result) => { this.$store.commit("search/result", result); }) @@ -422,6 +457,12 @@ export default class App extends Vue { ); } + showMessstelle(item: Suggest) { + this.selectedSuggestion = + DefaultObjectCreator.createDefaultSuggestion(); + this.$router.push(`/messstelle/${item.mstId}`); + } + updateSearchQuery(itemIndex: number) { if (itemIndex > -1) { this.searchQuery = this.getSuggestions[itemIndex].text; diff --git a/frontend/src/api/service/SucheService.ts b/frontend/src/api/service/SucheService.ts index 12c9d2d..0ae9612 100644 --- a/frontend/src/api/service/SucheService.ts +++ b/frontend/src/api/service/SucheService.ts @@ -1,7 +1,5 @@ import FetchService from "@/api/service/FetchService"; import SucheComplexSuggestsDTO from "@/domain/dto/suche/SucheComplexSuggestsDTO"; -import ZaehlstelleKarteDTO from "@/domain/dto/ZaehlstelleKarteDTO"; -import MessstelleKarteDTO from "@/domain/dto/MessstelleKarteDTO"; import AnzeigeKarteDTO from "@/domain/dto/AnzeigeKarteDTO"; export default class SucheService { @@ -16,61 +14,12 @@ export default class SucheService { ); } - static searchZaehlstelle(query: string): Promise> { + static searchErhebungsstelle( + query: string + ): Promise> { return FetchService.getData( `${this.ENDPOINT}/search?nofilter=true&query=${query}`, - "Beim Suchen von Zählstellen ist ein Fehler aufgetreten." + "Beim Suchen von Zähl-/Messstellen ist ein Fehler aufgetreten." ); } - static getMockMessstelleKarte(): AnzeigeKarteDTO[] { - const mstOne: MessstelleKarteDTO = { - type: "messstelle", - id: "randomID", - latitude: 48.1887227, - longitude: 11.4290655, - tooltip: { - mstId: "MSTID1", - standortDatenportal: "StandortDatenportal1", - stadtbezirk: 13, - realisierungsdatum: "01.01.2023", - abbaudatum: "01.02.2023", - datumLetzteMessung: "15.01.2023", - kfz: true, - }, - }; - - const msttwo: MessstelleKarteDTO = { - type: "messstelle", - id: "randomID2", - latitude: 48.1316995, - longitude: 11.6227731, - tooltip: { - mstId: "MSTID2", - standortDatenportal: "StandortDatenportal2", - stadtbezirk: 13, - realisierungsdatum: "02.01.2020", - abbaudatum: "04.04.2020", - datumLetzteMessung: "31.03.2020", - kfz: true, - }, - }; - - const mstthree: MessstelleKarteDTO = { - type: "messstelle", - id: "randomID3", - latitude: 48.1315995, - longitude: 11.6217731, - tooltip: { - mstId: "MSTID3", - standortDatenportal: "StandortDatenportal3", - stadtbezirk: 13, - realisierungsdatum: "01.01.2023", - abbaudatum: "01.01.2023", - datumLetzteMessung: "01.03.2023", - kfz: true, - }, - }; - - return [mstOne, msttwo, mstthree]; - } } diff --git a/frontend/src/components/map/ZaehlstelleMap.vue b/frontend/src/components/map/ZaehlstelleMap.vue index 9d1bfbb..f621cc5 100644 --- a/frontend/src/components/map/ZaehlstelleMap.vue +++ b/frontend/src/components/map/ZaehlstelleMap.vue @@ -171,7 +171,7 @@ import { Levels } from "@/api/error"; import CreateZaehlstelleDialog from "@/components/zaehlstelle/CreateZaehlstelleDialog.vue"; import DefaultObjectCreator from "@/util/DefaultObjectCreator"; import BackendIdDTO from "@/domain/dto/bearbeiten/BackendIdDTO"; -import TooltipDTO from "@/domain/dto/TooltipDTO"; +import TooltipZaehlstelleDTO from "@/domain/dto/TooltipZaehlstelleDTO"; import markerIconRed from "@/assets/marker-icon-red.png"; import markerIconDiamondViolet from "@/assets/cards-diamond-violet.png"; import markerIconDiamondRed from "@/assets/cards-diamond-red.png"; @@ -257,10 +257,10 @@ export default class ZaehlstelleMap extends Vue { }; mounted() { - this.searchZaehlstelle(); + this.searchErhebungsstelle(); } - get getZaehlstellenKarteFromStore(): AnzeigeKarteDTO[] { + get getErhebungsstellenKarteFromStore(): AnzeigeKarteDTO[] { return this.$store.getters["search/result"]; } @@ -328,13 +328,11 @@ export default class ZaehlstelleMap extends Vue { } @Watch("reload") - private searchZaehlstelle() { - SucheService.searchZaehlstelle( + private searchErhebungsstelle() { + SucheService.searchErhebungsstelle( this.$store.getters["search/lastSearchQuery"] ) .then((result) => { - // fügt testdaten für Messstellen hinzu, muss später entfernt werden sobald der richtige Service verfügbar ist - result.push(...SucheService.getMockMessstelleKarte()); this.$store.commit("search/result", result); }) .catch((error) => { @@ -345,7 +343,7 @@ export default class ZaehlstelleMap extends Vue { }); } - // Erzeugt für jede vorhandene Zaehlstelle einen Marker + // Erzeugt für jede vorhandene Zaehl-/Messstelle einen Marker // und fuegt diesen dem MarkerCluster hinzu private setMarkerToMap() { // Setzen einer leeren ZaehlstelleKarte ohne Marker @@ -356,20 +354,20 @@ export default class ZaehlstelleMap extends Vue { chunkedLoading: true, }); - const zaehlstellenKarte: AnzeigeKarteDTO[] = - this.getZaehlstellenKarteFromStore; + const erhebungsstellenKarte: AnzeigeKarteDTO[] = + this.getErhebungsstellenKarteFromStore; const markers: Array = []; - zaehlstellenKarte.forEach((anzeigeKarte) => { - if (anzeigeKarte.type != "messstelle") { + erhebungsstellenKarte.forEach((anzeigeKarte) => { + if (anzeigeKarte.type == "messstelle") { markers.push( - this.createMarkerForZaehlstelle( - anzeigeKarte as ZaehlstelleKarteDTO + this.createMarkerForMessstelle( + anzeigeKarte as MessstelleKarteDTO ) ); } else { markers.push( - this.createMarkerForMessstelle( - anzeigeKarte as MessstelleKarteDTO + this.createMarkerForZaehlstelle( + anzeigeKarte as ZaehlstelleKarteDTO ) ); } @@ -377,7 +375,7 @@ export default class ZaehlstelleMap extends Vue { this.mapMarkerClusterGroup.addLayers(markers); this.theMap.mapObject.addLayer(this.mapMarkerClusterGroup); - if (zaehlstellenKarte.length === 1) { + if (erhebungsstellenKarte.length === 1) { /** * Falls in der Main.view nach einer bestimmten Zaehlstelle gesucht * und diese Suche mit Druck auf die Enter-Taste eingeleitet wird, @@ -385,7 +383,7 @@ export default class ZaehlstelleMap extends Vue { * Auf diese eine mit einem Icon angezeigte Zaehlstelle muss dann zentriert werden. */ this.theMap.mapObject.setView( - this.createLatLng(zaehlstellenKarte[0]), + this.createLatLng(erhebungsstellenKarte[0]), 18 ); } else if (this.zId == null) { @@ -403,10 +401,13 @@ export default class ZaehlstelleMap extends Vue { this.createLatLng(zaehlstelleKarte), this.markerOptionsZaehlstelle(zaehlstelleKarte) ); - marker.bindTooltip(this.createTooltip(zaehlstelleKarte.tooltip), { - direction: "top", - offset: [-14, 0], - }); + marker.bindTooltip( + this.createTooltipZaehlstelle(zaehlstelleKarte.tooltip), + { + direction: "top", + offset: [-14, 0], + } + ); marker.on("click", () => { // Zeige alle Zaehlungen zur Zaehlstelle an. @@ -430,7 +431,6 @@ export default class ZaehlstelleMap extends Vue { } ); marker.on("click", () => { - // Zeige alle Zaehlungen zur Zaehlstelle an. this.routeToMessstelle(messstelleKarteDto.id); }); return marker; @@ -446,7 +446,12 @@ export default class ZaehlstelleMap extends Vue { * - anzahlZaehlungen * - datumLetzteZaehlung */ - private createTooltip(tooltipDto: TooltipDTO): string { + private createTooltipZaehlstelle( + tooltipDto: TooltipZaehlstelleDTO + ): string { + if (!tooltipDto) { + return "
"; + } let tooltip = "
"; if (tooltipDto.zaehlstellennnummer) { tooltip = `${tooltip}Zählstelle: ${tooltipDto.zaehlstellennnummer}
`; @@ -480,16 +485,25 @@ export default class ZaehlstelleMap extends Vue { } private createTooltipMessstelle(tooltipDto: TooltipMessstelleDTO): string { + if (!tooltipDto) { + return "
"; + } let tooltip = "
"; if (tooltipDto.mstId) { tooltip = `${tooltip}Messstelle: ${tooltipDto.mstId}
`; } - if (tooltipDto.standortDatenportal) { - tooltip = `${tooltip}${tooltipDto.standortDatenportal}
`; + if (tooltipDto.standort) { + tooltip = `${tooltip}${tooltipDto.standort}
`; } tooltip = `${tooltip}
`; - if (tooltipDto.stadtbezirk) { - tooltip = `${tooltip}Stadtbezirk: ${tooltipDto.stadtbezirk}
`; + if (!tooltipDto.stadtbezirk) { + tooltip = `${tooltip}Stadtbezirk: Keine Angabe
`; + } else { + tooltip = `${tooltip}Stadtbezirk: `; + if (tooltipDto.stadtbezirknummer) { + tooltip = `${tooltip}${tooltipDto.stadtbezirknummer} - `; + } + tooltip = `${tooltip}${tooltipDto.stadtbezirk}
`; } if (tooltipDto.realisierungsdatum) { tooltip = `${tooltip} Aufbau: ${tooltipDto.realisierungsdatum}
`; @@ -497,11 +511,11 @@ export default class ZaehlstelleMap extends Vue { if (tooltipDto.abbaudatum) { tooltip = `${tooltip}Abbau: ${tooltipDto.abbaudatum}
`; } - if (tooltipDto.kfz) { - tooltip = `${tooltip}KFZ
`; + if (tooltipDto.detektierteVerkehrsarten) { + tooltip = `${tooltip}Verkehrsarten: ${tooltipDto.detektierteVerkehrsarten}
`; } - if (tooltipDto.datumLetzteMessung) { - tooltip = `${tooltip}Letzter Messtag: ${tooltipDto.datumLetzteMessung}
`; + if (tooltipDto.datumLetztePlausibleMessung) { + tooltip = `${tooltip}Letzte plausible Messung: ${tooltipDto.datumLetztePlausibleMessung}
`; } tooltip = `${tooltip}
`; @@ -611,7 +625,7 @@ export default class ZaehlstelleMap extends Vue { } reloadDataAndCloseDialog(backendIdDTO: BackendIdDTO) { - this.searchZaehlstelle(); + this.searchErhebungsstelle(); this.resetBooleans(); this.closeDialog(); this.routeToZaehlstelle(backendIdDTO.id); diff --git a/frontend/src/domain/Suggest.ts b/frontend/src/domain/Suggest.ts index 1c65401..15527d3 100644 --- a/frontend/src/domain/Suggest.ts +++ b/frontend/src/domain/Suggest.ts @@ -3,16 +3,19 @@ export default class Suggest { type: string; zaehlstelleId: string; zaehlungId: string; + mstId: string; constructor( text: string, type: string, zaehlstelleId: string, - zaehlungId: string + zaehlungId: string, + mstId: string ) { this.text = text; this.type = type; this.zaehlstelleId = zaehlstelleId; this.zaehlungId = zaehlungId; + this.mstId = mstId; } } diff --git a/frontend/src/domain/dto/MessstelleKarteDTO.ts b/frontend/src/domain/dto/MessstelleKarteDTO.ts index 9105df9..57eb485 100644 --- a/frontend/src/domain/dto/MessstelleKarteDTO.ts +++ b/frontend/src/domain/dto/MessstelleKarteDTO.ts @@ -2,5 +2,7 @@ import TooltipMessstelleDTO from "@/domain/dto/TooltipMessstelleDTO"; import AnzeigeKarteDTO from "@/domain/dto/AnzeigeKarteDTO"; export default interface MessstelleKarteDTO extends AnzeigeKarteDTO { + mstId: string; + tooltip: TooltipMessstelleDTO; } diff --git a/frontend/src/domain/dto/TooltipMessstelleDTO.ts b/frontend/src/domain/dto/TooltipMessstelleDTO.ts index 679ffd4..7430363 100644 --- a/frontend/src/domain/dto/TooltipMessstelleDTO.ts +++ b/frontend/src/domain/dto/TooltipMessstelleDTO.ts @@ -1,9 +1,10 @@ export default interface TooltipMessstelleDTO { mstId: string; - standortDatenportal: string; - stadtbezirk: number; + standort: string; + stadtbezirk: string; + stadtbezirknummer: number; realisierungsdatum: string; abbaudatum: string; - datumLetzteMessung: string; - kfz: boolean; + datumLetztePlausibleMessung: string; + detektierteVerkehrsarten: string; } diff --git a/frontend/src/domain/dto/TooltipDTO.ts b/frontend/src/domain/dto/TooltipZaehlstelleDTO.ts similarity index 78% rename from frontend/src/domain/dto/TooltipDTO.ts rename to frontend/src/domain/dto/TooltipZaehlstelleDTO.ts index 5587435..3cb7129 100644 --- a/frontend/src/domain/dto/TooltipDTO.ts +++ b/frontend/src/domain/dto/TooltipZaehlstelleDTO.ts @@ -1,4 +1,4 @@ -export default interface TooltipDTO { +export default interface TooltipZaehlstelleDTO { zaehlstellennnummer: string; stadtbezirk: string; stadtbezirknummer: number; diff --git a/frontend/src/domain/dto/ZaehlstelleKarteDTO.ts b/frontend/src/domain/dto/ZaehlstelleKarteDTO.ts index 11238f1..ca4b8d2 100644 --- a/frontend/src/domain/dto/ZaehlstelleKarteDTO.ts +++ b/frontend/src/domain/dto/ZaehlstelleKarteDTO.ts @@ -1,10 +1,8 @@ -import TooltipDTO from "@/domain/dto/TooltipDTO"; +import TooltipZaehlstelleDTO from "@/domain/dto/TooltipZaehlstelleDTO"; import AnzeigeKarteDTO from "@/domain/dto/AnzeigeKarteDTO"; export default interface ZaehlstelleKarteDTO extends AnzeigeKarteDTO { nummer: string; - letzteZaehlungId: string; - - tooltip: TooltipDTO; + tooltip: TooltipZaehlstelleDTO; } diff --git a/frontend/src/domain/dto/suche/SucheComplexSuggestsDTO.ts b/frontend/src/domain/dto/suche/SucheComplexSuggestsDTO.ts index e2d62cb..e13fccd 100644 --- a/frontend/src/domain/dto/suche/SucheComplexSuggestsDTO.ts +++ b/frontend/src/domain/dto/suche/SucheComplexSuggestsDTO.ts @@ -1,9 +1,11 @@ import SucheWordSuggestDTO from "@/domain/dto/suche/SucheWordSuggestDTO"; import SucheZaehlstelleSuggestDTO from "@/domain/dto/suche/SucheZaehlstelleSuggestDTO"; import SucheZaehlungSuggestDTO from "@/domain/dto/suche/SucheZaehlungSuggestDTO"; +import SucheMessstelleSuggestDTO from "@/domain/dto/suche/SucheMessstelleSuggestDTO"; export default interface SucheComplexSuggestsDTO { wordSuggests: SucheWordSuggestDTO[]; zaehlstellenSuggests: SucheZaehlstelleSuggestDTO[]; zaehlungenSuggests: SucheZaehlungSuggestDTO[]; + messstellenSuggests: SucheMessstelleSuggestDTO[]; } diff --git a/frontend/src/domain/dto/suche/SucheMessstelleSuggestDTO.ts b/frontend/src/domain/dto/suche/SucheMessstelleSuggestDTO.ts new file mode 100644 index 0000000..51027b4 --- /dev/null +++ b/frontend/src/domain/dto/suche/SucheMessstelleSuggestDTO.ts @@ -0,0 +1,4 @@ +export default interface SucheMessstelleSuggestDTO { + id: string; + text: string; +} diff --git a/frontend/src/util/DefaultObjectCreator.ts b/frontend/src/util/DefaultObjectCreator.ts index bb002b4..b4129d2 100644 --- a/frontend/src/util/DefaultObjectCreator.ts +++ b/frontend/src/util/DefaultObjectCreator.ts @@ -1,4 +1,3 @@ -import ZaehlstelleKarteDTO from "@/domain/dto/ZaehlstelleKarteDTO"; import Suggest from "@/domain/Suggest"; import { LatLng } from "leaflet"; import ZaehlungDTO from "@/domain/dto/ZaehlungDTO"; @@ -7,7 +6,6 @@ import Wetter from "@/domain/enums/Wetter"; import Quelle from "@/domain/enums/Quelle"; import Status from "@/domain/enums/Status"; import HochrechnungsfaktorDTO from "@/domain/dto/HochrechnungsfaktorDTO"; -import TooltipDTO from "@/domain/dto/TooltipDTO"; import DienstleisterDTO from "@/domain/dto/DienstleisterDTO"; import EmailAddressDTO from "@/domain/dto/EmailAddressDTO"; @@ -15,23 +13,13 @@ export default class DefaultObjectCreator { private static readonly MUNICH_CENTER_LATITUDE: number = 48.137227; private static readonly MUNICH_CENTER_LONGITUDE: number = 11.575517; - public static createDefaultZaehlstelleKarte(): ZaehlstelleKarteDTO { - return { - id: "", - nummer: "", - letzteZaehlungId: "", - tooltip: {} as TooltipDTO, - latitude: 0, - longitude: 0, - }; - } - public static createDefaultSuggestion(): Suggest { return { text: "", type: "", zaehlstelleId: "", zaehlungId: "", + mstId: "", }; } diff --git a/frontend/src/views/ZaehlstelleView.vue b/frontend/src/views/ZaehlstelleView.vue index d398424..74cb4de 100644 --- a/frontend/src/views/ZaehlstelleView.vue +++ b/frontend/src/views/ZaehlstelleView.vue @@ -363,9 +363,7 @@ export default class ZaehlstelleView extends Vue { loadZaehlstelle(): void { // ID der Zählstelle aus der URL holen (oder Warnung ausgeben, falls keine vorhanden ist) const zaehlstelleId = this.$route.params.zaehlstelleId; - if (!zaehlstelleId) { - console.warn("Es muss eine Zählstellen ID übergeben werden!"); - } + // Die Informationen zur Zählstelle werden geladen this.zaehlungCards = []; ZaehlstellenService.getZaehlstelleById(zaehlstelleId)