优化交换机分表、新增丢包率clientId记录
This commit is contained in:
+62
-32
@@ -1,28 +1,50 @@
|
||||
package com.ruoyi.common.core.utils;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.ResultSet;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@Component
|
||||
public class TableSubUtil {
|
||||
|
||||
// 日期格式
|
||||
private static final String YEAR_MONTH_FORMAT = "yyyy_MM";
|
||||
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
|
||||
/**
|
||||
* 根据创建时间获取表名
|
||||
* @param createTime 记录创建时间
|
||||
* @param prefix 表名前缀
|
||||
* @return 对应的分表名称
|
||||
* @throws IllegalArgumentException 如果createTime为null
|
||||
*
|
||||
* 示例:
|
||||
* 2023-08-05 14:30:00 → rm_mtr_probe_result_2023_08_1_10
|
||||
* 2023-08-15 09:15:00 → rm_mtr_probe_result_2023_08_11_20
|
||||
* 2023-08-25 18:45:00 → rm_mtr_probe_result_2023_08_21_31
|
||||
* 根据创建时间获取表名(过滤不存在的表)
|
||||
*/
|
||||
public static String getExistingTableName(Date createTime, String prefix) {
|
||||
String tableName = getTableName(createTime, prefix);
|
||||
return tableExists(tableName) ? tableName : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时间范围内涉及的所有存在的表名
|
||||
*/
|
||||
public static Set<String> getExistingTableNamesBetween(String startTime, String endTime, String prefix) {
|
||||
Set<String> allTables = getTableNamesBetween(startTime, endTime, prefix);
|
||||
Set<String> existingTables = new LinkedHashSet<>();
|
||||
|
||||
for (String table : allTables) {
|
||||
if (tableExists(table)) {
|
||||
existingTables.add(table);
|
||||
}
|
||||
}
|
||||
return existingTables;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据创建时间获取表名(原始方法)
|
||||
*/
|
||||
public static String getTableName(Date createTime, String prefix) {
|
||||
if (createTime == null) {
|
||||
@@ -35,18 +57,11 @@ public class TableSubUtil {
|
||||
SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
|
||||
int day = Integer.parseInt(dayFormat.format(createTime));
|
||||
|
||||
return String.format("%s_%s_%s",
|
||||
prefix,
|
||||
yearMonth,
|
||||
getDayRange(day));
|
||||
return String.format("%s_%s_%s", prefix, yearMonth, getDayRange(day));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时间范围内涉及的所有表名
|
||||
* @param startTime 开始时间 (格式: "yyyy-MM-dd HH:mm:ss")
|
||||
* @param endTime 结束时间 (格式: "yyyy-MM-dd HH:mm:ss")
|
||||
* @param prefix 表名前缀
|
||||
* @return 按时间顺序排列的表名集合
|
||||
* 获取时间范围内涉及的所有表名(原始方法)
|
||||
*/
|
||||
public static Set<String> getTableNamesBetween(String startTime, String endTime, String prefix) {
|
||||
Date start = parseDateTime(startTime);
|
||||
@@ -54,27 +69,45 @@ public class TableSubUtil {
|
||||
validateTimeRange(start, end);
|
||||
|
||||
Set<String> tableNames = new LinkedHashSet<>();
|
||||
|
||||
// 使用java.util.Calendar进行日期操作
|
||||
java.util.Calendar current = java.util.Calendar.getInstance();
|
||||
Calendar current = Calendar.getInstance();
|
||||
current.setTime(start);
|
||||
current.set(java.util.Calendar.HOUR_OF_DAY, 0);
|
||||
current.set(java.util.Calendar.MINUTE, 0);
|
||||
current.set(java.util.Calendar.SECOND, 0);
|
||||
current.set(java.util.Calendar.MILLISECOND, 0);
|
||||
current.set(Calendar.HOUR_OF_DAY, 0);
|
||||
current.set(Calendar.MINUTE, 0);
|
||||
current.set(Calendar.SECOND, 0);
|
||||
current.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
java.util.Calendar endCal = java.util.Calendar.getInstance();
|
||||
Calendar endCal = Calendar.getInstance();
|
||||
endCal.setTime(end);
|
||||
|
||||
while (!current.after(endCal)) {
|
||||
tableNames.add(getTableName(current.getTime(), prefix));
|
||||
current.add(java.util.Calendar.DAY_OF_MONTH, 1);
|
||||
current.add(Calendar.DAY_OF_MONTH, 1);
|
||||
}
|
||||
|
||||
return tableNames;
|
||||
}
|
||||
|
||||
// 解析字符串为Date
|
||||
/**
|
||||
* 检查表是否存在
|
||||
*/
|
||||
private static boolean tableExists(String tableName) {
|
||||
try {
|
||||
// 直接从SpringUtils获取数据源
|
||||
javax.sql.DataSource dataSource = SpringUtils.getBean(javax.sql.DataSource.class);
|
||||
|
||||
try (Connection conn = dataSource.getConnection()) {
|
||||
DatabaseMetaData metaData = conn.getMetaData();
|
||||
try (ResultSet rs = metaData.getTables(conn.getCatalog(), null, tableName, new String[]{"TABLE"})) {
|
||||
return rs.next();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("检查表是否存在失败: " + tableName + ", error: " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 以下为原有辅助方法保持不变
|
||||
private static Date parseDateTime(String dateTimeStr) {
|
||||
if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("时间字符串不能为空");
|
||||
@@ -87,18 +120,15 @@ public class TableSubUtil {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取日期区间
|
||||
private static String getDayRange(int day) {
|
||||
if (day < 1 || day > 31) {
|
||||
throw new IllegalArgumentException("日期必须在1-31之间");
|
||||
}
|
||||
|
||||
if (day <= 10) return "1_10";
|
||||
if (day <= 20) return "11_20";
|
||||
return "21_31";
|
||||
}
|
||||
|
||||
// 验证时间范围
|
||||
private static void validateTimeRange(Date start, Date end) {
|
||||
if (start == null || end == null) {
|
||||
throw new IllegalArgumentException("时间范围参数不能为null");
|
||||
|
||||
Reference in New Issue
Block a user