优化图形分析根据可选时间补0逻辑、优化流量图形单位可选功能。

This commit is contained in:
gaoyutao
2025-11-06 18:09:29 +08:00
parent 5e5330a924
commit c4b380437f
7 changed files with 77 additions and 11 deletions
@@ -52,7 +52,7 @@ public class EchartsDataUtils {
return Math.round(microseconds / 1_000_000.0 * 100.0) / 100.0; return Math.round(microseconds / 1_000_000.0 * 100.0) / 100.0;
} }
/** /**
* 构建ECharts图表数据(带时间补全和0值填充 * 构建ECharts图表数据(带时间补全和特殊值处理
* @param list 原始数据列表 * @param list 原始数据列表
* @param timeExtractor 时间字段提取函数 * @param timeExtractor 时间字段提取函数
* @param dataExtractors 数据提取器Map * @param dataExtractors 数据提取器Map
@@ -112,6 +112,9 @@ public class EchartsDataUtils {
dataExtractors.keySet().forEach(name -> dataExtractors.keySet().forEach(name ->
yData.put(name, new ArrayList<Object>())); yData.put(name, new ArrayList<Object>()));
// 特殊处理:查找percentile95的固定值
Object fixedPercentile95Value = findFixedValueForPercentile95(sortedList, dataExtractors);
for (Date time : fullTimeSeries) { for (Date time : fullTimeSeries) {
// X轴数据 // X轴数据
xAxisData.add(parseDateToStr(time)); xAxisData.add(parseDateToStr(time));
@@ -126,11 +129,13 @@ public class EchartsDataUtils {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<Object> seriesData = (List<Object>) yData.get(name); List<Object> seriesData = (List<Object>) yData.get(name);
if (item != null) { if (item != null) {
Object value = extractor.apply(item); Object value = extractor.apply(item);
seriesData.add(value != null ? value : 0); seriesData.add(value != null ? value : getDefaultValue(name, fixedPercentile95Value));
} else { } else {
seriesData.add(0); // 补0 // 数据补全
seriesData.add(getDefaultValue(name, fixedPercentile95Value));
} }
} }
} }
@@ -147,6 +152,35 @@ public class EchartsDataUtils {
} }
} }
/**
* 查找percentile95的固定值(第一个非零值)
*/
private static <T> Object findFixedValueForPercentile95(List<T> list, Map<String, Function<T, ?>> dataExtractors) {
if (!dataExtractors.containsKey("percentile95")) {
return 0;
}
Function<T, ?> extractor = dataExtractors.get("percentile95");
for (T item : list) {
Object value = extractor.apply(item);
if (value != null && !value.equals(0)) {
return value;
}
}
return 0;
}
/**
* 根据指标名称获取默认值
*/
private static Object getDefaultValue(String metricName, Object fixedPercentile95Value) {
if ("percentile95".equals(metricName) && !fixedPercentile95Value.equals(0)) {
return fixedPercentile95Value; // percentile95使用固定值
} else {
return 0; // 其他指标补0
}
}
/** /**
* 字符串转日期 * 字符串转日期
*/ */
@@ -38,6 +38,10 @@ public class SpeedUtils {
public BigDecimal getLastOutSpeedGb() { return lastOutSpeedGb; } public BigDecimal getLastOutSpeedGb() { return lastOutSpeedGb; }
public String getRecommendedUnit() { return recommendedUnit; } public String getRecommendedUnit() { return recommendedUnit; }
public void setRecommendedUnit(String recommendedUnit) {
this.recommendedUnit = recommendedUnit;
}
@Override @Override
public String toString() { public String toString() {
return String.format( return String.format(
@@ -65,7 +69,7 @@ public class SpeedUtils {
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO,
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO,
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO,
"bit" "Kb"
); );
} }
@@ -605,6 +605,7 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
String unit = result.getRecommendedUnit(); String unit = result.getRecommendedUnit();
if(epsInitialTrafficData.getUnit() != null){ if(epsInitialTrafficData.getUnit() != null){
unit = epsInitialTrafficData.getUnit(); unit = epsInitialTrafficData.getUnit();
result.setRecommendedUnit(unit);
} }
BigDecimal divisor = SpeedUtils.getDivisor(unit); BigDecimal divisor = SpeedUtils.getDivisor(unit);
Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>(); Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>();
@@ -769,6 +769,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0); EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0);
percentile95 = nodeBandwidth.getBandwidthResult(); percentile95 = nodeBandwidth.getBandwidthResult();
} }
dailyQuery.setClientId(clientId);
dailyQuery.setName(rmEpsTopologyManagement.getInterfaceName()); dailyQuery.setName(rmEpsTopologyManagement.getInterfaceName());
Map<String, Object> resultMap = switchNetSpeedEcharts(dailyQuery, percentile95); Map<String, Object> resultMap = switchNetSpeedEcharts(dailyQuery, percentile95);
// 查询端口备注信息 // 查询端口备注信息
@@ -868,6 +869,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0); EpsNodeBandwidth nodeBandwidth = epsNodeBandwidthList.get(0);
percentile95 = nodeBandwidth.getBandwidthResult(); percentile95 = nodeBandwidth.getBandwidthResult();
} }
dailyQuery.setClientId(clientId);
dailyQuery.setName(rmEpsTopologyManagement.getInterfaceName()); dailyQuery.setName(rmEpsTopologyManagement.getInterfaceName());
Map<String, Object> resultMap = switchNetSpeedEcharts(dailyQuery, percentile95); Map<String, Object> resultMap = switchNetSpeedEcharts(dailyQuery, percentile95);
// 查询端口备注信息 // 查询端口备注信息
@@ -923,12 +925,16 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
*/ */
public Map<String, Object> switchNetSpeedEcharts(InitialSwitchInfoDetails initialSwitchInfoDetails, BigDecimal percentile95) { public Map<String, Object> switchNetSpeedEcharts(InitialSwitchInfoDetails initialSwitchInfoDetails, BigDecimal percentile95) {
List<InitialSwitchInfoDetails> list = initialSwitchInfoDetailsMapper.getswitchDetailList(initialSwitchInfoDetails); List<InitialSwitchInfoDetails> list = initialSwitchInfoDetailsMapper.getswitchDetailList(initialSwitchInfoDetails);
if(list == null){
list = new ArrayList<>();
}
try { try {
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95))); list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed"); SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed");
String unit = result.getRecommendedUnit(); String unit = result.getRecommendedUnit();
if(initialSwitchInfoDetails.getUnit() != null){ if(initialSwitchInfoDetails.getUnit() != null){
unit = initialSwitchInfoDetails.getUnit(); unit = initialSwitchInfoDetails.getUnit();
result.setRecommendedUnit(unit);
} }
BigDecimal divisor = SpeedUtils.getDivisor(unit); BigDecimal divisor = SpeedUtils.getDivisor(unit);
Map<String, Function<InitialSwitchInfoDetails, ?>> extractors = new LinkedHashMap<>(); Map<String, Function<InitialSwitchInfoDetails, ?>> extractors = new LinkedHashMap<>();
@@ -945,7 +951,9 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
info != null && info.getPercentile95() != null ? info != null && info.getPercentile95() != null ?
info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) : info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) :
0); 0);
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsData(list, InitialSwitchInfoDetails::getCreateTime, extractors); Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialSwitchInfoDetails::getCreateTime, extractors,
initialSwitchInfoDetails.getStartTime(), initialSwitchInfoDetails.getEndTime());
resultMap.put("other", result); resultMap.put("other", result);
resultMap.put("95value", percentile95); resultMap.put("95value", percentile95);
return resultMap; return resultMap;
@@ -242,7 +242,10 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
info != null && info.getOutSpeed() != null ? info != null && info.getOutSpeed() != null ?
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) : new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
0); 0);
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsData(list, InitialBandwidthTraffic::getCreateTime, extractors); Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialBandwidthTraffic::getCreateTime, extractors,
initialBandwidthTraffic.getStartTime(), initialBandwidthTraffic.getEndTime()
);
resultMap.put("unit", unit); resultMap.put("unit", unit);
return resultMap; return resultMap;
} catch (Exception e){ } catch (Exception e){
@@ -271,7 +274,10 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
extractors.put("inDroppedData", info -> info.getInDropped()); extractors.put("inDroppedData", info -> info.getInDropped());
extractors.put("outDroppedData", info -> info.getOutDropped()); extractors.put("outDroppedData", info -> info.getOutDropped());
return EchartsDataUtils.buildEchartsData(list, InitialBandwidthTraffic::getCreateTime, extractors); return EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialBandwidthTraffic::getCreateTime, extractors,
initialBandwidthTraffic.getStartTime(), initialBandwidthTraffic.getEndTime()
);
} }
} }
@@ -166,7 +166,10 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
info != null && info.getOutSpeed() != null ? info != null && info.getOutSpeed() != null ?
info.getOutSpeed().divide(divisor, 2, RoundingMode.HALF_UP) : info.getOutSpeed().divide(divisor, 2, RoundingMode.HALF_UP) :
0); 0);
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsData(list, InitialSwitchInfo::getCreateTime, extractors); Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialSwitchInfo::getCreateTime, extractors,
initialSwitchInfo.getStartTime(), initialSwitchInfo.getEndTime()
);
resultMap.put("unit", unit); resultMap.put("unit", unit);
return resultMap; return resultMap;
} catch (Exception e){ } catch (Exception e){
@@ -186,7 +189,10 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>(); Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
extractors.put("netInDiscardsData", info -> info.getIfInDiscards()); extractors.put("netInDiscardsData", info -> info.getIfInDiscards());
extractors.put("netOutDiscardsData", info -> info.getIfOutDiscards()); extractors.put("netOutDiscardsData", info -> info.getIfOutDiscards());
return EchartsDataUtils.buildEchartsData(list, InitialSwitchInfo::getCreateTime, extractors); return EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialSwitchInfo::getCreateTime, extractors,
initialSwitchInfo.getStartTime(), initialSwitchInfo.getEndTime()
);
} }
/** /**
@@ -200,7 +206,10 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>(); Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
extractors.put("netInTotalData", info -> info.getInBytes().multiply(new BigDecimal(8))); extractors.put("netInTotalData", info -> info.getInBytes().multiply(new BigDecimal(8)));
extractors.put("netOutTotalData", info -> info.getOutBytes().multiply(new BigDecimal(8))); extractors.put("netOutTotalData", info -> info.getOutBytes().multiply(new BigDecimal(8)));
return EchartsDataUtils.buildEchartsData(list, InitialSwitchInfo::getCreateTime, extractors); return EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialSwitchInfo::getCreateTime, extractors,
initialSwitchInfo.getStartTime(), initialSwitchInfo.getEndTime()
);
} }
/** /**
@@ -214,6 +223,9 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>(); Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
extractors.put("netInErrDiscardsData", info -> info.getIfInErrors()); extractors.put("netInErrDiscardsData", info -> info.getIfInErrors());
extractors.put("netOutErrDiscardsData", info -> info.getIfOutErrors()); extractors.put("netOutErrDiscardsData", info -> info.getIfOutErrors());
return EchartsDataUtils.buildEchartsData(list, InitialSwitchInfo::getCreateTime, extractors); return EchartsDataUtils.buildEchartsDataAutoPadding(
list, InitialSwitchInfo::getCreateTime, extractors,
initialSwitchInfo.getStartTime(), initialSwitchInfo.getEndTime()
);
} }
} }
@@ -56,6 +56,7 @@
<if test="defaultParams != null and defaultParams != ''"> and default_params = #{defaultParams}</if> <if test="defaultParams != null and defaultParams != ''"> and default_params = #{defaultParams}</if>
<if test="taskName != null and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if> <if test="taskName != null and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
</where> </where>
order by create_time desc
</select> </select>
<select id="selectRmDeploymentPolicyById" parameterType="Long" resultMap="RmDeploymentPolicyResult"> <select id="selectRmDeploymentPolicyById" parameterType="Long" resultMap="RmDeploymentPolicyResult">