7.3 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
QAUP-Management is an airport collision avoidance and management system built on the RuoYi framework. It integrates vehicle tracking, spatial analysis, and real-time monitoring for airport operations with Spring Boot 3.x and PostgreSQL + PostGIS.
Architecture
Multi-Module Maven Structure
- qaup-admin: Main web application entry point containing controllers and startup configuration
- qaup-collision: Core collision avoidance system with spatial analysis, WebSocket communication, and real-time monitoring
- qaup-framework: Infrastructure layer with security, caching, and common configurations
- qaup-system: User management, RBAC, and system administration
- qaup-common: Shared utilities, constants, and base classes
- qaup-quartz: Scheduled job management
- qaup-generator: Code generation utilities
Key Integration Pattern
The collision avoidance system integrates with RuoYi through QuapDataAdapter (qaup-collision/src/main/java/com/qaup/collision/common/adapter/QuapDataAdapter.java:37), which bridges the collision detection system with RuoYi's service layer, avoiding direct DAO dependencies.
Data Collection and Processing Architecture
Critical Design Principle: Complete Service Separation
DataCollectorService and DataProcessingService MUST be completely separated
Service Responsibilities
-
DataCollectorService (250ms):
- Only collects raw position data from external APIs
- Caches data in activeMovingObjectsCache with NULL speed/direction
- NO calculations, NO processing, NO WebSocket sending
- Purpose: High-frequency data collection to ensure no data loss
-
DataProcessingService (1000ms):
- Reads cached position data from DataCollectorService
- Calculates speed and direction using SpeedCalculationService
- Sends WebSocket position updates
- Performs violation detection and path conflict detection
- Saves data to database
Implementation Pattern
-
DataCollectorService Methods:
collectAircraftData(),collectVehicleData(),collectUnmannedVehicleData()- Store MovingObjects with NULL speed/direction in activeMovingObjectsCache
- FORBIDDEN: No calculations, no WebSocket events, no processing
-
DataProcessingService Methods:
performPeriodicDataProcessing()- main processing loopcalculateSpeedAndDirectionForAllObjects()- calculate derived datasendPositionUpdatesForActiveObjects()- WebSocket messagingperformViolationDetection()- rule engine integrationsaveUnmannedVehicleDataPeriodically()- database persistence
Cache Sharing Pattern
- DataCollectorService owns activeMovingObjectsCache
- DataProcessingService receives cache reference via setActiveMovingObjectsCache()
- Both services share the same cache instance but have different responsibilities
Why Complete Service Separation is Critical
- Data Integrity: High-frequency collection prevents missing position updates
- Performance: Separating collection from processing reduces computational load
- Accuracy: Calculations based on processing intervals (1000ms) are more stable
- Architecture Clarity: Clear separation of concerns makes system more maintainable
- Timing Consistency: Avoids conflicts between collection and calculation frequencies
Violation of This Principle
NEVER place calculation logic in DataCollectorService methods. This will cause:
- WebSocket messages showing speed/direction as 0
- Inconsistent data due to frequency mismatch
- Architecture violations that are difficult to debug
Development Commands
Build and Run
# Full clean build (skip tests for faster builds)
mvn clean install -DskipTests
# Start backend from qaup-admin module
cd qaup-admin
mvn spring-boot:run
# Start frontend (Vue.js)
cd qaup-ui
npm run dev
# Production deployment using script
./ry.sh start
Testing and Debugging
# Check port usage
lsof -ti:8080
# Kill process if needed
kill -9 <process-id>
# View logs
tail -f qaup-admin/app.log
Technology Stack
Backend
- Spring Boot 3.5.3 with Java 17
- PostgreSQL + PostGIS for spatial data
- MyBatis for database operations
- Redis for caching and session management
- WebSocket for real-time communication
- JTS + GeoTools for spatial calculations
Frontend
- Vue 2.6.12 with Element UI
- Axios for API communication
- ECharts for data visualization
Configuration
Database Setup
- PostgreSQL with PostGIS extension enabled
- Run initialization scripts in order:
sql/create_qaup_database.sqlsql/create_sys_vehicle_info_table.sqlsql/create_sys_driver_info_table.sql
Key Configuration Files
qaup-admin/src/main/resources/application.yml: Main configuration including database, Redis, and collision system settingsqaup-ui/vue.config.js: Frontend build configurationqaup-collision/src/main/resources/config/: Spatial configuration files (airport_areas.yaml, airport_roads.yaml)
Important Development Patterns
Data Access
Always use QuapDataAdapter for accessing vehicle and driver data in collision module instead of direct service calls. This maintains clean separation between collision detection and system management.
WebSocket Communication
Real-time data flows through WebSocket endpoints configured in collision module. Messages use /topic prefix for broadcasting to connected clients.
Spatial Data
PostGIS integration handles geometric calculations. Coordinate system defaults to airport center at (120.0834104, 36.35406879).
Performance Optimization
- Data collection interval: 250ms for high-frequency updates
- WebSocket push throttling: 1000ms to prevent frontend overload
- Redis caching with 60-second expiration for real-time data
Version Management
Version Control Files
- VERSION.md: Contains current version number (semantic versioning)
- changelog.md: Detailed change log following Keep a Changelog format
Version Update Process
When making significant changes:
- Update version number in VERSION.md
- Add detailed changelog entry in changelog.md
- Include version update in commit message
- Use semantic versioning (MAJOR.MINOR.PATCH)
- Admin Interface: http://localhost:8080
- API Documentation: http://localhost:8080/swagger-ui/index.html
- WebSocket Endpoint: ws://localhost:8080/ws
Common Issues
Build Problems
- If Maven build fails, ensure Java 17 is active
- For dependency conflicts, use
mvn dependency:treeto analyze
Runtime Issues
- Check Redis connectivity if caching fails
- Verify PostGIS extension is properly installed for spatial operations
- WebSocket connection issues often relate to CORS configuration in SecurityConfig
Speed/Direction Calculation Issues
- CRITICAL: Speed/direction calculations must ONLY occur in processing phase (1000ms), NEVER in collection phase (250ms)
- If speed appears as 0, check if calculations are incorrectly placed in collection phase
- Collection phase should store MovingObjects with NULL speed/direction values
- Processing phase should calculate and update speed/direction for all cached objects before WebSocket sending
- Ensure complete separation: Collection = data only, Processing = calculations only