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:
@@ -1,11 +1,11 @@
|
||||
---
|
||||
title: "AGV — Vue d'ensemble"
|
||||
title: "AGV - Vue d'ensemble"
|
||||
tags: [agv, still, igo, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-12
|
||||
---
|
||||
|
||||
# AGV — Vue d'ensemble
|
||||
# AGV - Vue d'ensemble
|
||||
|
||||
> **Périmètre** : intégration Still iGo, stations et routes AGV,
|
||||
> jobs AGV spécifiques, troubleshooting.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: "Stations et routes AGV — Topologie iGO"
|
||||
title: "Stations et routes AGV - Topologie iGO"
|
||||
tags: [agv, still, igo, stations, routes, topologie, location, group]
|
||||
status: draft
|
||||
standard_ref: concepts/stations.md
|
||||
@@ -10,7 +10,7 @@ last_updated: 2026-05-12
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Stations et routes AGV — Topologie iGO
|
||||
# Stations et routes AGV - Topologie iGO
|
||||
|
||||
> **Résumé** : correspondance entre les stations/routes EasyWMS et les
|
||||
> concepts Location/Group/Vehicle d'iGO. Configuration dans MyMA vs
|
||||
@@ -25,14 +25,14 @@ author: Arthur
|
||||
Chez Limagrain, les AGV Still (EXV CB iGo) circulent entre les images
|
||||
de quai, les PIE, les postes de picking (PK) et les zones de stockage.
|
||||
La topologie physique (positions, trajets) est gérée **entièrement
|
||||
dans iGO** (MyMA / iGO designer) — EasyWMS ne connaît que les points
|
||||
dans iGO** (MyMA / iGO designer) - EasyWMS ne connaît que les points
|
||||
de départ et d'arrivée.
|
||||
|
||||
## Mapping topologique EasyWMS ↔ iGO
|
||||
|
||||
| Concept EasyWMS | Concept iGO | Notes |
|
||||
|----------------|-------------|-------|
|
||||
| Station (type 65 — AGV) | **Vehicle** | Le véhicule physique lui-même |
|
||||
| Station (type 65 - AGV) | **Vehicle** | Le véhicule physique lui-même |
|
||||
| Location (`IRealLocation`) | **Location** | Point physique avec `possibleActions` |
|
||||
| Route entre stations | _(pas d'équivalent)_ | iGO gère le routage en interne |
|
||||
| WorkingZone | **Group** | Ensemble de Locations (décision tardive) |
|
||||
@@ -61,14 +61,14 @@ Restent dans EasyS :
|
||||
- Création du warehouse station lié à l'AGV equipment group
|
||||
- Déclaration des AGV dans le groupe
|
||||
- Routes EasyWMS **entre stations WMS** (type "External" pour les
|
||||
segments AGV — le manager d'exécution est "External")
|
||||
segments AGV - le manager d'exécution est "External")
|
||||
|
||||
> ⚠️ Pas d'équivalent aux "Routes between stations" de type Galileo
|
||||
> pour iGO. Les routes EasyS servent uniquement à valider l'existence
|
||||
> d'un chemin logique côté WMS avant de créer la tâche AGV — la
|
||||
> d'un chemin logique côté WMS avant de créer la tâche AGV - la
|
||||
> trajectoire physique est résolue par iGO.
|
||||
|
||||
## Décision tardive — utilisation des Groups
|
||||
## Décision tardive - utilisation des Groups
|
||||
|
||||
Cas d'utilisation chez Limagrain :
|
||||
|
||||
@@ -87,7 +87,7 @@ Cas d'utilisation chez Limagrain :
|
||||
|---------|-----|
|
||||
| `LocationLockType` avec flag "For AGV" | `Location.isEnabled = false` |
|
||||
| Lock typé (par erreur extraction, putaway, etc.) | Un seul flag binaire côté iGO |
|
||||
| Lock posé automatiquement par les workflows | À gérer côté WMS uniquement — iGO ne pose pas de lock |
|
||||
| Lock posé automatiquement par les workflows | À gérer côté WMS uniquement - iGO ne pose pas de lock |
|
||||
|
||||
> ⚠️ iGO n'a pas de granularité dans les types de verrous. La
|
||||
> traduction entre les codes erreur EasyWMS (1001-2700) et le flag
|
||||
@@ -104,12 +104,12 @@ ces champs EasyWMS (obligatoires en FIFO compact) sont portés par la
|
||||
Location côté iGO, pas par le transport.
|
||||
|
||||
⚠️ **Modification des Locations via API** : l'API iGO n'expose que
|
||||
`GET /api/locations` — pas de `POST`/`PUT`. Toute modification de
|
||||
`GET /api/locations` - pas de `POST`/`PUT`. Toute modification de
|
||||
topologie passe par MyMA manuellement.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Création/modification de Location via API iGO — actuellement
|
||||
- ❓ Création/modification de Location via API iGO - actuellement
|
||||
en lecture seule, à clarifier avec STILL (@Arthur)
|
||||
|
||||
## Historique des modifications
|
||||
@@ -123,5 +123,5 @@ topologie passe par MyMA manuellement.
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| CR technique iGO STILL v1 | CR technique | 2026-04-28 |
|
||||
| [Stations & Routes standard](../../concepts/stations.md) | Wiki standard | — |
|
||||
| [AGV module standard](../../modules/agv.md) | Wiki standard | — |
|
||||
| [Stations & Routes standard](../../concepts/stations.md) | Wiki standard | - |
|
||||
| [AGV module standard](../../modules/agv.md) | Wiki standard | - |
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: "Troubleshooting AGV — Contraintes terrain"
|
||||
title: "Troubleshooting AGV - Contraintes terrain"
|
||||
tags: [agv, still, igo, terrain, convoyeurs, troubleshooting]
|
||||
status: draft
|
||||
standard_ref: operations/troubleshooting.md
|
||||
@@ -119,11 +119,11 @@ nécessaire pour manoeuvrer.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Confirmation par Still de l'espace max palette/convoyeur ~45 mm
|
||||
- ❓ Confirmation par Still de l'espace max palette/convoyeur ~45 mm
|
||||
(@Théo)
|
||||
- [ ] Mesure réelle SAS7 à effectuer lors de l'implantation
|
||||
- ❓ Mesure réelle SAS7 à effectuer lors de l'implantation
|
||||
(@Abdennaim)
|
||||
- [ ] Solution Still pour augmenter la distance mât/bord palette :
|
||||
- ❓ Solution Still pour augmenter la distance mât/bord palette :
|
||||
quel impact sur les specs AGV (capacité, hauteur de levée) ?
|
||||
(@Cyprien Allard / Still)
|
||||
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
---
|
||||
title: "Mini Job — Images de quai vers poste de travail (PK)"
|
||||
title: "Mini Job - Images de quai vers poste de travail (PK)"
|
||||
tags: [agv, job, réception, pk, mini-job, big-bag]
|
||||
status: draft
|
||||
standard_ref: architecture/galileo-integration.md
|
||||
jira_refs: [LIM-74, LIM-70, LIM-60]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-74 LOT1.3 [AGV][JOB] MINI JOB - images de quai poste de travail (PK).md"]
|
||||
last_updated: 2026-05-12
|
||||
sources: ["LIM-74 LOT1.3 [AGV][JOB] MINI JOB - images de quai poste de travail (PK).md", "Jira LIM-74 (revue de code validée 2026-04-07, relecture 2026-07-17)"]
|
||||
last_updated: 2026-07-17
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Mini Job — Images de quai vers poste de travail (PK)
|
||||
# Mini Job - Images de quai vers poste de travail (PK)
|
||||
|
||||
> **Résumé** : sous-workflow du [Mega Job](../03-picking/job-assignation-pk.md)
|
||||
> qui orchestre l'envoi des palettes depuis les images de quai vers les
|
||||
@@ -38,7 +38,7 @@ pas dans ce sous-workflow.
|
||||
|
||||
> Ce job ne concerne **pas** les réceptions de type Production. Celles-ci
|
||||
> sont envoyées directement vers le PIE de l'ASRS via des supports
|
||||
> virtuels — voir
|
||||
> virtuels - voir
|
||||
> [Job réception production](job-reception-production.md) (LIM-71).
|
||||
|
||||
### Process complet de réception
|
||||
@@ -47,12 +47,12 @@ pas dans ce sous-workflow.
|
||||
|---|-------|--------|
|
||||
| 1 | Déclaration sur l'image de quai | [LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64) |
|
||||
| 2 | **Déplacement AGV → poste de travail** | **LIM-74 (cette page)** |
|
||||
| 3 | Traitement au poste de travail | [LIM-67](https://easywmsfrance.atlassian.net/browse/LIM-67) / [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) |
|
||||
| 4 | Déplacement AGV → table d'entrée (+ filmage) | — |
|
||||
| 3 | Traitement au poste de travail | [LIM-67](https://easywmsfrance.atlassian.net/browse/LIM-67) / [LIM-72](https://easywmsfrance.atlassian.net/browse/LIM-72) (V1 annulé → [LIM-93](https://easywmsfrance.atlassian.net/browse/LIM-93)) |
|
||||
| 4 | Déplacement AGV → table d'entrée (+ filmage) | - |
|
||||
| 5 | Passage PIE | [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) |
|
||||
| 6 | Stockage ou rejet | — |
|
||||
| 6 | Stockage ou rejet | - |
|
||||
| 7 | Clôture de la réception | [LIM-73](https://easywmsfrance.atlassian.net/browse/LIM-73) |
|
||||
| 8 | Libération quai / image de quai | — |
|
||||
| 8 | Libération quai / image de quai | - |
|
||||
|
||||
## Logique principale
|
||||
|
||||
@@ -123,10 +123,22 @@ module AGV/GNA envoie les tâches à la flotte iGo.
|
||||
|-----------|-------------|-------------------|
|
||||
| PK_BIGBAG | Liste des PK compatibles big-bag (séparés par `;`) | _(vide)_ |
|
||||
|
||||
## [CUSTOM] Éléments techniques (revue de code validée 2026-04-07)
|
||||
|
||||
Implémentation définitive (commit `24067c85fc`, statut préprod) :
|
||||
|
||||
| Élément | Type | Rôle |
|
||||
|---------|------|------|
|
||||
| `CST_Reception_BestPendingAssignment_ForPK` | Query | Sélection de la réception à assigner (supports fictifs 8000*, CstAtt06 vide, filtre big-bag, tri big-bag puis FIFO) |
|
||||
| `CST_PickingStationAssignment_Reception_PR` | WF | Génère les tâches pour la réception sélectionnée et assigne les conteneurs au PK. Appelé par le Mega Job [LIM-70](../03-picking/job-assignation-pk.md) |
|
||||
| `CST_PickingStationAssignment_Job` | WF (Mega Job) | Modifié : gestion du paramètre `PK_BIGBAG` + appel de `CST_PickingStationAssignment_Reception_PR` |
|
||||
| `ContainerVList` | Vue | Ajout de la colonne CustomAttribute6 (PK assigné) |
|
||||
| `CST_Container_CustomAttribute6` | Ressource | FR « PK Assigné » / EN « Assigned PK » |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ Un PK compatible big-bag (`PK_BIGBAG`) peut aussi traiter des
|
||||
réceptions sans big-bag — le filtre ne s'applique que dans le sens
|
||||
réceptions sans big-bag - le filtre ne s'applique que dans le sens
|
||||
"big-bag vers PK non compatible".
|
||||
|
||||
⚠️ Toutes les palettes d'une même réception vont vers le **même PK** en
|
||||
@@ -148,11 +160,12 @@ _(aucune question ouverte identifiée dans cette tâche)_
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-74 |
|
||||
| 2026-07-17 | Arthur | Relecture revue de code LIM-74 (validée 07/04, préprod) : section « Éléments techniques » (query `CST_Reception_BestPendingAssignment_ForPK`, WF `CST_PickingStationAssignment_Reception_PR`, Mega Job modifié, vue ContainerVList, ressource `CST_Container_CustomAttribute6`) |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira | 2026 |
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira (Mini Job réception PK) - revue de code validée, préprod | 2026-04-07 |
|
||||
| [LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70) | Ticket Jira (Mega Job) | 2026 |
|
||||
| [LIM-60](https://easywmsfrance.atlassian.net/browse/LIM-60) | Ticket Jira (sous-emplacement auto) | 2026 |
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
---
|
||||
title: "Job AGV — Réception production vers ASRS"
|
||||
title: "Job AGV - Réception production vers ASRS"
|
||||
tags: [agv, job, reception, production, asrs, pie]
|
||||
status: draft
|
||||
standard_ref: architecture/galileo-integration.md
|
||||
jira_refs: [LIM-71, LIM-64, LIM-66]
|
||||
confluence_refs: []
|
||||
sources: ["LIM-71 LOT1.2 RECEPTION PRODUCTION AGV Job de création des tâches images de quai ASRS.md"]
|
||||
last_updated: 2026-05-12
|
||||
last_updated: 2026-07-17
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Job AGV — Réception production vers ASRS
|
||||
# Job AGV - Réception production vers ASRS
|
||||
|
||||
> **Résumé** : job périodique (30 s) qui crée les tâches de déplacement
|
||||
> AGV depuis les images de quai vers le buffer d'entrée production
|
||||
> (alimentant le PIE de l'ASRS). Concerne uniquement les réceptions
|
||||
> production (CstAtt04 = "ASN").
|
||||
> AGV depuis les images de quai vers le PIE de l'ASRS, via les stratégies
|
||||
> de rangement. Concerne les réceptions production (CstAtt04 = "ASN") et
|
||||
> les piles de palettes vides (code `PAL`).
|
||||
|
||||
> **Standard EasyWMS** : → voir
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md),
|
||||
@@ -25,6 +25,12 @@ author: Arthur
|
||||
|
||||
## Contexte projet
|
||||
|
||||
> **Statut (LIM-71)** : en préprod (test client). Revues de code validées
|
||||
> le 27/03/2026, le 28/04/2026 (ajout piles de palettes) et le 01/07/2026
|
||||
> (ajout job de régénération). Deux tentatives ont été **annulées en cours
|
||||
> de dev** : le marquage `CstAtt06` (abandonné, cf. plus bas) et la condition
|
||||
> `CstAtt12` sur les conteneurs production (non requise : pas d'étiquette).
|
||||
|
||||
Dans le flux de réception production, les palettes arrivent de la
|
||||
production (ou de l'ancien magasin) et vont **directement dans l'ASRS**
|
||||
sans passer par un poste de travail. Elles sont déchargées par un
|
||||
@@ -72,39 +78,82 @@ sequenceDiagram
|
||||
|
||||
## Logique d'éligibilité
|
||||
|
||||
Le job parcourt tous les supports positionnés sur des images de quai.
|
||||
Un support est éligible si **toutes** les conditions suivantes sont
|
||||
réunies :
|
||||
Le job parcourt tous les conteneurs positionnés sur des **stages d'image de
|
||||
quai** (`LocationType.DockStage`). Un conteneur est éligible si **toutes**
|
||||
les conditions suivantes sont réunies :
|
||||
|
||||
| Condition | Détail |
|
||||
|-----------|--------|
|
||||
| Séquence 8000* | Support fictif créé lors de la déclaration image de quai ([LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)) |
|
||||
| Emplacement = DockStage | Conteneur posé sur un stage d'image de quai |
|
||||
| Code `8000*` **ou** `PAL*` | Support fictif production (séq. 8000, [LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)) **ou** pile de palettes vides (`PAL`) |
|
||||
| CstAtt04 = "ASN" | Support de type production |
|
||||
| CstAtt06 vide | Pas encore traité par ce job |
|
||||
| Aucune tâche active | Statuts actifs = Bloqué, Créé, En attente, En attente d'annulation, En cours. Statuts historiques (ignorés) = Annulé, Terminé |
|
||||
| Aucune tâche active | `!c.Tasks.Any()` - aucun ordre de mouvement rattaché au conteneur |
|
||||
|
||||
La double vérification CstAtt06 + absence de tâche active est une
|
||||
**sécurité anti-doublon**.
|
||||
> **Reversal marquage CstAtt06** : la logique initiale prévoyait de marquer
|
||||
> `CstAtt06` = destination pour éviter les doublons. Décidé en interne
|
||||
> (19/03/2026) de **ne pas l'implémenter** : l'absence de tâche active suffit
|
||||
> comme anti-doublon, et ne pas marquer `CstAtt06` permet de **regénérer** une
|
||||
> tâche de rangement au prochain cycle si la précédente a été annulée. Ce job
|
||||
> **n'utilise donc pas** `CstAtt06`.
|
||||
>
|
||||
> **Reversal condition CstAtt12** : une condition `CstAtt12 = true` (étiquette
|
||||
> posée) a été ajoutée puis **retirée** pour la production et les piles de
|
||||
> palettes - ces conteneurs n'ont pas d'étiquette. `CstAtt12` ne conditionne
|
||||
> que les réceptions **fournisseur** vers les PK.
|
||||
|
||||
## Traitement d'un support éligible
|
||||
## Traitement d'un conteneur éligible
|
||||
|
||||
### Marquage
|
||||
|
||||
Le job positionne `CstAtt06` = valeur du paramètre
|
||||
`DESTINATION_PRODUCTION` (ex : "ENTREE_PRODUCTION").
|
||||
|
||||
### Création de la tâche
|
||||
Pour chaque conteneur récupéré, le job effectue une **recherche
|
||||
d'emplacement** basée sur les **stratégies de rangement** configurées, puis
|
||||
génère la tâche de rangement si un emplacement est trouvé.
|
||||
|
||||
| Champ | Valeur |
|
||||
|-------|--------|
|
||||
| Origine | Sous-emplacement de l'image de quai |
|
||||
| Destination | Déterminée par la **stratégie de rangement** configurée (MU d'entrée Est ou Ouest, Est par défaut) |
|
||||
| Origine | Stage de l'image de quai |
|
||||
| Destination | Déterminée par la **stratégie de rangement** (PIE_01 / PIE_02, entrée Est ou Ouest, **Est par défaut**) |
|
||||
| Statut initial | "En attente" |
|
||||
|
||||
Les stratégies sont importées et configurées via la vue standard
|
||||
`LocationPutawayStrategyVList`, modifiée pour autoriser les **stages** comme
|
||||
station d'origine (type Stage, ou un stage précis). Les stratégies vont des
|
||||
stages vers PIE_01 / PIE_02 en « fin de séquence ».
|
||||
|
||||
Le passage "en attente" → "créé" est géré par le WMS standard
|
||||
(`Task_GenerateMovementJob_PR`). Le module AGV / GNA écoute ce
|
||||
changement et envoie les tâches à la flotte iGo.
|
||||
|
||||
### Éléments AD (LIM-71)
|
||||
|
||||
| Élément AD | Type | Rôle |
|
||||
|------------|------|------|
|
||||
| `CST_StoreProductionContainer_Job` | Workflow + Job (30 s) | Récupère les conteneurs via la query, cherche un emplacement pour chacun et génère la tâche de rangement si trouvé |
|
||||
| `CST_AvailableProductionContainers` | Query | Récupère les conteneurs candidats : sur DockStage, `CstAtt04 = "ASN"`, code `8000*` ou `PAL*`, sans tâche active |
|
||||
| `LocationPutawayStrategyVList` | Vue | Ajout des stages dans la liste des stations d'origine (sélection type Stage ou stage précis) |
|
||||
| `Galileo_PIEEventHandler_PR` | Workflow | Ignore l'erreur de lecture d'étiquette au PIE quand il s'agit d'une pile de palettes |
|
||||
|
||||
## Piles de palettes vides
|
||||
|
||||
Le job gère aussi le rangement des **piles de palettes vides** (conteneurs
|
||||
dont le code commence par `PAL`). Elles suivent le même mécanisme
|
||||
(query + stratégie de rangement + tâche AGV). Au PIE, l'erreur de lecture
|
||||
d'étiquette est ignorée pour ces piles (`Galileo_PIEEventHandler_PR`).
|
||||
|
||||
## Job de régénération des tâches réception → PK
|
||||
|
||||
En complément (ajouté sous LIM-71, revue de code OK 01/07/2026), un job
|
||||
distinct **régénère** les tâches manquantes pour les conteneurs de réception
|
||||
**fournisseur** qui ont un PK assigné mais aucune tâche.
|
||||
|
||||
| Élément AD | Type | Rôle |
|
||||
|------------|------|------|
|
||||
| `CST_Reception_RegenerateTask_Job` | Workflow + Job (15 s) | Crée une tâche pour les conteneurs de réception (`CstAtt08`) avec un PK assigné (`CstAtt06`) posés sur une image de quai sans tâche. Vérifie que la station de picking est trouvée |
|
||||
| `CST_ReceptionContainers_WithoutTasksToPK` | Query | Récupère ces conteneurs de réception sans tâche vers leur PK |
|
||||
|
||||
> Ce job de régénération relève du flux **réception fournisseur → PK**
|
||||
> (cf. [Réception fournisseur](../01-inbound/reception-fournisseur.md),
|
||||
> LIM-67 / LIM-74) et non de la réception production. Il confirme l'usage de
|
||||
> `CstAtt06` = code du PK assigné côté réception fournisseur.
|
||||
|
||||
## Redirection si PIE saturé
|
||||
|
||||
Gérée en **standard** par le système de routes et distances configuré
|
||||
@@ -124,37 +173,39 @@ destination ; c'est le WMS qui reroute si nécessaire.
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| DESTINATION_PRODUCTION | Code du buffer d'entrée production (destination des tâches AGV) | ENTREE_PRODUCTION |
|
||||
| ~~DESTINATION_PRODUCTION~~ | ~~Code du buffer d'entrée production~~ - **obsolète** : la destination est désormais déterminée par les stratégies de rangement, plus par ce paramètre | ~~ENTREE_PRODUCTION~~ |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
- Un support non ASN (fournisseur, intersite, retour) sur une image
|
||||
de quai est **ignoré** — il est géré par le
|
||||
de quai est **ignoré** - il est géré par le
|
||||
[Mega Job](../03-picking/job-assignation-pk.md) (LIM-70)
|
||||
- Le marquage CstAtt06 a été simplifié en cours de développement
|
||||
(certains cas de tests marqués "Plus utilisé") — la vérification
|
||||
par absence de tâche active reste la sécurité principale
|
||||
- La stratégie de rangement détermine l'entrée Est/Ouest ; le
|
||||
paramètre DESTINATION_PRODUCTION n'est plus directement utilisé
|
||||
comme destination de tâche
|
||||
- Ce job **n'utilise pas** `CstAtt06` (marquage abandonné) : l'anti-doublon
|
||||
repose uniquement sur l'absence de tâche active, ce qui permet la
|
||||
régénération après annulation
|
||||
- La stratégie de rangement détermine l'entrée Est/Ouest (Est par défaut) ;
|
||||
le paramètre `DESTINATION_PRODUCTION` est **obsolète**
|
||||
- Les piles de palettes vides (`PAL*`) sont traitées par le même job ;
|
||||
l'erreur de lecture d'étiquette au PIE est ignorée pour ces piles
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Redirection multi-poumons / multi-PIE : config EasyS prête ?
|
||||
- ❓ Redirection multi-poumons / multi-PIE : config EasyS prête ?
|
||||
(@Nicolas)
|
||||
- [ ] CstAtt06 encore nécessaire comme marqueur si la vérification
|
||||
par tâche active suffit ? (@Fabien)
|
||||
- ~~CstAtt06 encore nécessaire comme marqueur ?~~ → **Résolu (LIM-71)** :
|
||||
marquage CstAtt06 abandonné, l'absence de tâche active suffit.
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-71 |
|
||||
| 2026-07-17 | Arthur | Relecture 18 commentaires : abandon marquage CstAtt06 (anti-doublon = tâche active), destination via stratégies de rangement (DESTINATION_PRODUCTION obsolète), gestion piles de palettes (PAL), reversal CstAtt12 (non requis production), éléments AD (CST_StoreProductionContainer_Job, CST_AvailableProductionContainers, LocationPutawayStrategyVList, Galileo_PIEEventHandler_PR), job régénération CST_Reception_RegenerateTask_Job, statut préprod + 3 revues de code |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-71](https://easywmsfrance.atlassian.net/browse/LIM-71) | Ticket Jira | 2026 |
|
||||
| [LIM-71](https://easywmsfrance.atlassian.net/browse/LIM-71) | Ticket Jira (18 commentaires) | 2026-03 → 2026-07 |
|
||||
| [LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64) | Ticket Jira (déclaration image quai) | 2026 |
|
||||
| [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) | Ticket Jira (passage PIE) | 2026 |
|
||||
| [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) | Ticket Jira (passage PIE) | 2026 |
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
---
|
||||
title: "Intégration Still iGo — API PACS et architecture"
|
||||
title: "Intégration Still iGo - API PACS et architecture"
|
||||
tags: [agv, still, igo, pacs, api, integration, architecture]
|
||||
status: draft
|
||||
standard_ref: modules/agv.md
|
||||
jira_refs: []
|
||||
jira_refs: [LIM-103, LIM-104]
|
||||
confluence_refs: []
|
||||
sources: ["CR technique - iGO STILL - fonctionnement et flux API + correspondance avec le module AGV EasyWMS Opus 4.7 v1.md"]
|
||||
last_updated: 2026-05-12
|
||||
sources: ["CR technique - iGO STILL - fonctionnement et flux API + correspondance avec le module AGV EasyWMS Opus 4.7 v1.md", "Jira LIM-103 (lecture directe 2026-07-20)", "Jira LIM-104 (lecture directe 2026-07-20)"]
|
||||
last_updated: 2026-07-20
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# Intégration Still iGo — API PACS et architecture
|
||||
# Intégration Still iGo - API PACS et architecture
|
||||
|
||||
> **Résumé** : documentation complète de l'intégration du fleet manager
|
||||
> **iGO easy** (STILL / KION Group) avec EasyWMS chez Limagrain.
|
||||
@@ -18,20 +18,20 @@ author: Arthur
|
||||
> avec le module AGV standard, l'architecture cible à 4 composants et
|
||||
> les réponses FAQ STILL contractuelles.
|
||||
|
||||
> **Standard EasyWMS** : → voir [AGV — Automated Guided Vehicles](../../modules/agv.md)
|
||||
> **Standard EasyWMS** : → voir [AGV - Automated Guided Vehicles](../../modules/agv.md)
|
||||
> Le standard communique par **tables d'échange DB** (EAG/AGE/AGS).
|
||||
> Chez Limagrain, iGO easy remplace le protocole historique par une
|
||||
> **API REST HTTPS** — un middleware (pool IIS C#) assure la traduction.
|
||||
> **API REST HTTPS** - un middleware (pool IIS C#) assure la traduction.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Limagrain utilise des AGV **Still EXV CB iGo** (gerbeurs électriques
|
||||
automatisés) pour les transports internes entre images de quai, PIE,
|
||||
postes de picking et zones de stockage. Le fleet manager est
|
||||
**iGO easy** (variante simplifiée de PACS — Productized Automated
|
||||
**iGO easy** (variante simplifiée de PACS - Productized Automated
|
||||
Concept Solutions), motorisé par le moteur interne **E'tricc**.
|
||||
|
||||
La communication est **100 % REST HTTPS** (port 7002, TLS 1.2) — pas
|
||||
La communication est **100 % REST HTTPS** (port 7002, TLS 1.2) - pas
|
||||
de PLC ni de tables d'échange SQL directes entre WMS et iGO. Le modèle
|
||||
est **pull + push** : le WMS pousse les ordres (`POST /transports`),
|
||||
iGO pousse les changements d'état via webhook (callback POST vers une
|
||||
@@ -63,14 +63,14 @@ flowchart LR
|
||||
Concepts clés :
|
||||
|
||||
- Pas de notion de routes/segments côté WMS : iGO ne demande qu'une
|
||||
`sourceLocation` et une `destinationLocation` — la trajectoire
|
||||
`sourceLocation` et une `destinationLocation` - la trajectoire
|
||||
physique est gérée par iGO en interne.
|
||||
- **Décision tardive** (Group / decision point) : si la destination
|
||||
exacte est inconnue à la création, on donne un `destinationGroupId`.
|
||||
iGO place le transport en `RequestDestination` et interroge le WMS
|
||||
quand l'AGV arrive au point de décision.
|
||||
- **Load** = container EasyWMS — passé directement dans le payload de
|
||||
création du transport (pas de `POST /api/loads` préalable — FAQ #5).
|
||||
- **Load** = container EasyWMS - passé directement dans le payload de
|
||||
création du transport (pas de `POST /api/loads` préalable - FAQ #5).
|
||||
|
||||
## Stack technique iGO (MyMA)
|
||||
|
||||
@@ -92,9 +92,9 @@ Concepts clés :
|
||||
| API Host (HTTPS REST) | **7002** |
|
||||
| Postgres | 5432 |
|
||||
|
||||
## Véhicule — Still EXV CB iGo
|
||||
## Véhicule - Still EXV CB iGo
|
||||
|
||||
Gerbeur électrique automatisé (EXV = Elektro-Vertikal) — se déplace
|
||||
Gerbeur électrique automatisé (EXV = Elektro-Vertikal) - se déplace
|
||||
sur ses propres roues et lève la charge avec le mât. Pas de couloir
|
||||
mécanique ni de canal compact.
|
||||
|
||||
@@ -118,7 +118,7 @@ L'API PACS 2.3 expose **8 ressources** :
|
||||
| **LoadType** | `ContainerType` | Catalogue de types de charge |
|
||||
| **Location** | `Location` (`IRealLocation`) | Point physique du warehouse |
|
||||
| **Group** | `WorkingZone` | Ensemble de locations (décision tardive) |
|
||||
| **System** | — | État global + abonnements |
|
||||
| **System** | - | État global + abonnements |
|
||||
|
||||
### Champs clés du Transport
|
||||
|
||||
@@ -130,7 +130,7 @@ L'API PACS 2.3 expose **8 ressources** :
|
||||
| `destinationLocationId` / `destinationGroupId` | string | `UnloadLocation` |
|
||||
| `load` | Load | Container (`PalletId`, type, dimensions) |
|
||||
| `priority` | int 0-10 | Priority 0-4 (conversion inversée) |
|
||||
| `suspended` | bool | (pas d'équivalent — `false` par défaut) |
|
||||
| `suspended` | bool | (pas d'équivalent - `false` par défaut) |
|
||||
| `customMetaData` | dict | `HasTopper`, `PalletType`, etc. |
|
||||
| `status` | enum | `AgvStatus` (mapping § ci-dessous) |
|
||||
|
||||
@@ -183,7 +183,7 @@ Tous sur `https://[IP]:7002/api/...` avec header `X-API-Key`.
|
||||
| GET | `/api/system` | Status global + subscriptions |
|
||||
| GET | `/api/groups` / `/{id}` | Lecture des groupes |
|
||||
| GET | `/api/loads` / `/{id}` | Lecture des loads |
|
||||
| POST | `/api/loads` | Créer une load (non recommandé — FAQ #5) |
|
||||
| POST | `/api/loads` | Créer une load (non recommandé - FAQ #5) |
|
||||
| GET | `/api/locations` / `/{id}` | Lecture des locations |
|
||||
| GET | `/api/load-types` | Catalogue des types |
|
||||
|
||||
@@ -222,7 +222,7 @@ flowchart TD
|
||||
|
||||
États terminaux : **Finished**, **Cancelled**, **Aborted**.
|
||||
|
||||
> ⚠️ Le statut `New` est un état interne instantané d'iGO — il
|
||||
> ⚠️ Le statut `New` est un état interne instantané d'iGO - il
|
||||
> n'apparaît jamais dans les callbacks. Le premier état observable est
|
||||
> `Requested` (FAQ #4).
|
||||
|
||||
@@ -230,17 +230,17 @@ flowchart TD
|
||||
|
||||
| iGO Transport.status | Phase AGV EasyWMS | AgvStatus | Notes |
|
||||
|---------------------|-------------------|-----------|-------|
|
||||
| Requested | — | (après POST) | Premier état observable |
|
||||
| Requested | - | (après POST) | Premier état observable |
|
||||
| Pending | 100 (Order accepted) | `Sent` | En file d'attente iGO |
|
||||
| Assigned | 103 (Vehicle assigned) | (Sent) | ⚠️ Pas de Vehicle.id dans le payload (FAQ #1) |
|
||||
| RequestSource | 104 (Load permission) | `PendingToBeLoad` | Uniquement en mode Group |
|
||||
| Retrieving | — | (Sent) | AGV en route / chargement |
|
||||
| Retrieving | - | (Sent) | AGV en route / chargement |
|
||||
| Retrieved | 106 (Load confirmed) | (Sent) | **Vehicle.id disponible ici** (FAQ #1) |
|
||||
| RequestDestination | 108 (Unload permission) | `PendingToBeUnload` | Uniquement en mode Group |
|
||||
| Storing | — | — | AGV en dépose |
|
||||
| Storing | - | - | AGV en dépose |
|
||||
| Stored / Finished | 110 (Unload confirmed) | (purge) | Transport terminé |
|
||||
| Cancelled | 255 | (Cancelled) | Annulé |
|
||||
| Aborted | 255 | (Cancelled) | Erreur irrécupérable — aucun code d'erreur dans le payload (FAQ #2) |
|
||||
| Aborted | 255 | (Cancelled) | Erreur irrécupérable - aucun code d'erreur dans le payload (FAQ #2) |
|
||||
|
||||
### Différence sémantique majeure : CanPick / CanDrop
|
||||
|
||||
@@ -258,13 +258,13 @@ l'usage de Groups** (même mono-location) là où EasyWMS aurait
|
||||
|
||||
| EasyWMS | iGO | Suggestion |
|
||||
|---------|-----|------------|
|
||||
| 0 — Urgent | 10 — Highest | mapping direct |
|
||||
| 1 — High | 8 | |
|
||||
| 2 — Normal | 5 | |
|
||||
| 3 — Low | 3 | |
|
||||
| 4 — VeryLow | 1 | |
|
||||
| 0 - Urgent | 10 - Highest | mapping direct |
|
||||
| 1 - High | 8 | |
|
||||
| 2 - Normal | 5 | |
|
||||
| 3 - Low | 3 | |
|
||||
| 4 - VeryLow | 1 | |
|
||||
|
||||
## Flux nominal — création et exécution
|
||||
## Flux nominal - création et exécution
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -322,14 +322,14 @@ intervenir manuellement.
|
||||
|
||||
### Authentification
|
||||
|
||||
**`X-API-Key`** (confirmé par STILL — FAQ #8). Le header
|
||||
**`X-API-Key`** (confirmé par STILL - FAQ #8). Le header
|
||||
`Authorization: Bearer` mentionné dans certaines parties de la doc
|
||||
PACS est obsolète. La clé est fixe, fournie par le PM STILL, stockée
|
||||
chiffrée dans la config du middleware.
|
||||
|
||||
### TLS
|
||||
|
||||
HTTPS avec TLS 1.2. Certificats **auto-signés** côté iGO — le WMS
|
||||
HTTPS avec TLS 1.2. Certificats **auto-signés** côté iGO - le WMS
|
||||
doit les truster explicitement (import dans le keystore).
|
||||
|
||||
### Modèle d'abonnement
|
||||
@@ -372,7 +372,7 @@ déduplication = `transport.id + status` (FAQ #9).
|
||||
| Auth load | EAG `Update` (CanPick=true) | `POST /final-source` |
|
||||
| Auth unload | EAG `Update` (CanDrop=true) | `POST /final-destination` |
|
||||
|
||||
## Architecture cible — Pattern à 4 composants
|
||||
## Architecture cible - Pattern à 4 composants
|
||||
|
||||
### Principe directeur
|
||||
|
||||
@@ -401,7 +401,7 @@ flowchart LR
|
||||
AGS[(AGV_AGS)]
|
||||
end
|
||||
|
||||
subgraph Pool["Pool IIS C# .NET 8 — À DÉVELOPPER"]
|
||||
subgraph Pool["Pool IIS C# .NET 8 - À DÉVELOPPER"]
|
||||
Pump[Pompe sortante<br/>poll OUTPUTQUEUE → API iGO]
|
||||
Hook[Webhook receiver<br/>callbacks iGO → tables]
|
||||
end
|
||||
@@ -420,7 +420,7 @@ flowchart LR
|
||||
Hook --> IQ & AGE & AGS
|
||||
```
|
||||
|
||||
### Composants existants — RIEN à modifier
|
||||
### Composants existants - RIEN à modifier
|
||||
|
||||
| Composant | Rôle | Statut |
|
||||
|-----------|------|--------|
|
||||
@@ -429,7 +429,7 @@ flowchart LR
|
||||
| Tables AGV_* (5) | Base intermédiaire | ✅ Existantes |
|
||||
| Vues SmartUI AGV | Monitoring opérateur | ✅ Existantes |
|
||||
|
||||
### Middleware pool IIS — seul livrable nouveau
|
||||
### Middleware pool IIS - seul livrable nouveau
|
||||
|
||||
| Aspect | Description |
|
||||
|--------|-------------|
|
||||
@@ -452,18 +452,18 @@ Controller ASP.NET Core exposant deux endpoints HTTPS. À réception :
|
||||
insert dans `AGV_INPUTQUEUE` → insert dans `AGV_AGE` ou `AGV_AGS`
|
||||
avec le mapping Status → EventType/Flags (cf. tableau ci-dessous).
|
||||
Horodatage `DateTime.UtcNow` à la réception (iGO ne fournit pas de
|
||||
timestamp — FAQ #3).
|
||||
timestamp - FAQ #3).
|
||||
|
||||
### Mapping Status iGO → (EventType, Flags) AGE
|
||||
|
||||
| iGO Transport.status | EventType | Flags | Notes |
|
||||
|---------------------|-----------|-------|-------|
|
||||
| Pending | 100 | 0 | Order accepted |
|
||||
| Assigned | 103 | 0 | Vehicle assigned — `StationNumber=null` (FAQ #1) |
|
||||
| Retrieved | 106 | 0 | Load confirmed — `Vehicle.id` disponible ici |
|
||||
| Assigned | 103 | 0 | Vehicle assigned - `StationNumber=null` (FAQ #1) |
|
||||
| Retrieved | 106 | 0 | Load confirmed - `Vehicle.id` disponible ici |
|
||||
| Stored / Finished | 110 | 0 | Unload confirmed |
|
||||
| Cancelled | 255 | 0 | Annulé |
|
||||
| Aborted | — | 2003/2004 | À enrichir via `GET /api/vehicles/{id}` (FAQ #2) |
|
||||
| Aborted | - | 2003/2004 | À enrichir via `GET /api/vehicles/{id}` (FAQ #2) |
|
||||
|
||||
### Pattern de boot du middleware
|
||||
|
||||
@@ -471,7 +471,7 @@ timestamp — FAQ #3).
|
||||
|
||||
1. Vérifier la base intermédiaire accessible
|
||||
2. Vérifier l'API iGO : `GET /api/system`
|
||||
3. Vérifier les subscriptions actives — (re)créer si absentes
|
||||
3. Vérifier les subscriptions actives - (re)créer si absentes
|
||||
4. Réconcilier les transports : `GET /api/transports` vs
|
||||
`AGV_OUTPUTQUEUE` non acquittées → générer les lignes AGE manquantes
|
||||
5. Démarrer le polling sortant
|
||||
@@ -487,6 +487,46 @@ le status iGO courant :
|
||||
fallback (attendre Finished + tâche retour, ou RFT)
|
||||
- **Cancelled / Aborted / Finished** → no-op (déjà terminal)
|
||||
|
||||
### Refus WMS de l'annulation quand le support est sur un AGV (LIM-104)
|
||||
|
||||
> **Statut** : préprod ; revue de code validée le 23/06/2026 (Vincent Charvet).
|
||||
|
||||
**Problème** (découvert aux tests STILL) : si on annule / supprime une Task
|
||||
AGV alors que le support est **déjà pris par l'AGV** (transport iGO
|
||||
`>= Retrieved`), iGO **refuse** l'annulation et termine physiquement la
|
||||
mission - mais le WMS a déjà **supprimé la Task** au moment de la demande.
|
||||
`ProcessEvents_PR` s'arrête alors sur sa garde `CST Get Task` (« CST Task
|
||||
exists » = false) pour toutes les AGE suivantes :
|
||||
|
||||
- l'AGE `255/1009` ne déclenche jamais `ProcessError1009` → **notification
|
||||
opérateur du refus perdue** ;
|
||||
- l'AGE `110` (Unload confirmed) ne déclenche jamais `ContainerMove` →
|
||||
**support figé sur l'AGV**.
|
||||
|
||||
**Solution** : souscription **preview** sur la commande de suppression /
|
||||
annulation de Task. Avant exécution :
|
||||
|
||||
1. récupérer le support (container) associé à la Task ;
|
||||
2. vérifier s'il est sur un AGV - critère retenu `Container.StationType ==
|
||||
Agv` (équivalent métier de « palette physiquement sur l'AGV » = iGO
|
||||
`>= Retrieved` ; repli possible : `LocationCode` commençant par `AGV_`) ;
|
||||
3. si **sur AGV** → **refuser** la commande (exception) avec message
|
||||
opérateur explicite. La Task reste vivante, l'AGV termine sa mission, le
|
||||
support est livré à destination ;
|
||||
4. sinon (support encore à la source ou déjà déposé) → laisser la commande
|
||||
s'exécuter normalement.
|
||||
|
||||
| Élément AD | Type | Rôle |
|
||||
|-----------|------|------|
|
||||
| `CST_TaskCancel_CheckAgv` | Subscription | Appelle le WF à l'**annulation** d'une tâche |
|
||||
| `CST_TaskDelete_CheckAgv` | Subscription | Appelle le WF à la **suppression** d'une tâche |
|
||||
| `CST_CancelTask_CheckForAgv` | Workflow | Récupère la tâche annulée / supprimée ; si le conteneur est sur un emplacement AGV, lève une erreur (numéro de tâche + code conteneur) |
|
||||
| `CST_CancelTask_NotPossible_2` | Ressource | FR « Impossible de supprimer la tâche {0} car le conteneur {1} est sur un AGV » / EN « Cannot delete task {0} because container {1} is on AGV » |
|
||||
|
||||
Cas de test : (1) annulation **après** pickup (`>= Retrieved`) → refusée,
|
||||
support livré, Task `Finished` ; (2) annulation **avant** pickup
|
||||
(`< Retrieved`) → acceptée, EAG `D`, middleware POST cancel iGO `204`.
|
||||
|
||||
### Comparaison avec les Gateways historiques
|
||||
|
||||
| Aspect | EasyWMSGateway2015 (Galileo) | GatewayRocla2015 | Pool IIS iGO |
|
||||
@@ -501,24 +541,116 @@ le status iGO courant :
|
||||
> (ancienne architecture monolithique). Développement **from scratch**
|
||||
> sur ASP.NET Core .NET 8 recommandé.
|
||||
|
||||
## Workflows EasyWMS — impact iGO
|
||||
## Workflows EasyWMS - impact iGO
|
||||
|
||||
Avec le pattern Gateway iGO + tables AGV_*, **aucun workflow EasyWMS
|
||||
ni la Gateway AGV Mecalux n'a besoin d'être modifié**. La spécificité
|
||||
iGO est entièrement encapsulée dans le middleware.
|
||||
|
||||
> ⚠️ **Réserve (LIM-103, préprod)** : ce tableau reflète l'**hypothèse de
|
||||
> conception**. À l'implémentation, plusieurs **bugs du module AGV standard
|
||||
> Mecalux** ont dû être corrigés (dispatch d'events cassé par la
|
||||
> transformation Gateway `phase + 100`, attributs `canPick`/`canDrop`
|
||||
> jamais assignés, events 106/110 non gérés, refus de mission iGo). Détail :
|
||||
> [Corrections des bugs du module AGV standard (LIM-103)](#corrections-des-bugs-du-module-agv-standard-lim-103).
|
||||
|
||||
| Workflow | Comportement avec Gateway iGO |
|
||||
|----------|-------------------------------|
|
||||
| `MovementCreatedEventHandler_PR` | ✅ Inchangé — déclencheur |
|
||||
| `MovementCreatedEventHandler_PR` | ✅ Inchangé - déclencheur |
|
||||
| `AgvTask_CreateTaskFromMovement_PR` | ✅ Inchangé |
|
||||
| `SerializeAgvTasks_PR` | ✅ Inchangé — écrit EAG, le middleware lit et POST |
|
||||
| `ProcessEvents_PR` + `ProcessEvent_*_PR` | ✅ Inchangé — poll AGE comme d'habitude |
|
||||
| `ProcessErrors_PR` | ✅ Inchangé — réagit aux Flags dans AGE |
|
||||
| `Agvtask_CanPick/CanDrop_PendingToBeSent_PR` | ✅ Inchangé — écrit EAG, le middleware appelle `/final-source` ou `/final-destination` |
|
||||
| `TaskCanceledEventHandler_PR` | ✅ Inchangé — écrit EAG Delete, le middleware gère |
|
||||
| Workflows RFT | ✅ Inchangés — fallback préservé |
|
||||
| `SerializeAgvTasks_PR` | ✅ Inchangé - écrit EAG, le middleware lit et POST |
|
||||
| `ProcessEvents_PR` + `ProcessEvent_*_PR` | ⚠️ **Modifié (LIM-103)** - patch dispatch `phase+100`, gestion events 106/110, refus mission, fix `canPick`/`canDrop` |
|
||||
| `ProcessErrors_PR` | ✅ Inchangé - réagit aux Flags dans AGE |
|
||||
| `Agvtask_CanPick/CanDrop_PendingToBeSent_PR` | ✅ Inchangé - écrit EAG, le middleware appelle `/final-source` ou `/final-destination` |
|
||||
| `TaskCanceledEventHandler_PR` | ✅ Inchangé - écrit EAG Delete, le middleware gère |
|
||||
| Workflows RFT | ✅ Inchangés - fallback préservé |
|
||||
|
||||
## FAQ STILL — réponses contractuelles
|
||||
## Corrections des bugs du module AGV standard (LIM-103)
|
||||
|
||||
> **Statut** : préprod ; revue de code à faire (@Vincent, 30/06/2026),
|
||||
> assignée Vincent Charvet. Ticket regroupant les corrections nécessaires
|
||||
> pour faire fonctionner le module AGV standard sur ce projet.
|
||||
|
||||
### Queries standard corrigées
|
||||
|
||||
- `Equipment_AgvTask_GetTask_ByWorkingZone_UI` : correction d'une null
|
||||
exception sur query standard.
|
||||
- `Equipment_AgvTask_LoadEquipment_UI` : correction d'un paramètre erroné
|
||||
sur query standard.
|
||||
|
||||
### Dispatch d'events cassé par la transformation Gateway `phase + 100`
|
||||
|
||||
Bug de cohérence Mecalux entre la Gateway et le module AGV. Le record
|
||||
`agvEvent` reçu par `ProcessEvents_PR` est un `GalileoEventCreatedWF` dont
|
||||
le champ `EventType` (Integer) porte la valeur **SIMO** de la Gateway,
|
||||
alors que la DecisionActivity « Event type » de `ProcessEvents_PR` dispatche
|
||||
sur les **valeurs natives** 100 / 103 / 104 / 108.
|
||||
|
||||
Chaîne du bug :
|
||||
|
||||
- le middleware écrit `phase = 104` dans `agv_age.phase` ;
|
||||
- la Gateway lit la ligne et pose `EventType = phase + 100 = 204`
|
||||
(avec `Extension[PHASE] = 104`) ;
|
||||
- `ProcessEvents_PR` reçoit `EventType = 204` ≠ 100/103/104/108 → **default
|
||||
silencieux** → workflow Completed sans side-effect (silent fail).
|
||||
|
||||
Fix : patch de l'activité « Check parameters » de `ProcessEvents_PR`
|
||||
(soustraction de 100 pour retrouver la valeur native).
|
||||
|
||||
### `canPick` / `canDrop` jamais assignés (LoadPermission / UnloadPermission)
|
||||
|
||||
Bug majeur du standard : dans `ProcessEvent_LoadPermission_PR`, l'attribut
|
||||
interne `canPick` (InitialValue vide) n'est **jamais assigné**. La
|
||||
DecisionActivity « Can pick? » prend donc toujours la branche `Otherwise No`
|
||||
→ End, et le sous-workflow `Agvtask_CanPick_PendingToBeSent_PR` (qui pose
|
||||
`CanPick = true`) n'est **jamais appelé**. Même défaut dans
|
||||
`ProcessEvent_UnloadPermission_PR` (attribut `canDrop`).
|
||||
|
||||
| Workflow | État | Logique |
|
||||
|----------|------|---------|
|
||||
| `ProcessEvents_PR` | OK (après patch -100) | Dispatch sur `EventType == 100/103/104/108` |
|
||||
| `Agvtask_CanPick_PendingToBeSent_PR` | OK | `CanPick = true` hardcodé, fait le flip |
|
||||
| `SetAgvStatus_PR` | OK | `if CanPick && CanDrop → Sent ; elif CanPick → PendingToBeUnload ; else → PendingToBeLoad` |
|
||||
| `ProcessEvent_LoadPermission_PR` / `ProcessEvent_UnloadPermission_PR` | BUGGÉ | `canPick` / `canDrop` jamais assigné → branche No systématique |
|
||||
|
||||
Fix : remplacer l'expression de la condition `Yes` de la DecisionActivity
|
||||
par `!agvTask.CanPick` (resp. `!agvTask.CanDrop`), qui teste directement la
|
||||
propriété de l'`AgvTask` récupérée par « Get AGV task ». En l'état, le
|
||||
standard Mecalux est **inutilisable** pour le flow LoadPermission /
|
||||
UnloadPermission.
|
||||
|
||||
### Events 106 / 110 non gérés (fix temporaire)
|
||||
|
||||
Le standard ne gère pas les events **106** (déplacer le support sur l'AGV)
|
||||
et **110** (déplacer le support de l'AGV vers son emplacement de
|
||||
destination). Fix temporaire (Michael Chaudier, 29/05) : `ProcessEvents_PR`
|
||||
gère désormais les events 106 (confirmation load) et 110 (confirmation
|
||||
unload), avec ajout des commandes de déplacement du support - chargement
|
||||
sur l'AGV à l'event 106, déchargement à la destination de la tâche à
|
||||
l'event 110.
|
||||
|
||||
### Refus de mission iGo
|
||||
|
||||
Ajout (Arthur, 01/06) d'une condition dans `ProcessEvents_PR` pour gérer le
|
||||
refus de mission par iGo → **annulation de la tâche AGV** ; la transition
|
||||
« sequence 0 » est modifiée pour ne pas catcher cette erreur (non gérée par
|
||||
le sous-workflow) tant qu'aucun flag d'erreur n'est levé.
|
||||
|
||||
### Génération du mouvement PS → position PK
|
||||
|
||||
`Container_MovedEventHandler_PS_PR` modifié (Vincent, 02/06, commit
|
||||
[`9fa84a83e2`](https://msscode.mecalux.com/Proyectos_SW/EASYWMS_11351_LIMAGRAIN/commit/9fa84a83e2dfeaa8a4bde22b10a7e2318658bfbb))
|
||||
pour générer le mouvement des PS vers la bonne position du PK (**première
|
||||
position libre**). Logique conservée pour la recertification et
|
||||
l'échantillonnage.
|
||||
|
||||
> Ce même handler est ensuite spécialisé : redirection selon le **type de
|
||||
> tâche** au picking (voir [Placement PS → PK](../03-picking/placement-ps-pk.md),
|
||||
> LIM-82) et placement à la **position X max** de l'image de quai à
|
||||
> l'expédition (voir [Assignation automatique de l'image de quai](../04-outbound/assignation-image-quai.md),
|
||||
> LIM-94). LIM-103 en pose la base (première position libre).
|
||||
|
||||
## FAQ STILL - réponses contractuelles
|
||||
|
||||
Réponses obtenues de STILL en avril 2026. Valeur contractuelle.
|
||||
|
||||
@@ -552,16 +684,18 @@ Réponses obtenues de STILL en avril 2026. Valeur contractuelle.
|
||||
⚠️ **CanPick/CanDrop** : pour reproduire le standard EasyWMS, forcer
|
||||
l'usage de Groups même mono-location.
|
||||
|
||||
⚠️ **Priorité inversée** : EasyWMS 0=Urgent, iGO 10=Max — conversion
|
||||
⚠️ **Priorité inversée** : EasyWMS 0=Urgent, iGO 10=Max - conversion
|
||||
à coder dans le middleware.
|
||||
|
||||
⚠️ **Pas de routing exposé** : iGO gère ses routes en interne — pas
|
||||
⚠️ **Pas de routing exposé** : iGO gère ses routes en interne - pas
|
||||
d'équivalent à "Routes between stations" en EasyS, pas d'erreur
|
||||
"Disabled route" côté iGO.
|
||||
|
||||
⚠️ **Annulation après chargement impossible** : la logique
|
||||
`AgvTask_SetCancelledTask_PR` qui déclenche la recherche de relocation
|
||||
après chargement n'a plus de sens dans le mapping iGO.
|
||||
après chargement n'a plus de sens dans le mapping iGO. Le WMS **refuse
|
||||
désormais l'annulation en amont** via la souscription preview LIM-104 (voir
|
||||
[Refus WMS de l'annulation…](#refus-wms-de-lannulation-quand-le-support-est-sur-un-agv-lim-104)).
|
||||
|
||||
⚠️ **Tests de charge webhook à mener** : simuler Gateway iGO down
|
||||
pendant 30s / 1min / 5min pour observer le comportement réel d'iGO
|
||||
@@ -575,16 +709,16 @@ pendant 30s / 1min / 5min pour observer le comportement réel d'iGO
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Fréquence des callbacks `vehicle/event` pour les mises à jour de
|
||||
position — risque de flood (@Nicolas)
|
||||
- [ ] Taille max et caractères autorisés dans `customMetaData` (@STILL)
|
||||
- [ ] Les `customMetaData` sont-elles ré-émises dans les callbacks
|
||||
- ❓ Fréquence des callbacks `vehicle/event` pour les mises à jour de
|
||||
position - risque de flood (@Nicolas)
|
||||
- ❓ Taille max et caractères autorisés dans `customMetaData` (@STILL)
|
||||
- ❓ Les `customMetaData` sont-elles ré-émises dans les callbacks
|
||||
transport ? (@STILL)
|
||||
- [ ] Création/modification de Location via API iGO — limité à GET
|
||||
- ❓ Création/modification de Location via API iGO - limité à GET
|
||||
pour l'instant (@STILL)
|
||||
- [ ] Gestion Pallet Shuttle via iGO (LoadType = 1) — hors scope
|
||||
- ❓ Gestion Pallet Shuttle via iGO (LoadType = 1) - hors scope
|
||||
actuel ? (@Théo)
|
||||
- [ ] Multi-warehouse : iGO suppose un seul site — impact si extension
|
||||
- ❓ Multi-warehouse : iGO suppose un seul site - impact si extension
|
||||
future ? (@Michael)
|
||||
|
||||
## Historique des modifications
|
||||
@@ -592,12 +726,16 @@ pendant 30s / 1min / 5min pour observer le comportement réel d'iGO
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|-------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis CR technique iGO STILL |
|
||||
| 2026-07-20 | Arthur | Intégration LIM-103 (corrections bugs module AGV standard, préprod, revue de code à faire) : nouvelle section (2 queries standard corrigées, dispatch d'events cassé par `phase+100`, `canPick`/`canDrop` jamais assignés dans LoadPermission/UnloadPermission, events 106/110 non gérés, refus de mission iGo, `Container_MovedEventHandler_PS_PR` première position libre) ; réserve ajoutée sur le tableau « workflows inchangés » (ligne `ProcessEvents_PR` = Modifié) ; front matter jira_refs/sources/last_updated |
|
||||
| 2026-07-20 | Arthur | Intégration LIM-104 (refus WMS annulation/suppression Task si support sur AGV, préprod, revue validée 23/06) : sous-section sous « Logique d'annulation » (désync task supprimée avant refus iGo, souscription preview, critère `Container.StationType == Agv`, table AD `CST_TaskCancel_CheckAgv`/`CST_TaskDelete_CheckAgv`/`CST_CancelTask_CheckForAgv`/`CST_CancelTask_NotPossible_2`, cas de test) ; cross-ref depuis le point d'attention « Annulation après chargement impossible » ; jira_refs +LIM-104 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| CR technique iGO STILL — fonctionnement et flux API v1 | CR technique | 2026-04-28 |
|
||||
| CR technique iGO STILL - fonctionnement et flux API v1 | CR technique | 2026-04-28 |
|
||||
| [LIM-103](https://easywmsfrance.atlassian.net/browse/LIM-103) | Ticket Jira (corrections bugs module AGV standard - préprod, revue à faire, commit `9fa84a83e2`) | 2026 |
|
||||
| [LIM-104](https://easywmsfrance.atlassian.net/browse/LIM-104) | Ticket Jira (refus annulation Task si support sur AGV - préprod, revue validée 23/06) | 2026 |
|
||||
| 2510_PACS-2.3-Host-Interface-Technical-Specifications | Spec API STILL | 2025-10 |
|
||||
| iGo easy 2.3 - Host Interface Specifications | Spec API STILL | 2025 |
|
||||
| IT requirements R1 20250929 | Spec infra STILL | 2025-09-29 |
|
||||
|
||||
Reference in New Issue
Block a user