diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java new file mode 100644 index 0000000..bce81e6 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/PrevOrderSearch.java @@ -0,0 +1,31 @@ +package com.justpickup.orderservice.domain.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +@Data @NoArgsConstructor @AllArgsConstructor +public class PrevOrderSearch { + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "시작일은 필수 값입니다.") + private LocalDate startDate; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "종료일은 필수 값입니다.") + private LocalDate endDate; + + public LocalDateTime getStartDateTime() { + return startDate.atStartOfDay(); + } + + public LocalDateTime getEndDateTime() { + return LocalDateTime.of(endDate, LocalTime.of(23, 59, 59)); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java index 7b178e7..111d54a 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java @@ -1,10 +1,14 @@ package com.justpickup.orderservice.domain.order.repository; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.Order; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; @@ -48,4 +52,32 @@ public class OrderRepositoryCustom { return lastOrderId != null ? order.id.lt(lastOrderId) : null; } + public Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId) { + // 카운트 가져오기 + Long count = queryFactory + .select(order.countDistinct()) + .from(order) + .innerJoin(order.transaction) + .where( + order.orderTime.between(search.getStartDateTime(), search.getEndDateTime()), + order.storeId.eq(storeId) + ) + .fetchOne(); + + // 데이터 가져오기 + List orders = queryFactory + .selectFrom(order) + .join(order.transaction).fetchJoin() + .where( + order.orderTime.between(search.getStartDateTime(), search.getEndDateTime()), + order.storeId.eq(storeId) + ) + .orderBy(order.orderTime.desc()) + .limit(1) + .offset(pageable.getOffset()) + .distinct() + .fetch(); + + return PageableExecutionUtils.getPage(orders, pageable, () -> count); + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java index 6c9e6b8..6dda0d7 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java @@ -2,9 +2,14 @@ package com.justpickup.orderservice.domain.order.service; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.List; public interface OrderService { List findOrderMain(OrderSearchCondition condition, Long storeId); + + Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId); } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java index 87c0db6..7a3bc8f 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java @@ -2,6 +2,8 @@ package com.justpickup.orderservice.domain.order.service; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import com.justpickup.orderservice.domain.order.entity.Order; import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom; import com.justpickup.orderservice.global.client.store.GetItemResponse; @@ -10,6 +12,9 @@ import com.justpickup.orderservice.global.client.user.GetCustomerResponse; import com.justpickup.orderservice.global.client.user.UserClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,4 +57,16 @@ public class OrderServiceImpl implements OrderService { return orderDtoList; } + + @Override + public Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId) { + Page orderPage = orderRepositoryCustom.findPrevOrderMain(search, pageable, storeId); + + List orderDtoList = orderPage.getContent() + .stream() + .map(OrderDto::createFullField) + .collect(Collectors.toList()); + + return PageableExecutionUtils.getPage(orderDtoList, pageable, orderPage::getTotalElements); + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java new file mode 100644 index 0000000..bc2102c --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/validator/PrevOrderSearchValidator.java @@ -0,0 +1,28 @@ +package com.justpickup.orderservice.domain.order.validator; + +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +import java.time.LocalDate; + +@Component +public class PrevOrderSearchValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return PrevOrderSearch.class.equals(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + PrevOrderSearch search = (PrevOrderSearch) target; + + LocalDate startDate = search.getStartDate(); + LocalDate endDate = search.getEndDate(); + if (startDate.isAfter(endDate)) { + errors.rejectValue("startDate", "isAfter", "시작일은 종료일보다 클 수 없습니다."); + } + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java index c55c363..8e0d972 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java @@ -2,8 +2,10 @@ package com.justpickup.orderservice.domain.order.web; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; +import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.service.OrderService; +import com.justpickup.orderservice.domain.order.validator.PrevOrderSearchValidator; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.global.dto.Result; import lombok.AllArgsConstructor; @@ -11,8 +13,13 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -27,6 +34,7 @@ import java.util.stream.Collectors; public class OrderController { private final OrderService orderService; + private final PrevOrderSearchValidator prevOrderSearchValidator; @GetMapping("/orderMain") public ResponseEntity orderMain(@Valid OrderSearchCondition condition) { @@ -81,4 +89,17 @@ public class OrderController { this.itemName = orderItemDto.getItemName(); } } + + @GetMapping("/prevOrder") + public ResponseEntity findPrevOrder(@Valid PrevOrderSearch prevOrderSearch, + @PageableDefault(page = 0, size = 1) Pageable pageable, + BindingResult bindingResult) throws BindException { + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + prevOrderSearchValidator.validate(prevOrderSearch, bindingResult); + if (bindingResult.hasErrors()) throw new BindException(bindingResult); + + Page prevOrderMain = orderService.findPrevOrderMain(prevOrderSearch, pageable, 1L); + + return ResponseEntity.ok(Result.createSuccessResult(prevOrderMain)); + } }