@@ -719,19 +719,39 @@ public ArtistOrderResponse.List getOrders(Long artistId, ArtistOrderSearchReques
719719 }
720720 }
721721
722- // 동적 정렬 처리
723- org .springframework .data .domain .Sort sort = createOrderSort (request .sort (), request .order ());
724- PageRequest pageRequest = PageRequest .of (request .page (), request .size (), sort );
722+ // 상품명 정렬 여부 확인
723+ boolean isProductNameSort = "productName" .equals (request .sort ());
724+
725+ Page <com .back .domain .order .order .entity .Order > orderPage ;
726+
727+ if (isProductNameSort ) {
728+ // 상품명 정렬: 별도 메서드 사용
729+ String direction = request .order () != null ? request .order () : "DESC" ;
730+ PageRequest pageRequest = PageRequest .of (request .page (), request .size ());
731+
732+ orderPage = orderRepository .findOrdersByArtistSortedByProductName (
733+ artistId ,
734+ orderStatus ,
735+ request .keyword (),
736+ startDateTime ,
737+ endDateTime ,
738+ direction ,
739+ pageRequest
740+ );
741+ } else {
742+ // 일반 정렬: 동적 정렬 처리
743+ org .springframework .data .domain .Sort sort = createOrderSort (request .sort (), request .order ());
744+ PageRequest pageRequest = PageRequest .of (request .page (), request .size (), sort );
725745
726- // Repository를 통한 실제 DB 조회
727- Page < com . back . domain . order . order . entity . Order > orderPage = orderRepository . findOrdersByArtist (
728- artistId ,
729- orderStatus ,
730- request . keyword () ,
731- startDateTime ,
732- endDateTime ,
733- pageRequest
734- );
746+ orderPage = orderRepository . findOrdersByArtist (
747+ artistId ,
748+ orderStatus ,
749+ request . keyword () ,
750+ startDateTime ,
751+ endDateTime ,
752+ pageRequest
753+ );
754+ }
735755
736756 // ID 리스트 추출
737757 List <Long > orderIds = orderPage .getContent ().stream ()
@@ -790,8 +810,7 @@ private org.springframework.data.domain.Sort createOrderSort(String sortField, S
790810 case "status" -> org .springframework .data .domain .Sort .by (direction , "status" );
791811 case "totalAmount" -> org .springframework .data .domain .Sort .by (direction , "totalAmount" );
792812 case "customerName" -> org .springframework .data .domain .Sort .by (direction , "user.name" );
793- case "productName" ->
794- org .springframework .data .domain .Sort .by (direction , "orderDate" ); // 상품명 정렬은 복잡하므로 일단 주문일자로 대체
813+ case "productName" -> null ; // 상품명 정렬은 Repository에서 처리
795814 default -> org .springframework .data .domain .Sort .by (direction , "orderDate" );
796815 };
797816 }
@@ -1112,8 +1131,8 @@ private String convertRefundStatusToKorean(com.back.domain.order.refund.entity.R
11121131
11131132 @ Override
11141133 public ArtistExchangeResponse .List getExchangeRequests (Long artistId , ArtistExchangeSearchRequest request ) {
1115- log .info ("작가 교환 요청 목록 조회 시작 - artistId: {}, page: {}, size: {}, status: {}, keyword: {}" ,
1116- artistId , request .page (), request .size (), request .status (), request .keyword ());
1134+ log .info ("작가 교환 요청 목록 조회 시작 - artistId: {}, page: {}, size: {}, status: {}, keyword: {}, sort: {}, order: {} " ,
1135+ artistId , request .page (), request .size (), request .status (), request .keyword (), request . sort (), request . order () );
11171136
11181137 // status 문자열을 ExchangeStatus enum으로 변환
11191138 com .back .domain .order .exchange .entity .Exchange .ExchangeStatus exchangeStatus = null ;
@@ -1130,24 +1149,50 @@ public ArtistExchangeResponse.List getExchangeRequests(Long artistId, ArtistExch
11301149 }
11311150 }
11321151
1133- // Repository를 통한 실제 DB 조회 (최신순 정렬)
1134- Page <com .back .domain .order .exchange .entity .Exchange > exchangePage = exchangeRepository .findExchangesByArtist (
1135- artistId ,
1136- exchangeStatus ,
1137- request .keyword (),
1138- PageRequest .of (request .page (), request .size ())
1139- );
1152+ // 정렬 방향
1153+ String sortOrder = request .order () != null ? request .order () : "DESC" ;
1154+
1155+ // 정렬 필드에 따라 적절한 Repository 메서드 호출
1156+ Page <com .back .domain .order .exchange .entity .Exchange > exchangePage ;
1157+ PageRequest pageRequest = PageRequest .of (request .page (), request .size ());
1158+
1159+ String sortField = request .sort () != null ? request .sort () : "requestDate" ;
1160+
1161+ switch (sortField ) {
1162+ case "productName" -> {
1163+ // 상품명 정렬 (DB 쿼리)
1164+ if ("ASC" .equalsIgnoreCase (sortOrder )) {
1165+ exchangePage = exchangeRepository .findExchangesByArtistSortedByProductNameAsc (
1166+ artistId , exchangeStatus , request .keyword (), pageRequest );
1167+ } else {
1168+ exchangePage = exchangeRepository .findExchangesByArtistSortedByProductNameDesc (
1169+ artistId , exchangeStatus , request .keyword (), pageRequest );
1170+ }
1171+ }
1172+ case "customerName" -> {
1173+ // 구매자 이름 정렬 (DB 쿼리)
1174+ if ("ASC" .equalsIgnoreCase (sortOrder )) {
1175+ exchangePage = exchangeRepository .findExchangesByArtistSortedByCustomerNameAsc (
1176+ artistId , exchangeStatus , request .keyword (), pageRequest );
1177+ } else {
1178+ exchangePage = exchangeRepository .findExchangesByArtistSortedByCustomerNameDesc (
1179+ artistId , exchangeStatus , request .keyword (), pageRequest );
1180+ }
1181+ }
1182+ default -> {
1183+ // 주문일자, 상태 정렬 (Pageable Sort 사용)
1184+ org .springframework .data .domain .Sort sort = createExchangeSort (sortField , sortOrder );
1185+ pageRequest = PageRequest .of (request .page (), request .size (), sort );
1186+ exchangePage = exchangeRepository .findExchangesByArtist (
1187+ artistId , exchangeStatus , request .keyword (), pageRequest );
1188+ }
1189+ }
11401190
11411191 // Entity → DTO 변환
11421192 List <ArtistExchangeResponse .ExchangeRequest > content = exchangePage .getContent ().stream ()
11431193 .map (this ::convertToExchangeDto )
11441194 .toList ();
11451195
1146- // 메모리에서 정렬 (간단한 정렬만 지원)
1147- if (request .sort () != null && !request .sort ().equals ("requestDate" )) {
1148- content = sortExchangesInMemory (content , request .sort (), request .order ());
1149- }
1150-
11511196 int totalPages = exchangePage .getTotalPages ();
11521197 long totalElements = exchangePage .getTotalElements ();
11531198 boolean hasNext = exchangePage .hasNext ();
@@ -1168,36 +1213,18 @@ public ArtistExchangeResponse.List getExchangeRequests(Long artistId, ArtistExch
11681213 }
11691214
11701215 /**
1171- * 메모리에서 교환 요청 정렬 처리
1216+ * 교환 요청 정렬 생성 (requestDate, status 정렬용)
11721217 */
1173- private List <ArtistExchangeResponse .ExchangeRequest > sortExchangesInMemory (
1174- List <ArtistExchangeResponse .ExchangeRequest > list , String sort , String order ) {
1175-
1176- boolean asc = "ASC" .equalsIgnoreCase (order );
1218+ private org .springframework .data .domain .Sort createExchangeSort (String sortField , String sortOrder ) {
1219+ org .springframework .data .domain .Sort .Direction direction =
1220+ "ASC" .equalsIgnoreCase (sortOrder )
1221+ ? org .springframework .data .domain .Sort .Direction .ASC
1222+ : org .springframework .data .domain .Sort .Direction .DESC ;
11771223
1178- return list .stream ()
1179- .sorted ((a , b ) -> {
1180- int cmp = 0 ;
1181- switch (sort ) {
1182- case "productName" :
1183- String nameA = a .orderItem () != null ? a .orderItem ().productName () : "" ;
1184- String nameB = b .orderItem () != null ? b .orderItem ().productName () : "" ;
1185- cmp = nameA .compareTo (nameB );
1186- break ;
1187- case "customerName" :
1188- String customerA = a .customer () != null ? a .customer ().nickname () : "" ;
1189- String customerB = b .customer () != null ? b .customer ().nickname () : "" ;
1190- cmp = customerA .compareTo (customerB );
1191- break ;
1192- case "status" :
1193- cmp = a .status ().compareTo (b .status ());
1194- break ;
1195- default :
1196- cmp = a .requestDate ().compareTo (b .requestDate ());
1197- }
1198- return asc ? cmp : -cmp ;
1199- })
1200- .toList ();
1224+ return switch (sortField ) {
1225+ case "status" -> org .springframework .data .domain .Sort .by (direction , "status" );
1226+ default -> org .springframework .data .domain .Sort .by (direction , "createDate" ); // requestDate
1227+ };
12011228 }
12021229
12031230 /**
@@ -1640,11 +1667,25 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16401667 ArtistSettlementSearchRequest request ,
16411668 Long artistId ) {
16421669
1643- // 1. 배송 완료된 주문 조회 (정렬 없이 전체 조회)
1644- List <com .back .domain .order .order .entity .Order > allOrders =
1645- 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+ }
16461687
1647- // 2 . 주문을 OrderItem 단위로 변환 (작가의 상품만)
1688+ // 3 . 주문을 OrderItem 단위로 변환 (작가의 상품만)
16481689 List <SettlementOrderItem > settlementItems = allOrders .stream ()
16491690 .flatMap (order -> order .getOrderItems ().stream ()
16501691 .filter (item -> item .getProduct ().getUser ().getId ().equals (artistId ))
@@ -1657,17 +1698,19 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16571698 )))
16581699 .toList ();
16591700
1660- // 3. 정렬 적용
1661- settlementItems = sortSettlementItems (settlementItems , request .sort (), request .order ());
1701+ // 4. 정렬 적용 (상품명 정렬이 아닌 경우만 메모리 정렬)
1702+ if (!isProductNameSort ) {
1703+ settlementItems = sortSettlementItems (settlementItems , sortField , sortOrder );
1704+ }
16621705
1663- // 4 . 페이징 처리
1706+ // 5 . 페이징 처리
16641707 int start = request .page () * request .size ();
16651708 int end = Math .min (start + request .size (), settlementItems .size ());
16661709 List <SettlementOrderItem > pagedItems = start < settlementItems .size ()
16671710 ? settlementItems .subList (start , end )
16681711 : List .of ();
16691712
1670- // 5 . DTO 변환
1713+ // 6 . DTO 변환
16711714 List <ArtistSettlementResponse .Settlement > content = pagedItems .stream ()
16721715 .map (this ::convertToSettlementDtoFromOrder )
16731716 .toList ();
@@ -1689,7 +1732,8 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16891732 }
16901733
16911734 /**
1692- * 정산 아이템 정렬
1735+ * 정산 아이템 정렬 (메모리 정렬)
1736+ * productName 정렬은 DB에서 처리하므로 여기서는 제외
16931737 */
16941738 private List <SettlementOrderItem > sortSettlementItems (
16951739 List <SettlementOrderItem > items , String sortField , String sortOrder ) {
@@ -1699,6 +1743,7 @@ private List<SettlementOrderItem> sortSettlementItems(
16991743 return items .stream ()
17001744 .sorted ((a , b ) -> {
17011745 int cmp = switch (sortField ) {
1746+ case "productName" -> a .productName .compareTo (b .productName );
17021747 case "grossAmount" -> Integer .compare (a .grossAmount , b .grossAmount );
17031748 case "commission" -> Integer .compare (a .grossAmount / 10 , b .grossAmount / 10 );
17041749 case "netAmount" -> Integer .compare (a .grossAmount * 9 / 10 , b .grossAmount * 9 / 10 );
0 commit comments