Application web moderne pour optimiser les tournées de livraison à vélo
Démarrage Rapide • Documentation • Architecture • Fonctionnalités
- À Propos
- Fonctionnalités
- Technologies
- Prérequis
- Installation
- Démarrage Rapide
- Architecture
- Structure du Projet
- API REST
- Interface Utilisateur
- Tests
- Contribution
- Résolution des Problèmes
- Licence
Pickup & Delivery est une application web full-stack développée pour optimiser la gestion des tournées de livraison à vélo en milieu urbain. Elle permet de :
- 📍 Charger et visualiser des cartes urbaines interactives
- 📦 Gérer des demandes de livraison avec points de pickup et delivery
- 🚴 Calculer des tournées optimisées pour plusieurs coursiers
- ⏱️ Respecter une contrainte de temps maximale (4 heures par tournée)
- 📊 Visualiser en temps réel les itinéraires sur une carte OpenStreetMap
- 💾 Sauvegarder et restaurer des tournées
Projet développé dans le cadre du cours d'Agilité - 4IF H34 à l'INSA Lyon.
- ✅ Import de cartes au format XML
- ✅ Visualisation interactive avec Leaflet/OpenStreetMap
- ✅ Affichage des intersections et tronçons
- ✅ Zoom, déplacement et mode plein écran
- ✅ Sélection visuelle de nœuds sur la carte
- ✅ Import de demandes depuis fichiers XML
- ✅ Ajout manuel de demandes (pickup/delivery)
- ✅ Visualisation des demandes avec marqueurs colorés
- ✅ Modification et suppression de demandes
- ✅ Gestion de l'entrepôt (warehouse)
- ✅ Algorithme d'optimisation TSP (Traveling Salesman Problem)
- ✅ Support multi-coursiers (1 à N coursiers)
- ✅ Respect de la contrainte de 4 heures maximum
- ✅ Gestion des demandes non assignées
- ✅ Recalcul automatique après modifications
- ✅ Vue Accueil : Page d'introduction
- ✅ Vue Carte : Visualisation et gestion des tournées
- ✅ Vue Demandes : Liste des demandes de livraison
- ✅ Vue Tournées : Demandes non assignées et statistiques
- ✅ Mode édition interactif
- ✅ Réassignation de demandes entre coursiers
- ✅ Désassignation de demandes (deviennent non assignées)
- ✅ Validation ou annulation des modifications
- ✅ Aperçu en temps réel des changements
- ✅ Export des itinéraires en format texte (.txt)
- ✅ Export des tournées complètes en JSON
- ✅ Import de tournées depuis JSON
- ✅ Historique et versioning
☕ Java 17
🌱 Spring Boot 3.2
🏗️ Spring MVC (REST API)
🔧 Maven 3.9+
📦 Lombok (annotations)
✅ JUnit 5 (tests unitaires)
🧪 Mockito (mocking)
⚛️ React 19.2
⚡ Vite 6.0 (build tool)
🗺️ Leaflet & React-Leaflet
🎨 Tailwind CSS 3.4
🎭 Lucide React (icônes)
🌐 Fetch API (HTTP client)
📝 Visual Studio Code
☕ IntelliJ IDEA (optionnel)
📦 npm / pnpm
🔄 Git
Avant de commencer, assurez-vous d'avoir installé :
- ☕ Java JDK 17+ (Télécharger)
- 📦 Node.js 18+ (Télécharger)
- 🔧 Maven 3.9+ (Télécharger)
# Vérifier Java
java -version
# Devrait afficher: openjdk version "17.x.x" ou supérieur
# Vérifier Node.js
node -v
# Devrait afficher: v18.x.x ou supérieur
# Vérifier Maven
mvn -v
# Devrait afficher: Apache Maven 3.9.x ou supérieurgit clone https://github.com/mlemseffer/PickupAndDelivery.git
cd PickupAndDeliverycd backend
mvn clean installCette commande va :
- 📥 Télécharger toutes les dépendances Maven
- 🔨 Compiler le code Java
- ✅ Exécuter les tests unitaires
- 📦 Créer le fichier JAR exécutable
cd ../frontend
npm installCette commande va :
- 📥 Télécharger toutes les dépendances npm
- 🔧 Préparer l'environnement de développement
# Double-cliquer sur :
start.bat
# Ou en ligne de commande :
.\start.bat# Rendre le script exécutable (première fois uniquement)
chmod +x start.sh
# Lancer l'application
./start.shcd backend
mvn spring-boot:run✅ Le backend démarre sur http://localhost:8080
cd frontend
npm run dev✅ Le frontend démarre sur http://localhost:5173
Ouvrez votre navigateur et accédez à :
http://localhost:5173
🎉 C'est prêt ! Vous pouvez maintenant utiliser l'application.
┌─────────────────────────────────────────────────────────────┐
│ NAVIGATEUR WEB │
│ (http://localhost:5173) │
└──────────────────────┬──────────────────────────────────────┘
│ HTTP/JSON
▼
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND (React + Vite) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Composants React │ │
│ │ • Navigation │ │
│ │ • MapViewer (Leaflet) │ │
│ │ • TourTabs │ │
│ │ • DeliveryRequestUploader │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Services │ │
│ │ • apiService.js (API Client) │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────────────┘
│ REST API
│ (Fetch HTTP/JSON)
▼
┌─────────────────────────────────────────────────────────────┐
│ BACKEND (Spring Boot REST API) │
│ (http://localhost:8080) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Controllers (REST Endpoints) │ │
│ │ • MapController → /api/maps │ │
│ │ • DeliveryController → /api/deliveries │ │
│ │ • TourController → /api/tours │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Services (Business Logic) │ │
│ │ • MapService │ │
│ │ • DeliveryService │ │
│ │ • TourService │ │
│ │ • TourOptimizationService │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Models (Domain Objects) │ │
│ │ • Map, Node, Segment │ │
│ │ • DeliveryRequest, DeliveryRequestSet │ │
│ │ • Tour, TourSegment, Stop │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
L'application suit une architecture en couches avec séparation claire des responsabilités :
Controller Layer → Gestion des requêtes HTTP REST
↓
Service Layer → Logique métier et orchestration
↓
Model Layer → Objets du domaine métier
Components → Interface utilisateur
↓
Services → Communication avec l'API
↓
State Management → Gestion de l'état (React hooks)
PickupAndDelivery/
│
├── 📁 backend/ # Backend Spring Boot
│ ├── 📁 src/main/java/com/pickupdelivery/
│ │ ├── 📁 controller/ # REST Controllers
│ │ │ ├── MapController.java
│ │ │ ├── DeliveryController.java
│ │ │ └── TourController.java
│ │ ├── 📁 service/ # Business Logic
│ │ │ ├── MapService.java
│ │ │ ├── DeliveryService.java
│ │ │ ├── TourService.java
│ │ │ └── TourOptimizationService.java
│ │ ├── 📁 model/ # Domain Models
│ │ │ ├── Map.java
│ │ │ ├── DeliveryRequest.java
│ │ │ └── Tour.java
│ │ ├── 📁 dto/ # Data Transfer Objects
│ │ │ └── ApiResponse.java
│ │ └── 📁 util/ # Utilities
│ │ └── XMLParser.java
│ ├── 📁 src/test/ # Tests unitaires
│ └── pom.xml # Maven configuration
│
├── 📁 frontend/ # Frontend React
│ ├── 📁 src/
│ │ ├── 📁 components/ # Composants React
│ │ │ ├── Navigation.jsx
│ │ │ ├── MapViewer.jsx
│ │ │ ├── TourTabs.jsx
│ │ │ ├── TourTable.jsx
│ │ │ ├── DeliveryRequestUploader.jsx
│ │ │ ├── ManualDeliveryForm.jsx
│ │ │ ├── TourActions.jsx
│ │ │ └── CustomAlert.jsx
│ │ ├── 📁 services/ # API Services
│ │ │ └── apiService.js
│ │ └── Front.jsx # Composant principal
│ ├── index.html
│ ├── main.jsx
│ ├── package.json
│ └── vite.config.js
│
├── 📁 fichiersXMLPickupDelivery/ # Fichiers XML de test
│ ├── petitPlan.xml
│ ├── moyenPlan.xml
│ ├── grandPlan.xml
│ ├── demandePetit1.xml
│ └── ...
│
├── 📄 README.md # Ce fichier
├── 📄 BANNER.txt # Bannière ASCII
├── 🚀 start.bat # Script Windows
└── 🚀 start.sh # Script Linux/macOS
POST /api/maps/upload
GET /api/maps/current
DELETE /api/maps/clearExemple : Charger une carte
curl -X POST http://localhost:8080/api/maps/upload \
-F "file=@petitPlan.xml"POST /api/deliveries/upload # Upload XML demandes
POST /api/deliveries/add # Ajouter une demande
GET /api/deliveries/current # Obtenir demandes actuelles
DELETE /api/deliveries/{id} # Supprimer une demande
DELETE /api/deliveries # Vider toutes les demandes
POST /api/deliveries/warehouse # Définir l'entrepôtExemple : Ajouter une demande manuellement
curl -X POST http://localhost:8080/api/deliveries/add \
-H "Content-Type: application/json" \
-d '{
"pickupAddress": "123",
"deliveryAddress": "456",
"pickupDuration": 300,
"deliveryDuration": 300
}'POST /api/tours/calculate # Calculer tournée
POST /api/tours/recalculate # Recalculer avec assignments
PUT /api/tours/assignments # Modifier assignmentsExemple : Calculer une tournée pour 2 coursiers
curl -X POST http://localhost:8080/api/tours/calculate?courierCount=2Toutes les réponses suivent ce format standardisé :
{
"success": true,
"message": "Opération réussie",
"data": { ... }
}En cas d'erreur :
{
"success": false,
"message": "Description de l'erreur",
"data": null
}L'interface est organisée en 4 onglets principaux :
- Page d'introduction
- Instructions de démarrage
- Carte interactive : Visualisation OpenStreetMap avec Leaflet
- Panneau de contrôle :
- Sélecteur de nombre de coursiers
- Boutons d'action (Ajouter, Calculer, Modifier, Sauvegarder)
- Affichage des tournées : Onglets multi-coursiers avec couleurs distinctes
- Mode édition : Modification interactive des assignments
- Liste complète des demandes de livraison
- Détails de chaque demande (pickup, delivery, durées)
- Demandes non assignées : Liste des demandes qui n'ont pas pu être assignées
- Statistiques : Métriques globales des tournées
- 🖱️ Zoom : Molette de la souris ou boutons +/-
- 🤚 Déplacement : Cliquer-glisser
- 🖼️ Plein écran : Bouton d'extension
- 📍 Sélection de nœuds : Mode sélection pour l'ajout manuel
- 🔵 Tronçons bleus : Segments de rue de la carte
- 🟢 Tronçons verts : Segments de rue en mode sélection
- 🎨 Polylignes colorées : Itinéraires des coursiers
- 📍 Marqueurs : Points de pickup (🟢) et delivery (🔴)
Le mode édition permet de modifier les tournées calculées :
- Cliquer sur "Modifier Tournée" après avoir calculé une tournée
- Réassigner des demandes :
- Sélectionner un coursier dans le menu déroulant
- Ou désassigner (retirer de la tournée)
- Aperçu en temps réel :
- Les demandes désassignées apparaissent immédiatement dans "Non assignées"
- Les changements sont visibles en temps réel
- Valider ou Annuler :
- ✅ Valider : Recalcule les tournées avec les nouveaux assignments
- ❌ Annuler : Annule toutes les modifications
cd backend
mvn testTests disponibles :
- ✅ MapServiceTest
- ✅ DeliveryServiceTest
- ✅ TourServiceTest
- ✅ XMLParserTest
- ✅ Integration Tests
mvn test jacoco:reportLe rapport de couverture sera généré dans :
backend/target/site/jacoco/index.html
- Fork le projet
- Créer une branche :
git checkout -b feature/ma-nouvelle-fonctionnalite - Commit vos changements :
git commit -am 'Ajout d'une nouvelle fonctionnalité' - Push vers la branche :
git push origin feature/ma-nouvelle-fonctionnalite - Ouvrir une Pull Request
- ✅ Suivre les conventions Java standard
- ✅ Utiliser les annotations Lombok
- ✅ Documenter avec JavaDoc
- ✅ Écrire des tests unitaires
- ✅ Utiliser ES6+ moderne
- ✅ Suivre les conventions React (hooks, composants fonctionnels)
- ✅ Documenter avec JSDoc
- ✅ Utiliser Tailwind CSS pour le styling
Problème : Port 8080 already in use
# Windows
netstat -ano | findstr :8080
taskkill /PID <PID> /F
# Linux/macOS
lsof -i :8080
kill -9 <PID>Problème : Erreurs de compilation Maven
# Nettoyer et réinstaller
mvn clean install -UProblème : Port 5173 already in use
# Modifier le port dans vite.config.js
server: {
port: 5174
}Problème : Erreurs de dépendances npm
# Supprimer node_modules et réinstaller
rm -rf node_modules package-lock.json
npm installSi vous rencontrez des erreurs CORS, vérifiez la configuration dans :
// backend/src/main/java/com/pickupdelivery/controller/*Controller.java
@CrossOrigin(origins = {"http://localhost:5173", "http://localhost:5174"})Ce projet est développé dans un cadre académique pour l'INSA Lyon.
Utilisation : Projet éducatif - INSA Lyon - 4IF H34
- Développeurs : Équipe Projet Agilité 4IF
- Établissement : INSA Lyon
- Cours : Agilité - 4IF H34
- Année : 2024-2025
Pour toute question ou problème :
- 📖 Consultez d'abord la documentation
- 🐛 Vérifiez la section résolution de problèmes
- 💬 Ouvrez une issue sur GitHub
- 📧 Contactez l'équipe pédagogique
- ✅ Architecture REST complète
- ✅ Interface utilisateur moderne
- ✅ Calcul de tournées multi-coursiers
- ✅ Mode édition interactif
- ✅ Sauvegarde/Restauration
- 🔄 Optimisation de l'algorithme TSP
- 📊 Dashboard avec statistiques avancées
- 🔐 Authentification utilisateur
- 💾 Persistance en base de données
- 🌍 Support multilingue
- 📱 Application mobile
- 🔔 Notifications en temps réel
- 📈 Analytics et reporting
- 🎓 INSA Lyon pour le cadre pédagogique
- 🗺️ OpenStreetMap pour les données cartographiques
- ⚛️ React et Spring Boot pour les frameworks
- 🌱 La communauté open-source
⭐ Si ce projet vous est utile, n'hésitez pas à le mettre en favoris !
Made with ❤️ at INSA Lyon