diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java index 8fcd0f3f..13d13b5c 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; +import com.zc.business.constant.DeviceTypeConstants; import com.zc.business.constant.RedisKeyConstants; import com.zc.business.controller.DcDeviceController; import com.zc.business.domain.DcRoadSection; @@ -98,8 +99,8 @@ public class DcTrafficStatisticsServiceImpl // 从Redis缓存中获取指定方向的交通路段数据列表 List dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); - // 根据指定的方向和路段ID范围获取交通数据 - List trafficSectionDataList = fetchTrafficDataByDirAndRange(request.getRoadSectionId(), dcTrafficSectionDataCaches); + // 根据请求过滤交通数据 + List trafficSectionDataList = filterTrafficDataByRequest(request, dcTrafficSectionDataCaches); // 对获取的交通路段数据进行分析,得到交通指标数据 List 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)); } @@ -288,18 +299,29 @@ public class DcTrafficStatisticsServiceImpl } /** - * 根据指定的方向和路段ID范围获取交通数据。 + * 根据请求过滤交通数据。 * - * @param roadSectionId 指定的路段ID,如果为null,则不根据路段筛选数据。 - * @return 返回符合指定方向和路段范围的交通段数据列表。 + * @param request 包含交通数据查询条件的请求对象,可以指定路段ID和设备类型。 + * @param dcTrafficSectionDataCaches 存储的交通数据段列表。 + * @return 过滤后的交通数据段列表,仅包含满足请求条件的数据。 */ - public List fetchTrafficDataByDirAndRange(Long roadSectionId, List dcTrafficSectionDataCaches) { + public List filterTrafficDataByRequest( + DcTrafficMetricsDataRequest request, + List dcTrafficSectionDataCaches + ) { + + if (request == null) { + return dcTrafficSectionDataCaches; // 如果请求对象为空,直接返回原始交通数据列表 + } + + Long roadSectionId = request.getRoadSectionId(); + // 初始化路段起始和终止桩号 - Integer startStakeMark; - Integer endStakeMark; + Integer startStakeMark = null; + Integer endStakeMark = null; - // 根据提供的路段ID查询路段信息,并转换为起始和终止桩号 if (roadSectionId != null) { + // 根据提供的路段ID查询路段信息,并转换为起始和终止桩号 DcRoadSection dcRoadSection = redisCache.getCacheMapValue(RedisKeyConstants.DC_ROAD_SECTION, roadSectionId); // 验证路段ID是否存在 @@ -309,16 +331,28 @@ public class DcTrafficStatisticsServiceImpl startStakeMark = StakeMarkUtils.stakeMarkToInt(dcRoadSection.getStartStakeMark()); 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() - .filter(data -> startStakeMark == null || endStakeMark == null - || (data.getStakeMark() >= startStakeMark && data.getStakeMark() <= endStakeMark)) + .filter(data -> (finalStartStakeMark == null || finalEndStakeMark == null + || (data.getStakeMark() >= finalStartStakeMark && data.getStakeMark() <= finalEndStakeMark)) + && finalDeviceType.equals(data.getDeviceType())) .collect(Collectors.toList()); } + }