修复红包领取三重问题:①getOnlineUserIds 兼容旧版用户(fallback数据库查询) ②聊天领取按钮用全局Map替代内嵌JSON避免HTML属性破坏 ③doClaim改判 data.ok 而非不存在的 data.status

This commit is contained in:
2026-03-01 19:36:44 +08:00
parent 23fca927d5
commit a37b04aca0
2 changed files with 31 additions and 8 deletions
+19 -1
View File
@@ -364,6 +364,7 @@ class WeddingService
/**
* Redis room:{roomId}:users Hash 获取当前在线用户 ID 列表。
* Hash value 中无 user_id(旧版登录用户),则用 username 批量查库补齐。
*
* @param int $roomId 房间 ID
* @return array<int>
@@ -373,16 +374,33 @@ class WeddingService
try {
$key = "room:{$roomId}:users";
$users = Redis::hgetall($key);
if (empty($users)) {
return [];
}
$ids = [];
$fallbacks = []; // 需要 fallback 查库的用户名
foreach ($users as $username => $jsonInfo) {
$info = json_decode($jsonInfo, true);
// user_id 由 ChatController::join() 写入 userData
if (isset($info['user_id'])) {
// 新版登录:user_id 直接存在 Redis
$ids[] = (int) $info['user_id'];
} else {
// 旧版登录(修复前):user_id 缺失,记录 username 待批量查库
$fallbacks[] = $username;
}
}
// 对旧用户批量查库补齐 user_id
if (! empty($fallbacks)) {
$dbIds = User::whereIn('username', $fallbacks)
->pluck('id')
->map(fn ($id) => (int) $id)
->all();
$ids = array_merge($ids, $dbIds);
}
return array_values(array_unique($ids));
} catch (\Throwable) {
return [];