From e18a09e1da08c3dc871fbc89faa370fe82d0e6ea Mon Sep 17 00:00:00 2001 From: Alberto Balbo Date: Tue, 3 Mar 2026 08:53:38 +0100 Subject: [PATCH] Gestione massiva limiti prodotto e ottimizzazione ticker Aggiunta barra azioni per gestione massiva limiti prodotto in Statistics.razor (applica, salva, attiva/disattiva, copia consigliati). Uniformati simboli euro e messaggi in italiano. Ottimizzata la logica del ticker: controllo puntata ora avviene prima del polling, gestione fine asta differita tramite PendingEndState. Introdotto controllo esplicito su MaxClicks per asta. Implementata cache delle impostazioni in SettingsManager per ridurre accessi disco. Vari fix minori e miglioramenti di robustezza. --- Mimante/Models/AuctionInfo.cs | 14 +- Mimante/Pages/Index.razor.cs | 12 +- Mimante/Pages/Statistics.razor | 316 +++++++++++++++++++++++++-- Mimante/Services/AuctionMonitor.cs | 157 +++++++++---- Mimante/Utilities/SettingsManager.cs | 44 +++- 5 files changed, 472 insertions(+), 71 deletions(-) diff --git a/Mimante/Models/AuctionInfo.cs b/Mimante/Models/AuctionInfo.cs index a355e3f..512ea44 100644 --- a/Mimante/Models/AuctionInfo.cs +++ b/Mimante/Models/AuctionInfo.cs @@ -40,10 +40,10 @@ namespace AutoBidder.Models public int MaxResets { get; set; } = 0; // Numero massimo reset (0 = illimitati) /// - /// [OBSOLETO] Numero massimo di puntate consentite - Non piω utilizzato nell'UI - /// Mantenuto per retrocompatibilitΰ con salvataggi JSON esistenti + /// Numero massimo di puntate consentite per questa asta (0 = illimitato). + /// Impostato dall'utente nella griglia statistiche o dai limiti prodotto. + /// Controllato in ShouldBid contro BidsUsedOnThisAuction. /// - [Obsolete("MaxClicks non θ piω utilizzato. Usa invece la logica di limiti per prodotto.")] [JsonPropertyName("MaxClicks")] public int MaxClicks { get; set; } = 0; @@ -107,6 +107,13 @@ namespace AutoBidder.Models [JsonIgnore] public double LastScheduledTimerMs { get; set; } + /// + /// Stato di fine asta ricevuto dal poll ma non ancora processato. + /// Il ticker ha un'ultima occasione di puntare prima che venga gestito. + /// + [JsonIgnore] + public AuctionState? PendingEndState { get; set; } + // Storico public List BidHistory { get; set; } = new List(); public Dictionary BidderStats { get; set; } = new(StringComparer.OrdinalIgnoreCase); @@ -505,6 +512,7 @@ namespace AutoBidder.Models // Pulisci oggetti complessi LastState = null; + PendingEndState = null; CalculatedValue = null; DuelOpponent = null; WinLimitDescription = null; diff --git a/Mimante/Pages/Index.razor.cs b/Mimante/Pages/Index.razor.cs index 6d9037c..2e1ab6b 100644 --- a/Mimante/Pages/Index.razor.cs +++ b/Mimante/Pages/Index.razor.cs @@ -102,7 +102,6 @@ namespace AutoBidder.Pages private string? sessionUsername; private int sessionRemainingBids; private double sessionShopCredit; - private int sessionAuctionsWon; // Recommended limits private bool isLoadingRecommendations = false; @@ -530,6 +529,7 @@ namespace AutoBidder.Pages // Carica limiti dal database prodotti se disponibili double minPrice = settings.DefaultMinPrice; double maxPrice = settings.DefaultMaxPrice; + int maxClicks = settings.DefaultMaxClicks; int bidDeadlineMs = settings.DefaultBidBeforeDeadlineMs; // Se abilitato, cerca limiti salvati per questo prodotto @@ -551,10 +551,12 @@ namespace AutoBidder.Pages minPrice = productStats.UserDefaultMinPrice.Value; if (productStats.UserDefaultMaxPrice.HasValue) maxPrice = productStats.UserDefaultMaxPrice.Value; + if (productStats.UserDefaultMaxBids.HasValue) + maxClicks = productStats.UserDefaultMaxBids.Value; if (productStats.UserDefaultBidBeforeDeadlineMs.HasValue) bidDeadlineMs = productStats.UserDefaultBidBeforeDeadlineMs.Value; - AddLog($"[STATS] Limiti prodotto (da URL): €{minPrice:F2}-€{maxPrice:F2}"); + AddLog($"[STATS] Limiti prodotto (da URL): €{minPrice:F2}-€{maxPrice:F2}, MaxClicks={maxClicks}"); } } catch (Exception ex) @@ -573,6 +575,7 @@ namespace AutoBidder.Pages CheckAuctionOpenBeforeBid = settings.DefaultCheckAuctionOpenBeforeBid, MinPrice = minPrice, MaxPrice = maxPrice, + MaxClicks = maxClicks, IsActive = isActive, IsPaused = isPaused }; @@ -675,7 +678,7 @@ namespace AutoBidder.Pages } // 3. Cerca limiti prodotto dal database con il nome REALE - if (updated && !string.IsNullOrWhiteSpace(auction.Name)) + if (!string.IsNullOrWhiteSpace(auction.Name)) { var settings = AutoBidder.Utilities.SettingsManager.Load(); if (settings.NewAuctionLimitsPriority == "ProductStats" && StatsService.IsAvailable) @@ -1543,7 +1546,6 @@ namespace AutoBidder.Pages sessionUsername = savedSession.Username; sessionRemainingBids = savedSession.RemainingBids; sessionShopCredit = savedSession.ShopCredit; - sessionAuctionsWon = 0; // TODO: add to BidooSession model // Inizializza AuctionMonitor con la sessione salvata if (!string.IsNullOrEmpty(savedSession.CookieString)) @@ -1557,7 +1559,6 @@ namespace AutoBidder.Pages sessionUsername = session?.Username; sessionRemainingBids = session?.RemainingBids ?? 0; sessionShopCredit = session?.ShopCredit ?? 0; - sessionAuctionsWon = 0; } } @@ -1574,7 +1575,6 @@ namespace AutoBidder.Pages sessionUsername = session.Username; sessionRemainingBids = session.RemainingBids; sessionShopCredit = session.ShopCredit; - sessionAuctionsWon = 0; // TODO: add to BidooSession model // Salva sessione aggiornata AutoBidder.Services.SessionManager.SaveSession(session); diff --git a/Mimante/Pages/Statistics.razor b/Mimante/Pages/Statistics.razor index 3e3632a..6add965 100644 --- a/Mimante/Pages/Statistics.razor +++ b/Mimante/Pages/Statistics.razor @@ -1,4 +1,4 @@ -@page "/statistics" +ο»Ώ@page "/statistics" @attribute [Microsoft.AspNetCore.Authorization.Authorize] @using AutoBidder.Models @using AutoBidder.Services @@ -39,7 +39,7 @@
Statistiche non disponibili - Il database non θ stato configurato o non θ accessibile. + Il database non Γ¨ stato configurato o non Γ¨ accessibile.
} @@ -68,6 +68,34 @@ +
+ Azioni su @(filteredProducts?.Count ?? 0) prodotti visibili: + + + + + +
@if (filteredProducts == null || !filteredProducts.Any()) { @@ -94,20 +122,20 @@ Win% @GetProductSortIndicator("winrate") - € Min @GetProductSortIndicator("minprice") + € Min @GetProductSortIndicator("minprice") - € Med @GetProductSortIndicator("avgprice") + € Med @GetProductSortIndicator("avgprice") - € Mdn @GetProductSortIndicator("medianprice") + € Mdn @GetProductSortIndicator("medianprice") - € Max @GetProductSortIndicator("maxprice") + € Max @GetProductSortIndicator("maxprice") On - Min € - Max € + Min € + Max € Max Punt. Azioni @@ -129,16 +157,16 @@ @winRate.ToString("F0")% - €@(product.MinFinalPrice?.ToString("F2") ?? "-") + €@(product.MinFinalPrice?.ToString("F2") ?? "-") - €@product.AvgFinalPrice.ToString("F2") + €@product.AvgFinalPrice.ToString("F2") - €@(product.MedianFinalPrice?.ToString("F2") ?? "-") + €@(product.MedianFinalPrice?.ToString("F2") ?? "-") - €@(product.MaxFinalPrice?.ToString("F2") ?? "-") + €@(product.MaxFinalPrice?.ToString("F2") ?? "-")