Skip to content

Commit e692f68

Browse files
authored
Merge pull request #148 from GTable/feature/#147-store대기인원순정렬
feat(Store): 주점 정렬 로직 구현
2 parents 391daa0 + 7eb9608 commit e692f68

6 files changed

Lines changed: 77 additions & 4 deletions

File tree

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ public class ReservationController {
3333
private final ReservationService reservationService;
3434

3535
@GetMapping("/admin/{storeId}/waiting/users")
36-
@Operation(summary = "주점별 전체 대기 리스트 조회", description = "주점에 대한 대기 리스트 조회(WAITING,CALLING)")
36+
@Operation(summary = "주점별 전체 대기/호출중 리스트 조회", description = "주점에 대한 대기 리스트 조회(WAITING,CALLING)")
3737
@ApiResponse(responseCode = "200", description = "주점별 전체 대기 리스트 조회")
3838
public ResponseEntity<List<WaitingUserResponse>> getWaitingUsersWithScore(@PathVariable Long storeId) {
3939
List<WaitingUserResponse> response = reservationService.getAllWaitingUserDetails(storeId);
4040
return ResponseEntity.ok(response);
4141
}
4242

4343
@GetMapping("/admin/{storeId}/completed")
44-
@Operation(summary = "주점별 전체 완료 리스트 조회", description = "주점에 대한 완료/취소 리스트 조회(CANCELED,CONFIRMED)")
44+
@Operation(summary = "주점별 전체 취소/완료 리스트 조회", description = "주점에 대한 완료/취소 리스트 조회(CANCELED,CONFIRMED)")
4545
@ApiResponse(responseCode = "200", description = "주점별 전체 완료/취소 리스트 조회")
4646
public ResponseEntity<?> getCompletedReservationList(
4747
@PathVariable Long storeId,

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/WaitingUserResponse.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
@Schema(description = "대기 사용자 응답 DTO")
1717
public class WaitingUserResponse {
1818

19-
@Schema(description = "유저 ID", example = "1201")
20-
private String id; // userId
19+
@Schema(description = "예약 ID", example = "1201")
20+
private String id; // reservationId
21+
22+
@Schema(description = "유저 ID", example = "16")
23+
private String userId;
2124

2225
@Schema(description = "파티 인원", example = "3")
2326
private Integer partySize;
@@ -37,6 +40,7 @@ public class WaitingUserResponse {
3740
public static WaitingUserResponse fromEntity(Reservation reservation) {
3841
return WaitingUserResponse.builder()
3942
.id(reservation.getId().toString())
43+
.userId(reservation.getUser().getId().toString())
4044
.partySize(reservation.getPartySize())
4145
.userName(reservation.getUser().getNickname())
4246
.createdAt(reservation.getRequestedAt())

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.web.bind.annotation.RequestParam;
1010
import org.springframework.web.bind.annotation.RestController;
1111

12+
import com.nowait.applicationuser.store.dto.StoreWaitingInfo;
1213
import com.nowait.applicationuser.store.service.StoreService;
1314
import com.nowait.common.api.ApiUtils;
1415

@@ -97,4 +98,20 @@ public ResponseEntity<?> searchStores(@RequestParam("keyword") String keyword) {
9798
)
9899
);
99100
}
101+
102+
@GetMapping("/waiting-list")
103+
@Operation(summary = "예약 많은순/적은순 주점 리스트 조회", description = "desc(대기 많은순) , asc(대기 적은순)")
104+
@ApiResponse(responseCode = "200", description = "주점 대기순 정렬")
105+
public ResponseEntity<?> getStoreWaitingList(
106+
@RequestParam(defaultValue = "desc") String order) {
107+
boolean desc = !"asc".equalsIgnoreCase(order); // 기본: 대기 많은 순
108+
109+
return ResponseEntity
110+
.ok()
111+
.body(
112+
ApiUtils.success(
113+
storeService.getStoresByWaitingCount(desc)
114+
)
115+
);
116+
}
100117
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.nowait.applicationuser.store.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
@Schema(description = "주점 대기 현황 정보 DTO")
10+
public class StoreWaitingInfo {
11+
@Schema(description = "주점 ID", example = "1")
12+
private String storeId;
13+
14+
@Schema(description = "주점명", example = "노웨이팅 치킨")
15+
private String storeName;
16+
17+
@Schema(description = "대기 인원 수", example = "12")
18+
private Long waitingCount;
19+
}

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.nowait.applicationuser.store.dto.StorePageReadDto;
99
import com.nowait.applicationuser.store.dto.StoreReadDto;
1010
import com.nowait.applicationuser.store.dto.StoreReadResponse;
11+
import com.nowait.applicationuser.store.dto.StoreWaitingInfo;
1112

1213
public interface StoreService {
1314

@@ -21,4 +22,6 @@ public interface StoreService {
2122

2223
List<StorePageReadDto> searchByKeywordNative(String name);
2324

25+
List<StoreWaitingInfo> getStoresByWaitingCount(boolean desc);
26+
2427
}

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import java.util.List;
44
import java.util.Map;
5+
import java.util.Set;
56
import java.util.stream.Collectors;
67

78
import org.springframework.data.domain.Pageable;
89
import org.springframework.data.domain.Slice;
10+
import org.springframework.data.redis.core.StringRedisTemplate;
911
import org.springframework.stereotype.Service;
1012
import org.springframework.transaction.annotation.Transactional;
1113

@@ -14,6 +16,7 @@
1416
import com.nowait.applicationuser.store.dto.StorePageReadDto;
1517
import com.nowait.applicationuser.store.dto.StoreReadDto;
1618
import com.nowait.applicationuser.store.dto.StoreReadResponse;
19+
import com.nowait.applicationuser.store.dto.StoreWaitingInfo;
1720
import com.nowait.domaincorerdb.department.entity.Department;
1821
import com.nowait.domaincorerdb.department.repository.DepartmentRepository;
1922
import com.nowait.domaincorerdb.store.entity.Store;
@@ -32,6 +35,7 @@ public class StoreServiceImpl implements StoreService {
3235
private final StoreRepository storeRepository;
3336
private final StoreImageRepository storeImageRepository;
3437
private final DepartmentRepository departmentRepository;
38+
private final StringRedisTemplate redisTemplate;
3539

3640

3741
@Override
@@ -189,4 +193,30 @@ public List<StorePageReadDto> searchByKeywordNative(String keyword) {
189193
})
190194
.toList();
191195
}
196+
197+
// 주점 대기 리스트 반환 (많은 순/적은 순)
198+
@Transactional(readOnly = true)
199+
public List<StoreWaitingInfo> getStoresByWaitingCount(boolean desc) {
200+
// 1. 모든 waiting:{storeId} key 조회 (패턴 탐색)
201+
Set<String> keys = redisTemplate.keys("waiting:*");
202+
if (keys == null) return List.of();
203+
204+
List<StoreWaitingInfo> result = keys.stream()
205+
.filter(key -> key.startsWith("waiting:") && !key.startsWith("waiting:party:"))
206+
.filter(key -> "zset".equals(redisTemplate.type(key).code()))
207+
.map(key -> {
208+
Long count = redisTemplate.opsForZSet().zCard(key);
209+
String storeId = key.replace("waiting:", "");
210+
String storeName = storeRepository.findById(Long.valueOf(storeId))
211+
.map(Store::getName)
212+
.orElse("UNKNOWN");
213+
return new StoreWaitingInfo(storeId, storeName, count != null ? count : 0);
214+
})
215+
.sorted((a, b) -> desc ?
216+
b.getWaitingCount().compareTo(a.getWaitingCount()) :
217+
a.getWaitingCount().compareTo(b.getWaitingCount()))
218+
.toList();
219+
220+
return result;
221+
}
192222
}

0 commit comments

Comments
 (0)