Sessioni di produzione: dati e statistica per sessione #58

Closed
opened 2026-10-07 09:54:58 +00:00 by Adriano · 7 comments
Owner

RICHIESTA: l'avvio della ricetta (con il timer verso GAIA e l'inizio produzione) apre una sessione che si chiude a Fine Produzione. In statistica e analisi si isola la sessione: misure, testi dei campi, note, allegati dei task Note.
VERIFICATO 28/09: ProductionRun esiste già; manca la vista statistica per sessione e il collegamento dei dati non di misura.
FONTE: UPDATE TIEMEASUREFLOW_180926.docx (Tràfilo via Menoncin, test del 18/09/2026), daitarn:D:\Sorgenti\Clienti\Ricerca_e_Misura\0_REM-Tielogic_SHARED\1_TRAFILO\0_Specifiche\ (16 screenshot nel docx). Raccolta: TieMeasureFlow#44.

RICHIESTA: l'avvio della ricetta (con il timer verso GAIA e l'inizio produzione) apre una sessione che si chiude a Fine Produzione. In statistica e analisi si isola la sessione: misure, testi dei campi, note, allegati dei task Note. VERIFICATO 28/09: ProductionRun esiste già; manca la vista statistica per sessione e il collegamento dei dati non di misura. FONTE: UPDATE TIEMEASUREFLOW_180926.docx (Tràfilo via Menoncin, test del 18/09/2026), daitarn:D:\Sorgenti\Clienti\Ricerca_e_Misura\0_REM-Tielogic_SHARED\1_TRAFILO\0_Specifiche\ (16 screenshot nel docx). Raccolta: TieMeasureFlow#44.
Adriano added the sviluppo label 2026-10-07 09:54:58 +00:00
Author
Owner

ESITO: analisi
COSA: statistica per sessione di produzione.
STATO: Measurement.production_run_id esiste (BE/models/orm/measurement.py:62) ma i filtri non lo usano.
FILE: BE/api/routers/statistics.py:31 _query_measurements + endpoint :100,:122,:145,:172 parametro production_run_id · nuovo GET /api/statistics/runs?recipe_id= (elenco sessioni) · BE/services/report_service.py:41 e routers/reports.py:17,51 · FE/blueprints/statistics.py:52,139 · FE/templates/statistics/dashboard.html:27-60 select sessione. Note e allegati dei task (task_results) entrano dopo l'ondata 2.
MIGRAZIONE: no. PIANO: unità F.
VERIFICATO su V3.0.0 a829bf3 (mappa del 07/10). Percorsi da src/; BE=backend/, FE=frontend/flask_app/.

ESITO: analisi COSA: statistica per sessione di produzione. STATO: Measurement.production_run_id esiste (BE/models/orm/measurement.py:62) ma i filtri non lo usano. FILE: BE/api/routers/statistics.py:31 _query_measurements + endpoint :100,:122,:145,:172 parametro `production_run_id` · nuovo GET /api/statistics/runs?recipe_id= (elenco sessioni) · BE/services/report_service.py:41 e routers/reports.py:17,51 · FE/blueprints/statistics.py:52,139 · FE/templates/statistics/dashboard.html:27-60 select sessione. Note e allegati dei task (task_results) entrano dopo l'ondata 2. MIGRAZIONE: no. PIANO: unità F. VERIFICATO su V3.0.0 a829bf3 (mappa del 07/10). Percorsi da src/; BE=backend/, FE=frontend/flask_app/.
Adriano added the assegnata:daitarn label 2026-10-07 10:21:22 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-10-07T10:21:19Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-10-07T10:21:19Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

