--- 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, LIM-80, LIM-82] 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", "Jira LIM-84 (commentaires revue de code)"] last_updated: 2026-07-17 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) > **Statut (LIM-84)** : dev terminé, **en attente de déploiement pour > test**. Revue de code validée le **02/07/2026** (après une itération NOK > le 29/06 et corrections le 01/07). ## Déclenchement > **Implémentation définitive (revue de code 02/07/2026)** : le séquençage > est réalisé **pendant l'assignation de stock**, et non sur > `TaskCreatedEvent` comme le proposait la note de conception (Solution 4, > voir [historique](sequencage-tk-ps-historique.md)). Le workflow de séquençage `CST_PickingTasksSequencing_PR` est appelé par les workflows d'assignation de stock : - `Outbound_StockAssignProcess_PR` - assignation de stock (à la libération de l'OS) - `OutboundOrder_StockReassign_PR` - réassignation de stock (imprévu, blocage, relance) La **libération de l'OS** est déclenchée par la subscription `CST_PKAssigned_ReleaseOrder` (WF `CST_OutboundOrder_PKAssigned_ReleaseOrder_PR`) lorsqu'un PK est assigné à l'OS ([LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80)), ce qui déclenche l'assignation de stock. L'assignation/réassignation se fait **par job** (les subscriptions standard sont désactivées, cf. LIM-80). ## 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 > Le `TaskType` (OrdinaryPicking / NegativePicking) est déterminé à la > création des tâches. Conditions **définitives** (revue de code LIM-84) : ``` SI % à prélever ≥ NegativePickingPercent (55% du stock actuel de la source) ET remplissage source ≥ NegativeMinCompletePercent (25% de la capacité pleine) ET palette source mono-lot ET poids_unitaire_sac ≥ 7 kg // check custom Limagrain ALORS → PICKING_NÉGATIF SINON → PICKING_DIRECT ``` - Le picking négatif est désormais **autorisé même si des attributs logistiques sont précisés dans la commande** (levée d'une restriction initiale). - Les 2 conditions de pourcentage sont **standard EasyWMS** (`Outbound_CreatePickingContainerTasksNegative_CheckPercents_PR_V1`) ; seul le check de poids (≥ 7 kg) est custom (`Outbound_CreatePickingContainerTasksNegative_PR_V1` récupère le lot et le poids de l'article). ## Paramètres WMS | Paramètre | Défaut | Note V1.1 | |-----------|--------|-----------| | `CONTROLE_TRAITEMENT_COMMERCIAL` | **false** | Désactivé | | `NegativePickingPercent` (% à prélever du stock actuel) | 55% | Standard | | `NegativeMinCompletePercent` (% remplissage min source) | 25% | Standard, capacité pleine | | Poids min picking négatif | **7 kg** | Custom Limagrain | | Seuil remplissage palette | **~95%** | Nouveau | | Poids max palette | **1 250 kg** | Corrigé | | `MAX_NB_BUFFER_PK` | 3 | Inchangé | ## Implémentation définitive (LIM-84) > Reflète le **code livré et validé** (revue de code du 02/07/2026, après > une itération NOK le 29/06 et corrections le 01/07). Prime sur les notes > de conception ci-dessus en cas d'écart. Le séquençage ne se contente pas de trier : `CST_PickingTasksSequencing_PR` calcule d'abord la **composition des palettes finales** (quels stocks vont sur quelle palette fille, via les records `CST_PickingPalletList` / `CST_PickingStockList`), puis écrit le numéro de séquence (`CstAtt1` de la tâche) sur chaque tâche. Le stacker crane consomme ensuite les tâches via `CST_Tasks_PendingOutboundForStackerCrane`, en respectant le verrou `OS.CstAtt` et l'ordre `Line.CstAtt` croissant. ### Workflows | Workflow | Rôle | |----------|------| | `CST_PickingTasksSequencing_PR` | Calcule la constitution des palettes finales pour les tâches de picking d'un OS selon les critères actifs, puis écrit le numéro de séquence sur chaque tâche. | | `CST_OutboundOrder_PKAssigned_ReleaseOrder_PR` | Libère l'OS (appelé par la subscription `CST_PKAssigned_ReleaseOrder`). | | `Outbound_StockAssignProcess_PR` | Assignation de stock - appelle le séquençage. | | `OutboundOrder_StockReassign_PR` | Réassignation de stock - appelle le séquençage. | | `NegativePicking_CheckAllowsNegativePickingTask_PR` | Conditions picking négatif : palette source **mono-lot** ; négatif autorisé **même si** des attributs logistiques sont précisés dans la commande. | | `Outbound_CreatePickingContainerTasksNegative_PR_V1` | Récupère le lot du stock et le poids de l'article. | | `Outbound_CreatePickingContainerTasksNegative_CheckPercents_PR_V1` | Ajoute la condition de poids unitaire min (≥ 7 kg) aux 2 checks % standard. | ### Records / Lists | Élément | Rôle | |---------|------| | `CST_PickingPalletList` | Palette construite au picking (caractéristiques physiques + stocks), pour le calcul de constitution des palettes finales. | | `CST_PickingStockList` | Stock à prélever au picking et sa tâche, pour le calcul de constitution. | ### Queries et vue | Élément | Rôle | |---------|------| | `CST_PickingStocksToSequence_ByOutboundOrder` | Stocks à prélever d'un OS qui ne font pas déjà partie du séquençage. | | `CST_Tasks_ForView` | Format du `CstAtt1` (numéro de séquence). | | `CST_Tasks_PendingOutboundForStackerCrane` | Tâches en attente pour le stacker crane (corrigée le 29/06 pour les tâches de mouvement - test recertification). | | `TaskVList` (vue) | Ajout de `CstAtt1` : le numéro de séquence est visible dans la vue des tâches. | ### Points confirmés en revue de code - **Recalcul** : les tâches déjà en cours conservent leur séquence ; seules les tâches en attente sont re-séquencées. - **Réassignation après épuisement** : si une réassignation de stock survient alors que toutes les tâches précédentes sont faites, le séquençage repart de 0. L'info de séquence sert **uniquement** à l'ordonnancement. - **Concurrence inter-OS** : plusieurs OS simultanés sur un même PK est **interdit** ; chaque OS a son propre pool de tâches et son propre verrou `OS.CstAtt`. ## 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 | | 2026-07-17 | Arthur | Relecture revue de code LIM-84 (préprod, validée 02/07) : nouvelle section « Implémentation définitive » (WF `CST_PickingTasksSequencing_PR` = constitution palettes + séquence, records `CST_PickingPalletList`/`CST_PickingStockList`, queries `CST_PickingStocksToSequence_ByOutboundOrder` / `CST_Tasks_ForView` / `CST_Tasks_PendingOutboundForStackerCrane`, vue `TaskVList` +CstAtt1) ; déclenchement réel = pendant l'assignation de stock (`Outbound_StockAssignProcess_PR` / `OutboundOrder_StockReassign_PR`) + subscription `CST_PKAssigned_ReleaseOrder`, et non `TaskCreatedEvent` ; conditions picking négatif définitives (mono-lot, autorisé même avec attributs logistiques, poids ≥ 7 kg) + ajout NegativeMinCompletePercent 25% ; points confirmés (recalcul, repart de 0, inter-OS interdit) ; statut préprod | ## Références | Source | Type | Date | |--------|------|------| | [LIM-84](https://easywmsfrance.atlassian.net/browse/LIM-84) | Ticket Jira (séquençage, 5 commentaires, préprod) | 2026-06 → 07 | | [LIM-61](https://easywmsfrance.atlassian.net/browse/LIM-61) | Ticket Jira (capacité PK/buffer) | 2026 | | [LIM-80](https://easywmsfrance.atlassian.net/browse/LIM-80) | Ticket Jira (assignation PK, release OS) | 2026 | | [LIM-82](https://easywmsfrance.atlassian.net/browse/LIM-82) | Ticket Jira (placement PS → PK, consomme Line.CstAtt) | 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 |