diff --git a/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java b/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java index 828e8712..eb1224cc 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java @@ -2,13 +2,13 @@ package com.zc.business.controller; import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcTrafficMetricsData; +import com.zc.business.domain.DcTrafficSectionData; import com.zc.business.request.DcTrafficMetricsDataRequest; +import com.zc.business.request.DcTrafficSectionDataRequest; import com.zc.business.service.DcTrafficStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -27,6 +27,37 @@ public class DcTrafficStatisticsController { private DcTrafficStatisticsService dcTrafficStatisticsService; + /** + * 获取当前交通截面数据 + * + * @param request 请求参数,封装了对于交通截面数据查询的详细要求 + * @return 返回一个AjaxResult对象,其中包含了查询结果。如果查询成功,则结果中封装了当前交通截面的数据(DcTrafficSectionData类型) + */ + @ApiOperation("获取当前交通截面数据") + @GetMapping("/current/sections") + public AjaxResult currentSections(DcTrafficSectionDataRequest request){ + // 调用服务层方法,查询当前交通截面数据 + List dcTrafficMetricsData = dcTrafficStatisticsService.currentSections(request); + // 将查询结果封装为AjaxResult对象返回 + return AjaxResult.success(dcTrafficMetricsData); + } + + /** + * 获取历史交通截面数据 + * + * @param request 包含交通截面数据请求参数的对象 + * @return 返回一个包含历史交通截面数据的AjaxResult对象 + */ + @ApiOperation("获取历史交通截面数据") + @GetMapping("/history/sections") + public AjaxResult historySections(DcTrafficSectionDataRequest request){ + // 调用服务层方法,获取历史交通截面的统计数据 + List dcTrafficMetricsData = dcTrafficStatisticsService.historySections(request); + // 将获取到的历史交通截面数据封装成AjaxResult对象并返回 + return AjaxResult.success(dcTrafficMetricsData); + } + + /** * 获取当前交通特征指数 * @@ -37,7 +68,7 @@ public class DcTrafficStatisticsController { @GetMapping("/current/metrics") public AjaxResult currentTrafficMetrics(DcTrafficMetricsDataRequest request){ // 调用服务层方法,获取当前交通指标数据 - DcTrafficMetricsData dcTrafficMetricsData = dcTrafficStatisticsService.currentTrafficMetrics(request); + List dcTrafficMetricsData = dcTrafficStatisticsService.currentTrafficMetrics(request); // 将获取到的交通指标数据封装为成功的结果并返回 return AjaxResult.success(dcTrafficMetricsData); } diff --git a/zc-business/src/main/java/com/zc/business/request/DcTrafficSectionDataRequest.java b/zc-business/src/main/java/com/zc/business/request/DcTrafficSectionDataRequest.java new file mode 100644 index 00000000..5c9540ff --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/request/DcTrafficSectionDataRequest.java @@ -0,0 +1,44 @@ +package com.zc.business.request; + +import lombok.Data; + +import java.util.Date; + +/** + * 交通截面数据请求参数定义 + * @author xiepufeng + */ +@Data +public class DcTrafficSectionDataRequest { + + /** + * 道路方向 + */ + private Byte direction; + + /** + * 时段类型 + * 1-年 2-月 3-季 4-日 + */ + private Byte periodType; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; + + /** + * 设备ID + */ + private Long deviceId; + + /** + * 设备类型 + */ + private Integer deviceType; +} diff --git a/zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java b/zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java index bceec71b..45611fec 100644 --- a/zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java +++ b/zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.zc.business.domain.DcTrafficMetricsData; import com.zc.business.domain.DcTrafficSectionData; import com.zc.business.request.DcTrafficMetricsDataRequest; +import com.zc.business.request.DcTrafficSectionDataRequest; import java.util.List; @@ -17,22 +18,36 @@ public interface DcTrafficStatisticsService extends IService currentSections(DcTrafficSectionDataRequest request); + + /** + * 根据提供的请求参数获取历史的交通截面数据。 + * + * @param request 包含获取交通截面所需的所有请求参数的对象。 + * @return DcTrafficSectionData 返回一个包含历史交通截面数据列表。 + */ + List historySections(DcTrafficSectionDataRequest request); /** - * 根据提供的请求参数获取当前的流量指标数据。 + * 根据提供的请求参数获取当前的交通指标数据。 * - * @param request 包含获取流量指标所需的所有请求参数的对象。 - * @return DcTrafficMetricsData 返回一个包含当前流量指标数据的对象。 - * 该对象包含了关于数据中心网络流量的各种度量指标。 + * @param request 包含获取交通指标所需的所有请求参数的对象。 + * @return DcTrafficMetricsData 返回一个包含当前交通指标数据列表。 */ - DcTrafficMetricsData currentTrafficMetrics(DcTrafficMetricsDataRequest request); + List currentTrafficMetrics(DcTrafficMetricsDataRequest request); /** - * 获取历史流量指标数据列表。 + * 获取历史交通指标数据列表。 * - * @param request 包含获取流量指标所需的所有请求参数的对象。 - * @return 返回符合查询条件的历史流量指标数据列表。 + * @param request 包含获取交通指标所需的所有请求参数的对象。 + * @return 返回符合查询条件的历史交通指标数据列表。 */ List historyTrafficMetrics(DcTrafficMetricsDataRequest request); } 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 13d13b5c..e92bce6b 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 @@ -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 currentSections(DcTrafficSectionDataRequest request) { + + // 从Redis缓存中获取指定方向的交通路段数据列表 + List dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection()); + + return filterTrafficDataByRequest(request, dcTrafficSectionDataCaches); + } + + /** + * 根据提供的请求参数获取历史的交通截面数据。 + * + * @param request 包含获取交通截面所需的所有请求参数的对象。 + * @return DcTrafficSectionData 返回一个包含历史交通截面数据列表。 + */ + @Override + public List historySections(DcTrafficSectionDataRequest request) { + + if (request.getStartTime() == null || request.getEndTime() == null) { + throw new ServiceException("开始时间或结束时间不能为空"); + } + + if (request.getPeriodType() == null) { + throw new ServiceException("时段类型不能为空"); + } + + // 构建查询条件 + LambdaQueryWrapper 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 currentTrafficMetrics(DcTrafficMetricsDataRequest request) { // 从Redis缓存中获取指定方向的交通路段数据列表 List 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 historyTrafficMetrics(DcTrafficMetricsDataRequest request) { @@ -277,19 +321,19 @@ public class DcTrafficStatisticsServiceImpl } /** - * 根据方向获取交通流量数据 + * 根据方向获取交通数据 * * @param direction 方向 - * @return 单向交通流量数据 + * @return 单向交通数据 */ private Map getTrafficDataByDirection(Byte direction) { return redisCache.getCacheMapValue(RedisKeyConstants.getDcDevicesTrafficStatisticsKey(direction)); } /** - * 获取上行和下行所有交通流量数据 + * 获取上行和下行所有交通数据 * - * @return 所有交通流量数据 + * @return 所有交通数据 */ private Map getTrafficDataForBothDirections() { Map allData = new HashMap<>(); @@ -354,5 +398,39 @@ public class DcTrafficStatisticsServiceImpl .collect(Collectors.toList()); } + /** + * 根据请求过滤交通数据。 + * + * @param request 包含设备类型和设备ID的请求对象,用于指定过滤条件。 + * @param dcTrafficSectionDataCaches 原始的交通数据列表。 + * @return 过滤后的交通数据列表,仅包含与请求条件匹配的数据。 + */ + public List filterTrafficDataByRequest( + DcTrafficSectionDataRequest request, + List 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()); + } + + } diff --git a/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java b/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java index 50a07c3e..f67fdf28 100644 --- a/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java +++ b/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java @@ -374,7 +374,7 @@ public class TrafficStatistics { } /** - * 计算累积大型交通流量。 + * 计算累积大型车交通量数据。 * 该方法用于根据给定的车道数据,计算出特定类型的车辆(包括公共汽车、中型货车、大型货车、特大型货车和集装箱车)的交通量总和。 * * @param laneData 包含车道交通量数据的JSONObject对象。该对象应包含以下键: