Skip to content

Commit ccd719d

Browse files
committed
refactor/367 메인현황-상품명 정렬 추가,
1 parent 9d1b5dc commit ccd719d

File tree

3 files changed

+54
-11
lines changed

3 files changed

+54
-11
lines changed

src/main/java/com/back/domain/dashboard/artist/dto/request/ArtistSettlementSearchRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public record ArtistSettlementSearchRequest(
3636
Integer size,
3737

3838
/** 정렬 기준 */
39-
@Pattern(regexp = "^(date|grossAmount|commission|netAmount|status)$",
40-
message = "sort는 date, grossAmount, commission, netAmount, status 중 하나여야 합니다")
39+
@Pattern(regexp = "^(date|productName|grossAmount|commission|netAmount|status)$",
40+
message = "sort는 date, productName, grossAmount, commission, netAmount, status 중 하나여야 합니다")
4141
String sort,
4242

4343
/** 정렬 방향 */

src/main/java/com/back/domain/dashboard/artist/service/ArtistDashboardServiceImpl.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1667,11 +1667,25 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16671667
ArtistSettlementSearchRequest request,
16681668
Long artistId) {
16691669

1670-
// 1. 배송 완료된 주문 조회 (정렬 없이 전체 조회)
1671-
List<com.back.domain.order.order.entity.Order> allOrders =
1672-
orderRepository.findDeliveredOrdersByArtistInPeriod(artist, startDate, endDate);
1670+
// 1. 정렬 필드 확인
1671+
String sortField = request.sort() != null ? request.sort() : "date";
1672+
String sortOrder = request.order() != null ? request.order() : "DESC";
1673+
boolean isProductNameSort = "productName".equals(sortField);
1674+
1675+
// 2. 배송 완료된 주문 조회
1676+
List<com.back.domain.order.order.entity.Order> allOrders;
1677+
1678+
if (isProductNameSort) {
1679+
// 상품명 정렬: DB에서 정렬된 상태로 조회
1680+
allOrders = orderRepository.findDeliveredOrdersByArtistInPeriodSortedByProductName(
1681+
artist, startDate, endDate, sortOrder);
1682+
} else {
1683+
// 일반 조회 (정렬은 메모리에서 처리)
1684+
allOrders = orderRepository.findDeliveredOrdersByArtistInPeriod(
1685+
artist, startDate, endDate);
1686+
}
16731687

1674-
// 2. 주문을 OrderItem 단위로 변환 (작가의 상품만)
1688+
// 3. 주문을 OrderItem 단위로 변환 (작가의 상품만)
16751689
List<SettlementOrderItem> settlementItems = allOrders.stream()
16761690
.flatMap(order -> order.getOrderItems().stream()
16771691
.filter(item -> item.getProduct().getUser().getId().equals(artistId))
@@ -1684,17 +1698,19 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16841698
)))
16851699
.toList();
16861700

1687-
// 3. 정렬 적용
1688-
settlementItems = sortSettlementItems(settlementItems, request.sort(), request.order());
1701+
// 4. 정렬 적용 (상품명 정렬이 아닌 경우만 메모리 정렬)
1702+
if (!isProductNameSort) {
1703+
settlementItems = sortSettlementItems(settlementItems, sortField, sortOrder);
1704+
}
16891705

1690-
// 4. 페이징 처리
1706+
// 5. 페이징 처리
16911707
int start = request.page() * request.size();
16921708
int end = Math.min(start + request.size(), settlementItems.size());
16931709
List<SettlementOrderItem> pagedItems = start < settlementItems.size()
16941710
? settlementItems.subList(start, end)
16951711
: List.of();
16961712

1697-
// 5. DTO 변환
1713+
// 6. DTO 변환
16981714
List<ArtistSettlementResponse.Settlement> content = pagedItems.stream()
16991715
.map(this::convertToSettlementDtoFromOrder)
17001716
.toList();
@@ -1716,7 +1732,8 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
17161732
}
17171733

17181734
/**
1719-
* 정산 아이템 정렬
1735+
* 정산 아이템 정렬 (메모리 정렬)
1736+
* productName 정렬은 DB에서 처리하므로 여기서는 제외
17201737
*/
17211738
private List<SettlementOrderItem> sortSettlementItems(
17221739
List<SettlementOrderItem> items, String sortField, String sortOrder) {
@@ -1726,6 +1743,7 @@ private List<SettlementOrderItem> sortSettlementItems(
17261743
return items.stream()
17271744
.sorted((a, b) -> {
17281745
int cmp = switch (sortField) {
1746+
case "productName" -> a.productName.compareTo(b.productName);
17291747
case "grossAmount" -> Integer.compare(a.grossAmount, b.grossAmount);
17301748
case "commission" -> Integer.compare(a.grossAmount / 10, b.grossAmount / 10);
17311749
case "netAmount" -> Integer.compare(a.grossAmount * 9 / 10, b.grossAmount * 9 / 10);

src/main/java/com/back/domain/order/order/repository/OrderRepository.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,4 +328,29 @@ List<Order> findDeliveredOrdersByArtistInPeriod(
328328
@Param("startDate") java.time.LocalDateTime startDate,
329329
@Param("endDate") java.time.LocalDateTime endDate
330330
);
331+
332+
/**
333+
* - 특정 기간 내 DELIVERED 상태 주문만
334+
* - 작가가 판매한 상품의 주문만
335+
* - 상품명 기준 정렬 (ASC/DESC)
336+
*/
337+
@Query("SELECT DISTINCT o FROM Order o " +
338+
"JOIN o.orderItems oi " +
339+
"JOIN oi.product p " +
340+
"WHERE p.user = :artist " +
341+
"AND o.status = com.back.domain.order.order.entity.OrderStatus.DELIVERED " +
342+
"AND o.orderDate >= :startDate " +
343+
"AND o.orderDate <= :endDate " +
344+
"AND p.name = (SELECT MIN(p2.name) FROM OrderItem oi2 JOIN oi2.product p2 " +
345+
" WHERE oi2.order = o AND p2.user = :artist) " +
346+
"ORDER BY " +
347+
"CASE WHEN :direction = 'ASC' THEN p.name END ASC, " +
348+
"CASE WHEN :direction = 'DESC' THEN p.name END DESC, " +
349+
"o.orderDate DESC")
350+
List<Order> findDeliveredOrdersByArtistInPeriodSortedByProductName(
351+
@Param("artist") User artist,
352+
@Param("startDate") java.time.LocalDateTime startDate,
353+
@Param("endDate") java.time.LocalDateTime endDate,
354+
@Param("direction") String direction
355+
);
331356
}

0 commit comments

Comments
 (0)