将路径和包名规范化;消除循环依赖;

This commit is contained in:
Tian jianyong 2025-06-13 13:43:34 +08:00
parent e4b7bdb8fc
commit cbfb56127f
111 changed files with 663 additions and 725 deletions

View File

@ -1 +1 @@
0.8.0
0.8.1

View File

@ -1,6 +1,31 @@
# 碰撞避免系统变更日志
## 版本 0.8.0 (2025-06-12)
## 版本 [0.8.1] - 2025-06-13
### ♻️ 循环依赖重构与服务职责优化
**背景**为彻底解决LocationRuleQueryService与VehicleTypePermissionService之间的循环依赖优化服务职责边界提升系统可维护性和测试稳定性。
#### ✅ 主要变更
- **彻底消除循环依赖**重构VehicleTypePermissionService仅保留"判断"相关方法,所有"查找规则"相关方法迁移至LocationRuleQueryService。
- **服务职责边界清晰**LocationRuleQueryService负责规则查找与过滤VehicleTypePermissionService仅负责权限判断。
- **依赖注入优化**:移除双方互相依赖,所有依赖关系单向、职责分明。
- **全局调用点梳理**所有业务与测试代码均已切换为通过LocationRuleQueryService查找规则无遗漏。
- **测试全部通过**关闭Spring循环依赖后ApplicationContext加载正常所有相关单元测试与集成测试全部通过。
#### 📊 技术成果
- 架构更清晰,职责分离,便于后续维护和扩展
- 测试环境与生产环境一致性提升,消除隐藏风险
- 代码可读性和可测试性显著提升
#### 🎯 验证结果
- ✅ 所有相关测试用例全部通过
- ✅ 业务功能和权限判断流程回归验证通过
- ✅ 任务文档、版本号、变更日志已同步更新
**影响范围**LocationRuleQueryService、VehicleTypePermissionService及其所有调用方涉及规则查找、权限判断、依赖注入等核心模块。
## 版本 [0.8.0] - (2025-06-12)
### 🔄 重大架构重构:异步处理架构简化
@ -40,8 +65,6 @@
**影响范围**约15个核心文件涉及Spring Boot、PostgreSQL PostGIS、JPA/Hibernate、Jackson序列化、WebSocket、Redis缓存、Mockito测试框架等技术栈。
---
## [0.7.16] - 2025-06-12
### 重大修复

View File

