Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ dependencies {
annotationProcessor "com.querydsl:querydsl-apt::jakarta"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"


compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.irum.come2us.domain.order.application.mapper;

import com.irum.come2us.domain.order.domain.entity.Order;
import com.irum.come2us.domain.order.domain.entity.OrderDetail;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderDetailRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderSummaryRow;
import com.irum.come2us.domain.order.presentation.dto.response.AddressResponse;
import com.irum.come2us.domain.order.presentation.dto.response.CustomerOrderListResponse;
import com.irum.come2us.domain.order.presentation.dto.response.OrderDetailResponse;
import com.irum.come2us.domain.refund.domain.entity.Refund;
import com.irum.come2us.domain.refund.domain.entity.enums.RefundStatus;
import java.util.List;
import org.springframework.stereotype.Component;

@Component
public class CustomerOrderMapper {

public static OrderDetailResponse toOrderDetailResponse(
Order order, List<OrderDetail> orderDetailList, Refund refund) {
List<OrderDetailResponse.ProductResponse> pList =
orderDetailList.stream().map(CustomerOrderMapper::toProductResponse).toList();

RefundStatus refundStatus;
if (refund == null) {
refundStatus = null;
} else {
refundStatus = refund.getRefundStatus();
}

return OrderDetailResponse.builder()
.orderAt(order.getCreatedAt())
.paymentStatus(order.getPayment().getPaymentStatus())
.paymentMethod(order.getPayment().getPaymentMethod())
.deliveryFee(order.getDeliveryFee())
.discountAmount(order.getPayment().getTotalDiscountAmount())
.totalProductPrice(order.getTotalPrice())
.totalPaymentPrice(order.getPayment().getAmount())
.orderStatusAll(order.getOrderStatusAll())
.refundStatus(refundStatus)
.deliveryRequest(order.getDeliveryRequest())
.address(AddressResponse.from(order.getDeliveryAddress().getAddress()))
.recipientContact(order.getDeliveryAddress().getRecipientContact())
.recipientName(order.getDeliveryAddress().getRecipientName())
.productResponseList(pList)
.build();
}

private static OrderDetailResponse.ProductResponse toProductResponse(OrderDetail orderDetail) {

return OrderDetailResponse.ProductResponse.builder()
.receivedDate(orderDetail.getArrivedDate().toLocalDate())
.productName(orderDetail.getProductName())
.optionTitle(orderDetail.getOptionName())
.price(orderDetail.getPrice())
.quantity(orderDetail.getQuantity())
.build();
}

public static CustomerOrderListResponse.OrderResponse toOrderResponse(
CustomerOrderSummaryRow or, List<CustomerOrderListResponse.ProductResponse> pList) {

return CustomerOrderListResponse.OrderResponse.builder()
.orderId(or.orderId())
.orderAt(or.orderAt())
.refundStatus(or.refundStatus())
.productResponseList(pList)
.build();
}

public static CustomerOrderListResponse.ProductResponse toProductResponse(
CustomerOrderDetailRow c) {
return CustomerOrderListResponse.ProductResponse.builder()
.orderStatus(c.orderStatusIndi())
.orderDetailId(c.orderDetailId())
.optionName(c.optionName())
.price(c.price())
.productName(c.productName())
.quantity(c.quantity())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@

@Component
public class OrderMapper {
/** Repository DTO -> Response DTO로 변환 */

// TODO: builder로 리팩터링
public OwnerOrderListResponse.ProductSummary toProductSummary(OrderDetailRow detail) {
return new OwnerOrderListResponse.ProductSummary(
detail.orderDetailId(),
Expand All @@ -18,7 +19,6 @@ public OwnerOrderListResponse.ProductSummary toProductSummary(OrderDetailRow det
detail.optionTitle());
}

/** Repository DTO -> Response DTO로 변환 */
public OwnerOrderListResponse.OrderSummary toOrderSummary(
OrderSummaryRow header, List<OwnerOrderListResponse.ProductSummary> products) {
return new OwnerOrderListResponse.OrderSummary(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package com.irum.come2us.domain.order.application.service;

import com.irum.come2us.domain.member.domain.entity.Member;
import com.irum.come2us.domain.order.application.mapper.CustomerOrderMapper;
import com.irum.come2us.domain.order.domain.entity.Order;
import com.irum.come2us.domain.order.domain.entity.OrderDetail;
import com.irum.come2us.domain.order.domain.repository.OrderDetailRepository;
import com.irum.come2us.domain.order.domain.repository.OrderRepository;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderDetailRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderSummaryRow;
import com.irum.come2us.domain.order.presentation.dto.response.CustomerOrderListResponse;
import com.irum.come2us.domain.order.presentation.dto.response.OrderDetailResponse;
import com.irum.come2us.domain.order.presentation.dto.response.OrderDetailStatusResponse;
import com.irum.come2us.domain.refund.domain.entity.Refund;
import com.irum.come2us.domain.refund.domain.repository.RefundRepository;
import com.irum.come2us.global.presentation.advice.exception.CommonException;
import com.irum.come2us.global.presentation.advice.exception.errorcode.OrderErrorCode;
import com.irum.come2us.global.util.MemberUtil;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Slf4j
@RequiredArgsConstructor
@Transactional
public class CustomerOrderService {
private final OrderDetailRepository orderDetailRepository;
private final OrderRepository orderRepository;
private final RefundRepository refundRepository;
private final MemberUtil memberUtil;

@Transactional(readOnly = true)
public OrderDetailStatusResponse getOrderDetailStatus(UUID orderDetailId) {
OrderDetail orderDetail =
orderDetailRepository
.findByOrderDetailId(orderDetailId)
.orElseThrow(
() -> new CommonException(OrderErrorCode.ORDER_DETAIL_NOT_FOUND));

return OrderDetailStatusResponse.from(orderDetail);
}

@Transactional(readOnly = true)
public OrderDetailResponse getOrderDetail(UUID orderId) {
Comment thread
hyeonji91 marked this conversation as resolved.
Order order =
orderRepository
.findByOrderId(orderId)
.orElseThrow(() -> new CommonException(OrderErrorCode.ORDER_NOT_FOUND));

List<OrderDetail> orderDetailList = orderDetailRepository.findAllByOrder(order);

Refund refund = refundRepository.findByOrder(order).orElse(null);

return CustomerOrderMapper.toOrderDetailResponse(order, orderDetailList, refund);
}

@Transactional
public CustomerOrderListResponse getOrderList(
UUID cursor, int size, LocalDate startDate, LocalDate endDate) {

Member member = memberUtil.getCurrentMember();
log.info("member {}", member.getMemberId());

// 2. order list 검색
List<CustomerOrderSummaryRow> headerList =
orderRepository.fetchOrderListByMember(member, startDate, endDate, cursor, size);
log.info("order list {}", headerList);

boolean hasNext = headerList.size() > size;
if (hasNext) {
headerList = headerList.subList(0, size);
}
log.info("hasNext {}", hasNext);

// 3. order id list
List<UUID> orderIdList = headerList.stream().map(CustomerOrderSummaryRow::orderId).toList();
List<CustomerOrderDetailRow> orderDetailList =
orderRepository.fetchOrderDetailListByMember(orderIdList);
log.info("orderDetailList ", orderDetailList);
Comment thread
hyeonji91 marked this conversation as resolved.
Outdated

// 4. orderId로 그룹핑 : productSummary 제작
Map<UUID, List<CustomerOrderListResponse.ProductResponse>> detailMap =
orderDetailList.stream()
.collect(
Collectors.groupingBy(
CustomerOrderDetailRow::orderId,
Collectors.mapping(
CustomerOrderMapper::toProductResponse,
Collectors.toList())));

// 5. orderResponse 제작
List<CustomerOrderListResponse.OrderResponse> orderResponseList =
headerList.stream()
.filter(order -> detailMap.containsKey(order.orderId()))
.map(
order ->
CustomerOrderMapper.toOrderResponse(
order,
detailMap.getOrDefault(
order.orderId(),
List.of()) // order detail 없다면 빈 리스트
))
.toList();

// 6. next cursor계산
UUID nextCursor = orderResponseList.isEmpty() ? null : headerList.getLast().orderId();

return CustomerOrderListResponse.builder()
.orderList(orderResponseList)
.hasNext(hasNext)
.nextCursor(nextCursor)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.irum.come2us.domain.order.domain.entity.enums.OrderStatus;
import com.irum.come2us.domain.order.domain.repository.OrderDetailRepository;
import com.irum.come2us.domain.order.domain.repository.OrderRepository;
import com.irum.come2us.domain.order.domain.repository.OrderRepositoryCustom;
import com.irum.come2us.domain.order.infrastructure.repository.dto.OrderDetailRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.OrderSummaryRow;
import com.irum.come2us.domain.order.presentation.dto.request.OwnerOrderShippedRequest;
Expand All @@ -29,7 +28,6 @@
public class OrderService {
private final OrderDetailRepository orderDetailRepository;
private final OrderRepository orderRepository;
private final OrderRepositoryCustom orderRepositoryCustom;
private final OrderMapper orderMapper;

@Transactional(readOnly = true)
Expand Down Expand Up @@ -79,8 +77,7 @@ private OwnerOrderListResponse getOwnerOrderList(
UUID storeId, OrderStatus orderStatus, UUID cursor, Integer size) {

// 2. order list 검색
var headerList =
orderRepositoryCustom.fetchOrderHeaderList(storeId, orderStatus, cursor, size);
var headerList = orderRepository.fetchOrderHeaderList(storeId, orderStatus, cursor, size);

boolean hasNext = headerList.size() > size;
if (hasNext) {
Expand All @@ -89,7 +86,7 @@ private OwnerOrderListResponse getOwnerOrderList(

// 3. order detail 검색
var orderIdList = headerList.stream().map(OrderSummaryRow::orderId).toList();
var orderDetailList = orderRepositoryCustom.fetchOrderDetailList(orderIdList);
List<OrderDetailRow> orderDetailList = orderRepository.fetchOrderDetailList(orderIdList);

// 4. orderId로 그룹핑 : productSummary 제작
Map<UUID, List<OwnerOrderListResponse.ProductSummary>> detailMap =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package com.irum.come2us.domain.order.domain.repository;

import com.irum.come2us.domain.member.domain.entity.Member;
import com.irum.come2us.domain.order.domain.entity.Order;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderRepository extends JpaRepository<Order, UUID> {
public interface OrderRepository extends JpaRepository<Order, UUID>, OrderRepositoryCustom {
Optional<Order> findByOrderId(UUID orderId);

List<Order> findAllByMember(Member member);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.irum.come2us.domain.order.domain.repository;

import com.irum.come2us.domain.member.domain.entity.Member;
import com.irum.come2us.domain.order.domain.entity.enums.OrderStatus;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderDetailRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.CustomerOrderSummaryRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.OrderDetailRow;
import com.irum.come2us.domain.order.infrastructure.repository.dto.OrderSummaryRow;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;

Expand All @@ -11,4 +15,9 @@ List<OrderSummaryRow> fetchOrderHeaderList(
UUID storeId, OrderStatus orderStatus, UUID cursor, int size);

List<OrderDetailRow> fetchOrderDetailList(List<UUID> orderIdList);

List<CustomerOrderSummaryRow> fetchOrderListByMember(
Member member, LocalDate startDate, LocalDate endDate, UUID cursor, int size);

List<CustomerOrderDetailRow> fetchOrderDetailListByMember(List<UUID> orderIdList);
}
Loading