# 电子围栏准入检测架构优化方案 (仅针对无人车)

## 📋 总体设计

### 核心原则
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. **易于扩展**：新增规则类型只需扩展配置，无需修改代码

## 🎯 预期效果

- **功能完整性**：支持复杂的电子围栏准入检测需求
- **性能提升**：优化的空间查询和规则执行
- **维护性**：清晰的架构设计，易于理解和维护
- **扩展性**：支持未来新的业务需求