màj wiki avec retour MES lot-5 AD
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
---
|
||||
title: "Consolidation (regroupement) — Processus sur poste"
|
||||
tags: [picking, regroupement, consolidation, MOV, poste, custom]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: []
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx]
|
||||
last_updated: 2026-05-05
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Consolidation (regroupement) — Processus sur poste
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de consolidation de palettes incomplètes
|
||||
> partageant les mêmes critères de stock, sur poste de travail.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le regroupement permet de vider des palettes partiellement remplies en
|
||||
déplaçant leur stock vers d'autres palettes contenant le même stock.
|
||||
L'objectif est de libérer des emplacements dans l'ASRS.
|
||||
|
||||
## Critères de consolidation
|
||||
|
||||
Le regroupement est proposé quand deux palettes ou plus partagent :
|
||||
|
||||
- Article
|
||||
- Lot SAP
|
||||
- Propriétaire
|
||||
- Statut de stock
|
||||
- Flag anoxie
|
||||
|
||||
## [CUSTOM] Vue de proposition de regroupement
|
||||
|
||||
Une vue spécifique est développée pour Limagrain. Elle présente :
|
||||
|
||||
- Les palettes candidates au regroupement
|
||||
- Le gain potentiel en nombre de palettes
|
||||
|
||||
**Règle** : le regroupement n'est proposé que s'il permet de gagner au
|
||||
moins 1 palette. Exemple : Bag/Pal = 75, si palette H1 = 73 et H2 = 5
|
||||
→ pas de regroupement (73 + 5 = 78 > 75, pas de gain).
|
||||
|
||||
L'opérateur sélectionne un ou plusieurs ordres de regroupement depuis
|
||||
cette vue.
|
||||
|
||||
## Processus complet
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
VUE[Vue proposition regroupement] --> SELECT[Sélection ordres]
|
||||
SELECT --> ASSIGN[Assignation poste automatique]
|
||||
ASSIGN --> TACHE[Création tâches mouvement]
|
||||
TACHE --> ORD[Ordonnancement palettes au poste]
|
||||
ORD --> VERROU{Verrou « Réception » ?}
|
||||
VERROU -->|Oui| RECOUNT[Recomptage]
|
||||
VERROU -->|Non| PICK[Déplacement sacs]
|
||||
RECOUNT --> PICK
|
||||
PICK --> VIDE{Palette vidée ?}
|
||||
VIDE -->|Oui| DEGAGE[Dégagement palette vide]
|
||||
VIDE -->|Non| PICK
|
||||
DEGAGE --> EVAC[Évacuation palette stock]
|
||||
EVAC --> FILM[Choix filmage]
|
||||
FILM --> PIE[Passage PIE]
|
||||
PIE --> STOCK[Stockage ASRS]
|
||||
```
|
||||
|
||||
## Assignation poste de travail
|
||||
|
||||
- Assignation **automatique** quand un ordre est lancé
|
||||
- [CUSTOM] Si le lot a un Bag/Pal ≤ 2 → considéré « big-bag » →
|
||||
seul le **poste P6** (équipé d'un palan) est assignable
|
||||
- Un big-bag ne peut être consolidé que sur un autre big-bag
|
||||
- Si P6 n'est pas en mode regroupement → tâche en attente
|
||||
- Si aucun poste disponible → ordre en attente de libération
|
||||
|
||||
## [CUSTOM] Ordonnancement des palettes au poste
|
||||
|
||||
Une fois l'ordre lancé et le poste assigné, les palettes arrivent dans
|
||||
cet ordre :
|
||||
|
||||
1. **Minimum de mouvements palette** (moins de déplacements physiques)
|
||||
2. **Minimum de mouvements sac** (moins de manipulations)
|
||||
3. **Palette complète** (en priorité la palette destinataire)
|
||||
|
||||
## Exécution sur poste
|
||||
|
||||
1. [CUSTOM] Si verrou « Réception » → recomptage avant regroupement
|
||||
2. Les sacs de la palette à éliminer sont déplacés vers la palette
|
||||
destinataire
|
||||
3. Quand la palette est vidée → dégagement de la table de préparation
|
||||
4. Évacuation de la palette avec stock restant via bouton EasyWMS
|
||||
5. [CUSTOM] Choix filmage depuis vue spécifique (programme à définir)
|
||||
6. [CUSTOM] Message **MOV** à chaque déplacement de stock :
|
||||
- Palette d'origine
|
||||
- Palette de destination
|
||||
- Nouvelle palette ? (Oui/Non)
|
||||
- Quantité + caractéristiques (article, lot SAP, ...)
|
||||
|
||||
## Passage PIE post-regroupement
|
||||
|
||||
Contrôle identique aux autres processus :
|
||||
|
||||
- Dimensions max : 1300 × 1100 × 1900 mm
|
||||
- Poids max : 1250 kg
|
||||
- État palette bois correct
|
||||
- Étiquette RFID connue
|
||||
|
||||
[CUSTOM] Calcul poids de référence :
|
||||
|
||||
```
|
||||
Poids réf = Σ (Poids_unité_ligne_i × quantité_ligne_i) + poids_palette_bois
|
||||
```
|
||||
|
||||
Vérification avec tolérance par type d'article (voir
|
||||
[Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le message MOV est envoyé à chaque mouvement unitaire — volumétrie
|
||||
potentiellement élevée pour un regroupement complexe.
|
||||
|
||||
⚠️ Les 3 tables de préparation d'un même poste peuvent être occupées
|
||||
simultanément pendant le regroupement.
|
||||
|
||||
⚠️ Un big-bag ne peut être consolidé que sur un autre big-bag (contrainte
|
||||
physique + système).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Programme de filmage exact pour le regroupement (@Théo)
|
||||
- [ ] Interface opérateur vue regroupement — maquette validée ? (@Fabien)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
@@ -0,0 +1,145 @@
|
||||
---
|
||||
title: "Échantillonnage — Processus de contrôle qualité"
|
||||
tags: [picking, échantillonnage, inventaire, qualité, poste, custom]
|
||||
status: draft
|
||||
standard_ref: concepts/inventory.md
|
||||
jira_refs: []
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx]
|
||||
last_updated: 2026-05-05
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Échantillonnage — Processus de contrôle qualité
|
||||
|
||||
> **Résumé** : processus [CUSTOM] d'échantillonnage pour contrôle qualité,
|
||||
> assimilé à un inventaire dans EasyWMS, avec prélèvement sur poste de travail.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Inventory](../../concepts/inventory.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
L'échantillonnage sert au contrôle qualité sur une partie des lots
|
||||
produits. Il consiste à prélever environ 200 grammes dans une partie du
|
||||
stock sélectionné. Le prélèvement est ensuite analysé pour valider la
|
||||
qualité du produit fini.
|
||||
|
||||
Dans EasyWMS, ce processus est assimilé à un **inventaire** (ordre
|
||||
d'inventaire).
|
||||
|
||||
## Création de l'ordre d'échantillonnage
|
||||
|
||||
Deux modes de création :
|
||||
|
||||
| Mode | Origine | Détail |
|
||||
|------|---------|--------|
|
||||
| Interface ERP | Message de l'ERP (COR) | Spécifie un lot à inventorier |
|
||||
| Manuel | Interface EasyWMS | Choix d'un lot par l'opérateur |
|
||||
|
||||
[CUSTOM] Un champ texte est disponible pour donner des **consignes**
|
||||
rattachées à l'ordre d'inventaire.
|
||||
|
||||
## [CUSTOM] Assignation du stock
|
||||
|
||||
L'assignation diffère selon le mode de création :
|
||||
|
||||
### Création par interface ERP
|
||||
|
||||
- Maximum **4 palettes** échantillonnées :
|
||||
- Si stock global < 4 → toutes les palettes
|
||||
- Si stock global ≥ 4 → 4 palettes sélectionnées
|
||||
- [CUSTOM] Les palettes avec un verrou d'écart de poids (« Production »)
|
||||
sont **prioritaires** pour permettre une vérification simultanée
|
||||
|
||||
### Création manuelle
|
||||
|
||||
- Nombre de palettes choisi par l'opérateur
|
||||
|
||||
## Assignation poste de travail
|
||||
|
||||
- Automatique, à condition que le poste soit ouvert et autorise le
|
||||
mode « échantillonnage »
|
||||
- Si aucun poste paramétré en mode échantillonnage → tâches en attente
|
||||
- Une fois le poste assigné → création des tâches de mouvement
|
||||
|
||||
## Processus sur poste de travail
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ORDRE[Ordre échantillonnage] --> ASSIGN[Assignation stock]
|
||||
ASSIGN --> POSTE[Assignation poste auto]
|
||||
POSTE --> TACHE[Tâches mouvement créées]
|
||||
TACHE --> ARRIVE[Palette arrive sur TP]
|
||||
ARRIVE --> VERROU{Verrou « Réception » ?}
|
||||
VERROU -->|Oui| RECOUNT[Recomptage]
|
||||
VERROU -->|Non| PRELEV[Prélèvement ~200g]
|
||||
RECOUNT --> PRELEV
|
||||
PRELEV --> ETIQ[Impression étiquette échantillonnage]
|
||||
ETIQ --> SCOTCH[Scotch sac ouvert]
|
||||
SCOTCH --> FILM[Choix filmage]
|
||||
FILM --> EVAC[Évacuation → PIE → stockage]
|
||||
EVAC --> NEXT{Palette suivante ?}
|
||||
NEXT -->|Oui| ARRIVE
|
||||
NEXT -->|Non| FIN[Fin ordre]
|
||||
```
|
||||
|
||||
Les 3 tables de préparation peuvent être occupées simultanément.
|
||||
Le processus est démarré et effectué sur **une seule palette à la fois**.
|
||||
|
||||
### Séquence opérateur
|
||||
|
||||
1. [CUSTOM] Si verrou « Réception » → recomptage avant échantillonnage
|
||||
2. Prendre une pochette d'échantillonnage vide (hors EasyWMS)
|
||||
3. Effectuer un prélèvement dans un des sacs (~200g, hors EasyWMS)
|
||||
4. Déposer le prélèvement dans la pochette (hors EasyWMS)
|
||||
5. Éditer et imprimer une **étiquette d'échantillonnage**
|
||||
6. Coller l'étiquette sur la pochette (hors EasyWMS)
|
||||
7. Scotcher le sac ouvert sur la palette (hors EasyWMS)
|
||||
8. [CUSTOM] Choix filmage depuis vue spécifique (programme à définir)
|
||||
9. Évacuer la palette vers le stockage
|
||||
|
||||
## Passage PIE post-échantillonnage
|
||||
|
||||
Contrôle identique aux autres processus :
|
||||
|
||||
- Dimensions max : 1300 × 1100 × 1900 mm
|
||||
- Poids max : 1250 kg
|
||||
- Étiquette RFID connue
|
||||
- État palette bois correct
|
||||
|
||||
[CUSTOM] Poids de référence recalculé + vérification avec tolérance
|
||||
(voir [Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
Si PIE NOK → rejet vers poste d'origine. Possibilité de forcer le
|
||||
passage en cas d'excédent de poids non corrigeable.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ L'échantillonnage est un processus d'**inventaire** dans EasyWMS,
|
||||
pas un processus de picking — important pour le paramétrage des modes
|
||||
de poste.
|
||||
|
||||
⚠️ Les palettes avec verrou « Production » (écart poids) sont traitées
|
||||
en priorité pour optimiser le recomptage.
|
||||
|
||||
⚠️ La quantité prélevée (~200g) n'est pas déduite du stock dans EasyWMS
|
||||
(négligeable par rapport au poids total).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Le prélèvement de 200g est-il déduit du stock ou négligé ? (@Nicolas)
|
||||
- [ ] Programme de filmage exact (@Théo)
|
||||
- [ ] Format de l'étiquette d'échantillonnage — validé ? (@Justine)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
@@ -0,0 +1,211 @@
|
||||
---
|
||||
title: "Mega Job — Assignation des tâches aux PK"
|
||||
tags: [picking, job, assignation, agv, workflow]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-70, LIM-74, LIM-75, LIM-80]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-70 LOT1.3 [AGV][JOB] MEGA JOB - assignation d'ordre par priorité de process par PK.md", "LIM-80 LOT2.1 2 Mini Job Assignation des postes PK aux commandes.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Mega Job — Assignation des tâches aux PK
|
||||
|
||||
> **Résumé** : job unique « chef d'orchestre » qui analyse les postes de
|
||||
> travail éligibles et leur assigne des tâches de mouvement selon les
|
||||
> modes autorisés et leur priorité. Évite la concurrence entre
|
||||
> mini-jobs indépendants.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md),
|
||||
> [Stations & Routes](../../concepts/stations.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, les postes de travail (PK) sont polyvalents : réception,
|
||||
picking, regroupement, échantillonnage, re certification. Plusieurs
|
||||
flux différents génèrent des tâches de mouvement vers les PK. Sans
|
||||
orchestration centralisée, ces flux se feraient concurrence.
|
||||
|
||||
Le Mega Job est un **job unique** avec une entête qui analyse l'ensemble
|
||||
des supports concernés et, selon leur emplacement d'origine et leurs
|
||||
caractéristiques, délègue à des **sous-workflows** dédiés.
|
||||
|
||||
## Éligibilité d'un PK
|
||||
|
||||
Pour qu'un poste soit éligible à une nouvelle assignation, **toutes** les
|
||||
conditions suivantes doivent être remplies :
|
||||
|
||||
- **Aucun ordre de sortie** assigné au PK (écran Menu > Contrôle >
|
||||
Affectation des postes de prélèvements)
|
||||
- **Aucune tâche de mouvement** ayant pour destination ce PK
|
||||
- **Aucune palette** présente sur un des sous-emplacements du PK
|
||||
- **Le poste est ouvert** (mode actif)
|
||||
- **Le paramètre MODES_PKxx existe et n'est pas vide** — sinon le PK
|
||||
est ignoré
|
||||
|
||||
Si un PK ne remplit pas ces conditions, le job le saute et passe au
|
||||
suivant.
|
||||
|
||||
## Logique principale
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Début du job] --> B[Lister les PK ouverts]
|
||||
B --> C{PK éligible ?}
|
||||
C -- Non --> D[PK suivant]
|
||||
C -- Oui --> E[Lire MODES_PKxx]
|
||||
E --> F{Paramètre existe et non vide ?}
|
||||
F -- Non --> D
|
||||
F -- Oui --> G[Trier les modes par priorité]
|
||||
G --> H[Exécuter sous-WF du mode priorité 1]
|
||||
H --> I{Tâche assignée ?}
|
||||
I -- Oui --> D
|
||||
I -- Non --> J[Exécuter sous-WF du mode priorité 2]
|
||||
J --> K{Tâche assignée ?}
|
||||
K -- Oui --> D
|
||||
K -- Non --> L[... mode suivant ...]
|
||||
L --> D
|
||||
D --> M{Autres PK ?}
|
||||
M -- Oui --> C
|
||||
M -- Non --> N[Fin du job]
|
||||
```
|
||||
|
||||
Pour chaque PK éligible :
|
||||
|
||||
1. Le WMS récupère le paramètre `MODES_PKxx` (x = numéro du poste)
|
||||
2. Les modes sont triés par priorité croissante
|
||||
3. Le sous-workflow du mode de priorité la plus haute est exécuté
|
||||
4. Si le sous-WF a assigné une tâche → passage au PK suivant
|
||||
5. Sinon → exécution du sous-WF du mode suivant dans l'ordre de priorité
|
||||
6. Si aucun sous-WF n'a rien assigné → le PK reste en attente
|
||||
|
||||
## Gestion des Big-Bags
|
||||
|
||||
Le paramètre `PK_BIGBAG` définit quels PK autorisent la présence de
|
||||
big-bags (physiquement : P5 et P6 avec palan).
|
||||
|
||||
- Les ordres contenant des supports big-bag sont **interdits** sur les
|
||||
PK qui ne les autorisent pas
|
||||
- Ces ordres sont **prioritaires** (en respectant le séquençage des
|
||||
process en première priorité) sur les PK qui les autorisent
|
||||
|
||||
## Sous-workflows
|
||||
|
||||
Le Mega Job délègue la création effective des tâches à des sous-workflows
|
||||
spécialisés :
|
||||
|
||||
| Sous-WF | Ticket | Process | Page wiki |
|
||||
|---------|--------|---------|-----------|
|
||||
| Mini Job images de quai → PK | [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Réception fournisseur / intersite / retour client (depuis images de quai) | [Job réception PK](../05-agv/job-reception-pk.md) |
|
||||
| Mini Job PS → PK | [LIM-75](https://easywmsfrance.atlassian.net/browse/LIM-75) | _(tâche à écrire)_ | — |
|
||||
| Mini Job assignation commandes → PK | [LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80) | Assignation des ordres de sortie (commandes) aux PK pour picking | Voir section ci-dessous |
|
||||
|
||||
Chaque sous-workflow retourne une information au WF principal indiquant
|
||||
s'il a assigné quelque chose ou non.
|
||||
|
||||
## Mini Job — Assignation commandes aux PK (LIM-80)
|
||||
|
||||
Ce sous-workflow est appelé par le Mega Job quand le mode **Picking** est
|
||||
actif sur un PK. Il assigne un ordre de sortie (commande) au poste.
|
||||
|
||||
### Éligibilité du PK pour une commande
|
||||
|
||||
Le PK peut recevoir une commande si **toutes** les conditions sont
|
||||
remplies :
|
||||
|
||||
- Le PK **autorise la préparation de commande** (mode Picking actif)
|
||||
- Le PK **n'a pas de commande déjà assignée**
|
||||
- Le PK **est vide** (aucune palette présente)
|
||||
- Le PK **n'a aucune tâche en direction de celui-ci**
|
||||
|
||||
### Choix de la commande
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[PK éligible en mode Picking] --> B{Commande Messagerie\ndisponible ?}
|
||||
B -- Oui --> C{PK_TRANSPORTEUR_MESSAGERIE\ncontient une valeur ?}
|
||||
C -- Non --> D[Assigner 1ère Messagerie\net enregistrer PK dans param]
|
||||
C -- Oui --> E{Valeur = ce PK ?}
|
||||
E -- Oui --> F[Assigner prochaine Messagerie\ndu même transporteur]
|
||||
F --> G{Commande trouvée ?}
|
||||
G -- Non --> H[Vider le paramètre]
|
||||
E -- Non --> I[Ignorer les Messagerie\nde ce transporteur]
|
||||
I --> J[Chercher autre commande]
|
||||
B -- Non --> J
|
||||
H --> J
|
||||
J --> K[Assignation standard\npar tournée / numéro d'arrêt]
|
||||
```
|
||||
|
||||
#### Commandes Messagerie (prioritaires)
|
||||
|
||||
Les commandes de **classe Messagerie** sont expédiées le jour même et
|
||||
sont donc **prioritaires** sur les autres commandes.
|
||||
|
||||
**Affinité transporteur ↔ PK** : une fois qu'un PK est choisi pour une
|
||||
commande Messagerie, **toutes les commandes Messagerie du même
|
||||
transporteur** doivent être assignées au même PK. Le mécanisme repose
|
||||
sur un paramètre par transporteur :
|
||||
|
||||
- `PK_TRANSPORTEUR_MESSAGERIE` : contient le code du PK assigné
|
||||
- Si le paramètre contient une valeur correspondant au PK analysé →
|
||||
assigner la prochaine commande Messagerie de ce transporteur
|
||||
- Si la valeur correspond à un **autre PK** → ignorer toutes les
|
||||
Messagerie de ce transporteur pour ce PK
|
||||
- Si le PK a le paramètre mais qu'**aucune commande** Messagerie de ce
|
||||
transporteur n'est trouvable → **vider le paramètre**
|
||||
- Si le paramètre contient le nom du PK → le PK ne peut assigner **que**
|
||||
des Messagerie de ce transporteur (exclusivité tant que le
|
||||
paramètre est actif)
|
||||
|
||||
#### Autres commandes (standard)
|
||||
|
||||
Le processus standard est utilisé : assignation d'une commande à une
|
||||
table de préparation et un PK, en respectant l'ordre de la **tournée**
|
||||
(numéro d'arrêt croissant — plus petit numéro d'arrêt en premier).
|
||||
|
||||
## Paramètres
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| MODES_PKxx | Modes autorisés + priorité pour le PK xx (un par PK, renseigné via la vassist — voir [Stations picking](stations-picking.md)) | _(vide)_ |
|
||||
| PK_BIGBAG | PK autorisant les big-bags | _(à définir — P5, P6)_ |
|
||||
| PK_TRANSPORTEUR_MESSAGERIE | Code PK assigné au transporteur Messagerie en cours (un paramètre par transporteur) | _(vide)_ |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
> **À reprendre par @Michael** : l'entête du job doit checker tous les
|
||||
> PK en attente de tâche, vérifier leurs modes autorisés et la séquence
|
||||
> de priorité pour entrer dans le sous-WF nécessaire.
|
||||
|
||||
- Le job standard `Task_GenerateMovementJob_PR` gère le passage
|
||||
"en attente" → "créé" ; le Mega Job ne remplace pas ce mécanisme
|
||||
mais crée les tâches en amont
|
||||
- Un PK fermé n'est jamais éligible — le job le vérifie dès la première
|
||||
condition
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Fréquence d'exécution du Mega Job à définir (@Michael)
|
||||
- [ ] Sous-WF pour regroupement, échantillonnage : tickets à créer ?
|
||||
- [ ] Interaction entre PK_BIGBAG et les modes : si P5 est en mode
|
||||
regroupement, accepte-t-il quand même les big-bags en réception ?
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-70 |
|
||||
| 2026-05-12 | Arthur | Ajout sous-WF assignation commandes (LIM-80) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) | Ticket Jira | 2026 |
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira | 2026 |
|
||||
| [LIM-75](https://easywmsfrance.atlassian.net/browse/LIM-75) | Ticket Jira | 2026 |
|
||||
| [LIM-69](https://easywmsfrance.atlassian.net/browse/LIM-69) | Ticket Jira (modes PK) | 2026 |
|
||||
| [LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80) | Ticket Jira (assignation commandes PK) | 2026 |
|
||||
@@ -0,0 +1,307 @@
|
||||
---
|
||||
title: "Picking sur poste de travail — Expédition client"
|
||||
tags: [picking, poste, expédition, ordonnancement, MOV, PCK]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-82]
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Expédition - LIMAGRAIN - DEV - Confluence.md", "LIM-82 LOT2.2 [PICKING] Ordonnancement des tâches de picking PS PK.md", "REU PICKING SEQUENCAGE 11-05-2026 - Analyse comparative notes + AF + devops.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Picking sur poste de travail — Expédition client
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de picking sur poste de travail pour
|
||||
> les commandes client, avec ordonnancement par espèce, règles de picking
|
||||
> négatif et contraintes physiques.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le picking chez Limagrain se fait sur les postes de travail automatisés
|
||||
(pas de picking mobile en allée). Les palettes source et les palettes
|
||||
de préparation sont acheminées par AGV sur les tables de préparation (TP).
|
||||
|
||||
> **Note** : cette page décrit le picking tel que défini dans l'AF V1.5.
|
||||
> Le projet a depuis évolué vers un modèle « picking combinatoire »
|
||||
> (CR V3.0, 4 jobs, CstAtt) qui sera documenté séparément.
|
||||
|
||||
## Déclenchement
|
||||
|
||||
Le picking est déclenché pour les commandes client (RUT type « Client »)
|
||||
quand des palettes incomplètes sont nécessaires (la quantité demandée
|
||||
ne correspond pas à des palettes complètes).
|
||||
|
||||
Prérequis : un **poste de travail assigné** (auto ou manuellement).
|
||||
|
||||
## [CUSTOM] Ordonnancement des palettes au poste
|
||||
|
||||
Une fois le poste assigné, les palettes arrivent dans cet ordre :
|
||||
|
||||
### Tri par espèce et gerbabilité
|
||||
|
||||
1. **Espèce Maïs** toujours en premier (pas la variété mais l'espèce)
|
||||
2. Puis espèce avec la **plus grande quantité** dans la commande
|
||||
3. Si égalité → **article/lot le plus lourd** en base de palette
|
||||
|
||||
**Mapping Espèce → stack (gerbabilité)** : le maïs = stack 0 (le plus
|
||||
lourd/stable, donc en base). [CUSTOM] Gestion en **async sur l'ITM** pour
|
||||
calculer la gerbabilité automatiquement à la création de l'article. Tri
|
||||
des tâches de picking dans le workflow `StackerCrane_SortTasks_PR`.
|
||||
|
||||
### ~~Séparation par traitement commercial~~ SUPPRIMÉ (réu. 11/05/2026)
|
||||
|
||||
~~Pas de mélange entre articles avec traitement et sans traitement
|
||||
sur une même palette fille.~~
|
||||
|
||||
**Décision** : `CONTROLE_TRAITEMENT_COMMERCIAL = false`. L'entrepôt
|
||||
Limagrain ne fait pas de bio, pas de raison de maintenir cette
|
||||
contrainte. Paramètre réactivable si besoin futur.
|
||||
|
||||
> Voir [Séquençage TK → PS — Arbitrage](sequencage-tk-ps.md#arbitrage-des-contradictions-reu-11052026)
|
||||
> pour le détail de l'analyse comparative.
|
||||
|
||||
## [CUSTOM] Règle du picking négatif
|
||||
|
||||
**Deux conditions cumulatives** (réu. 11/05/2026) :
|
||||
|
||||
1. La quantité à prélever dépasse le **seuil fiche article** (défaut
|
||||
55%, paramétrable par article via "Complete quantity percent excess
|
||||
for negative picking")
|
||||
2. Le **poids unitaire du sac ≥ 7 kg** (raison : instabilité palette si
|
||||
gros sacs ramenés sur petits sacs)
|
||||
|
||||
Si les deux conditions sont remplies → **picking négatif** : au lieu de
|
||||
déplacer les sacs à expédier, déplacer les sacs qui **retourneront en
|
||||
stock** (moins de mouvements physiques).
|
||||
|
||||
Si l'une des deux conditions n'est pas remplie → picking direct
|
||||
classique.
|
||||
|
||||
> Le picking négatif est **prioritaire sur Maïs first** et toutes les
|
||||
> autres règles de tri (confirmé par Olivier, réu. 11/05/2026).
|
||||
> Voir [Séquençage TK → PS](sequencage-tk-ps.md#critère-1--picking-négatif-en-premier).
|
||||
|
||||
## [CUSTOM] Calcul équivalent palette (pro rata Bag/pal)
|
||||
|
||||
Pour déterminer si une palette est « pleine », calcul en **pro rata
|
||||
Bag/pal** (réu. 11/05/2026, remplace la logique DevOps "Bag/pal max") :
|
||||
|
||||
```
|
||||
Équivalent palette d'un sac = 1 ÷ Bag/Pal de son lot
|
||||
```
|
||||
|
||||
Le calcul est additif et gère nativement des lots avec des Bag/pal
|
||||
différents sur une même palette :
|
||||
|
||||
```
|
||||
Exemple :
|
||||
15 sacs lot Bag/pal 20 + 10 sacs lot Bag/pal 75
|
||||
= 15/20 + 10/75
|
||||
= 0,75 + 0,133
|
||||
= 88,3% → il reste ~12% de place
|
||||
```
|
||||
|
||||
Seuil cible : **~95%** de remplissage (marge de sécurité).
|
||||
Poids max palette : **1 250 kg** (AF fait foi, corrige 1 200 kg du
|
||||
DevOps).
|
||||
|
||||
## [CUSTOM] Verrou « HORS TOLERANCE » — Recomptage
|
||||
|
||||
Si la palette source porte le verrou « HORS TOLERANCE » → recomptage
|
||||
demandé avant le picking (inventaire).
|
||||
|
||||
- Si stock restant suffisant après inventaire → assignation maintenue
|
||||
(workflow `OnStockAdjust` recalcule uniquement si nécessaire — ne casse
|
||||
pas la tâche en cours)
|
||||
- Si plus assez de stock → réassignation ailleurs + retrait verrou
|
||||
|
||||
## [CUSTOM] Algorithme de répartition des palettes sur les TP
|
||||
|
||||
Logique combinatoire complète gérant tous les cas :
|
||||
|
||||
- Picking négatif et enchaînement de pickings négatifs
|
||||
- Ordonnancement par espèce
|
||||
- Terminer une palette pleine avant d'en entamer une autre
|
||||
- Cadencement des buffers devant les postes de picking
|
||||
- Pas de mélange de traitement commercial (via famille d'article)
|
||||
- **Contrainte** : l'opérateur ne doit **pas déplacer de sacs d'une table
|
||||
à l'autre** (sacs lourds)
|
||||
|
||||
**Table du milieu** : toujours occupée soit par une palette de picking
|
||||
négatif, soit par une palette vide de dépôt. Quand la palette de
|
||||
prélèvement est vidée, l'opérateur la remet manuellement sur une pile
|
||||
de palettes vides à proximité.
|
||||
|
||||
> Prévoir un process sans picking négatif pour les cas où c'est rarement
|
||||
> utilisé (ou monter le seuil, ex : 70% au lieu de 50%).
|
||||
|
||||
## Processus de préparation
|
||||
|
||||
### Arrivée des palettes (toujours un poste 3 TP)
|
||||
|
||||
- Première palette au **centre** si picking négatif proposé, sinon sur
|
||||
un côté
|
||||
- Si une palette est sur un côté et qu'on propose du picking négatif →
|
||||
prévenir l'opérateur de déplacer la palette au centre
|
||||
- La palette client revient **toujours** au centre
|
||||
- Pas de prépa sur 6 TP en simultané
|
||||
|
||||
### Picking
|
||||
|
||||
1. Palette source arrive sur une TP
|
||||
2. Palette destination (vide ou en cours) sur une autre TP
|
||||
3. Opérateur prélève les sacs (ou sacs retour si picking négatif)
|
||||
4. ~~[CUSTOM] Message MOV envoyé à SAP~~ **ANNULÉ** (décision client)
|
||||
5. Avant évacuation : choix filmage (CstData transmis à Galileo).
|
||||
Possibilité de choisir « pas de filmage ».
|
||||
6. Évacuation palette → PIE → contrôle poids → stockage/expédition
|
||||
|
||||
## [CUSTOM] Ordonnancement des tâches PS → PK (LIM-82)
|
||||
|
||||
Détail du cadencement des palettes depuis les postes de sortie (PS)
|
||||
vers les postes de picking (PK). Toutes les tâches de picking se font
|
||||
sur les tables élévatrices des PK.
|
||||
|
||||
### Règles de priorité
|
||||
|
||||
1. **Picking négatif toujours en premier** — une seule palette à la fois
|
||||
pour ce process, toujours déposée sur la **table du centre**
|
||||
2. **Picking classique ensuite** — jusqu'à **2 palettes simultanées** au
|
||||
PK, déposées sur les **tables latérales**
|
||||
3. Le WMS peut envoyer **1 palette picking négatif + 1 palette picking
|
||||
classique** en même temps (pour compléter la palette post-picking
|
||||
négatif)
|
||||
4. Le nombre de palettes de prélèvement au PK ne dépasse **jamais 2**
|
||||
|
||||
### Picking négatif — Détail
|
||||
|
||||
À chaque tâche de picking négatif :
|
||||
|
||||
- Un **nouveau code SSCC** est généré pour la palette où l'excédent de
|
||||
stock est déposé
|
||||
- Une **étiquette RFID** est imprimée pour cette nouvelle palette
|
||||
- La palette de picking négatif va toujours au **centre** du PK
|
||||
|
||||
### Cadencement des buffers
|
||||
|
||||
Les palettes non encore nécessaires au PK sont dirigées vers les
|
||||
**zones d'attente** (buffers ES_X) s'il y a de la place disponible. Le
|
||||
WMS **privilégie la sortie des palettes de picking négatif** vers les
|
||||
buffers.
|
||||
|
||||
À chaque palette arrivant au PS, celui-ci vérifie s'il existe d'autres
|
||||
tâches du même OS avec une **séquence plus faible** :
|
||||
|
||||
- Si oui → palette envoyée au **buffer ES_X** (attente)
|
||||
- Si non → palette envoyée directement au **PK**
|
||||
|
||||
### Cas d'exemple — 10 tâches (3 négatif, 7 classique)
|
||||
|
||||
1. Le WMS envoie **2 palettes** vers le PK : 1 picking négatif + 1
|
||||
picking classique
|
||||
2. Les **8 autres** palettes sont dirigées vers les zones d'attente
|
||||
(priorité aux palettes de picking négatif)
|
||||
3. L'opérateur réalise le picking négatif → impression étiquette
|
||||
SSCC/RFID pour la nouvelle palette
|
||||
4. L'opérateur réalise le picking classique → stock déposé sur la
|
||||
palette du milieu
|
||||
5. Si la palette client n'est pas pleine → le WMS apporte une nouvelle
|
||||
palette de picking classique
|
||||
6. L'opérateur déclare la palette client **pleine** → le WMS apporte la
|
||||
2ᵉ palette de picking négatif
|
||||
7. Si le picking classique précédent est **en cours** (tâche partielle)
|
||||
→ pas de nouvelle palette classique. Sinon → 2ᵉ palette classique
|
||||
envoyée au PK
|
||||
|
||||
Voir aussi [Séquençage TK → PS](sequencage-tk-ps.md) pour le
|
||||
mécanisme amont de tri des tâches entre les transstockeurs et les
|
||||
postes de sortie, et [Placement PS → PK](placement-ps-pk.md) pour
|
||||
l'algorithme de choix de table (ping-pong, buffers, évacuation).
|
||||
|
||||
## Information passage conteneur client
|
||||
|
||||
Le passage en conteneur client est visible dans le **LOC** envoyé
|
||||
toutes les 5 minutes à SAP (flag « client » = true). Voir
|
||||
[Flux ERP outbound](../04-outbound/flux-erp-outbound.md#communication-erp--loc--détails).
|
||||
|
||||
## Étiquetage
|
||||
|
||||
### Cas standard (non MII ou MII mono lot)
|
||||
|
||||
- 1 étiquette RFID pour la palette physique bois
|
||||
|
||||
### Cas MII multi lots
|
||||
|
||||
- 1 étiquette HU RFID pour la palette physique (HU mère)
|
||||
- 1 étiquette HU sans RFID par ligne de stock (HU fille / intercalaire)
|
||||
- Impression auto à chaque nouvelle palette (RFID) et à chaque article
|
||||
(intercalaire)
|
||||
- Basé sur la **classe de commande**
|
||||
|
||||
## Contraintes opérateur (hors EasyWMS)
|
||||
|
||||
Règles non gérées par le système mais à respecter :
|
||||
|
||||
1. Palette ne doit pas excéder **1,90 m** (sinon rejet PIE)
|
||||
2. Palette ne doit pas excéder **1 250 kg** (sinon rejet PIE, AF fait foi)
|
||||
3. Pas de gerbage de palette
|
||||
4. Disposition d'intercalaires entre couches
|
||||
|
||||
## Calcul poids de référence (post-picking)
|
||||
|
||||
Pour les palettes multi-lignes de stock :
|
||||
|
||||
```
|
||||
Poids réf = Σ (Poids_unité_ligne_i × quantité_ligne_i) + poids_palette_bois
|
||||
```
|
||||
|
||||
Contrôle PIE identique aux autres processus (voir
|
||||
[Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le picking négatif (seuil 55% ET poids ≥ 7 kg) est une règle métier
|
||||
custom — les deux conditions sont cumulatives (réu. 11/05/2026).
|
||||
|
||||
⚠️ L'ordonnancement espèce → quantité → poids est géré par EasyWMS
|
||||
(pas un choix opérateur).
|
||||
|
||||
⚠️ Le message MOV est **ANNULÉ** (décision réunion client).
|
||||
|
||||
⚠️ Le verrou HORS TOLERANCE déclenche un recomptage mais ne casse pas
|
||||
l'assignation si le stock restant est suffisant.
|
||||
|
||||
⚠️ L'algorithme de répartition TP est le « gros morceau » custom du
|
||||
picking — gestion combinatoire de tous les cas.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [x] ~~Programme de filmage exact~~ → 8 programmes documentés (A→H)
|
||||
- [ ] Gestion du picking négatif dans l'interface opérateur (@Nicolas)
|
||||
- [x] ~~Process sans picking négatif — seuil à 70% au lieu de 50%~~ →
|
||||
Tranché : seuil paramétrable par article (défaut 55%) + condition
|
||||
poids ≥ 7 kg (réu. 11/05/2026)
|
||||
- [x] ~~Traitement commercial — séparation palette~~ → Supprimé
|
||||
(`CONTROLE_TRAITEMENT_COMMERCIAL = false`, réu. 11/05/2026)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-05 | Arthur | Gerbabilité/stack, algo répartition TP, verrou HORS TOLERANCE, MOV annulé, arrivée palettes 3 TP, filmage CstData |
|
||||
| 2026-05-12 | Arthur | Ajout ordonnancement PS→PK (LIM-82) : priorité picking négatif, cadencement buffers, cas d'exemple, lien séquençage TK→PS |
|
||||
| 2026-05-12 | Arthur | MAJ réunion 11/05 : picking négatif 2 conditions cumulatives (55% + 7 kg), TC supprimé, pro rata Bag/pal, poids max 1 250 kg, questions fermées |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| Expédition - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| [LIM-82](https://easywmsfrance.atlassian.net/browse/LIM-82) | Ticket Jira (ordonnancement PS→PK) | 2026 |
|
||||
| REU PICKING SEQUENCAGE 11-05-2026 | CR réunion + analyse comparative | 11/05/2026 |
|
||||
@@ -0,0 +1,323 @@
|
||||
---
|
||||
title: "Placement des palettes PS → PK (choix de table)"
|
||||
tags: [picking, placement, table, buffer, ping-pong, algorithme]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: []
|
||||
confluence_refs: []
|
||||
sources: ["Logique combinatoire picking - PS vers PK - V1.0.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Placement des palettes PS → PK (choix de table)
|
||||
|
||||
> **Résumé** : algorithme exécuté par le WMS lorsqu'une palette source
|
||||
> arrive au poste de sortie (PS). Il décide sur quelle table du PK la
|
||||
> poser, ou la redirige vers un buffer ES. Ce process s'exécute **en
|
||||
> aval** du [séquençage TK → PS](sequencage-tk-ps.md) : les palettes
|
||||
> arrivent au PS déjà triées.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chaque PK dispose de **3 tables** soumises à une contrainte d'adjacence
|
||||
stricte :
|
||||
|
||||
```
|
||||
TABLE_GAUCHE ←→ TABLE_CENTRE ←→ TABLE_DROITE
|
||||
✅ adjacentes ✅ adjacentes
|
||||
|
||||
TABLE_GAUCHE ←————————————————→ TABLE_DROITE
|
||||
❌ INTERDIT
|
||||
```
|
||||
|
||||
Règles de mouvement :
|
||||
|
||||
- Le stock est **toujours sur une palette**, jamais posé directement sur
|
||||
la table
|
||||
- L'opérateur peut déplacer du **stock** (sacs, colis) d'une palette à
|
||||
une autre **uniquement entre deux tables adjacentes**
|
||||
- Il est **interdit de déplacer une palette d'une table à une autre** —
|
||||
seul l'AGV peut déplacer une palette (arrivée, évacuation, recentrage)
|
||||
- **TABLE_CENTRE** est le pivot : seule table adjacente aux deux autres
|
||||
|
||||
## Déclenchement
|
||||
|
||||
L'algorithme est appelé **à chaque arrivée physique d'une palette au
|
||||
PS**. Le PS interroge le WMS qui retourne une réponse parmi :
|
||||
|
||||
- **TABLE_GAUCHE**, **TABLE_CENTRE** ou **TABLE_DROITE** → la palette
|
||||
est envoyée sur cette table
|
||||
- **Buffer ESx** → aucune table n'est disponible, la palette est
|
||||
redirigée vers un emplacement buffer
|
||||
- **Attente** → ni table ni buffer disponible, la palette reste au PS
|
||||
|
||||
## Entrées de l'algorithme
|
||||
|
||||
| Donnée | Source |
|
||||
|--------|--------|
|
||||
| Tâche courante : palette source, article, quantité, type de picking (NÉGATIF / DIRECT), `Line.CstAtt` (séquence) | Tâche associée à la palette |
|
||||
| État des 3 tables du PK : VIDE, PALETTE_FILLE_ACTIVE, PALETTE_FILLE_EN_ATTENTE, PALETTE_SOURCE_EN_PICKING, PALETTE_SOURCE_EN_ATTENTE, EN_ATTENTE_EVACUATION | État temps réel du PK |
|
||||
| Tâches suivantes de l'OS (triées par `Line.CstAtt` croissant) | OS en base |
|
||||
| Buffers ES disponibles : parmi ES1–ES16, ceux non occupés ni ciblés | État temps réel des buffers |
|
||||
| Nombre de buffers déjà affectés à ce PK vs `MAX_PRELOAD_PAR_PK` (défaut : 3) | Compteur par PK |
|
||||
|
||||
## Décision niveau 1 : table du PK ou buffer ?
|
||||
|
||||
```
|
||||
FONCTION décider_destination(palette, PK) :
|
||||
|
||||
table_cible ← choisir_table(palette, PK)
|
||||
|
||||
SI table_cible ≠ NULL :
|
||||
RETOURNER table_cible
|
||||
|
||||
// Aucune table disponible → tenter un buffer
|
||||
SI nb_buffers_affectés(PK) < MAX_PRELOAD_PAR_PK :
|
||||
buffer ← premier ES libre
|
||||
SI buffer existe :
|
||||
RETOURNER buffer
|
||||
|
||||
// Ni table ni buffer disponible
|
||||
RETOURNER ATTENTE
|
||||
```
|
||||
|
||||
## Décision niveau 2 : choix de la table
|
||||
|
||||
Le choix dépend du **type de picking** de la tâche associée.
|
||||
|
||||
### Cas PICKING_NÉGATIF
|
||||
|
||||
En picking négatif, la palette source arrive sur une table, l'opérateur
|
||||
retire l'excédent sur une palette posée sur une **table adjacente**,
|
||||
puis échange d'étiquettes. La palette a besoin de **2 tables** : une
|
||||
pour elle, une adjacente libre pour l'excédent.
|
||||
|
||||
```
|
||||
FONCTION choisir_table_picking_négatif(PK) :
|
||||
|
||||
// Priorité 1 : centre + un côté libre
|
||||
SI TABLE_CENTRE == VIDE ET (TABLE_GAUCHE == VIDE
|
||||
OU TABLE_DROITE == VIDE) :
|
||||
RETOURNER TABLE_CENTRE
|
||||
|
||||
// Priorité 2 : côté + centre libre
|
||||
SI (TABLE_GAUCHE == VIDE OU TABLE_DROITE == VIDE)
|
||||
ET TABLE_CENTRE == VIDE :
|
||||
RETOURNER côté vide
|
||||
|
||||
// Priorité 3 : centre libre + un côté libérable
|
||||
SI TABLE_CENTRE == VIDE ET un côté est libérable :
|
||||
évacuer(côté libérable)
|
||||
RETOURNER TABLE_CENTRE
|
||||
|
||||
// Priorité 4 : un côté libre + centre libérable
|
||||
SI un côté == VIDE ET TABLE_CENTRE est libérable :
|
||||
évacuer(TABLE_CENTRE)
|
||||
RETOURNER côté vide
|
||||
|
||||
// Dernier recours : évacuation forcée
|
||||
évacuer_table_prioritaire(PK)
|
||||
RETOURNER choisir_table_picking_négatif(PK) // rappel
|
||||
```
|
||||
|
||||
### Cas PICKING_DIRECT
|
||||
|
||||
La palette source doit être posée sur une table **adjacente à la
|
||||
palette fille active**. Le choix se fait en fonction de l'emplacement
|
||||
de la palette fille.
|
||||
|
||||
```
|
||||
FONCTION choisir_table_picking_direct(tâche, PK) :
|
||||
|
||||
// Étape 1 : localiser la palette fille compatible
|
||||
table_fille ← localiser_palette_fille(tâche, PK)
|
||||
|
||||
SI table_fille == NULL :
|
||||
table_fille ← choisir_table_nouvelle_palette_fille(PK)
|
||||
|
||||
// Étape 2 : choisir une table adjacente
|
||||
tables_adj ← tables_adjacentes(table_fille)
|
||||
|
||||
// Prio A : palette source déjà sur une adjacente
|
||||
// (multi-tâches même palette)
|
||||
POUR chaque t DANS tables_adj :
|
||||
SI t contient tâche.PALETTE_SOURCE :
|
||||
RETOURNER t
|
||||
|
||||
// Prio B : adjacente VIDE
|
||||
// Si 2 adjacentes libres (PF au centre) → ping-pong
|
||||
adjacentes_vides ← [t POUR t DANS tables_adj SI t == VIDE]
|
||||
SI len(adjacentes_vides) == 2 :
|
||||
RETOURNER choisir_côté_ping_pong(PK)
|
||||
SI len(adjacentes_vides) == 1 :
|
||||
RETOURNER adjacentes_vides[0]
|
||||
|
||||
// Prio C : adjacente en cours d'évacuation (AGV en route)
|
||||
POUR chaque t DANS tables_adj :
|
||||
SI t == EN_ATTENTE_EVACUATION :
|
||||
RETOURNER t
|
||||
|
||||
// Prio D : forcer l'évacuation d'une adjacente
|
||||
t_à_libérer ← choisir_table_à_évacuer(tables_adj)
|
||||
évacuer(t_à_libérer)
|
||||
RETOURNER t_à_libérer
|
||||
```
|
||||
|
||||
### Localisation de la palette fille compatible
|
||||
|
||||
```
|
||||
FONCTION localiser_palette_fille(tâche, PK) :
|
||||
|
||||
// Parmi les PF actives
|
||||
POUR chaque table :
|
||||
SI table.état == PALETTE_FILLE_ACTIVE :
|
||||
RETOURNER table
|
||||
// Note : CONTROLE_TRAITEMENT_COMMERCIAL = false,
|
||||
// donc pas de filtre TC
|
||||
|
||||
// Puis parmi les PF en attente
|
||||
POUR chaque table :
|
||||
SI table.état == PALETTE_FILLE_EN_ATTENTE :
|
||||
RETOURNER table
|
||||
|
||||
RETOURNER NULL
|
||||
```
|
||||
|
||||
### Choix de table pour une nouvelle palette fille
|
||||
|
||||
```
|
||||
FONCTION choisir_table_nouvelle_palette_fille(PK) :
|
||||
|
||||
// TABLE_CENTRE = pivot → maximise la flexibilité
|
||||
SI TABLE_CENTRE == VIDE : RETOURNER TABLE_CENTRE
|
||||
SI TABLE_GAUCHE == VIDE : RETOURNER TABLE_GAUCHE
|
||||
SI TABLE_DROITE == VIDE : RETOURNER TABLE_DROITE
|
||||
|
||||
// Aucune table vide → forcer une évacuation
|
||||
évacuer_table_prioritaire(PK)
|
||||
RETOURNER choisir_table_nouvelle_palette_fille(PK)
|
||||
```
|
||||
|
||||
## Optimisation ping-pong
|
||||
|
||||
Le ping-pong est l'optimisation principale pour le débit. Il n'est
|
||||
possible que lorsque la **palette fille est au centre** : les palettes
|
||||
sources alternent alors entre TABLE_GAUCHE et TABLE_DROITE, de sorte
|
||||
que la palette suivante est déjà en place quand l'opérateur termine.
|
||||
|
||||
```
|
||||
FONCTION choisir_côté_ping_pong(PK) :
|
||||
|
||||
SI TABLE_GAUCHE.état ∈ {PALETTE_SOURCE_EN_PICKING,
|
||||
PALETTE_SOURCE_EN_ATTENTE} :
|
||||
RETOURNER TABLE_DROITE
|
||||
|
||||
SI TABLE_DROITE.état ∈ {PALETTE_SOURCE_EN_PICKING,
|
||||
PALETTE_SOURCE_EN_ATTENTE} :
|
||||
RETOURNER TABLE_GAUCHE
|
||||
|
||||
// Aucun côté occupé → choix arbitraire
|
||||
RETOURNER TABLE_GAUCHE
|
||||
```
|
||||
|
||||
**Recentrage** : si la palette fille est sur un côté (issue d'un
|
||||
picking négatif), le ping-pong est impossible. Si le nombre de
|
||||
PICKING_DIRECT restants ≥ `SEUIL_RECENTRAGE_PF` (défaut : 3), le WMS
|
||||
peut déclencher un mouvement AGV pour recentrer la PF sur
|
||||
TABLE_CENTRE.
|
||||
|
||||
## Évacuation des tables — Priorité
|
||||
|
||||
Lorsqu'aucune table n'est libre et qu'il faut en libérer une :
|
||||
|
||||
```
|
||||
FONCTION évacuer_table_prioritaire(PK) :
|
||||
|
||||
// 1. Palette vide → retrait manuel (pas d'AGV)
|
||||
// 2. Table déjà en attente d'évacuation → attendre AGV
|
||||
// 3. Palette source en attente, non réutilisée par
|
||||
// la prochaine tâche → AGV vers buffer/ASRS
|
||||
// 4. Palette fille en attente → AGV vers image de quai
|
||||
// 5. Palette source en attente (même si réutilisée)
|
||||
// → AGV vers buffer ES
|
||||
```
|
||||
|
||||
## Gestion des buffers ES → PK
|
||||
|
||||
Quand une table se libère au PK, le WMS choisit parmi les palettes en
|
||||
buffer affectées à ce PK :
|
||||
|
||||
- Tri par `Line.CstAtt` **croissant** (plus petit = plus prioritaire)
|
||||
- La première palette compatible avec la table libérée est envoyée
|
||||
|
||||
**Règle critique** : l'ordre de sortie des buffers est dicté par
|
||||
`Line.CstAtt`, **pas** par l'ordre d'arrivée physique en buffer.
|
||||
|
||||
## Palettes multi-commandes
|
||||
|
||||
Une palette source peut être assignée à plusieurs OS.
|
||||
|
||||
Après picking de la commande en cours :
|
||||
|
||||
- Si la palette a encore des tâches pour d'autres OS → marquée
|
||||
`MULTI_COMMANDE`, envoyée vers un buffer ES libre
|
||||
- Elle reste en buffer jusqu'au lancement de l'OS suivant
|
||||
- Une palette multi-commande au PK ou en mouvement compte comme une
|
||||
place buffer occupée dans le calcul de `MAX_PRELOAD_PAR_PK`
|
||||
|
||||
## Priorité d'accès aux buffers entre PK
|
||||
|
||||
Lorsque les buffers ES sont saturés, la priorité est définie par la
|
||||
séquence du mode "Picking" dans `MODES_PKxx`
|
||||
(voir [Modes de travail PK](stations-picking.md)) :
|
||||
|
||||
- Séquence 1 = priorité la plus haute
|
||||
- Quand un buffer se libère → affecté en priorité au PK avec la
|
||||
séquence la plus basse parmi ceux qui ont des palettes en attente
|
||||
|
||||
## Paramètres WMS
|
||||
|
||||
| Paramètre | Description | Défaut |
|
||||
|-----------|-------------|--------|
|
||||
| `MAX_PRELOAD_PAR_PK` | Nombre max de palettes pré-chargées en buffer ES par PK | 3 |
|
||||
| `SEUIL_RECENTRAGE_PF` | Nombre min de PICKING_DIRECT restants pour recentrer la PF au centre | 3 |
|
||||
| `CONTROLE_TRAITEMENT_COMMERCIAL` | Séparer ou non les articles par TC sur les palettes filles | `false` (V1.1) |
|
||||
| `MODES_PKxx` | Modes autorisés + priorité par PK (LIM-69) | — |
|
||||
| `PK_BIGBAG` | Autorise ou non les big-bags par PK (LIM-70) | — |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ La contrainte d'adjacence est **physique** : l'opérateur ne peut pas
|
||||
déplacer de sacs entre TABLE_GAUCHE et TABLE_DROITE directement.
|
||||
|
||||
⚠️ Le picking négatif nécessite 2 tables (palette source + adjacente
|
||||
pour l'excédent), ce qui complique la gestion des cas saturés.
|
||||
|
||||
⚠️ Le recentrage de la palette fille (AGV) n'est déclenché que si
|
||||
suffisamment de tâches de picking direct restent (≥ SEUIL_RECENTRAGE_PF).
|
||||
|
||||
⚠️ L'ordre de sortie des buffers suit `Line.CstAtt`, pas l'ordre FIFO
|
||||
d'entrée en buffer.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
(Aucune identifiée — algorithme V1.0 complet)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création depuis spec "Logique combinatoire picking - PS vers PK - V1.0" |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| Logique combinatoire picking - PS vers PK - V1.0 | Spécification technique | 27/04/2026 |
|
||||
| [LIM-69](https://easywmsfrance.atlassian.net/browse/LIM-69) | Ticket Jira (modes PK) | 2026 |
|
||||
| [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) | Ticket Jira (Mega Job) | 2026 |
|
||||
@@ -0,0 +1,471 @@
|
||||
---
|
||||
title: "Séquençage des tâches de picking TK → PS"
|
||||
tags: [picking, séquençage, transstockeur, événement, workflow, algorithme]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-84, LIM-61]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-84 LOT2.2 [PICKING] Séquençage des tâches de picking TK PS.md", "Logique combinatoire picking - TK vers PS - V1.1.md", "REU PICKING SEQUENCAGE 11-05-2026 - Analyse comparative notes + AF + devops.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Séquençage des tâches de picking TK → PS
|
||||
|
||||
> **Résumé** : algorithme événementiel qui ordonne les tâches de picking
|
||||
> depuis les transstockeurs (TK) vers les postes de sortie (PS). Il
|
||||
> écrit les numéros de séquence `Line.CstAtt` sur chaque tâche et
|
||||
> contrôle le flag `OS.CstAtt` pour autoriser le stacker_crane.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le séquençage TK → PS est critique pour garantir que les palettes
|
||||
arrivent aux postes de picking dans le bon ordre. L'algorithme
|
||||
s'exécute **en amont** de l'algorithme de
|
||||
[placement PS → PK](placement-ps-pk.md) : les palettes arrivent au PS
|
||||
**déjà triées**.
|
||||
|
||||
Quatre solutions ont été envisagées avant de retenir une approche
|
||||
événementielle (solution 4).
|
||||
|
||||
## Historique des solutions envisagées
|
||||
|
||||
### Solution 1 — Process isolé sur finalisation des tâches d'OS
|
||||
|
||||
Déclenchement à la finalisation de la création des tâches d'un OS.
|
||||
Séquençage via `OS.Line.CstAtt`, marquage OS traité via
|
||||
`OS.CstAtt = true`.
|
||||
|
||||
**Problème** : pas assez dynamique en cas de recréation de tâches suite
|
||||
à des imprévus dans le WMS.
|
||||
|
||||
### Solution 2 — Calcul dans le workflow stacker_crane
|
||||
|
||||
Intégration du tri directement dans les WF
|
||||
`Galileo_StackerCraneSearch_PR` / `StackerCrane_SortTasks_PR`, avec
|
||||
recalcul complet du pool de tâches à chaque exécution. Supprimerait le
|
||||
besoin de `OS.Line.CstAtt` et `OS.CstAtt`.
|
||||
|
||||
**Problème** : complexité élevée (requêtes LINQ imbriquées sur les
|
||||
tâches multi-OS).
|
||||
|
||||
### Solution 3 — Solution 1 transformée en job
|
||||
|
||||
Reprise du process de la solution 1 sous forme de job planifié, en
|
||||
excluant les tâches de picking en cours.
|
||||
|
||||
**Problème** : pas assez réactif par rapport à la cadence de recherche
|
||||
d'ordre des TK.
|
||||
|
||||
### Solution 4 — Process événementiel (retenue)
|
||||
|
||||
Reprise de la solution 1 déclenchée sur deux événements, avec
|
||||
mécanisme de verrouillage `OS.CstAtt` pour bloquer le stacker_crane
|
||||
pendant le séquençage.
|
||||
|
||||
**Avantages** : simple à développer, isolée et découplée du reste,
|
||||
flexible et réactive.
|
||||
|
||||
## Changelog V1.1 (11/05/2026)
|
||||
|
||||
Modifications issues de la réunion Arthur + Justine (Mecalux) — Olivier
|
||||
(Limagrain), croisées avec l'AF §6.4.8 et le DevOps #64854 :
|
||||
|
||||
- **Hiérarchie des règles** : nouvel ordre de priorité validé.
|
||||
La complétude palette et l'anti-split de lignes de stock sont des
|
||||
contraintes amont prioritaires sur les règles de tri
|
||||
- **Picking négatif** : ajout condition cumulative poids ≥ 7 kg
|
||||
- **Traitement commercial** : critère de regroupement par TC
|
||||
**supprimé** (`CONTROLE_TRAITEMENT_COMMERCIAL = false`). Pas de bio
|
||||
sur cet entrepôt
|
||||
- **Calcul de remplissage** : méthode pro rata Bag/pal validée,
|
||||
remplace la logique DevOps "Bag/pal max"
|
||||
- **Poids max palette** : 1 250 kg (l'AF fait foi, corrige les 1 200 kg
|
||||
du DevOps)
|
||||
- **Règles confirmées** : mélange d'espèces OK, pas de gerbage,
|
||||
hauteur max 1,90 m, séparateurs inter-lots hors WMS
|
||||
|
||||
> Voir la section [Arbitrage des contradictions](#arbitrage-des-contradictions-reu-11052026)
|
||||
> pour le détail des décisions.
|
||||
|
||||
## Déclenchement
|
||||
|
||||
L'algorithme est déclenché sur **deux événements** :
|
||||
|
||||
### TaskCreatedEvent
|
||||
|
||||
Une nouvelle tâche de picking vient d'être créée (par le MINI JOB
|
||||
Picking LIM-75, ou suite à une réassignation de stock).
|
||||
|
||||
```
|
||||
SI événement.type == TaskCreatedEvent :
|
||||
SI tâche.type == PICKING ET tâche.OS.statut == Released :
|
||||
traiter_séquençage(tâche.OS)
|
||||
```
|
||||
|
||||
### OutboundOrderReleasedEvent
|
||||
|
||||
Un OS passe au statut Released (première mise en service ou relance
|
||||
après un arrêt).
|
||||
|
||||
```
|
||||
SI événement.type == OutboundOrderReleasedEvent :
|
||||
traiter_séquençage(OS)
|
||||
```
|
||||
|
||||
## Process principal
|
||||
|
||||
```
|
||||
FONCTION traiter_séquençage(OS) :
|
||||
|
||||
// ─── Étape 1 : verrouiller l'OS ───
|
||||
OS.CstAtt ← false
|
||||
|
||||
// ─── Étape 2 : récupérer les tâches ───
|
||||
toutes_tâches ← récupérer_tâches_picking(OS)
|
||||
|
||||
// ─── Étape 3 : filtrer ───
|
||||
tâches_à_séquencer ← [t POUR t DANS toutes_tâches
|
||||
SI t.statut == EN_ATTENTE]
|
||||
|
||||
SI tâches_à_séquencer est vide :
|
||||
OS.CstAtt ← true
|
||||
RETOURNER
|
||||
|
||||
// ─── Étape 4 : trier ───
|
||||
tâches_triées ← trier_tâches(tâches_à_séquencer)
|
||||
|
||||
// ─── Étape 5 : écrire les séquences ───
|
||||
écrire_séquences(tâches_triées)
|
||||
|
||||
// ─── Étape 6 : libérer l'OS ───
|
||||
OS.CstAtt ← true
|
||||
```
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant EVT as Événement (TaskCreated / OS Released)
|
||||
participant SEQ as Process séquençage
|
||||
participant SC as Stacker Crane
|
||||
EVT->>SEQ: Déclenche
|
||||
SEQ->>SEQ: OS.CstAtt = false
|
||||
Note over SC: Bloqué — ne prend pas<br/>de tâche de cet OS
|
||||
SEQ->>SEQ: Récupère tâches en attente
|
||||
SEQ->>SEQ: Applique tri + écrit séquences
|
||||
SEQ->>SEQ: OS.CstAtt = true
|
||||
Note over SC: Débloqué — reprend<br/>les tâches séquencées
|
||||
```
|
||||
|
||||
## Contraintes amont (constitution des palettes filles)
|
||||
|
||||
Ces contraintes orientent le regroupement des lignes sur les palettes
|
||||
filles **avant** le tri. L'algorithme de séquençage doit les respecter :
|
||||
l'ordre de sortie doit être compatible avec la constitution de palettes
|
||||
conformes à ces règles.
|
||||
|
||||
### C1. Palettes les plus complètes possible
|
||||
|
||||
Objectif premier — optimisation transport. Seuil de remplissage ~95%.
|
||||
|
||||
**Calcul : pro rata Bag/pal.** Chaque sac consomme `1/Bag_pal` de son
|
||||
lot. Le calcul est additif et gère nativement des lots avec des Bag/pal
|
||||
différents sur une même palette.
|
||||
|
||||
```
|
||||
Exemple :
|
||||
16 sacs d'un lot Bag/pal 20 + 7 sacs d'un lot Bag/pal 50
|
||||
= 16/20 + 7/50
|
||||
= 0,80 + 0,14
|
||||
= 94%
|
||||
```
|
||||
|
||||
Regrouper les lots de même Bag/pal sur une même palette fille facilite
|
||||
la complétude.
|
||||
|
||||
> Cette méthode remplace la logique DevOps #64854 de "prendre le
|
||||
> Bag/pal max entre lots". Le pro rata est plus précis et ne nécessite
|
||||
> pas de Bag/pal de référence unique.
|
||||
|
||||
### C2. Ne pas splitter les lignes de stock
|
||||
|
||||
Éviter de répartir les sacs d'une même ligne de stock sur plusieurs
|
||||
palettes. **Prioritaire sur les règles de tri** : si respecter
|
||||
"Maïs first" implique de splitter une ligne, on regroupe la ligne
|
||||
complète quitte à décaler le maïs.
|
||||
|
||||
### Autres contraintes palette
|
||||
|
||||
| Contrainte | Valeur | Source |
|
||||
|------------|--------|--------|
|
||||
| Poids max palette | **1 250 kg** | AF (corrige 1 200 kg du DevOps) |
|
||||
| Hauteur max palette | 1,90 m | AF — rejet au PIE si dépassement |
|
||||
| Gerbage | Interdit | — |
|
||||
| Mélange d'espèces | Autorisé sur une même palette fille | — |
|
||||
| Différenciation de marque | Aucune dans une même expédition | — |
|
||||
| Séparateurs (intercalaires) | Règle opérateur, hors WMS | — |
|
||||
|
||||
## Règles de tri (séquençage des sorties ASRS)
|
||||
|
||||
Les tâches de picking d'un même OS sont triées selon les critères
|
||||
suivants, **par ordre de priorité décroissante** :
|
||||
|
||||
### Critère 1 — Picking négatif en premier
|
||||
|
||||
Les tâches de type PICKING_NÉGATIF passent **avant** les tâches de type
|
||||
PICKING_DIRECT. Prioritaire sur toutes les règles suivantes, y compris
|
||||
Maïs first : si une tâche négatif concerne du tournesol, elle passe
|
||||
avant une tâche maïs classique.
|
||||
|
||||
Condition cumulative pour la détermination NÉGATIF / DIRECT (cf.
|
||||
[détermination picking négatif](#détermination-picking-négatif)) :
|
||||
pourcentage quantité > seuil fiche article (défaut 55%) **ET** poids
|
||||
unitaire sac ≥ 7 kg. En dessous de 7 kg, pas de picking négatif.
|
||||
|
||||
```
|
||||
tri_1(tâche) → 0 si PICKING_NÉGATIF, 1 si PICKING_DIRECT
|
||||
```
|
||||
|
||||
### Critère 2 — Espèce Maïs en premier
|
||||
|
||||
Les tâches portant sur l'espèce **Maïs** passent avant les autres
|
||||
espèces. Le maïs est lourd/stable, il constitue la base de la palette
|
||||
fille.
|
||||
|
||||
```
|
||||
tri_2(tâche) → 0 si espèce == MAÏS, 1 sinon
|
||||
```
|
||||
|
||||
### ~~Critère 3 (V1.0) — Traitement commercial~~ SUPPRIMÉ V1.1
|
||||
|
||||
`CONTROLE_TRAITEMENT_COMMERCIAL = false`. L'entrepôt ne fait pas de
|
||||
bio. Paramètre réactivable si besoin futur.
|
||||
|
||||
### Critère 3 — Espèce la plus volumineuse
|
||||
|
||||
Les tâches sont regroupées par espèce, et l'espèce ayant la **plus
|
||||
grande quantité totale de sacs** dans l'OS passe en premier. Commencer
|
||||
par l'espèce la plus volumineuse permet de constituer rapidement la
|
||||
base de la palette fille.
|
||||
|
||||
```
|
||||
tri_3(tâche) → -quantité_totale_espèce(tâche.espèce, OS)
|
||||
```
|
||||
|
||||
### Critère 4 — Article/lot le plus lourd en base
|
||||
|
||||
À espèce égale, les tâches portant sur les articles/lots **les plus
|
||||
lourds** passent en premier. Corollaire : les semences essais, très
|
||||
légères, se retrouvent naturellement en haut de palette.
|
||||
|
||||
```
|
||||
tri_4(tâche) → -tâche.article.poids
|
||||
```
|
||||
|
||||
### Critère 5 — Regroupement par palette source
|
||||
|
||||
Toutes les tâches portant sur la **même palette source** sont
|
||||
consécutives. L'opérateur enchaîne toutes les tâches d'une palette
|
||||
source avant de la libérer.
|
||||
|
||||
```
|
||||
tri_5(tâche) → tâche.PALETTE_SOURCE.identifiant
|
||||
```
|
||||
|
||||
### Récapitulatif du tri multi-critères (V1.1)
|
||||
|
||||
```
|
||||
FONCTION trier_tâches(tâches) :
|
||||
|
||||
RETOURNER tâches.trier_par(
|
||||
(1) type_picking ASC // NÉGATIF (0) avant DIRECT (1)
|
||||
(2) espèce_maïs ASC // MAÏS (0) avant autres (1)
|
||||
(3) quantité_espèce DESC // espèce la + volumineuse
|
||||
(4) poids_article DESC // article le + lourd
|
||||
(5) palette_source // regroupement par palette
|
||||
)
|
||||
```
|
||||
|
||||
## Écriture des séquences (Line.CstAtt)
|
||||
|
||||
### Règle des ex-aequo
|
||||
|
||||
Quand deux tâches consécutives sont **interchangeables** (l'ordre entre
|
||||
elles n'a aucun impact fonctionnel), elles reçoivent le **même numéro
|
||||
de séquence**. Cela laisse de la flexibilité au stacker_crane pour
|
||||
optimiser son débit.
|
||||
|
||||
### Critères d'interchangeabilité
|
||||
|
||||
Deux tâches A et B sont interchangeables si :
|
||||
|
||||
- Elles portent sur la **même palette source**, **OU**
|
||||
- Elles portent sur des **palettes sources différentes** mais tous les
|
||||
critères de tri sont identiques : même type de picking, même espèce,
|
||||
même quantité espèce, même poids article
|
||||
|
||||
### Algorithme d'écriture
|
||||
|
||||
```
|
||||
FONCTION écrire_séquences(tâches_triées) :
|
||||
|
||||
séquence_actuelle ← max(Line.CstAtt des tâches en cours) + 1
|
||||
SI aucune tâche en cours :
|
||||
séquence_actuelle ← 1
|
||||
|
||||
POUR i DE 0 À len(tâches_triées) - 1 :
|
||||
tâche ← tâches_triées[i]
|
||||
tâche.Line.CstAtt ← séquence_actuelle
|
||||
|
||||
SI i < len(tâches_triées) - 1 :
|
||||
tâche_suivante ← tâches_triées[i + 1]
|
||||
SI interchangeables(tâche, tâche_suivante) :
|
||||
CONTINUER
|
||||
SINON :
|
||||
séquence_actuelle ← séquence_actuelle + 1
|
||||
```
|
||||
|
||||
### Exemple
|
||||
|
||||
```
|
||||
Commande avec 5 tâches, après tri :
|
||||
|
||||
Tâche 1 : Palette A, Maïs, 500kg → séq 1
|
||||
Tâche 2 : Palette B, Maïs, 500kg → séq 1 (interchangeable)
|
||||
Tâche 3 : Palette C, Maïs, 500kg → séq 1 (interchangeable)
|
||||
Tâche 4 : Palette D, Blé, 300kg → séq 2 (espèce différente)
|
||||
Tâche 5 : Palette E, Blé, 300kg → séq 2 (interchangeable)
|
||||
|
||||
Résultat Line.CstAtt : [1, 1, 1, 2, 2]
|
||||
|
||||
Le stacker_crane peut sortir A, B, C dans n'importe quel ordre,
|
||||
puis D ou E dans n'importe quel ordre.
|
||||
```
|
||||
|
||||
## Comportement du stacker_crane après séquençage
|
||||
|
||||
Le stacker_crane **ignore** les tâches dont `OS.CstAtt == false`,
|
||||
consomme celles dont `OS.CstAtt == true` par `Line.CstAtt` croissant,
|
||||
et entre tâches à séquence égale il optimise librement (proximité ASRS,
|
||||
charge TK). Il crée les tâches de mouvement TK → PS.
|
||||
|
||||
Les palettes arrivent ensuite au PS, où l'algorithme de
|
||||
[placement PS → PK](placement-ps-pk.md) décide sur quelle table les
|
||||
poser.
|
||||
|
||||
## Détermination picking négatif
|
||||
|
||||
Le type de picking (NÉGATIF ou DIRECT) est déterminé **par tâche** au
|
||||
moment de la création des tâches par le MINI JOB Picking (LIM-75) :
|
||||
|
||||
```
|
||||
SI quantité_à_prélever > seuil_article × quantité_palette_source
|
||||
ET article unique dans la palette source
|
||||
ET pas d'attribut logistique à capturer
|
||||
ET poids_unitaire_sac ≥ 7 kg
|
||||
ALORS → PICKING_NÉGATIF
|
||||
SINON → PICKING_DIRECT
|
||||
```
|
||||
|
||||
Le seuil % reste paramétrable par fiche article (champ "Complete
|
||||
quantity percent excess for negative picking", défaut : 55%).
|
||||
|
||||
La détermination se fait **en amont** (MINI JOB Picking, LIM-75), avant
|
||||
l'algorithme de séquençage. L'algorithme de séquençage lit ce type mais
|
||||
ne le calcule pas.
|
||||
|
||||
## Cas particuliers
|
||||
|
||||
### Recalcul suite à une nouvelle tâche (réassignation de stock)
|
||||
|
||||
Si une tâche est créée après que l'OS a déjà été séquencé, le
|
||||
`TaskCreatedEvent` déclenche un recalcul : verrouillage, re-tri des
|
||||
tâches en attente uniquement (en commençant après le dernier numéro des
|
||||
tâches en cours), puis libération.
|
||||
|
||||
### Relance d'un OS arrêté
|
||||
|
||||
Si un OS est arrêté puis relancé (`OutboundOrderReleasedEvent`), le
|
||||
même process s'applique. Les tâches en cours conservent leur séquence,
|
||||
les tâches en attente sont re-séquencées.
|
||||
|
||||
## Arbitrage des contradictions (réu. 11/05/2026)
|
||||
|
||||
Analyse comparative de 3 sources (DevOps #64854, AF §6.4.8, réunion
|
||||
11/05/2026 Arthur + Justine + Olivier). **Tous les points sont résolus.**
|
||||
|
||||
| Sujet | DevOps | AF | Réunion (fait foi) |
|
||||
|-------|--------|----|--------------------|
|
||||
| Traitement commercial | À creuser | Séparation stricte | **Supprimé** (`CONTROLE_TRAITEMENT_COMMERCIAL = false`) |
|
||||
| Seuil picking négatif | Pas de seuil explicite | > 50% | **Deux conditions cumulatives** : % seuil fiche article (défaut 55%) ET poids sac ≥ 7 kg |
|
||||
| Poids max palette | 1 200 kg | 1 250 kg | **1 250 kg** (AF fait foi) |
|
||||
| Picking négatif vs Maïs first | Pas de hiérarchie | Maïs en tête, négatif séparé | **Picking négatif prioritaire** (confirmé Olivier) |
|
||||
| Semences essais en haut | Oui (dédié) | Non mentionné | **Couvert par règle du plus lourd en base** (essais = légères → haut) |
|
||||
| Lots même Bag/pal | Prioriser regroupement | — | **Retenu** (WF palettes complètes) |
|
||||
| Différenciation marque | Aucune | — | **Confirmé** |
|
||||
| Calcul Bag/pal multi-lots | "Prendre le Bag/pal max" | Équivalent palette | **Pro rata** (chaque sac = 1/Bag_pal de son lot) |
|
||||
|
||||
## Paramètres WMS
|
||||
|
||||
| Paramètre | Description | Défaut | Statut V1.1 |
|
||||
|-----------|-------------|--------|-------------|
|
||||
| `CONTROLE_TRAITEMENT_COMMERCIAL` | Regroupement par TC dans le tri | ~~true~~ | **false** — désactivé |
|
||||
| Seuil picking négatif (fiche article) | "Complete quantity percent excess for negative picking" | 55% | Inchangé |
|
||||
| Poids min picking négatif | Poids unitaire sac minimum pour autoriser le picking négatif | **7 kg** | **Nouveau V1.1** |
|
||||
| Seuil remplissage palette | Taux cible remplissage palette fille | **~95%** | **Nouveau V1.1** |
|
||||
| Poids max palette | Poids maximum palette fille | **1 250 kg** | Corrigé (était 1 200 kg) |
|
||||
| `OS.CstAtt` | Flag verrouillage OS pendant séquençage (true = stacker_crane autorisé) | true | Inchangé |
|
||||
| `MAX_NB_BUFFER_PK` | Nombre de buffers disponibles par PK | 3 | Inchangé |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le custom LIM-61 (vérification capacité buffer) doit être modifié
|
||||
pour prendre en compte les palettes multi-PK.
|
||||
|
||||
⚠️ Le verrouillage `OS.CstAtt` est temporaire (durée du séquençage) —
|
||||
en cas d'erreur du process, l'OS risque de rester bloqué.
|
||||
|
||||
⚠️ Les tâches **en cours** sont exclues du séquençage — seules les
|
||||
tâches en attente sont réordonnées.
|
||||
|
||||
⚠️ La condition poids ≥ 7 kg pour le picking négatif est ajoutée pour
|
||||
éviter l'instabilité palette (gros sacs ramenés sur petits sacs).
|
||||
|
||||
## Points non traités (hors scope)
|
||||
|
||||
- Affichage opérateur au PK (combien de sacs ajouter, possibilité de
|
||||
dévier de la consigne) — à traiter une fois les fondations posées
|
||||
- Picking négatif < 7 kg en option (avantage opérationnel sans
|
||||
obligation) — nécessite discussion élargie
|
||||
- Messagerie carton (moins prioritaire, navette du lendemain, zone
|
||||
angle Est) — en attente de précisions
|
||||
- Verrou réception → recomptage avant picking (mentionné dans l'AF
|
||||
uniquement, non reconfirmé)
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Comportement en cas d'erreur du process de séquençage — OS reste
|
||||
bloqué avec CstAtt = false ? (@Nicolas)
|
||||
- [ ] Impact sur les performances si beaucoup d'OS sont Released
|
||||
simultanément — risque de contention sur les événements ? (@Fabien)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-84 |
|
||||
| 2026-05-12 | Arthur | Refonte complète : intégration spec V1.1 (algo complet, contraintes amont, 5 critères tri, écriture séquences, ex-aequo, cas particuliers) + arbitrage contradictions réunion 11/05/2026 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-84](https://easywmsfrance.atlassian.net/browse/LIM-84) | Ticket Jira | 2026 |
|
||||
| [LIM-61](https://easywmsfrance.atlassian.net/browse/LIM-61) | Ticket Jira (custom capacité buffer) | 2026 |
|
||||
| Logique combinatoire picking - TK vers PS - V1.1 | Spécification technique | 11/05/2026 |
|
||||
| REU PICKING SEQUENCAGE 11-05-2026 | CR réunion + analyse comparative | 11/05/2026 |
|
||||
| DevOps #64854 | Note historique | — |
|
||||
| AF §6.4.8 | Analyse fonctionnelle V1.5 | 28/11/2025 |
|
||||
@@ -0,0 +1,301 @@
|
||||
---
|
||||
title: "Stations et postes de travail Limagrain"
|
||||
tags: [picking, stations, postes, ilots, buffer]
|
||||
status: draft
|
||||
standard_ref: concepts/stations.md
|
||||
jira_refs: [LIM-69, LIM-70]
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Réception - LIMAGRAIN - DEV - Confluence.md", "Expédition - LIMAGRAIN - DEV - Confluence.md", "LIM-69 - LOT1.3 Modes de travail des PK.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Stations et postes de travail Limagrain
|
||||
|
||||
> **Résumé** : description des stations de l'entrepôt automatique, des
|
||||
> postes de travail polyvalents (3 îlots × 2 postes) et des buffers associés.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Stations & Routes](../../concepts/stations.md),
|
||||
> [Mechanical Elements](../../concepts/mechanical-elements.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, les postes de travail sont **polyvalents** et multi-processus.
|
||||
L'ensemble des opérations (réception, picking, regroupement, échantillonnage,
|
||||
re-certification) se fait sur les mêmes postes physiques, configurables
|
||||
dynamiquement.
|
||||
|
||||
## Cartographie des stations
|
||||
|
||||
### Zone entrée production / sortie expéditions
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| PIE_01 | Poste d'identification 01 (côté quais) |
|
||||
| NAV_01 | Navette 01 |
|
||||
|
||||
### Zone entrée/sortie postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| PIE_02 | Poste d'identification 02 |
|
||||
| PIE_03 | Poste d'identification 03 |
|
||||
| REAC_01 | Poste de reconditionnement 01 |
|
||||
| NAV_02 | Navette 02 |
|
||||
| ET_21, ET_22 | Tables intermédiaires |
|
||||
|
||||
### Zone stockage côté postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| ET_23 à ET_28 | Tables intermédiaires 23 à 28 |
|
||||
| TE_01 à TE_04 | Tables d'entrée 01 à 04 |
|
||||
| TS_01 à TS_04 | Tables de sortie 01 à 04 |
|
||||
|
||||
### Zone stockage côté quais
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| ET_11 à ET_15 | Tables intermédiaires 11 à 15 |
|
||||
| TE/TS_01 à TE/TS_04 | Tables mixtes entrée/sortie 01 à 04 |
|
||||
|
||||
### Zone postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| P1 à P6 | Postes de travail 01 à 06 |
|
||||
| TP11 à TP63 | Tables de préparation 11 à 63 |
|
||||
|
||||
## Postes de travail — Architecture physique
|
||||
|
||||
### 3 îlots de 2 postes
|
||||
|
||||
Physiquement, il y a **3 îlots**, chacun composé de **6 tables de préparation
|
||||
(TP)**. Chaque îlot peut être configuré de 2 façons :
|
||||
|
||||
1. **Mode scindé** : 2 postes individuels × 3 TP chacun (mode par défaut)
|
||||
2. ~~**Mode global** : 1 poste × 6 TP (mode « esclave »)~~ **ABANDONNÉ**
|
||||
|
||||
> **MISE À JOUR** : le mode esclave (6 TP) est abandonné au profit d'un
|
||||
> simple **message d'avertissement**. Si le poste adjacent est déjà
|
||||
> ouvert → « Attention, le poste PVx est déjà ouvert. Voulez-vous quand
|
||||
> même ouvrir ? ». L'opérateur peut confirmer ou annuler. Pas de blocage
|
||||
> technique, juste un avertissement.
|
||||
>
|
||||
> **Justification** : les opérateurs sont physiquement à ~2 mètres l'un
|
||||
> de l'autre et peuvent se coordonner verbalement. Les AGV ont des
|
||||
> capteurs de sécurité et demandent l'autorisation de dépose. Trop de cas
|
||||
> complexes à gérer avec un mode esclave custom. L'AGV amène toujours la
|
||||
> palette au centre du PV actif.
|
||||
>
|
||||
> **Développement** : message d'avertissement à l'ouverture du poste,
|
||||
> vérification si le poste conjoint est déjà ouvert (via support présent
|
||||
> ou poste en mode réception), workflow action sur le end process pour
|
||||
> fermer le poste.
|
||||
|
||||
### Numérotation
|
||||
|
||||
```
|
||||
Îlot 1 : P1 (TP11, TP12, TP13) | P2 (TP21, TP22, TP23)
|
||||
Îlot 2 : P3 (TP31, TP32, TP33) | P4 (TP41, TP42, TP43)
|
||||
Îlot 3 : P5 (TP51, TP52, TP53) | P6 (TP61, TP62, TP63)
|
||||
```
|
||||
|
||||
### Spécificités P5 & P6
|
||||
|
||||
Les postes **P5 et P6** sont équipés d'un **palan** pour la manipulation
|
||||
de big-bags. Toute opération impliquant un big-bag (bag/pal ≤ 2) doit
|
||||
être traitée sur P5 ou P6.
|
||||
|
||||
**Picking** : WS PK picking rob en priorité, process RF comme fallback
|
||||
(plus robuste pour picking négatif, multi-tables). Le process de réception
|
||||
est déjà plugué au mode Automatic tasks (custom) → même mode pour le
|
||||
picking et la recertification.
|
||||
|
||||
Voir [Flux expédition — Préparation](../04-outbound/flux-expedition.md#6-préparation-au-poste-de-travail)
|
||||
pour les règles détaillées (arrivée palettes 3 TP, algorithme répartition,
|
||||
ordonnancement par gerbabilité).
|
||||
|
||||
### Modes de travail — Configuration et fonctionnement
|
||||
|
||||
Chaque poste est **polyvalent** et peut être utilisé pour différents flux.
|
||||
Le manager configure les modes autorisés et leur priorité ; l'opérateur
|
||||
ouvre le poste et le WMS gère automatiquement le process en fonction de
|
||||
la palette qui arrive.
|
||||
|
||||
#### Modes disponibles
|
||||
|
||||
| Mode | Correspondance EasyWMS |
|
||||
|------|------------------------|
|
||||
| Picking | Picking |
|
||||
| Réception | Réception |
|
||||
| Regroupement | Consolidation |
|
||||
| Échantillonnage | Inventaire |
|
||||
| Re certification | Picking |
|
||||
|
||||
> ~~Mode esclave (3 ou 6 tables)~~ **ABANDONNÉ** — remplacé par un simple
|
||||
> message d'avertissement poste adjacent (voir section dédiée ci-dessous).
|
||||
|
||||
#### Configuration par le manager (vassist SmartUI)
|
||||
|
||||
Dans la vue des postes de travail, un **bouton d'action "Choix modes de
|
||||
travail"** est disponible à la sélection d'un ou plusieurs PK. Ce bouton
|
||||
ouvre une **vassist** qui permet de :
|
||||
|
||||
- **Cocher/décocher les modes autorisés** parmi les 5 modes ci-dessus
|
||||
- **Définir la priorité** de chaque mode coché via un champ numérique
|
||||
(séquence)
|
||||
|
||||
**Règles de validation** à la soumission :
|
||||
|
||||
- Chaque mode coché doit avoir une priorité renseignée
|
||||
- Un mode non coché ne doit pas avoir de priorité
|
||||
- Au moins un mode doit être coché (pour bloquer un PK, utiliser le
|
||||
bouton standard dédié)
|
||||
|
||||
**Stockage** : la configuration est enregistrée dans un **paramètre
|
||||
SmartUI dédié par PK** au format :
|
||||
|
||||
```
|
||||
MODES_PK01 = "RECEPTION;1|PICKING;2|CONSOLIDATION;3"
|
||||
MODES_PK02 = "RECEPTION;1"
|
||||
```
|
||||
|
||||
Chaque entrée : `MODE;PRIORITÉ` séparés par `|`.
|
||||
|
||||
Cette configuration est utilisée par le
|
||||
[Mega Job d'assignation](job-assignation-pk.md)
|
||||
([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70)) pour
|
||||
déterminer si un PK est éligible à recevoir des tâches d'un flux donné
|
||||
et dans quel ordre de priorité.
|
||||
|
||||
#### Ouverture du poste par l'opérateur (SmartUI)
|
||||
|
||||
L'opérateur accède à **Poste de travail > Station de picking**.
|
||||
L'interface affiche un **bouton "Fermer le poste"** toujours visible.
|
||||
|
||||
Par défaut, le poste fonctionne en **tâche automatique** : le WMS
|
||||
choisit le bon process en fonction de la palette qui arrive ou qui est
|
||||
déjà sur le PK. L'opérateur n'a pas à sélectionner manuellement un mode.
|
||||
|
||||
#### Avertissement poste adjacent
|
||||
|
||||
À chaque ouverture d'un PK, le WMS vérifie si le **poste adjacent** est
|
||||
déjà ouvert (en mode actif). Le mapping des paires est défini dans le
|
||||
paramètre `PK_ADJACENT`.
|
||||
|
||||
**Si le poste adjacent est actif** → message d'avertissement (y compris
|
||||
en mode tâche automatique) :
|
||||
|
||||
> "Attention, le poste [CODE_PK_ADJACENT] est déjà ouvert.
|
||||
> Voulez-vous quand même ouvrir ?"
|
||||
|
||||
- Bouton **Confirmer** : le PK s'ouvre normalement
|
||||
- Bouton **Annuler** : le PK reste inactif
|
||||
|
||||
**Pas de blocage technique** — uniquement informatif. Les opérateurs sont
|
||||
physiquement à ~2 mètres et peuvent se coordonner verbalement. Les AGV
|
||||
ont des capteurs de sécurité et demandent l'autorisation de dépose.
|
||||
|
||||
#### Fermeture du poste
|
||||
|
||||
Le bouton **"Fermer le poste"** est toujours visible quel que soit l'état.
|
||||
Au clic :
|
||||
|
||||
- Le PK est remis en mode **inactif** (aucun mode actif)
|
||||
- Le PK redevient éligible pour une nouvelle assignation par le
|
||||
[Mega Job](job-assignation-pk.md) (sous réserve qu'il n'ait plus de
|
||||
tâches actives)
|
||||
|
||||
#### Paramètres modes de travail
|
||||
|
||||
| Paramètre | Description | Valeur par défaut | Exemple |
|
||||
|-----------|-------------|-------------------|---------|
|
||||
| MODES_PKxx | Modes autorisés + priorité pour le PK xx (un par PK, via vassist) | _(vide)_ | `RECEPTION;1\|PICKING;2` |
|
||||
| PK_ADJACENT | Paires de postes adjacents | _(vide)_ | `PK01;PK02\|PK03;PK04` |
|
||||
|
||||
### Équipement par poste
|
||||
|
||||
- 1 poste léger EasyWMS dupliqué sur 2 écrans
|
||||
- 1 imprimante Zebra (étiquettes HU RFID)
|
||||
- 1 imprimante A4 (étiquettes A4)
|
||||
- 1 douchette multi-format (RFID, QR Code, code à barres)
|
||||
|
||||
## [CUSTOM] Mega Job d'assignation des tâches aux postes
|
||||
|
||||
→ Voir page dédiée : **[Job d'assignation PK](job-assignation-pk.md)**
|
||||
([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70))
|
||||
|
||||
Job unique « chef d'orchestre » qui vérifie les modes de travail pour
|
||||
chaque PK et orchestre l'envoi de tâches via des sous-workflows dédiés
|
||||
(LIM-74, LIM-75). Transverse à tous les flux (réception, picking,
|
||||
regroupement, échantillonnage, re certification).
|
||||
|
||||
## Buffer postes de travail
|
||||
|
||||
16 emplacements palettes au sol le long de l'allée TK_01 :
|
||||
|
||||
| Nb emplacements | Usage |
|
||||
|-----------------|-------|
|
||||
| 14 | Avance pour les processus en cours |
|
||||
| 2 | Piles de palettes vides |
|
||||
|
||||
> ⚠️ 2 emplacements supplémentaires pour palettes rejetées en attente de
|
||||
> libération d'un poste de travail.
|
||||
|
||||
### [CUSTOM] Buffer configurable
|
||||
|
||||
Les emplacements du buffer sont **interchangeables** : un champ « type de
|
||||
fonctionnement » peut être modifié quand l'emplacement est vide.
|
||||
|
||||
### [CUSTOM] Bouton d'évacuation
|
||||
|
||||
Un bouton spécifique sur l'écran EasyWMS permet d'évacuer automatiquement
|
||||
une palette du buffer vers le convoyeur d'entrée pour stockage.
|
||||
|
||||
## Piles de palettes vides par poste
|
||||
|
||||
- **2 piles par îlot de travail** (et non par poste individuel)
|
||||
- Emplacement picking dédié pour réapprovisionnement automatique sur
|
||||
seuil
|
||||
- Aide à la manutention sur chaque poste pour prendre/poser des palettes
|
||||
- [CUSTOM] Bouton WfAction pour demander ou renvoyer une pile —
|
||||
l'opérateur choisit la pile à réapprovisionner parmi une liste
|
||||
|
||||
Voir [Palettes vides](../02-stockage/palettes-vides.md) pour le détail.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Un poste fermé ne peut pas être assigné à un processus.
|
||||
|
||||
⚠️ L'assignation automatique du poste optimise la distance la plus courte.
|
||||
|
||||
⚠️ Si une TP est HS, elle peut être bloquée individuellement sans impacter
|
||||
le reste du poste.
|
||||
|
||||
⚠️ L'entrée côté postes de travail et l'entrée côté quais sont
|
||||
interchangeables manuellement en cas de blocage long terme (bouton de
|
||||
redirection).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Détail de la gestion des tables de préparation bloquées (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-05 | Arthur | Mode esclave abandonné, job transverse, vassist modes, 2 piles/îlot |
|
||||
| 2026-05-05 | Arthur | Cross-ref flux expédition, picking WS vs RF, contrainte Big-Bag |
|
||||
| 2026-05-12 | Arthur | Détail modes de travail (LIM-69) : vassist manager, paramètres MODES_PKxx/PK_ADJACENT, tâche automatique, avertissement adjacent, fermeture poste. Renvoi job vers page dédiée (LIM-70) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| Réception - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| Expédition - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| [LIM-69](https://easywmsfrance.atlassian.net/browse/LIM-69) | Ticket Jira | 2026 |
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: "Picking — Vue d'ensemble"
|
||||
tags: [picking, combinatoire, stations, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-12
|
||||
---
|
||||
|
||||
# Picking — Vue d'ensemble
|
||||
|
||||
> **Périmètre** : picking combinatoire (CR V3.0, 4-job, CstAtt), stations de
|
||||
> picking, job d'assignation PK, waves et groupes, replenishment.
|
||||
|
||||
> **Standard EasyWMS** : voir [Picking](../../concepts/picking.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Picking combinatoire](picking-combinatoire.md)
|
||||
- [Stations de picking](stations-picking.md)
|
||||
- [Job d'assignation PK (Mega Job)](job-assignation-pk.md)
|
||||
- [Waves et groupes](waves-groupes.md)
|
||||
- [Replenishment](replenishment.md)
|
||||
- [Séquençage TK → PS](sequencage-tk-ps.md)
|
||||
- [Placement PS → PK (choix de table)](placement-ps-pk.md)
|
||||
- [Consolidation / Regroupement](consolidation-regroupement.md)
|
||||
- [Échantillonnage](echantillonnage.md)
|
||||
|
||||
## Vue synthétique du picking Limagrain
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
OS[OS libéré + stock assigné] --> SEQ[Séquençage TK → PS]
|
||||
SEQ --> TRI["Tri : négatif > maïs > volume > poids"]
|
||||
TRI --> PS[Palette arrive au PS]
|
||||
PS --> PLACE[Placement PS → PK]
|
||||
PLACE --> TABLE{Table ou buffer ?}
|
||||
TABLE -->|Table libre| PICK[Prélèvement au PK]
|
||||
TABLE -->|Buffer ES| WAIT[Attente buffer]
|
||||
WAIT --> PICK
|
||||
PICK --> NEG{"Picking négatif ?\n(% > 55% ET ≥ 7 kg)"}
|
||||
NEG -->|Oui| PNEG[Picking négatif]
|
||||
NEG -->|Non| PPOS[Picking direct]
|
||||
PNEG --> FILM[Choix filmage]
|
||||
PPOS --> FILM
|
||||
FILM --> PIE[Passage PIE]
|
||||
PIE --> DEFRAG[Zone défrag client]
|
||||
```
|
||||
|
||||
> **Note** : le picking AF V1.5 a depuis évolué vers le modèle
|
||||
> « picking combinatoire » CR V3.0 (4 jobs, CstAtt). Les pages de cette
|
||||
> section couvrent les deux versions.
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "Picking — Vue d'ensemble"
|
||||
tags: [picking, combinatoire, stations, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-13
|
||||
---
|
||||
|
||||
# Picking — Vue d'ensemble
|
||||
|
||||
> **Périmètre** : picking combinatoire (CR V3.0, 4-job, CstAtt), stations de
|
||||
> picking, job d'assignation PK, waves et groupes, replenishment.
|
||||
|
||||
> **Standard EasyWMS** : voir [Picking](../../concepts/picking.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Picking combinatoire](picking-combinatoire.md)
|
||||
- [Stations de picking](stations-picking.md)
|
||||
- [Job d'assignation PK (Mega Job)](job-assignation-pk.md)
|
||||
- [Waves et groupes](waves-groupes.md)
|
||||
- [Replenishment](replenishment.md)
|
||||
- [Séquençage TK → PS](sequencage-tk-ps.md)
|
||||
- [Séquençage TK → PS — Historique et arbitrage](sequencage-tk-ps-historique.md)
|
||||
- [Placement PS → PK (choix de table)](placement-ps-pk.md)
|
||||
- [Consolidation / Regroupement](consolidation-regroupement.md)
|
||||
- [Échantillonnage](echantillonnage.md)
|
||||
|
||||
## Chaîne picking — Ordre des traitements
|
||||
|
||||
L'ordre réel de la chaîne picking est le suivant :
|
||||
|
||||
1. **LIM-80** — [Assignation PK](job-assignation-pk.md) : quelle commande
|
||||
sur quel poste → déclenche la génération des tâches de picking
|
||||
2. **LIM-84** — [Séquençage TK → PS](sequencage-tk-ps.md) : ordonne les
|
||||
sorties des TK vers les PS
|
||||
3. **LIM-82** — [Placement PS → PK](placement-ps-pk.md) : la palette
|
||||
arrivant au PS va sur quelle table du PK
|
||||
4. Workflow opérateur au PK (picking effectif)
|
||||
|
||||
## Vue synthétique du picking Limagrain
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
OS[OS libéré + stock assigné] --> ASSIGN["LIM-80 : Assignation PK\n(commande → poste)"]
|
||||
ASSIGN --> SEQ["LIM-84 : Séquençage TK → PS\n(tri : négatif > maïs > volume > poids)"]
|
||||
SEQ --> PS[Palette arrive au PS]
|
||||
PS --> PLACE["LIM-82 : Placement PS → PK\n(choix de table)"]
|
||||
PLACE --> TABLE{Table ou buffer ?}
|
||||
TABLE -->|Table libre| PICK[Prélèvement au PK]
|
||||
TABLE -->|Buffer ES| WAIT[Attente buffer]
|
||||
WAIT --> PICK
|
||||
PICK --> NEG{"Picking négatif ?\n(% > 55% ET ≥ 7 kg)"}
|
||||
NEG -->|Oui| PNEG[Picking négatif]
|
||||
NEG -->|Non| PPOS[Picking direct]
|
||||
PNEG --> FILM[Choix filmage]
|
||||
PPOS --> FILM
|
||||
FILM --> PIE[Passage PIE]
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
---
|
||||
title: "Consolidation (regroupement) — Processus sur poste"
|
||||
tags: [picking, regroupement, consolidation, MOV, poste, custom]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: []
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx]
|
||||
last_updated: 2026-05-05
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Consolidation (regroupement) — Processus sur poste
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de consolidation de palettes incomplètes
|
||||
> partageant les mêmes critères de stock, sur poste de travail.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le regroupement permet de vider des palettes partiellement remplies en
|
||||
déplaçant leur stock vers d'autres palettes contenant le même stock.
|
||||
L'objectif est de libérer des emplacements dans l'ASRS.
|
||||
|
||||
## Critères de consolidation
|
||||
|
||||
Le regroupement est proposé quand deux palettes ou plus partagent :
|
||||
|
||||
- Article
|
||||
- Lot SAP
|
||||
- Propriétaire
|
||||
- Statut de stock
|
||||
- Flag anoxie
|
||||
|
||||
## [CUSTOM] Vue de proposition de regroupement
|
||||
|
||||
Une vue spécifique est développée pour Limagrain. Elle présente :
|
||||
|
||||
- Les palettes candidates au regroupement
|
||||
- Le gain potentiel en nombre de palettes
|
||||
|
||||
**Règle** : le regroupement n'est proposé que s'il permet de gagner au
|
||||
moins 1 palette. Exemple : Bag/Pal = 75, si palette H1 = 73 et H2 = 5
|
||||
→ pas de regroupement (73 + 5 = 78 > 75, pas de gain).
|
||||
|
||||
L'opérateur sélectionne un ou plusieurs ordres de regroupement depuis
|
||||
cette vue.
|
||||
|
||||
## Processus complet
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
VUE[Vue proposition regroupement] --> SELECT[Sélection ordres]
|
||||
SELECT --> ASSIGN[Assignation poste automatique]
|
||||
ASSIGN --> TACHE[Création tâches mouvement]
|
||||
TACHE --> ORD[Ordonnancement palettes au poste]
|
||||
ORD --> VERROU{Verrou « Réception » ?}
|
||||
VERROU -->|Oui| RECOUNT[Recomptage]
|
||||
VERROU -->|Non| PICK[Déplacement sacs]
|
||||
RECOUNT --> PICK
|
||||
PICK --> VIDE{Palette vidée ?}
|
||||
VIDE -->|Oui| DEGAGE[Dégagement palette vide]
|
||||
VIDE -->|Non| PICK
|
||||
DEGAGE --> EVAC[Évacuation palette stock]
|
||||
EVAC --> FILM[Choix filmage]
|
||||
FILM --> PIE[Passage PIE]
|
||||
PIE --> STOCK[Stockage ASRS]
|
||||
```
|
||||
|
||||
## Assignation poste de travail
|
||||
|
||||
- Assignation **automatique** quand un ordre est lancé
|
||||
- [CUSTOM] Si le lot a un Bag/Pal ≤ 2 → considéré « big-bag » →
|
||||
seul le **poste P6** (équipé d'un palan) est assignable
|
||||
- Un big-bag ne peut être consolidé que sur un autre big-bag
|
||||
- Si P6 n'est pas en mode regroupement → tâche en attente
|
||||
- Si aucun poste disponible → ordre en attente de libération
|
||||
|
||||
## [CUSTOM] Ordonnancement des palettes au poste
|
||||
|
||||
Une fois l'ordre lancé et le poste assigné, les palettes arrivent dans
|
||||
cet ordre :
|
||||
|
||||
1. **Minimum de mouvements palette** (moins de déplacements physiques)
|
||||
2. **Minimum de mouvements sac** (moins de manipulations)
|
||||
3. **Palette complète** (en priorité la palette destinataire)
|
||||
|
||||
## Exécution sur poste
|
||||
|
||||
1. [CUSTOM] Si verrou « Réception » → recomptage avant regroupement
|
||||
2. Les sacs de la palette à éliminer sont déplacés vers la palette
|
||||
destinataire
|
||||
3. Quand la palette est vidée → dégagement de la table de préparation
|
||||
4. Évacuation de la palette avec stock restant via bouton EasyWMS
|
||||
5. [CUSTOM] Choix filmage depuis vue spécifique (programme à définir)
|
||||
6. [CUSTOM] Message **MOV** à chaque déplacement de stock :
|
||||
- Palette d'origine
|
||||
- Palette de destination
|
||||
- Nouvelle palette ? (Oui/Non)
|
||||
- Quantité + caractéristiques (article, lot SAP, ...)
|
||||
|
||||
## Passage PIE post-regroupement
|
||||
|
||||
Contrôle identique aux autres processus :
|
||||
|
||||
- Dimensions max : 1300 × 1100 × 1900 mm
|
||||
- Poids max : 1250 kg
|
||||
- État palette bois correct
|
||||
- Étiquette RFID connue
|
||||
|
||||
[CUSTOM] Calcul poids de référence :
|
||||
|
||||
```
|
||||
Poids réf = Σ (Poids_unité_ligne_i × quantité_ligne_i) + poids_palette_bois
|
||||
```
|
||||
|
||||
Vérification avec tolérance par type d'article (voir
|
||||
[Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le message MOV est envoyé à chaque mouvement unitaire — volumétrie
|
||||
potentiellement élevée pour un regroupement complexe.
|
||||
|
||||
⚠️ Les 3 tables de préparation d'un même poste peuvent être occupées
|
||||
simultanément pendant le regroupement.
|
||||
|
||||
⚠️ Un big-bag ne peut être consolidé que sur un autre big-bag (contrainte
|
||||
physique + système).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Programme de filmage exact pour le regroupement (@Théo)
|
||||
- [ ] Interface opérateur vue regroupement — maquette validée ? (@Fabien)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
@@ -0,0 +1,145 @@
|
||||
---
|
||||
title: "Échantillonnage — Processus de contrôle qualité"
|
||||
tags: [picking, échantillonnage, inventaire, qualité, poste, custom]
|
||||
status: draft
|
||||
standard_ref: concepts/inventory.md
|
||||
jira_refs: []
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx]
|
||||
last_updated: 2026-05-05
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Échantillonnage — Processus de contrôle qualité
|
||||
|
||||
> **Résumé** : processus [CUSTOM] d'échantillonnage pour contrôle qualité,
|
||||
> assimilé à un inventaire dans EasyWMS, avec prélèvement sur poste de travail.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Inventory](../../concepts/count.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
L'échantillonnage sert au contrôle qualité sur une partie des lots
|
||||
produits. Il consiste à prélever environ 200 grammes dans une partie du
|
||||
stock sélectionné. Le prélèvement est ensuite analysé pour valider la
|
||||
qualité du produit fini.
|
||||
|
||||
Dans EasyWMS, ce processus est assimilé à un **inventaire** (ordre
|
||||
d'inventaire).
|
||||
|
||||
## Création de l'ordre d'échantillonnage
|
||||
|
||||
Deux modes de création :
|
||||
|
||||
| Mode | Origine | Détail |
|
||||
|------|---------|--------|
|
||||
| Interface ERP | Message de l'ERP (COR) | Spécifie un lot à inventorier |
|
||||
| Manuel | Interface EasyWMS | Choix d'un lot par l'opérateur |
|
||||
|
||||
[CUSTOM] Un champ texte est disponible pour donner des **consignes**
|
||||
rattachées à l'ordre d'inventaire.
|
||||
|
||||
## [CUSTOM] Assignation du stock
|
||||
|
||||
L'assignation diffère selon le mode de création :
|
||||
|
||||
### Création par interface ERP
|
||||
|
||||
- Maximum **4 palettes** échantillonnées :
|
||||
- Si stock global < 4 → toutes les palettes
|
||||
- Si stock global ≥ 4 → 4 palettes sélectionnées
|
||||
- [CUSTOM] Les palettes avec un verrou d'écart de poids (« Production »)
|
||||
sont **prioritaires** pour permettre une vérification simultanée
|
||||
|
||||
### Création manuelle
|
||||
|
||||
- Nombre de palettes choisi par l'opérateur
|
||||
|
||||
## Assignation poste de travail
|
||||
|
||||
- Automatique, à condition que le poste soit ouvert et autorise le
|
||||
mode « échantillonnage »
|
||||
- Si aucun poste paramétré en mode échantillonnage → tâches en attente
|
||||
- Une fois le poste assigné → création des tâches de mouvement
|
||||
|
||||
## Processus sur poste de travail
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ORDRE[Ordre échantillonnage] --> ASSIGN[Assignation stock]
|
||||
ASSIGN --> POSTE[Assignation poste auto]
|
||||
POSTE --> TACHE[Tâches mouvement créées]
|
||||
TACHE --> ARRIVE[Palette arrive sur TP]
|
||||
ARRIVE --> VERROU{Verrou « Réception » ?}
|
||||
VERROU -->|Oui| RECOUNT[Recomptage]
|
||||
VERROU -->|Non| PRELEV[Prélèvement ~200g]
|
||||
RECOUNT --> PRELEV
|
||||
PRELEV --> ETIQ[Impression étiquette échantillonnage]
|
||||
ETIQ --> SCOTCH[Scotch sac ouvert]
|
||||
SCOTCH --> FILM[Choix filmage]
|
||||
FILM --> EVAC[Évacuation → PIE → stockage]
|
||||
EVAC --> NEXT{Palette suivante ?}
|
||||
NEXT -->|Oui| ARRIVE
|
||||
NEXT -->|Non| FIN[Fin ordre]
|
||||
```
|
||||
|
||||
Les 3 tables de préparation peuvent être occupées simultanément.
|
||||
Le processus est démarré et effectué sur **une seule palette à la fois**.
|
||||
|
||||
### Séquence opérateur
|
||||
|
||||
1. [CUSTOM] Si verrou « Réception » → recomptage avant échantillonnage
|
||||
2. Prendre une pochette d'échantillonnage vide (hors EasyWMS)
|
||||
3. Effectuer un prélèvement dans un des sacs (~200g, hors EasyWMS)
|
||||
4. Déposer le prélèvement dans la pochette (hors EasyWMS)
|
||||
5. Éditer et imprimer une **étiquette d'échantillonnage**
|
||||
6. Coller l'étiquette sur la pochette (hors EasyWMS)
|
||||
7. Scotcher le sac ouvert sur la palette (hors EasyWMS)
|
||||
8. [CUSTOM] Choix filmage depuis vue spécifique (programme à définir)
|
||||
9. Évacuer la palette vers le stockage
|
||||
|
||||
## Passage PIE post-échantillonnage
|
||||
|
||||
Contrôle identique aux autres processus :
|
||||
|
||||
- Dimensions max : 1300 × 1100 × 1900 mm
|
||||
- Poids max : 1250 kg
|
||||
- Étiquette RFID connue
|
||||
- État palette bois correct
|
||||
|
||||
[CUSTOM] Poids de référence recalculé + vérification avec tolérance
|
||||
(voir [Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
Si PIE NOK → rejet vers poste d'origine. Possibilité de forcer le
|
||||
passage en cas d'excédent de poids non corrigeable.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ L'échantillonnage est un processus d'**inventaire** dans EasyWMS,
|
||||
pas un processus de picking — important pour le paramétrage des modes
|
||||
de poste.
|
||||
|
||||
⚠️ Les palettes avec verrou « Production » (écart poids) sont traitées
|
||||
en priorité pour optimiser le recomptage.
|
||||
|
||||
⚠️ La quantité prélevée (~200g) n'est pas déduite du stock dans EasyWMS
|
||||
(négligeable par rapport au poids total).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Le prélèvement de 200g est-il déduit du stock ou négligé ? (@Nicolas)
|
||||
- [ ] Programme de filmage exact (@Théo)
|
||||
- [ ] Format de l'étiquette d'échantillonnage — validé ? (@Justine)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
@@ -0,0 +1,203 @@
|
||||
---
|
||||
title: "Mega Job — Assignation des tâches aux PK"
|
||||
tags: [picking, job, assignation, agv, workflow]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-70, LIM-74, LIM-75, LIM-80]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-70 LOT1.3 [AGV][JOB] MEGA JOB - assignation d'ordre par priorité de process par PK.md", "LIM-80 LOT2.1 2 Mini Job Assignation des postes PK aux commandes.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Mega Job — Assignation des tâches aux PK
|
||||
|
||||
> **Résumé** : job unique « chef d'orchestre » qui analyse les postes de
|
||||
> travail éligibles et leur assigne des tâches de mouvement selon les
|
||||
> modes autorisés et leur priorité. Évite la concurrence entre
|
||||
> mini-jobs indépendants.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md),
|
||||
> [Stations & Routes](../../concepts/stations.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, les postes de travail (PK) sont polyvalents : réception,
|
||||
picking, regroupement, échantillonnage, re certification. Plusieurs
|
||||
flux différents génèrent des tâches de mouvement vers les PK. Sans
|
||||
orchestration centralisée, ces flux se feraient concurrence.
|
||||
|
||||
Le Mega Job est un **job unique** avec une entête qui analyse l'ensemble
|
||||
des supports concernés et, selon leur emplacement d'origine et leurs
|
||||
caractéristiques, délègue à des **sous-workflows** dédiés.
|
||||
|
||||
## Éligibilité d'un PK
|
||||
|
||||
Pour qu'un poste soit éligible à une nouvelle assignation, **toutes** les
|
||||
conditions suivantes doivent être remplies :
|
||||
|
||||
- **Aucun ordre de sortie** assigné au PK (écran Menu > Contrôle >
|
||||
Affectation des postes de prélèvements)
|
||||
- **Aucune tâche de mouvement** ayant pour destination ce PK
|
||||
- **Aucune palette** présente sur un des sous-emplacements du PK
|
||||
- **Le poste est ouvert** (mode actif)
|
||||
- **Le paramètre MODES_PKxx existe et n'est pas vide** — sinon le PK
|
||||
est ignoré
|
||||
|
||||
Si un PK ne remplit pas ces conditions, le job le saute et passe au
|
||||
suivant.
|
||||
|
||||
## Logique principale
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Début du job] --> B[Lister les PK ouverts]
|
||||
B --> C{PK éligible ?}
|
||||
C -- Non --> D[PK suivant]
|
||||
C -- Oui --> E[Lire MODES_PKxx]
|
||||
E --> F{Paramètre existe et non vide ?}
|
||||
F -- Non --> D
|
||||
F -- Oui --> G[Trier les modes par priorité]
|
||||
G --> H[Exécuter sous-WF du mode priorité 1]
|
||||
H --> I{Tâche assignée ?}
|
||||
I -- Oui --> D
|
||||
I -- Non --> J[Exécuter sous-WF du mode priorité 2]
|
||||
J --> K{Tâche assignée ?}
|
||||
K -- Oui --> D
|
||||
K -- Non --> L[... mode suivant ...]
|
||||
L --> D
|
||||
D --> M{Autres PK ?}
|
||||
M -- Oui --> C
|
||||
M -- Non --> N[Fin du job]
|
||||
```
|
||||
|
||||
Pour chaque PK éligible :
|
||||
|
||||
1. Le WMS récupère le paramètre `MODES_PKxx` (x = numéro du poste)
|
||||
2. Les modes sont triés par priorité croissante
|
||||
3. Le sous-workflow du mode de priorité la plus haute est exécuté
|
||||
4. Si le sous-WF a assigné une tâche → passage au PK suivant
|
||||
5. Sinon → exécution du sous-WF du mode suivant dans l'ordre de priorité
|
||||
6. Si aucun sous-WF n'a rien assigné → le PK reste en attente
|
||||
|
||||
## Gestion des Big-Bags
|
||||
|
||||
Le paramètre `PK_BIGBAG` définit quels PK autorisent la présence de
|
||||
big-bags (physiquement : P5 et P6 avec palan).
|
||||
|
||||
- Les ordres contenant des supports big-bag sont **interdits** sur les
|
||||
PK qui ne les autorisent pas
|
||||
- Ces ordres sont **prioritaires** (en respectant le séquençage des
|
||||
process en première priorité) sur les PK qui les autorisent
|
||||
|
||||
## Sous-workflows
|
||||
|
||||
Le Mega Job délègue la création effective des tâches à des sous-workflows
|
||||
spécialisés :
|
||||
|
||||
| Sous-WF | Ticket | Process | Page wiki |
|
||||
|---------|--------|---------|-----------|
|
||||
| Mini Job images de quai → PK | [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Réception fournisseur / intersite / retour client (depuis images de quai) | [Job réception PK](../05-agv/job-reception-pk.md) |
|
||||
| Mini Job PS → PK | [LIM-75](https://easywmsfrance.atlassian.net/browse/LIM-75) | _(tâche à écrire)_ | — |
|
||||
| Mini Job assignation commandes → PK | [LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80) | Assignation des ordres de sortie (commandes) aux PK pour picking | Voir section ci-dessous |
|
||||
|
||||
Chaque sous-workflow retourne une information au WF principal indiquant
|
||||
s'il a assigné quelque chose ou non.
|
||||
|
||||
## Mini Job — Assignation commandes aux PK (LIM-80)
|
||||
|
||||
Ce sous-workflow est appelé par le Mega Job quand le mode **Picking** est
|
||||
actif sur un PK. Il assigne un ordre de sortie (commande) au poste.
|
||||
|
||||
### Éligibilité du PK pour une commande
|
||||
|
||||
Le PK peut recevoir une commande si **toutes** les conditions sont
|
||||
remplies :
|
||||
|
||||
- Le PK **autorise la préparation de commande** (mode Picking actif)
|
||||
- Le PK **n'a pas de commande déjà assignée**
|
||||
- Le PK **est vide** (aucune palette présente)
|
||||
- Le PK **n'a aucune tâche en direction de celui-ci**
|
||||
|
||||
### Choix de la commande
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[PK éligible en mode Picking] --> B{Commande Messagerie\ndisponible ?}
|
||||
B -- Oui --> C{PK_TRANSPORTEUR_MESSAGERIE\ncontient une valeur ?}
|
||||
C -- Non --> D[Assigner 1ère Messagerie\net enregistrer PK dans param]
|
||||
C -- Oui --> E{Valeur = ce PK ?}
|
||||
E -- Oui --> F[Assigner prochaine Messagerie\ndu même transporteur]
|
||||
F --> G{Commande trouvée ?}
|
||||
G -- Non --> H[Vider le paramètre]
|
||||
E -- Non --> I[Ignorer les Messagerie\nde ce transporteur]
|
||||
I --> J[Chercher autre commande]
|
||||
B -- Non --> J
|
||||
H --> J
|
||||
J --> K[Assignation standard\npar tournée / numéro d'arrêt]
|
||||
```
|
||||
|
||||
#### Commandes Messagerie (prioritaires)
|
||||
|
||||
Les commandes de **classe Messagerie** sont expédiées le jour même et
|
||||
sont donc **prioritaires** sur les commandes standard.
|
||||
|
||||
Une fois un PK choisi pour une commande Messagerie, **toutes les
|
||||
commandes Messagerie du même transporteur** doivent être assignées au
|
||||
même PK. Pour cela, un paramètre par transporteur est créé :
|
||||
`PK_TRANSPORTEUR_MESSAGERIE`.
|
||||
|
||||
Règles :
|
||||
|
||||
- À l'assignation d'une commande Messagerie au PK, le nom du PK est
|
||||
enregistré dans le paramètre
|
||||
- Si le paramètre contient le nom de ce PK → assigner **uniquement**
|
||||
des commandes Messagerie du même transporteur. Si aucune n'est
|
||||
trouvée → vider le paramètre
|
||||
- Si le paramètre contient un autre PK → ignorer toutes les commandes
|
||||
Messagerie de ce transporteur pour ce PK
|
||||
|
||||
#### Commandes standard
|
||||
|
||||
Le processus standard est utilisé pour assigner une commande à une
|
||||
table de préparation et un PK. Les commandes d'une même tournée sont
|
||||
préparées en respectant le **numéro d'arrêt** (plus petit numéro
|
||||
d'arrêt en premier).
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le Mega Job est le chef d'orchestre du picking : il distribue le
|
||||
travail aux PK en fonction des modes configurés par PK.
|
||||
|
||||
⚠️ Les commandes Messagerie sont prioritaires et ont une affinité
|
||||
transporteur/PK via `PK_TRANSPORTEUR_MESSAGERIE`.
|
||||
|
||||
⚠️ L'éligibilité PK vérifie 4 conditions (mode autorisé, pas de
|
||||
commande, vide, pas de tâche en cours).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Fréquence du Mega Job — toutes les N secondes ou événementiel ?
|
||||
(@Nicolas)
|
||||
- [ ] Sous-WF regroupement et échantillonnage — quand les documenter ?
|
||||
(@Arthur)
|
||||
- [ ] Interaction PK_BIGBAG et modes de travail — un PK en mode
|
||||
Big-Bag peut-il aussi traiter du picking normal ? (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-70 (Mega Job) |
|
||||
| 2026-05-12 | Arthur | Ajout sous-WF assignation commandes (LIM-80) : Messagerie prioritaire, affinité transporteur/PK |
|
||||
| 2026-05-13 | Arthur | Restauration sections tronquées (Messagerie détail, commandes standard, points d'attention, questions, historique, références) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) | Ticket Jira (Mega Job) | 2026 |
|
||||
| [LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80) | Ticket Jira (assignation commandes) | 2026 |
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira (Mini Job réception PK) | 2026 |
|
||||
@@ -0,0 +1,287 @@
|
||||
---
|
||||
title: "Picking sur poste de travail — Expédition client"
|
||||
tags: [picking, poste, expédition, ordonnancement, MOV, PCK]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-82]
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Expédition - LIMAGRAIN - DEV - Confluence.md", "LIM-82 LOT2.2 [PICKING] Ordonnancement des tâches de picking PS PK.md", "REU PICKING SEQUENCAGE 11-05-2026 - Analyse comparative notes + AF + devops.md"]
|
||||
last_updated: 2026-05-13
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Picking sur poste de travail — Expédition client
|
||||
|
||||
> **Résumé** : processus [CUSTOM] de picking sur poste de travail pour
|
||||
> les commandes client, avec ordonnancement par espèce, règles de picking
|
||||
> négatif et contraintes physiques.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Le picking chez Limagrain se fait sur les postes de travail automatisés
|
||||
(pas de picking mobile en allée). Les palettes source et les palettes
|
||||
de préparation sont acheminées par AGV sur les tables de préparation (TP).
|
||||
|
||||
> **Note** : cette page décrit le picking tel que défini dans l'AF V1.5.
|
||||
> Le projet a depuis évolué vers un modèle « picking combinatoire »
|
||||
> (CR V3.0, 4 jobs, CstAtt) qui sera documenté séparément.
|
||||
|
||||
## Déclenchement
|
||||
|
||||
Le picking est déclenché pour les commandes client (RUT type « Client »)
|
||||
quand des palettes incomplètes sont nécessaires (la quantité demandée
|
||||
ne correspond pas à des palettes complètes).
|
||||
|
||||
Prérequis : un **poste de travail assigné** (auto ou manuellement).
|
||||
|
||||
## [CUSTOM] Ordonnancement des palettes au poste
|
||||
|
||||
Une fois le poste assigné, les palettes arrivent dans cet ordre :
|
||||
|
||||
### Tri par espèce et gerbabilité
|
||||
|
||||
1. **Espèce Maïs** toujours en premier (pas la variété mais l'espèce)
|
||||
2. Puis espèce avec la **plus grande quantité** dans la commande
|
||||
3. Si égalité → **article/lot le plus lourd** en base de palette
|
||||
|
||||
**Mapping Espèce → stack (gerbabilité)** : le maïs = stack 0 (le plus
|
||||
lourd/stable, donc en base). [CUSTOM] Gestion en **async sur l'ITM** pour
|
||||
calculer la gerbabilité automatiquement à la création de l'article. Tri
|
||||
des tâches de picking dans le workflow `StackerCrane_SortTasks_PR`.
|
||||
|
||||
### ~~Séparation par traitement commercial~~ SUPPRIMÉ (réu. 11/05/2026)
|
||||
|
||||
~~Pas de mélange entre articles avec traitement et sans traitement
|
||||
sur une même palette fille.~~
|
||||
|
||||
**Décision** : `CONTROLE_TRAITEMENT_COMMERCIAL = false`. L'entrepôt
|
||||
Limagrain ne fait pas de bio, pas de raison de maintenir cette
|
||||
contrainte. Paramètre réactivable si besoin futur.
|
||||
|
||||
> Voir [Séquençage TK → PS — Arbitrage](sequencage-tk-ps.md#arbitrage-des-contradictions-reu-11052026)
|
||||
> pour le détail de l'analyse comparative.
|
||||
|
||||
## [CUSTOM] Règle du picking négatif
|
||||
|
||||
**Deux conditions cumulatives** (réu. 11/05/2026) :
|
||||
|
||||
1. La quantité à prélever dépasse le **seuil fiche article** (défaut
|
||||
55%, paramétrable par article via "Complete quantity percent excess
|
||||
for negative picking")
|
||||
2. Le **poids unitaire du sac ≥ 7 kg** (raison : instabilité palette si
|
||||
gros sacs ramenés sur petits sacs)
|
||||
|
||||
Si les deux conditions sont remplies → **picking négatif** : au lieu de
|
||||
déplacer les sacs à expédier, déplacer les sacs qui **retourneront en
|
||||
stock** (moins de mouvements physiques).
|
||||
|
||||
Si l'une des deux conditions n'est pas remplie → picking direct
|
||||
classique.
|
||||
|
||||
> Le picking négatif est **prioritaire sur Maïs first** et toutes les
|
||||
> autres règles de tri (confirmé par Olivier, réu. 11/05/2026).
|
||||
> Voir [Séquençage TK → PS](sequencage-tk-ps.md#critère-1--picking-négatif-en-premier).
|
||||
|
||||
## [CUSTOM] Calcul équivalent palette (pro rata Bag/pal)
|
||||
|
||||
Pour déterminer si une palette est « pleine », calcul en **pro rata
|
||||
Bag/pal** (réu. 11/05/2026, remplace la logique DevOps "Bag/pal max") :
|
||||
|
||||
```
|
||||
Équivalent palette d'un sac = 1 ÷ Bag/Pal de son lot
|
||||
```
|
||||
|
||||
Le calcul est additif et gère nativement des lots avec des Bag/pal
|
||||
différents sur une même palette :
|
||||
|
||||
```
|
||||
Exemple :
|
||||
15 sacs lot Bag/pal 20 + 10 sacs lot Bag/pal 75
|
||||
= 15/20 + 10/75
|
||||
= 0,75 + 0,133
|
||||
= 88,3% → il reste ~12% de place
|
||||
```
|
||||
|
||||
Seuil cible : **~95%** de remplissage (marge de sécurité).
|
||||
Poids max palette : **1 250 kg** (AF fait foi, corrige 1 200 kg du
|
||||
DevOps).
|
||||
|
||||
## [CUSTOM] Verrou « HORS TOLERANCE » — Recomptage
|
||||
|
||||
Si la palette source porte le verrou « HORS TOLERANCE » → recomptage
|
||||
demandé avant le picking (inventaire).
|
||||
|
||||
- Si stock restant suffisant après inventaire → assignation maintenue
|
||||
(workflow `OnStockAdjust` recalcule uniquement si nécessaire — ne casse
|
||||
pas la tâche en cours)
|
||||
- Si plus assez de stock → réassignation ailleurs + retrait verrou
|
||||
|
||||
## [CUSTOM] Algorithme de répartition des palettes sur les TP
|
||||
|
||||
Logique combinatoire complète gérant tous les cas :
|
||||
|
||||
- Picking négatif et enchaînement de pickings négatifs
|
||||
- Ordonnancement par espèce
|
||||
- Terminer une palette pleine avant d'en entamer une autre
|
||||
- Cadencement des buffers devant les postes de picking
|
||||
- Pas de mélange de traitement commercial (via famille d'article)
|
||||
- **Contrainte** : l'opérateur ne doit **pas déplacer de sacs d'une table
|
||||
à l'autre** (sacs lourds)
|
||||
|
||||
**Table du milieu** : toujours occupée soit par une palette de picking
|
||||
négatif, soit par une palette vide de dépôt. Quand la palette de
|
||||
prélèvement est vidée, l'opérateur la remet manuellement sur une pile
|
||||
de palettes vides à proximité.
|
||||
|
||||
> Prévoir un process sans picking négatif pour les cas où c'est rarement
|
||||
> utilisé (ou monter le seuil, ex : 70% au lieu de 55%).
|
||||
|
||||
## Processus de préparation
|
||||
|
||||
### Arrivée des palettes (toujours un poste 3 TP)
|
||||
|
||||
- Première palette au **centre** si picking négatif proposé, sinon sur
|
||||
un côté
|
||||
- Si une palette est sur un côté et qu'on propose du picking négatif →
|
||||
prévenir l'opérateur de déplacer la palette au centre
|
||||
- La palette client revient **toujours** au centre
|
||||
- Pas de prépa sur 6 TP en simultané
|
||||
|
||||
### Picking
|
||||
|
||||
1. Palette source arrive sur une TP
|
||||
2. Palette destination (vide ou en cours) sur une autre TP
|
||||
3. Opérateur prélève les sacs (ou sacs retour si picking négatif)
|
||||
4. ~~[CUSTOM] Message MOV envoyé à SAP~~ **ANNULÉ** (décision client)
|
||||
5. Avant évacuation : choix filmage (CstData transmis à Galileo).
|
||||
Possibilité de choisir « pas de filmage ».
|
||||
6. Évacuation palette → PIE → contrôle poids → stockage/expédition
|
||||
|
||||
## [CUSTOM] Ordonnancement des tâches PS → PK (LIM-82)
|
||||
|
||||
Détail du cadencement des palettes depuis les postes de sortie (PS)
|
||||
vers les postes de picking (PK). Toutes les tâches de picking se font
|
||||
sur les tables élévatrices des PK.
|
||||
|
||||
### Règles de priorité
|
||||
|
||||
1. **Picking négatif toujours en premier** — une seule palette à la fois
|
||||
pour ce process, toujours déposée sur la **table du centre**
|
||||
2. **Picking classique ensuite** — jusqu'à **2 palettes simultanées** au
|
||||
PK, déposées sur les **tables latérales**
|
||||
3. Le WMS peut envoyer **1 palette picking négatif + 1 palette picking
|
||||
classique** en même temps (pour compléter la palette post-picking
|
||||
négatif)
|
||||
4. Le nombre de palettes de prélèvement au PK ne dépasse **jamais 2**
|
||||
|
||||
### Picking négatif — Détail
|
||||
|
||||
À chaque tâche de picking négatif :
|
||||
|
||||
- Un **nouveau code SSCC** est généré pour la palette où l'excédent de
|
||||
stock est déposé
|
||||
- Une **étiquette RFID** est imprimée pour cette nouvelle palette
|
||||
- La palette de picking négatif va toujours au **centre** du PK
|
||||
|
||||
### Cadencement des buffers
|
||||
|
||||
Les palettes non encore nécessaires au PK sont dirigées vers les
|
||||
**zones d'attente** (buffers ES_X) situées entre le PS et le PK.
|
||||
Le nombre max de palettes pré-chargées est contrôlé par
|
||||
`MAX_PRELOAD_PAR_PK` (défaut : 3). L'ordre de sortie des buffers
|
||||
suit `Line.CstAtt` (séquence), pas l'ordre FIFO d'entrée physique.
|
||||
|
||||
Voir [Placement PS → PK](placement-ps-pk.md) pour l'algorithme
|
||||
complet de choix de table et de gestion des buffers.
|
||||
|
||||
## Information passage conteneur client
|
||||
|
||||
Le passage en conteneur client est visible dans le **LOC** envoyé
|
||||
toutes les 5 minutes à SAP (flag « client » = true). Voir
|
||||
[Flux ERP outbound](../04-outbound/flux-erp-outbound.md).
|
||||
|
||||
## Étiquetage
|
||||
|
||||
### Cas standard (non MII ou MII mono lot)
|
||||
|
||||
- 1 étiquette RFID pour la palette physique bois
|
||||
|
||||
### Cas MII multi lots
|
||||
|
||||
- 1 étiquette HU RFID pour la palette physique (HU mère)
|
||||
- 1 étiquette HU sans RFID par ligne de stock (HU fille / intercalaire)
|
||||
- Impression auto à chaque nouvelle palette (RFID) et à chaque article
|
||||
(intercalaire)
|
||||
- Basé sur la **classe de commande**
|
||||
|
||||
## Contraintes opérateur (hors EasyWMS)
|
||||
|
||||
Règles non gérées par le système mais à respecter :
|
||||
|
||||
1. Palette ne doit pas excéder **1,90 m** (sinon rejet PIE)
|
||||
2. Palette ne doit pas excéder **1 250 kg** (sinon rejet PIE)
|
||||
3. Pas de gerbage de palette
|
||||
4. Disposition d'intercalaires entre couches
|
||||
|
||||
## Calcul poids de référence (post-picking)
|
||||
|
||||
Pour les palettes multi-lignes de stock :
|
||||
|
||||
```
|
||||
Poids réf = Σ (Poids_unité_ligne_i × quantité_ligne_i) + poids_palette_bois
|
||||
```
|
||||
|
||||
Contrôle PIE identique aux autres processus (voir
|
||||
[Contrôle qualité réception](../01-inbound/controle-qualite-reception.md)).
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le picking négatif (seuil 55% + poids ≥ 7 kg, deux conditions
|
||||
cumulatives) est une règle métier intégrée dans EasyWMS — c'est un
|
||||
développement custom.
|
||||
|
||||
⚠️ Le traitement commercial est **désactivé**
|
||||
(`CONTROLE_TRAITEMENT_COMMERCIAL = false`, réu. 11/05/2026).
|
||||
|
||||
⚠️ L'ordonnancement espèce → quantité → poids est géré par EasyWMS
|
||||
(pas un choix opérateur).
|
||||
|
||||
⚠️ Le message MOV est **ANNULÉ** (décision réunion client).
|
||||
|
||||
⚠️ Le verrou HORS TOLERANCE déclenche un recomptage mais ne casse pas
|
||||
l'assignation si le stock restant est suffisant.
|
||||
|
||||
⚠️ L'algorithme de répartition TP est le « gros morceau » custom du
|
||||
picking — gestion combinatoire de tous les cas.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [x] Programme de filmage exact — documenté, 8 programmes A→H
|
||||
(voir [Flux expédition](../04-outbound/flux-expedition.md#filmage))
|
||||
- [x] Process sans picking négatif / seuil — confirmé 55% + poids ≥ 7 kg
|
||||
(réu. 11/05/2026)
|
||||
- [x] Traitement commercial — supprimé
|
||||
(`CONTROLE_TRAITEMENT_COMMERCIAL = false`, réu. 11/05/2026)
|
||||
- [ ] Gestion du picking négatif dans l'interface opérateur (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-05 | Arthur | Gerbabilité/stack, algo répartition TP, verrou HORS TOLERANCE, MOV annulé, arrivée palettes 3 TP, filmage CstData |
|
||||
| 2026-05-12 | Arthur | Ajout ordonnancement PS → PK (LIM-82), picking négatif détaillé, cadencement buffers |
|
||||
| 2026-05-12 | Arthur | TC supprimé, picking négatif 2 conditions cumulatives 55% + 7 kg, pro rata Bag/pal, poids max 1 250 kg (réu. 11/05/2026) |
|
||||
| 2026-05-13 | Arthur | Restauration sections perdues (étiquetage, contraintes, poids réf, points d'attention), correction seuil 50% → 55% |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| Expédition - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| LIM-82 LOT2.2 | Ticket Jira (ordonnancement PS → PK) | 2026 |
|
||||
| REU PICKING SEQUENCAGE 11-05-2026 | CR réunion + analyse comparative | 11/05/2026 |
|
||||
@@ -0,0 +1,325 @@
|
||||
---
|
||||
title: "Placement des palettes PS → PK (choix de table)"
|
||||
tags: [picking, placement, table, buffer, ping-pong, algorithme]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-82]
|
||||
confluence_refs: []
|
||||
sources: ["Logique combinatoire picking - PS vers PK - V1.0.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Placement des palettes PS → PK (choix de table)
|
||||
|
||||
> **Résumé** : algorithme exécuté par le WMS lorsqu'une palette source
|
||||
> arrive au poste de sortie (PS). Il décide sur quelle table du PK la
|
||||
> poser, ou la redirige vers un buffer ES. Ce process s'exécute **en
|
||||
> aval** du [séquençage TK → PS](sequencage-tk-ps.md) : les palettes
|
||||
> arrivent au PS déjà triées.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chaque PK dispose de **3 tables** soumises à une contrainte d'adjacence
|
||||
stricte :
|
||||
|
||||
```
|
||||
TABLE_GAUCHE ←→ TABLE_CENTRE ←→ TABLE_DROITE
|
||||
✅ adjacentes ✅ adjacentes
|
||||
|
||||
TABLE_GAUCHE ←————————————————→ TABLE_DROITE
|
||||
❌ INTERDIT
|
||||
```
|
||||
|
||||
Règles de mouvement :
|
||||
|
||||
- Le stock est **toujours sur une palette**, jamais posé directement sur
|
||||
la table
|
||||
- L'opérateur peut déplacer du **stock** (sacs, colis) d'une palette à
|
||||
une autre **uniquement entre deux tables adjacentes**
|
||||
- Il est **interdit de déplacer une palette d'une table à une autre** —
|
||||
ni par l'opérateur, ni par l'AGV. Une palette arrive sur une table
|
||||
et ne peut que repartir (évacuation)
|
||||
- **TABLE_CENTRE** est le pivot : seule table adjacente aux deux autres
|
||||
|
||||
## Déclenchement
|
||||
|
||||
L'algorithme est appelé **à chaque arrivée physique d'une palette au
|
||||
PS**. Le PS interroge le WMS qui retourne une réponse parmi :
|
||||
|
||||
- **TABLE_GAUCHE**, **TABLE_CENTRE** ou **TABLE_DROITE** → la palette
|
||||
est envoyée sur cette table
|
||||
- **Buffer ESx** → aucune table n'est disponible, la palette est
|
||||
redirigée vers un emplacement buffer
|
||||
- **Attente** → ni table ni buffer disponible, la palette reste au PS
|
||||
|
||||
## Entrées de l'algorithme
|
||||
|
||||
| Donnée | Source |
|
||||
|--------|--------|
|
||||
| Tâche courante : palette source, article, quantité, type de picking (NÉGATIF / DIRECT), `Line.CstAtt` (séquence) | Tâche associée à la palette |
|
||||
| État des 3 tables du PK : VIDE, PALETTE_FILLE_ACTIVE, PALETTE_FILLE_EN_ATTENTE, PALETTE_SOURCE_EN_PICKING, PALETTE_SOURCE_EN_ATTENTE, EN_ATTENTE_EVACUATION | État temps réel du PK |
|
||||
| Tâches suivantes de l'OS (triées par `Line.CstAtt` croissant) | OS en base |
|
||||
| Buffers ES disponibles : parmi ES1–ES16, ceux non occupés ni ciblés | État temps réel des buffers |
|
||||
| Nombre de buffers déjà affectés à ce PK vs `MAX_PRELOAD_PAR_PK` (défaut : 3) | Compteur par PK |
|
||||
|
||||
## Décision niveau 1 : table du PK ou buffer ?
|
||||
|
||||
```
|
||||
FONCTION décider_destination(palette, PK) :
|
||||
|
||||
table_cible ← choisir_table(palette, PK)
|
||||
|
||||
SI table_cible ≠ NULL :
|
||||
RETOURNER table_cible
|
||||
|
||||
// Aucune table disponible → tenter un buffer
|
||||
SI nb_buffers_affectés(PK) < MAX_PRELOAD_PAR_PK :
|
||||
buffer ← premier ES libre
|
||||
SI buffer existe :
|
||||
RETOURNER buffer
|
||||
|
||||
// Ni table ni buffer disponible
|
||||
RETOURNER ATTENTE
|
||||
```
|
||||
|
||||
## Décision niveau 2 : choix de la table
|
||||
|
||||
Le choix dépend du **type de picking** de la tâche associée.
|
||||
|
||||
### Cas PICKING_NÉGATIF
|
||||
|
||||
En picking négatif, la palette source arrive sur une table, l'opérateur
|
||||
retire l'excédent sur une palette posée sur une **table adjacente**,
|
||||
puis échange d'étiquettes. La palette a besoin de **2 tables** : une
|
||||
pour elle, une adjacente libre pour l'excédent.
|
||||
|
||||
```
|
||||
FONCTION choisir_table_picking_négatif(PK) :
|
||||
|
||||
// Priorité 1 : centre + un côté libre
|
||||
SI TABLE_CENTRE == VIDE ET (TABLE_GAUCHE == VIDE
|
||||
OU TABLE_DROITE == VIDE) :
|
||||
RETOURNER TABLE_CENTRE
|
||||
|
||||
// Priorité 2 : côté + centre libre
|
||||
SI (TABLE_GAUCHE == VIDE OU TABLE_DROITE == VIDE)
|
||||
ET TABLE_CENTRE == VIDE :
|
||||
RETOURNER côté vide
|
||||
|
||||
// Priorité 3 : centre libre + un côté libérable
|
||||
SI TABLE_CENTRE == VIDE ET un côté est libérable :
|
||||
évacuer(côté libérable)
|
||||
RETOURNER TABLE_CENTRE
|
||||
|
||||
// Priorité 4 : un côté libre + centre libérable
|
||||
SI un côté == VIDE ET TABLE_CENTRE est libérable :
|
||||
évacuer(TABLE_CENTRE)
|
||||
RETOURNER côté vide
|
||||
|
||||
// Dernier recours : évacuation forcée
|
||||
évacuer_table_prioritaire(PK)
|
||||
RETOURNER choisir_table_picking_négatif(PK) // rappel
|
||||
```
|
||||
|
||||
### Cas PICKING_DIRECT
|
||||
|
||||
La palette source doit être posée sur une table **adjacente à la
|
||||
palette fille active**. Le choix se fait en fonction de l'emplacement
|
||||
de la palette fille.
|
||||
|
||||
```
|
||||
FONCTION choisir_table_picking_direct(tâche, PK) :
|
||||
|
||||
// Étape 1 : localiser la palette fille compatible
|
||||
table_fille ← localiser_palette_fille(tâche, PK)
|
||||
|
||||
SI table_fille == NULL :
|
||||
table_fille ← choisir_table_nouvelle_palette_fille(PK)
|
||||
|
||||
// Étape 2 : choisir une table adjacente
|
||||
tables_adj ← tables_adjacentes(table_fille)
|
||||
|
||||
// Prio A : palette source déjà sur une adjacente
|
||||
// (multi-tâches même palette)
|
||||
POUR chaque t DANS tables_adj :
|
||||
SI t contient tâche.PALETTE_SOURCE :
|
||||
RETOURNER t
|
||||
|
||||
// Prio B : adjacente VIDE
|
||||
// Si 2 adjacentes libres (PF au centre) → ping-pong
|
||||
adjacentes_vides ← [t POUR t DANS tables_adj SI t == VIDE]
|
||||
SI len(adjacentes_vides) == 2 :
|
||||
RETOURNER choisir_côté_ping_pong(PK)
|
||||
SI len(adjacentes_vides) == 1 :
|
||||
RETOURNER adjacentes_vides[0]
|
||||
|
||||
// Prio C : adjacente en cours d'évacuation (AGV en route)
|
||||
POUR chaque t DANS tables_adj :
|
||||
SI t == EN_ATTENTE_EVACUATION :
|
||||
RETOURNER t
|
||||
|
||||
// Prio D : forcer l'évacuation d'une adjacente
|
||||
t_à_libérer ← choisir_table_à_évacuer(tables_adj)
|
||||
évacuer(t_à_libérer)
|
||||
RETOURNER t_à_libérer
|
||||
```
|
||||
|
||||
### Localisation de la palette fille compatible
|
||||
|
||||
```
|
||||
FONCTION localiser_palette_fille(tâche, PK) :
|
||||
|
||||
// Parmi les PF actives
|
||||
POUR chaque table :
|
||||
SI table.état == PALETTE_FILLE_ACTIVE :
|
||||
RETOURNER table
|
||||
// Note : CONTROLE_TRAITEMENT_COMMERCIAL = false,
|
||||
// donc pas de filtre TC
|
||||
|
||||
// Puis parmi les PF en attente
|
||||
POUR chaque table :
|
||||
SI table.état == PALETTE_FILLE_EN_ATTENTE :
|
||||
RETOURNER table
|
||||
|
||||
RETOURNER NULL
|
||||
```
|
||||
|
||||
### Choix de table pour une nouvelle palette fille
|
||||
|
||||
```
|
||||
FONCTION choisir_table_nouvelle_palette_fille(PK) :
|
||||
|
||||
// TABLE_CENTRE = pivot → maximise la flexibilité
|
||||
SI TABLE_CENTRE == VIDE : RETOURNER TABLE_CENTRE
|
||||
SI TABLE_GAUCHE == VIDE : RETOURNER TABLE_GAUCHE
|
||||
SI TABLE_DROITE == VIDE : RETOURNER TABLE_DROITE
|
||||
|
||||
// Aucune table vide → forcer une évacuation
|
||||
évacuer_table_prioritaire(PK)
|
||||
RETOURNER choisir_table_nouvelle_palette_fille(PK)
|
||||
```
|
||||
|
||||
## Optimisation ping-pong
|
||||
|
||||
Le ping-pong est l'optimisation principale pour le débit. Il n'est
|
||||
possible que lorsque la **palette fille est au centre** : les palettes
|
||||
sources alternent alors entre TABLE_GAUCHE et TABLE_DROITE, de sorte
|
||||
que la palette suivante est déjà en place quand l'opérateur termine.
|
||||
|
||||
```
|
||||
FONCTION choisir_côté_ping_pong(PK) :
|
||||
|
||||
SI TABLE_GAUCHE.état ∈ {PALETTE_SOURCE_EN_PICKING,
|
||||
PALETTE_SOURCE_EN_ATTENTE} :
|
||||
RETOURNER TABLE_DROITE
|
||||
|
||||
SI TABLE_DROITE.état ∈ {PALETTE_SOURCE_EN_PICKING,
|
||||
PALETTE_SOURCE_EN_ATTENTE} :
|
||||
RETOURNER TABLE_GAUCHE
|
||||
|
||||
// Aucun côté occupé → choix arbitraire
|
||||
RETOURNER TABLE_GAUCHE
|
||||
```
|
||||
|
||||
**Recentrage** : si la palette fille est sur un côté (issue d'un
|
||||
picking négatif), le ping-pong est impossible. Si le nombre de
|
||||
PICKING_DIRECT restants ≥ `SEUIL_RECENTRAGE_PF` (défaut : 3), le WMS
|
||||
peut déclencher un mouvement AGV pour recentrer la PF sur
|
||||
TABLE_CENTRE.
|
||||
|
||||
## Évacuation des tables — Priorité
|
||||
|
||||
Lorsqu'aucune table n'est libre et qu'il faut en libérer une :
|
||||
|
||||
```
|
||||
FONCTION évacuer_table_prioritaire(PK) :
|
||||
|
||||
// 1. Palette vide → retrait manuel (pas d'AGV)
|
||||
// 2. Table déjà en attente d'évacuation → attendre AGV
|
||||
// 3. Palette source en attente, non réutilisée par
|
||||
// la prochaine tâche → AGV vers buffer/ASRS
|
||||
// 4. Palette fille en attente → AGV vers image de quai
|
||||
// 5. Palette source en attente (même si réutilisée)
|
||||
// → AGV vers buffer ES
|
||||
```
|
||||
|
||||
## Gestion des buffers ES → PK
|
||||
|
||||
Quand une table se libère au PK, le WMS choisit parmi les palettes en
|
||||
buffer affectées à ce PK :
|
||||
|
||||
- Tri par `Line.CstAtt` **croissant** (plus petit = plus prioritaire)
|
||||
- La première palette compatible avec la table libérée est envoyée
|
||||
|
||||
**Règle critique** : l'ordre de sortie des buffers est dicté par
|
||||
`Line.CstAtt`, **pas** par l'ordre d'arrivée physique en buffer.
|
||||
|
||||
## Palettes multi-commandes
|
||||
|
||||
Une palette source peut être assignée à plusieurs OS.
|
||||
|
||||
Après picking de la commande en cours :
|
||||
|
||||
- Si la palette a encore des tâches pour d'autres OS → marquée
|
||||
`MULTI_COMMANDE`, envoyée vers un buffer ES libre
|
||||
- Elle reste en buffer jusqu'au lancement de l'OS suivant
|
||||
- Une palette multi-commande au PK ou en mouvement compte comme une
|
||||
place buffer occupée dans le calcul de `MAX_PRELOAD_PAR_PK`
|
||||
|
||||
## Priorité d'accès aux buffers entre PK
|
||||
|
||||
Lorsque les buffers ES sont saturés, la priorité est définie par la
|
||||
séquence du mode "Picking" dans `MODES_PKxx`
|
||||
(voir [Modes de travail PK](stations-picking.md)) :
|
||||
|
||||
- Séquence 1 = priorité la plus haute
|
||||
- Quand un buffer se libère → affecté en priorité au PK avec la
|
||||
séquence la plus basse parmi ceux qui ont des palettes en attente
|
||||
|
||||
## Paramètres WMS
|
||||
|
||||
| Paramètre | Description | Défaut |
|
||||
|-----------|-------------|--------|
|
||||
| `MAX_PRELOAD_PAR_PK` | Nombre max de palettes pré-chargées en buffer ES par PK | 3 |
|
||||
| `SEUIL_RECENTRAGE_PF` | Nombre min de PICKING_DIRECT restants pour recentrer la PF au centre | 3 |
|
||||
| `CONTROLE_TRAITEMENT_COMMERCIAL` | Séparer ou non les articles par TC sur les palettes filles | `false` (V1.1) |
|
||||
| `MODES_PKxx` | Modes autorisés + priorité par PK (LIM-69) | — |
|
||||
| `PK_BIGBAG` | Autorise ou non les big-bags par PK (LIM-70) | — |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ La contrainte d'adjacence est **physique** : l'opérateur ne peut pas
|
||||
déplacer de sacs entre TABLE_GAUCHE et TABLE_DROITE directement.
|
||||
|
||||
⚠️ Le picking négatif nécessite 2 tables (palette source + adjacente
|
||||
pour l'excédent), ce qui complique la gestion des cas saturés.
|
||||
|
||||
⚠️ Le recentrage de la palette fille (AGV) n'est déclenché que si
|
||||
suffisamment de tâches de picking direct restent (≥ SEUIL_RECENTRAGE_PF).
|
||||
|
||||
⚠️ L'ordre de sortie des buffers suit `Line.CstAtt`, pas l'ordre FIFO
|
||||
d'entrée en buffer.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
(Aucune identifiée — algorithme V1.0 complet)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création depuis spec "Logique combinatoire picking - PS vers PK - V1.0" |
|
||||
| 2026-05-13 | Arthur | Correction règle déplacement palette (jamais déplacée, ni AGV ni opérateur), ajout jira_ref LIM-82 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| Logique combinatoire picking - PS vers PK - V1.0 | Spécification technique | 27/04/2026 |
|
||||
| [LIM-69](https://easywmsfrance.atlassian.net/browse/LIM-69) | Ticket Jira (modes PK) | 2026 |
|
||||
| [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) | Ticket Jira (Mega Job) | 2026 |
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: "Séquençage TK → PS — Historique et arbitrage"
|
||||
tags: [picking, séquençage, historique, décision]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-84]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-84 LOT2.2 [PICKING] Séquençage des tâches de picking TK PS.md", "REU PICKING SEQUENCAGE 11-05-2026 - Analyse comparative notes + AF + devops.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Séquençage TK → PS — Historique et arbitrage
|
||||
|
||||
> **Résumé** : historique des solutions envisagées pour le séquençage
|
||||
> TK → PS, et arbitrage des contradictions entre les 3 sources
|
||||
> (DevOps #64854, AF §6.4.8, réunion 11/05/2026).
|
||||
|
||||
> Pour l'algorithme retenu, voir
|
||||
> [Séquençage TK → PS](sequencage-tk-ps.md).
|
||||
|
||||
## Solutions envisagées
|
||||
|
||||
### Solution 1 — Process isolé sur finalisation des tâches d'OS
|
||||
|
||||
Séquençage via `OS.Line.CstAtt`, marquage OS traité via
|
||||
`OS.CstAtt = true`.
|
||||
|
||||
**Problème** : pas assez dynamique en cas de recréation de tâches.
|
||||
|
||||
### Solution 2 — Calcul dans le workflow stacker_crane
|
||||
|
||||
Intégration dans `Galileo_StackerCraneSearch_PR` /
|
||||
`StackerCrane_SortTasks_PR`, recalcul complet à chaque exécution.
|
||||
|
||||
**Problème** : complexité élevée (requêtes LINQ imbriquées multi-OS).
|
||||
|
||||
### Solution 3 — Solution 1 transformée en job
|
||||
|
||||
Job planifié, excluant les tâches en cours.
|
||||
|
||||
**Problème** : pas assez réactif par rapport à la cadence des TK.
|
||||
|
||||
### Solution 4 — Process événementiel (retenue)
|
||||
|
||||
Solution 1 déclenchée sur `TaskCreatedEvent` et
|
||||
`OutboundOrderReleasedEvent`, avec verrouillage `OS.CstAtt`.
|
||||
|
||||
**Avantages** : simple, découplée, réactive.
|
||||
|
||||
## Arbitrage des contradictions (réu. 11/05/2026)
|
||||
|
||||
Analyse comparative : DevOps #64854 (le plus ancien), AF §6.4.8
|
||||
(intermédiaire), réunion 11/05/2026 Arthur + Justine + Olivier
|
||||
(fait foi). **Tous les points sont résolus.**
|
||||
|
||||
| Sujet | DevOps | AF | Réunion (fait foi) |
|
||||
|-------|--------|----|--------------------|
|
||||
| Traitement commercial | À creuser | Séparation stricte | **Supprimé** (`false`) |
|
||||
| Seuil picking négatif | Pas de seuil | > 50% | **55% ET poids ≥ 7 kg** |
|
||||
| Poids max palette | 1 200 kg | 1 250 kg | **1 250 kg** (AF) |
|
||||
| Négatif vs Maïs first | Pas de hiérarchie | Maïs en tête | **Négatif prioritaire** |
|
||||
| Semences essais | Dédié en haut | Non mentionné | **Couvert par poids** |
|
||||
| Lots même Bag/pal | Prioriser | — | **Retenu** |
|
||||
| Différenciation marque | Aucune | — | **Confirmé** |
|
||||
| Calcul Bag/pal | "Prendre le max" | Équivalent palette | **Pro rata** |
|
||||
|
||||
## Changelog V1.1 (11/05/2026)
|
||||
|
||||
- Hiérarchie des règles : complétude palette et anti-split
|
||||
prioritaires sur le tri
|
||||
- Picking négatif : condition cumulative poids ≥ 7 kg ajoutée
|
||||
- TC **supprimé** (`CONTROLE_TRAITEMENT_COMMERCIAL = false`)
|
||||
- Calcul remplissage : pro rata Bag/pal (remplace "Bag/pal max")
|
||||
- Poids max palette : 1 250 kg (corrige 1 200 kg du DevOps)
|
||||
- Confirmé : mélange espèces OK, pas de gerbage, 1,90 m max
|
||||
|
||||
## Points non traités (hors scope réunion)
|
||||
|
||||
- Affichage opérateur au PK (consignes, déviation possible)
|
||||
- Picking négatif < 7 kg en option
|
||||
- Messagerie carton (navette du lendemain, zone angle Est)
|
||||
- Verrou réception → recomptage avant picking (AF uniquement)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création — extraction depuis sequencage-tk-ps.md |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-84](https://easywmsfrance.atlassian.net/browse/LIM-84) | Ticket Jira | 2026 |
|
||||
| REU PICKING SEQUENCAGE 11-05-2026 | CR réunion | 11/05/2026 |
|
||||
| DevOps #64854 | Note historique | — |
|
||||
| AF §6.4.8 | Analyse fonctionnelle V1.5 | 28/11/2025 |
|
||||
@@ -0,0 +1,155 @@
|
||||
---
|
||||
title: "Séquençage des tâches de picking TK → PS"
|
||||
tags: [picking, séquençage, transstockeur, événement, workflow, algorithme]
|
||||
status: draft
|
||||
standard_ref: concepts/picking.md
|
||||
jira_refs: [LIM-84, LIM-61]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-84 LOT2.2 [PICKING] Séquençage des tâches de picking TK PS.md", "Logique combinatoire picking - TK vers PS - V1.1.md", "REU PICKING SEQUENCAGE 11-05-2026 - Analyse comparative notes + AF + devops.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Séquençage des tâches de picking TK → PS
|
||||
|
||||
> **Résumé** : algorithme événementiel (V1.1) qui ordonne les tâches
|
||||
> de picking depuis les transstockeurs (TK) vers les postes de sortie
|
||||
> (PS). Il écrit les numéros de séquence `Line.CstAtt` sur chaque
|
||||
> tâche et contrôle le flag `OS.CstAtt` pour autoriser le
|
||||
> stacker_crane.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Picking](../../concepts/picking.md)
|
||||
|
||||
## Déclenchement
|
||||
|
||||
L'algorithme est déclenché sur **deux événements** :
|
||||
|
||||
- **TaskCreatedEvent** — nouvelle tâche de picking créée (MINI JOB
|
||||
LIM-75 ou réassignation). Condition : tâche type PICKING et OS
|
||||
statut Released
|
||||
- **OutboundOrderReleasedEvent** — OS passe en Released (lancement
|
||||
ou relance après arrêt)
|
||||
|
||||
## Process principal
|
||||
|
||||
1. `OS.CstAtt ← false` (verrouille le stacker_crane)
|
||||
2. Récupérer toutes les tâches de picking de l'OS
|
||||
3. Filtrer : tâches **en attente** uniquement (en cours = intouchables)
|
||||
4. Trier selon les 5 critères ci-dessous
|
||||
5. Écrire les séquences `Line.CstAtt`
|
||||
6. `OS.CstAtt ← true` (déverrouille le stacker_crane)
|
||||
|
||||
## Contraintes amont (constitution palettes filles)
|
||||
|
||||
**C1. Palettes les plus complètes possible** — seuil ~95%. Calcul en
|
||||
pro rata Bag/pal : chaque sac = `1/Bag_pal` de son lot. Additif,
|
||||
gère nativement les multi-lots.
|
||||
|
||||
**C2. Ne pas splitter les lignes de stock** — prioritaire sur les
|
||||
règles de tri. Regrouper la ligne complète quitte à décaler le maïs.
|
||||
|
||||
| Contrainte | Valeur |
|
||||
|------------|--------|
|
||||
| Poids max palette | **1 250 kg** |
|
||||
| Hauteur max | 1,90 m |
|
||||
| Gerbage | Interdit |
|
||||
| Mélange espèces | Autorisé |
|
||||
| Traitement commercial | **Désactivé** (V1.1) |
|
||||
|
||||
## Les 5 critères de tri (V1.1)
|
||||
|
||||
```
|
||||
tâches.trier_par(
|
||||
(1) type_picking ASC // NÉGATIF (0) avant DIRECT (1)
|
||||
(2) espèce_maïs ASC // MAÏS (0) avant autres (1)
|
||||
(3) quantité_espèce DESC // espèce la + volumineuse
|
||||
(4) poids_article DESC // article le + lourd en base
|
||||
(5) palette_source // regroupement par palette
|
||||
)
|
||||
```
|
||||
|
||||
### Critère 1 — Picking négatif en premier
|
||||
|
||||
Prioritaire sur tout, y compris Maïs first. Condition cumulative
|
||||
(V1.1) : % quantité > seuil fiche article (défaut 55%) **ET** poids
|
||||
unitaire sac ≥ 7 kg.
|
||||
|
||||
### Critère 2 — Espèce Maïs en premier
|
||||
|
||||
Le maïs est lourd/stable → base de palette fille.
|
||||
|
||||
### Critère 3 — Espèce la plus volumineuse
|
||||
|
||||
Espèce avec la plus grande quantité totale de sacs dans l'OS.
|
||||
|
||||
### Critère 4 — Article le plus lourd en base
|
||||
|
||||
Les semences essais (légères) se retrouvent naturellement en haut.
|
||||
|
||||
### Critère 5 — Regroupement par palette source
|
||||
|
||||
L'opérateur enchaîne toutes les tâches d'une palette avant de la
|
||||
libérer.
|
||||
|
||||
## Écriture des séquences (Line.CstAtt)
|
||||
|
||||
Deux tâches **interchangeables** reçoivent le **même numéro** de
|
||||
séquence (ex-aequo), laissant au stacker_crane la liberté
|
||||
d'optimiser. Interchangeables si : même palette source, OU tous les
|
||||
critères de tri identiques.
|
||||
|
||||
## Détermination picking négatif (MINI JOB LIM-75)
|
||||
|
||||
```
|
||||
SI quantité_à_prélever > seuil_article × quantité_palette_source
|
||||
ET article unique dans la palette source
|
||||
ET pas d'attribut logistique à capturer
|
||||
ET poids_unitaire_sac ≥ 7 kg
|
||||
ALORS → PICKING_NÉGATIF
|
||||
SINON → PICKING_DIRECT
|
||||
```
|
||||
|
||||
## Paramètres WMS
|
||||
|
||||
| Paramètre | Défaut | Note V1.1 |
|
||||
|-----------|--------|-----------|
|
||||
| `CONTROLE_TRAITEMENT_COMMERCIAL` | **false** | Désactivé |
|
||||
| Seuil picking négatif (fiche article) | 55% | Inchangé |
|
||||
| Poids min picking négatif | **7 kg** | Nouveau |
|
||||
| Seuil remplissage palette | **~95%** | Nouveau |
|
||||
| Poids max palette | **1 250 kg** | Corrigé |
|
||||
| `MAX_NB_BUFFER_PK` | 3 | Inchangé |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Le custom LIM-61 (capacité buffer) doit gérer les palettes
|
||||
multi-PK.
|
||||
|
||||
⚠️ En cas d'erreur du process, l'OS reste bloqué (CstAtt = false).
|
||||
|
||||
⚠️ Condition poids ≥ 7 kg : évite l'instabilité palette (gros sacs
|
||||
ramenés sur petits sacs).
|
||||
|
||||
## Liens
|
||||
|
||||
- [Placement PS → PK](placement-ps-pk.md) — algorithme aval
|
||||
- [Picking combinatoire](picking-combinatoire.md) — vue d'ensemble
|
||||
- [Historique et arbitrage](sequencage-tk-ps-historique.md) —
|
||||
solutions envisagées + arbitrage contradictions réunion 11/05/2026
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-84 |
|
||||
| 2026-05-12 | Arthur | Refonte V1.1 : algo complet, 5 critères, contraintes amont, arbitrage réunion 11/05 |
|
||||
| 2026-05-12 | Arthur | Découpage : historique solutions + arbitrage → page dédiée |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-84](https://easywmsfrance.atlassian.net/browse/LIM-84) | Ticket Jira | 2026 |
|
||||
| [LIM-61](https://easywmsfrance.atlassian.net/browse/LIM-61) | Ticket Jira | 2026 |
|
||||
| Logique combinatoire picking - TK vers PS - V1.1 | Spec technique | 11/05/2026 |
|
||||
| REU PICKING SEQUENCAGE 11-05-2026 | CR réunion | 11/05/2026 |
|
||||
@@ -0,0 +1,301 @@
|
||||
---
|
||||
title: "Stations et postes de travail Limagrain"
|
||||
tags: [picking, stations, postes, ilots, buffer]
|
||||
status: draft
|
||||
standard_ref: concepts/stations.md
|
||||
jira_refs: [LIM-69, LIM-70]
|
||||
confluence_refs: []
|
||||
sources: [FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5.docx, "Réception - LIMAGRAIN - DEV - Confluence.md", "Expédition - LIMAGRAIN - DEV - Confluence.md", "LIM-69 - LOT1.3 Modes de travail des PK.md"]
|
||||
last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Stations et postes de travail Limagrain
|
||||
|
||||
> **Résumé** : description des stations de l'entrepôt automatique, des
|
||||
> postes de travail polyvalents (3 îlots × 2 postes) et des buffers associés.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Stations & Routes](../../concepts/stations.md),
|
||||
> [Mechanical Elements](../../concepts/mechanical-elements.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Chez Limagrain, les postes de travail sont **polyvalents** et multi-processus.
|
||||
L'ensemble des opérations (réception, picking, regroupement, échantillonnage,
|
||||
re-certification) se fait sur les mêmes postes physiques, configurables
|
||||
dynamiquement.
|
||||
|
||||
## Cartographie des stations
|
||||
|
||||
### Zone entrée production / sortie expéditions
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| PIE_01 | Poste d'identification 01 (côté quais) |
|
||||
| NAV_01 | Navette 01 |
|
||||
|
||||
### Zone entrée/sortie postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| PIE_02 | Poste d'identification 02 |
|
||||
| PIE_03 | Poste d'identification 03 |
|
||||
| REAC_01 | Poste de reconditionnement 01 |
|
||||
| NAV_02 | Navette 02 |
|
||||
| ET_21, ET_22 | Tables intermédiaires |
|
||||
|
||||
### Zone stockage côté postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| ET_23 à ET_28 | Tables intermédiaires 23 à 28 |
|
||||
| TE_01 à TE_04 | Tables d'entrée 01 à 04 |
|
||||
| TS_01 à TS_04 | Tables de sortie 01 à 04 |
|
||||
|
||||
### Zone stockage côté quais
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| ET_11 à ET_15 | Tables intermédiaires 11 à 15 |
|
||||
| TE/TS_01 à TE/TS_04 | Tables mixtes entrée/sortie 01 à 04 |
|
||||
|
||||
### Zone postes de travail
|
||||
|
||||
| Station | Description |
|
||||
|---------|-------------|
|
||||
| P1 à P6 | Postes de travail 01 à 06 |
|
||||
| TP11 à TP63 | Tables de préparation 11 à 63 |
|
||||
|
||||
## Postes de travail — Architecture physique
|
||||
|
||||
### 3 îlots de 2 postes
|
||||
|
||||
Physiquement, il y a **3 îlots**, chacun composé de **6 tables de préparation
|
||||
(TP)**. Chaque îlot peut être configuré de 2 façons :
|
||||
|
||||
1. **Mode scindé** : 2 postes individuels × 3 TP chacun (mode par défaut)
|
||||
2. ~~**Mode global** : 1 poste × 6 TP (mode « esclave »)~~ **ABANDONNÉ**
|
||||
|
||||
> **MISE À JOUR** : le mode esclave (6 TP) est abandonné au profit d'un
|
||||
> simple **message d'avertissement**. Si le poste adjacent est déjà
|
||||
> ouvert → « Attention, le poste PVx est déjà ouvert. Voulez-vous quand
|
||||
> même ouvrir ? ». L'opérateur peut confirmer ou annuler. Pas de blocage
|
||||
> technique, juste un avertissement.
|
||||
>
|
||||
> **Justification** : les opérateurs sont physiquement à ~2 mètres l'un
|
||||
> de l'autre et peuvent se coordonner verbalement. Les AGV ont des
|
||||
> capteurs de sécurité et demandent l'autorisation de dépose. Trop de cas
|
||||
> complexes à gérer avec un mode esclave custom. L'AGV amène toujours la
|
||||
> palette au centre du PV actif.
|
||||
>
|
||||
> **Développement** : message d'avertissement à l'ouverture du poste,
|
||||
> vérification si le poste conjoint est déjà ouvert (via support présent
|
||||
> ou poste en mode réception), workflow action sur le end process pour
|
||||
> fermer le poste.
|
||||
|
||||
### Numérotation
|
||||
|
||||
```
|
||||
Îlot 1 : P1 (TP11, TP12, TP13) | P2 (TP21, TP22, TP23)
|
||||
Îlot 2 : P3 (TP31, TP32, TP33) | P4 (TP41, TP42, TP43)
|
||||
Îlot 3 : P5 (TP51, TP52, TP53) | P6 (TP61, TP62, TP63)
|
||||
```
|
||||
|
||||
### Spécificités P5 & P6
|
||||
|
||||
Les postes **P5 et P6** sont équipés d'un **palan** pour la manipulation
|
||||
de big-bags. Toute opération impliquant un big-bag (bag/pal ≤ 2) doit
|
||||
être traitée sur P5 ou P6.
|
||||
|
||||
**Picking** : WS PK picking rob en priorité, process RF comme fallback
|
||||
(plus robuste pour picking négatif, multi-tables). Le process de réception
|
||||
est déjà plugué au mode Automatic tasks (custom) → même mode pour le
|
||||
picking et la recertification.
|
||||
|
||||
Voir [Flux expédition — Préparation](../04-outbound/flux-expedition.md#6-préparation-au-poste-de-travail)
|
||||
pour les règles détaillées (arrivée palettes 3 TP, algorithme répartition,
|
||||
ordonnancement par gerbabilité).
|
||||
|
||||
### Modes de travail — Configuration et fonctionnement
|
||||
|
||||
Chaque poste est **polyvalent** et peut être utilisé pour différents flux.
|
||||
Le manager configure les modes autorisés et leur priorité ; l'opérateur
|
||||
ouvre le poste et le WMS gère automatiquement le process en fonction de
|
||||
la palette qui arrive.
|
||||
|
||||
#### Modes disponibles
|
||||
|
||||
| Mode | Correspondance EasyWMS |
|
||||
|------|------------------------|
|
||||
| Picking | Picking |
|
||||
| Réception | Réception |
|
||||
| Regroupement | Consolidation |
|
||||
| Échantillonnage | Inventaire |
|
||||
| Re certification | Picking |
|
||||
|
||||
> ~~Mode esclave (3 ou 6 tables)~~ **ABANDONNÉ** — remplacé par un simple
|
||||
> message d'avertissement poste adjacent (voir section dédiée ci-dessous).
|
||||
|
||||
#### Configuration par le manager (vassist SmartUI)
|
||||
|
||||
Dans la vue des postes de travail, un **bouton d'action "Choix modes de
|
||||
travail"** est disponible à la sélection d'un ou plusieurs PK. Ce bouton
|
||||
ouvre une **vassist** qui permet de :
|
||||
|
||||
- **Cocher/décocher les modes autorisés** parmi les 5 modes ci-dessus
|
||||
- **Définir la priorité** de chaque mode coché via un champ numérique
|
||||
(séquence)
|
||||
|
||||
**Règles de validation** à la soumission :
|
||||
|
||||
- Chaque mode coché doit avoir une priorité renseignée
|
||||
- Un mode non coché ne doit pas avoir de priorité
|
||||
- Au moins un mode doit être coché (pour bloquer un PK, utiliser le
|
||||
bouton standard dédié)
|
||||
|
||||
**Stockage** : la configuration est enregistrée dans un **paramètre
|
||||
SmartUI dédié par PK** au format :
|
||||
|
||||
```
|
||||
MODES_PK01 = "RECEPTION;1|PICKING;2|CONSOLIDATION;3"
|
||||
MODES_PK02 = "RECEPTION;1"
|
||||
```
|
||||
|
||||
Chaque entrée : `MODE;PRIORITÉ` séparés par `|`.
|
||||
|
||||
Cette configuration est utilisée par le
|
||||
[Mega Job d'assignation](job-assignation-pk.md)
|
||||
([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70)) pour
|
||||
déterminer si un PK est éligible à recevoir des tâches d'un flux donné
|
||||
et dans quel ordre de priorité.
|
||||
|
||||
#### Ouverture du poste par l'opérateur (SmartUI)
|
||||
|
||||
L'opérateur accède à **Poste de travail > Station de picking**.
|
||||
L'interface affiche un **bouton "Fermer le poste"** toujours visible.
|
||||
|
||||
Par défaut, le poste fonctionne en **tâche automatique** : le WMS
|
||||
choisit le bon process en fonction de la palette qui arrive ou qui est
|
||||
déjà sur le PK. L'opérateur n'a pas à sélectionner manuellement un mode.
|
||||
|
||||
#### Avertissement poste adjacent
|
||||
|
||||
À chaque ouverture d'un PK, le WMS vérifie si le **poste adjacent** est
|
||||
déjà ouvert (en mode actif). Le mapping des paires est défini dans le
|
||||
paramètre `PK_ADJACENT`.
|
||||
|
||||
**Si le poste adjacent est actif** → message d'avertissement (y compris
|
||||
en mode tâche automatique) :
|
||||
|
||||
> "Attention, le poste [CODE_PK_ADJACENT] est déjà ouvert.
|
||||
> Voulez-vous quand même ouvrir ?"
|
||||
|
||||
- Bouton **Confirmer** : le PK s'ouvre normalement
|
||||
- Bouton **Annuler** : le PK reste inactif
|
||||
|
||||
**Pas de blocage technique** — uniquement informatif. Les opérateurs sont
|
||||
physiquement à ~2 mètres et peuvent se coordonner verbalement. Les AGV
|
||||
ont des capteurs de sécurité et demandent l'autorisation de dépose.
|
||||
|
||||
#### Fermeture du poste
|
||||
|
||||
Le bouton **"Fermer le poste"** est toujours visible quel que soit l'état.
|
||||
Au clic :
|
||||
|
||||
- Le PK est remis en mode **inactif** (aucun mode actif)
|
||||
- Le PK redevient éligible pour une nouvelle assignation par le
|
||||
[Mega Job](job-assignation-pk.md) (sous réserve qu'il n'ait plus de
|
||||
tâches actives)
|
||||
|
||||
#### Paramètres modes de travail
|
||||
|
||||
| Paramètre | Description | Valeur par défaut | Exemple |
|
||||
|-----------|-------------|-------------------|---------|
|
||||
| MODES_PKxx | Modes autorisés + priorité pour le PK xx (un par PK, via vassist) | _(vide)_ | `RECEPTION;1\|PICKING;2` |
|
||||
| PK_ADJACENT | Paires de postes adjacents | _(vide)_ | `PK01;PK02\|PK03;PK04` |
|
||||
|
||||
### Équipement par poste
|
||||
|
||||
- 1 poste léger EasyWMS dupliqué sur 2 écrans
|
||||
- 1 imprimante Zebra (étiquettes HU RFID)
|
||||
- 1 imprimante A4 (étiquettes A4)
|
||||
- 1 douchette multi-format (RFID, QR Code, code à barres)
|
||||
|
||||
## [CUSTOM] Mega Job d'assignation des tâches aux postes
|
||||
|
||||
→ Voir page dédiée : **[Job d'assignation PK](job-assignation-pk.md)**
|
||||
([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70))
|
||||
|
||||
Job unique « chef d'orchestre » qui vérifie les modes de travail pour
|
||||
chaque PK et orchestre l'envoi de tâches via des sous-workflows dédiés
|
||||
(LIM-74, LIM-75). Transverse à tous les flux (réception, picking,
|
||||
regroupement, échantillonnage, re certification).
|
||||
|
||||
## Buffer postes de travail
|
||||
|
||||
16 emplacements palettes au sol le long de l'allée TK_01 :
|
||||
|
||||
| Nb emplacements | Usage |
|
||||
|-----------------|-------|
|
||||
| 14 | Avance pour les processus en cours |
|
||||
| 2 | Piles de palettes vides |
|
||||
|
||||
> ⚠️ 2 emplacements supplémentaires pour palettes rejetées en attente de
|
||||
> libération d'un poste de travail.
|
||||
|
||||
### [CUSTOM] Buffer configurable
|
||||
|
||||
Les emplacements du buffer sont **interchangeables** : un champ « type de
|
||||
fonctionnement » peut être modifié quand l'emplacement est vide.
|
||||
|
||||
### [CUSTOM] Bouton d'évacuation
|
||||
|
||||
Un bouton spécifique sur l'écran EasyWMS permet d'évacuer automatiquement
|
||||
une palette du buffer vers le convoyeur d'entrée pour stockage.
|
||||
|
||||
## Piles de palettes vides par poste
|
||||
|
||||
- **2 piles par îlot de travail** (et non par poste individuel)
|
||||
- Emplacement picking dédié pour réapprovisionnement automatique sur
|
||||
seuil
|
||||
- Aide à la manutention sur chaque poste pour prendre/poser des palettes
|
||||
- [CUSTOM] Bouton WfAction pour demander ou renvoyer une pile —
|
||||
l'opérateur choisit la pile à réapprovisionner parmi une liste
|
||||
|
||||
Voir [Palettes vides](../02-stockage/palettes-vides.md) pour le détail.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Un poste fermé ne peut pas être assigné à un processus.
|
||||
|
||||
⚠️ L'assignation automatique du poste optimise la distance la plus courte.
|
||||
|
||||
⚠️ Si une TP est HS, elle peut être bloquée individuellement sans impacter
|
||||
le reste du poste.
|
||||
|
||||
⚠️ L'entrée côté postes de travail et l'entrée côté quais sont
|
||||
interchangeables manuellement en cas de blocage long terme (bouton de
|
||||
redirection).
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Détail de la gestion des tables de préparation bloquées (@Nicolas)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-05 | Arthur | Création initiale depuis AF V1.5 |
|
||||
| 2026-05-05 | Arthur | Mode esclave abandonné, job transverse, vassist modes, 2 piles/îlot |
|
||||
| 2026-05-05 | Arthur | Cross-ref flux expédition, picking WS vs RF, contrainte Big-Bag |
|
||||
| 2026-05-12 | Arthur | Détail modes de travail (LIM-69) : vassist manager, paramètres MODES_PKxx/PK_ADJACENT, tâche automatique, avertissement adjacent, fermeture poste. Renvoi job vers page dédiée (LIM-70) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| FR-SW-04-07_LIMAGRAIN_Functional_Analysis_V1.5 | Analyse fonctionnelle | 28/11/2025 |
|
||||
| Réception - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| Expédition - LIMAGRAIN - DEV - Confluence | Page ateliers DEV | 2026 |
|
||||
| [LIM-69](https://easywmsfrance.atlassian.net/browse/LIM-69) | Ticket Jira | 2026 |
|
||||
Reference in New Issue
Block a user