QAUP_Management/doc/guide.md
Tian jianyong 5e1e9f4507 统一了前后端到一个项目,实现了无人车的位置和超速检测,并发送到前端。
管理端在 Ruoyi 框架的基础上,对菜单进行了修改,并添加了司机信息、车辆信息和车辆类型管理。
2025-07-08 20:04:14 +08:00

351 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# QAUP机场车辆管理系统使用指南
## 系统概述
QAUP是一个集成的机场车辆管理系统包含
- **基础信息管理**:车辆档案、驾驶员信息、车辆类型等
- **实时位置监控**基于PostGIS的空间数据管理
- **碰撞避免系统**:实时安全规则检测和预警
- **轨迹管理**:车辆历史路径记录和分析
## 核心数据结构
### 主要表关系
```
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. **空间查询结果为空**
- 确认坐标系是否为WGS84SRID: 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/` 目录下的相关文档