|
|
@ -15,6 +15,7 @@ import com.zc.business.domain.DcTrafficMetricsData; |
|
|
|
import com.zc.business.domain.DcTrafficSectionData; |
|
|
|
import com.zc.business.enums.*; |
|
|
|
import com.zc.business.request.DcTrafficMetricsDataRequest; |
|
|
|
import com.zc.business.request.DcTrafficSectionDataRequest; |
|
|
|
import com.zc.business.statistics.cache.*; |
|
|
|
import com.zc.business.mapper.DcTrafficSectionDataMapper; |
|
|
|
import com.zc.business.service.DcTrafficStatisticsService; |
|
|
@ -87,14 +88,57 @@ public class DcTrafficStatisticsServiceImpl |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据请求获取当前交通流量指标数据。 |
|
|
|
* 根据提供的请求参数获取当前的交通截面数据。 |
|
|
|
* |
|
|
|
* @param request 包含获取流量指标所需的所有请求参数的对象。 |
|
|
|
* @return 返回当前交通流量指标数据。 |
|
|
|
* @param request 包含获取交通截面所需的所有请求参数的对象。 |
|
|
|
* @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 如果没有获取到交通数据,则抛出异常。 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public DcTrafficMetricsData currentTrafficMetrics(DcTrafficMetricsDataRequest request) { |
|
|
|
public List<DcTrafficMetricsData> currentTrafficMetrics(DcTrafficMetricsDataRequest request) { |
|
|
|
|
|
|
|
// 从Redis缓存中获取指定方向的交通路段数据列表
|
|
|
|
List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); |
|
|
@ -111,15 +155,15 @@ public class DcTrafficStatisticsServiceImpl |
|
|
|
} |
|
|
|
|
|
|
|
// 根据收集到的交通段数据计算并返回交通指标数据
|
|
|
|
return dcTrafficMetricsDataList.get(0); |
|
|
|
return dcTrafficMetricsDataList; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 计算获取指定条件下的历史交通流量指标数据。 |
|
|
|
* 计算获取指定条件下的历史交通指标数据。 |
|
|
|
* |
|
|
|
* @param request 包含查询条件的请求对象,包括开始时间、结束时间、方向、周期类型和所属路段ID等信息。 |
|
|
|
* @return 返回一个包含交通流量指标数据的列表。 |
|
|
|
* @return 返回一个包含交通指标数据的列表。 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public List<DcTrafficMetricsData> historyTrafficMetrics(DcTrafficMetricsDataRequest request) { |
|
|
@ -277,19 +321,19 @@ public class DcTrafficStatisticsServiceImpl |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据方向获取交通流量数据 |
|
|
|
* 根据方向获取交通数据 |
|
|
|
* |
|
|
|
* @param direction 方向 |
|
|
|
* @return 单向交通流量数据 |
|
|
|
* @return 单向交通数据 |
|
|
|
*/ |
|
|
|
private Map<String, DcTrafficSectionData> getTrafficDataByDirection(Byte direction) { |
|
|
|
return redisCache.getCacheMapValue(RedisKeyConstants.getDcDevicesTrafficStatisticsKey(direction)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取上行和下行所有交通流量数据 |
|
|
|
* 获取上行和下行所有交通数据 |
|
|
|
* |
|
|
|
* @return 所有交通流量数据 |
|
|
|
* @return 所有交通数据 |
|
|
|
*/ |
|
|
|
private Map<String, DcTrafficSectionData> getTrafficDataForBothDirections() { |
|
|
|
Map<String, DcTrafficSectionData> allData = new HashMap<>(); |
|
|
@ -354,5 +398,39 @@ public class DcTrafficStatisticsServiceImpl |
|
|
|
.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()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|