xiongzhu hace 3 años
padre
commit
d7022df7dc

+ 1 - 3
src/main/java/com/izouma/yags/enums/JoinRoomStatus.java

@@ -4,10 +4,8 @@ public enum JoinRoomStatus {
     WAITING("等待中"),
     WAITING("等待中"),
     GAMING("游戏中"),
     GAMING("游戏中"),
     CANCELLED("取消"),
     CANCELLED("取消"),
-    KICKED_OUT("被踢出"),
     WIN("胜利"),
     WIN("胜利"),
-    LOSE("失败"),
-    QUIT("退出");;
+    LOSE("失败");
 
 
     private final String description;
     private final String description;
 
 

+ 1 - 1
src/main/java/com/izouma/yags/enums/RoomStatus.java

@@ -7,7 +7,7 @@ public enum RoomStatus {
     AUDIT("审核中"),
     AUDIT("审核中"),
     FINISH("完成"),
     FINISH("完成"),
     CANCELLED("取消"),
     CANCELLED("取消"),
-    PASSED("流局");
+    INVALID("流局");
 
 
     private final String description;
     private final String description;
 
 

+ 2 - 0
src/main/java/com/izouma/yags/repo/JoinRoomRepo.java

@@ -22,6 +22,8 @@ public interface JoinRoomRepo extends JpaRepository<JoinRoom, Long>, JpaSpecific
 
 
     List<JoinRoom> findByRoomIdAndStatus(Long roomId, JoinRoomStatus status);
     List<JoinRoom> findByRoomIdAndStatus(Long roomId, JoinRoomStatus status);
 
 
+    List<JoinRoom> findByRoomId(Long roomId);
+
     List<JoinRoom> findByRoomIdAndStatusNotIn(Long roomId, Collection<JoinRoomStatus> status);
     List<JoinRoom> findByRoomIdAndStatusNotIn(Long roomId, Collection<JoinRoomStatus> status);
 
 
     Optional<JoinRoom> findFirstByRoomIdAndUserId(Long roomId, Long userId);
     Optional<JoinRoom> findFirstByRoomIdAndUserId(Long roomId, Long userId);

+ 7 - 0
src/main/java/com/izouma/yags/repo/RoomRepo.java

@@ -1,16 +1,23 @@
 package com.izouma.yags.repo;
 package com.izouma.yags.repo;
 
 
 import com.izouma.yags.domain.Room;
 import com.izouma.yags.domain.Room;
+import com.izouma.yags.enums.RoomStatus;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
 
 
 import javax.transaction.Transactional;
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.List;
 
 
 public interface RoomRepo extends JpaRepository<Room, Long>, JpaSpecificationExecutor<Room> {
 public interface RoomRepo extends JpaRepository<Room, Long>, JpaSpecificationExecutor<Room> {
     @Query("update Room t set t.del = true where t.id = ?1")
     @Query("update Room t set t.del = true where t.id = ?1")
     @Modifying
     @Modifying
     @Transactional
     @Transactional
     void softDelete(Long id);
     void softDelete(Long id);
+
+    List<Room> findByStatusAndCreatedAtBefore(RoomStatus status, LocalDateTime time);
+
+    List<Room> findByStatusAndStartAtBefore(RoomStatus status, LocalDateTime time);
 }
 }

+ 32 - 10
src/main/java/com/izouma/yags/service/RoomService.java

@@ -18,6 +18,7 @@ import com.izouma.yags.repo.*;
 import com.izouma.yags.utils.JpaUtils;
 import com.izouma.yags.utils.JpaUtils;
 import com.izouma.yags.utils.RecognizeUtil;
 import com.izouma.yags.utils.RecognizeUtil;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
@@ -44,6 +45,7 @@ import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
+@Slf4j
 public class RoomService {
 public class RoomService {
 
 
     private RoomRepo               roomRepo;
     private RoomRepo               roomRepo;
@@ -249,10 +251,22 @@ public class RoomService {
         if (!room.getUserId().equals(userId)) {
         if (!room.getUserId().equals(userId)) {
             throw new BusinessException("无权限");
             throw new BusinessException("无权限");
         }
         }
+        cancel(room);
+    }
+
+    public void cancel(Room room) {
         if (room.getStatus() != RoomStatus.WAITING) {
         if (room.getStatus() != RoomStatus.WAITING) {
             throw new BusinessException("游戏已开始");
             throw new BusinessException("游戏已开始");
         }
         }
-        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomIdAndStatus(roomId, JoinRoomStatus.WAITING);
+        cancelJoinRoomAndReturnTicket(room);
+
+        room.setStatus(RoomStatus.CANCELLED);
+        room.setCancelAt(LocalDateTime.now());
+        roomRepo.save(room);
+    }
+
+    private void cancelJoinRoomAndReturnTicket(Room room) {
+        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomId(room.getId());
         joinRoomList.forEach(j -> {
         joinRoomList.forEach(j -> {
             j.setStatus(JoinRoomStatus.CANCELLED);
             j.setStatus(JoinRoomStatus.CANCELLED);
             joinRoomRepo.save(j);
             joinRoomRepo.save(j);
@@ -264,8 +278,18 @@ public class RoomService {
                 userTicketRepo.save(t);
                 userTicketRepo.save(t);
             });
             });
         });
         });
+    }
 
 
-        room.setStatus(RoomStatus.CANCELLED);
+    @Transactional
+    public void invalid(Room room) {
+        if (room.getStatus() == RoomStatus.FINISH) {
+            for (Long userId : room.getWinner()) {
+                userBalanceService.modifyBalance(userId, room.getBonus().negate(), Constants.BalanceDesc.RETURN);
+            }
+        }
+        cancelJoinRoomAndReturnTicket(room);
+
+        room.setStatus(RoomStatus.INVALID);
         room.setCancelAt(LocalDateTime.now());
         room.setCancelAt(LocalDateTime.now());
         roomRepo.save(room);
         roomRepo.save(room);
     }
     }
