- Aggiornamento alla versione Microsoft.EntityFrameworkCore.Sqlite 8.0.0. - Aggiornamento alla versione Microsoft.Windows.SDK.BuildTools 10.0.26100.6584. - Migliorata l'interfaccia per l'inserimento di più URL/ID di aste. - Aggiunti pulsanti per "Aste Chiuse" e "Esporta" in MainWindow. - Creata finestra "Aste Chiuse" per visualizzare e gestire aste chiuse. - Implementato scraper per estrarre dati da aste chiuse. - Aggiunto supporto per esportazione dati in CSV, JSON e XML. - Introdotto contesto Entity Framework per statistiche delle aste. - Aggiunto servizio per calcolo e gestione delle statistiche. - Gestite preferenze di esportazione con salvataggio in file JSON.
141 lines
5.3 KiB
C#
141 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Documents;
|
|
using Microsoft.Win32;
|
|
using AutoBidder.Models;
|
|
using AutoBidder.Services;
|
|
using AutoBidder.Data;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace AutoBidder.Dialogs
|
|
{
|
|
public partial class ClosedAuctionsWindow : Window
|
|
{
|
|
private ObservableCollection<ClosedAuctionRecord> _products = new();
|
|
|
|
private bool _isRunning = false;
|
|
|
|
// StatsService using local DB. Create context with default sqlite file in app folder
|
|
private readonly StatsService _statsService;
|
|
|
|
public ClosedAuctionsWindow()
|
|
{
|
|
InitializeComponent();
|
|
ProductsGrid.ItemsSource = _products;
|
|
|
|
var optionsBuilder = new DbContextOptionsBuilder<StatisticsContext>();
|
|
var dbPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stats.db");
|
|
optionsBuilder.UseSqlite($"Data Source={dbPath}");
|
|
var ctx = new StatisticsContext(optionsBuilder.Options);
|
|
_statsService = new StatsService(ctx);
|
|
|
|
Log("Finestra pronta");
|
|
}
|
|
|
|
private void Log(string message)
|
|
{
|
|
try
|
|
{
|
|
var para = new Paragraph(new Run($"{DateTime.Now:HH:mm} - {message}"));
|
|
ExtractLogBox.Document.Blocks.Add(para);
|
|
// keep size manageable
|
|
while (ExtractLogBox.Document.Blocks.Count > 500)
|
|
ExtractLogBox.Document.Blocks.Remove(ExtractLogBox.Document.Blocks.FirstBlock);
|
|
ExtractLogBox.ScrollToEnd();
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private async void StartExtractButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_isRunning)
|
|
{
|
|
Log("Estrazione già in corso");
|
|
return;
|
|
}
|
|
|
|
_isRunning = true;
|
|
StartExtractButton.IsEnabled = false;
|
|
Log("Avvio procedura di estrazione da closed_auctions.php...");
|
|
|
|
try
|
|
{
|
|
var scraper = new ClosedAuctionsScraper(null, _statsService, Log);
|
|
var closedUrl = "https://it.bidoo.com/closed_auctions.php";
|
|
|
|
Log($"Scarico: {closedUrl}");
|
|
|
|
int count = 0;
|
|
await foreach (var rec in scraper.ScrapeYieldAsync(closedUrl))
|
|
{
|
|
// Filter out records without bids info (user requested)
|
|
if (!rec.BidsUsed.HasValue)
|
|
{
|
|
Log($"Scartata asta (mancano puntate): {rec.AuctionUrl} - '{rec.ProductName ?? "?"}'");
|
|
continue;
|
|
}
|
|
|
|
// Add and log incrementally so user sees progress
|
|
_products.Add(rec);
|
|
count++;
|
|
Log($"[{count}] {rec.ProductName} | Prezzo: {(rec.FinalPrice.HasValue?rec.FinalPrice.Value.ToString("F2")+"€":"--")} | Vincitore: {rec.Winner ?? "--"} | Puntate: {rec.BidsUsed.Value} | URL: {rec.AuctionUrl}");
|
|
}
|
|
|
|
Log($"Estrazione completata: {count} record aggiunti.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log($"[ERRORE] Estrattore: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
_isRunning = false;
|
|
StartExtractButton.IsEnabled = true;
|
|
}
|
|
}
|
|
|
|
private void CloseButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
|
|
private async void ExportStatsButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Log("Preparazione esportazione statistiche...");
|
|
var stats = await _statsService.GetAllStatsAsync();
|
|
if (stats == null || stats.Count == 0)
|
|
{
|
|
Log("Nessuna statistica disponibile da esportare.");
|
|
MessageBox.Show(this, "Nessuna statistica disponibile.", "Esporta Statistiche", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
return;
|
|
}
|
|
|
|
var dlg = new SaveFileDialog() { Filter = "CSV files|*.csv|All files|*.*", FileName = "auction_stats.csv" };
|
|
if (dlg.ShowDialog(this) != true) return;
|
|
|
|
using var sw = new StreamWriter(dlg.FileName, false, System.Text.Encoding.UTF8);
|
|
sw.WriteLine("ProductKey,ProductName,TotalAuctions,AverageBidsUsed,AverageFinalPrice,LastSeen");
|
|
foreach (var s in stats)
|
|
{
|
|
var line = $"\"{s.ProductKey}\",\"{s.ProductName}\",{s.TotalAuctions},{s.AverageBidsUsed:F2},{s.AverageFinalPrice:F2},{s.LastSeen:O}";
|
|
sw.WriteLine(line);
|
|
}
|
|
|
|
Log($"Statistiche esportate su: {dlg.FileName}");
|
|
MessageBox.Show(this, "Statistiche esportate con successo.", "Esporta Statistiche", MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log($"[ERRORE] Esporta: {ex.Message}");
|
|
MessageBox.Show(this, "Errore durante esportazione: " + ex.Message, "Esporta Statistiche", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
}
|
|
}
|