Checkpoint before ghost pallet cleanup workflow

This commit is contained in:
2026-05-09 12:18:59 +02:00
parent f556b476ff
commit 6ab42a2303
27 changed files with 3947 additions and 973 deletions

View File

@@ -12,12 +12,13 @@ I diagrammi sono scritti in Mermaid, quindi possono essere:
## Indice
- [main](./main_flow.md)
- [layout_window](./layout_window_flow.md)
- [gestione_layout](./gestione_layout_flow.md)
- [reset_corsie](./reset_corsie_flow.md)
- [view_celle_multiple](./view_celle_multiple_flow.md)
- [view_celle_multi_udc](./view_celle_multi_udc_flow.md)
- [search_pallets](./search_pallets_flow.md)
- [gestione_pickinglist](./gestione_pickinglist_flow.md)
- [infrastruttura async/db](./async_db_flow.md)
- [warehouse operational flow](./warehouse_operational_flow.md)
## Convenzioni

View File

@@ -35,5 +35,5 @@ flowchart TD
## Note
- E un helper minimale usato da `main.py`.
- Il modulo esiste separato da `gestione_aree_frame_async.py`, ma concettualmente
- Il modulo esiste separato da `gestione_aree.py`, ma concettualmente
svolge lo stesso ruolo di gestione del loop condiviso.

View File

@@ -1,4 +1,4 @@
# `gestione_aree_frame_async.py`
# `gestione_aree.py`
## Scopo

View File

@@ -1,10 +1,11 @@
# `layout_window.py`
# `gestione_layout.py`
## Scopo
Questo modulo visualizza il layout delle corsie come matrice di celle, mostra
lo stato di occupazione, consente di cercare una UDC e permette l'export della
matrice.
matrice. La griglia ad alte prestazioni e' resa con `tksheet`, mantenendo la
stessa semantica visiva delle celle operative.
## Flusso operativo
@@ -57,5 +58,7 @@ flowchart LR
- Il modulo usa un token `_req_counter` per evitare che risposte async vecchie
aggiornino la UI fuori ordine.
- La statistica globale viene ricalcolata da query SQL, mentre quella della
corsia corrente usa la matrice già caricata in memoria.
- `destroy()` marca la finestra come non più attiva per evitare callback tardive.
corsia corrente usa la matrice gia' caricata in memoria.
- Il click destro su una cella riusa lo stesso menu contestuale della versione
precedente basata su pulsanti CTk.
- `destroy()` marca la finestra come non piu' attiva per evitare callback tardive.

View File

