Files
mapo-core/MP.IOC/README.md
T
2026-06-04 18:23:13 +02:00

131 lines
5.8 KiB
Markdown

# MP.IOC
MAPO IOC: WebApi rest per la gestione delle chiamate dagli applicativi remoti sul campo (IOB-PI su Raspberry Pi e IOB-WIN su PC Windows) che si occupano di comunicare con le varie macchine di processo i dati da trasmettere al MES.
È la nuova implementazione del modulo IO (il precedente era fatto in .NET Framework 4.7.2) su cui si sta dirigendo lo sviluppo della soluzione MES MAPO.
Integra raccolta di informazioni riguardo ai compiti svolti e questi sono ottimizzati per l'impiego di cache e ottimizzazioni varie su ogni strato del progetto.
**Build:** ✅ 0 errori, 12 warnings
## Sezioni Principali
- Api IOB (`api/IOB`) — endpoint principale per comunicazioni da campo (52 metodi)
- Benchmark Redis (`api/Bench`) — tool di test per debugging Redis
- Api Ricette (`api/Recipe`) — recupero ricette per PODL
- Dashboard Blazor — interfaccia web interattiva
## Architettura
### Livello Controller (MP.IOC/Controllers/)
| Controller | Routing | Methods | Descrizione |
|------------|---------|---------|-------------|
| `IOBController` | `api/IOB` | 52 | Endpoint principale per IOB-PI/IOB-WIN |
| `BenchController` | `api/Bench` | 10 | Test/benchmark Redis |
| `RecipeController` | `api/Recipe` | 2 | API ricette (JSON) |
| `RecipeArchiveController` | `api/RecipeArchive` | 2 | API archive ricette (file) |
### Livello Dati
| Componente | Tipologia | Descrizione |
|------------|-----------|-------------|
| `MpDataService` | Singleton | Service di accesso dati principale (~3516 righe) |
| `MpIocController` | Singleton | 82 metodi EFCore nel progetto MP.Data |
| `Redis` | 2 connessioni | `redisConn`, `redisConnAdmin` per dati IOB |
| `MongoDB` | Via `MpMongoController` | Storage ricette |
### Livello DbContext
| DbContext | ConnStr | Uso |
|-----------|---------|-----|
| `MoonProContext` | `MP.Data` | Tabelle anagrafiche, ODL, produzione, macchine |
| `MoonPro_UtilsContext` | `MP.Utils` | Tabelle utility (VMSFD, MicroStati) |
| `MoonPro_FluxContext` | `MP.Flux` | FluxLog, configurazioni flusso |
### Livello DI
Registrato via `AddIocDataLayer()` in `MP.Data/DataServiceCollectionExtensions.cs`:
```
Singleton: IMtcSetupRepository, IMtcSetupService, ProductionRepository, MpIocController, MpDataService, IFusionCacheSerializer, IConnectionMultiplexer, IFusionCache
Scoped: IIocRepository, IStatsAggrRepository, IStatsDetailRepository, IIocService, IStatsAggrService, IStatsDetailService
```
### Livello Infrastruttura
- **FusionCache** — ✅ **L1 Memory + L2 Redis Distributed + Redis Backplane** (migrazione giugno 2026)
- **MessagePipe** — Broadcasting real-time tra servizi
- **OpenTelemetry** — Tracing configurabile (non abilitato in MP.IOC)
- **Swagger** — Documentazione API in sviluppo
## Refactoring Completati
### ✅ Fase 1: Anti-Pattern Controllers
Rimossi `static IConfiguration _configuration` da tutti i 4 controller (`IOBController`, `BenchController`, `RecipeController`, `RecipeArchiveController`) e rimossa la dead code assignment dai costruttori.
### ✅ Fase 2: FusionCache + Redis Backplane
**Pacchetti aggiunti** (`MP.IOC.csproj`):
- `Microsoft.Extensions.Caching.StackExchangeRedis`
- `ZiggyCreatures.FusionCache`
- `ZiggyCreatures.FusionCache.Backplane.StackExchangeRedis`
- `ZiggyCreatures.FusionCache.Serialization.NewtonsoftJson`
**Configurazione** (`Program.cs`):
- FusionCache attivo con **L1 Memory** + **L2 Redis Distributed** + **Redis Backplane**
- Serializer: `FusionCacheNewtonsoftJsonSerializer`
- Default Duration: 1 minuto con jitter max 5 secondi
**Helper aggiunto** (`MpDataService.cs`):
- `GetOrFetchAsync<T>()` — wrapper FusionCache con ActivitySource tracking e source tagging (MEMORY/REDIS/DB)
**18 metodi migrati** dal pattern manuale Redis (`redisDb.StringGetAsync`/`StringSetAsync`) → FusionCache:
| # | Metodo | Fetch From |
|---|--------|------------|
| 1 | `AnagStatiGetAllAsync` | `IocDbController` |
| 2 | `ArticoliGetLastByMaccAsync` | `IocDbController` |
| 3 | `ConfigGetAllAsync` | `IocDbController` |
| 4 | `DecNumArtGetFiltAsync` | `IocDbController` |
| 5 | `DossierLastByMachAsync` | `IocDbController` |
| 6 | `GetLastOdlAsync` | `IocDbController` |
| 7 | `ListValuesFilt` | `IocDbController` |
| 8 | `Macchine2SlaveGetAllAsync` | `IocDbController` |
| 9 | `MacchineGetFilt` | `_productionRepository` |
| 10 | `MacchineRecipeArchive` | `_productionRepository` |
| 11 | `MseGetAllAsync` | `IocDbController` (+ forceDb support) |
| 12 | `OdlCurrByMaccAsync` | `IocDbController` |
| 13 | `POdlGetByKey` | `_productionRepository` |
| 14 | `POdlGetByMaccArtAsync` | `IocDbController` |
| 15 | `ConfFluxMach` | `IocDbController` |
| 16 | `FluxLogFirstByMachAsync` | `IocDbController` |
| 17 | `FluxLogGetLastByMachAsync` | `IocDbController` |
### ✅ Build Verification
| Soluzione | Errori | Warnings | Stato |
|-----------|--------|----------|-------|
| MP-IOC | 0 | 12 | ✅ |
| MP-SPEC | 0 | vari | ✅ |
| MP-LAND | 0 | 3 | ✅ |
| MP-MON | 0 | vari | ✅ |
## Refactoring in Corso (Riferimento)
### Piano Generale (Vedi refactor_plan.md)
1. ~~**Fase 1 — Anti-Pattern**~~ — ✅ **Completata**
2. ~~**Fase 2 — FusionCache**~~ — ✅ **Completata** (18 metodi migrati)
3. **Fase 3 — Repository IoC** — Scomporre `MpIocController` (1480 righe, 82 metodi) in 7-10 repository specialistici
4. **Fase 4 — Scomposizione MpDataService** — Il monolite da 3516 righe suddiviso in servizi tematici
5. **Fase 5 — Build & Verifica** — Validazione finale
**Stato attuale:** Fasi 1-2 completate. Build stabile 0 errori.
## Prossimi Passi
- **Fase 3**: Creare repository specialistici per `MpIocController` (Vedi refactor_plan.md per il inventario completo)
- **Metodi atipici**: Verificare manualmente 4 metodi con pattern non-standards (`GetCurrOdlAsync`, `StatoProdMacchinaAsync` (private), `verificaIdxMacchinaAsync`, `ListMasterAsync`/`ListSlaveAsync`)