@ -0,0 +1,133 @@
# 任务清单:打破 locationRuleQueryServiceImpl 与 vehicleTypePermissionServiceImpl 的循环依赖
## 目标
- 消除 locationRuleQueryServiceImpl 与 vehicleTypePermissionServiceImpl 之间的直接循环依赖,保证 allow-circular-references: false 时 Spring 上下文能正常加载。
- 保证相关业务功能和集成测试通过。
---
## 任务分解与实施步骤
### 1. 梳理依赖关系(已完成)
#### 1.1 LocationRuleQueryServiceImpl 依赖
- 依赖注入方式:字段注入(@Autowired
- 依赖Bean
- SpatialRuleRepository
- SpatialRuleService
- TimeWindowMatchingService
- **VehicleTypePermissionService**(关键)
- RulePriorityService
- 依赖用途:
- vehicleTypePermissionService 主要用于规则适用性检查(如 isVehicleTypeApplicableToRule、findApplicableRules 等方法中)。
#### 1.2 VehicleTypePermissionServiceImpl 依赖
- 依赖注入方式:字段注入(@Autowired
- 依赖Bean
- **LocationRuleQueryService**(关键)
- 依赖用途:
- locationRuleQueryService 主要用于权限判断时获取位置适用规则(如 hasAccessPermission、getRestrictedRules、getAllowedRules 等方法中)。
#### 1.3 依赖关系图
```
LocationRuleQueryServiceImpl
└── VehicleTypePermissionService接口实际注入 VehicleTypePermissionServiceImpl
└── LocationRuleQueryService接口实际注入 LocationRuleQueryServiceImpl
```
- 形成了 LocationRuleQueryServiceImpl <-> VehicleTypePermissionServiceImpl 的直接循环依赖。
- 两者均为 @Service 单例,且均为字段注入。
#### 1.4 结论
- 只要双方都为单例且直接互相依赖Spring 禁止循环依赖时无法实例化。
- 需打破该环,建议优先将一方改为 Setter 注入 + @Lazy
### 2. 分析依赖必要性(已完成)
#### 2.1 VehicleTypePermissionServiceImpl 对 LocationRuleQueryService 的依赖
- 依赖方式:字段注入,@Autowired
- 依赖用途:
- 主要用于权限判断时,获取某位置、某车辆类型、某时刻的所有适用规则(如 hasAccessPermission、getRestrictedRules、getAllowedRules 等方法)。
- 依赖强度:**弱依赖**
- 仅在部分方法调用时需要(如权限校验、规则过滤),不是构造时必须。
- 绝大多数业务逻辑可通过Setter延迟注入不影响Bean初始化。
#### 2.2 LocationRuleQueryServiceImpl 对 VehicleTypePermissionService 的依赖
- 依赖方式:字段注入,@Autowired
- 依赖用途:
- 主要用于规则适用性检查(如 isVehicleTypeApplicableToRule、findApplicableRules 等方法)。
- 依赖强度:**弱依赖**
- 仅在规则过滤、适用性判断等方法中需要不影响Bean初始化。
#### 2.3 结论
- 双方依赖均为弱依赖均可通过Setter注入+@Lazy方式延迟注入打破循环。
- 推荐优先将 VehicleTypePermissionServiceImpl 对 LocationRuleQueryService 的依赖改为 Setter 注入 + @Lazy,因其依赖主要用于部分方法调用。
### 3. 选择解耦方案(业务逻辑合理性分析)
#### 3.1 业务逻辑设计分析
- 当前循环依赖的根源在于:
- `LocationRuleQueryServiceImpl` 负责"查询某位置/车辆/时间的适用规则",需要判断规则是否适用于某车辆类型,因此依赖 `VehicleTypePermissionService`
- `VehicleTypePermissionServiceImpl` 负责"判断某车辆类型是否有权限访问某位置/规则",需要获取该位置/车辆/时间的所有适用规则,因此依赖 `LocationRuleQueryService`
- 两者的业务边界存在**交叉**
- 规则查询服务需要权限判断服务来过滤规则。
- 权限判断服务又需要规则查询服务来获取规则。
- 这种互相依赖的设计,**容易导致循环依赖和职责不清**。
#### 3.2 是否存在设计缺陷?
- 理想情况下权限判断服务VehicleTypePermissionService应只负责"判断某规则/位置/类别是否允许某车辆类型",不应主动依赖规则查询服务。
- 规则查询服务LocationRuleQueryService应负责"查询规则并做适用性过滤",可依赖权限判断服务。
- 当前设计中,权限判断服务主动去查规则(如 getAllowedRules、getRestrictedRules、hasAccessPermission这会导致服务边界模糊。
- **结论:存在一定的设计不合理**,建议:
- 权限判断服务只做"判断",不做"查找"
- 规则查找和过滤应由规则查询服务主导。
- 若短期内无法彻底重构,可先用 Setter 注入 + @Lazy 解决循环依赖,后续考虑业务重构。
### 4. 实施解耦重构(理想设计方案)
#### 4.1 理想设计方案
- VehicleTypePermissionService 只负责"判断",不主动查找规则,不依赖 LocationRuleQueryService。
- LocationRuleQueryService 负责"查找规则并做适用性过滤",在过滤时调用 VehicleTypePermissionService 的判断方法。
- 所有"查找规则"相关方法(如 getAllowedRules、getRestrictedRules、hasAccessPermission全部转移到 LocationRuleQueryService 实现中。
- VehicleTypePermissionService 仅保留 isVehicleTypeApplicableToRule、isVehicleTypeInAllowedList 等判断方法。
#### 4.2 具体实施步骤
- [ ] 1. 移除 VehicleTypePermissionServiceImpl 中对 LocationRuleQueryService 的依赖。
- [ ] 2. 移除 VehicleTypePermissionService 及其实现中所有"查找规则"相关方法。
- [ ] 3. 将"查找规则"相关方法迁移到 LocationRuleQueryServiceImpl并调整为调用权限判断服务的判断方法。
- [ ] 4. 检查和调整所有调用方确保查找规则相关方法全部通过LocationRuleQueryService调用业务和测试代码无遗漏。
- [ ] 5. 补充和调整单元测试、集成测试。
- [ ] 6. 文档和变更记录。
### 4.3 检查和调整所有调用方(已完成)
- 通过全局代码检索,所有 hasAccessPermission、getRestrictedRules、getAllowedRules 方法的调用点均已切换到 LocationRuleQueryService无业务或测试代码遗漏。
- VehicleTypePermissionService 仅保留判断相关方法,未发现有业务或测试代码错误调用查找规则相关方法。
- RulePriorityServiceImpl 等依赖 VehicleTypePermissionService 的地方,仅调用权限级别、特殊权限等判断方法,符合新设计。
结论:
- 业务和测试代码已全部完成查找规则相关方法的职责切换,系统职责边界清晰,循环依赖彻底消除。
### 5. 验证与回归(已完成)
- 本地及CI环境下所有相关单元测试、集成测试全部通过。
- 关闭Spring循环依赖allow-circular-references: falseApplicationContext加载正常循环依赖问题彻底解决。
- 业务功能和权限判断、规则查找等核心流程均通过回归验证。
### 6. 文档与变更记录(已完成)
- 递增版本号至0.8.1详见VERSION.txt。
- 在change_log.md中记录本次循环依赖重构、职责边界优化、所有相关测试通过等内容。
- 任务全部完成,建议后续持续关注服务职责边界和依赖关系设计。
---
**最终结论:**
- LocationRuleQueryService与VehicleTypePermissionService的循环依赖已彻底消除系统架构更清晰测试全部通过。
- 任务关闭。
---
## 进度记录
- 2025-06-11 创建任务清单,进入实施阶段。

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.areas.model;
package com.dongni.collisionavoidance.area.model;
import lombok.AllArgsConstructor;
import lombok.Builder;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.areas.model;
package com.dongni.collisionavoidance.area.model;
/**
* 机场区域类型枚举

View File

@ -1,9 +1,10 @@
package com.dongni.collisionavoidance.areas.service;
package com.dongni.collisionavoidance.area.service;
import com.dongni.collisionavoidance.common.model.spatial.AirportArea;
import com.dongni.collisionavoidance.area.model.AreaInfo;
import com.dongni.collisionavoidance.area.model.AreaType;
import com.dongni.collisionavoidance.common.model.repository.AirportAreaRepository;
import com.dongni.collisionavoidance.areas.model.AreaInfo;
import com.dongni.collisionavoidance.areas.model.AreaType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;

View File

@ -6,9 +6,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.algorithm.distance.DistanceToPoint;
import org.locationtech.jts.algorithm.distance.PointPairDistance;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;

View File

@ -3,12 +3,13 @@ package com.dongni.collisionavoidance.common.service;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.common.model.repository.VehicleLocationRepository;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.geofence.service.RuleExecutionEngine;
import com.dongni.collisionavoidance.geofence.service.RealTimeViolationDetector;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.rule.service.RealTimeViolationDetector;
import com.dongni.collisionavoidance.rule.service.RuleExecutionEngine;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;

View File

@ -1,11 +1,9 @@
package com.dongni.collisionavoidance.config;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleLocationInfo;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleLocationInfo;
import com.dongni.collisionavoidance.common.model.spatial.AirportArea;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

View File

@ -1,11 +1,12 @@
package com.dongni.collisionavoidance.controller;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.service.RuleConfigurationService;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService.RuleValidationResult;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.service.RuleConfigurationService;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService.RuleValidationResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -2,10 +2,11 @@ package com.dongni.collisionavoidance.controller;
import com.dongni.collisionavoidance.common.model.dto.Response;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleStateRequest;
import com.dongni.collisionavoidance.dataCollector.service.UnmannedVehicleControlService;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleStateRequest;
import com.dongni.collisionavoidance.datacollector.service.UnmannedVehicleControlService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -14,7 +15,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import java.util.List;
/**

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.config;
package com.dongni.collisionavoidance.datacollector.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@ -1,11 +1,12 @@
package com.dongni.collisionavoidance.dataCollector.dao;
package com.dongni.collisionavoidance.datacollector.dao;
import com.dongni.collisionavoidance.common.model.Aircraft;
import com.dongni.collisionavoidance.common.model.AirportVehicle;
import com.dongni.collisionavoidance.common.model.UnmannedVehicle;
import com.dongni.collisionavoidance.common.model.dto.Response;
import com.dongni.collisionavoidance.dataCollector.service.AuthService;
import com.dongni.collisionavoidance.datacollector.service.AuthService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.dataCollector.model.converter;
package com.dongni.collisionavoidance.datacollector.model.converter;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.springframework.stereotype.Component;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.dto;
package com.dongni.collisionavoidance.datacollector.model.dto;
import lombok.Data;

View File

@ -1,8 +1,9 @@
package com.dongni.collisionavoidance.dataCollector.model.dto;
package com.dongni.collisionavoidance.datacollector.model.dto;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandType;
import com.dongni.collisionavoidance.datacollector.model.enums.SignalState;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandType;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.dataCollector.model.enums.SignalState;
import lombok.Data;
@Data

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.dto;
package com.dongni.collisionavoidance.datacollector.model.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.dto;
package com.dongni.collisionavoidance.datacollector.model.dto;
import lombok.Data;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.dto;
package com.dongni.collisionavoidance.datacollector.model.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

View File

@ -1,8 +1,5 @@
package com.dongni.collisionavoidance.dataCollector.model.entity;
package com.dongni.collisionavoidance.datacollector.model.entity;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandType;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.dataCollector.model.enums.SignalState;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -10,6 +7,10 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import org.locationtech.jts.geom.Point;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandType;
import com.dongni.collisionavoidance.datacollector.model.enums.SignalState;
import java.time.LocalDateTime;
/**

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.enums;
package com.dongni.collisionavoidance.datacollector.model.enums;
public enum CommandReason {
TRAFFIC_LIGHT, // 红绿灯控制

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.enums;
package com.dongni.collisionavoidance.datacollector.model.enums;
public enum CommandType {
ALERT, // 告警指令

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.model.enums;
package com.dongni.collisionavoidance.datacollector.model.enums;
public enum SignalState {
RED, // 红灯

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.dataCollector.repository;
package com.dongni.collisionavoidance.datacollector.repository;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandType;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import com.dongni.collisionavoidance.common.model.dto.Response;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,10 +1,11 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import com.dongni.collisionavoidance.common.model.*;
import com.dongni.collisionavoidance.common.service.VehicleLocationService;
import com.dongni.collisionavoidance.dataCollector.dao.DataCollectorDao;
import com.dongni.collisionavoidance.webSocket.event.PositionUpdateEvent;
import com.dongni.collisionavoidance.webSocket.message.PositionUpdatePayload;
import com.dongni.collisionavoidance.datacollector.dao.DataCollectorDao;
import com.dongni.collisionavoidance.websocket.event.PositionUpdateEvent;
import com.dongni.collisionavoidance.websocket.message.PositionUpdatePayload;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,12 +1,12 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.dataCollector.model.converter.VehicleCommandConverter;
import com.dongni.collisionavoidance.dataCollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.datacollector.model.converter.VehicleCommandConverter;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.datacollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.common.model.repository.VehicleLocationRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@ -1,13 +1,12 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.common.service.VehicleLocationService;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.dataCollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.webSocket.event.PositionUpdateEvent;
import com.dongni.collisionavoidance.webSocket.event.VehicleCommandEvent;
import com.dongni.collisionavoidance.webSocket.message.VehicleCommandPayload;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.datacollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.websocket.event.PositionUpdateEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataProcessing.config;
package com.dongni.collisionavoidance.dataprocessing.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataProcessing.service;
package com.dongni.collisionavoidance.dataprocessing.service;
import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
import org.geotools.api.referencing.operation.MathTransform;

View File

@ -1,8 +1,9 @@
package com.dongni.collisionavoidance.dataProcessing.service;
package com.dongni.collisionavoidance.dataprocessing.service;
import com.dongni.collisionavoidance.dataProcessing.config.CoordinateSystemProperties;
import org.springframework.stereotype.Service;
import com.dongni.collisionavoidance.dataprocessing.config.CoordinateSystemProperties;
@Service
public class CoordinateSystemService {

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.dataProcessing.service;
package com.dongni.collisionavoidance.dataprocessing.service;
import com.dongni.collisionavoidance.common.model.GeoPosition;
import com.dongni.collisionavoidance.common.model.MovementState;

View File

@ -1,9 +1,12 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.event.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.dongni.collisionavoidance.rule.event.RuleEventListener;
import com.dongni.collisionavoidance.rule.event.RuleEventPublisher;
import java.time.LocalDateTime;
import java.util.Map;

View File

@ -1,7 +1,8 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.event.service;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.roads.model;
package com.dongni.collisionavoidance.road.model;
/**
* Enumeration representing the directionality of a road.

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.roads.model;
package com.dongni.collisionavoidance.road.model;
import lombok.Builder;
import lombok.Value;

View File

@ -1,10 +1,11 @@
package com.dongni.collisionavoidance.roads.service;
package com.dongni.collisionavoidance.road.service;
import com.dongni.collisionavoidance.common.model.GeoPosition; // Assuming GeoPosition is in common.model
import com.dongni.collisionavoidance.roads.model.RoadDirectionality;
import com.dongni.collisionavoidance.roads.model.RoadInfo;
import com.dongni.collisionavoidance.config.properties.AirportRoadsProperties;
import com.dongni.collisionavoidance.config.properties.RoadProperties;
import com.dongni.collisionavoidance.road.model.RoadDirectionality;
import com.dongni.collisionavoidance.road.model.RoadInfo;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,9 +1,9 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.event.service.ThreatLevelEventService;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.service.RuleViolationProcessor;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.service.RuleViolationProcessor;
import com.dongni.collisionavoidance.geofence.service.ThreatLevelEventService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;

View File

@ -1,9 +1,9 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;

View File

@ -1,8 +1,9 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionStatus;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionStatus;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;

View File

@ -1,7 +1,8 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;

View File

@ -1,8 +1,8 @@
package com.dongni.collisionavoidance.geofence.model.entity;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;
import org.hibernate.annotations.JdbcTypeCode;

View File

@ -1,6 +1,5 @@
package com.dongni.collisionavoidance.geofence.event;
package com.dongni.collisionavoidance.rule.event;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
@ -128,7 +127,7 @@ public class RuleViolationEventOccurred extends ApplicationEvent {
/**
* 判断是否为紧急违规类型
*/
private boolean isEmergencyViolationType(com.dongni.collisionavoidance.geofence.model.enums.ViolationType violationType) {
private boolean isEmergencyViolationType(com.dongni.collisionavoidance.rule.model.enums.ViolationType violationType) {
switch (violationType) {
case UNAUTHORIZED_ENTRY:
case SAFETY_ZONE_VIOLATION:

View File

@ -1,10 +1,10 @@
package com.dongni.collisionavoidance.geofence.model.entity;
package com.dongni.collisionavoidance.rule.model.entity;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.SpatialObjectType;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;
import org.locationtech.jts.geom.Geometry;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
/**
* 空间规则分类枚举

View File

@ -1,4 +1,6 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
/**
* 规则执行结果枚举

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
/**
* 规则执行状态枚举

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
/**
* 空间规则状态枚举

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
/**
* 空间对象类型枚举

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.geofence.model.enums;
package com.dongni.collisionavoidance.rule.model.enums;
/**
* 违规类型枚举

View File

@ -1,9 +1,10 @@
package com.dongni.collisionavoidance.geofence.repository;
package com.dongni.collisionavoidance.rule.repository;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import org.locationtech.jts.geom.Point;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

View File

@ -1,9 +1,10 @@
package com.dongni.collisionavoidance.geofence.repository;
package com.dongni.collisionavoidance.rule.repository;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.enums.SpatialObjectType;
import org.locationtech.jts.geom.Point;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

View File

@ -1,9 +1,10 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import org.locationtech.jts.geom.Point;
import java.time.LocalDateTime;
@ -159,6 +160,33 @@ public interface LocationRuleQueryService {
*/
List<SpatialRule> findUpcomingRules(Point location, MovingObjectType vehicleType, int lookAheadMinutes);
/**
* 检查车辆类型是否有权限访问指定位置
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 如果有权限返回true
*/
boolean hasAccessPermission(org.locationtech.jts.geom.Point location, com.dongni.collisionavoidance.common.model.MovingObjectType vehicleType, java.time.LocalDateTime timestamp);
/**
* 获取车辆类型被禁止访问的规则列表
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 被禁止的规则列表
*/
java.util.List<com.dongni.collisionavoidance.rule.model.entity.SpatialRule> getRestrictedRules(org.locationtech.jts.geom.Point location, com.dongni.collisionavoidance.common.model.MovingObjectType vehicleType, java.time.LocalDateTime timestamp);
/**
* 获取车辆类型允许访问的规则列表
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 允许的规则列表
*/
java.util.List<com.dongni.collisionavoidance.rule.model.entity.SpatialRule> getAllowedRules(org.locationtech.jts.geom.Point location, com.dongni.collisionavoidance.common.model.MovingObjectType vehicleType, java.time.LocalDateTime timestamp);
/**
* 规则覆盖统计信息
*/

View File

@ -1,11 +1,12 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import org.locationtech.jts.geom.Point;
import java.time.LocalDateTime;

View File

@ -1,9 +1,9 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService.RuleValidationResult;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService.RuleValidationResult;
import java.time.LocalDateTime;
import java.util.List;

View File

@ -1,10 +1,11 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionStatus;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionStatus;
import org.locationtech.jts.geom.Point;
import java.time.LocalDateTime;

View File

@ -1,8 +1,8 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import java.time.LocalDateTime;
import java.util.List;

View File

@ -1,8 +1,8 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import org.locationtech.jts.geom.Point;

View File

@ -1,10 +1,11 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.SpatialObjectType;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.Point;

View File

@ -1,6 +1,6 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.fasterxml.jackson.databind.JsonNode;
import java.time.LocalDateTime;

View File

@ -1,8 +1,9 @@
package com.dongni.collisionavoidance.geofence.service;
package com.dongni.collisionavoidance.rule.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import org.locationtech.jts.geom.Point;
import java.time.LocalDateTime;
@ -27,41 +28,6 @@ public interface VehicleTypePermissionService {
*/
boolean isVehicleTypeApplicableToRule(SpatialRule rule, MovingObjectType vehicleType);
/**
* 检查车辆类型是否有权限访问指定位置
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 如果有权限返回true
*/
boolean hasAccessPermission(Point location, MovingObjectType vehicleType, LocalDateTime timestamp);
/**
* 检查车辆类型是否有权限执行指定类别的规则
* @param ruleCategory 规则类别
* @param vehicleType 车辆类型
* @return 如果有权限返回true
*/
boolean hasRuleCategoryPermission(RuleCategory ruleCategory, MovingObjectType vehicleType);
/**
* 获取车辆类型被禁止访问的规则列表
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 被禁止的规则列表
*/
List<SpatialRule> getRestrictedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp);
/**
* 获取车辆类型允许访问的规则列表
* @param location 位置点
* @param vehicleType 车辆类型
* @param timestamp 时间戳
* @return 允许的规则列表
*/
List<SpatialRule> getAllowedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp);
/**
* 检查车辆类型是否在规则的允许列表中
* @param rule 空间规则

View File

@ -1,16 +1,17 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.repository.SpatialRuleRepository;
import com.dongni.collisionavoidance.geofence.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.geofence.service.RulePriorityService;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService;
import com.dongni.collisionavoidance.geofence.service.TimeWindowMatchingService;
import com.dongni.collisionavoidance.geofence.service.VehicleTypePermissionService;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.repository.SpatialRuleRepository;
import com.dongni.collisionavoidance.rule.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.rule.service.RulePriorityService;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService;
import com.dongni.collisionavoidance.rule.service.TimeWindowMatchingService;
import com.dongni.collisionavoidance.rule.service.VehicleTypePermissionService;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
@ -442,4 +443,34 @@ public class LocationRuleQueryServiceImpl implements LocationRuleQueryService {
logger.debug("从路口ID获取几何形状功能待实现: intersectionId={}", intersectionId);
return null; // 暂时返回null后续集成路口服务
}
@Override
public boolean hasAccessPermission(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
List<SpatialRule> applicableRules = findApplicableRules(location, vehicleType, timestamp);
List<SpatialRule> accessControlRules = applicableRules.stream()
.filter(rule -> rule.getCategory() == RuleCategory.ACCESS_CONTROL)
.collect(Collectors.toList());
if (accessControlRules.isEmpty()) {
return true;
}
boolean hasProhibition = accessControlRules.stream()
.anyMatch(rule -> !vehicleTypePermissionService.isVehicleTypeApplicableToRule(rule, vehicleType));
return !hasProhibition;
}
@Override
public List<SpatialRule> getRestrictedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
List<SpatialRule> allRules = findApplicableRules(location, vehicleType, timestamp);
return allRules.stream()
.filter(rule -> !vehicleTypePermissionService.isVehicleTypeApplicableToRule(rule, vehicleType))
.collect(Collectors.toList());
}
@Override
public List<SpatialRule> getAllowedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
List<SpatialRule> allRules = findApplicableRules(location, vehicleType, timestamp);
return allRules.stream()
.filter(rule -> vehicleTypePermissionService.isVehicleTypeApplicableToRule(rule, vehicleType))
.collect(Collectors.toList());
}
}

View File

@ -1,17 +1,18 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.ViolationType;
import com.dongni.collisionavoidance.geofence.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.geofence.service.RealTimeViolationDetector;
import com.dongni.collisionavoidance.geofence.service.RuleExecutionEngine;
import com.dongni.collisionavoidance.geofence.service.RuleViolationProcessor;
import com.dongni.collisionavoidance.geofence.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.rule.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.rule.service.RealTimeViolationDetector;
import com.dongni.collisionavoidance.rule.service.RuleExecutionEngine;
import com.dongni.collisionavoidance.rule.service.RuleViolationProcessor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;

View File

@ -1,13 +1,12 @@
package com.dongni.collisionavoidance.geofence.service.impl;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.geofence.service.RuleConfigurationService;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService.RuleValidationResult;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.rule.service.RuleConfigurationService;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService.RuleValidationResult;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;

View File

@ -1,14 +1,17 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.event.RuleEventPublisher;
import com.dongni.collisionavoidance.geofence.event.RuleExecutionEvent;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.*;
import com.dongni.collisionavoidance.geofence.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.geofence.service.RuleExecutionEngine;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService;
import com.dongni.collisionavoidance.rule.event.RuleEventPublisher;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionStatus;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.rule.service.RuleExecutionEngine;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.geom.Point;

View File

@ -1,10 +1,11 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.service.RulePriorityService;
import com.dongni.collisionavoidance.geofence.service.VehicleTypePermissionService;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.service.RulePriorityService;
import com.dongni.collisionavoidance.rule.service.VehicleTypePermissionService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.geofence.event.RuleEventPublisher;
import com.dongni.collisionavoidance.geofence.event.RuleViolationEventOccurred;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.*;
import com.dongni.collisionavoidance.geofence.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.geofence.service.RuleViolationProcessor;
import com.dongni.collisionavoidance.rule.event.RuleEventPublisher;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.event.RuleViolationEventOccurred;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.rule.model.enums.ViolationType;
import com.dongni.collisionavoidance.rule.repository.RuleViolationEventRepository;
import com.dongni.collisionavoidance.rule.service.RuleViolationProcessor;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;

View File

@ -1,13 +1,13 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.event.RuleEventPublisher;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus;
import com.dongni.collisionavoidance.geofence.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.geofence.repository.SpatialRuleRepository;
import com.dongni.collisionavoidance.geofence.service.SpatialRuleService;
import com.dongni.collisionavoidance.rule.event.RuleEventPublisher;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.model.enums.RuleStatus;
import com.dongni.collisionavoidance.rule.model.enums.SpatialObjectType;
import com.dongni.collisionavoidance.rule.repository.SpatialRuleRepository;
import com.dongni.collisionavoidance.rule.service.SpatialRuleService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.geom.Geometry;

View File

@ -1,7 +1,7 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.service.TimeWindowMatchingService;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.service.TimeWindowMatchingService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;

View File

@ -1,20 +1,17 @@
package com.dongni.collisionavoidance.geofence.service.impl;
package com.dongni.collisionavoidance.rule.service.impl;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.RuleCategory;
import com.dongni.collisionavoidance.geofence.service.LocationRuleQueryService;
import com.dongni.collisionavoidance.geofence.service.VehicleTypePermissionService;
import org.locationtech.jts.geom.Point;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleCategory;
import com.dongni.collisionavoidance.rule.service.VehicleTypePermissionService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* 车辆类型权限检查服务实现类
@ -29,9 +26,6 @@ public class VehicleTypePermissionServiceImpl implements VehicleTypePermissionSe
private static final Logger logger = LoggerFactory.getLogger(VehicleTypePermissionServiceImpl.class);
@Autowired
private LocationRuleQueryService locationRuleQueryService;
// 车辆类型权限级别映射数值越小权限越高
private static final Map<MovingObjectType, Integer> PERMISSION_LEVELS = Map.of(
MovingObjectType.AIRCRAFT, 1, // 最高权限航空器
@ -84,76 +78,6 @@ public class VehicleTypePermissionServiceImpl implements VehicleTypePermissionSe
}
}
@Override
public boolean hasAccessPermission(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
try {
// 获取位置的所有适用规则
List<SpatialRule> applicableRules = locationRuleQueryService.findApplicableRules(location, vehicleType, timestamp);
// 检查是否有访问控制规则
List<SpatialRule> accessControlRules = applicableRules.stream()
.filter(rule -> rule.getCategory() == RuleCategory.ACCESS_CONTROL)
.collect(Collectors.toList());
// 如果没有访问控制规则则允许访问
if (accessControlRules.isEmpty()) {
return true;
}
// 检查是否有明确禁止的规则
boolean hasProhibition = accessControlRules.stream()
.anyMatch(rule -> isAccessProhibited(rule, vehicleType));
return !hasProhibition;
} catch (Exception e) {
logger.error("检查访问权限失败: location={}, vehicleType={}", location, vehicleType, e);
return false; // 出错时默认禁止访问
}
}
@Override
public boolean hasRuleCategoryPermission(RuleCategory ruleCategory, MovingObjectType vehicleType) {
try {
VehicleAccessRestriction restriction = getAccessRestriction(vehicleType);
return !restriction.isRestrictedForCategory(ruleCategory);
} catch (Exception e) {
logger.error("检查规则类别权限失败: category={}, vehicleType={}", ruleCategory, vehicleType, e);
return true; // 出错时默认允许
}
}
@Override
public List<SpatialRule> getRestrictedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
try {
List<SpatialRule> allRules = locationRuleQueryService.findApplicableRules(location, vehicleType, timestamp);
return allRules.stream()
.filter(rule -> !isVehicleTypeApplicableToRule(rule, vehicleType))
.collect(Collectors.toList());
} catch (Exception e) {
logger.error("获取限制规则失败: location={}, vehicleType={}", location, vehicleType, e);
return new ArrayList<>();
}
}
@Override
public List<SpatialRule> getAllowedRules(Point location, MovingObjectType vehicleType, LocalDateTime timestamp) {
try {
List<SpatialRule> allRules = locationRuleQueryService.findApplicableRules(location, vehicleType, timestamp);
return allRules.stream()
.filter(rule -> isVehicleTypeApplicableToRule(rule, vehicleType))
.collect(Collectors.toList());
} catch (Exception e) {
logger.error("获取允许规则失败: location={}, vehicleType={}", location, vehicleType, e);
return new ArrayList<>();
}
}
@Override
public boolean isVehicleTypeInAllowedList(SpatialRule rule, MovingObjectType vehicleType) {
try {

View File

@ -1,15 +1,19 @@
package com.dongni.collisionavoidance.webSocket.broadcaster;
package com.dongni.collisionavoidance.websocket.broadcaster;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.geofence.event.RuleExecutionEvent;
import com.dongni.collisionavoidance.geofence.event.RuleStateChangeEvent;
import com.dongni.collisionavoidance.geofence.event.RuleViolationEventOccurred;
import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent;
import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule;
import com.dongni.collisionavoidance.geofence.model.enums.GeofenceAlertLevel;
import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.webSocket.event.*;
import com.dongni.collisionavoidance.webSocket.message.*;
import com.dongni.collisionavoidance.rule.event.RuleExecutionEvent;
import com.dongni.collisionavoidance.rule.event.RuleStateChangeEvent;
import com.dongni.collisionavoidance.rule.event.RuleViolationEvent;
import com.dongni.collisionavoidance.rule.event.RuleViolationEventOccurred;
import com.dongni.collisionavoidance.rule.model.entity.SpatialRule;
import com.dongni.collisionavoidance.rule.model.enums.RuleExecutionResult;
import com.dongni.collisionavoidance.websocket.event.RuleExecutionStatusWebSocketEvent;
import com.dongni.collisionavoidance.websocket.event.RuleStateChangeWebSocketEvent;
import com.dongni.collisionavoidance.websocket.event.RuleViolationWebSocketEvent;
import com.dongni.collisionavoidance.websocket.message.RuleExecutionStatusPayload;
import com.dongni.collisionavoidance.websocket.message.RuleStateChangePayload;
import com.dongni.collisionavoidance.websocket.message.RuleViolationPayload;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.geom.Point;

View File

@ -1,13 +1,28 @@
package com.dongni.collisionavoidance.webSocket.broadcaster;
package com.dongni.collisionavoidance.websocket.broadcaster;
import com.dongni.collisionavoidance.websocket.cache.MessageCacheService;
import com.dongni.collisionavoidance.websocket.event.CollisionWarningEvent;
import com.dongni.collisionavoidance.websocket.event.PositionUpdateEvent;
import com.dongni.collisionavoidance.websocket.event.RuleExecutionStatusWebSocketEvent;
import com.dongni.collisionavoidance.websocket.event.RuleStateChangeWebSocketEvent;
import com.dongni.collisionavoidance.websocket.event.RuleViolationWebSocketEvent;
import com.dongni.collisionavoidance.websocket.event.TrafficLightStatusEvent;
import com.dongni.collisionavoidance.websocket.event.VehicleCommandEvent;
import com.dongni.collisionavoidance.websocket.message.CollisionWarningPayload;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.websocket.message.PositionUpdatePayload;
import com.dongni.collisionavoidance.websocket.message.RuleExecutionStatusPayload;
import com.dongni.collisionavoidance.websocket.message.RuleStateChangePayload;
import com.dongni.collisionavoidance.websocket.message.RuleViolationPayload;
import com.dongni.collisionavoidance.websocket.message.TrafficLightStatusPayload;
import com.dongni.collisionavoidance.websocket.message.VehicleCommandPayload;
import com.dongni.collisionavoidance.websocket.message.UniversalMessage;
import com.dongni.collisionavoidance.webSocket.cache.MessageCacheService;
import com.dongni.collisionavoidance.webSocket.event.*;
import com.dongni.collisionavoidance.webSocket.message.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.beans.factory.annotation.Value;
import java.util.UUID;
@ -42,7 +57,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handlePositionUpdate(PositionUpdateEvent event) {
WebSocketMessage<PositionUpdatePayload> message = WebSocketMessage.<PositionUpdatePayload>builder()
UniversalMessage<PositionUpdatePayload> message = UniversalMessage.<PositionUpdatePayload>builder()
.type(MessageTypeConstants.POSITION_UPDATE)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -58,7 +73,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleVehicleCommand(VehicleCommandEvent event) {
WebSocketMessage<VehicleCommandPayload> message = WebSocketMessage.<VehicleCommandPayload>builder()
UniversalMessage<VehicleCommandPayload> message = UniversalMessage.<VehicleCommandPayload>builder()
.type(MessageTypeConstants.VEHICLE_COMMAND)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -74,7 +89,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleTrafficLightStatus(TrafficLightStatusEvent event) {
WebSocketMessage<TrafficLightStatusPayload> message = WebSocketMessage.<TrafficLightStatusPayload>builder()
UniversalMessage<TrafficLightStatusPayload> message = UniversalMessage.<TrafficLightStatusPayload>builder()
.type(MessageTypeConstants.TRAFFIC_LIGHT_STATUS)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -90,7 +105,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleCollisionWarning(CollisionWarningEvent event) {
WebSocketMessage<CollisionWarningPayload> message = WebSocketMessage.<CollisionWarningPayload>builder()
UniversalMessage<CollisionWarningPayload> message = UniversalMessage.<CollisionWarningPayload>builder()
.type(MessageTypeConstants.COLLISION_WARNING)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -108,7 +123,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleRuleViolation(RuleViolationWebSocketEvent event) {
WebSocketMessage<RuleViolationPayload> message = WebSocketMessage.<RuleViolationPayload>builder()
UniversalMessage<RuleViolationPayload> message = UniversalMessage.<RuleViolationPayload>builder()
.type(MessageTypeConstants.RULE_VIOLATION)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -124,7 +139,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleRuleExecutionStatus(RuleExecutionStatusWebSocketEvent event) {
WebSocketMessage<RuleExecutionStatusPayload> message = WebSocketMessage.<RuleExecutionStatusPayload>builder()
UniversalMessage<RuleExecutionStatusPayload> message = UniversalMessage.<RuleExecutionStatusPayload>builder()
.type(MessageTypeConstants.RULE_EXECUTION_STATUS)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -140,7 +155,7 @@ public class WebSocketMessageBroadcaster {
*/
@EventListener
public void handleRuleStateChange(RuleStateChangeWebSocketEvent event) {
WebSocketMessage<RuleStateChangePayload> message = WebSocketMessage.<RuleStateChangePayload>builder()
UniversalMessage<RuleStateChangePayload> message = UniversalMessage.<RuleStateChangePayload>builder()
.type(MessageTypeConstants.RULE_STATE_CHANGE)
.timestamp(event.getTimestamp())
.messageId(generateMessageId())
@ -154,7 +169,7 @@ public class WebSocketMessageBroadcaster {
* 统一消息广播方法
* @param message 要广播的消息
*/
private void broadcastMessage(WebSocketMessage<?> message) {
private void broadcastMessage(UniversalMessage<?> message) {
try {
// 立即推送到控制台
messagingTemplate.convertAndSend(UNIFIED_TOPIC, message);

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.cache;
package com.dongni.collisionavoidance.websocket.cache;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;

View File

@ -1,9 +1,9 @@
package com.dongni.collisionavoidance.webSocket.cache;
package com.dongni.collisionavoidance.websocket.cache;
import com.dongni.collisionavoidance.webSocket.message.WebSocketMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.dongni.collisionavoidance.websocket.message.UniversalMessage;
import java.time.Duration;
import java.util.List;
@ -32,7 +32,7 @@ public class MessageCacheService {
* 缓存消息
* @param message 要缓存的WebSocket消息
*/
public void cacheMessage(WebSocketMessage<?> message) {
public void cacheMessage(UniversalMessage<?> message) {
try {
String key = CACHE_KEY_PREFIX + message.getType();
@ -58,7 +58,7 @@ public class MessageCacheService {
* @return 最近的消息列表
*/
@SuppressWarnings("unchecked")
public List<WebSocketMessage<?>> getRecentMessages(String messageType, int count) {
public List<UniversalMessage<?>> getRecentMessages(String messageType, int count) {
try {
String key = CACHE_KEY_PREFIX + messageType;
List<Object> objects = redisTemplate.opsForList().range(key, 0, count - 1);
@ -68,8 +68,8 @@ public class MessageCacheService {
}
return objects.stream()
.filter(obj -> obj instanceof WebSocketMessage)
.map(obj -> (WebSocketMessage<?>) obj)
.filter(obj -> obj instanceof UniversalMessage)
.map(obj -> (UniversalMessage<?>) obj)
.collect(Collectors.toList());
} catch (Exception e) {
@ -83,7 +83,7 @@ public class MessageCacheService {
* @param count 每种类型获取的消息数量
* @return 所有类型的最近消息列表
*/
public List<WebSocketMessage<?>> getAllRecentMessages(int count) {
public List<UniversalMessage<?>> getAllRecentMessages(int count) {
try {
// 获取所有缓存键
String pattern = CACHE_KEY_PREFIX + "*";

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.config;
package com.dongni.collisionavoidance.websocket.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.config;
package com.dongni.collisionavoidance.websocket.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.controller;
package com.dongni.collisionavoidance.websocket.controller;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.controller;
package com.dongni.collisionavoidance.websocket.controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.webSocket.message.CollisionWarningPayload;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.Instant;
import java.util.UUID;
import com.dongni.collisionavoidance.websocket.message.CollisionWarningPayload;
/**
* 碰撞预警事件
* 当检测到碰撞风险时发布此事件

View File

@ -1,8 +1,9 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.webSocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.webSocket.message.PositionUpdatePayload;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.websocket.message.PositionUpdatePayload;
import lombok.Getter;
import java.util.UUID;

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.webSocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.webSocket.message.RuleExecutionStatusPayload;
import lombok.Data;
import lombok.Builder;
import java.util.UUID;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.websocket.message.RuleExecutionStatusPayload;
/**
* 规则执行状态WebSocket事件
* 用于通知前端规则执行状态变化

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.webSocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.webSocket.message.RuleStateChangePayload;
import lombok.Data;
import lombok.Builder;
import java.util.UUID;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.websocket.message.RuleStateChangePayload;
/**
* 规则状态变更WebSocket事件
* 用于通知前端规则状态变更

View File

@ -1,12 +1,12 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.webSocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.webSocket.message.RuleViolationPayload;
import lombok.Data;
import lombok.Builder;
import java.util.UUID;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.websocket.message.RuleViolationPayload;
/**
* 规则违规WebSocket事件
* 用于通知前端规则违规情况

View File

@ -1,12 +1,13 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.webSocket.message.TrafficLightStatusPayload;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.Instant;
import java.util.UUID;
import com.dongni.collisionavoidance.websocket.message.TrafficLightStatusPayload;
/**
* 红绿灯状态事件
* 当红绿灯状态发生变化时发布此事件

View File

@ -1,7 +1,9 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.websocket.message.MessageTypeConstants;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.webSocket.message.MessageTypeConstants;
import lombok.Getter;
import java.util.UUID;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.event;
package com.dongni.collisionavoidance.websocket.event;
/**
* WebSocket事件基础接口

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
/**
* WebSocket消息优先级枚举

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
/**
* WebSocket消息类型常量定义

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@ -16,7 +16,7 @@ import lombok.Builder;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WebSocketMessage<T> {
public class UniversalMessage<T> {
/**
* 消息类型 (position_update, vehicle_command等)
@ -50,8 +50,8 @@ public class WebSocketMessage<T> {
/**
* 为位置更新消息创建便捷方法
*/
public static <T> WebSocketMessage<T> positionUpdate(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> positionUpdate(T payload) {
return UniversalMessage.<T>builder()
.type("position_update")
.timestamp(System.nanoTime() / 1000) // 转换为微秒
.payload(payload)
@ -61,8 +61,8 @@ public class WebSocketMessage<T> {
/**
* 为车辆指令消息创建便捷方法
*/
public static <T> WebSocketMessage<T> vehicleCommand(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> vehicleCommand(T payload) {
return UniversalMessage.<T>builder()
.type("vehicle_command")
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -72,8 +72,8 @@ public class WebSocketMessage<T> {
/**
* 为红绿灯状态消息创建便捷方法
*/
public static <T> WebSocketMessage<T> trafficLightStatus(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> trafficLightStatus(T payload) {
return UniversalMessage.<T>builder()
.type("intersection_traffic_light_status")
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -83,8 +83,8 @@ public class WebSocketMessage<T> {
/**
* 为碰撞预警消息创建便捷方法
*/
public static <T> WebSocketMessage<T> collisionWarning(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> collisionWarning(T payload) {
return UniversalMessage.<T>builder()
.type("collision_warning")
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -96,8 +96,8 @@ public class WebSocketMessage<T> {
/**
* 为规则违规事件消息创建便捷方法
*/
public static <T> WebSocketMessage<T> ruleViolation(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> ruleViolation(T payload) {
return UniversalMessage.<T>builder()
.type(MessageTypeConstants.RULE_VIOLATION)
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -107,8 +107,8 @@ public class WebSocketMessage<T> {
/**
* 为规则执行状态消息创建便捷方法
*/
public static <T> WebSocketMessage<T> ruleExecutionStatus(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> ruleExecutionStatus(T payload) {
return UniversalMessage.<T>builder()
.type(MessageTypeConstants.RULE_EXECUTION_STATUS)
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -118,8 +118,8 @@ public class WebSocketMessage<T> {
/**
* 为规则状态变更消息创建便捷方法
*/
public static <T> WebSocketMessage<T> ruleStateChange(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> ruleStateChange(T payload) {
return UniversalMessage.<T>builder()
.type(MessageTypeConstants.RULE_STATE_CHANGE)
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -129,8 +129,8 @@ public class WebSocketMessage<T> {
/**
* 为规则告警消息创建便捷方法
*/
public static <T> WebSocketMessage<T> ruleAlert(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> ruleAlert(T payload) {
return UniversalMessage.<T>builder()
.type(MessageTypeConstants.RULE_ALERT)
.timestamp(System.nanoTime() / 1000)
.payload(payload)
@ -140,8 +140,8 @@ public class WebSocketMessage<T> {
/**
* 为规则配置更新消息创建便捷方法
*/
public static <T> WebSocketMessage<T> ruleConfigUpdate(T payload) {
return WebSocketMessage.<T>builder()
public static <T> UniversalMessage<T> ruleConfigUpdate(T payload) {
return UniversalMessage.<T>builder()
.type(MessageTypeConstants.RULE_CONFIG_UPDATE)
.timestamp(System.nanoTime() / 1000)
.payload(payload)

View File

@ -1,4 +1,4 @@
package com.dongni.collisionavoidance.webSocket.message;
package com.dongni.collisionavoidance.websocket.message;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

View File

@ -7,13 +7,12 @@ import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
// import com.dongni.collisionavoidance.common.model.repository.MovingObjectRepository; // 已删除
import com.dongni.collisionavoidance.dataCollector.service.AuthService;
import com.dongni.collisionavoidance.dataCollector.service.DataCollectorService;
import java.util.concurrent.Executor;
import org.springframework.web.client.RestTemplate;
import com.dongni.collisionavoidance.datacollector.service.AuthService;
import com.dongni.collisionavoidance.datacollector.service.DataCollectorService;
/**
* 测试专用配置类用于禁用后台线程和外部连接
*/

View File

@ -2,12 +2,12 @@ package com.dongni.collisionavoidance.controller;
import com.dongni.collisionavoidance.common.model.dto.Response;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.dataCollector.model.dto.VehicleStateRequest;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandType;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.dataCollector.service.UnmannedVehicleControlService;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleCommand;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleStateInfo;
import com.dongni.collisionavoidance.datacollector.model.dto.VehicleStateRequest;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandType;
import com.dongni.collisionavoidance.datacollector.service.UnmannedVehicleControlService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

View File

@ -1,12 +1,14 @@
package com.dongni.collisionavoidance.dataCollector.service;
package com.dongni.collisionavoidance.datacollector.service;
import com.dongni.collisionavoidance.common.model.MovingObjectType;
import com.dongni.collisionavoidance.common.model.spatial.VehicleLocation;
import com.dongni.collisionavoidance.common.service.VehicleLocationService;
import com.dongni.collisionavoidance.dataCollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandType;
import com.dongni.collisionavoidance.dataCollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.dataCollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.datacollector.model.entity.VehicleCommandEntity;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandReason;
import com.dongni.collisionavoidance.datacollector.model.enums.CommandType;
import com.dongni.collisionavoidance.datacollector.repository.VehicleCommandRepository;
import com.dongni.collisionavoidance.datacollector.service.VehicleDataPersistenceService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

Some files were not shown because too many files have changed in this diff Show More