From fda45437753c6da970a3420fbdfbcf6d8142e17c Mon Sep 17 00:00:00 2001 From: MarcWieland Date: Tue, 18 Nov 2025 10:19:15 +0100 Subject: [PATCH] QR Scanner final fertig --- FilterCair.Client/Pages/FilterForm.razor | 17 ++----- FilterCair.Client/Pages/Stations.razor | 45 ++++++++++++++--- .../Services/API/FilterService.cs | 48 +++++++++++++++++++ 3 files changed, 92 insertions(+), 18 deletions(-) diff --git a/FilterCair.Client/Pages/FilterForm.razor b/FilterCair.Client/Pages/FilterForm.razor index af8a825..db8f2a5 100644 --- a/FilterCair.Client/Pages/FilterForm.razor +++ b/FilterCair.Client/Pages/FilterForm.razor @@ -105,33 +105,26 @@ } - protected override void OnInitialized() - { - var uri = NavManager.ToAbsoluteUri(NavManager.Uri); - var query = System.Web.HttpUtility.ParseQueryString(uri.Query); - var stationIdStr = query.Get("stationId"); - if (int.TryParse(stationIdStr, out int stationId)) - { - filter.StationId = stationId; - } - } - protected override async Task OnInitializedAsync() { var uri = NavManager.ToAbsoluteUri(NavManager.Uri); var query = System.Web.HttpUtility.ParseQueryString(uri.Query); + // Standardwerte setzen if (int.TryParse(query.Get("customerId"), out int customerId)) filter.CustomerId = customerId; if (int.TryParse(query.Get("stationId"), out int stationId)) filter.StationId = stationId; - if (int.TryParse(query.Get("filterId"), out int filterId)) + if (int.TryParse(query.Get("filterId"), out int filterId) && filterId > 0) { var existing = await FilterService.GetFilterByIdAsync(filterId); if (existing != null) + { filter = existing; + StateHasChanged(); + } } } diff --git a/FilterCair.Client/Pages/Stations.razor b/FilterCair.Client/Pages/Stations.razor index 5ee7753..b268cf5 100644 --- a/FilterCair.Client/Pages/Stations.razor +++ b/FilterCair.Client/Pages/Stations.razor @@ -115,12 +115,45 @@ private async Task StartScan() => await JS.InvokeVoidAsync("QRScanner.start"); private async Task StopScan() => await JS.InvokeVoidAsync("QRScanner.stop"); - [JSInvokable] - public void OnQrDetected(string code) +[JSInvokable] +public async Task OnQrDetected(string code) +{ + scanResult = code; + StateHasChanged(); + + // QR-Code bereinigen (falls Leerzeichen oder Zeilenumbrüche drin sind) + string qrCode = code.Trim(); + + if (string.IsNullOrEmpty(qrCode)) { - scanResult = code; - // TODO: später Filter anhand QR-Code öffnen - // Nav.NavigateTo($"/stations/{customerId}/filterdetail/{code}"); - StateHasChanged(); + await JS.InvokeVoidAsync("showToast", "Ungültiger QR-Code", "error"); + return; + } + + try + { + // Suche in Offline-DB nach Filter mit diesem QR-Code + var filter = await FilterService.GetFilterByQrCodeAsync(qrCode); + + if (filter != null) + { + await JS.InvokeVoidAsync("showToast", $"Filter gefunden: {filter.Bezeichnung}", "success"); + + // Stoppe Kamera sofort + await StopScan(); + + // Navigiere direkt zur Bearbeitung – mit allen nötigen IDs + Nav.NavigateTo($"/filterform?filterId={filter.Id}&customerId={filter.CustomerId}&stationId={filter.StationId}"); + } + else + { + await JS.InvokeVoidAsync("showToast", $"QR-Code '{qrCode}' nicht in Offline-Daten gefunden", "warning"); + } + } + catch (Exception ex) + { + await JS.InvokeVoidAsync("showToast", "Fehler beim Suchen des Filters", "error"); + Console.WriteLine(ex); } } +} diff --git a/FilterCair.Client/Services/API/FilterService.cs b/FilterCair.Client/Services/API/FilterService.cs index beed510..dc8ab32 100644 --- a/FilterCair.Client/Services/API/FilterService.cs +++ b/FilterCair.Client/Services/API/FilterService.cs @@ -105,6 +105,54 @@ namespace FilterCair.Client.Services.API return localFilters.FirstOrDefault(f => f.Id == id); } } + + // Füge diese Methode einfach in deine FilterService-Klasse ein: + public async Task GetFilterByQrCodeAsync(string qrCode) + { + if (string.IsNullOrWhiteSpace(qrCode)) + return null; + + qrCode = qrCode.Trim(); + + // Immer zuerst offline suchen – das wollen wir beim QR-Scan ja genau! + // Wir laden ALLE Filter aus der IndexedDB (stationId = 0 bedeutet "alle") + var allFilters = await _local.GetFiltersAsync(0); + + var found = allFilters.FirstOrDefault(f => + !string.IsNullOrEmpty(f.QRCode) && + f.QRCode.Trim().Equals(qrCode, StringComparison.OrdinalIgnoreCase)); + + if (found != null) + { + Console.WriteLine($"QR-Code '{qrCode}' gefunden → Filter ID {found.Id} ({found.Bezeichnung})"); + return found; + } + + // Optional: Falls online und nicht gefunden → nochmal beim Server nachfragen? + // (Für den Techniker vor Ort meist nicht nötig – aber kann man später einbauen) + bool isOnline = await IsOnlineAsync(); + if (isOnline) + { + try + { + var fromServer = await _http.GetFromJsonAsync($"{BaseUrl}/byQr/{qrCode}"); + if (fromServer != null) + { + await _local.SaveFiltersAsync(fromServer.StationId, new[] { fromServer }.ToList()); + return fromServer; + } + } + catch + { + // Ignorieren – war nur ein Bonus-Versuch + } + } + + Console.WriteLine($"QR-Code '{qrCode}' nicht gefunden"); + return null; + } + + }