📘 Architecture & Documentation

MES-FGAM — Système de suivi de production peinture aéronautique

1. Vue d'ensemble

🎯 Objectif

MES-FGAM est un Manufacturing Execution System (MES) dédié à l'atelier peinture de Figeac Aéro. Il assure le suivi en temps réel de la production, la traçabilité complète des opérations de peinture, et la gestion des fiches techniques de préparation peinture.

📋 Fonctions principales

2. Architecture technique

🏗️ Stack technologique

CoucheTechnologieDétail
FrontendHTML5 / CSS3 / JavaScript vanillaPages statiques servies par Express. Aucun framework (React, Vue, etc.)
BackendNode.js 20 + Express 4API REST JSON, middleware JWT
Base de donnéesPostgreSQL 16Schéma relationnel, 6 tables, volume Docker persistant
AuthJWT (jsonwebtoken) + bcryptTokens 12h, mots de passe hashés
DéploiementDocker Compose2 containers : mes-fgam-app + mes-fgam-db
Reverse ProxyNginx + Certbot SSLHTTPS sur le VPS OVH

📁 Structure des fichiers

MES-FGAM/
├── server.js                 # Serveur Express (API + fichiers statiques)
├── package.json              # Dépendances Node.js
├── paint_data.js             # Catalogue peintures source (152 fiches)
├── Dockerfile                # Image Node.js 20 Alpine
├── docker-compose.yml        # Orchestration PostgreSQL + App
├── .env                      # Variables d'env (DB, JWT — non versionné)
│
├── db/
│   ├── schema.sql            # Schéma des 6 tables
│   ├── pool.js               # Pool de connexion PostgreSQL
│   ├── init.js               # Initialisation du schéma au démarrage
│   └── seed.js               # Import peintures + users + permissions
│
├── middleware/
│   └── auth.js               # Vérification JWT + contrôle de rôle
│
├── routes/
│   ├── auth.js               # Authentification + permissions
│   ├── grofs.js              # CRUD lots de production
│   └── paints.js             # Catalogue peintures
│
└── public/                   # Fichiers servis en statique
    ├── index.html            # Portail principal + login
    ├── lancement.html        # Création de GROFs
    ├── poste_prepa.html      # Préparation (masquage, ponçage)
    ├── labo_peinture.html    # Fiches techniques labo
    ├── poste_cabine.html     # Application peinture + désolvatation
    ├── poste_etuve.html      # Étuvage + suivi T°C
    ├── supervision_live.html # Vue temps réel
    ├── tracabilite.html      # Archives + FORM-589
    ├── admin_access.html     # Gestion permissions
    ├── architecture.html     # Cette page
    └── js/api.js             # Module API partagé (fetch + JWT)

3. Workflow de production

🔄 Flux principal

Chaque pièce aéronautique suit un cycle de peinture en 4 passes, chacune composée de 4 sous-étapes :

① Lancement ② Prépa Labo ③ Préparation ④ Peinture ⑤ Désolvatation ⑥ Étuve ✅ Terminé
Ce cycle est répété 4 fois pour couvrir les 2 couches (Primaire + Finition) × 2 faces (F1 + F2), soit 16 étapes au total.

📦 Qu'est-ce qu'un GROF ?

Un GROF (GROupement de Fabrication) est un lot de production regroupant plusieurs OFs (Ordres de Fabrication) assignés à une même cabine de peinture. Chaque GROF :

4. Les 16 étapes du GROF

StepNomPassePosteType
0F1 — AlignementPrimaire Face 1Poste PrépaPREP
1Peinture Primaire F1Primaire Face 1Poste CabinePAINT
2Désolvatation Prim F1Primaire Face 1Poste CabineDESOL
3Étuve Prim F1Primaire Face 1Poste ÉtuveÉTUVE
4F2 — RetournementPrimaire Face 2Poste PrépaPREP
5Peinture Primaire F2Primaire Face 2Poste CabinePAINT
6Désolvatation Prim F2Primaire Face 2Poste CabineDESOL
7Étuve Prim F2Primaire Face 2Poste ÉtuveÉTUVE
8F1 — Prépa FinitionFinition Face 1Poste PrépaPREP
9Finition F1Finition Face 1Poste CabinePAINT
10Désolvatation Fin F1Finition Face 1Poste CabineDESOL
11Étuve Fin F1Finition Face 1Poste ÉtuveÉTUVE
12F2 — Prépa FinitionFinition Face 2Poste PrépaPREP
13Finition F2Finition Face 2Poste CabinePAINT
14Désolvatation Fin F2Finition Face 2Poste CabineDESOL
15Étuve Fin F2Finition Face 2Poste ÉtuveÉTUVE
Désolvatation (Flash-Off) — Temps de repos entre l'application de peinture et l'étuvage. Un timer démarre automatiquement. L'opérateur doit attendre la fin du temps réglementaire avant de valider l'étape.