@@ -13,7 +13,7 @@ Questo modulo gestisce la vista master/detail delle picking list e permette di:
```{mermaid}
flowchart TD
A["open_pickinglist_window() da main.py"] --> B["create_pickinglist_frame()"]
A["open_pickinglist_window() in gestione_pickinglist.py"] --> B["create_frame()"]
B --> C["GestionePickingListFrame.__init__()"]
C --> D["_build_layout()"]
D --> E["after_idle(_first_show)"]

View File

@@ -9,12 +9,13 @@ infrastrutturali.
README.md
main_flow.md
layout_window_flow.md
gestione_layout_flow.md
reset_corsie_flow.md
view_celle_multiple_flow.md
view_celle_multi_udc_flow.md
search_pallets_flow.md
gestione_pickinglist_flow.md
warehouse_operational_flow.md
async_db_flow.md
async_msssql_query_flow.md
gestione_aree_frame_async_flow.md
gestione_aree_flow.md
async_loop_singleton_flow.md

View File

@@ -22,7 +22,7 @@ flowchart TD
I --> K["open_layout_window()"]
I --> L["open_celle_multiple_window()"]
I --> M["open_search_window()"]
I --> N["open_pickinglist_window()"]
I --> N["gestione_pickinglist.open_pickinglist_window()"]
```
## Schema di chiamata
@@ -33,13 +33,13 @@ flowchart LR
Launcher --> Layout["open_layout_window"]
Launcher --> Ghost["open_celle_multiple_window"]
Launcher --> Search["open_search_window"]
Launcher --> Pick["open_pickinglist_window"]
Pick --> PickFactory["create_pickinglist_frame"]
Launcher --> Pick["gestione_pickinglist.open_pickinglist_window"]
Pick --> PickFactory["gestione_pickinglist.create_frame"]
```
## Note
- `db_app` viene creato una sola volta e poi passato a tutte le finestre.
- Alla chiusura del launcher viene chiamato `db_app.dispose()` sul loop globale.
- `open_pickinglist_window()` costruisce la finestra in modo nascosto e la rende
- `gestione_pickinglist.open_pickinglist_window()` costruisce la finestra in modo nascosto e la rende
visibile solo a layout pronto, per ridurre lo sfarfallio iniziale.

View File

@@ -1,4 +1,4 @@
# `view_celle_multiple.py`
# `view_celle_multi_udc.py`
## Scopo

View File

@@ -0,0 +1,167 @@
# Warehouse Operational Flow
Questo diagramma descrive il flusso operativo integrato tra:
- layout di magazzino;
- gestione picking list;
- movimentazione fisica dei pallet;
- viste SQL e stored procedure coinvolte;
- aggiornamento dell'interfaccia dopo ogni operazione.
## Vista d'insieme
```{mermaid}
flowchart TD
UI["Operatore su interfaccia"] --> LAY["Gestione Layout"]
UI --> PL["Gestione Picking List"]
subgraph Layout["Flusso Layout"]
LAY --> LC1["Caricamento corsie e metadati layout"]
LC1 --> LC2["vViewMappaturaDescrizioneCorsia"]
LC1 --> LC3["vViewMappaturaPosizCorsia"]
LC1 --> LC4["MagLayout"]
LC1 --> LC5["Celle / Magazzini"]
LC2 --> GRID["Rendering griglia scaffale"]
LC3 --> GRID
LC4 --> GRID
LC5 --> GRID
GRID --> LX["Click su cella / ricerca UDC / menu contestuale"]
end
subgraph Picking["Flusso Picking List"]
PL --> PC1["Caricamento elenco documenti"]
PC1 --> PV1["XMag_ViewPackingList"]
PV1 --> PGRID["Griglia documenti aggregata"]
PGRID --> PSEL["Selezione documento"]
PSEL --> PV2["vViewPackingListRestante"]
PV2 --> PDET["Griglia dettaglio documento"]
PDET --> PACT["Prenota / S-prenota / consultazione"]
end
subgraph Mov["Movimentazione pallet"]
LX --> MOVE{"Operazione fisica?"}
MOVE -->|Carico o spostamento| SP1["sp_xMagGestioneMagazziniPallet"]
MOVE -->|Scarico pallet| SP1
PACT -->|Prenota o s-prenota| SP2["sp_xExePackingListPallet"]
SP1 --> M1["Aggiorna movimenti MagazziniPallet"]
SP1 --> M2["Aggiorna cella destinazione / origine"]
SP1 --> M3["Controlla prenotazione automatica"]
M3 --> SP3["sp_ControllaPrenotazionePackingListPalletNew"]
SP3 --> SP4["sp_xExePackingListPalletPrenota"]
SP2 --> M4["Aggiorna Celle.IDStato"]
SP2 --> M5["Scrive LogPackingList"]
SP4 --> M4
end
subgraph Views["Ricostruzione contesto"]
M1 --> GV["XMag_GiacenzaPallet"]
M2 --> CV["Celle"]
GV --> XP["XMag_ViewPackingList"]
GV --> TP["vXTracciaProdotti"]
CV --> XP
XP --> RL1["Stato documento / pallet / ubicazione"]
TP --> RL2["Articolo / lotto / descrizione"]
end
RL1 --> LREF["Refresh Layout / Picking List"]
RL2 --> LREF
LREF --> GRID
LREF --> PGRID
LREF --> PDET
```
## Flusso del layout
```{mermaid}
flowchart TD
A["Apertura Gestione Layout"] --> B["Legge mappatura corsie"]
B --> B1["vViewMappaturaDescrizioneCorsia"]
B --> B2["vViewMappaturaPosizCorsia"]
B --> B3["MagLayout"]
B --> B4["Celle / Magazzini"]
B1 --> C["Costruisce geometria scaffale"]
B2 --> C
B3 --> C
B4 --> C
C --> D["Query giacenza pallet per corsia"]
D --> E["Colora celle: vuota / piena / multipla"]
E --> F["Mostra UDC piu recente nella cella"]
F --> G{"Interazione utente"}
G -->|Ricerca UDC| H["Evidenzia cella in blu"]
G -->|Tasto destro su cella rossa| I["Menu contestuale"]
I --> J["Dialog scarico / analisi multi UDC"]
J --> K["Movimentazione fisica pallet"]
K --> L["Refresh layout"]
```
## Flusso della picking list
```{mermaid}
flowchart TD
A["Apertura Gestione Picking List"] --> B["Query aggregata documenti"]
B --> C["XMag_ViewPackingList"]
C --> D["Una riga per documento"]
D --> E["Utente seleziona il documento"]
E --> F["Query dettaglio documento"]
F --> G["vViewPackingListRestante"]
G --> H["Mostra pallet ancora rilevanti per il documento"]
H --> I{"Azione utente"}
I -->|Prenota o s-prenota| J["sp_xExePackingListPallet"]
I -->|Consulta dettaglio| H
J --> K["Aggiorna IDStato delle celle del documento"]
K --> L["LogPackingList"]
K --> M["Refresh lista documenti"]
K --> N["Refresh dettaglio documento"]
```
## Flusso della movimentazione pallet
```{mermaid}
flowchart TD
A["Utente legge barcode pallet e cella"] --> B["sp_xMagGestioneMagazziniPallet"]
B --> C{"Il pallet esiste gia in giacenza?"}
C -->|No| D["Inserisce movimento V sulla nuova cella"]
C -->|Si| E["Inserisce movimento P sulla vecchia cella"]
E --> F["Inserisce movimento V sulla nuova cella"]
D --> G["Aggiorna ricostruzione giacenza"]
F --> G
G --> H["XMag_GiacenzaPallet"]
H --> I["XMag_ViewPackingList"]
H --> J["vXTracciaProdotti"]
I --> K["Ubicazione e stato documento"]
J --> L["Dati articolo e lotto"]
K --> M["Refresh interfaccia"]
L --> M
```
## Significato delle viste e delle stored procedure
- `XMag_ViewPackingList`:
ricostruisce il collegamento tra pallet, documento, ubicazione e stato
logistico. E' la vista principale per la schermata picking list.
- `vViewPackingListRestante`:
mostra il dettaglio operativo del documento, cioe' le righe ancora visibili
e ordinate per ubicazione.
- `vXTracciaProdotti`:
arricchisce il pallet con lotto, codice articolo e descrizione.
- `sp_xMagGestioneMagazziniPallet`:
esegue il movimento fisico del pallet nel magazzino.
- `sp_xExePackingListPallet`:
fa il toggle di prenotazione delle celle coinvolte in una picking list.
- `sp_xExePackingListPalletPrenota`:
forza la prenotazione a `IDStato = 1`.
- `sp_ControllaPrenotazionePackingListPalletNew`:
controlla se, dopo una movimentazione fisica, debba essere riapplicata una
prenotazione automatica sulle celle coinvolte.
## Lettura pratica del sistema
- Il layout risponde alla domanda:
"dove sono i pallet e come sono distribuiti nello scaffale?"
- La picking list risponde alla domanda:
"quali pallet fanno parte di un documento e quali celle sono prenotate?"
- La movimentazione pallet risponde alla domanda:
"cosa succede nel tracciato quando un pallet viene caricato, spostato o
scaricato?"
- Le viste vengono rilette dopo l'operazione per riportare la UI in uno stato
coerente con il database.