211 lines
6.8 KiB
Markdown
211 lines
6.8 KiB
Markdown
# 电子围栏准入检测架构优化方案 (仅针对无人车)
|
||
|
||
## 📋 总体设计
|
||
|
||
### 核心原则
|
||
1. **职责分离**:Area负责空间数据,Rule负责业务逻辑
|
||
2. **规则驱动**:所有准入检测通过SpatialRule统一管理
|
||
3. **事件驱动**:基于事件的异步处理机制
|
||
4. **🎯 业务范围限定**:**仅针对无人车进行电子围栏检测和告警**
|
||
|
||
## 🏗️ 架构设计
|
||
|
||
### 1. 数据模型重构
|
||
|
||
#### 1.1 简化Area模型
|
||
```java
|
||
@Entity
|
||
public class AirportArea {
|
||
private Long id; // 区域ID
|
||
private String areaCode; // 区域编码(唯一标识)
|
||
private String areaName; // 区域名称
|
||
private AreaType areaType; // 区域类型(枚举)
|
||
private Geometry geometry; // 空间几何数据
|
||
private String description; // 描述信息
|
||
private Boolean active; // 是否启用
|
||
private LocalDateTime createdAt; // 创建时间
|
||
private LocalDateTime updatedAt; // 更新时间
|
||
// 移除所有业务规则相关字段
|
||
}
|
||
```
|
||
|
||
#### 1.2 增强SpatialRule模型 (专注无人车)
|
||
```java
|
||
@Entity
|
||
public class SpatialRule {
|
||
// 现有字段保持不变,新增以下字段:
|
||
private String areaCode; // 关联区域编码
|
||
private RuleCategory category; // ACCESS_CONTROL(准入控制)
|
||
private String ruleConfig; // JSON配置:针对无人车的限制条件
|
||
private GeofenceAction action; // 触发动作:ALLOW/DENY/WARN
|
||
// 注意:allowedVehicleTypes 应该只包含 UNMANNED_VEHICLE
|
||
}
|
||
```
|
||
|
||
#### 1.3 规则配置结构 (无人车专用)
|
||
```json
|
||
{
|
||
"accessControl": {
|
||
"vehicleType": "UNMANNED_VEHICLE", // 固定为无人车类型
|
||
"requiresPermission": true,
|
||
"allowedOperationModes": ["AUTO", "MANUAL", "REMOTE"]
|
||
},
|
||
"physicalLimits": {
|
||
"maxSpeed": 30, // 无人车最大速度限制
|
||
"maxHeight": 3.0, // 无人车最大高度限制
|
||
"maxWeight": 5.0 // 无人车最大载重限制
|
||
},
|
||
"timeRestrictions": {
|
||
"activeHours": "06:00-22:00",
|
||
"activeDays": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"]
|
||
},
|
||
"safetyRequirements": {
|
||
"minBatteryLevel": 20, // 最低电量要求
|
||
"requiresOperatorPresence": false // 是否需要操作员在场
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 服务层架构
|
||
|
||
#### 2.1 电子围栏检测服务 (无人车专用)
|
||
```java
|
||
@Service
|
||
public class UnmannedVehicleGeofenceService {
|
||
|
||
/**
|
||
* 检测无人车是否可以进入指定区域
|
||
* 注意:仅处理无人车类型的车辆
|
||
*/
|
||
public AccessCheckResult checkAreaAccess(MovingObject vehicle, String areaCode) {
|
||
// 前置检查:必须是无人车
|
||
if (vehicle.getObjectType() != MovingObject.ObjectType.UNMANNED_VEHICLE) {
|
||
log.debug("跳过非无人车的围栏检测: {}", vehicle.getObjectId());
|
||
return AccessCheckResult.skip();
|
||
}
|
||
|
||
// 1. 获取区域信息
|
||
// 2. 查询适用的规则
|
||
// 3. 执行规则检查
|
||
// 4. 返回检测结果
|
||
}
|
||
|
||
/**
|
||
* 实时监控无人车位置变化
|
||
*/
|
||
public void monitorUnmannedVehicleLocation(MovingObject vehicle) {
|
||
// 类型检查:只处理无人车
|
||
if (vehicle.getObjectType() != MovingObject.ObjectType.UNMANNED_VEHICLE) {
|
||
return; // 静默跳过
|
||
}
|
||
|
||
// 1. 检测进入/离开事件
|
||
// 2. 触发准入检测
|
||
// 3. 发布事件
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2.2 规则执行引擎 (针对无人车优化)
|
||
```java
|
||
@Service
|
||
public class UnmannedVehicleRuleEngine {
|
||
|
||
/**
|
||
* 执行无人车准入控制规则
|
||
*/
|
||
public RuleExecutionResult executeAccessRules(MovingObject unmannedVehicle, AirportArea area, List<SpatialRule> rules) {
|
||
// 验证输入:确保是无人车
|
||
validateUnmannedVehicle(unmannedVehicle);
|
||
|
||
// 1. 过滤适用于无人车的规则
|
||
// 2. 按优先级排序规则
|
||
// 3. 依次执行规则检查
|
||
// 4. 汇总执行结果
|
||
}
|
||
|
||
private void validateUnmannedVehicle(MovingObject vehicle) {
|
||
if (vehicle.getObjectType() != MovingObject.ObjectType.UNMANNED_VEHICLE) {
|
||
throw new IllegalArgumentException("规则引擎只处理无人车类型");
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. 事件处理机制
|
||
|
||
#### 3.1 事件类型定义 (无人车专用)
|
||
```java
|
||
public enum UnmannedVehicleGeofenceEventType {
|
||
UNMANNED_VEHICLE_ENTRY_REQUEST, // 无人车区域进入请求
|
||
UNMANNED_VEHICLE_ENTRY_APPROVED, // 无人车进入批准
|
||
UNMANNED_VEHICLE_ENTRY_DENIED, // 无人车进入拒绝
|
||
UNMANNED_VEHICLE_EXIT, // 无人车离开区域
|
||
UNMANNED_VEHICLE_RULE_VIOLATION, // 无人车规则违反
|
||
UNMANNED_VEHICLE_ACCESS_WARNING // 无人车准入警告
|
||
}
|
||
```
|
||
|
||
#### 3.2 事件处理流程 (仅处理无人车事件)
|
||
```java
|
||
@EventListener
|
||
public class UnmannedVehicleGeofenceEventHandler {
|
||
|
||
@Async
|
||
public void handleUnmannedVehicleEntryRequest(UnmannedVehicleEntryRequestEvent event) {
|
||
// 确保事件来源是无人车
|
||
if (event.getVehicleType() != MovingObject.ObjectType.UNMANNED_VEHICLE) {
|
||
log.warn("收到非无人车的围栏事件,忽略处理: {}", event);
|
||
return;
|
||
}
|
||
|
||
// 1. 执行准入检测
|
||
// 2. 记录检测结果
|
||
// 3. 发送WebSocket通知 (仅无人车事件)
|
||
// 4. 记录审计日志
|
||
}
|
||
|
||
@Async
|
||
public void handleUnmannedVehicleViolation(UnmannedVehicleViolationEvent event) {
|
||
// 处理无人车违规事件
|
||
// 1. 记录违规信息
|
||
// 2. 触发告警通知
|
||
// 3. 可能的自动处理措施 (如减速指令)
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🔧 实施步骤
|
||
|
||
### Phase 1: 数据模型重构 (1周)
|
||
1. 简化AirportArea表结构
|
||
2. 完善SpatialRule表结构
|
||
3. 创建数据迁移脚本
|
||
4. 更新Entity类
|
||
|
||
### Phase 2: 服务层开发 (2周)
|
||
1. 开发GeofenceAccessControlService
|
||
2. 增强RuleExecutionEngine
|
||
3. 实现事件处理机制
|
||
4. 集成WebSocket通知
|
||
|
||
### Phase 3: 测试与优化 (1周)
|
||
1. 单元测试和集成测试
|
||
2. 性能优化
|
||
3. 监控和日志完善
|
||
4. 文档更新
|
||
|
||
## 📊 技术优势
|
||
|
||
1. **清晰的职责分离**:Area专注空间数据,Rule管理业务逻辑
|
||
2. **灵活的规则配置**:通过JSON配置支持复杂业务场景
|
||
3. **高性能检测**:空间索引 + 缓存优化
|
||
4. **事件驱动架构**:异步处理,高并发支持
|
||
5. **易于扩展**:新增规则类型只需扩展配置,无需修改代码
|
||
|
||
## 🎯 预期效果
|
||
|
||
- **功能完整性**:支持复杂的电子围栏准入检测需求
|
||
- **性能提升**:优化的空间查询和规则执行
|
||
- **维护性**:清晰的架构设计,易于理解和维护
|
||
- **扩展性**:支持未来新的业务需求 |