màj wiki avec retour MES lot-5 AD
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
---
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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
|
||||
> postes de travail (PK) pour les réceptions fournisseur, intersite et
|
||||
> retour client.
|
||||
|
||||
> **Standard EasyWMS** : → voir
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Dans le flux de réception fournisseur/intersite/retour client, les
|
||||
palettes sont déchargées par un cariste sur une image de quai puis
|
||||
déclarées via le TRF
|
||||
([LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)). Ce job
|
||||
périodique est le mécanisme qui assigne les réceptions aux PK et crée les
|
||||
tâches de déplacement.
|
||||
|
||||
Ce job fait partie du
|
||||
[Mega Job (LIM-70)](../03-picking/job-assignation-pk.md) qui en est
|
||||
l'entête. L'éligibilité du PK (4 conditions) est vérifiée dans l'entête,
|
||||
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
|
||||
> [Job réception production](job-reception-production.md) (LIM-71).
|
||||
|
||||
### Process complet de réception
|
||||
|
||||
| # | Étape | Ticket |
|
||||
|---|-------|--------|
|
||||
| 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) | — |
|
||||
| 5 | Passage PIE | [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) |
|
||||
| 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 | — |
|
||||
|
||||
## Logique principale
|
||||
|
||||
```
|
||||
POUR CHAQUE PK éligible (vérifié par l'entête LIM-70)
|
||||
├─ 1. RECHERCHE D'UNE RÉCEPTION À ASSIGNER
|
||||
│ ├─ Filtrer les réceptions ayant des supports fictifs (séquence 8000*)
|
||||
│ │ sur une image de quai dont CstAtt06 est vide (pas de PK assigné)
|
||||
│ ├─ Filtre big-bag : si CstAtt01 du support = true (big-bag)
|
||||
│ │ → le PK doit figurer dans le paramètre PK_BIGBAG
|
||||
│ ├─ Trier : ordres big-bag prioritaires (si PK l'autorise), puis FIFO
|
||||
│ │ sur la date de création de la réception
|
||||
│ └─ Prendre la PREMIÈRE réception éligible
|
||||
│
|
||||
├─ 2. ASSIGNATION DU PK
|
||||
│ └─ Set CstAtt06 = code du PK sur TOUS les supports de cette réception
|
||||
│
|
||||
└─ 3. CRÉATION DES TÂCHES
|
||||
├─ Pour CHAQUE support fictif de la réception :
|
||||
│ créer 1 tâche : sous-emplacement image de quai → PK (station)
|
||||
├─ Statut initial : "en attente"
|
||||
└─ Toutes les palettes d'une réception → même PK, en une seule passe
|
||||
```
|
||||
|
||||
## Détails des étapes
|
||||
|
||||
### 1. Recherche d'une réception
|
||||
|
||||
Le job cherche parmi toutes les réceptions non-production celles qui ont
|
||||
des supports fictifs (séquence 8000*) positionnés sur une image de quai,
|
||||
dont **CstAtt06 est vide** (pas encore assignés à un PK). Les supports
|
||||
de production n'ont pas de réception associée et sont donc naturellement
|
||||
exclus.
|
||||
|
||||
**Filtre big-bag** : si les supports de la réception ont `CstAtt01 =
|
||||
true` (big-bag déclaré lors de la déclaration image de quai), le PK doit
|
||||
figurer dans le paramètre `PK_BIGBAG`. Si aucun PK compatible n'est
|
||||
libre, la réception attend.
|
||||
|
||||
**Ordre de priorité** : ordres contenant des big-bags d'abord (si le
|
||||
poste l'autorise), puis FIFO sur la date de création de la réception.
|
||||
|
||||
### 2. Assignation du PK
|
||||
|
||||
Une fois la réception trouvée, le **CstAtt06** de **tous les supports
|
||||
fictifs** de cette réception est mis à jour avec le code du PK assigné.
|
||||
Ce CstAtt sert également à identifier le poste d'origine en cas de
|
||||
notification de rejet au PIE.
|
||||
|
||||
### 3. Création des tâches
|
||||
|
||||
Pour chaque support fictif de la réception sur l'image de quai :
|
||||
|
||||
- **Origine** : sous-emplacement de l'image de quai
|
||||
- **Destination** : PK (station). Le sous-emplacement (TP) de
|
||||
destination est choisi automatiquement par le WMS au moment de la
|
||||
génération du mouvement
|
||||
([LIM-60](https://easywmsfrance.atlassian.net/browse/LIM-60))
|
||||
- **Statut** : "en attente"
|
||||
|
||||
Le WMS gère ensuite le passage "en attente" → "généré" via le standard
|
||||
`Task_GenerateMovementJob_PR`, selon la capacité en temps réel du PK. Le
|
||||
module AGV/GNA envoie les tâches à la flotte iGo.
|
||||
|
||||
## Paramètres
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| PK_BIGBAG | Liste des PK compatibles big-bag (séparés par `;`) | _(vide)_ |
|
||||
|
||||
## 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
|
||||
"big-bag vers PK non compatible".
|
||||
|
||||
⚠️ Toutes les palettes d'une même réception vont vers le **même PK** en
|
||||
une seule passe. Pas de répartition entre PK.
|
||||
|
||||
⚠️ Le CstAtt06 empêche le re-traitement d'une réception déjà assignée
|
||||
lors d'exécutions successives du job.
|
||||
|
||||
⚠️ Le nombre de tâches créées peut dépasser le nombre de TP du PK
|
||||
(ex : 10 tâches pour 3 TP). Le WMS gère le flux "en attente" → "créé"
|
||||
selon la capacité temps réel.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
_(aucune question ouverte identifiée dans cette tâche)_
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-74 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira | 2026 |
|
||||
| [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 |
|
||||
@@ -0,0 +1,160 @@
|
||||
---
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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").
|
||||
|
||||
> **Standard EasyWMS** : → voir
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md),
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
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
|
||||
cariste sur une image de quai puis déclarées via le TRF en type
|
||||
"Production"
|
||||
([LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)).
|
||||
|
||||
Ce job crée les tâches de déplacement AGV depuis les images de quai
|
||||
vers le buffer d'entrée production, qui a une route virtuelle vers une
|
||||
table d'entrée du convoyeur.
|
||||
|
||||
> **Périmètre** : uniquement les réceptions de type Production (supports
|
||||
> avec CstAtt04 = "ASN"). Les réceptions fournisseur / intersite /
|
||||
> retour client sont gérées par le
|
||||
> [Mega Job d'assignation PK](../03-picking/job-assignation-pk.md)
|
||||
> ([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70)).
|
||||
|
||||
## Process complet de réception production
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Cariste
|
||||
participant TRF as TRF (LIM-64)
|
||||
participant Job as Job AGV (LIM-71)
|
||||
participant AGV
|
||||
participant PIE as PIE (LIM-66)
|
||||
participant ASRS
|
||||
|
||||
Cariste->>TRF: Décharge palette sur image de quai
|
||||
TRF->>TRF: Déclaration type "Production"
|
||||
Note over TRF: Support fictif séq. 8000*<br/>CstAtt04 = "ASN"
|
||||
Job->>Job: Détecte support éligible
|
||||
Job->>Job: Crée tâche "En attente"
|
||||
Note over Job: Origine = image de quai<br/>Dest = stratégie rangement
|
||||
Job-->>AGV: Tâche passe "Créé" → GNA → iGo
|
||||
AGV->>PIE: Transport vers entrée production
|
||||
PIE->>PIE: Suppression support virtuel<br/>Création palette ASN
|
||||
PIE->>ASRS: Stockage ou rejet
|
||||
```
|
||||
|
||||
## Configuration du job
|
||||
|
||||
- **Type** : job périodique
|
||||
- **Fréquence** : toutes les **30 secondes**
|
||||
|
||||
## 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 :
|
||||
|
||||
| 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)) |
|
||||
| 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é |
|
||||
|
||||
La double vérification CstAtt06 + absence de tâche active est une
|
||||
**sécurité anti-doublon**.
|
||||
|
||||
## Traitement d'un support éligible
|
||||
|
||||
### Marquage
|
||||
|
||||
Le job positionne `CstAtt06` = valeur du paramètre
|
||||
`DESTINATION_PRODUCTION` (ex : "ENTREE_PRODUCTION").
|
||||
|
||||
### Création de la tâche
|
||||
|
||||
| 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) |
|
||||
| Statut initial | "En attente" |
|
||||
|
||||
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.
|
||||
|
||||
## Redirection si PIE saturé
|
||||
|
||||
Gérée en **standard** par le système de routes et distances configuré
|
||||
dans EasyS :
|
||||
|
||||
- Route principale : distance 1
|
||||
- Routes secondaires : distance 2
|
||||
|
||||
On ferme le PIE de production → le WMS redirige automatiquement vers
|
||||
les autres entrées disponibles. Ce job envoie toujours vers la même
|
||||
destination ; c'est le WMS qui reroute si nécessaire.
|
||||
|
||||
> ⚠️ À vérifier si faisable avec plusieurs poumons, plusieurs PIE et
|
||||
> si la config EasyS actuelle est prête pour ce mode dégradé.
|
||||
|
||||
## Paramètres
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| DESTINATION_PRODUCTION | Code du buffer d'entrée production (destination des tâches AGV) | 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
|
||||
[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
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-71 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-71](https://easywmsfrance.atlassian.net/browse/LIM-71) | Ticket Jira | 2026 |
|
||||
| [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 |
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
title: "AGV — Vue d'ensemble"
|
||||
tags: [agv, still, igo, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-12
|
||||
---
|
||||
|
||||
# AGV — Vue d'ensemble
|
||||
|
||||
> **Périmètre** : intégration Still iGo, stations et routes AGV,
|
||||
> jobs AGV spécifiques, troubleshooting.
|
||||
|
||||
> **Standard EasyWMS** : voir [AGV Integration](../../architecture/agv-integration.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Intégration Still iGo](still-igo-integration.md)
|
||||
- [Stations et routes AGV](agv-stations-routes.md)
|
||||
- [Job réception production → ASRS](job-reception-production.md)
|
||||
- [Job réception fournisseur/retour → PK](job-reception-pk.md)
|
||||
- [Troubleshooting AGV](agv-troubleshooting.md)
|
||||
|
||||
## Vue synthétique des flux AGV Limagrain
|
||||
|
||||
<!-- Diagramme Mermaid — à compléter -->
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
title: "AGV — Vue d'ensemble"
|
||||
tags: [agv, still, igo, index]
|
||||
status: draft
|
||||
last_updated: 2026-05-12
|
||||
---
|
||||
|
||||
# AGV — Vue d'ensemble
|
||||
|
||||
> **Périmètre** : intégration Still iGo, stations et routes AGV,
|
||||
> jobs AGV spécifiques, troubleshooting.
|
||||
|
||||
> **Standard EasyWMS** : voir [AGV Integration](../../modules/agv.md)
|
||||
|
||||
## Pages de cette section
|
||||
|
||||
- [Intégration Still iGo](still-igo-integration.md)
|
||||
- [Stations et routes AGV](agv-stations-routes.md)
|
||||
- [Job réception production → ASRS](job-reception-production.md)
|
||||
- [Job réception fournisseur/retour → PK](job-reception-pk.md)
|
||||
- [Troubleshooting AGV](agv-troubleshooting.md)
|
||||
|
||||
## Vue synthétique des flux AGV Limagrain
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Inbound["Réception"]
|
||||
IQ[Images de quai]
|
||||
end
|
||||
|
||||
subgraph AGV["Flotte AGV Still EXV CB iGo"]
|
||||
direction TB
|
||||
iGO["iGO easy<br/>API REST port 7002"]
|
||||
end
|
||||
|
||||
subgraph Auto["ASRS"]
|
||||
PIE[PIE pesée]
|
||||
TK[Transstockeurs]
|
||||
end
|
||||
|
||||
subgraph Picking["Picking"]
|
||||
PK[Postes PK 1-6]
|
||||
end
|
||||
|
||||
subgraph Outbound["Expédition"]
|
||||
QUAI[Quais chargement]
|
||||
end
|
||||
|
||||
IQ -->|"Job LIM-71<br/>production → ASRS"| PIE
|
||||
IQ -->|"Mini Job LIM-74<br/>fournisseur/retour → PK"| PK
|
||||
TK -->|"Picking<br/>TK → PS → PK"| PK
|
||||
PK -->|"Palettes filles<br/>→ quai/ASRS"| QUAI
|
||||
PK -->|"Retour PF"| TK
|
||||
```
|
||||
|
||||
> **Communication** : EasyWMS ↔ iGO via **API REST HTTPS** (port 7002,
|
||||
> TLS 1.2, X-API-Key). Le middleware pool IIS C# traduit les tables
|
||||
> AGV_* vers/depuis l'API PACS.
|
||||
> → voir [Intégration Still iGo](still-igo-integration.md)
|
||||
@@ -0,0 +1,127 @@
|
||||
---
|
||||
title: "Stations et routes AGV — Topologie iGO"
|
||||
tags: [agv, still, igo, stations, routes, topologie, location, group]
|
||||
status: draft
|
||||
standard_ref: concepts/stations.md
|
||||
jira_refs: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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
|
||||
> EasyS, différences de gestion des routes, et mapping topologique.
|
||||
|
||||
> **Standard EasyWMS** : → voir [Stations & Routes](../../concepts/stations.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** liées à
|
||||
> l'utilisation d'iGO easy comme fleet manager AGV.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
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
|
||||
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 |
|
||||
| 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) |
|
||||
| AGV equipment group (EasyS) | Flotte dans MyMA | Configuration véhicules |
|
||||
| `Allow loading` / `Allow unloading` | `Location.isEnabled` + `possibleActions` | Flag binaire côté iGO |
|
||||
| `LocationLockType` "For AGV" | `Location.isEnabled = false` | iGO n'a pas de typage de lock |
|
||||
| Manual loading aisle | _(pas d'équivalent)_ | iGO calcule la trajectoire seul |
|
||||
| Route distance | _(pas d'équivalent)_ | iGO optimise le chemin en interne |
|
||||
|
||||
## Configuration côté iGO (MyMA)
|
||||
|
||||
Les éléments suivants sont configurés dans MyMA, **pas dans EasyS** :
|
||||
|
||||
- **Vehicles** : enregistrement des AGV physiques (id, modèle, capacité)
|
||||
- **Locations** : déclaration de chaque point physique avec actions
|
||||
autorisées, types de véhicules et de charges admis, et
|
||||
`actualLoads` courantes
|
||||
- **Groups** : regroupement de Locations pour la décision tardive (cas
|
||||
typique : zone de déchargement avec plusieurs alvéoles)
|
||||
- **Layout / routes** : géré dans le designer iGO, invisible côté WMS
|
||||
|
||||
## Configuration côté EasyS (EasyWMS)
|
||||
|
||||
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")
|
||||
|
||||
> ⚠️ 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
|
||||
> trajectoire physique est résolue par iGO.
|
||||
|
||||
## Décision tardive — utilisation des Groups
|
||||
|
||||
Cas d'utilisation chez Limagrain :
|
||||
|
||||
- **Déchargement vers un quai** : le WMS crée le transport avec
|
||||
`destinationGroupId = "DOCK_OUT"`. iGO achemine l'AGV au point de
|
||||
décision du groupe. Le WMS choisit alors l'alvéole exacte via
|
||||
`POST /transports/{id}/final-destination`.
|
||||
- **Reproduction du CanPick/CanDrop** : pour forcer iGO à demander
|
||||
une autorisation avant chargement/déchargement, il faut configurer
|
||||
un Group même pour une seule Location. Le status `RequestSource` /
|
||||
`RequestDestination` sert alors de signal d'autorisation.
|
||||
|
||||
## Gestion des verrous
|
||||
|
||||
| EasyWMS | iGO |
|
||||
|---------|-----|
|
||||
| `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 |
|
||||
|
||||
> ⚠️ iGO n'a pas de granularité dans les types de verrous. La
|
||||
> traduction entre les codes erreur EasyWMS (1001-2700) et le flag
|
||||
> `isEnabled` est à la charge du middleware.
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **Pas de routage exposé** : si un AGV ne peut pas atteindre une
|
||||
location (obstacle, zone interdite), iGO gère le contournement en
|
||||
interne. Pas d'erreur "Disabled route" renvoyée au WMS.
|
||||
|
||||
⚠️ **Pas de notion d'allée** (`LoadAisle` / `UnloadAisle`) côté iGO :
|
||||
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
|
||||
topologie passe par MyMA manuellement.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] Création/modification de Location via API iGO — actuellement
|
||||
en lecture seule, à clarifier avec STILL (@Arthur)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|-------------|
|
||||
| 2026-05-12 | Arthur | Création initiale |
|
||||
|
||||
## Références
|
||||
|
||||
| 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 | — |
|
||||
@@ -0,0 +1,158 @@
|
||||
---
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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
|
||||
> postes de travail (PK) pour les réceptions fournisseur, intersite et
|
||||
> retour client.
|
||||
|
||||
> **Standard EasyWMS** : → voir
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
Dans le flux de réception fournisseur/intersite/retour client, les
|
||||
palettes sont déchargées par un cariste sur une image de quai puis
|
||||
déclarées via le TRF
|
||||
([LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)). Ce job
|
||||
périodique est le mécanisme qui assigne les réceptions aux PK et crée les
|
||||
tâches de déplacement.
|
||||
|
||||
Ce job fait partie du
|
||||
[Mega Job (LIM-70)](../03-picking/job-assignation-pk.md) qui en est
|
||||
l'entête. L'éligibilité du PK (4 conditions) est vérifiée dans l'entête,
|
||||
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
|
||||
> [Job réception production](job-reception-production.md) (LIM-71).
|
||||
|
||||
### Process complet de réception
|
||||
|
||||
| # | Étape | Ticket |
|
||||
|---|-------|--------|
|
||||
| 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) | — |
|
||||
| 5 | Passage PIE | [LIM-66](https://easywmsfrance.atlassian.net/browse/LIM-66) |
|
||||
| 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 | — |
|
||||
|
||||
## Logique principale
|
||||
|
||||
```
|
||||
POUR CHAQUE PK éligible (vérifié par l'entête LIM-70)
|
||||
├─ 1. RECHERCHE D'UNE RÉCEPTION À ASSIGNER
|
||||
│ ├─ Filtrer les réceptions ayant des supports fictifs (séquence 8000*)
|
||||
│ │ sur une image de quai dont CstAtt06 est vide (pas de PK assigné)
|
||||
│ ├─ Filtre big-bag : si CstAtt01 du support = true (big-bag)
|
||||
│ │ → le PK doit figurer dans le paramètre PK_BIGBAG
|
||||
│ ├─ Trier : ordres big-bag prioritaires (si PK l'autorise), puis FIFO
|
||||
│ │ sur la date de création de la réception
|
||||
│ └─ Prendre la PREMIÈRE réception éligible
|
||||
│
|
||||
├─ 2. ASSIGNATION DU PK
|
||||
│ └─ Set CstAtt06 = code du PK sur TOUS les supports de cette réception
|
||||
│
|
||||
└─ 3. CRÉATION DES TÂCHES
|
||||
├─ Pour CHAQUE support fictif de la réception :
|
||||
│ créer 1 tâche : sous-emplacement image de quai → PK (station)
|
||||
├─ Statut initial : "en attente"
|
||||
└─ Toutes les palettes d'une réception → même PK, en une seule passe
|
||||
```
|
||||
|
||||
## Détails des étapes
|
||||
|
||||
### 1. Recherche d'une réception
|
||||
|
||||
Le job cherche parmi toutes les réceptions non-production celles qui ont
|
||||
des supports fictifs (séquence 8000*) positionnés sur une image de quai,
|
||||
dont **CstAtt06 est vide** (pas encore assignés à un PK). Les supports
|
||||
de production n'ont pas de réception associée et sont donc naturellement
|
||||
exclus.
|
||||
|
||||
**Filtre big-bag** : si les supports de la réception ont `CstAtt01 =
|
||||
true` (big-bag déclaré lors de la déclaration image de quai), le PK doit
|
||||
figurer dans le paramètre `PK_BIGBAG`. Si aucun PK compatible n'est
|
||||
libre, la réception attend.
|
||||
|
||||
**Ordre de priorité** : ordres contenant des big-bags d'abord (si le
|
||||
poste l'autorise), puis FIFO sur la date de création de la réception.
|
||||
|
||||
### 2. Assignation du PK
|
||||
|
||||
Une fois la réception trouvée, le **CstAtt06** de **tous les supports
|
||||
fictifs** de cette réception est mis à jour avec le code du PK assigné.
|
||||
Ce CstAtt sert également à identifier le poste d'origine en cas de
|
||||
notification de rejet au PIE.
|
||||
|
||||
### 3. Création des tâches
|
||||
|
||||
Pour chaque support fictif de la réception sur l'image de quai :
|
||||
|
||||
- **Origine** : sous-emplacement de l'image de quai
|
||||
- **Destination** : PK (station). Le sous-emplacement (TP) de
|
||||
destination est choisi automatiquement par le WMS au moment de la
|
||||
génération du mouvement
|
||||
([LIM-60](https://easywmsfrance.atlassian.net/browse/LIM-60))
|
||||
- **Statut** : "en attente"
|
||||
|
||||
Le WMS gère ensuite le passage "en attente" → "généré" via le standard
|
||||
`Task_GenerateMovementJob_PR`, selon la capacité en temps réel du PK. Le
|
||||
module AGV/GNA envoie les tâches à la flotte iGo.
|
||||
|
||||
## Paramètres
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| PK_BIGBAG | Liste des PK compatibles big-bag (séparés par `;`) | _(vide)_ |
|
||||
|
||||
## 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
|
||||
"big-bag vers PK non compatible".
|
||||
|
||||
⚠️ Toutes les palettes d'une même réception vont vers le **même PK** en
|
||||
une seule passe. Pas de répartition entre PK.
|
||||
|
||||
⚠️ Le CstAtt06 empêche le re-traitement d'une réception déjà assignée
|
||||
lors d'exécutions successives du job.
|
||||
|
||||
⚠️ Le nombre de tâches créées peut dépasser le nombre de TP du PK
|
||||
(ex : 10 tâches pour 3 TP). Le WMS gère le flux "en attente" → "créé"
|
||||
selon la capacité temps réel.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
_(aucune question ouverte identifiée dans cette tâche)_
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-74 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-74](https://easywmsfrance.atlassian.net/browse/LIM-74) | Ticket Jira | 2026 |
|
||||
| [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 |
|
||||
@@ -0,0 +1,160 @@
|
||||
---
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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").
|
||||
|
||||
> **Standard EasyWMS** : → voir
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md),
|
||||
> [Galileo Integration](../../architecture/galileo-integration.md)
|
||||
> Ce qui suit documente les **spécificités Limagrain** par rapport au
|
||||
> standard.
|
||||
|
||||
## Contexte projet
|
||||
|
||||
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
|
||||
cariste sur une image de quai puis déclarées via le TRF en type
|
||||
"Production"
|
||||
([LIM-64](https://easywmsfrance.atlassian.net/browse/LIM-64)).
|
||||
|
||||
Ce job crée les tâches de déplacement AGV depuis les images de quai
|
||||
vers le buffer d'entrée production, qui a une route virtuelle vers une
|
||||
table d'entrée du convoyeur.
|
||||
|
||||
> **Périmètre** : uniquement les réceptions de type Production (supports
|
||||
> avec CstAtt04 = "ASN"). Les réceptions fournisseur / intersite /
|
||||
> retour client sont gérées par le
|
||||
> [Mega Job d'assignation PK](../03-picking/job-assignation-pk.md)
|
||||
> ([LIM-70](https://easywmsfrance.atlassian.net/browse/LIM-70)).
|
||||
|
||||
## Process complet de réception production
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Cariste
|
||||
participant TRF as TRF (LIM-64)
|
||||
participant Job as Job AGV (LIM-71)
|
||||
participant AGV
|
||||
participant PIE as PIE (LIM-66)
|
||||
participant ASRS
|
||||
|
||||
Cariste->>TRF: Décharge palette sur image de quai
|
||||
TRF->>TRF: Déclaration type "Production"
|
||||
Note over TRF: Support fictif séq. 8000*<br/>CstAtt04 = "ASN"
|
||||
Job->>Job: Détecte support éligible
|
||||
Job->>Job: Crée tâche "En attente"
|
||||
Note over Job: Origine = image de quai<br/>Dest = stratégie rangement
|
||||
Job-->>AGV: Tâche passe "Créé" → GNA → iGo
|
||||
AGV->>PIE: Transport vers entrée production
|
||||
PIE->>PIE: Suppression support virtuel<br/>Création palette ASN
|
||||
PIE->>ASRS: Stockage ou rejet
|
||||
```
|
||||
|
||||
## Configuration du job
|
||||
|
||||
- **Type** : job périodique
|
||||
- **Fréquence** : toutes les **30 secondes**
|
||||
|
||||
## 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 :
|
||||
|
||||
| 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)) |
|
||||
| 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é |
|
||||
|
||||
La double vérification CstAtt06 + absence de tâche active est une
|
||||
**sécurité anti-doublon**.
|
||||
|
||||
## Traitement d'un support éligible
|
||||
|
||||
### Marquage
|
||||
|
||||
Le job positionne `CstAtt06` = valeur du paramètre
|
||||
`DESTINATION_PRODUCTION` (ex : "ENTREE_PRODUCTION").
|
||||
|
||||
### Création de la tâche
|
||||
|
||||
| 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) |
|
||||
| Statut initial | "En attente" |
|
||||
|
||||
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.
|
||||
|
||||
## Redirection si PIE saturé
|
||||
|
||||
Gérée en **standard** par le système de routes et distances configuré
|
||||
dans EasyS :
|
||||
|
||||
- Route principale : distance 1
|
||||
- Routes secondaires : distance 2
|
||||
|
||||
On ferme le PIE de production → le WMS redirige automatiquement vers
|
||||
les autres entrées disponibles. Ce job envoie toujours vers la même
|
||||
destination ; c'est le WMS qui reroute si nécessaire.
|
||||
|
||||
> ⚠️ À vérifier si faisable avec plusieurs poumons, plusieurs PIE et
|
||||
> si la config EasyS actuelle est prête pour ce mode dégradé.
|
||||
|
||||
## Paramètres
|
||||
|
||||
| Paramètre | Description | Valeur par défaut |
|
||||
|-----------|-------------|-------------------|
|
||||
| DESTINATION_PRODUCTION | Code du buffer d'entrée production (destination des tâches AGV) | 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
|
||||
[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
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- [ ] 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)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|--------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis LIM-71 |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| [LIM-71](https://easywmsfrance.atlassian.net/browse/LIM-71) | Ticket Jira | 2026 |
|
||||
| [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 PI
|
||||
@@ -0,0 +1,604 @@
|
||||
---
|
||||
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: []
|
||||
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
|
||||
author: Arthur
|
||||
---
|
||||
|
||||
# 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.
|
||||
> Couvre l'API REST PACS 2.3, le cycle de vie des transports, le mapping
|
||||
> 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)
|
||||
> 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.
|
||||
|
||||
## 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
|
||||
Concept Solutions), motorisé par le moteur interne **E'tricc**.
|
||||
|
||||
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
|
||||
URL exposée par le WMS).
|
||||
|
||||
## Vue d'ensemble iGO / PACS
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph WMS["Hôte (EasyWMS)"]
|
||||
EasyWMS["EasyWMS + CstAGV"]
|
||||
end
|
||||
|
||||
subgraph FleetMgr["iGO easy / PACS Fleet Manager"]
|
||||
Etricc["Moteur E'tricc"]
|
||||
MyMA["MyMA admin UI"]
|
||||
Etricc <--> MyMA
|
||||
end
|
||||
|
||||
subgraph Fleet["Flotte AGV"]
|
||||
EXV["EXV CB iGo<br/>(gerbeur ~3.4m)"]
|
||||
end
|
||||
|
||||
EasyWMS <-->|"HTTPS REST<br/>port 7002<br/>TLS 1.2 + X-API-Key"| Etricc
|
||||
Etricc -.->|"callback POST<br/>vers WMS"| EasyWMS
|
||||
Etricc <--> Fleet
|
||||
```
|
||||
|
||||
Concepts clés :
|
||||
|
||||
- Pas de notion de routes/segments côté WMS : iGO ne demande qu'une
|
||||
`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).
|
||||
|
||||
## Stack technique iGO (MyMA)
|
||||
|
||||
| Composant | Détail |
|
||||
|-----------|--------|
|
||||
| Backend | .NET 8.0 (C#) |
|
||||
| Frontend | Vue 3.2 |
|
||||
| Base de données | Postgres 12+ (défaut), SQL Server 2019 ou MySQL 8.0 |
|
||||
| OS serveur | Windows 11/Server 2016-2022, Ubuntu 18.04 |
|
||||
| Hardware (low) | 4 cores @2.26 GHz, 8 Go RAM, 500 Go RAID5, dual PSU |
|
||||
| Hardware (high) | 8 cores, 16 Go RAM, 1 To, dual PSU |
|
||||
|
||||
### Ports réseau
|
||||
|
||||
| Service | Port |
|
||||
|---------|------|
|
||||
| Front-end admin MyMA | 82 |
|
||||
| Backend REST interne | 50005 |
|
||||
| API Host (HTTPS REST) | **7002** |
|
||||
| Postgres | 5432 |
|
||||
|
||||
## Véhicule — Still EXV CB iGo
|
||||
|
||||
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.
|
||||
|
||||
| Caractéristique | Valeur |
|
||||
|-----------------|--------|
|
||||
| Longueur totale (l1) | 3 383 mm |
|
||||
| Longueur jusqu'au dosseret (l2) | 2 083 mm |
|
||||
| Largeur tablier fourche | 1 000 / 920 / 1 109 mm |
|
||||
| Fourche (s / e / l) | 50 / 100 / 1 300 mm |
|
||||
| Hauteur véhicule (arche / mât) | 2 447 / 2 015 mm |
|
||||
|
||||
## Modèle de ressources API
|
||||
|
||||
L'API PACS 2.3 expose **8 ressources** :
|
||||
|
||||
| Ressource iGO | Équivalent EasyWMS | Description |
|
||||
|----------------|-------------------|-------------|
|
||||
| **Transport** | `AgvTask` | L'ordre de transport (le cœur) |
|
||||
| **Vehicle** | AGV station (type 65) | Le véhicule physique |
|
||||
| **Load** | `Container` / LPN | La charge physique |
|
||||
| **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 |
|
||||
|
||||
### Champs clés du Transport
|
||||
|
||||
| Champ iGO | Type | Équivalent EasyWMS |
|
||||
|-----------|------|--------------------|
|
||||
| `id` | string | (généré par iGO) |
|
||||
| `transportHostId` | string | `OrderExtId` (= `Task.TaskNumber`) |
|
||||
| `sourceLocationId` / `sourceGroupId` | string | `LoadLocation` |
|
||||
| `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) |
|
||||
| `customMetaData` | dict | `HasTopper`, `PalletType`, etc. |
|
||||
| `status` | enum | `AgvStatus` (mapping § ci-dessous) |
|
||||
|
||||
### Champs clés du Vehicle
|
||||
|
||||
| Champ | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `id` | string | Identifiant véhicule |
|
||||
| `mode` | enum | Manual / Automatic / SemiAutomatic / Removed / Disabled |
|
||||
| `status` | enum | Idle / Executing / Charging / Faulted / Manual |
|
||||
| `pose` | object (x, y, orientation) | Position physique temps réel |
|
||||
| `batteryLevel` | int | % batterie |
|
||||
| `errors` | array | Codes/labels d'erreur |
|
||||
|
||||
## Inventaire des endpoints API
|
||||
|
||||
Tous sur `https://[IP]:7002/api/...` avec header `X-API-Key`.
|
||||
|
||||
### Transports
|
||||
|
||||
| Verbe | URL | Effet |
|
||||
|-------|-----|-------|
|
||||
| GET | `/api/transports` | Liste des transports en mémoire |
|
||||
| POST | `/api/transports` | **Créer un transport** |
|
||||
| GET | `/api/transports/{id}` | Détail d'un transport |
|
||||
| POST | `/api/transports/{id}/final-destination` | Fixer destination finale (group → location) |
|
||||
| POST | `/api/transports/{id}/final-source` | Fixer source finale (group → location) |
|
||||
| POST | `/api/transports/{id}/suspend` | Mettre en pause |
|
||||
| POST | `/api/transports/{id}/release` | Relancer après suspend |
|
||||
| POST | `/api/transports/{id}/cancel` | Annuler |
|
||||
| POST | `/api/transports/{id}/priority?priority={0-10}` | Changer priorité |
|
||||
| POST | `/api/transports/subscription?callbackUrl=…` | S'abonner aux events transport |
|
||||
| DELETE | `/api/transports/subscription?callbackUrl=…` | Se désabonner |
|
||||
|
||||
### Vehicles
|
||||
|
||||
| Verbe | URL | Effet |
|
||||
|-------|-----|-------|
|
||||
| GET | `/api/vehicles` / `/{id}` | Lecture véhicules |
|
||||
| POST | `/api/vehicles/suspend` | Suspendre toute la flotte |
|
||||
| POST | `/api/vehicles/resume` | Relancer toute la flotte |
|
||||
| POST | `/api/vehicles/{id}/suspend` / `.../resume` | Suspend/resume un AGV |
|
||||
| POST | `/api/vehicles/restart` | Redémarrer la flotte |
|
||||
| POST | `/api/vehicles/subscription?callbackUrl=…` | S'abonner aux events vehicle |
|
||||
|
||||
### Autres
|
||||
|
||||
| Verbe | URL | Effet |
|
||||
|-------|-----|-------|
|
||||
| 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) |
|
||||
| GET | `/api/locations` / `/{id}` | Lecture des locations |
|
||||
| GET | `/api/load-types` | Catalogue des types |
|
||||
|
||||
### Endpoints callback côté WMS (webhook receiver)
|
||||
|
||||
| URL côté WMS | Body reçu | Déclenchement |
|
||||
|-------------|-----------|---------------|
|
||||
| `POST /agv/transport-event` | Objet Transport complet | Changement d'état transport |
|
||||
| `POST /agv/vehicle-event` | Objet Vehicle complet | Changement d'état véhicule |
|
||||
|
||||
## Cycle de vie d'un Transport
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Req[Requested] --> Pen[Pending]
|
||||
Pen --> Asg[Assigned]
|
||||
Asg -->|source = Group| RS[RequestSource]
|
||||
Asg -->|source = Location| Ret[Retrieving]
|
||||
RS -->|final source set| Ret
|
||||
RS -->|AGV arrivé sans réponse| WS[WaitSource]
|
||||
WS -->|final source set| Ret
|
||||
Ret --> Rtd[Retrieved]
|
||||
Rtd -->|dest = Group| RD[RequestDestination]
|
||||
Rtd -->|dest = Location| Sto[Storing]
|
||||
RD -->|final dest set| Sto
|
||||
RD -->|AGV arrivé sans réponse| WD[WaitDestination]
|
||||
WD -->|final dest set| Sto
|
||||
Sto --> Std[Stored]
|
||||
Std --> Fin[Finished]
|
||||
|
||||
Asg -.cancel.-> Can[Cancelled]
|
||||
Pen -.cancel.-> Can
|
||||
Ret -.error.-> Abo[Aborted]
|
||||
Sto -.error.-> Abo
|
||||
```
|
||||
|
||||
États terminaux : **Finished**, **Cancelled**, **Aborted**.
|
||||
|
||||
> ⚠️ 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).
|
||||
|
||||
### Mapping états iGO → phases EasyWMS
|
||||
|
||||
| iGO Transport.status | Phase AGV EasyWMS | AgvStatus | Notes |
|
||||
|---------------------|-------------------|-----------|-------|
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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) |
|
||||
|
||||
### Différence sémantique majeure : CanPick / CanDrop
|
||||
|
||||
Le standard EasyWMS attend une **demande explicite d'autorisation**
|
||||
(phases 104 / 108) quand `CanPick` / `CanDrop` sont à `false`. iGO ne
|
||||
demande l'autorisation **qu'au point de décision d'un Group**. Si la
|
||||
source/destination est une Location connue dès la création, iGO
|
||||
exécute directement sans demander d'autorisation.
|
||||
|
||||
Pour reproduire le comportement EasyWMS dans iGO, il faut **forcer
|
||||
l'usage de Groups** (même mono-location) là où EasyWMS aurait
|
||||
`CanPick = false`.
|
||||
|
||||
### Conversion de priorité
|
||||
|
||||
| EasyWMS | iGO | Suggestion |
|
||||
|---------|-----|------------|
|
||||
| 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
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant WMS as EasyWMS
|
||||
participant iGO as iGO easy
|
||||
participant V as Vehicle
|
||||
|
||||
WMS->>iGO: POST /api/transports
|
||||
iGO-->>WMS: 200 OK (status=Requested)
|
||||
iGO->>WMS: callback (Pending)
|
||||
iGO->>V: assigne véhicule
|
||||
iGO->>WMS: callback (Assigned)
|
||||
V->>iGO: arrivé source
|
||||
iGO->>WMS: callback (Retrieving)
|
||||
V->>iGO: chargé
|
||||
iGO->>WMS: callback (Retrieved)
|
||||
V->>iGO: arrivé destination
|
||||
iGO->>WMS: callback (Storing)
|
||||
V->>iGO: déchargé
|
||||
iGO->>WMS: callback (Stored → Finished)
|
||||
```
|
||||
|
||||
### Flux avec décision tardive (Group)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant WMS
|
||||
participant iGO
|
||||
participant V as Vehicle
|
||||
|
||||
WMS->>iGO: POST /api/transports {destinationGroupId}
|
||||
iGO-->>WMS: 200 OK (Requested)
|
||||
iGO->>WMS: callback (Assigned → Retrieving → Retrieved)
|
||||
V->>iGO: arrivé au decision point
|
||||
iGO->>WMS: callback (RequestDestination)
|
||||
WMS->>iGO: POST /final-destination {destinationId}
|
||||
iGO-->>WMS: 200 OK
|
||||
iGO->>WMS: callback (Storing → Stored → Finished)
|
||||
```
|
||||
|
||||
> ⚠️ Si le WMS ne répond pas assez vite, iGO bascule de
|
||||
> `RequestDestination` vers `WaitDestination` (AGV arrivé et en
|
||||
> attente). Symétrique côté source : `RequestSource` → `WaitSource`.
|
||||
|
||||
### Annulation
|
||||
|
||||
Un transport **ne peut pas être annulé après l'état `Retrieved`**
|
||||
(FAQ #6). Si un cancel arrive côté WMS après `Retrieved`, deux
|
||||
options : attendre `Finished` puis créer une tâche retour, ou
|
||||
intervenir manuellement.
|
||||
|
||||
## Sécurité et abonnements
|
||||
|
||||
### Authentification
|
||||
|
||||
**`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
|
||||
doit les truster explicitement (import dans le keystore).
|
||||
|
||||
### Modèle d'abonnement
|
||||
|
||||
Au démarrage du WMS :
|
||||
|
||||
1. `POST /api/transports/subscription?callbackUrl=https://wms/agv/events/transport`
|
||||
2. `POST /api/vehicles/subscription?callbackUrl=https://wms/agv/events/vehicle`
|
||||
|
||||
À l'arrêt : `DELETE` sur les mêmes URLs. Le endpoint callback doit
|
||||
être en HTTPS, retourner **200 OK rapidement** (< 1s), traitement
|
||||
asynchrone derrière. Le listener doit être **idempotent** : clé de
|
||||
déduplication = `transport.id + status` (FAQ #9).
|
||||
|
||||
## Mapping erreurs iGO → EasyWMS
|
||||
|
||||
| Code EasyWMS | Famille | Équivalent iGO |
|
||||
|-------------|---------|----------------|
|
||||
| 1001-1014 | Configuration | `HTTP 400 BadRequest` à la création |
|
||||
| 2003 | Extraction error | `Transport.status = Aborted` + `Vehicle.errors[]` |
|
||||
| 2004 | Putaway error | idem |
|
||||
| 2005 | Manual cancel | `Transport.status = Cancelled` en callback |
|
||||
| 2500-2503 | Communication | Erreurs HTTP 5xx / timeouts |
|
||||
| 2700 | Wrong container | `Vehicle.errors[]` + `status = Faulted` |
|
||||
|
||||
> ⚠️ Le payload `Aborted` ne contient **aucun code d'erreur** (FAQ #2).
|
||||
> Pour enrichir le `Flags` AGE, il faut faire un `GET /api/vehicles/{id}`
|
||||
> complémentaire pour récupérer `errors[].errorCode`.
|
||||
|
||||
## Mapping verbes / opérations
|
||||
|
||||
| Action métier | EasyWMS (Operation + EAG) | iGO (REST) |
|
||||
|--------------|--------------------------|------------|
|
||||
| Créer un ordre | `Operation = Create` + ligne EAG | `POST /api/transports` |
|
||||
| Modifier un ordre | `Operation = Update` + ligne EAG | `POST /priority`, `/final-source`, `/final-destination` |
|
||||
| Annuler un ordre | `Operation = Delete` + ligne EAG | `POST /api/transports/{id}/cancel` |
|
||||
| Suspendre un ordre | (pas d'équivalent) | `POST /suspend` |
|
||||
| Reprendre un ordre | (pas d'équivalent) | `POST /release` |
|
||||
| Suspendre la flotte | (pas d'équivalent) | `POST /api/vehicles/suspend` |
|
||||
| Auth load | EAG `Update` (CanPick=true) | `POST /final-source` |
|
||||
| Auth unload | EAG `Update` (CanDrop=true) | `POST /final-destination` |
|
||||
|
||||
## Architecture cible — Pattern à 4 composants
|
||||
|
||||
### Principe directeur
|
||||
|
||||
EasyWMS communique avec les fleet managers externes via une **base
|
||||
intermédiaire** (5 tables). Côté Mecalux, la **Gateway AGV** (existante)
|
||||
mediate entre les workflows et les tables. Côté flotte, un **middleware
|
||||
à développer** (pool IIS C# .NET 8) traduit les tables vers/depuis
|
||||
l'API REST PACS.
|
||||
|
||||
**Le custom CstAGV n'est pas modifié.** L'intégration iGO consiste
|
||||
uniquement à fournir le middleware.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph EasyWMS["EasyWMS (existant)"]
|
||||
Process[Process<br/>Putaway/Picking/Shipping]
|
||||
AgvCore[Module AGV core<br/>+ CstAGV]
|
||||
GwMec[Gateway AGV Mecalux<br/>workflows ↔ tables]
|
||||
end
|
||||
|
||||
subgraph DB["Base intermédiaire"]
|
||||
OQ[(AGV_OUTPUTQUEUE)]
|
||||
EAG[(AGV_EAG)]
|
||||
IQ[(AGV_INPUTQUEUE)]
|
||||
AGE[(AGV_AGE)]
|
||||
AGS[(AGV_AGS)]
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
subgraph KION["iGO / PACS (STILL)"]
|
||||
iGO[API REST port 7002]
|
||||
end
|
||||
|
||||
Process --> AgvCore --> GwMec
|
||||
GwMec --> OQ & EAG
|
||||
GwMec -.poll.-> IQ & AGE & AGS
|
||||
Pump -.poll.-> OQ
|
||||
Pump -.lit.-> EAG
|
||||
Pump -->|HTTPS X-API-Key| iGO
|
||||
iGO -.webhook.-> Hook
|
||||
Hook --> IQ & AGE & AGS
|
||||
```
|
||||
|
||||
### Composants existants — RIEN à modifier
|
||||
|
||||
| Composant | Rôle | Statut |
|
||||
|-----------|------|--------|
|
||||
| CstAGV (workflows) | Logique métier AGV | ✅ Existant |
|
||||
| Gateway AGV Mecalux | Mediator workflows ↔ tables | ✅ Existant |
|
||||
| Tables AGV_* (5) | Base intermédiaire | ✅ Existantes |
|
||||
| Vues SmartUI AGV | Monitoring opérateur | ✅ Existantes |
|
||||
|
||||
### Middleware pool IIS — seul livrable nouveau
|
||||
|
||||
| Aspect | Description |
|
||||
|--------|-------------|
|
||||
| Forme | Pool IIS C# ASP.NET Core (.NET 8.0) |
|
||||
| Hébergement | Serveur Mecalux (co-localisé ou VM séparée) |
|
||||
| Rôle | Pompe sortante + webhook receiver dans un service unique |
|
||||
| Accès BDD | Connection vers les 5 tables AGV_* |
|
||||
| Sécurité | `X-API-Key` sortant + HTTPS entrant (TLS 1.2) |
|
||||
|
||||
#### Pompe sortante (OUTPUTQUEUE → API iGO)
|
||||
|
||||
Polling régulier (1-5 s) sur `AGV_OUTPUTQUEUE WHERE processedDate IS
|
||||
NULL ORDER BY creationDate ASC`. Pour chaque ligne : récupère
|
||||
`batchId` → lit `AGV_EAG` → interprète l'`Operation` (C/U/D) → appel
|
||||
REST iGO. Après ack synchrone (200 OK) : marque `processedDate`.
|
||||
|
||||
#### Webhook receiver (callbacks → tables)
|
||||
|
||||
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).
|
||||
|
||||
### 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 |
|
||||
| Stored / Finished | 110 | 0 | Unload confirmed |
|
||||
| Cancelled | 255 | 0 | Annulé |
|
||||
| Aborted | — | 2003/2004 | À enrichir via `GET /api/vehicles/{id}` (FAQ #2) |
|
||||
|
||||
### Pattern de boot du middleware
|
||||
|
||||
À chaque démarrage :
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
### Logique d'annulation côté middleware
|
||||
|
||||
À la lecture d'un EAG `Operation=Delete`, le middleware doit vérifier
|
||||
le status iGO courant :
|
||||
|
||||
- **Requested / Pending / Assigned / Retrieving** → `POST /cancel` ✅
|
||||
- **Retrieved / Storing / Stored** → ❌ Cancel impossible (FAQ #6) →
|
||||
écrire un Flags d'erreur dans AGE → notification opérateur →
|
||||
fallback (attendre Finished + tâche retour, ou RFT)
|
||||
- **Cancelled / Aborted / Finished** → no-op (déjà terminal)
|
||||
|
||||
### Comparaison avec les Gateways historiques
|
||||
|
||||
| Aspect | EasyWMSGateway2015 (Galileo) | GatewayRocla2015 | Pool IIS iGO |
|
||||
|--------|------------------------------|------------------|--------------|
|
||||
| Communication aval | TCP socket (port 3000) | TCP socket (port 50011) | HTTPS REST (port 7002) |
|
||||
| Format messages | Frames GALILEO bas niveau | Frames Rocla propriétaires | JSON REST |
|
||||
| Auth | `TokenUser` dans config | Intégrée au protocole | `X-API-Key` |
|
||||
| Architecture | Monolithique | Monolithique (Gateway + middleware fusionnés) | **Découplée** via tables AGV_* |
|
||||
| Liaison Mecalux | (autre architecture) | Abonnement direct WF (héritage EasyB) | Tables AGV_* (archi moderne) |
|
||||
|
||||
> La pool IIS iGO **ne doit pas** être un fork de GatewayRocla2015
|
||||
> (ancienne architecture monolithique). Développement **from scratch**
|
||||
> sur ASP.NET Core .NET 8 recommandé.
|
||||
|
||||
## 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.
|
||||
|
||||
| Workflow | Comportement avec Gateway iGO |
|
||||
|----------|-------------------------------|
|
||||
| `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é |
|
||||
|
||||
## FAQ STILL — réponses contractuelles
|
||||
|
||||
Réponses obtenues de STILL en avril 2026. Valeur contractuelle.
|
||||
|
||||
| # | Question | Réponse | Impact |
|
||||
|---|----------|---------|--------|
|
||||
| 1 | Vehicle.id dès Assigned ? | **Non**, seulement à partir de `Retrieved` | Insérer StationNumber dans AGE uniquement à partir de Retrieved |
|
||||
| 2 | Code d'erreur dans payload Aborted ? | **Non**, juste le statut | Enrichir via `GET /api/vehicles/{id}` (errors[]) |
|
||||
| 3 | Timestamp dans callbacks ? | **Non** | Horodater à la réception (`DateTime.UtcNow`) |
|
||||
| 4 | Statut New vs Requested ? | New = interne instantané, traiter `Requested` comme premier état | Ignorer New |
|
||||
| 5 | Créer la Load avant le Transport ? | **Non**, passer les infos dans le transport | Ne PAS appeler `POST /api/loads` |
|
||||
| 6 | Annulation après Retrieved ? | **Non** | Vérifier status iGO avant cancel |
|
||||
| 7 | Cas d'usage de suspended ? | Pré-création transport avant dispo palette | `suspended = false` par défaut |
|
||||
| 8 | X-API-Key vs Bearer ? | **X-API-Key** | Jamais Bearer |
|
||||
| 9 | Retry webhook en cas d'indispo ? | Oui, mais fréquence inconnue | Listener idempotent (transport.id + status) |
|
||||
| 10 | Persistance après reboot iGO ? | **Oui** | Boot : vérifier subscriptions + réconcilier via GET /transports |
|
||||
| 11 | Communication directe ou via iGo Flow ? | **Directe** avec l'API PACS | Pas de couche iGo Flow |
|
||||
|
||||
### Points encore ouverts avec STILL
|
||||
|
||||
| # | Sujet | Statut |
|
||||
|---|-------|--------|
|
||||
| 3b | Fréquence des vehicle/event (pose updates) | ❌ Ouvert |
|
||||
| 5b | customMetaData (taille, caractères, ré-émis ?) | ❌ Ouvert |
|
||||
| 6b | Création/modification de Location via API | ❌ Ouvert (API GET only) |
|
||||
| 7b | Pallet Shuttle (LoadType = 1) | ❌ Ouvert |
|
||||
| 8b | Multi-warehouse | ❌ Ouvert |
|
||||
| 9b | HasTopper (attribut véhicule) | ❌ Ouvert |
|
||||
|
||||
## Points d'attention
|
||||
|
||||
⚠️ **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
|
||||
à coder dans le middleware.
|
||||
|
||||
⚠️ **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.
|
||||
|
||||
⚠️ **Tests de charge webhook à mener** : simuler Gateway iGO down
|
||||
pendant 30s / 1min / 5min pour observer le comportement réel d'iGO
|
||||
(retries, intervalles, abandon).
|
||||
|
||||
## Capacités nouvelles iGO (hors standard EasyWMS)
|
||||
|
||||
- **Suspend / Resume / Restart** d'une flotte ou d'un véhicule individuel
|
||||
- **Pose temps réel** (x, y, orientation) → dashboard live possible
|
||||
- **Battery level** → seuils de notification possibles
|
||||
|
||||
## 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
|
||||
transport ? (@STILL)
|
||||
- [ ] Création/modification de Location via API iGO — limité à GET
|
||||
pour l'instant (@STILL)
|
||||
- [ ] Gestion Pallet Shuttle via iGO (LoadType = 1) — hors scope
|
||||
actuel ? (@Théo)
|
||||
- [ ] Multi-warehouse : iGO suppose un seul site — impact si extension
|
||||
future ? (@Michael)
|
||||
|
||||
## Historique des modifications
|
||||
|
||||
| Date | Auteur | Modification |
|
||||
|------|--------|-------------|
|
||||
| 2026-05-12 | Arthur | Création initiale depuis CR technique iGO STILL |
|
||||
|
||||
## Références
|
||||
|
||||
| Source | Type | Date |
|
||||
|--------|------|------|
|
||||
| CR technique iGO STILL — fonctionnement et flux API v1 | CR technique | 2026-04-28 |
|
||||
| 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 |
|
||||
| Technical specification EXV CB iGo | Datasheet véhicule | 2025 |
|
||||
Reference in New Issue
Block a user