feat(order): 점주용 지난 주문 Back-end 구현

- Validator 추가
- Pageable 추가
This commit is contained in:
bum12ark
2022-02-10 20:25:38 +09:00
parent c3b0ce4d17
commit 911fc6d192
6 changed files with 134 additions and 0 deletions

View File

@@ -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));
}
}

View File

@@ -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<Order> 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<Order> 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);
}
}

View File

@@ -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<OrderDto> findOrderMain(OrderSearchCondition condition, Long storeId);
Page<OrderDto> findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId);
}

View File

@@ -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<OrderDto> findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId) {
Page<Order> orderPage = orderRepositoryCustom.findPrevOrderMain(search, pageable, storeId);
List<OrderDto> orderDtoList = orderPage.getContent()
.stream()
.map(OrderDto::createFullField)
.collect(Collectors.toList());
return PageableExecutionUtils.getPage(orderDtoList, pageable, orderPage::getTotalElements);
}
}

View File

@@ -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", "시작일은 종료일보다 클 수 없습니다.");
}
}
}

View File

@@ -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<Result> 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<OrderDto> prevOrderMain = orderService.findPrevOrderMain(prevOrderSearch, pageable, 1L);
return ResponseEntity.ok(Result.createSuccessResult(prevOrderMain));
}
}