# QAUP机场车辆管理系统使用指南 ## 系统概述 QAUP是一个集成的机场车辆管理系统,包含: - **基础信息管理**:车辆档案、驾驶员信息、车辆类型等 - **实时位置监控**:基于PostGIS的空间数据管理 - **碰撞避免系统**:实时安全规则检测和预警 - **轨迹管理**:车辆历史路径记录和分析 - **航空器生命周期模拟**:CA3456航空器状态和路由模拟系统 ## API接口测试 ### 航空器生命周期模拟API 系统提供了完整的航空器生命周期模拟API,支持CA3456航空器的状态循环和路由管理。 #### 1. 登录认证 ```bash # 基本登录(推荐) curl -X POST "http://localhost:8090/login?username=dianxin&password=dianxin@123" # 使用表单数据登录 curl -X POST "http://localhost:8090/login" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=dianxin&password=dianxin@123" # 使用JSON数据登录 curl -X POST "http://localhost:8090/login" \ -H "Content-Type: application/json" \ -d '{"username":"dianxin","password":"dianxin@123"}' ``` **预期响应:** ```json { "data": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY", "msg": "登入成功", "status": 200 } ``` #### 2. 航空器状态查询 ```bash # 查询CA3456当前状态 curl -X GET "http://localhost:8090/aircraftStatusController/getAircraftStatus" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" ``` **预期响应:** ```json { "data": { "contactCross": "F1", "flightNo": "CA3456", "inRunway": "35", "outRunway": "34", "seat": "138", "timestamp": 1752567616199, "type": "IN" // 状态: IN(进港), ARRIVED(到达), OUT(出港) }, "msg": "航空器状态查询成功", "status": 200 } ``` #### 3. 进港路由查询 ```bash # 查询进港滑行路线 curl -X GET "http://localhost:8090/runwayPathPlanningController/findArrTaxiwayByRunwayAndContactCrossAndSeat?inRunway=35&outRunway=34&contactCross=F1&seat=138" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" ``` **预期响应:** ```json { "data": { "type": "IN", "status": "COMPLETE", "codes": "F1,L4,138", "geometry": null, "geoPath": { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [120.086263, 36.370484], [120.085000, 36.370000], [120.084000, 36.369500], [120.083000, 36.369000], [120.082000, 36.368500], [120.081000, 36.368000], [120.080996, 36.369105] ] }, "properties": { "code": "L4" } } ] } }, "msg": "进港滑行路线查询成功", "status": 200 } ``` #### 4. 出港路由查询 ```bash # 查询出港滑行路线 curl -X GET "http://localhost:8090/runwayPathPlanningController/findDepTaxiwayByRunwayAndContactCrossAndSeat?inRunway=35&outRunway=34&startSeat=138" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" ``` **预期响应:** ```json { "data": { "type": "OUT", "status": "COMPLETE", "codes": "138,L4,F1", "geometry": null, "geoPath": { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [120.080996, 36.369105], [120.081000, 36.368000], [120.082000, 36.368500], [120.083000, 36.369000], [120.084000, 36.369500], [120.085000, 36.370000], [120.086263, 36.370484] ] }, "properties": { "code": "L4" } } ] } }, "msg": "出港滑行路线查询成功", "status": 200 } ``` #### 5. 状态循环测试 ```bash # 连续监控CA3456状态变化 for i in {1..6}; do echo "=== 第 $i 次调用 ($(date +%H:%M:%S)) ===" curl -s -X GET "http://localhost:8090/aircraftStatusController/getAircraftStatus" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" \ | python3 -c "import sys,json; data=json.load(sys.stdin); print(f'状态: {data[\"data\"][\"type\"]}, 航班号: {data[\"data\"][\"flightNo\"]}, 时间戳: {data[\"data\"][\"timestamp\"]}')" sleep 15 done ``` **预期输出:** ``` === 第 1 次调用 (16:22:45) === 状态: IN, 航班号: CA3456, 时间戳: 1752567765233 === 第 2 次调用 (16:23:00) === 状态: IN, 航班号: CA3456, 时间戳: 1752567780372 === 第 3 次调用 (16:23:15) === 状态: ARRIVED, 航班号: CA3456, 时间戳: 1752567795496 === 第 4 次调用 (16:23:30) === 状态: ARRIVED, 航班号: CA3456, 时间戳: 1752567810629 === 第 5 次调用 (16:23:45) === 状态: IN, 航班号: CA3456, 时间戳: 1752567825769 === 第 6 次调用 (16:24:00) === 状态: IN, 航班号: CA3456, 时间戳: 1752567840897 ``` #### 6. 路由API简化测试 ```bash # 简化的路由测试 echo "=== 测试进港路由 ===" curl -s -X GET "http://localhost:8090/runwayPathPlanningController/findArrTaxiwayByRunwayAndContactCrossAndSeat?inRunway=35&outRunway=34&contactCross=F1&seat=138" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" \ | python3 -c "import sys,json; data=json.load(sys.stdin); print(f'路由类型: {data[\"data\"][\"type\"]}, 编码: {data[\"data\"][\"codes\"]}, 状态: {data[\"data\"][\"status\"]}')" echo "=== 测试出港路由 ===" curl -s -X GET "http://localhost:8090/runwayPathPlanningController/findDepTaxiwayByRunwayAndContactCrossAndSeat?inRunway=35&outRunway=34&startSeat=138" \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzI3ODMwOTAsInVzZXJuYW1lIjoiYWRtaW4ifQ.y9feEL_9NT8UzED9NNkb0Ln6C-PBoufiSHWobWe5vWY" \ | python3 -c "import sys,json; data=json.load(sys.stdin); print(f'路由类型: {data[\"data\"][\"type\"]}, 编码: {data[\"data\"][\"codes\"]}, 状态: {data[\"data\"][\"status\"]}')" ``` ### CA3456生命周期说明 CA3456航空器按照以下周期进行状态模拟: 1. **进港阶段(30秒)**:`type = "IN"` - 航空器正在进场,执行进港滑行 - 使用进港路由:F1,L4,138 2. **停留阶段(60秒)**:`type = "ARRIVED"` - 航空器已到达机位,进行客货作业 - 停留在138机位 3. **出港阶段(30秒)**:`type = "OUT"` - 航空器开始出港,执行出港滑行 - 使用出港路由:138,L4,F1 4. **循环周期**:总计122秒(包含2秒状态切换时间) ### WebSocket连接测试 系统支持WebSocket实时推送,可以通过以下方式连接: ```javascript // WebSocket连接示例 const ws = new WebSocket('ws://localhost:8080/ws'); ws.onmessage = function(event) { const data = JSON.parse(event.data); if (data.type === 'aircraftRouteUpdate') { console.log('收到航空器路由更新:', data.data); } }; ``` ### 故障排除 #### 常见错误 1. **认证失败(401)**: - 检查token是否正确 - 确认Authorization header格式:`Bearer ` 2. **连接超时**: - 检查Mock服务是否运行在端口8090 - 确认Java服务是否运行在端口8080 3. **状态不变化**: - 等待完整的状态周期(122秒) - 检查Mock服务日志 #### 服务状态检查 ```bash # 检查Mock服务状态 curl -I http://localhost:8090/login # 检查Java服务状态 curl -I http://localhost:8080/actuator/health ``` ## 核心数据结构 ### 主要表关系 ``` sys_vehicle_info (基础信息) ├── vehicle_id: 数字ID (主键) └── license_plate_number: 车牌号 vehicle_locations (实时位置) ├── vehicle_id: 车牌号 (业务标识) ├── license_plate: 车牌号 (明确语义) └── sys_vehicle_id: 关联数字ID 通过车牌号关联: license_plate_number ↔ license_plate ``` ### 业务视图 - `vehicle_complete_info`: 车辆基础信息 + 最新位置 - `vehicle_info_with_location`: 车辆信息与位置详细关联 - `vehicle_status_summary`: 车辆实时状态统计 - `vehicle_trajectory_view`: 车辆轨迹查询 ## 实际使用指南 ### 1. 车辆数据查询 #### 基础查询 ```sql -- 查询所有车辆基础信息 SELECT vehicle_id, license_plate_number, brand, owning_unit, contact_person FROM sys_vehicle_info; -- 查询指定车辆详细信息 SELECT * FROM sys_vehicle_info WHERE license_plate_number = '京A12345'; ``` #### 车辆完整信息查询(推荐) ```sql -- 根据车牌号查询车辆完整信息(基础信息+最新位置) SELECT vehicle_plate, brand, owning_unit, status, longitude, latitude, speed, last_update_time FROM vehicle_info_with_location WHERE vehicle_plate = '京A12345'; -- 查询所有活跃车辆 SELECT vehicle_plate, brand, status, speed, last_update_time FROM vehicle_info_with_location WHERE status = 'ACTIVE' ORDER BY last_update_time DESC; -- 查询离线车辆 SELECT vehicle_plate, brand, status, last_update_time FROM vehicle_info_with_location WHERE status = 'OFFLINE' ORDER BY last_update_time DESC; ``` #### 车辆状态统计 ```sql -- 各类型车辆状态统计 SELECT vehicle_type, total_vehicles, active_vehicles, inactive_vehicles, avg_speed, max_speed FROM vehicle_status_summary; -- 当前活跃车辆数量 SELECT COUNT(*) as active_count FROM vehicle_info_with_location WHERE status = 'ACTIVE'; ``` ### 2. 空间查询 #### 位置范围查询 ```sql -- 查询指定经纬度范围内的车辆 SELECT vi.vehicle_plate, vi.brand, vi.speed, vi.longitude, vi.latitude FROM vehicle_info_with_location vi WHERE vi.longitude BETWEEN 116.3 AND 116.4 AND vi.latitude BETWEEN 39.9 AND 40.0 AND vi.status = 'ACTIVE'; -- 查询距离指定点特定距离内的车辆(使用PostGIS函数) SELECT vl.vehicle_id, vl.speed, ST_AsText(vl.location) as position, ST_Distance(vl.location, ST_Point(116.33, 39.95)) as distance_meters FROM vehicle_locations vl WHERE ST_DWithin(vl.location, ST_Point(116.33, 39.95), 1000) -- 1000米范围内 AND vl.timestamp > NOW() - INTERVAL '10 minutes' ORDER BY distance_meters; ``` #### 机场区域查询 ```sql -- 查询特定区域内的车辆 SELECT vl.vehicle_id, vl.speed, aa.name as area_name FROM vehicle_locations vl JOIN airport_areas aa ON ST_Within(vl.location, aa.boundary) WHERE aa.area_id = 'RUNWAY_01' AND vl.timestamp > NOW() - INTERVAL '5 minutes'; -- 查询所有机场区域 SELECT area_id, name, type, speed_limit_kph, restricted FROM airport_areas WHERE enabled = true ORDER BY name; ``` ### 3. 轨迹数据查询 #### 车辆历史轨迹 ```sql -- 查询车辆最近7天的轨迹统计 SELECT vehicle_plate, trajectory_date, total_distance, max_speed, avg_speed, duration_seconds FROM vehicle_trajectory_view WHERE vehicle_plate = '京A12345' AND trajectory_date >= CURRENT_DATE - INTERVAL '7 days' ORDER BY trajectory_date DESC; -- 查询车辆详细位置历史 SELECT vehicle_id, ST_AsText(location) as position, speed, heading, timestamp FROM vehicle_locations WHERE vehicle_id = '京A12345' AND timestamp BETWEEN '2025-01-15 08:00:00' AND '2025-01-15 18:00:00' ORDER BY timestamp; ``` #### 轨迹分析 ```sql -- 统计车辆每日行驶距离 SELECT vehicle_plate, DATE(start_time) as date, SUM(total_distance) as daily_distance, MAX(max_speed) as daily_max_speed FROM vehicle_trajectory_view WHERE vehicle_plate = '京A12345' AND start_time >= CURRENT_DATE - INTERVAL '30 days' GROUP BY vehicle_plate, DATE(start_time) ORDER BY date DESC; ``` ### 4. 安全规则和事件查询 #### 规则违反事件 ```sql -- 查询最近的违规事件 SELECT event_id, rule_id, subject_id as vehicle_plate, violation_type, severity, ST_AsText(location) as violation_location, detected_at, response_status FROM rule_violation_events WHERE detected_at > NOW() - INTERVAL '24 hours' ORDER BY detected_at DESC; -- 查询特定车辆的违规历史 SELECT event_id, violation_type, severity, detected_at FROM rule_violation_events WHERE subject_id = '京A12345' AND subject_type = 'VEHICLE' ORDER BY detected_at DESC; ``` #### 安全规则管理 ```sql -- 查询所有活跃的安全规则 SELECT rule_id, rule_name, rule_category, alert_level, status FROM spatial_rules WHERE status = 'ACTIVE' ORDER BY priority, rule_name; ``` ### 5. 数据同步管理 #### 数据同步操作 ```sql -- 执行车辆ID同步(当新增车辆信息时) SELECT update_sys_vehicle_id(); -- 检查数据同步状态 SELECT 'vehicle_locations' as table_name, COUNT(*) as total_records, COUNT(license_plate) as has_license_plate, COUNT(sys_vehicle_id) as has_sys_vehicle_id FROM vehicle_locations UNION ALL SELECT 'vehicle_trajectories' as table_name, COUNT(*) as total_records, COUNT(license_plate) as has_license_plate, COUNT(sys_vehicle_id) as has_sys_vehicle_id FROM vehicle_trajectories; ``` #### 数据清理 ```sql -- 清理历史位置数据(保留最近30天) DELETE FROM vehicle_locations WHERE timestamp < NOW() - INTERVAL '30 days'; -- 清理已解决的违规事件(保留最近7天) DELETE FROM rule_violation_events WHERE response_status = 'RESOLVED' AND resolved_at < NOW() - INTERVAL '7 days'; ``` ## 开发建议 ### ✅ 推荐做法 1. **统一使用车牌号作为业务标识符** ```sql -- 推荐:使用车牌号查询 SELECT * FROM vehicle_info_with_location WHERE vehicle_plate = '京A12345'; ``` 2. **优先使用业务视图进行复杂查询** ```sql -- 推荐:使用视图获取完整信息 SELECT * FROM vehicle_info_with_location; -- 避免:手动关联多个表 -- SELECT * FROM sys_vehicle_info vi JOIN vehicle_locations vl ON ...; ``` 3. **定期执行数据同步** ```sql -- 建议在车辆信息变更后执行 SELECT update_sys_vehicle_id(); ``` 4. **使用PostGIS函数进行空间查询** ```sql -- 推荐:使用PostGIS函数 SELECT * FROM vehicle_locations WHERE ST_DWithin(location, ST_Point(116.33, 39.95), 1000); ``` ### ⚠️ 注意事项 1. **数据类型一致性** - `sys_vehicle_info.vehicle_id`: BIGINT(数字ID) - `vehicle_locations.vehicle_id`: VARCHAR(车牌号) - 关联通过:`license_plate_number` ↔ `license_plate` 2. **时区处理** - 新表使用 `TIMESTAMP WITH TIME ZONE` - 查询时注意时区一致性 3. **空间坐标系** - 所有空间数据使用 WGS84 坐标系(SRID: 4326) - 经度范围:-180 到 180 - 纬度范围:-90 到 90 4. **性能优化** - 大量空间查询时使用已建立的GIST索引 - 时间范围查询利用时间戳索引 - 避免全表扫描,善用WHERE条件 ## 常用查询模板 ### 实时监控查询 ```sql -- 车辆实时状态大屏 SELECT COUNT(*) as total_vehicles, COUNT(CASE WHEN status = 'ACTIVE' THEN 1 END) as active_vehicles, COUNT(CASE WHEN status = 'INACTIVE' THEN 1 END) as inactive_vehicles, COUNT(CASE WHEN status = 'OFFLINE' THEN 1 END) as offline_vehicles, AVG(CASE WHEN status = 'ACTIVE' THEN speed END) as avg_speed FROM vehicle_info_with_location; ``` ### 区域车辆分布 ```sql -- 各区域车辆分布统计 SELECT aa.name as area_name, aa.type as area_type, COUNT(vl.vehicle_id) as vehicle_count FROM airport_areas aa LEFT JOIN vehicle_locations vl ON ST_Within(vl.location, aa.boundary) AND vl.timestamp > NOW() - INTERVAL '5 minutes' WHERE aa.enabled = true GROUP BY aa.area_id, aa.name, aa.type ORDER BY vehicle_count DESC; ``` ### 安全监控查询 ```sql -- 安全事件实时监控 SELECT COUNT(*) as total_events, COUNT(CASE WHEN severity = 'CRITICAL' THEN 1 END) as critical_events, COUNT(CASE WHEN severity = 'HIGH' THEN 1 END) as high_events, COUNT(CASE WHEN response_status = 'PENDING' THEN 1 END) as pending_events FROM rule_violation_events WHERE detected_at > NOW() - INTERVAL '1 hour'; ``` ## 故障排除 ### 常见问题 1. **车辆位置数据无法关联** - 检查车牌号格式是否一致 - 执行数据同步:`SELECT update_sys_vehicle_id();` 2. **空间查询结果为空** - 确认坐标系是否为WGS84(SRID: 4326) - 检查经纬度值是否合理 3. **性能问题** - 检查是否使用了适当的索引 - 时间范围查询添加时间限制条件 ### 数据检查命令 ```sql -- 检查PostGIS扩展 SELECT PostGIS_Version(); -- 检查表结构 \d+ vehicle_locations \d+ sys_vehicle_info -- 检查数据完整性 SELECT table_name, column_name FROM information_schema.columns WHERE table_name LIKE 'vehicle%' AND column_name IN ('license_plate', 'sys_vehicle_id'); ``` --- ## 联系支持 如有问题,请查看: - 系统日志:`logs/` 目录 - 数据库日志:PostgreSQL日志 - 开发文档:`doc/` 目录下的相关文档