@@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.scheduling.annotation.Scheduled ;
import org.springframework.scheduling.annotation.Scheduled ;
import org.springframework.stereotype.Component ;
import org.springframework.stereotype.Component ;
import org.springframework.transaction.annotation.Transactional ;
import org.springframework.web.socket.TextMessage ;
import org.springframework.web.socket.TextMessage ;
import org.springframework.web.socket.WebSocketSession ;
import org.springframework.web.socket.WebSocketSession ;
@@ -95,6 +96,7 @@ public class RoomManager {
* @param creatorId 房主 accountId
* @param creatorId 房主 accountId
* @return 创建结果
* @return 创建结果
*/
*/
@Transactional
public CreateRoomResponse createRoom ( CreateRoomRequest request , String creatorId ) {
public CreateRoomResponse createRoom ( CreateRoomRequest request , String creatorId ) {
// 校验游戏存在且启用
// 校验游戏存在且启用
GameConfigEntity gameConfig = gameConfigRepository . findByGameId ( request . gameId ( ) )
GameConfigEntity gameConfig = gameConfigRepository . findByGameId ( request . gameId ( ) )
@@ -172,6 +174,7 @@ public class RoomManager {
* @param userId 用户 accountId
* @param userId 用户 accountId
* @return 房间信息
* @return 房间信息
*/
*/
@Transactional
public RoomItemResponse joinRoom ( JoinRoomRequest request , String userId ) {
public RoomItemResponse joinRoom ( JoinRoomRequest request , String userId ) {
GameRoomEntity room = gameRoomRepository . findById ( request . roomId ( ) )
GameRoomEntity room = gameRoomRepository . findById ( request . roomId ( ) )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -236,6 +239,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param roomId 房间 ID
* @param userId 用户 accountId
* @param userId 用户 accountId
*/
*/
@Transactional
public void leaveRoom ( String roomId , String userId ) {
public void leaveRoom ( String roomId , String userId ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId )
GameRoomEntity room = gameRoomRepository . findById ( roomId )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -286,6 +290,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param roomId 房间 ID
* @param ownerId 房主 accountId
* @param ownerId 房主 accountId
*/
*/
@Transactional
public void disbandRoom ( String roomId , String ownerId ) {
public void disbandRoom ( String roomId , String ownerId ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId )
GameRoomEntity room = gameRoomRepository . findById ( roomId )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -324,6 +329,7 @@ public class RoomManager {
* @param ownerId 房主 accountId
* @param ownerId 房主 accountId
* @param targetUserId 目标用户 accountId
* @param targetUserId 目标用户 accountId
*/
*/
@Transactional
public void kickPlayer ( String roomId , String ownerId , String targetUserId ) {
public void kickPlayer ( String roomId , String ownerId , String targetUserId ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId )
GameRoomEntity room = gameRoomRepository . findById ( roomId )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -366,6 +372,7 @@ public class RoomManager {
* @param userId 用户 accountId
* @param userId 用户 accountId
* @return 新的准备状态
* @return 新的准备状态
*/
*/
@Transactional
public boolean toggleReady ( String roomId , String userId ) {
public boolean toggleReady ( String roomId , String userId ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId )
GameRoomEntity room = gameRoomRepository . findById ( roomId )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -400,6 +407,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param roomId 房间 ID
* @param userId 操作者 accountId( 必须是房主)
* @param userId 操作者 accountId( 必须是房主)
*/
*/
@Transactional
public void startGame ( String roomId , String userId ) {
public void startGame ( String roomId , String userId ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId )
GameRoomEntity room = gameRoomRepository . findById ( roomId )
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
. orElseThrow ( ( ) - > new BusinessException ( ErrorCode . ROOM_NOT_FOUND ) ) ;
@@ -430,9 +438,10 @@ public class RoomManager {
room . setStatus ( " playing " ) ;
room . setStatus ( " playing " ) ;
gameRoomRepository . save ( room ) ;
gameRoomRepository . save ( room ) ;
// 创建游戏记录
// 创建游戏记录( resultType 初始为 pending, 游戏结束时由 onGameOver 更新)
GameRecordEntity record = new GameRecordEntity ( )
GameRecordEntity record = new GameRecordEntity ( )
. setRoomId ( roomId )
. setRoomId ( roomId )
. setResultType ( " pending " )
. setStartedAt ( LocalDateTime . now ( ) ) ;
. setStartedAt ( LocalDateTime . now ( ) ) ;
gameRecordRepository . save ( record ) ;
gameRecordRepository . save ( record ) ;
@@ -637,6 +646,7 @@ public class RoomManager {
* @param winnerId 胜者 accountId( null 表示平局)
* @param winnerId 胜者 accountId( null 表示平局)
* @param resultType 结果类型( win/draw/resign)
* @param resultType 结果类型( win/draw/resign)
*/
*/
@Transactional
public void onGameOver ( String roomId , String winnerId , String resultType ) {
public void onGameOver ( String roomId , String winnerId , String resultType ) {
GameRoomEntity room = gameRoomRepository . findById ( roomId ) . orElse ( null ) ;
GameRoomEntity room = gameRoomRepository . findById ( roomId ) . orElse ( null ) ;
if ( room = = null ) return ;
if ( room = = null ) return ;