lint(limagrain): corrections completes Phase 1+2

- Bloquants: mermaid 03-picking/_index reconstitue (archive 11-05), 13 liens vers pages squelette retires, 2 liens recibles (anoxie, application-dictionary)
- Conventions: 910 em dashes -> tirets simples, 145 checklists -> puces question, 13 questions resolues barrees
- Liens: 9 ancres reparees (slugs GitHub)
- Delta: 12 standard_ref remappes, blocs Standard EasyWMS + sections References ajoutes, front matter complete
- Glossaire: 15 termes standard deplaces en section rappel avec renvoi
- Rapport: limagrain/_lint_report.md (Phase 1 + Phase 2 + re-scan final)
- Inclut les pages des sessions precedentes non commitees + CLAUDE.md et consume.log en l'etat
This commit is contained in:
2026-07-20 12:56:42 +02:00
parent 23eb3f3c84
commit 7496aafe64
59 changed files with 6457 additions and 2023 deletions
@@ -0,0 +1,207 @@
---
title: "Assignation automatique de l'image de quai (OS/Tournée)"
tags: [outbound, expédition, image-quai, stage, job, assignation, AGV]
status: review
standard_ref: concepts/shipping.md
jira_refs: [LIM-94, LIM-88]
confluence_refs: ["Expédition - LIMAGRAIN - DEV"]
sources: ["Jira LIM-94 (lecture directe, 7 commentaires, revue de code)"]
last_updated: 2026-07-17
author: Arthur
---
# Assignation automatique de l'image de quai (OS/Tournée)
> **Résumé** : job périodique qui assigne automatiquement une image de
> quai (poumon d'expédition) aux ordres de sortie (OS) et tournées (RUT)
> éligibles, via un « faux » stage `X_EXP`. Automatise ce qui était une
> assignation manuelle et fournit le stage dont dépend le séquençage
> shipping (LIM-88).
> **Standard EasyWMS** : → voir [Shipping](../../concepts/shipping.md)
> Ce qui suit documente les **spécificités Limagrain** par rapport au
> standard.
## Contexte projet
Par défaut, l'assignation quai + image de quai pour l'expédition est
**manuelle** (voir
[Quais, poumons et chargement](consolidation-chargement.md)). LIM-94
automatise l'assignation de l'**image de quai** aux OS et tournées.
Ce job est **en amont** du
[séquençage shipping par STOP (LIM-88)](sequencage-shipping-stop.md) :
le garde-fou `Outbound_CreateShippingOrLoadTasksToDockOrStage_PR` de
LIM-88 refuse de créer une tâche de chargement tant qu'aucun stage
(image de quai) n'est associé à l'OS. LIM-94 fournit cette association.
## Stages virtuels `X_EXP`
Un OS ou une Route ne peut être assigné qu'à un **« faux » stage** nommé
`X_EXP`, où `X` = code de l'image de quai (`A_EXP` pour l'image de quai
A). Ce sont les **seuls stages assignables** à un OS/Route.
- **Layout** : ajout des stages `A_EXP`, `B_EXP`, ... avec une
**capacité de 26** mais **un seul emplacement**
- **Pourquoi un stage virtuel à 1 emplacement ?** L'assignation doit
porter sur un **emplacement** et non une station. Sans ce stage
virtuel, il faudrait choisir une position précise (1 parmi 26) de
l'image de quai
- **Identification de l'image de quai associée à un stage** : c'est la
**seule image de quai ayant une route vers ce stage** (ex : la seule
route vers `A_EXP` part de l'image de quai A)
## Job `CST_AssignDockStage`
Job `CST_AssignDockStage` → WF `CST_Job_AssignStage`, exécuté **toutes
les 30 secondes**.
Le job récupère les Routes et les OS (OS **hors route**, en excluant les
OS de classe **Recertification**) et tente d'assigner une image de quai :
1. Vérifie via `CST_GetOutboundOrderAndRoutes_ToAssignStage` s'il existe
des ordres à assigner
2. Si oui, cherche les stages disponibles via
`CST_DockStage_GetAvailableStageToAssign`
3. Boucle simple : assigne les ordres un par un jusqu'à épuisement des
ordres ou des stages disponibles
4. La commande d'assignation diffère selon le type (Route ou OS)
**Priorisation** : par **priorité**, puis par **date de libération**.
### Conditions d'éligibilité de l'OS / Route
- **Libéré**
- **Toutes les palettes de picking sont revenues dans le TK** (même
principe que la tâche d'ordonnancement TK)
- Date actuelle à **H-3 de la date d'expédition prévue**
> La query contrôle en pratique : OS Released, non déjà assigné à un
> stage, date d'expédition prévue < 3 h, picking terminé (aucun
> conteneur picking + tous les conteneurs client en APS). Correction
> revue de code (05/06) : utiliser la **date d'expédition prévue** (et
> non la date de chargement prévue) pour les OS.
### Conditions d'assignabilité du stage
Un stage n'est assignable pour expédition que si le **stage virtuel**
`X_EXP` **et** l'**image de quai physique** associée sont libres.
**Stage virtuel `X_EXP`** :
- Non verrouillé
- Aucune tâche vers lui
- Aucun conteneur dessus
- Aucun autre OS, Route **ou réception** assigné
**Image de quai physique** (identifiée par la route qui va vers le
stage virtuel) :
- Non verrouillée
- Aucun conteneur dessus
- Aucune tâche vers elle
Ces contrôles sont portés par la query
`CST_DockStage_GetAvailableStageToAssign`.
## Génération des mouvements (PS → image de quai)
Le placement final vers l'image de quai est calculé au **poste de sortie
(PS)**, pas à l'assignation du stage. Quand un conteneur arrive au PS, le
WF `Container_MovedEventHandler_PS_PR` :
1. Récupère l'image de quai correspondant au stage assigné (la seule
image de quai ayant une route vers ce stage)
2. Change la destination de la tâche vers le **premier emplacement libre
calculé** de l'image de quai : l'emplacement avec le **X le plus
grand** n'ayant ni conteneur ni conteneur en mouvement
> Ce calcul « X le plus grand d'abord » rejoint le sens de dépose décrit
> dans [Quais, poumons et chargement](consolidation-chargement.md)
> (décharger en commençant par l'emplacement le plus éloigné du quai) et
> limite le problème de dépose AGV sur emplacements serrés.
## Désassignation à l'arrêt de l'OS / Route
Quand un OS (ou une Route) ayant une image de quai associée est
**stoppé** (repasse au statut « En attente »), l'association est
**supprimée**.
**Pourquoi ?** Sans cela, l'association peut devenir caduque : ex. image
B choisie, puis 2 jours plus tard, après re-libération, l'image B est
entre-temps réservée par une réception, ce qui pose problème.
- WF `CST_OutboundOrderUnassignStage_PR` : désassigne le stage de l'OS
s'il y en a un **et** que l'OS n'est pas inclus dans une route
- WF `CST_RouteUnassignStage_PR` : désassigne le stage de la route
- Souscription async `CST_OutboundOrderStopped_UnassignStage` sur
l'événement `OutboundOrderSetStoppingOperationEvent`
- Souscription async `CST_RouteStopped_UnassignStage` sur l'événement
`RouteStoppedEvent`
> Correction revue de code (05/06) : ces WF vérifient l'**image de quai**
> et non le quai de chargement.
## Assignation manuelle (VAssist)
L'assignation manuelle reste possible : les vues
`VAssistOutboundOrderAssignDock` et `VAssistRouteAssignDock` sont
restreintes pour n'afficher que les `DockStage` disponibles, selon les
**mêmes critères** que `CST_DockStage_GetAvailableStageToAssign`.
## [CUSTOM] Éléments techniques (revue de code)
> **Statut** : LIM-94 « En cours de test client (préprod) ». Revue de
> code réalisée (Maxime Halgand, Vincent Charvet).
| Élément | Type | Rôle |
|---|---|---|
| Stages `A_EXP`, `B_EXP`, ... | Layout | Stage virtuel par image de quai (capacité 26, 1 emplacement) |
| `CST_DockStage_GetAvailableStageToAssign` | Query | Liste des stages virtuels assignables (contrôle virtuel + image de quai physique) |
| `CST_GetOutboundOrderAndRoutes_ToAssignStage` | Query | Liste unifiée (Id + Description) des OS et Routes éligibles, pour un tri indépendant du type ; exclut la classe Recertification |
| `CST_Job_AssignStage` | WF | Boucle d'assignation, appelée toutes les 30 s |
| `CST_AssignDockStage` | Job | Appelle `CST_Job_AssignStage` toutes les 30 s |
| `Container_MovedEventHandler_PS_PR` | WF | Fin d'ordre au PS : redirige la tâche vers le 1er emplacement libre (X max) de l'image de quai du stage |
| `CST_OutboundOrderUnassignStage_PR` | WF | Désassigne le stage d'un OS stoppé (hors route) |
| `CST_RouteUnassignStage_PR` | WF | Désassigne le stage d'une route stoppée |
| `CST_OutboundOrderStopped_UnassignStage` | Souscription | Async sur `OutboundOrderSetStoppingOperationEvent` |
| `CST_RouteStopped_UnassignStage` | Souscription | Async sur `RouteStoppedEvent` |
| `VAssistOutboundOrderAssignDock` / `VAssistRouteAssignDock` | Vue | Assignation manuelle restreinte aux stages disponibles |
Commits : `f0536cce0c` (stages virtuels + redirection PS + vues),
`e3889b8003` (fix quai désassigné au passage du job + optim query),
`5de1618104` (désassignation à l'arrêt OS/Route).
## Points d'attention
⚠️ Le garde-fou LIM-88
(`Outbound_CreateShippingOrLoadTasksToDockOrStage_PR`) dépend de
l'association de stage posée ici : sans stage assigné, pas de tâche de
chargement, les palettes bloquent aux PS.
⚠️ La désassignation à l'arrêt évite les réservations caduques d'image
de quai (conflit possible avec une réception qui réserverait entre-temps
la même image).
## Questions ouvertes
- Condition « l'image de quai n'a aucune réception assignée » : marquée
**TBD** dans la description initiale. La query intègre bien un contrôle
« aucune réception assignée » sur le stage virtuel ; confirmer le
périmètre exact (@Justine)
→ voir [Questions ouvertes](../08-transverse/questions-ouvertes.md)
## Historique des modifications
| Date | Auteur | Modification |
|------|--------|--------------|
| 2026-07-17 | Arthur | Création depuis LIM-94 (lecture directe + revue de code) : stages virtuels `X_EXP`, job `CST_AssignDockStage`/`CST_Job_AssignStage` (30 s), conditions d'éligibilité OS/Route et d'assignabilité stage, redirection PS `Container_MovedEventHandler_PS_PR` (X max), désassignation à l'arrêt (WF + souscriptions), VAssist restreintes, éléments techniques + commits |
## Références
| Source | Type | Date |
|--------|------|------|
| [LIM-94](https://easywmsfrance.atlassian.net/browse/LIM-94) | Ticket Jira (statut préprod / test client) | 2026-07-17 |
| [LIM-88](https://easywmsfrance.atlassian.net/browse/LIM-88) | Ticket Jira (séquençage shipping, dépend du stage) | 2026 |
| Revue de code LIM-94 (M. Halgand, V. Charvet) | Commits `f0536cce0c` / `e3889b8003` / `5de1618104` | 2026-05/06 |
| Expédition - LIMAGRAIN - DEV | Page Confluence | 2026 |