Files
mcp-wms-wiki/wiki/limagrain/03-picking/sequencage-tk-ps.md
T
arthur 7496aafe64 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
2026-07-20 12:56:42 +02:00

241 lines
11 KiB
Markdown

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