feat: 添加房间详情 API

This commit is contained in:
2026-06-23 11:05:17 +08:00
parent 5209df46d1
commit 6e4eb6120a
5 changed files with 152 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ import com.webgame.webgamebackend.repository.*;
import com.webgame.webgamebackend.common.event.SseEventPublisher;
import com.webgame.webgamebackend.common.event.SseEventType;
import com.webgame.webgamebackend.service.GameService;
import com.webgame.webgamebackend.service.GomokuGameService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -427,6 +428,65 @@ public class GameServiceImpl implements GameService {
}
}
@Override
public RoomDetailResponse getRoomDetail(String roomId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
GameConfigEntity gameConfig = gameConfigRepository.findByGameId(room.getGameId())
.orElseThrow(() -> new BusinessException(ErrorCode.GAME_NOT_FOUND));
// 组装玩家详情(含座位号和准备状态)
List<RoomPlayerEntity> roomPlayers = roomPlayerRepository.findByRoomId(roomId);
List<String> userIds = roomPlayers.stream()
.map(RoomPlayerEntity::getUserId).toList();
Map<String, UserEntity> userMap = userRepository.findByAccountIdIn(userIds).stream()
.collect(Collectors.toMap(u -> u.getAccount().getId(), u -> u));
List<RoomDetailResponse.RoomPlayerDetail> playerDetails = roomPlayers.stream()
.map(rp -> {
UserEntity user = userMap.get(rp.getUserId());
return new RoomDetailResponse.RoomPlayerDetail(
rp.getUserId(),
user != null ? user.getAvatar() : "",
user != null ? user.getNickName() : "未知玩家",
rp.getSeatNumber(),
rp.getReadyStatus()
);
}).toList();
String creatorName = getNickname(room.getCreatorId());
// 对局中或有对局记录时,查询棋盘状态
int[][] boardState = null;
String currentTurn = null;
List<RoomDetailResponse.MoveItem> moves = List.of();
if ("playing".equals(room.getStatus()) || "finished".equals(room.getStatus())) {
// 查询走棋记录
List<GameMoveEntity> moveEntities = gameMoveRepository.findByRoomIdOrderByMoveIndexAsc(roomId);
moves = moveEntities.stream()
.map(m -> new RoomDetailResponse.MoveItem(
m.getMoveIndex(), m.getPlayerId(), m.getRowNum(), m.getColNum()))
.toList();
// 从走棋记录重建棋盘
boardState = GomokuGameService.rebuildBoard(moveEntities, room.getMaxPlayers());
// currentTurn 由服务端运行时管理HTTP 快照中暂不返回
}
log.info("[游戏服务] 获取房间详情, roomId={}, status={}, 玩家数={}",
roomId, room.getStatus(), playerDetails.size());
return new RoomDetailResponse(
room.getId(), room.getName(), room.getGameId(),
gameConfig.getIcon(), gameConfig.getName(),
room.getMaxPlayers(), room.getMode(), room.getStakes(),
room.getStatus(), room.getCreatorId(), creatorName,
room.getAllowSpectate(), playerDetails, boardState, currentTurn, moves
);
}
// ==================== 私有辅助方法 ====================
/**