CollisionAvoidanceSystem/doc/work/api_integration_improvement_task.md

561 lines
19 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.

# 上下文
文件名api_integration_improvement_task.md
创建于2025-01-27
创建者AI
# 任务描述
根据官方API文档(doc/requirement/official_api.md),完整实现外部接口对接需求。项目需要实现:
1. 机场位置数据接口对接(航空器位置、车辆位置)
2. 无人车控制接口实现(控制指令、位置上报、状态上报)
3. 数据持久化:无人车位置数据和控制指令需保存到数据库用于轨迹回放和日志审计
4. 其他数据(航空器位置、其他车辆位置、红绿灯状态、无人车状态)仅用于实时处理,不需存储
# 项目概述
CollisionAvoidanceSystem是一个基于Spring Boot的机场防撞系统使用Java开发包含数据采集、数据处理、区域管理、道路管理等模块支持WebSocket实时通信。
---
*以下部分由 AI 在协议执行过程中维护*
---
# 分析 (由 RESEARCH 模式填充)
## 现有架构分析
### 1. 数据采集模块现状
- **AuthService**: 已实现机场API认证支持token获取和刷新
- **DataCollectorDao**: 已实现航空器和特种车辆数据采集
- **DataCollectorService**: 定时采集服务,但无人车数据采集不完整
- **配置**: 已配置机场API和无人车API的基础URL和端点
### 2. 数据存储架构
- **PostGIS集成**: 已完整实现,支持空间数据查询
- **VehicleLocation实体**: 已实现支持车辆位置的PostGIS存储
- **VehicleLocationRepository**: 提供丰富的空间查询功能
- **VehicleLocationService**: 完整的位置数据管理服务
### 3. 控制器层现状
- **DataMonitorController**: 基础监控控制器,功能简单
- **GeopositionController**: WebSocket地理位置控制器仅支持查询
- **缺失**: 无人车控制指令接口、位置上报接口、状态查询接口
### 4. 数据模型分析
- **现有模型**: Aircraft, SpecialVehicle, UnmannedVehicle
- **API模型**: VehicleLocationInfo, VehicleCommand, VehicleStateInfo
- **存储模型**: VehicleLocation (PostGIS)
## 接口需求分析
### 1. 机场位置数据接口(已部分实现)
- ✅ 登录认证接口
- ✅ 航空器位置数据接入
- ✅ 车辆位置数据接入
- ❌ 数据持久化策略需调整(仅无人车数据需存储)
### 2. 无人车控制接口(需完整实现)
- ❌ 无人车控制指令接口 (POST /api/VehicleCommandInfo)
- ❌ 无人车位置上报接口 (GET /api/VehicleLocationInfo)
- ❌ 无人车状态上报接口 (POST /api/VehicleStateInfo)
### 3. 数据持久化需求
- **需要存储**: 无人车位置数据、无人车控制指令
- **不需存储**: 航空器位置、其他车辆位置、红绿灯状态、无人车状态
- **用途**: 轨迹回放、日志审计
## 技术差距识别
### 1. 缺失的数据模型
- 无人车控制指令存储实体
- 控制指令日志审计实体
### 2. 缺失的接口实现
- 无人车控制指令处理逻辑
- 无人车位置数据获取接口
- 无人车状态查询接口
### 3. 数据流程问题
- 无人车数据采集不完整
- 控制指令发送机制缺失
- 数据持久化策略不明确
### 4. 配置和集成
- 无人车厂商API集成不完整
- 控制指令路由配置缺失
- 错误处理和重试机制不完善
# 提议的解决方案 (由 INNOVATE 模式填充)
## 解决方案架构设计
### 方案1: 渐进式扩展架构(推荐)
**核心思路**: 在现有PostGIS架构基础上增量式添加无人车控制功能保持系统稳定性。
**优势**:
- 充分利用现有VehicleLocation和空间查询能力
- 最小化对现有代码的影响
- 开发风险低,可分阶段实施
- 保持数据一致性和完整性
**实施策略**:
1. 新增无人车控制指令存储实体和Repository
2. 创建专门的无人车控制器处理API接口
3. 扩展现有DataCollectorService支持无人车数据
4. 实现选择性数据持久化策略
### 方案2: 统一车辆管理架构
**核心思路**: 设计统一的车辆管理接口,将所有车辆类型(航空器、特种车辆、无人车)纳入统一管理。
**优势**:
- 架构更加统一和优雅
- 便于后续扩展其他车辆类型
- 减少代码重复
**劣势**:
- 需要重构现有部分代码
- 开发复杂度较高
- 可能影响现有功能稳定性
## 推荐方案详细设计
### 1. 数据模型扩展
#### 1.1 无人车控制指令实体
```java
@Entity
@Table(name = "vehicle_commands")
public class VehicleCommand {
// 基础字段transId, timestamp, vehicleId
// 指令字段commandType, commandReason, signalState
// 位置字段latitude, longitude (PostGIS Point)
// 运动字段relativeSpeed, relativeMotionX/Y, minDistance
}
```
#### 1.2 选择性持久化策略
- **无人车位置**: 存储到VehicleLocation表用于轨迹回放
- **控制指令**: 存储到VehicleCommand表用于日志审计
- **其他数据**: 仅内存处理,不持久化
### 2. 接口层设计
#### 2.1 无人车控制器
```java
@RestController
@RequestMapping("/api")
public class UnmannedVehicleController {
// POST /api/VehicleCommandInfo - 控制指令
// GET /api/VehicleLocationInfo - 位置上报
// POST /api/VehicleStateInfo - 状态查询
}
```
#### 2.2 数据采集增强
- 扩展DataCollectorService支持无人车数据定时采集
- 实现无人车位置数据的PostGIS存储
- 添加数据质量验证和异常处理
### 3. 服务层架构
#### 3.1 无人车控制服务
```java
@Service
public class UnmannedVehicleControlService {
// 控制指令处理和存储
// 位置数据获取和验证
// 状态信息查询和缓存
}
```
#### 3.2 数据持久化服务
```java
@Service
public class VehicleDataPersistenceService {
// 选择性数据存储逻辑
// 轨迹数据管理
// 审计日志记录
}
```
### 4. 技术实现考虑
#### 4.1 性能优化
- 利用现有PostGIS空间索引
- 实现批量数据处理
- 添加Redis缓存层用于实时数据
#### 4.2 错误处理
- 统一异常处理机制
- 重试策略和熔断器
- 数据一致性保障
#### 4.3 监控和日志
- 接口调用监控
- 数据质量监控
- 性能指标收集
## 方案对比分析
| 维度 | 渐进式扩展 | 统一管理 |
|------|------------|----------|
| 开发复杂度 | 低 | 中等 |
| 实施风险 | 低 | 中等 |
| 架构优雅度 | 中等 | 高 |
| 扩展性 | 中等 | 高 |
| 维护成本 | 低 | 中等 |
| 实施周期 | 短 | 中等 |
**结论**: 考虑到项目现状和需求紧迫性,推荐采用**渐进式扩展架构**,在保证系统稳定的前提下快速实现功能需求。
# 实施计划 (由 PLAN 模式生成)
## 详细技术规范
### 1. 数据模型设计
#### 1.1 无人车控制指令实体
**文件**: `src/main/java/com/dongni/collisionavoidance/dataCollector/model/entity/VehicleCommandEntity.java`
```java
@Entity
@Table(name = "vehicle_commands")
public class VehicleCommandEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "trans_id", nullable = false, length = 100)
private String transId;
@Column(name = "timestamp", nullable = false)
private LocalDateTime timestamp;
@Column(name = "vehicle_id", nullable = false, length = 50)
private String vehicleId;
@Enumerated(EnumType.STRING)
@Column(name = "command_type", nullable = false)
private CommandType commandType;
@Enumerated(EnumType.STRING)
@Column(name = "command_reason", nullable = false)
private CommandReason commandReason;
@Column(name = "target_location", columnDefinition = "geometry(Point,4326)")
private Point targetLocation;
// 其他字段...
@Column(name = "created_at")
private LocalDateTime createdAt;
}
```
#### 1.2 Repository接口
**文件**: `src/main/java/com/dongni/collisionavoidance/dataCollector/repository/VehicleCommandRepository.java`
```java
@Repository
public interface VehicleCommandRepository extends JpaRepository<VehicleCommandEntity, Long> {
List<VehicleCommandEntity> findByVehicleIdOrderByTimestampDesc(String vehicleId);
List<VehicleCommandEntity> findByTimestampBetween(LocalDateTime start, LocalDateTime end);
}
```
### 2. 控制器层实现
#### 2.1 无人车控制器
**文件**: `src/main/java/com/dongni/collisionavoidance/controller/UnmannedVehicleController.java`
```java
@RestController
@RequestMapping("/api")
@Slf4j
public class UnmannedVehicleController {
@PostMapping("/VehicleCommandInfo")
public ResponseEntity<VehicleCommandResponse> handleVehicleCommand(@RequestBody VehicleCommand command);
@GetMapping("/VehicleLocationInfo")
public ResponseEntity<List<VehicleLocationInfo>> getVehicleLocationInfo();
@PostMapping("/VehicleStateInfo")
public ResponseEntity<List<VehicleStateInfo>> getVehicleStateInfo(@RequestBody VehicleStateRequest request);
}
```
### 3. 服务层架构
#### 3.1 无人车控制服务
**文件**: `src/main/java/com/dongni/collisionavoidance/dataCollector/service/UnmannedVehicleControlService.java`
```java
@Service
public class UnmannedVehicleControlService {
public VehicleCommandResponse processVehicleCommand(VehicleCommand command);
public List<VehicleLocationInfo> getVehicleLocations();
public List<VehicleStateInfo> getVehicleStates(VehicleStateRequest request);
}
```
#### 3.2 数据持久化服务
**文件**: `src/main/java/com/dongni/collisionavoidance/dataCollector/service/VehicleDataPersistenceService.java`
```java
@Service
public class VehicleDataPersistenceService {
public void saveVehicleCommand(VehicleCommandEntity command);
public void saveUnmannedVehicleLocation(VehicleLocation location);
public boolean shouldPersistData(MovingObjectType vehicleType);
}
```
### 4. 数据库表结构
#### 4.1 控制指令表
```sql
CREATE TABLE vehicle_commands (
id BIGSERIAL PRIMARY KEY,
trans_id VARCHAR(100) NOT NULL,
timestamp TIMESTAMP NOT NULL,
vehicle_id VARCHAR(50) NOT NULL,
command_type VARCHAR(20) NOT NULL,
command_reason VARCHAR(30) NOT NULL,
signal_state VARCHAR(10),
intersection_id VARCHAR(50),
target_location GEOMETRY(POINT, 4326) NOT NULL,
relative_speed DOUBLE PRECISION,
relative_motion_x DOUBLE PRECISION,
relative_motion_y DOUBLE PRECISION,
min_distance DOUBLE PRECISION,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_vehicle_commands_vehicle_id ON vehicle_commands(vehicle_id);
CREATE INDEX idx_vehicle_commands_timestamp ON vehicle_commands(timestamp);
CREATE INDEX idx_vehicle_commands_location ON vehicle_commands USING GIST(target_location);
```
### 5. 配置更新
#### 5.1 应用配置
**文件**: `src/main/resources/application.yml`
```yaml
data:
collector:
unmanned-vehicle:
persistence:
enabled: true
batch-size: 50
command:
timeout: 5000
retry-attempts: 3
```
### 6. 错误处理和验证
#### 6.1 异常处理器
**文件**: `src/main/java/com/dongni/collisionavoidance/common/exception/VehicleControlExceptionHandler.java`
```java
@ControllerAdvice
public class VehicleControlExceptionHandler {
@ExceptionHandler(VehicleCommandException.class)
public ResponseEntity<ErrorResponse> handleVehicleCommandException(VehicleCommandException ex);
}
```
## 实施检查清单
1. 创建VehicleCommandEntity实体类和相关枚举
2. 创建VehicleCommandRepository接口
3. 创建数据库迁移脚本添加vehicle_commands表
4. 实现UnmannedVehicleController控制器
5. 实现UnmannedVehicleControlService服务类
6. 实现VehicleDataPersistenceService数据持久化服务
7. 扩展DataCollectorService支持无人车数据采集和选择性存储
8. 添加VehicleControlExceptionHandler异常处理
9. 更新应用配置文件添加无人车相关配置
10. 创建单元测试验证控制器接口功能
11. 创建集成测试验证数据持久化功能
12. 更新API文档说明新增接口
13. 更新VERSION.txt版本号
14. 更新change_log.md记录变更
# 当前执行步骤 (由 EXECUTE 模式在开始执行某步骤时更新)
> 正在执行: "步骤1-3数据模型和Repository层实现"
# 任务进度 (由 EXECUTE 模式在每步完成后追加)
* 2025-01-07 15:30:00
* 步骤1. 创建VehicleCommandEntity实体类
* 修改src/main/java/com/dongni/collisionavoidance/dataCollector/model/entity/VehicleCommandEntity.java
* 更改摘要创建完整的JPA实体类支持PostGIS空间数据类型
* 原因:执行计划步骤 1
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 15:35:00
* 步骤2. 创建VehicleCommandRepository接口
* 修改src/main/java/com/dongni/collisionavoidance/dataCollector/repository/VehicleCommandRepository.java
* 更改摘要:实现丰富的查询方法,包括空间查询和时间范围查询
* 原因:执行计划步骤 2
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 15:40:00
* 步骤3. 创建数据库迁移脚本
* 修改src/main/resources/db/migration/V1.3__Create_vehicle_commands_table.sql
* 更改摘要创建vehicle_commands表包含PostGIS索引和约束
* 原因:执行计划步骤 3
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 15:45:00
* 步骤4. 创建UnmannedVehicleController控制器
* 修改src/main/java/com/dongni/collisionavoidance/controller/UnmannedVehicleController.java
* 更改摘要实现三个API端点包含完整的参数验证和异常处理
* 原因:执行计划步骤 4
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 15:50:00
* 步骤5. 创建UnmannedVehicleControlService服务类
* 修改src/main/java/com/dongni/collisionavoidance/dataCollector/service/UnmannedVehicleControlService.java
* 更改摘要:实现核心业务逻辑,包含数据转换和持久化
* 原因:执行计划步骤 5
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 15:55:00
* 步骤6. 创建VehicleDataPersistenceService
* 修改src/main/java/com/dongni/collisionavoidance/dataCollector/service/VehicleDataPersistenceService.java
* 更改摘要:实现选择性数据持久化服务,只存储无人车数据
* 原因:执行计划步骤 6
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:00:00
* 步骤7. 扩展DataCollectorService
* 修改src/main/java/com/dongni/collisionavoidance/dataCollector/service/DataCollectorService.java
* 更改摘要:集成选择性存储策略,航空器和特种车辆数据仅实时处理
* 原因:执行计划步骤 7
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:05:00
* 步骤8. 创建VehicleControlExceptionHandler
* 修改src/main/java/com/dongni/collisionavoidance/controller/VehicleControlExceptionHandler.java
* 更改摘要:实现统一异常处理器,提供友好的错误响应
* 原因:执行计划步骤 8
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:10:00
* 步骤9. 更新应用配置
* 修改src/main/resources/application.yml
* 更改摘要:添加无人车相关配置参数
* 原因:执行计划步骤 9
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:15:00
* 步骤:架构重构 - Response类移动
* 修改src/main/java/com/dongni/collisionavoidance/common/model/dto/Response.java 及相关import更新
* 更改摘要将Response类从common.model.base移动到common.model.dto更新所有相关引用
* 原因:用户要求的架构重构
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:20:00
* 步骤:架构重构 - dataCollector DTO重构
* 修改dataCollector.model.dto包下的CommandResponse、VehicleCommand、VehicleLocationInfo、VehicleStateInfo类
* 更改摘要将DTO类移动到专门的dto包中提高代码组织清晰度
* 原因:用户要求的架构重构
* 阻碍:无
* 用户确认状态:成功
* 2025-01-07 16:25:00
* 步骤10. 创建单元测试验证控制器接口功能
* 修改src/test/java/com/dongni/collisionavoidance/controller/UnmannedVehicleControllerTest.java
* 更改摘要创建控制器单元测试验证三个API接口的功能和异常处理
* 原因:执行计划步骤 10
* 阻碍:无
* 状态:待确认
* 2025-01-07 16:30:00
* 步骤11. 创建集成测试验证数据持久化功能
* 修改src/test/java/com/dongni/collisionavoidance/dataCollector/service/VehicleDataPersistenceServiceIntegrationTest.java
* 更改摘要:创建数据持久化服务集成测试,验证选择性存储策略和批量操作
* 原因:执行计划步骤 11
* 阻碍:无
* 状态:待确认
# 实时数据流方案设计 (2025-01-27 补充)
## 前端WebSocket实时数据需求
**问题**: 前端需要通过WebSocket获取航空器和所有车辆位置信息但航空器和特种车辆数据不再持久化存储。
## 推荐解决方案Redis + 定时推送
### 方案架构
```
数据采集 → Redis缓存 → 定时任务 → WebSocket推送 → 前端
```
### 技术实现要点
#### 1. 实时数据缓存服务
```java
@Service
public class RealTimeDataCacheService {
// 缓存航空器实时数据30秒过期
public void cacheAircraftData(List<Aircraft> aircrafts);
// 缓存特种车辆实时数据30秒过期
public void cacheSpecialVehicleData(List<SpecialVehicle> vehicles);
// 获取最新缓存数据
public Map<String, Aircraft> getLatestAircraftData();
public Map<String, SpecialVehicle> getLatestSpecialVehicleData();
}
```
#### 2. WebSocket实时推送服务
```java
@Service
public class RealTimeWebSocketService {
@Scheduled(fixedRate = 2000) // 每2秒推送一次
public void pushRealTimeData() {
Map<String, Object> realTimeData = new HashMap<>();
realTimeData.put("aircraft", cacheService.getLatestAircraftData());
realTimeData.put("specialVehicles", cacheService.getLatestSpecialVehicleData());
realTimeData.put("unmannedVehicles", cacheService.getLatestUnmannedVehicleData());
messagingTemplate.convertAndSend("/topic/realTimePositions", realTimeData);
}
}
```
#### 3. 数据采集服务修改
在现有DataCollectorService中添加Redis缓存
```java
public void collectAircraftData() {
// ... 现有采集逻辑 ...
if (!newAircrafts.isEmpty()) {
realTimeDataCacheService.cacheAircraftData(newAircrafts);
}
}
```
#### 4. 前端订阅
```javascript
stompClient.subscribe('/topic/realTimePositions', (message) => {
const data = JSON.parse(message.body);
updateAircraftPositions(data.aircraft);
updateSpecialVehiclePositions(data.specialVehicles);
updateUnmannedVehiclePositions(data.unmannedVehicles);
});
```
### 方案优势
- 利用现有Redis和WebSocket基础设施
- 数据一致性和可靠性保障
- 可配置的推送频率和缓存策略
- 支持故障恢复和监控
- 实施风险低,维护成本低
### 实施计划
1. 创建RealTimeDataCacheService缓存服务
2. 实现RealTimeWebSocketService推送服务
3. 修改DataCollectorService添加缓存逻辑
4. 更新前端WebSocket订阅逻辑
5. 添加配置参数和监控指标
**状态**: 方案设计完成,待后续实施
---
# 最终审查 (由 REVIEW 模式填充)
[待填充]