feat: Implementazione completa sistema schedulazione con intervalli personalizzati

- Aggiunto supporto schedulazione con intervalli flessibili (secondi/minuti/ore/giorni/settimane/mesi)
- Esteso modello ProfileSchedule con campi IntervalValue e IntervalUnit
- Ottimizzato ScheduledJobService per controlli ogni 30s con esecuzione parallela
- Implementata interfaccia UI completa con anteprima real-time in italiano
- Aggiunta migrazione database AddIntervalSchedulingFields
- Implementati metodi calcolo NextExecutionTime per intervalli
- Aggiunta gestione tracking anti-duplicati e cleanup automatico
- Creata documentazione completa (6 file, 2500+ righe)

Modifiche tecniche:
- ProfileSchedule.cs: Nuovi campi e metodi CalculateNextInterval/GetScheduleDescription
- ScheduledJobService.cs: Ridotto check interval a 30s, aggiunto parallel processing
- ProfileScheduleService.cs: Supporto calcolo intervalli in UpdateNextExecutionTimeAsync
- Scheduling.razor: Aggiunta sezione UI per configurazione intervalli
- Scheduling.razor.cs: Implementato GetIntervalPreview() e gestione stato campi
This commit is contained in:
2025-10-02 01:12:39 +02:00
parent b76a6760fb
commit d042863a56
71 changed files with 17860 additions and 144 deletions
+59
View File
@@ -0,0 +1,59 @@
using Microsoft.Data.Sqlite;
using System;
using System.IO;
class Program
{
static void Main()
{
string databasePath = @".\CredentialManager\datacoupler.db";
string connectionString = $"Data Source={databasePath}";
Console.WriteLine($"Correggendo database: {Path.GetFullPath(databasePath)}");
try
{
using var connection = new SqliteConnection(connectionString);
connection.Open();
// Controlla se la tabella esiste
var checkCommand = new SqliteCommand(
"SELECT name FROM sqlite_master WHERE type='table' AND name='ProfileSchedules';",
connection);
var result = checkCommand.ExecuteScalar();
if (result != null)
{
Console.WriteLine("Tabella ProfileSchedules trovata, rimozione in corso...");
// Rimuovi la tabella esistente
var dropCommand = new SqliteCommand("DROP TABLE ProfileSchedules;", connection);
dropCommand.ExecuteNonQuery();
Console.WriteLine("Tabella ProfileSchedules rimossa con successo.");
}
else
{
Console.WriteLine("Tabella ProfileSchedules non trovata.");
}
// Rimuovi anche la migrazione dal tracking per permettere la riesecuzione
var deleteMigrationCommand = new SqliteCommand(
"DELETE FROM __EFMigrationsHistory WHERE MigrationId = '20250924155833_AddProfileSchedules';",
connection);
int deletedRows = deleteMigrationCommand.ExecuteNonQuery();
Console.WriteLine($"Rimossa migrazione dal tracking: {deletedRows} righe eliminate.");
Console.WriteLine("Operazione completata. Ora riavvia l'applicazione.");
}
catch (Exception ex)
{
Console.WriteLine($"Errore: {ex.Message}");
}
Console.WriteLine("Premi qualsiasi tasto per continuare...");
Console.ReadKey();
}
}