增加计算单位可选方法.
优化图形分析根据可选时间补0逻辑,完成度70%。 优化业务自定义95值计算功能修改相关数据方法。
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package com.ruoyi.common.core.utils;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -42,10 +44,244 @@ public class EchartsDataUtils {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 微秒转秒
|
||||
*/
|
||||
public static double convertMicrosecondsToSeconds(long microseconds) {
|
||||
return microseconds / 1_000_000.0;
|
||||
}
|
||||
/**
|
||||
* 构建ECharts图表数据(带时间补全和0值填充)
|
||||
* @param list 原始数据列表
|
||||
* @param timeExtractor 时间字段提取函数
|
||||
* @param dataExtractors 数据提取器Map
|
||||
* @param startTime 开始时间字符串(格式:yyyy-MM-dd HH:mm:ss)
|
||||
* @param endTime 结束时间字符串(格式:yyyy-MM-dd HH:mm:ss)
|
||||
* @param <T> 数据类型泛型
|
||||
* @return 包含xData和yData的Map
|
||||
*/
|
||||
public static <T> Map<String, Object> buildEchartsDataAutoPadding(
|
||||
List<T> list,
|
||||
Function<T, Date> timeExtractor,
|
||||
Map<String, Function<T, ?>> dataExtractors,
|
||||
String startTime,
|
||||
String endTime) {
|
||||
|
||||
try {
|
||||
// 解析时间字符串
|
||||
Date startDate = parseStringToDate(startTime);
|
||||
Date endDate = parseStringToDate(endTime);
|
||||
|
||||
if (startDate == null || endDate == null) {
|
||||
throw new IllegalArgumentException("开始时间或结束时间格式错误");
|
||||
}
|
||||
|
||||
if (startDate.after(endDate)) {
|
||||
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
||||
}
|
||||
|
||||
if (list == null || list.isEmpty()) {
|
||||
return createEmptyResult(dataExtractors.keySet(), startTime, endTime);
|
||||
}
|
||||
|
||||
// 按时间排序
|
||||
List<T> sortedList = list.stream()
|
||||
.sorted(Comparator.comparing(timeExtractor))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 自动检测时间间隔
|
||||
long timeInterval = detectTimeInterval(sortedList, timeExtractor);
|
||||
|
||||
// 生成完整的时间序列
|
||||
List<Date> fullTimeSeries = generateTimeSeries(startDate, endDate, timeInterval);
|
||||
|
||||
// 创建时间到数据的映射(考虑时间精度)
|
||||
Map<Long, T> timeDataMap = sortedList.stream()
|
||||
.collect(Collectors.toMap(
|
||||
item -> normalizeTime(timeExtractor.apply(item), timeInterval),
|
||||
Function.identity(),
|
||||
(a, b) -> a
|
||||
));
|
||||
|
||||
// 准备X轴和Y轴数据
|
||||
List<String> xAxisData = new ArrayList<>();
|
||||
Map<String, Object> yData = new LinkedHashMap<>();
|
||||
|
||||
// 初始化Y轴数据结构
|
||||
dataExtractors.keySet().forEach(name ->
|
||||
yData.put(name, new ArrayList<Object>()));
|
||||
|
||||
for (Date time : fullTimeSeries) {
|
||||
// X轴数据
|
||||
xAxisData.add(parseDateToStr(time));
|
||||
|
||||
// Y轴数据
|
||||
Long normalizedTime = normalizeTime(time, timeInterval);
|
||||
T item = timeDataMap.get(normalizedTime);
|
||||
|
||||
for (Map.Entry<String, Function<T, ?>> entry : dataExtractors.entrySet()) {
|
||||
String name = entry.getKey();
|
||||
Function<T, ?> extractor = entry.getValue();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object> seriesData = (List<Object>) yData.get(name);
|
||||
if (item != null) {
|
||||
Object value = extractor.apply(item);
|
||||
seriesData.add(value != null ? value : 0);
|
||||
} else {
|
||||
seriesData.add(0); // 补0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("xData", xAxisData);
|
||||
result.put("yData", yData);
|
||||
return result;
|
||||
|
||||
} catch (Exception e) {
|
||||
// 记录日志
|
||||
System.err.println("构建图表数据失败: " + e.getMessage());
|
||||
return createEmptyResult(dataExtractors.keySet(), startTime, endTime);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串转日期
|
||||
*/
|
||||
private static Date parseStringToDate(String dateStr) {
|
||||
if (dateStr == null || dateStr.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
sdf.setLenient(false); // 严格模式
|
||||
return sdf.parse(dateStr);
|
||||
} catch (ParseException e) {
|
||||
System.err.println("日期解析失败: " + dateStr);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 日期转字符串
|
||||
*/
|
||||
private static String parseDateToStr(Date date) {
|
||||
if (date == null) {
|
||||
return "";
|
||||
}
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
return sdf.format(date);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成完整的时间序列
|
||||
*/
|
||||
private static List<Date> generateTimeSeries(Date start, Date end, long interval) {
|
||||
List<Date> timeSeries = new ArrayList<>();
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(start);
|
||||
|
||||
// 确保开始时间对齐到时间间隔
|
||||
long startMillis = normalizeTime(start, interval);
|
||||
calendar.setTimeInMillis(startMillis);
|
||||
|
||||
while (!calendar.getTime().after(end)) {
|
||||
timeSeries.add(calendar.getTime());
|
||||
calendar.setTimeInMillis(calendar.getTimeInMillis() + interval);
|
||||
}
|
||||
return timeSeries;
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动检测时间间隔
|
||||
*/
|
||||
private static <T> long detectTimeInterval(List<T> list, Function<T, Date> timeExtractor) {
|
||||
if (list.size() < 2) {
|
||||
return 300000; // 默认5分钟
|
||||
}
|
||||
|
||||
// 计算时间间隔的众数
|
||||
Map<Long, Integer> intervalCount = new HashMap<>();
|
||||
for (int i = 1; i < list.size(); i++) {
|
||||
long interval = timeExtractor.apply(list.get(i)).getTime() -
|
||||
timeExtractor.apply(list.get(i - 1)).getTime();
|
||||
if (interval > 0) {
|
||||
intervalCount.merge(interval, 1, Integer::sum);
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有有效间隔,使用默认值
|
||||
if (intervalCount.isEmpty()) {
|
||||
return 300000L;
|
||||
}
|
||||
|
||||
return intervalCount.entrySet().stream()
|
||||
.max(Map.Entry.comparingByValue())
|
||||
.map(Map.Entry::getKey)
|
||||
.orElse(300000L);
|
||||
}
|
||||
|
||||
/**
|
||||
* 时间标准化(对齐到时间间隔)
|
||||
*/
|
||||
private static long normalizeTime(Date time, long interval) {
|
||||
long timeMillis = time.getTime();
|
||||
return (timeMillis / interval) * interval;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建空结果(包含完整的时间序列)
|
||||
*/
|
||||
private static Map<String, Object> createEmptyResult(Set<String> dataNames, String startTime, String endTime) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
try {
|
||||
// 解析时间范围
|
||||
Date startDate = parseStringToDate(startTime);
|
||||
Date endDate = parseStringToDate(endTime);
|
||||
|
||||
if (startDate != null && endDate != null && !startDate.after(endDate)) {
|
||||
// 使用默认时间间隔生成完整时间序列
|
||||
long defaultInterval = 300000L; // 5分钟
|
||||
List<Date> fullTimeSeries = generateTimeSeries(startDate, endDate, defaultInterval);
|
||||
|
||||
// 构建x轴数据
|
||||
List<String> xAxisData = new ArrayList<>();
|
||||
for (Date date : fullTimeSeries) {
|
||||
xAxisData.add(parseDateToStr(date));
|
||||
}
|
||||
result.put("xData", xAxisData);
|
||||
|
||||
// 构建y轴数据(全部补0)
|
||||
Map<String, Object> yData = new LinkedHashMap<>();
|
||||
int dataSize = xAxisData.size();
|
||||
dataNames.forEach(name -> {
|
||||
List<Object> zeroData = new ArrayList<>();
|
||||
for (int i = 0; i < dataSize; i++) {
|
||||
zeroData.add(0);
|
||||
}
|
||||
yData.put(name, zeroData);
|
||||
});
|
||||
result.put("yData", yData);
|
||||
|
||||
} else {
|
||||
// 时间解析失败时返回空数据
|
||||
result.put("xData", new ArrayList<>());
|
||||
Map<String, Object> yData = new LinkedHashMap<>();
|
||||
dataNames.forEach(name -> yData.put(name, new ArrayList<>()));
|
||||
result.put("yData", yData);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
// 异常时返回空数据
|
||||
result.put("xData", new ArrayList<>());
|
||||
Map<String, Object> yData = new LinkedHashMap<>();
|
||||
dataNames.forEach(name -> yData.put(name, new ArrayList<>()));
|
||||
result.put("yData", yData);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ruoyi.common.core.utils;
|
||||
|
||||
public class UnitChangeUtil {
|
||||
|
||||
private static final double GB = 1024.0 * 1024.0 * 1024.0;
|
||||
|
||||
public static double bytesToGb(long bytes) {
|
||||
return bytes / GB;
|
||||
}
|
||||
public static double convertKbToGb(String kbValue) {
|
||||
if (kbValue == null || kbValue.trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("KB值不能为空");
|
||||
}
|
||||
|
||||
double kb = Double.parseDouble(kbValue.trim());
|
||||
return kb / (1024.0 * 1024.0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -120,6 +120,8 @@ public class EpsInitialTrafficData extends BaseEntity {
|
||||
private String calculationMode;
|
||||
/** 95值 */
|
||||
private BigDecimal percentile95;
|
||||
/** 单位 */
|
||||
private String unit;
|
||||
|
||||
|
||||
}
|
||||
@@ -124,4 +124,6 @@ public class InitialSwitchInfoDetails extends BaseEntity
|
||||
private String interfaceNameRemark;
|
||||
/** 95值 */
|
||||
private BigDecimal percentile95;
|
||||
/** 单位 */
|
||||
private String unit;
|
||||
}
|
||||
|
||||
@@ -496,9 +496,11 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
joiner.add("【" + businessName + "】");
|
||||
}
|
||||
String name = joiner.toString();
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
if(resultMap != null){
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -574,9 +576,11 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
joiner.add("【" + businessName + "】");
|
||||
}
|
||||
String name = joiner.toString();
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
if(resultMap != null){
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -592,34 +596,41 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
||||
*/
|
||||
public Map<String, Object> serverNetSpeedEcharts(EpsInitialTrafficData epsInitialTrafficData, BigDecimal percentile95) {
|
||||
List<EpsInitialTrafficData> list = getTrafficListByClientIds(epsInitialTrafficData);
|
||||
if(!list.isEmpty()){
|
||||
try {
|
||||
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
||||
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithStringTraffic(list, "inSpeed", "outSpeed");
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit());
|
||||
Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>();
|
||||
|
||||
extractors.put("netOutSpeedData", info ->
|
||||
info != null && info.getOutSpeed() != null ?
|
||||
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
extractors.put("netMachineFlowData", info ->
|
||||
info != null && info.getMachineFlow() != null ?
|
||||
new BigDecimal(info.getMachineFlow()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
extractors.put("percentile95", info ->
|
||||
info != null && info.getPercentile95() != null ?
|
||||
info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsData(list, EpsInitialTrafficData::getCreateTime, extractors);
|
||||
resultMap.put("other", result);
|
||||
resultMap.put("95value", percentile95);
|
||||
return resultMap;
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
if(list == null){
|
||||
list = new ArrayList<>();
|
||||
}
|
||||
return new HashMap<>();
|
||||
try {
|
||||
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
||||
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithStringTraffic(list, "inSpeed", "outSpeed");
|
||||
String unit = result.getRecommendedUnit();
|
||||
if(epsInitialTrafficData.getUnit() != null){
|
||||
unit = epsInitialTrafficData.getUnit();
|
||||
}
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||
Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>();
|
||||
|
||||
extractors.put("netOutSpeedData", info ->
|
||||
info != null && info.getOutSpeed() != null ?
|
||||
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
extractors.put("netMachineFlowData", info ->
|
||||
info != null && info.getMachineFlow() != null ?
|
||||
new BigDecimal(info.getMachineFlow()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
extractors.put("percentile95", info ->
|
||||
info != null && info.getPercentile95() != null ?
|
||||
info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||
0);
|
||||
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
|
||||
list, EpsInitialTrafficData::getCreateTime, extractors, epsInitialTrafficData.getStartTime(), epsInitialTrafficData.getEndTime()
|
||||
);
|
||||
resultMap.put("other", result);
|
||||
resultMap.put("95value", percentile95);
|
||||
return resultMap;
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* 提取公共方法
|
||||
|
||||
@@ -85,6 +85,14 @@ public class EpsTaskStatisticsServiceImpl implements IEpsTaskStatisticsService
|
||||
timeRange = startTime + "~" + endTime;
|
||||
}
|
||||
taskStatistics.setTimeRange(timeRange);
|
||||
// 处理包含资源
|
||||
String resources = taskStatistics.getIncludedResources();
|
||||
String result = Arrays.stream(resources.split(","))
|
||||
.map(msg -> msg.split(";"))
|
||||
.filter(resource -> resource.length >= 4)
|
||||
.map(resource -> "[" + resource[3] + "].[" + resource[2] + "]")
|
||||
.collect(Collectors.joining("\n"));
|
||||
taskStatistics.setIncludedResources(result);
|
||||
}
|
||||
return epsTaskStatisticsList;
|
||||
}
|
||||
@@ -437,15 +445,38 @@ public class EpsTaskStatisticsServiceImpl implements IEpsTaskStatisticsService
|
||||
Long taskId = epsTaskStatistics.getId();
|
||||
EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId);
|
||||
if(StringUtils.equals("1", taskMsg.getResourceType())){
|
||||
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
|
||||
epsInitialTrafficData.setOutSpeed(epsTaskStatistics.getNeedSpeed().toString());
|
||||
epsInitialTrafficData.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime()));
|
||||
trafficRedisHashUtil.updateItemInHash(taskId.toString(), epsInitialTrafficData, epsTaskStatistics.getNeedTime());
|
||||
trafficRedisHashUtil.updateItemPropertyInHash(taskId.toString(), epsTaskStatistics.getNeedTime(),
|
||||
item -> {
|
||||
if (item instanceof EpsInitialTrafficData) {
|
||||
EpsInitialTrafficData trafficItem = (EpsInitialTrafficData) item;
|
||||
trafficItem.setOutSpeed(epsTaskStatistics.getNeedSpeed().toString()); // 只修改outSpeed属性
|
||||
}
|
||||
},
|
||||
Comparator.comparing(
|
||||
(EpsInitialTrafficData item) -> {
|
||||
String speed = item.getOutSpeed();
|
||||
return speed != null ? Double.parseDouble(speed) : 0.0;
|
||||
},
|
||||
Comparator.reverseOrder() // 倒序
|
||||
)
|
||||
);
|
||||
}else{
|
||||
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
|
||||
initialSwitchInfoDetails.setMaxSpeed(epsTaskStatistics.getNeedSpeed());
|
||||
initialSwitchInfoDetails.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime()));
|
||||
trafficRedisHashUtil.updateItemInHash(taskId.toString(), initialSwitchInfoDetails, epsTaskStatistics.getNeedTime());
|
||||
trafficRedisHashUtil.updateItemPropertyInHash(taskId.toString(), epsTaskStatistics.getNeedTime(),
|
||||
item -> {
|
||||
if (item instanceof InitialSwitchInfoDetails) {
|
||||
InitialSwitchInfoDetails trafficItem = (InitialSwitchInfoDetails) item;
|
||||
trafficItem.setMaxSpeed(epsTaskStatistics.getNeedSpeed()); // 只修改outSpeed属性
|
||||
}
|
||||
},
|
||||
Comparator.comparing(
|
||||
(InitialSwitchInfoDetails item) ->
|
||||
item.getMaxSpeed() != null ? item.getMaxSpeed() : BigDecimal.ZERO,
|
||||
Comparator.reverseOrder() // 倒序
|
||||
)
|
||||
);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -803,9 +803,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
joiner.add("【" + businessName + "】");
|
||||
}
|
||||
String name = joiner.toString();
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
if(resultMap != null){
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -900,9 +902,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
joiner.add("【" + businessName + "】");
|
||||
}
|
||||
String name = joiner.toString();
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
if(resultMap != null){
|
||||
resultMap.put("name", name);
|
||||
resultMap.put("timeRange", timeRange);
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -922,7 +926,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
try {
|
||||
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
||||
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed");
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit());
|
||||
String unit = result.getRecommendedUnit();
|
||||
if(initialSwitchInfoDetails.getUnit() != null){
|
||||
unit = initialSwitchInfoDetails.getUnit();
|
||||
}
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||
Map<String, Function<InitialSwitchInfoDetails, ?>> extractors = new LinkedHashMap<>();
|
||||
extractors.put("netInSpeedData", info ->
|
||||
info != null && info.getInSpeed() != null ?
|
||||
@@ -944,6 +952,6 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return new HashMap<>();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
public class CalculateUtil {
|
||||
|
||||
private static final Pattern SPEED_PATTERN = Pattern.compile("(\\d+\\.?\\d*)\\s*(\\S*)");
|
||||
private static final Pattern SPEED_PATTERN = Pattern.compile("^\\s*([-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][-+]?\\d+)?)\\s*([a-zA-Z/]*)?\\s*$");
|
||||
/**
|
||||
* 单位换算
|
||||
* @param speedWithUnit
|
||||
|
||||
@@ -77,6 +77,38 @@ public class TrafficRedisHashUtil {
|
||||
saveListToHash(taskId, dataList);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 修改列表中某条数据的特定属性值,并重新排序
|
||||
* @param taskId 任务ID
|
||||
* @param createTime 用于匹配的时间
|
||||
* @param propertyUpdater 属性修改器
|
||||
* @param comparator 排序比较器(用于重新排序)
|
||||
*/
|
||||
public <T> void updateItemPropertyInHash(String taskId, String createTime,
|
||||
java.util.function.Consumer<T> propertyUpdater,
|
||||
java.util.Comparator<T> comparator) {
|
||||
List<T> dataList = (List<T>) getListFromHash(taskId);
|
||||
|
||||
if (dataList != null) {
|
||||
boolean modified = false;
|
||||
for (int i = 0; i < dataList.size(); i++) {
|
||||
T item = dataList.get(i);
|
||||
String itemCreateTime = getCreateTimeFromObject(item);
|
||||
if (itemCreateTime != null && itemCreateTime.equals(createTime)) {
|
||||
// 只修改匹配项的属性
|
||||
propertyUpdater.accept(item);
|
||||
modified = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (modified) {
|
||||
// 重新排序(从大到小)
|
||||
dataList.sort(comparator);
|
||||
saveListToHash(taskId, dataList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新Hash中的特定项(使用自定义匹配器)
|
||||
|
||||
@@ -76,6 +76,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<when test="userId != null">
|
||||
and user_id = #{userId}
|
||||
</when>
|
||||
<when test="pageRoute != null">
|
||||
and page_route = #{pageRoute}
|
||||
</when>
|
||||
<otherwise>
|
||||
and 1=0 <!-- 如果两个条件都不满足,则不更新任何记录 -->
|
||||
</otherwise>
|
||||
|
||||
@@ -72,5 +72,7 @@ public class InitialBandwidthTraffic extends BaseEntity
|
||||
private String startTime;
|
||||
/** 结束时间 */
|
||||
private String endTime;
|
||||
/** 单位 */
|
||||
private String unit;
|
||||
|
||||
}
|
||||
|
||||
@@ -67,6 +67,8 @@ public class InitialSwitchInfo extends BaseEntity
|
||||
private String endTime;
|
||||
/** 计算方式 */
|
||||
private String calculationMode;
|
||||
/* 单位 */
|
||||
private String unit;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -228,6 +228,9 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
||||
List<InitialBandwidthTraffic> list = getListByTableName(initialBandwidthTraffic);
|
||||
try {
|
||||
String unit = SpeedUtils.calculateUnitWithStringTraffic(list, "inSpeed", "outSpeed");
|
||||
if(initialBandwidthTraffic.getUnit() != null){
|
||||
unit = initialBandwidthTraffic.getUnit();
|
||||
}
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||
Map<String, Function<InitialBandwidthTraffic, ?>> extractors = new LinkedHashMap<>();
|
||||
extractors.put("netInSpeedData", info ->
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ruoyi.rocketmq.service.impl;
|
||||
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
||||
import com.ruoyi.common.core.utils.UnitChangeUtil;
|
||||
import com.ruoyi.rocketmq.domain.InitialMountPointInfo;
|
||||
import com.ruoyi.rocketmq.mapper.InitialMountPointInfoMapper;
|
||||
import com.ruoyi.rocketmq.service.IInitialMountPointInfoService;
|
||||
@@ -133,8 +134,8 @@ public class InitialMountPointInfoServiceImpl implements IInitialMountPointInfoS
|
||||
public Map<String, Object> spaceEcharts(InitialMountPointInfo initialMountPointInfo) {
|
||||
List<InitialMountPointInfo> list = initialMountPointInfoMapper.selectInitialMountPointInfoList(initialMountPointInfo);
|
||||
Map<String, Function<InitialMountPointInfo, ?>> extractors = new LinkedHashMap<>();
|
||||
extractors.put("vfsFreeData", info -> info.getVfsFree() / 1024.0);
|
||||
extractors.put("vfsTotalData", info -> info.getVfsTotal() / 1024.0);
|
||||
extractors.put("vfsFreeData", info -> UnitChangeUtil.bytesToGb(info.getVfsFree()));
|
||||
extractors.put("vfsTotalData", info -> UnitChangeUtil.bytesToGb(info.getVfsTotal()));
|
||||
return EchartsDataUtils.buildEchartsData(list,InitialMountPointInfo::getCreateTime, extractors);
|
||||
}
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
|
||||
@Override
|
||||
public InitialSwitchInfo getSwitchNetDetailsMsg(InitialSwitchInfo initialSwitchInfo) {
|
||||
InitialSwitchInfo info = initialSwitchInfoMapper.getSwitchNetDetailsMsg(initialSwitchInfo);
|
||||
if(info.getType()!=null){
|
||||
if(info != null && info.getType()!=null){
|
||||
info.setType(ConvertOtherTypeUtil.getInterfaceTypeName(Integer.parseInt(info.getType())));
|
||||
}
|
||||
return info;
|
||||
@@ -152,6 +152,9 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
|
||||
List<InitialSwitchInfo> list = initialSwitchInfoMapper.selectInitialSwitchInfoList(initialSwitchInfo);
|
||||
try {
|
||||
String unit = SpeedUtils.calculateUnit(list, "inSpeed", "outSpeed");
|
||||
if(initialSwitchInfo.getUnit() != null){
|
||||
unit = initialSwitchInfo.getUnit();
|
||||
}
|
||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
|
||||
extractors.put("netInSpeedData", info ->
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ruoyi.rocketmq.service.impl;
|
||||
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
||||
import com.ruoyi.common.core.utils.UnitChangeUtil;
|
||||
import com.ruoyi.rocketmq.domain.InitialCpuInfo;
|
||||
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
|
||||
import com.ruoyi.rocketmq.enums.ServerLogoEnum;
|
||||
@@ -199,7 +200,14 @@ public class InitialSystemOtherCollectDataServiceImpl implements IInitialSystemO
|
||||
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
|
||||
|
||||
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
|
||||
extractors.put("memorySizeAvailableData", InitialSystemOtherCollectData::getCollectValue);
|
||||
extractors.put("memorySizeAvailableData", data -> {
|
||||
try {
|
||||
String kbValue = data.getCollectValue();
|
||||
return kbValue == null ? "0.00" : UnitChangeUtil.convertKbToGb(kbValue);
|
||||
} catch (Exception e) {
|
||||
return "0.00";
|
||||
}
|
||||
});
|
||||
|
||||
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.ruoyi.rocketmq.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.constant.SecurityConstants;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.common.core.enums.MsgEnum;
|
||||
import com.ruoyi.common.core.utils.DateUtils;
|
||||
import com.ruoyi.common.core.utils.StringUtils;
|
||||
@@ -14,6 +16,7 @@ import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
|
||||
import com.ruoyi.rocketmq.snmp.scheduler.MultiSwitchCollectionScheduler;
|
||||
import com.ruoyi.rocketmq.utils.DataProcessUtil;
|
||||
import com.ruoyi.rocketmq.utils.FieldNameConverterUtil;
|
||||
import com.ruoyi.system.api.RemoteRevenueConfigService;
|
||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
|
||||
import com.ruoyi.system.api.domain.RmSwitchManagementRemote;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -53,6 +56,8 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
|
||||
private RmInitialMonitorItemMapper rmInitialMonitorItemMapper;
|
||||
@Autowired
|
||||
private DataProcessUtil dataProcessUtil;
|
||||
@Autowired
|
||||
private RemoteRevenueConfigService remoteRevenueConfigService;
|
||||
|
||||
private final MultiSwitchCollectionScheduler scheduler;
|
||||
|
||||
@@ -82,6 +87,21 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
|
||||
@Override
|
||||
public List<RmMonitorPolicy> selectRmMonitorPolicyList(RmMonitorPolicy rmMonitorPolicy)
|
||||
{
|
||||
if("switch".equals(rmMonitorPolicy.getResourceType()) && rmMonitorPolicy.getQueryName() != null){
|
||||
// 查询交换机clientId
|
||||
String queryName = rmMonitorPolicy.getQueryName();
|
||||
RmSwitchManagementRemote rmSwitchManagementRemote = new RmSwitchManagementRemote();
|
||||
rmSwitchManagementRemote.setSwitchName(queryName);
|
||||
R<List<RmSwitchManagementRemote>> switchMsgR = remoteRevenueConfigService.getSwitchNameByClientId(rmSwitchManagementRemote, SecurityConstants.INNER);
|
||||
if(switchMsgR != null && !switchMsgR.getData().isEmpty()){
|
||||
StringJoiner joiner = new StringJoiner(",");
|
||||
for (RmSwitchManagementRemote switchMsg : switchMsgR.getData()) {
|
||||
joiner.add(switchMsg.getClientId());
|
||||
}
|
||||
rmMonitorPolicy.setQueryName(joiner.toString());
|
||||
}
|
||||
|
||||
}
|
||||
List<RmMonitorPolicy> list = rmMonitorPolicyMapper.selectRmMonitorPolicyList(rmMonitorPolicy);
|
||||
for (RmMonitorPolicy monitorPolicy : list) {
|
||||
// 资源组名称
|
||||
|
||||
@@ -39,8 +39,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="priority != null "> and priority = #{priority}</if>
|
||||
<if test="queryName != null and queryName != ''">
|
||||
and (policy_name like concat('%', #{queryName}, '%')
|
||||
or template_id in (select id from rm_monitor_template where template_name like concat('%', #{queryName}, '%'))
|
||||
or resource_group_id in (select id from rm_resource_group where group_name like concat('%', #{queryName}, '%'))
|
||||
or
|
||||
<foreach item="item" index="index" collection="queryName.split(',')" open="(" close=")" separator="or">
|
||||
FIND_IN_SET(#{item}, REPLACE(deploy_device, '\n', ',')) > 0
|
||||
</foreach>
|
||||
)
|
||||
</if>
|
||||
</where>
|
||||
|
||||
Reference in New Issue
Block a user