5. Écrans & Fonctions

🏠 Portail (index.html)

➕ Lancement de Lots (lancement.html)

🔧 Poste Préparation (poste_prepa.html)

🧪 Prépa Labo Peinture (labo_peinture.html)

🎨 Poste Peinture (poste_cabine.html)

🔥 Poste Étuve (poste_etuve.html)

📊 Supervision Live (supervision_live.html)

📄 Traçabilité & Archives (tracabilite.html)

⚙️ Gestion des Accès (admin_access.html)

6. Utilisateurs & Rôles

👥 Les 5 rôles

RôleDescriptionÉcrans par défaut
admin Administrateur système — accès total Tous les écrans + Gestion des accès
responsable Responsable peinture — supervision complète Lancement, Prépa, Labo, Peinture, Étuve, Supervision, Traçabilité
peintre Opérateur cabine de peinture Prépa, Peinture, Étuve
labo Opérateur laboratoire peinture Lancement, Labo Peinture
qualite Contrôleur qualité Supervision, Traçabilité

🔐 Utilisateurs par défaut

CodeNomRôleMot de passe
ADMINAdministrateuradminadmin2026
RESP01Responsable Peintureresponsableresp2026
PEINT1Peintre 1peintre1234
PEINT2Peintre 2peintre1234
LABO01Opérateur Labolabo1234
QUAL01Contrôleur Qualitéqualitequal2026

7. Base de données

📐 Schéma relationnel — 6 tables

Table users

ColonneTypeContrainteDescription
idSERIALPRIMARY KEYIdentifiant auto-incrémenté
codeVARCHAR(20)UNIQUE NOT NULLCode badge / matricule (ex: PEINT1)
nameVARCHAR(100)NOT NULLNom complet de l'utilisateur
roleVARCHAR(20)CHECK (peintre, labo, responsable, qualite, admin)Rôle fonctionnel
password_hashVARCHAR(255)NOT NULLHash bcrypt du mot de passe
activeBOOLEANDEFAULT TRUECompte actif/désactivé
created_atTIMESTAMPTZDEFAULT NOW()Date de création du compte

Table screen_permissions

ColonneTypeContrainteDescription
roleVARCHAR(20)PK (composite)Rôle utilisateur
screenVARCHAR(50)PK (composite)Identifiant de l'écran (ex: poste_cabine)
allowedBOOLEANDEFAULT TRUEAccès autorisé ou non

Table paints — Catalogue peintures (152 fiches)

ColonneTypeContrainteDescription
idSERIALPRIMARY KEYIdentifiant interne
fournisseurVARCHAR(100)NOT NULLFournisseur (AKZO, PPG, MAPAERO, etc.)
type_et_couleurVARCHAR(255)NOT NULLDésignation complète (ex: "Finition Polyuréthane gris bac 707")
type_peintureVARCHAR(5)DEFAULT ''P = Primaire, F = Finition, V = Vernis, A = Apprêt
fiche_numINTEGERUNIQUE NOT NULLNuméro de fiche technique (1-152)
indiceVARCHAR(10)DEFAULT '/'Indice de révision de la fiche

Table grofs — Lots de production

ColonneTypeContrainteDescription
idVARCHAR(20)PRIMARY KEYIdentifiant GROF (ex: G847291)
cabineVARCHAR(20)NOT NULLCabine assignée : SAIMA 1, SAIMA 2 ou SAIMA 3
current_stepINTEGERDEFAULT 0Étape courante (0 à 15, >15 = terminé)
statusVARCHAR(20)CHECK (EN COURS, TERMINÉ, ANNULÉ)Statut global du lot
paint_readyBOOLEANDEFAULT FALSEPréparation labo validée (tous OFs cochés)
flash_off_startTIMESTAMPTZNULLABLEHeure de début du timer de désolvatation
created_byINTEGERFK → users(id)Utilisateur ayant créé le GROF
created_atTIMESTAMPTZDEFAULT NOW()Date de création
updated_atTIMESTAMPTZDEFAULT NOW()Dernière modification

Table grof_ofs — OFs rattachés à un GROF

ColonneTypeContrainteDescription
idSERIALPRIMARY KEYID interne
grof_idVARCHAR(20)FK → grofs(id) CASCADEGROF parent
of_numberVARCHAR(50)UNIQUE(grof_id, of_number)Numéro d'ordre de fabrication
paint_idINTEGERFK → paints(id)Référence peinture du catalogue
quantityVARCHAR(20)NULLABLEQuantité de peinture en grammes
fournisseurVARCHAR(100)NULLABLEFournisseur peinture (copie dénormalisée)
type_peintureVARCHAR(5)NULLABLEType de peinture (P/F/V/A)
paint_labelVARCHAR(255)NULLABLEDésignation peinture (copie dénormalisée)

Table grof_logs — Journal de traçabilité

