--- 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 |