|
@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
import com.ruoyi.common.core.redis.RedisCache; |
|
|
import com.ruoyi.common.core.redis.RedisCache; |
|
|
import com.ruoyi.common.exception.ServiceException; |
|
|
import com.ruoyi.common.exception.ServiceException; |
|
|
|
|
|
import com.zc.business.constant.DeviceTypeConstants; |
|
|
import com.zc.business.constant.RedisKeyConstants; |
|
|
import com.zc.business.constant.RedisKeyConstants; |
|
|
import com.zc.business.controller.DcDeviceController; |
|
|
import com.zc.business.controller.DcDeviceController; |
|
|
import com.zc.business.domain.DcRoadSection; |
|
|
import com.zc.business.domain.DcRoadSection; |
|
@ -98,8 +99,8 @@ public class DcTrafficStatisticsServiceImpl |
|
|
// 从Redis缓存中获取指定方向的交通路段数据列表
|
|
|
// 从Redis缓存中获取指定方向的交通路段数据列表
|
|
|
List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); |
|
|
List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); |
|
|
|
|
|
|
|
|
// 根据指定的方向和路段ID范围获取交通数据
|
|
|
// 根据请求过滤交通数据
|
|
|
List<DcTrafficSectionData> trafficSectionDataList = fetchTrafficDataByDirAndRange(request.getRoadSectionId(), dcTrafficSectionDataCaches); |
|
|
List<DcTrafficSectionData> trafficSectionDataList = filterTrafficDataByRequest(request, dcTrafficSectionDataCaches); |
|
|
|
|
|
|
|
|
// 对获取的交通路段数据进行分析,得到交通指标数据
|
|
|
// 对获取的交通路段数据进行分析,得到交通指标数据
|
|
|
List<DcTrafficMetricsData> dcTrafficMetricsDataList = trafficAnalysis.calculateTrafficMetrics(request, trafficSectionDataList); |
|
|
List<DcTrafficMetricsData> dcTrafficMetricsDataList = trafficAnalysis.calculateTrafficMetrics(request, trafficSectionDataList); |
|
@ -151,6 +152,16 @@ public class DcTrafficStatisticsServiceImpl |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 获取设备类型
|
|
|
|
|
|
Integer deviceType = request.getDeviceType(); |
|
|
|
|
|
|
|
|
|
|
|
if (deviceType == null) { |
|
|
|
|
|
// 如果没有指定设备类型,则默认为毫米波雷达
|
|
|
|
|
|
deviceType = DeviceTypeConstants.MILLIMETER_WAVE_RADAR; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
queryWrapper.eq(DcTrafficSectionData::getDeviceType, deviceType); |
|
|
|
|
|
|
|
|
// 根据收集到的交通段数据计算并返回交通指标数据
|
|
|
// 根据收集到的交通段数据计算并返回交通指标数据
|
|
|
return trafficAnalysis.calculateTrafficMetrics(request, list(queryWrapper)); |
|
|
return trafficAnalysis.calculateTrafficMetrics(request, list(queryWrapper)); |
|
|
} |
|
|
} |
|
@ -288,18 +299,29 @@ public class DcTrafficStatisticsServiceImpl |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 根据指定的方向和路段ID范围获取交通数据。 |
|
|
* 根据请求过滤交通数据。 |
|
|
* |
|
|
* |
|
|
* @param roadSectionId 指定的路段ID,如果为null,则不根据路段筛选数据。 |
|
|
* @param request 包含交通数据查询条件的请求对象,可以指定路段ID和设备类型。 |
|
|
* @return 返回符合指定方向和路段范围的交通段数据列表。 |
|
|
* @param dcTrafficSectionDataCaches 存储的交通数据段列表。 |
|
|
|
|
|
* @return 过滤后的交通数据段列表,仅包含满足请求条件的数据。 |
|
|
*/ |
|
|
*/ |
|
|
public List<DcTrafficSectionData> fetchTrafficDataByDirAndRange(Long roadSectionId, List<DcTrafficSectionData> dcTrafficSectionDataCaches) { |
|
|
public List<DcTrafficSectionData> filterTrafficDataByRequest( |
|
|
|
|
|
DcTrafficMetricsDataRequest request, |
|
|
|
|
|
List<DcTrafficSectionData> dcTrafficSectionDataCaches |
|
|
|
|
|
) { |
|
|
|
|
|
|
|
|
|
|
|
if (request == null) { |
|
|
|
|
|
return dcTrafficSectionDataCaches; // 如果请求对象为空,直接返回原始交通数据列表
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Long roadSectionId = request.getRoadSectionId(); |
|
|
|
|
|
|
|
|
// 初始化路段起始和终止桩号
|
|
|
// 初始化路段起始和终止桩号
|
|
|
Integer startStakeMark; |
|
|
Integer startStakeMark = null; |
|
|
Integer endStakeMark; |
|
|
Integer endStakeMark = null; |
|
|
|
|
|
|
|
|
// 根据提供的路段ID查询路段信息,并转换为起始和终止桩号
|
|
|
|
|
|
if (roadSectionId != null) { |
|
|
if (roadSectionId != null) { |
|
|
|
|
|
// 根据提供的路段ID查询路段信息,并转换为起始和终止桩号
|
|
|
DcRoadSection dcRoadSection = redisCache.getCacheMapValue(RedisKeyConstants.DC_ROAD_SECTION, roadSectionId); |
|
|
DcRoadSection dcRoadSection = redisCache.getCacheMapValue(RedisKeyConstants.DC_ROAD_SECTION, roadSectionId); |
|
|
|
|
|
|
|
|
// 验证路段ID是否存在
|
|
|
// 验证路段ID是否存在
|
|
@ -309,16 +331,28 @@ public class DcTrafficStatisticsServiceImpl |
|
|
|
|
|
|
|
|
startStakeMark = StakeMarkUtils.stakeMarkToInt(dcRoadSection.getStartStakeMark()); |
|
|
startStakeMark = StakeMarkUtils.stakeMarkToInt(dcRoadSection.getStartStakeMark()); |
|
|
endStakeMark = StakeMarkUtils.stakeMarkToInt(dcRoadSection.getEndStakeMark()); |
|
|
endStakeMark = StakeMarkUtils.stakeMarkToInt(dcRoadSection.getEndStakeMark()); |
|
|
} else { |
|
|
|
|
|
startStakeMark = null; |
|
|
|
|
|
endStakeMark = null; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 筛选并返回符合路段范围条件的交通数据列表
|
|
|
// 获取请求中的设备类型
|
|
|
|
|
|
Integer deviceType = request.getDeviceType(); |
|
|
|
|
|
|
|
|
|
|
|
// 如果设备类型为空,则默认为毫米波雷达
|
|
|
|
|
|
if (deviceType == null) { |
|
|
|
|
|
deviceType = DeviceTypeConstants.MILLIMETER_WAVE_RADAR; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 使用lambda表达式和流对交通数据进行过滤
|
|
|
|
|
|
final Integer finalStartStakeMark = startStakeMark; |
|
|
|
|
|
final Integer finalEndStakeMark = endStakeMark; |
|
|
|
|
|
final Integer finalDeviceType = deviceType; |
|
|
|
|
|
|
|
|
|
|
|
// 筛选并返回符合路段范围条件和设备类型条件的交通数据列表
|
|
|
return dcTrafficSectionDataCaches.stream() |
|
|
return dcTrafficSectionDataCaches.stream() |
|
|
.filter(data -> startStakeMark == null || endStakeMark == null |
|
|
.filter(data -> (finalStartStakeMark == null || finalEndStakeMark == null |
|
|
|| (data.getStakeMark() >= startStakeMark && data.getStakeMark() <= endStakeMark)) |
|
|
|| (data.getStakeMark() >= finalStartStakeMark && data.getStakeMark() <= finalEndStakeMark)) |
|
|
|
|
|
&& finalDeviceType.equals(data.getDeviceType())) |
|
|
.collect(Collectors.toList()); |
|
|
.collect(Collectors.toList()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|