ColonneTypeContrainteDescription
idSERIALPRIMARY KEYID interne
grof_idVARCHAR(20)FK → grofs(id) CASCADEGROF concerné
stepINTEGERNOT NULLNuméro d'étape (0-15)
step_nameVARCHAR(100)NULLABLENom de l'étape (ex: "Peinture Primaire F1")
typeVARCHAR(20)DEFAULT 'PAINT'Type : PAINT, DESOL, PREPA, ETUVE
operator_idINTEGERFK → users(id)Opérateur ayant validé l'étape
started_atTIMESTAMPTZNULLABLEDébut de l'opération
ended_atTIMESTAMPTZNULLABLEFin de l'opération
durationVARCHAR(20)NULLABLEDurée de l'opération (format libre)
tempVARCHAR(10)NULLABLETempérature relevée (°C)
humidityVARCHAR(10)NULLABLEHygrométrie relevée (%)
notesTEXTNULLABLEObservations libres de l'opérateur
created_atTIMESTAMPTZDEFAULT NOW()Horodatage de l'enregistrement

8. API REST

🔑 Authentification (/api/auth)

MéthodeRouteAuthDescription
POST/api/auth/loginConnexion — retourne JWT + user
GET/api/auth/meInfo utilisateur courant
GET/api/auth/users🔒 adminListe tous les utilisateurs
POST/api/auth/users🔒 adminCréer un utilisateur
GET/api/auth/permissionsÉcrans autorisés pour le rôle courant
GET/api/auth/permissions/all🔒 adminMatrice complète (tous rôles × écrans)
PUT/api/auth/permissions🔒 adminModifier les permissions d'un rôle

📦 GROFs (/api/grofs)

MéthodeRouteDescriptionQuery Params
GET/api/grofsListe des GROFsstatus, step, steps, cabine
GET/api/grofs/:idDétail d'un GROF
POST/api/grofsCréer un GROFBody: cabine, ofsDetails[]
PATCH/api/grofs/:id/stepAvancer/modifier le stepBody: action (next, set, flash_off_start, flash_off_end)
PATCH/api/grofs/:id/paint-readyValider prépa laboBody: paintReady (boolean)
GET/api/grofs/:id/logsLogs de traçabilité
DELETE/api/grofs/:idSupprimer un GROFadmin/responsable
DELETE/api/grofsReset totaladmin only

🎨 Peintures (/api/paints)

MéthodeRouteDescription
GET/api/paints?q=&limit=Recherche peintures (autocomplete)
GET/api/paints/allCatalogue complet

❤️ Santé

MéthodeRouteDescription
GET/api/healthStatut serveur — {"status":"ok"}

9. Sécurité & Authentification

🔒 Mécanisme JWT

🔑 Mot de passe

🛡️ RBAC (contrôle d'accès par rôle)

10. Déploiement

🐳 Docker Compose

# Démarrer l'application
docker compose up -d --build

# Seed la base de données
docker compose exec app node db/seed.js

# Voir les logs
docker compose logs -f app

# Redémarrer
docker compose restart app

📍 Infrastructure VPS

ParamètreValeur
ServeurVPS OVH — 151.80.61.38
OSUbuntu 25.04
SSHPort 49222 (clé SSH)
Container Appmes-fgam-app → port 3002
Container DBmes-fgam-db → port 5432 (interne)
Volumemes-fgam_pgdata (données PostgreSQL persistées)
Nginxmes-fgam.aerolean-supply.comlocalhost:3002
Mise à jour : Depuis votre Mac, exécutez :
rsync -avz --exclude='node_modules' --exclude='.git' --exclude='.env' -e 'ssh -p 49222' ./ ubuntu@151.80.61.38:~/MES-FGAM/
puis ssh -p 49222 ubuntu@151.80.61.38 'cd ~/MES-FGAM && docker compose up -d --build app'

11. Glossaire

TermeDéfinition
GROFGROupement de Fabrication — lot regroupant plusieurs OFs pour traitement en cabine
OFOrdre de Fabrication — commande de peinture pour une pièce spécifique
SAIMANom des cabines de peinture (marque d'équipement). 3 cabines : SAIMA 1, 2, 3
Flash-Off / DésolvatationTemps de repos obligatoire entre l'application de peinture et le passage en étuve
PrimairePremière couche de peinture (accroche, protection anti-corrosion)
FinitionCouche finale de peinture (couleur, aspect, protection UV)
F1 / F2Face 1 et Face 2 de la pièce — chaque face reçoit le cycle complet
FORM-589Formulaire qualité de traçabilité peinture (document de référence)
LIS-098Liste des fiches techniques de préparation peinture (152 fiches)
JWTJSON Web Token — jeton d'authentification signé
RBACRole-Based Access Control — contrôle d'accès par rôle
MESManufacturing Execution System — système de pilotage de production