QR Scanner final fertig

This commit is contained in:
MarcWieland 2025-11-18 10:19:15 +01:00
parent 0c2a83a31f
commit fda4543775
3 changed files with 92 additions and 18 deletions

View File

@ -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();
}
}
}

View File

@ -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);
}
}
}

View File

@ -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<FilterModel?> 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<FilterModel>($"{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;
}
}