From 67ff06bf3c8bce3d1d65c7a966e817a75399e33f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Wed, 30 Apr 2025 11:33:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A4=E9=80=9A=E6=B5=81=EF=BC=8C=E8=AE=BE?= =?UTF-8?q?=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcDeviceOnlineController.java | 6 +- .../DcTrafficStatisticsController.java | 55 +++++++++++++ .../service/IDcTrafficStatisticsService.java | 3 + .../impl/DcGantryStatisticsDataImpl.java | 17 +++- .../impl/DcTrafficStatisticsServiceImpl.java | 81 ++++++++++++++++++- 5 files changed, 155 insertions(+), 7 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcDeviceOnlineController.java b/zc-business/src/main/java/com/zc/business/controller/DcDeviceOnlineController.java index 37718d3a..38c956e7 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcDeviceOnlineController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcDeviceOnlineController.java @@ -120,6 +120,10 @@ public class DcDeviceOnlineController extends BaseController { params.setStakeMark(stakeMark.replace(UniversalEnum.BLANK_SPACE.getValue(), UniversalEnum.PLUS_SIGN.getValue())); } List sums = onlineSumService.queryByDeviceTypesOfToday(params); + // 按桩号排序 + List sortedSums = sums.stream() + .sorted(Comparator.comparing(OnlineSum::getStakeMark)) + .collect(Collectors.toList()); /*Map onlineSumMap = redisCache.getCacheMap(RedisKeyConstants.DEVICE_ONLINE); String date = LocalDate.now().toString();*/ /*for (OnlineSum sum : sums) { @@ -132,7 +136,7 @@ public class DcDeviceOnlineController extends BaseController { sum.setLastOnlineTime(onlineSumMap.get(hKey).getLastOnlineTime()); sum.setDeviceStatus(onlineSumMap.get(hKey).getDeviceStatus()); }*/ - return getDataTable(sums); + return getDataTable(sortedSums); } //按时间划分设备柱状图 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 27637ef2..5c68fba6 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 @@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; @@ -958,6 +959,60 @@ public class DcTrafficStatisticsController extends BaseController { return AjaxResult.success(jsonArray); } + /** + * 各收费站入口 + * @param startDate + * @param endDate + * @param stationType + * @return + * @throws HttpException + * @throws IOException + */ + @ApiOperation("各收费站入口") + @GetMapping("/history/entranceToEachTollStation") + public void entranceToEachTollStation( + @RequestParam String startDate, + @RequestParam String endDate, + @RequestParam String stationType, + HttpServletResponse response) throws IOException, HttpException { + + // 调用服务层方法,获取当前交通指标数据 + TreeMap sortedMap = dcTrafficStatisticsService.entranceToEachTollStation(startDate, endDate, stationType); + + // 创建一个新的工作簿和表单 + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("每小时流量"); + + // 创建表头 + Row headerRow = sheet.createRow(0); + Cell headerCellHour = headerRow.createCell(0); + headerCellHour.setCellValue("小时"); + Cell headerCellFlow = headerRow.createCell(1); + headerCellFlow.setCellValue("总流"); + + // 填充数据 + int rowNum = 1; + for (Map.Entry entry : sortedMap.entrySet()) { + Row row = sheet.createRow(rowNum++); + Cell cellHour = row.createCell(0); + cellHour.setCellValue(entry.getKey()); + Cell cellFlow = row.createCell(1); + cellFlow.setCellValue(entry.getValue()); + } + + // 自动调整列宽 + sheet.autoSizeColumn(0); + sheet.autoSizeColumn(1); + + // 设置响应内容类型和头部信息,让浏览器知道这是一个文件下载请求 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment; filename=收费站车流量.xlsx"); + + // 将工作簿写入HTTP响应输出流 + workbook.write(response.getOutputStream()); + response.getOutputStream().flush(); + } + } /** * 各收费站入口分车型车流量 */ diff --git a/zc-business/src/main/java/com/zc/business/service/IDcTrafficStatisticsService.java b/zc-business/src/main/java/com/zc/business/service/IDcTrafficStatisticsService.java index 0e65fbb1..88f88469 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcTrafficStatisticsService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcTrafficStatisticsService.java @@ -6,8 +6,10 @@ import com.zc.business.domain.DcRoadSectionCongestion; import com.zc.common.core.httpclient.exception.HttpException; import java.io.IOException; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TreeMap; public interface IDcTrafficStatisticsService { @@ -49,6 +51,7 @@ public interface IDcTrafficStatisticsService { * 各收费站入口分车型小时车流量 */ List>trafficFlowAtTollStationEntrance(String startDate, String endDate, String stationType) throws HttpException, IOException; + TreeMap entranceToEachTollStation(String startDate, String endDate, String stationType) throws HttpException, IOException; JSONArray trafficFlowAtTollStationEntranceHour(String startDate, String endDate, String stationType)throws HttpException, IOException; diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java index 50fe2eea..cd357870 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcGantryStatisticsDataImpl.java @@ -26,6 +26,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; /** * 门架数据统计服务实现类 @@ -212,7 +213,13 @@ public class DcGantryStatisticsDataImpl extends ServiceImpl> realTimeTrafficFlow(String startDate, String direction, String periodType ) { - return dcGantryStatisticsDataMapper.realTimeTrafficFlow(startDate,direction,periodType); + List> mapList = dcGantryStatisticsDataMapper.realTimeTrafficFlow(startDate, direction, periodType); + + // 过滤孝里虚-平阴北虚 和 平阴北虚-孝里虚的数据 + List> filteredList = mapList.stream() + .filter(map -> "孝里虚-平阴北虚".equals(map.get("name")) || "平阴北虚-孝里虚".equals(map.get("name"))) + .collect(Collectors.toList()); + return filteredList; } /** * 车流量时段分析 @@ -239,7 +246,13 @@ public class DcGantryStatisticsDataImpl extends ServiceImpl> sectionTrafficRanking(String startDate, String direction, String periodType) { - return dcGantryStatisticsDataMapper.sectionTrafficRanking(startDate,direction,periodType); + List> mapList = dcGantryStatisticsDataMapper.sectionTrafficRanking(startDate, direction, periodType); + + // 孝里虚-平阴北虚 或 平阴北虚-孝里虚的数据 + List> filteredList = mapList.stream() + .filter(map -> "孝里虚-平阴北虚".equals(map.get("facilityName")) || "平阴北虚-孝里虚".equals(map.get("facilityName"))) + .collect(Collectors.toList()); + return filteredList; } public List> aggregateTrafficVolume(List> dataList) { 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 ad5af940..e7d848e8 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 @@ -815,6 +815,7 @@ public class DcTrafficStatisticsServiceImpl implements IDcTrafficStatisticsServi // 直接基于原始数据映射和LocationEnum构建最终结果列表 List> resultList = Arrays.stream(LocationEnum.values()) + .filter(location -> !location.getName().equals("平阴北"))// 先过滤掉平阴北 .map(location -> { Map defaultData = new HashMap() {{ put("value", "0"); @@ -837,6 +838,74 @@ public class DcTrafficStatisticsServiceImpl implements IDcTrafficStatisticsServi return new ArrayList(); } + } + @Override + public TreeMap entranceToEachTollStation(String startDate, String endDate, String stationType) throws HttpException, IOException { +// 创建OkHttpClient.Builder实例 + OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); + +// 添加重试拦截器到OkHttpClient + httpClientBuilder.addInterceptor(new RetryInterceptorUtil()); + +// 构建最终的OkHttpClient实例 + OkHttpClient okHttpClient = httpClientBuilder.build(); + +// 现在使用带有重试机制的OkHttpClient发起请求 + Map requestParams = new HashMap<>(); + requestParams.put("sysid", sysid); + JSONObject parameters = new JSONObject(); + parameters.put("start_date", startDate); + parameters.put("end_date", endDate); + parameters.put("station_type", stationType); + + requestParams.put("parameters", parameters); + Map headers = new HashMap<>(); + headers.put("Authorization", getAccessToken()); + Gson gson = new Gson(); + String requestParamsJson = gson.toJson(requestParams); + try { + Request request = new Request.Builder() + .url(baseUrl + UniversalEnum.EACH_TOLL_STATION_ENTRANCE_BY_TYPE_OF_HOURLY_TRAFFIC_FLOW.getValue()) + .headers(Headers.of(headers)) + .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), requestParamsJson)) + .build(); + Response response = okHttpClient.newCall(request).execute(); + ResponseBody body = response.body(); + if (body != null) { + String jsonString = body.string(); + JSONArray jsonArray = JSON.parseArray(jsonString); +Map flowPerHour = jsonArray.stream() + .map(item -> (JSONObject) item) + .collect(Collectors.groupingBy( + item -> item.getInteger("data_hour"), + Collectors.reducing( + 0, + item -> item.getInteger("total_flow"), + Integer::sum + ) + )); + TreeMap hashMap = new TreeMap<>(); +// 示例输出结果 + flowPerHour.forEach((hour, totalFlow) -> + hashMap.put(hour.toString(), totalFlow)); + // 使用带有自定义Comparator的TreeMap进行排序 + TreeMap sortedMap = new TreeMap<>((o1, o2) -> { + int hour1 = Integer.parseInt(o1); + int hour2 = Integer.parseInt(o2); + return Integer.compare(hour1, hour2); + }); + + // 将数据放入TreeMap中 + sortedMap.putAll(hashMap); + return sortedMap; + } + return new TreeMap<>(); + } catch (IOException e) { + // 处理异常 + e.printStackTrace(); + return new TreeMap(); + } + } @Override @@ -973,10 +1042,14 @@ public class DcTrafficStatisticsServiceImpl implements IDcTrafficStatisticsServi // 构建结果列表 List> mapList = new ArrayList<>(); for (int i = UniversalEnum.ONE.getNumber(); i <= 13; i++) { - Map map = new HashMap<>(); - map.put("name", getTrafficFlowDoorFrameSection(i)); - map.put("totalFlow", flowCounts.get(i)); - mapList.add(map); + // 只添加不为0的车流量数据,后续删除 + if (!getTrafficFlowDoorFrameSection(i).equals("孝里虚-平阴北虚")){ + Map map = new HashMap<>(); + map.put("name", getTrafficFlowDoorFrameSection(i)); + map.put("totalFlow", flowCounts.get(i)); + mapList.add(map); + } + } return mapList; }