| 
						
						
							
								
							
						
						
					 | 
					@ -15,6 +15,7 @@ import com.zc.business.domain.DcTrafficMetricsData; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.domain.DcTrafficSectionData; | 
					 | 
					 | 
					import com.zc.business.domain.DcTrafficSectionData; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.enums.*; | 
					 | 
					 | 
					import com.zc.business.enums.*; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.request.DcTrafficMetricsDataRequest; | 
					 | 
					 | 
					import com.zc.business.request.DcTrafficMetricsDataRequest; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					import com.zc.business.request.DcTrafficSectionDataRequest; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.statistics.cache.*; | 
					 | 
					 | 
					import com.zc.business.statistics.cache.*; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.mapper.DcTrafficSectionDataMapper; | 
					 | 
					 | 
					import com.zc.business.mapper.DcTrafficSectionDataMapper; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import com.zc.business.service.DcTrafficStatisticsService; | 
					 | 
					 | 
					import com.zc.business.service.DcTrafficStatisticsService; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -87,14 +88,57 @@ public class DcTrafficStatisticsServiceImpl | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    /** | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * 根据请求获取当前交通流量指标数据。 | 
					 | 
					 | 
					     * 根据提供的请求参数获取当前的交通截面数据。 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     * | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * @param request 包含获取流量指标所需的所有请求参数的对象。 | 
					 | 
					 | 
					     * @param request 包含获取交通截面所需的所有请求参数的对象。 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * @return 返回当前交通流量指标数据。 | 
					 | 
					 | 
					     * @return DcTrafficSectionData 返回一个包含当前交通截面数据列表。 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    @Override | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    public List<DcTrafficSectionData> currentSections(DcTrafficSectionDataRequest request) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        // 从Redis缓存中获取指定方向的交通路段数据列表
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        return filterTrafficDataByRequest(request, dcTrafficSectionDataCaches); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * 根据提供的请求参数获取历史的交通截面数据。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @param request 包含获取交通截面所需的所有请求参数的对象。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @return DcTrafficSectionData 返回一个包含历史交通截面数据列表。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    @Override | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    public List<DcTrafficSectionData> historySections(DcTrafficSectionDataRequest request) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (request.getStartTime() == null || request.getEndTime() == null) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            throw new ServiceException("开始时间或结束时间不能为空"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (request.getPeriodType() == null) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            throw new ServiceException("时段类型不能为空"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        // 构建查询条件
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        LambdaQueryWrapper<DcTrafficSectionData> queryWrapper = new LambdaQueryWrapper<>(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        queryWrapper.between(DcTrafficSectionData::getStatisticalDate, request.getStartTime(), request.getEndTime()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        queryWrapper.eq(DcTrafficSectionData::getPeriodType, request.getPeriodType()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        queryWrapper.eq(DcTrafficSectionData::getDirection, request.getDirection()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        queryWrapper.eq(DcTrafficSectionData::getDeviceType, request.getDeviceType()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        queryWrapper.eq(DcTrafficSectionData::getDeviceId, request.getDeviceId()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        return list(queryWrapper); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * 根据请求获取当前交通指标数据。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @param request 包含获取交通指标所需的所有请求参数的对象。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @return 返回当前交通指标数据。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					     * @throws ServiceException 如果没有获取到交通数据,则抛出异常。 | 
					 | 
					 | 
					     * @throws ServiceException 如果没有获取到交通数据,则抛出异常。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					     */ | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    @Override | 
					 | 
					 | 
					    @Override | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    public DcTrafficMetricsData currentTrafficMetrics(DcTrafficMetricsDataRequest request) { | 
					 | 
					 | 
					    public List<DcTrafficMetricsData> currentTrafficMetrics(DcTrafficMetricsDataRequest request) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        // 从Redis缓存中获取指定方向的交通路段数据列表
 | 
					 | 
					 | 
					        // 从Redis缓存中获取指定方向的交通路段数据列表
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); | 
					 | 
					 | 
					        List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -111,15 +155,15 @@ public class DcTrafficStatisticsServiceImpl | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        } | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        // 根据收集到的交通段数据计算并返回交通指标数据
 | 
					 | 
					 | 
					        // 根据收集到的交通段数据计算并返回交通指标数据
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        return dcTrafficMetricsDataList.get(0); | 
					 | 
					 | 
					        return dcTrafficMetricsDataList; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    /** | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * 计算获取指定条件下的历史交通流量指标数据。 | 
					 | 
					 | 
					     * 计算获取指定条件下的历史交通指标数据。 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     * | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					     * @param request 包含查询条件的请求对象,包括开始时间、结束时间、方向、周期类型和所属路段ID等信息。 | 
					 | 
					 | 
					     * @param request 包含查询条件的请求对象,包括开始时间、结束时间、方向、周期类型和所属路段ID等信息。 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * @return 返回一个包含交通流量指标数据的列表。 | 
					 | 
					 | 
					     * @return 返回一个包含交通指标数据的列表。 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     */ | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    @Override | 
					 | 
					 | 
					    @Override | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    public List<DcTrafficMetricsData> historyTrafficMetrics(DcTrafficMetricsDataRequest request) { | 
					 | 
					 | 
					    public List<DcTrafficMetricsData> historyTrafficMetrics(DcTrafficMetricsDataRequest request) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -277,19 +321,19 @@ public class DcTrafficStatisticsServiceImpl | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    /** | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * 根据方向获取交通流量数据 | 
					 | 
					 | 
					     * 根据方向获取交通数据 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     * | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					     * @param direction 方向 | 
					 | 
					 | 
					     * @param direction 方向 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * @return 单向交通流量数据 | 
					 | 
					 | 
					     * @return 单向交通数据 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     */ | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    private Map<String, DcTrafficSectionData> getTrafficDataByDirection(Byte direction) { | 
					 | 
					 | 
					    private Map<String, DcTrafficSectionData> getTrafficDataByDirection(Byte direction) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        return redisCache.getCacheMapValue(RedisKeyConstants.getDcDevicesTrafficStatisticsKey(direction)); | 
					 | 
					 | 
					        return redisCache.getCacheMapValue(RedisKeyConstants.getDcDevicesTrafficStatisticsKey(direction)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    /** | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * 获取上行和下行所有交通流量数据 | 
					 | 
					 | 
					     * 获取上行和下行所有交通数据 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     * | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					     * @return 所有交通流量数据 | 
					 | 
					 | 
					     * @return 所有交通数据 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     */ | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    private Map<String, DcTrafficSectionData> getTrafficDataForBothDirections() { | 
					 | 
					 | 
					    private Map<String, DcTrafficSectionData> getTrafficDataForBothDirections() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        Map<String, DcTrafficSectionData> allData = new HashMap<>(); | 
					 | 
					 | 
					        Map<String, DcTrafficSectionData> allData = new HashMap<>(); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -354,5 +398,39 @@ public class DcTrafficStatisticsServiceImpl | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                .collect(Collectors.toList()); | 
					 | 
					 | 
					                .collect(Collectors.toList()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    /** | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * 根据请求过滤交通数据。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @param request 包含设备类型和设备ID的请求对象,用于指定过滤条件。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @param dcTrafficSectionDataCaches 原始的交通数据列表。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     * @return 过滤后的交通数据列表,仅包含与请求条件匹配的数据。 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					     */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    public List<DcTrafficSectionData> filterTrafficDataByRequest( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            DcTrafficSectionDataRequest request, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            List<DcTrafficSectionData> dcTrafficSectionDataCaches | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    ) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (request == null) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            return dcTrafficSectionDataCaches; // 如果请求对象为空,直接返回原始交通数据列表
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        Integer deviceType = request.getDeviceType(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        Long deviceId = request.getDeviceId(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (deviceType == null && deviceId == null) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            return dcTrafficSectionDataCaches; // 如果请求中既没有设备类型也没有设备ID,返回原始数据列表
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        // 使用流对交通数据进行过滤,只返回与请求中的设备类型和设备ID匹配的数据
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        return dcTrafficSectionDataCaches.stream() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                .filter(data -> { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                    boolean typeMatches = deviceType == null || data.getDeviceType().equals(deviceType); // 设备类型匹配条件
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                    boolean idMatches = deviceId == null || data.getDeviceId().equals(deviceId); // 设备ID匹配条件
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                    return typeMatches && idMatches; // 只有当两者都匹配时,数据才被保留
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                }) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                .collect(Collectors.toList()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					
  |