ESITO: bloccato
COSA: statistica per sessione di produzione fatta per le misure; note, campi e allegati dei task non ancora.
FILE: src/backend/api/routers/statistics.py — parametro production_run_id sui filtri delle misure, GET /api/statistics/runs?recipe_id= (elenco sessioni), conteggio misure solo sui run della ricetta
FILE: src/backend/services/report_service.py, api/routers/reports.py — report filtrabili per sessione
FILE: src/frontend/flask_app/blueprints/statistics.py, templates/statistics/dashboard.html — select Sessione
COMMIT: 4e52095 e44ac31
PROVA: suite goldrake su b7cb061 → 835 passed 2 skipped (pytest 3.11 backend+frontend), 29 passed (pytest 3.13 vision), docker build vision ok; test src/backend/tests/test_statistics.py, src/frontend/flask_app/tests/test_statistics.py
VERIFICATO: grep -i task_result su src/backend/api/routers/statistics.py, services/report_service.py, api/routers/reports.py, frontend templates/statistics/dashboard.html (V3.0.0 b7cb061) → nessuna occorrenza
MANCA: note, testi dei campi e allegati dei task (task_results, tabella della migrazione 018, #54 #55) nella vista per sessione; anche gli esiti OK/NOK dei task check (#54)
In V3.0.0 da b7cb061. Issue resta aperta.

ESITO: bloccato COSA: statistica per sessione di produzione fatta per le misure; note, campi e allegati dei task non ancora. FILE: src/backend/api/routers/statistics.py — parametro production_run_id sui filtri delle misure, GET /api/statistics/runs?recipe_id= (elenco sessioni), conteggio misure solo sui run della ricetta FILE: src/backend/services/report_service.py, api/routers/reports.py — report filtrabili per sessione FILE: src/frontend/flask_app/blueprints/statistics.py, templates/statistics/dashboard.html — select Sessione COMMIT: 4e52095 e44ac31 PROVA: suite goldrake su b7cb061 → 835 passed 2 skipped (pytest 3.11 backend+frontend), 29 passed (pytest 3.13 vision), docker build vision ok; test src/backend/tests/test_statistics.py, src/frontend/flask_app/tests/test_statistics.py VERIFICATO: grep -i task_result su src/backend/api/routers/statistics.py, services/report_service.py, api/routers/reports.py, frontend templates/statistics/dashboard.html (V3.0.0 b7cb061) → nessuna occorrenza MANCA: note, testi dei campi e allegati dei task (task_results, tabella della migrazione 018, #54 #55) nella vista per sessione; anche gli esiti OK/NOK dei task check (#54) In V3.0.0 da b7cb061. Issue resta aperta.
Adriano removed the assegnata:daitarn label 2026-10-07 16:29:45 +00:00
Author
Owner

🤖 goldrake — liberata nessun segno di daitarn da 6.1 h — 2026-10-07T16:29:45Z

🤖 goldrake — **liberata** nessun segno di daitarn da 6.1 h — 2026-10-07T16:29:45Z
Adriano added the assegnata:daitarn label 2026-10-11 18:05:35 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-10-11T18:05:34Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-10-11T18:05:34Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

ESITO: richiesta
RIF: gitea:Adriano/TieMeasureFlow#58
COSA: analisi (passo 1 di 3) della parte che manca. Nella vista statistica per sessione vanno gli esiti dei task check (OK/NOK), le note, i testi dei campi e gli allegati dei task note (task_results). Ramo lavoro/daitarn-58, partito da origin/V3.0.0 ac8604e.
VERIFICATO: src/backend/models/orm/task_result.py — TaskResult(task_id, version_id, production_run_id, user_id, outcome ok|nok|done, note, values {chiave: testo}, attachments [{key, path, name}], created_at).
VERIFICATO: src/backend/api/routers/task_results.py:176 GET /api/task-results?production_run_id= esiste, ma vuole require_measurement_tec. La statistica usa require_metrologist (src/backend/api/routers/statistics.py:10), quindi non si riusa: si scrive un endpoint di statistica.
VERIFICATO: src/backend/api/routers/files.py:294 GET /api/files/{path} vuole solo l'autenticazione (i prefissi ristretti sono statistics/ e reports/). Il frontend fa il proxy dei file con proxy_file (blueprints/measure.py:951, maker.py:486).
VERIFICATO: le etichette dei campi stanno in RecipeTask.fields (src/backend/models/orm/task.py:78), normalizzate da normalize_note_fields (src/backend/models/api/task.py:44).

MODIFICHE:

  1. src/backend/api/routers/statistics.py — nuovo GET /api/statistics/runs/{run_id}/task-results, require_metrologist. Restituisce 404 se la run non esiste. Risposta: {"run_id", "counts": {"ok", "nok", "done"}, "results": [...]}, risultati in ordine created_at crescente. Ogni risultato contiene id, task_id, task_title, task_type, outcome, note, created_at (isoformat), user_name (User.display_name) e:
    • values: [{key, label, value}]; l'etichetta viene da task.fields, se manca si usa la chiave;
    • attachments: [{key, label, name, path}].
      Una query per i TaskResult della run più una per task e utenti (in_), niente N+1. Commenti #58.
  2. Lo schema pydantic in src/backend/models/api/statistics.py va scritto solo se nel file gli altri endpoint lo usano; /runs restituisce dict, e lo stesso stile va bene.
  3. src/frontend/flask_app/blueprints/statistics.py — proxy GET /statistics/api/runs/int:run_id/task-results, con lo stesso decoratore e ruolo di api_runs (:130). Proxy GET /statistics/api/files/path:file_path, che accetta solo percorsi che iniziano con task_results/ (altrimenti 404) e usa proxy_file come measure.py:951.
  4. src/frontend/flask_app/templates/statistics/dashboard.html — quando è scelta una Sessione compare il pannello «Esiti dei task della sessione», nascosto senza sessione:
    • contatori OK / NOK / Fatto;
    • una tabella con ora, task, esito (badge NOK in evidenza), note, campi «etichetta: valore», allegati come link al proxy (target _blank) e operatore.
      Il pannello si ricarica a ogni cambio di sessione, con lo stesso meccanismo JS dei grafici esistenti. Le stringhe nuove vanno in _() e in translations it/en (.po); i .mo non si committano.

NON TOCCARE: src/backend/api/routers/task_results.py, le migrazioni (non serve una tabella nuova), i report PDF/Excel (report_service), src/vision*, vendor/visionsuite.

TEST:

  • backend (src/backend/tests/test_statistics.py o un file nuovo): run con 1 check ok, 1 check nok e 1 note con 2 campi e 1 allegato. Si verificano counts, ordine, label dai fields, fallback alla chiave se il campo è stato tolto dal task, allegati. 404 su run inesistente. 403 per un MeasurementTec puro.
  • frontend (src/frontend/flask_app/tests/test_statistics.py): proxy task-results; proxy file che rifiuta statistics/x e ../; la pagina dashboard contiene il pannello.
  • Suite: uv run --extra server --extra client --extra dev pytest src/backend/tests src/frontend/flask_app/tests -q -p no:cacheprovider, tutta verde.

CRITERIO DI FATTO: scelta una sessione, la statistica mostra misure, esiti OK/NOK, note, testi dei campi e allegati di quella sessione.

ESITO: richiesta RIF: gitea:Adriano/TieMeasureFlow#58 COSA: analisi (passo 1 di 3) della parte che manca. Nella vista statistica per sessione vanno gli esiti dei task check (OK/NOK), le note, i testi dei campi e gli allegati dei task note (task_results). Ramo lavoro/daitarn-58, partito da origin/V3.0.0 ac8604e. VERIFICATO: src/backend/models/orm/task_result.py — TaskResult(task_id, version_id, production_run_id, user_id, outcome ok|nok|done, note, values {chiave: testo}, attachments [{key, path, name}], created_at). VERIFICATO: src/backend/api/routers/task_results.py:176 GET /api/task-results?production_run_id= esiste, ma vuole require_measurement_tec. La statistica usa require_metrologist (src/backend/api/routers/statistics.py:10), quindi non si riusa: si scrive un endpoint di statistica. VERIFICATO: src/backend/api/routers/files.py:294 GET /api/files/{path} vuole solo l'autenticazione (i prefissi ristretti sono statistics/ e reports/). Il frontend fa il proxy dei file con proxy_file (blueprints/measure.py:951, maker.py:486). VERIFICATO: le etichette dei campi stanno in RecipeTask.fields (src/backend/models/orm/task.py:78), normalizzate da normalize_note_fields (src/backend/models/api/task.py:44). MODIFICHE: 1. src/backend/api/routers/statistics.py — nuovo GET /api/statistics/runs/{run_id}/task-results, require_metrologist. Restituisce 404 se la run non esiste. Risposta: `{"run_id", "counts": {"ok", "nok", "done"}, "results": [...]}`, risultati in ordine created_at crescente. Ogni risultato contiene id, task_id, task_title, task_type, outcome, note, created_at (isoformat), user_name (User.display_name) e: - `values`: `[{key, label, value}]`; l'etichetta viene da task.fields, se manca si usa la chiave; - `attachments`: `[{key, label, name, path}]`. Una query per i TaskResult della run più una per task e utenti (in_), niente N+1. Commenti `#58`. 2. Lo schema pydantic in src/backend/models/api/statistics.py va scritto solo se nel file gli altri endpoint lo usano; /runs restituisce dict, e lo stesso stile va bene. 3. src/frontend/flask_app/blueprints/statistics.py — proxy GET /statistics/api/runs/<int:run_id>/task-results, con lo stesso decoratore e ruolo di api_runs (:130). Proxy GET /statistics/api/files/<path:file_path>, che accetta solo percorsi che iniziano con `task_results/` (altrimenti 404) e usa proxy_file come measure.py:951. 4. src/frontend/flask_app/templates/statistics/dashboard.html — quando è scelta una Sessione compare il pannello «Esiti dei task della sessione», nascosto senza sessione: - contatori OK / NOK / Fatto; - una tabella con ora, task, esito (badge NOK in evidenza), note, campi «etichetta: valore», allegati come link al proxy (target _blank) e operatore. Il pannello si ricarica a ogni cambio di sessione, con lo stesso meccanismo JS dei grafici esistenti. Le stringhe nuove vanno in `_()` e in translations it/en (.po); i .mo non si committano. NON TOCCARE: src/backend/api/routers/task_results.py, le migrazioni (non serve una tabella nuova), i report PDF/Excel (report_service), src/vision*, vendor/visionsuite. TEST: - backend (src/backend/tests/test_statistics.py o un file nuovo): run con 1 check ok, 1 check nok e 1 note con 2 campi e 1 allegato. Si verificano counts, ordine, label dai fields, fallback alla chiave se il campo è stato tolto dal task, allegati. 404 su run inesistente. 403 per un MeasurementTec puro. - frontend (src/frontend/flask_app/tests/test_statistics.py): proxy task-results; proxy file che rifiuta `statistics/x` e `../`; la pagina dashboard contiene il pannello. - Suite: `uv run --extra server --extra client --extra dev pytest src/backend/tests src/frontend/flask_app/tests -q -p no:cacheprovider`, tutta verde. CRITERIO DI FATTO: scelta una sessione, la statistica mostra misure, esiti OK/NOK, note, testi dei campi e allegati di quella sessione.
Author
Owner

Soluzione

ESITO: fatto
RIF: gitea:Adriano/TieMeasureFlow#58
COSA: la statistica per sessione mostra, oltre alle misure (fatte il 07/10, 4e52095 e44ac31), anche gli esiti OK/NOK dei task check e le note, i testi dei campi e gli allegati dei task note.
FILE: src/backend/api/routers/statistics.py — GET /api/statistics/runs/{run_id}/task-results (require_metrologist, 404 se la run non esiste; risponde counts e results in ordine di tempo; etichette dai task.fields, se manca la chiave; 3 query)
FILE: src/frontend/flask_app/blueprints/statistics.py — proxy task-results; proxy dei file limitato a task_results/ senza ..
FILE: src/frontend/flask_app/templates/statistics/dashboard.html — pannello «Esiti dei task della sessione» (contatori OK/NOK/Fatto e tabella con ora, task, esito, note, campi, allegati, operatore), visibile solo con una sessione scelta
FILE: translations it/en — 6 stringhe
COMMIT: c911449 8d7fa9a, merge su V3.0.0
PROVA: suite goldrake su lavoro/daitarn-58 (base ac8604e = base del merge) → 856 passed 2 skipped (pytest 3.11 backend+frontend), 29 passed (pytest 3.13 vision), docker build vision ok. Test: TestRunTaskResults (src/backend/tests/test_statistics.py), TestRunTaskResultsProxy (src/frontend/flask_app/tests/test_statistics.py)
MANCA: i report PDF ed Excel per sessione restano con le sole misure (fuori ambito). Prova a mano nel browser non fatta.

**Soluzione** ESITO: fatto RIF: gitea:Adriano/TieMeasureFlow#58 COSA: la statistica per sessione mostra, oltre alle misure (fatte il 07/10, 4e52095 e44ac31), anche gli esiti OK/NOK dei task check e le note, i testi dei campi e gli allegati dei task note. FILE: src/backend/api/routers/statistics.py — GET /api/statistics/runs/{run_id}/task-results (require_metrologist, 404 se la run non esiste; risponde counts e results in ordine di tempo; etichette dai task.fields, se manca la chiave; 3 query) FILE: src/frontend/flask_app/blueprints/statistics.py — proxy task-results; proxy dei file limitato a task_results/ senza .. FILE: src/frontend/flask_app/templates/statistics/dashboard.html — pannello «Esiti dei task della sessione» (contatori OK/NOK/Fatto e tabella con ora, task, esito, note, campi, allegati, operatore), visibile solo con una sessione scelta FILE: translations it/en — 6 stringhe COMMIT: c911449 8d7fa9a, merge su V3.0.0 PROVA: suite goldrake su lavoro/daitarn-58 (base ac8604e = base del merge) → 856 passed 2 skipped (pytest 3.11 backend+frontend), 29 passed (pytest 3.13 vision), docker build vision ok. Test: TestRunTaskResults (src/backend/tests/test_statistics.py), TestRunTaskResultsProxy (src/frontend/flask_app/tests/test_statistics.py) MANCA: i report PDF ed Excel per sessione restano con le sole misure (fuori ambito). Prova a mano nel browser non fatta.
Adriano removed the assegnata:daitarn label 2026-10-11 18:22:41 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#58