修复用户组永久时长+中文数字时间解析

This commit is contained in:
2026-07-01 14:30:13 +08:00
parent 18da80c799
commit 6a6685bcec
2 changed files with 71 additions and 4 deletions
@@ -437,6 +437,62 @@ public class ConfigManager {
cnNum.put("六", 6); cnNum.put("陆", 6); cnNum.put("七", 7); cnNum.put("漆", 7); cnNum.put("八", 8); cnNum.put("捌", 8);
cnNum.put("九", 9); cnNum.put("玖", 9);
// 中文数字转阿拉伯数字:逐字扫描法
// 支持:一百二十、三千五百、十二万三千四百五十六
// 单位:十(10)、百(100)、千(1000)、万(10000)
boolean hasChineseDigit = false;
for (char c : s.toCharArray()) {
if (cnNum.containsKey(String.valueOf(c))) {
hasChineseDigit = true;
break;
}
}
if (hasChineseDigit) {
int total = 0;
int current = 0;
boolean hasUnit = false;
for (int i = 0; i < s.length(); i++) {
String ch = String.valueOf(s.charAt(i));
Integer digit = cnNum.get(ch);
if (digit != null) {
current = digit;
hasUnit = false;
} else if (ch.equals("十")) {
if (current == 0) current = 1; // 十二 → 12
total += current * 10;
current = 0;
hasUnit = true;
} else if (ch.equals("百")) {
if (current == 0) current = 1;
total += current * 100;
current = 0;
hasUnit = true;
} else if (ch.equals("千")) {
if (current == 0) current = 1;
total += current * 1000;
current = 0;
hasUnit = true;
} else if (ch.equals("万")) {
if (current == 0) current = 1;
total += current * 10000;
current = 0;
hasUnit = true;
} else if (ch.equals("秒") || ch.equals("分") || ch.equals("钟")) {
// 单位字符,跳过
continue;
}
}
total += current; // 加上最后剩余的数字
// 如果有单位(秒/分钟),根据单位决定返回秒还是分钟
if (s.contains("秒")) {
return total;
} else if (s.contains("分") || s.contains("钟")) {
return total * 60;
} else {
return total; // 默认当作秒
}
}
// 罗马数字映射(简单支持)
java.util.Map<Character, Integer> romanNum = new java.util.HashMap<>();
romanNum.put('I', 1); romanNum.put('V', 5); romanNum.put('X', 10); romanNum.put('L', 50); romanNum.put('C', 100);
+15 -4
View File
@@ -333,7 +333,8 @@ public class UserGroupManager {
if (cfg.joinPrice <= 0) return "该用户组不开放付费加入";
if (cfg.durationMinutes <= 0) return "该用户组配置异常(有效时长未设置)";
// durationMinutes <= 0 表示永久(expiry_time=0)
// 不再报错,允许购买永久用户组
// 检查是否已在组内(有效期内)
if (isPlayerInGroup(player, groupName)) {
@@ -365,7 +366,12 @@ public class UserGroupManager {
// 计算到期时间
long now = System.currentTimeMillis();
long expiryTime = now + (long) cfg.durationMinutes * 60 * 1000;
long expiryTime;
if (cfg.durationMinutes <= 0) {
expiryTime = 0; // 永久
} else {
expiryTime = now + (long) cfg.durationMinutes * 60 * 1000;
}
// 加入组
String err = addPlayerWithExpiry(player, groupName, "paid_join", expiryTime);
@@ -432,8 +438,13 @@ public class UserGroupManager {
if (!deducted) return "扣费失败,请稍后重试";
// 延长到期时间:从当前到期时间往后延(如果已过期则从当前时间开始)
long baseTime = (currentExpiry > now) ? currentExpiry : now;
long newExpiry = baseTime + (long) cfg.durationMinutes * 60 * 1000;
long newExpiry;
if (cfg.durationMinutes <= 0) {
newExpiry = 0; // 永久
} else {
long baseTime = (currentExpiry > now) ? currentExpiry : now;
newExpiry = baseTime + (long) cfg.durationMinutes * 60 * 1000;
}
try {
PreparedStatement ps = db.prepareStatement(