Ce projet est développé avec : Java 21, Spring boot et Maven
Pour lancer l'appli, il suffit d'exécuter la commande : mvn spring-boot:run
Pour tester l'api POST order voici un exemple de Json:
POST http://localhost:8080/orders/
Content-Type: application/json
{
"orderItems": [
{
"id": 1,
"type": "FROID"
}
],
"totalWeight": 2.5,
"urgent": false
}
Le débit de commandes (throughput) n’étant pas précisé, j’ai opté pour une implémentation synchrone simple :
la création de commande et le dispatch sont réalisés dans la même transaction ;
à la fin de l’appel HTTP, la commande est soit ASSIGNED, soit PENDING.
Dans un contexte de WMS avec des milliers de commandes par seconde, on pourrait envisager une architecture asynchrone : publication d’un événement OrderCreated dans un message broker (Kafka / RabbitMQ, etc.) ; un consommateur dédié applique la stratégie de dispatch en arrière-plan.
La logique de dispatch reste isolée dans le domaine, ce qui permettrait de la réutiliser facilement dans un scénario asynchrone.
-
Ajouter une validation des requêtes (Bean Validation sur les DTO : poids > 0, liste d’articles non vide, etc.).
-
Mettre en place une gestion centralisée des erreurs :
- validation → réponses HTTP 400 avec un message clair,
- erreurs techniques inattendues → 500 + log côté serveur.
- utiliser un
@ControllerAdviceglobal pour mapper les exceptions vers des réponses JSON cohérentes.
-
Mettre en place un scheduler pour réessayer automatiquement le dispatch des commandes en statut PENDING.
-
Revoir la stratégie de concurrence :
-
Envisager l'utilisation d'un verrou (lock) sur la station lors de la mise à jour de sa capacité pour éviter les race conditions quand plusieurs commandes ciblent la même station en parallèle ;
- à challenger : pessimistic lock, optimistic lock, ou autre stratégie selon le volume réel.
-
Clarifier les règles métier pour les autres types (SEC, VRAC, panier mixte, etc.) et compléter les tests en conséquence.
-
Ajouter le endpoint dashboard.
-
Tester la stratégie de dispatching des commandes
-
Ajouter la couche securité
-
Modélisation des relations :
- Remplacer la relation directe
Order↔Article(ManyToMany) par une entité intermédiaireOrderLine:Order 1 ─ * OrderLine * ─ 1 Article- permet de stocker les informations de ligne (quantité, poids, etc.) et de simplifier l’évolution du modèle.
- Remplacer la relation directe