From 20d0af6dbd77a96fed196eb703a5f34c78939dc5 Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Tue, 24 Mar 2026 13:05:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=B5=81=E9=87=8F=E5=AF=B9?= =?UTF-8?q?=E9=BD=90x=E8=BD=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InitialBandwidthTrafficServiceImpl.java | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java index bde32a7..371715d 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java @@ -604,6 +604,8 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf List result = new ArrayList<>(uniqueMap.values()); + // 获取主数据的x轴时间点 + List mainXData = (List) resultMap.get("xData"); // 用于存储业务的显示名称 Map businessDisplayNames = new HashMap<>(); @@ -614,44 +616,65 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf businessTrafficQuery.setProcessName(allBusinessNetName.getProcessName()); businessTrafficQuery.setStartTime(initialBandwidthTraffic.getStartTime()); businessTrafficQuery.setEndTime(initialBandwidthTraffic.getEndTime()); + // 获取业务流量图表数据(返回的是bit单位) Map businessResult = initialNetBusinessTrafficService.businessTrafficEcharts(businessTrafficQuery); if (businessResult != null && !businessResult.isEmpty()) { // 获取业务名称作为前缀标识 String businessPrefix = allBusinessNetName.getProcessName(); - // 如果进程名包含特殊字符,可以进一步处理为合法的key businessPrefix = businessPrefix.replaceAll("[^a-zA-Z0-9]", "_"); - // 获取业务流量的y轴数据 + // 获取业务流量的y轴数据和x轴数据 Map businessYData = (Map) businessResult.get("yData"); - if (businessYData != null && !businessYData.isEmpty()) { + List businessXData = (List) businessResult.get("xData"); + + if (businessYData != null && !businessYData.isEmpty() && businessXData != null) { // 获取主Map的yData Map mainYData = (Map) resultMap.get("yData"); - // 将业务流量数据合并到主yData中,直接除以divisor + // 构建业务数据的时间点映射 + Map> timePointDataMap = new HashMap<>(); + + // 为每个数据系列建立时间点映射 for (Map.Entry entry : businessYData.entrySet()) { String businessKey = entry.getKey(); - Object businessValue = entry.getValue(); + List values = (List) entry.getValue(); - // 添加业务前缀避免key冲突,格式:business_{进程名}_{数据类型} + for (int i = 0; i < businessXData.size() && i < values.size(); i++) { + String timeStr = businessXData.get(i); + timePointDataMap.computeIfAbsent(timeStr, k -> new HashMap<>()) + .put(businessKey, values.get(i)); + } + } + + // 按照主数据的x轴重新组织业务数据 + for (Map.Entry entry : businessYData.entrySet()) { + String businessKey = entry.getKey(); String newKey = "business_" + businessPrefix + "_" + businessKey; - // 直接除以divisor进行单位转换 - if (businessValue instanceof List) { - List originalList = (List) businessValue; - List convertedList = new ArrayList<>(); - for (BigDecimal value : originalList) { + // 创建对齐后的数据列表 + List alignedData = new ArrayList<>(); + + // 遍历主数据的时间点 + for (String timeStr : mainXData) { + Map pointData = timePointDataMap.get(timeStr); + + if (pointData != null && pointData.containsKey(businessKey)) { + BigDecimal value = pointData.get(businessKey); if (value != null) { - convertedList.add(value.divide(divisor, 2, RoundingMode.HALF_UP)); + // 单位转换 + alignedData.add(value.divide(divisor, 2, RoundingMode.HALF_UP)); } else { - convertedList.add(null); + alignedData.add(null); } + } else { + // 没有对应时间点的数据,补null + alignedData.add(null); } - mainYData.put(newKey, convertedList); - } else { - mainYData.put(newKey, businessValue); } + + mainYData.put(newKey, alignedData); } resultMap.put("yData", mainYData); @@ -686,7 +709,6 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf } } } catch (Exception e) { - // 业务流量数据获取失败,记录日志但不影响主流程 System.err.println("获取业务流量数据失败: " + e.getMessage()); e.printStackTrace(); }