Browse Source

交通数据统计分析数据添加设备类型过滤

develop
xiepufeng 8 months ago
parent
commit
1718587f79
  1. 64
      zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java

64
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<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);
@ -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<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 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());
}
}

Loading…
Cancel
Save