Skip to content

Commit e52d8a9

Browse files
Merge pull request #626 from Podo-Store/develop
[FEAT] 신청된 공연에서 환불 여부 전달
2 parents 4abd724 + d70d118 commit e52d8a9

6 files changed

Lines changed: 88 additions & 42 deletions

File tree

src/main/java/PodoeMarket/podoemarket/common/repository/ApplicantRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@
77

88
public interface ApplicantRepository extends JpaRepository<ApplicantEntity, Long> {
99
ApplicantEntity findByOrderItemId(UUID orderItem);
10-
Boolean existsByOrderItemId(UUID orderItem);
1110
}

src/main/java/PodoeMarket/podoemarket/common/repository/OrderItemRepository.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,14 @@ SELECT COALESCE(SUM(oi.performanceAmount), 0)
5858
""")
5959
long sumPaidPerformanceAmountByProductId(@Param("productId") UUID productId, @Param("status") OrderStatus status);
6060

61-
List<OrderItemEntity> findAllByProductId(UUID productId);
62-
6361
@Query("""
6462
SELECT oi FROM OrderItemEntity oi
6563
JOIN oi.product p
6664
JOIN p.user u
6765
WHERE p.title LIKE %:keyword%
6866
OR p.writer LIKE %:keyword%
6967
OR u.nickname LIKE %:keyword%
70-
""")
68+
""")
7169
Page<OrderItemEntity> findOrderItemsByKeyword(@Param("keyword") String keyword, Pageable pageable);
7270

7371
Boolean existsByProduct_IdAndUser_IdAndScriptTrueAndOrder_OrderStatusAndCreatedAtAfter(UUID productId, UUID userId, OrderStatus status, LocalDateTime oneYearAgo);
@@ -81,4 +79,15 @@ SELECT MAX(o.createdAt)
8179
AND o.order.orderStatus = :status
8280
""")
8381
LocalDateTime findLastScriptPurchaseDate(@Param("productId") UUID productId, @Param("userId") UUID userId, @Param("status") OrderStatus status);
82+
83+
@Query("""
84+
SELECT DISTINCT o FROM OrderItemEntity o
85+
JOIN FETCH o.applicant
86+
JOIN FETCH o.order
87+
LEFT JOIN FETCH o.performanceDate
88+
WHERE o.product.id = :productId
89+
AND o.performanceAmount >= 1
90+
AND o.applicant IS NOT NULL
91+
""")
92+
List<OrderItemEntity> findOrderItemsWithApplicant(@Param("productId") UUID productId);
8493
}

src/main/java/PodoeMarket/podoemarket/common/repository/RefundRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,4 @@ SELECT r.order.id, COALESCE(SUM(r.quantity), 0)
4343
GROUP BY r.order.id
4444
""")
4545
List<Object[]> sumRefundQuantityByOrderIds(@Param("orderIds") List<Long> orderIds);
46-
4746
}

src/main/java/PodoeMarket/podoemarket/common/repository/UserRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,4 @@ public interface UserRepository extends JpaRepository<UserEntity, Long> {
1414
Boolean existsByEmail(String email);
1515
Boolean existsByNickname(String nickname);
1616
UserEntity findByEmail(String email);
17-
Boolean existsById(UUID id);
1817
}

src/main/java/PodoeMarket/podoemarket/profile/dto/response/RequestedPerformanceResponseDTO.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,6 @@ public static class ApplicantInfo {
6161
@AllArgsConstructor
6262
public static class PerformanceDate {
6363
private LocalDateTime date;
64+
private Boolean isRefunded;
6465
}
6566
}

src/main/java/PodoeMarket/podoemarket/profile/service/MypageService.java

Lines changed: 75 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)