Configurazione Sistema Industria 4.0
Configurazione Sistema Industria 4.0
π― Panoramica
La vista "Configurazione" permette di gestire tutti i parametri di sistema per l'import e l'elaborazione CSV delle macchine Industria 4.0.
Accesso
- Menu: Industria 4.0 β Configurazione
- Route:
admin.i40.settings.index - URL:
/admin/i40/settings - Permessi:
adminosuper-admin - β Opzioni principali (radio button o checkbox)
- β Campi avanzati (input numerici, text)
- β Descrizioni contestuali
- β Pulsante "Ripristina Default" dedicato
- β Pulsante "Salva" globale
- Valori:
- Default:
- Descrizione: ModalitΓ validazione CSV
- Default:
- Descrizione: Valida automaticamente quando CSV arriva
- Default:
- Descrizione: Blocca CSV non validi (impedisci elaborazione)
- Default:
- Descrizione: Notifica quando CSV non Γ¨ valido
- Valori:
- Default:
- Descrizione: ModalitΓ elaborazione CSV
- Default:
- Descrizione: Elabora automaticamente CSV validati
- Default:
- Range: 1-20
- Descrizione: Numero massimo CSV elaborati contemporaneamente
- Default:
- Descrizione: Notifica quando elaborazione completata
- Default:
- Descrizione: Notifica quando elaborazione fallisce
- Default:
- Descrizione: Elimina file CSV dopo elaborazione completata
- Default:
- Descrizione: Archivia CSV prima di eliminare
- Default:
- Descrizione: Path archivio CSV (relativo a storage/app/)
- Default:
- Range: 1-3650
- Descrizione: Giorni di retention CSV elaborati
- Default:
- Descrizione: Abilita pulizia automatica vecchi CSV
- Valori:
- Default:
- Descrizione: ModalitΓ retry elaborazioni fallite
- Default:
- Range: 1-10
- Descrizione: Numero massimo tentativi automatici
- Default:
- Range: 1-1440
- Descrizione: Minuti di attesa tra tentativi
- Default:
- Descrizione: Usa backoff esponenziale (15min, 30min, 60min...)
- Default:
- Descrizione: Canali notifica attivi
- Default:
- Descrizione: Email destinatari notifiche
- Default:
- Descrizione: Ruoli da notificare
- [ ] Esegui
- [ ] Esegui
- [ ] Verifica accesso a
- [ ] Testa salvataggio impostazioni
- [ ] Testa ripristino default
- [ ] Verifica che helper
- β
- β
- β
- β
- β
- β
- β
---
π Database
Tabella: i40_settings
``sql
CREATE TABLE i40_settings (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(100) UNIQUE,
setting_value JSON,
setting_type ENUM('validation', 'processing', 'cleanup', 'retry', 'notification'),
description TEXT,
default_value JSON,
updated_by INT UNSIGNED,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
`
Installazione
`bash
Esegui SQL
mysql -u root -p capera_sartupDB < database/sql/create_i40_settings_table.sql
Aggiorna voce menΓΉ
mysql -u root -p capera_sartupDB < database/sql/update_menu_configurazione_route.sql `---
π¨ Interfaccia Utente
Layout a Tab
La vista Γ¨ organizzata in 5 tab:
1. Validazione - Come validare i CSV in arrivo
2. Elaborazione - Come elaborare i CSV validati
3. Pulizia - Gestione file dopo elaborazione
4. Retry - Tentativi automatici in caso di errore
5. Notifiche - Canali e destinatari notifiche
FunzionalitΓ per Tab
Ogni tab ha:
---
βοΈ Categorie Impostazioni
1οΈβ£ VALIDAZIONE
validation.mode (string)
auto | manual
auto
validation.auto_validate_on_arrival (boolean)
true
validation.block_invalid (boolean)
true
validation.notify_on_invalid (boolean)
true
---
2οΈβ£ ELABORAZIONE
processing.mode (string)
auto | manual
manual
processing.auto_process_validated (boolean)
false
processing.concurrent_limit (integer)
5
processing.notify_on_complete (boolean)
true
processing.notify_on_error (boolean)
true
---
3οΈβ£ PULIZIA
cleanup.delete_after_processing (boolean)
false
cleanup.archive_before_delete (boolean)
true
cleanup.archive_path (string)
archive/csv_I40
cleanup.retention_days (integer)
90
cleanup.auto_cleanup_enabled (boolean)
false
---
4οΈβ£ RETRY
retry.mode (string)
auto | manual
manual
retry.max_attempts (integer)
3
retry.delay_minutes (integer)
15
retry.exponential_backoff (boolean)
true
---
5οΈβ£ NOTIFICHE
notification.channels (array)
["email", "database"]
notification.email_recipients (array)
["admin@sartup.it"]
notification.notify_roles (array)
["admin", "super-admin"]
---
π» Utilizzo nel Codice
Helper Globale
`php
// Leggi setting
$mode = i40_setting('validation.mode'); // 'auto' o 'manual'
$autoValidate = i40_setting('validation.auto_validate_on_arrival', true);// Imposta setting
i40_setting_set('processing.mode', 'auto');
`Metodi Diretti del Model
`php
use App\Models\I40\I40Setting;// Ottieni singolo valore
$value = I40Setting::get('validation.mode', 'auto');
// Imposta valore
I40Setting::set('validation.mode', 'manual', auth()->id());
// Ottieni tutti i setting di un tipo
$validationSettings = I40Setting::getByType('validation');
// Ripristina default
$setting = I40Setting::where('setting_key', 'validation.mode')->first();
$setting->restoreDefault();
// Ripristina tutti i default di un tipo
$restored = I40Setting::restoreDefaultsByType('validation');
// Invalida cache
I40Setting::clearCache();
`---
π Esempi di Utilizzo
Esempio 1: Validazione Automatica
`php
// Quando arriva un nuovo CSV
public function onCsvArrival($csvImport)
{
if (i40_setting('validation.auto_validate_on_arrival') === true) {
// Avvia validazione
dispatch(new ValidateCsvJob($csvImport->id));
}
}
`Esempio 2: Elaborazione Automatica
`php
// Dopo validazione completata
public function afterValidation($csvImport)
{
if ($csvImport->is_valid
&& i40_setting('processing.mode') === 'auto'
&& i40_setting('processing.auto_process_validated') === true) {
// Verifica limite concorrenza
$running = CsvImport::where('status', 'processing')->count();
$limit = i40_setting('processing.concurrent_limit', 5);
if ($running < $limit) {
dispatch(new ProcessCsvJob($csvImport->id));
}
}
}
`Esempio 3: Cleanup dopo Elaborazione
`php
// Dopo elaborazione completata
public function afterProcessing($csvImport)
{
if (i40_setting('cleanup.delete_after_processing') === true) {
// Archivia prima se richiesto
if (i40_setting('cleanup.archive_before_delete') === true) {
$archivePath = i40_setting('cleanup.archive_path', 'archive/csv_I40');
Storage::move(
$csvImport->file_path,
"{$archivePath}/" . basename($csvImport->file_path)
);
}
// Elimina file originale
Storage::delete($csvImport->file_path);
}
}
`Esempio 4: Retry Automatico
`php
// Elaborazione fallita
public function onProcessingFailed($csvImport)
{
if (i40_setting('retry.mode') === 'auto') {
$maxAttempts = i40_setting('retry.max_attempts', 3);
if ($csvImport->retry_count < $maxAttempts) {
// Calcola delay
$baseDelay = i40_setting('retry.delay_minutes', 15);
if (i40_setting('retry.exponential_backoff') === true) {
$delay = $baseDelay * pow(2, $csvImport->retry_count);
} else {
$delay = $baseDelay;
}
// Incrementa contatore
$csvImport->increment('retry_count');
$csvImport->update(['last_retry_at' => now()]);
// Schedule retry
dispatch(new ProcessCsvJob($csvImport->id))
->delay(now()->addMinutes($delay));
}
}
}
`---
π― Workflow Completo
Scenario: CSV Arriva da API
`
1. CSV depositato in connettore_I40/csv_I40_1_5/
β
2. CsvImport record creato (status: pending)
β
3. if (validation.auto_validate_on_arrival === true)
ββ Avvia validazione
β ββ OK β status: validated
β ββ KO β status: failed + validation_errors
β
4. if (processing.mode === 'auto' && is_valid)
ββ Verifica concurrent_limit
ββ Avvia elaborazione
β
5. Elaborazione
ββ status: processing
ββ Processa righe
β ββ Successo β status: completed
β ββ Errore β status: failed
β
6. if (status === 'failed' && retry.mode === 'auto')
ββ if (retry_count < max_attempts)
ββ Schedule retry con delay
β
7. if (status === 'completed' && cleanup.delete_after_processing)
ββ if (cleanup.archive_before_delete) β Archivia
ββ Elimina file
β
8. if (notify_on_complete) β Invia notifiche
`---
π§ Manutenzione
Aggiungere Nuovo Setting
`sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value)
VALUES (
'processing.timeout_seconds',
'300',
'processing',
'Timeout elaborazione CSV in secondi',
'300'
);
`Poi aggiorna la vista per includere il nuovo campo.
Modificare Descrizione
`sql
UPDATE i40_settings
SET description = 'Nuova descrizione piΓΉ chiara'
WHERE setting_key = 'validation.mode';
`Cache Management
`php
// Invalida cache per un setting
Cache::forget('i40_setting_validation.mode');// Invalida tutta la cache settings
I40Setting::clearCache();
`---
π Checklist Setup
create_i40_settings_table.sql
update_menu_configurazione_route.sql
/admin/i40/settings
i40_setting() funzioni---
π File Implementati
Backend
app/Models/I40/I40Setting.php - Model con caching
app/Http/Controllers/Admin/I40/I40SettingsController.php - Controller
app/helpers.php - Helper globale i40_setting()
routes/i40.php - Routes configurazioneFrontend
resources/views/admin/i40/settings/index.blade.php - Vista con tab BootstrapDatabase
database/sql/create_i40_settings_table.sql - Schema + dati iniziali
database/sql/update_menu_configurazione_route.sql` - Aggiorna menΓΉ---
π Prossimi Sviluppi
Questi settings saranno utilizzati in:
1. Coda d'Import - Determina comportamento validazione/elaborazione 2. Jobs Background - Rispetta concurrent_limit e retry policy 3. Notifiche - Invia alert secondo configurazione 4. Cleanup Scheduler - Pulizia automatica secondo retention
---
Ultimo aggiornamento: 17 Ottobre 2025
Analisi Codice
Blocco 1 sql
CREATE TABLE i40_settings (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(100) UNIQUE,
setting_value JSON,
setting_type ENUM('validation', 'processing', 'cleanup', 'retry', 'notification'),
description TEXT,
default_value JSON,
updated_by INT UNSIGNED,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
Blocco 2 bash
# Esegui SQL
mysql -u root -p capera_sartupDB < database/sql/create_i40_settings_table.sql
# Aggiorna voce menΓΉ
mysql -u root -p capera_sartupDB < database/sql/update_menu_configurazione_route.sql
Blocco 3 php
// Leggi setting
$mode = i40_setting('validation.mode'); // 'auto' o 'manual'
$autoValidate = i40_setting('validation.auto_validate_on_arrival', true);
// Imposta setting
i40_setting_set('processing.mode', 'auto');
Blocco 4 php
use App\Models\I40\I40Setting;
// Ottieni singolo valore
$value = I40Setting::get('validation.mode', 'auto');
// Imposta valore
I40Setting::set('validation.mode', 'manual', auth()->id());
// Ottieni tutti i setting di un tipo
$validationSettings = I40Setting::getByType('validation');
// Ripristina default
$setting = I40Setting::where('setting_key', 'validation.mode')->first();
$setting->restoreDefault();
// Ripristina tutti i default di un tipo
$restored = I40Setting::restoreDefaultsByType('validation');
// Invalida cache
I40Setting::clearCache();
Blocco 5 php
// Quando arriva un nuovo CSV
public function onCsvArrival($csvImport)
{
if (i40_setting('validation.auto_validate_on_arrival') === true) {
// Avvia validazione
dispatch(new ValidateCsvJob($csvImport->id));
}
}
Blocco 6 php
// Dopo validazione completata
public function afterValidation($csvImport)
{
if ($csvImport->is_valid
&& i40_setting('processing.mode') === 'auto'
&& i40_setting('processing.auto_process_validated') === true) {
// Verifica limite concorrenza
$running = CsvImport::where('status', 'processing')->count();
$limit = i40_setting('processing.concurrent_limit', 5);
if ($running < $limit) {
dispatch(new ProcessCsvJob($csvImport->id));
}
}
}
Blocco 7 php
// Dopo elaborazione completata
public function afterProcessing($csvImport)
{
if (i40_setting('cleanup.delete_after_processing') === true) {
// Archivia prima se richiesto
if (i40_setting('cleanup.archive_before_delete') === true) {
$archivePath = i40_setting('cleanup.archive_path', 'archive/csv_I40');
Storage::move(
$csvImport->file_path,
"{$archivePath}/" . basename($csvImport->file_path)
);
}
// Elimina file originale
Storage::delete($csvImport->file_path);
}
}
Blocco 8 php
// Elaborazione fallita
public function onProcessingFailed($csvImport)
{
if (i40_setting('retry.mode') === 'auto') {
$maxAttempts = i40_setting('retry.max_attempts', 3);
if ($csvImport->retry_count < $maxAttempts) {
// Calcola delay
$baseDelay = i40_setting('retry.delay_minutes', 15);
if (i40_setting('retry.exponential_backoff') === true) {
$delay = $baseDelay * pow(2, $csvImport->retry_count);
} else {
$delay = $baseDelay;
}
// Incrementa contatore
$csvImport->increment('retry_count');
$csvImport->update(['last_retry_at' => now()]);
// Schedule retry
dispatch(new ProcessCsvJob($csvImport->id))
->delay(now()->addMinutes($delay));
}
}
}
Blocco 9
1. CSV depositato in connettore_I40/csv_I40_1_5/
β
2. CsvImport record creato (status: pending)
β
3. if (validation.auto_validate_on_arrival === true)
ββ Avvia validazione
β ββ OK β status: validated
β ββ KO β status: failed + validation_errors
β
4. if (processing.mode === 'auto' && is_valid)
ββ Verifica concurrent_limit
ββ Avvia elaborazione
β
5. Elaborazione
ββ status: processing
ββ Processa righe
β ββ Successo β status: completed
β ββ Errore β status: failed
β
6. if (status === 'failed' && retry.mode === 'auto')
ββ if (retry_count < max_attempts)
ββ Schedule retry con delay
β
7. if (status === 'completed' && cleanup.delete_after_processing)
ββ if (cleanup.archive_before_delete) β Archivia
ββ Elimina file
β
8. if (notify_on_complete) β Invia notifiche
Blocco 10 sql
INSERT INTO i40_settings (setting_key, setting_value, setting_type, description, default_value)
VALUES (
'processing.timeout_seconds',
'300',
'processing',
'Timeout elaborazione CSV in secondi',
'300'
);
Blocco 11 sql
UPDATE i40_settings
SET description = 'Nuova descrizione piΓΉ chiara'
WHERE setting_key = 'validation.mode';
Blocco 12 php
// Invalida cache per un setting
Cache::forget('i40_setting_validation.mode');
// Invalida tutta la cache settings
I40Setting::clearCache();