@@ -401,8 +425,7 @@ public class RoomService {
     }
     }
 
 
     public RoomDetail detail(Room room, boolean players) {
     public RoomDetail detail(Room room, boolean players) {
-        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomIdAndStatusNotIn(room.getId(),
-                Arrays.asList(JoinRoomStatus.KICKED_OUT, JoinRoomStatus.QUIT));
+        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomId(room.getId());
         RoomDetail detail = new RoomDetail();
         RoomDetail detail = new RoomDetail();
         BeanUtils.copyProperties(room, detail);
         BeanUtils.copyProperties(room, detail);
         Arrays.asList(1, 2, 3).parallelStream().forEach(i -> {
         Arrays.asList(1, 2, 3).parallelStream().forEach(i -> {
@@ -489,8 +512,7 @@ public class RoomService {
         if (room.getStatus() != RoomStatus.AUDIT) {
         if (room.getStatus() != RoomStatus.AUDIT) {
             throw new BusinessException("房间状态不正确");
             throw new BusinessException("房间状态不正确");
         }
         }
-        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomIdAndStatusNotIn(room.getId(),
-                Arrays.asList(JoinRoomStatus.KICKED_OUT, JoinRoomStatus.QUIT));
+        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomId(room.getId());
         for (JoinRoom j : joinRoomList) {
         for (JoinRoom j : joinRoomList) {
             j.setFinishAt(LocalDateTime.now());
             j.setFinishAt(LocalDateTime.now());
             if (j.getTeam().equals(team)) {
             if (j.getTeam().equals(team)) {
@@ -514,8 +536,7 @@ public class RoomService {
         if (room.getStatus() != RoomStatus.FINISH) {
         if (room.getStatus() != RoomStatus.FINISH) {
             throw new BusinessException("房间状态不正确");
             throw new BusinessException("房间状态不正确");
         }
         }
-        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomIdAndStatusNotIn(room.getId(),
-                Arrays.asList(JoinRoomStatus.KICKED_OUT, JoinRoomStatus.QUIT));
+        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomId(room.getId());
         String currentWinTeam = joinRoomList.stream().filter(j -> j.getStatus() == JoinRoomStatus.WIN)
         String currentWinTeam = joinRoomList.stream().filter(j -> j.getStatus() == JoinRoomStatus.WIN)
                 .findAny().map(JoinRoom::getTeam).orElseThrow(new BusinessException("没有胜利的队伍"));
                 .findAny().map(JoinRoom::getTeam).orElseThrow(new BusinessException("没有胜利的队伍"));
         if (currentWinTeam.equals(team)) {
         if (currentWinTeam.equals(team)) {
@@ -546,8 +567,7 @@ public class RoomService {
     @Transactional
     @Transactional
     public void apiJudge(Room room) {
     public void apiJudge(Room room) {
         if (!(room.getStatus() == RoomStatus.AUDIT)) return;
         if (!(room.getStatus() == RoomStatus.AUDIT)) return;
-        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomIdAndStatusNotIn(room.getId(),
-                Arrays.asList(JoinRoomStatus.KICKED_OUT, JoinRoomStatus.QUIT));
+        List<JoinRoom> joinRoomList = joinRoomRepo.findByRoomId(room.getId());
         if (room.getMaxPlayerNum() != 2) return;
         if (room.getMaxPlayerNum() != 2) return;
         if (joinRoomList.size() != 2) return;
         if (joinRoomList.size() != 2) return;
 
 
@@ -594,4 +614,6 @@ public class RoomService {
                 .map(JoinRoom::getUserId).collect(Collectors.toList()));
                 .map(JoinRoom::getUserId).collect(Collectors.toList()));
         roomRepo.save(room);
         roomRepo.save(room);
     }
     }
+
+
 }
 }

+ 45 - 0
src/main/java/com/izouma/yags/service/ScheduleService.java

@@ -0,0 +1,45 @@
+package com.izouma.yags.service;
+
+import com.izouma.yags.domain.Room;
+import com.izouma.yags.enums.RoomStatus;
+import com.izouma.yags.repo.RoomRepo;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+@AllArgsConstructor
+public class ScheduleService {
+    private RoomRepo    roomRepo;
+    private RoomService roomService;
+
+    @Scheduled(fixedRate = 10, timeUnit = TimeUnit.MINUTES)
+    public void scheduleCancel() {
+        List<Room> roomList = roomRepo.findByStatusAndCreatedAtBefore(RoomStatus.WAITING, LocalDateTime.now().minusHours(1));
+        for (Room room : roomList) {
+            try {
+                roomService.cancel(room);
+            } catch (Exception e) {
+                log.error("取消房间失败", e);
+            }
+        }
+    }
+
+    @Scheduled(fixedRate = 10, timeUnit = TimeUnit.MINUTES)
+    public void scheduleInvalid() {
+        List<Room> roomList = roomRepo.findByStatusAndStartAtBefore(RoomStatus.GAMING, LocalDateTime.now().minusHours(3));
+        for (Room room : roomList) {
+            try {
+                roomService.invalid(room);
+            } catch (Exception e) {
+                log.error("取消房间失败", e);
+            }
+        }
+    }
+}