@@ -840,52 +840,91 @@ private RequestedPerformanceResponseDTO.ProductInfo getProductInfo(final UUID pr
840840 }
841841 }
842842
843- private List <RequestedPerformanceResponseDTO .DateRequestedList > getDateRequestedList (final UUID productId ) {
843+ private List <RequestedPerformanceResponseDTO .DateRequestedList > getDateRequestedList (final UUID productId ) {
844844 try {
845- // 모든 주문 데이터 가져오기
846- final List <OrderItemEntity > orderItems = orderItemRepo .findAllByProductId (productId );
845+ final List <OrderItemEntity > orderItems = orderItemRepo .findOrderItemsWithApplicant (productId );
847846
848- List < OrderItemEntity > filteredOrderItems = orderItems .stream ( )
849- . filter ( orderItem -> orderItem . getPerformanceAmount () >= 1 )
850- . filter ( orderItem -> orderItem . getApplicant () != null )
851- . toList ( );
847+ if ( orderItems .isEmpty () )
848+ return Collections . emptyList ();
849+
850+ final Map < Long , Integer > refundMap = getRefundQuantityMap ( orderItems );
852851
853- // 날짜별 그룹화
854- Map <LocalDate , List <OrderItemEntity >> groupedByOrderDate = filteredOrderItems .stream ()
855- .collect (Collectors .groupingBy (orderItem -> orderItem .getCreatedAt ().toLocalDate ()));
852+ final Map <LocalDate , List <OrderItemEntity >> groupedByDate = orderItems .stream ()
853+ .collect (Collectors .groupingBy (o -> o .getCreatedAt ().toLocalDate ()));
856854
857- return groupedByOrderDate .entrySet ().stream ()
855+ return groupedByDate .entrySet ().stream ()
858856 .sorted (Map .Entry .<LocalDate , List <OrderItemEntity >>comparingByKey ().reversed ())
859- .map (entry -> {
860- LocalDate date = entry .getKey ();
861- List <OrderItemEntity > orderItemList = entry .getValue ();
862-
863- // 각 주문에 대한 신청자 정보
864- List <RequestedPerformanceResponseDTO .ApplicantInfo > applicantInfoList = orderItemList .stream ()
865- .sorted (Comparator .comparing (OrderItemEntity ::getCreatedAt ).reversed ())
866- .map (orderItem -> RequestedPerformanceResponseDTO .ApplicantInfo .builder ()
867- .amount (orderItem .getPerformanceAmount ())
868- .name (orderItem .getApplicant ().getName ())
869- .phoneNumber (orderItem .getApplicant ().getPhoneNumber ())
870- .address (orderItem .getApplicant ().getAddress ())
871- .performanceDateList (orderItem .getPerformanceDate ().stream ()
872- .map (performanceDate -> RequestedPerformanceResponseDTO .PerformanceDate .builder ()
873- .date (performanceDate .getDate ())
874- .build ())
875- .collect (Collectors .toList ()))
876- .build ())
877- .toList ();
878-
879- return RequestedPerformanceResponseDTO .DateRequestedList .builder ()
880- .date (date )
881- .requestedInfo (applicantInfoList )
882- .build ();
883- }).toList ();
857+ .map (entry -> buildDateRequestedList (entry , refundMap ))
858+ .toList ();
884859 } catch (Exception e ) {
885860 throw new RuntimeException ("날짜별 요청 목록 조회 실패" , e );
886861 }
887862 }
888863
864+ private RequestedPerformanceResponseDTO .DateRequestedList buildDateRequestedList (Map .Entry <LocalDate , List <OrderItemEntity >> entry , Map <Long , Integer > refundMap ) {
865+ try {
866+ final LocalDate date = entry .getKey ();
867+
868+ final List <RequestedPerformanceResponseDTO .ApplicantInfo > applicants =
869+ entry .getValue ().stream ()
870+ .sorted (Comparator .comparing (OrderItemEntity ::getCreatedAt ).reversed ())
871+ .map (orderItem -> buildApplicantInfo (orderItem , refundMap ))
872+ .toList ();
873+
874+ return RequestedPerformanceResponseDTO .DateRequestedList .builder ()
875+ .date (date )
876+ .requestedInfo (applicants )
877+ .build ();
878+ } catch (Exception e ) {
879+ throw new RuntimeException ("날짜별 DTO 생성" , e );
880+ }
881+ }
882+
883+ private RequestedPerformanceResponseDTO .ApplicantInfo buildApplicantInfo (OrderItemEntity orderItem , Map <Long , Integer > refundMap ) {
884+ try {
885+ final Long orderId = orderItem .getOrder ().getId ();
886+
887+ final int totalAmount = orderItem .getPerformanceAmount ();
888+ final int refundedAmount = refundMap .getOrDefault (orderId , 0 );
889+
890+ final int validCount = Math .max (0 , totalAmount - refundedAmount );
891+
892+ final List <RequestedPerformanceResponseDTO .PerformanceDate > performanceDates = buildPerformanceDates (orderItem .getPerformanceDate (), totalAmount , validCount );
893+
894+ return RequestedPerformanceResponseDTO .ApplicantInfo .builder ()
895+ .amount (totalAmount )
896+ .name (orderItem .getApplicant ().getName ())
897+ .phoneNumber (orderItem .getApplicant ().getPhoneNumber ())
898+ .address (orderItem .getApplicant ().getAddress ())
899+ .performanceDateList (performanceDates )
900+ .build ();
901+ } catch (Exception e ) {
902+ throw new RuntimeException ("신청자 dto 생성 실패" , e );
903+ }
904+ }
905+
906+ private List <RequestedPerformanceResponseDTO .PerformanceDate > buildPerformanceDates (List <PerformanceDateEntity > dates , int totalAmount , int validCount ) {
907+ try {
908+ final List <RequestedPerformanceResponseDTO .PerformanceDate > result = new ArrayList <>();
909+
910+ final int size = !dates .isEmpty () ? dates .size () : totalAmount ;
911+
912+ for (int i = 0 ; i < size ; i ++) {
913+ final boolean isRefunded = i >= validCount ;
914+
915+ result .add (RequestedPerformanceResponseDTO .PerformanceDate .builder ()
916+ .date (!dates .isEmpty () ? dates .get (i ).getDate () : null )
917+ .isRefunded (isRefunded )
918+ .build ()
919+ );
920+ }
921+
922+ return result ;
923+ } catch (Exception e ) {
924+ throw new RuntimeException ("공연 신청 목록 전체 로딩 실패" , e );
925+ }
926+ }
927+
889928 private void deleteScripts (final ProductEntity product ) {
890929 try {
891930 final String filePath = product .getFilePath ().replace ("script" , "delete" );
0 commit comments