From 74f2dc461f4974fa010858bbef1405406fce180b Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 21 Mar 2022 17:45:34 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat(order):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사용자 정보 Feign 클라이언트 호출 - 아이템 정보 Feign 클라이언트 호출 - 아이템 옵션 정보 Feign 클라이언트 호출 --- .../domain/order/dto/OrderDetailDto.java | 85 ++++++++++++++++++ .../domain/order/service/OrderService.java | 1 + .../order/service/OrderServiceImpl.java | 65 +++++++++++++- .../domain/order/web/OrderController.java | 90 +++++++++++++++++-- .../repository/OrderItemRepositoryCustom.java | 27 ++++++ .../global/client/store/GetItemResponse.java | 1 - .../client/store/ItemOptionsResponse.java | 10 +++ .../global/client/store/StoreClient.java | 13 ++- .../exception/GlobalExceptionHandler.java | 2 + 9 files changed, 282 insertions(+), 12 deletions(-) create mode 100644 order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java create mode 100644 order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepositoryCustom.java create mode 100644 order-service/src/main/java/com/justpickup/orderservice/global/client/store/ItemOptionsResponse.java diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java new file mode 100644 index 0000000..7f6752a --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java @@ -0,0 +1,85 @@ +package com.justpickup.orderservice.domain.order.dto; + +import com.justpickup.orderservice.domain.order.entity.Order; +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption; +import com.justpickup.orderservice.global.client.store.OptionType; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +public class OrderDetailDto { + + private Long id; + private LocalDateTime orderTime; + private Long orderPrice; + private OrderDetailUser user; + private List orderItems = new ArrayList<>(); + + public static OrderDetailDto of(Order order, List orderItems, OrderDetailUser orderDetailUser) { + OrderDetailDto orderDetailDto = new OrderDetailDto(); + orderDetailDto.id = order.getId(); + orderDetailDto.orderTime = order.getOrderTime(); + orderDetailDto.orderPrice = order.getOrderPrice(); + + orderDetailDto.user = orderDetailUser; + orderDetailDto.orderItems = orderItems; + return orderDetailDto; + } + + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) + public static class OrderDetailUser { + private Long id; + private String name; + private String phoneNumber; + + @Builder + public OrderDetailUser(Long id, String name, String phoneNumber) { + this.id = id; + this.name = name; + this.phoneNumber = phoneNumber; + } + } + + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) + public static class OrderDetailItem { + private Long id; + private Long itemId; + private long totalPrice; + private long count; + private String name; + private List options = new ArrayList<>(); + + public static OrderDetailItem of(OrderItem orderItem, String name, List orderDetailItemOption) { + OrderDetailItem orderDetailItem = new OrderDetailItem(); + orderDetailItem.id = orderItem.getId(); + orderDetailItem.itemId = orderItem.getItemId(); + orderDetailItem.totalPrice = orderItem.getTotalPrice(); + orderDetailItem.count = orderItem.getCount(); + orderDetailItem.name = name; + orderDetailItem.options = orderDetailItemOption; + return orderDetailItem; + } + + } + + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) + public static class OrderDetailItemOption { + private Long id; + private Long itemOptionId; + private String name; + private OptionType optionType; + + public static OrderDetailItemOption of(OrderItemOption orderItemOption, String name, OptionType optionType) { + OrderDetailItemOption orderDetailItemOption = new OrderDetailItemOption(); + orderDetailItemOption.id = orderItemOption.getId(); + orderDetailItemOption.itemOptionId = orderItemOption.getItemOptionId(); + orderDetailItemOption.name = name; + orderDetailItemOption.optionType = optionType; + return orderDetailItemOption; + } + } +} 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 846671e..e3bf7cd 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 @@ -15,4 +15,5 @@ public interface OrderService { FetchOrderDto fetchOrder(Long userId); void saveOrder(Long userId); void modifyOrder(Long userId, OrderStatus orderStatus); + OrderDetailDto findOrderDetail(Long orderId); } 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 bb9e53f..b7e6b9f 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 @@ -8,11 +8,10 @@ import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import com.justpickup.orderservice.domain.orderItem.repository.OrderItemRepositoryCustom; import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption; -import com.justpickup.orderservice.global.client.store.GetItemResponse; -import com.justpickup.orderservice.global.client.store.GetStoreResponse; -import com.justpickup.orderservice.global.client.store.StoreByUserIdResponse; -import com.justpickup.orderservice.global.client.store.StoreClient; +import com.justpickup.orderservice.global.client.store.*; +import com.justpickup.orderservice.global.client.user.GetCustomerResponse; import com.justpickup.orderservice.global.client.user.UserClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; +import static com.justpickup.orderservice.domain.order.dto.OrderDetailDto.*; import static java.util.stream.Collectors.toList; @Service @@ -36,6 +36,7 @@ public class OrderServiceImpl implements OrderService { private final OrderRepository orderRepository; private final OrderRepositoryCustom orderRepositoryCustom; + private final OrderItemRepositoryCustom orderItemRepositoryCustom; private final StoreClient storeClient; private final UserClient userClient; @@ -234,4 +235,60 @@ public class OrderServiceImpl implements OrderService { order.setOrderStatus(orderStatus); } + @Override + public OrderDetailDto findOrderDetail(Long orderId) { + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new OrderException(orderId + "는 없는 주문 번호입니다.")); + + List orderItemsWithOptions = orderItemRepositoryCustom.getOrderItemsWithOptions(order.getId()); + + // 고객 정보 가져오기 + GetCustomerResponse customerInfo = userClient.getCustomerById(order.getUserId()).getData(); + + Set itemIds = new HashSet<>(); + Set itemOptionIds = new HashSet<>(); + + // 아이템 이름 및 옵션 이름 가져오기 + for (OrderItem orderItem : orderItemsWithOptions) { + itemIds.add(orderItem.getItemId()); + for (OrderItemOption orderItemOption : orderItem.getOrderItemOptions()) { + itemOptionIds.add(orderItemOption.getItemOptionId()); + } + } + + Map itemNameMap = storeClient.getItemNameMap(itemIds); + Map itemOptionMap = storeClient.getItemOptionMap(itemOptionIds); + + List orderDetailItems = orderItemsWithOptions.stream() + .map(orderItem -> { + // 주문 상세 옵션 생성 + List orderDetailItemOptions = orderItem.getOrderItemOptions() + .stream() + .map(orderItemOption -> { + // 옵션 아이디에 해당하는 아이템 옵션 객체 가져오기 + ItemOptionsResponse itemOptionsResponse = itemOptionMap.get(orderItemOption.getItemOptionId()); + + return OrderDetailItemOption.of( + orderItemOption, + itemOptionsResponse.getName(), + itemOptionsResponse.getOptionType() + ); + }) + .collect(toList()); + // 아이템 아이디에 해당하는 아이템 이름 가져오기 + String itemName = itemNameMap.get(orderItem.getItemId()); + return OrderDetailItem.of(orderItem, itemName, orderDetailItemOptions); + }) + .collect(toList()); + + // 주문한 사용자 정보 생성 + OrderDetailUser orderDetailUser = OrderDetailUser.builder() + .id(customerInfo.getUserId()) + .phoneNumber(customerInfo.getPhoneNumber()) + .name(customerInfo.getUserName()) + .build(); + + return OrderDetailDto.of(order, orderDetailItems, orderDetailUser); + } + } 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 7639088..79e01a9 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 @@ -1,8 +1,10 @@ package com.justpickup.orderservice.domain.order.web; +import com.justpickup.orderservice.domain.order.dto.OrderDetailDto; import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.exception.OrderException; import com.justpickup.orderservice.domain.order.service.OrderService; +import com.justpickup.orderservice.global.client.store.OptionType; import com.justpickup.orderservice.global.dto.Result; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,10 +12,12 @@ import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; @RestController @RequiredArgsConstructor @@ -26,7 +30,7 @@ public class OrderController { public ResponseEntity patchOrder(@PathVariable("orderId") Long orderId, @RequestBody PatchOrderRequest patchOrderRequest) { OrderStatus orderStatus = patchOrderRequest.getOrderStatus(); - if (orderStatus == OrderStatus.PENDING && orderStatus != OrderStatus.FAILED) { + if (orderStatus == OrderStatus.PENDING && orderStatus == OrderStatus.FAILED) { throw new OrderException(orderStatus.getMessage() + "는 변경 불가능합니다."); } @@ -39,4 +43,80 @@ public class OrderController { static class PatchOrderRequest { private OrderStatus orderStatus; } + + @GetMapping("/api/order-detail/{orderId}") + public ResponseEntity getOrderDetail(@PathVariable Long orderId) { + + OrderDetailDto orderDetail = orderService.findOrderDetail(orderId); + + return ResponseEntity.ok(Result.createSuccessResult(new OrderDetailResponse(orderDetail))); + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class OrderDetailResponse { + private Long id; + private String orderTime; + private Long orderPrice; + private OrderDetailUserResponse user; + private List orderItems = new ArrayList<>(); + + public OrderDetailResponse(OrderDetailDto dto) { + this.id = dto.getId(); + this.orderTime = dto.getOrderTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + this.orderPrice = dto.getOrderPrice(); + this.user = new OrderDetailUserResponse(dto.getUser()); + this.orderItems = dto.getOrderItems().stream() + .map(OrderDetailItemResponse::new) + .collect(Collectors.toList()); + } + + @Data + static class OrderDetailUserResponse { + private Long id; + private String name; + private String phoneNumber; + + public OrderDetailUserResponse(OrderDetailDto.OrderDetailUser user) { + this.id = user.getId(); + this.name = user.getName(); + this.phoneNumber = user.getPhoneNumber(); + } + } + + @Data @NoArgsConstructor + static class OrderDetailItemResponse { + private Long id; + private Long itemId; + private long totalPrice; + private long count; + private String name; + private List options = new ArrayList<>(); + + public OrderDetailItemResponse(OrderDetailDto.OrderDetailItem orderDetailItem) { + this.id = orderDetailItem.getId(); + this.itemId = orderDetailItem.getItemId(); + this.totalPrice = orderDetailItem.getTotalPrice(); + this.count = orderDetailItem.getCount(); + this.name = orderDetailItem.getName(); + this.options = orderDetailItem.getOptions().stream() + .map(OrderDetailItemOptionResponse::new) + .collect(Collectors.toList()); + } + } + + @Data @NoArgsConstructor + static class OrderDetailItemOptionResponse { + private Long id; + private Long itemOptionId; + private String name; + private OptionType optionType; + + public OrderDetailItemOptionResponse(OrderDetailDto.OrderDetailItemOption itemOption) { + this.id = itemOption.getId(); + this.itemOptionId = itemOption.getItemOptionId(); + this.name = itemOption.getName(); + this.optionType = itemOption.getOptionType(); + } + } + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepositoryCustom.java b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepositoryCustom.java new file mode 100644 index 0000000..ddcda8b --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepositoryCustom.java @@ -0,0 +1,27 @@ +package com.justpickup.orderservice.domain.orderItem.repository; + +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static com.justpickup.orderservice.domain.orderItem.entity.QOrderItem.orderItem; + +@Repository +@RequiredArgsConstructor +public class OrderItemRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public List getOrderItemsWithOptions(Long orderId) { + return queryFactory.selectFrom(orderItem) + .leftJoin(orderItem.orderItemOptions).fetchJoin() + .where( + orderItem.order.id.eq(orderId) + ) + .distinct() + .fetch(); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java index a4d2c56..6cf5284 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java @@ -4,7 +4,6 @@ import com.justpickup.orderservice.global.entity.Yn; import lombok.*; import java.util.List; -import java.util.stream.Collectors; @Getter @NoArgsConstructor diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/ItemOptionsResponse.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/ItemOptionsResponse.java new file mode 100644 index 0000000..1eba651 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/ItemOptionsResponse.java @@ -0,0 +1,10 @@ +package com.justpickup.orderservice.global.client.store; + +import lombok.Data; + +@Data +public class ItemOptionsResponse { + private Long id; + private OptionType optionType; + private String name; +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java index d132873..fff0948 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java @@ -32,7 +32,10 @@ public interface StoreClient { Result getStore(@PathVariable(value = "storeId") String storeId); @GetMapping("/api/customer/items/{itemId}") - Result> getItemAndItemOptions(@PathVariable(value = "itemId") List itemIds); + Result> getItemAndItemOptions(@PathVariable(value = "itemId") Iterable itemIds); + + @GetMapping("/item-options/{itemOptionIds}") + Result> getItemOptions(@PathVariable(value = "itemOptionIds") Iterable itemOptionIds); default Map getStoreNameMap(Set storeIds) { List storeResponses = this.getStoreAllById(storeIds).getData(); @@ -50,5 +53,11 @@ public interface StoreClient { ); } - + default Map getItemOptionMap(Iterable itemOptionIds) { + List itemOptionsResponses = this.getItemOptions(itemOptionIds).getData(); + return itemOptionsResponses.stream() + .collect( + toMap(ItemOptionsResponse::getId, itemOptionsResponse -> itemOptionsResponse) + ); + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java index 4d08327..cb4516f 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java @@ -19,6 +19,8 @@ public class GlobalExceptionHandler { HttpStatus status = ce.getStatus(); Result errorResult = ce.getErrorResult(); + log.warn("[CustomException] {}, {}", status, errorResult); + return ResponseEntity.status(status) .body(errorResult); } From 2bc63c92ac46beecf85da8eda9d7da3e8f472593 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 21 Mar 2022 18:09:39 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor(order):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20API=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 아이템 정보 API를 통해 아이템 옵션까지 동시에 가져오도록 변경 --- .../order/service/OrderServiceImpl.java | 25 +++++++++++-------- .../global/client/store/StoreClient.java | 11 +++----- 2 files changed, 19 insertions(+), 17 deletions(-) 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 b7e6b9f..a53f091 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 @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import static com.justpickup.orderservice.domain.order.dto.OrderDetailDto.*; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; @Service @RequiredArgsConstructor @@ -246,37 +247,41 @@ public class OrderServiceImpl implements OrderService { GetCustomerResponse customerInfo = userClient.getCustomerById(order.getUserId()).getData(); Set itemIds = new HashSet<>(); - Set itemOptionIds = new HashSet<>(); // 아이템 이름 및 옵션 이름 가져오기 for (OrderItem orderItem : orderItemsWithOptions) { itemIds.add(orderItem.getItemId()); - for (OrderItemOption orderItemOption : orderItem.getOrderItemOptions()) { - itemOptionIds.add(orderItemOption.getItemOptionId()); - } } - Map itemNameMap = storeClient.getItemNameMap(itemIds); - Map itemOptionMap = storeClient.getItemOptionMap(itemOptionIds); + Map itemAndItemOptionMap = storeClient.getItemAndItemOptionMap(itemIds); List orderDetailItems = orderItemsWithOptions.stream() .map(orderItem -> { // 주문 상세 옵션 생성 + GetItemResponse itemResponse = itemAndItemOptionMap.get(orderItem.getItemId()); + + // 아이템 옵션 맵 생성 + Map itemOptionMap = itemResponse.getItemOptions().stream() + .collect( + toMap(GetItemResponse.ItemOptionDto::getId, itemOptionDto -> itemOptionDto) + ); + List orderDetailItemOptions = orderItem.getOrderItemOptions() .stream() .map(orderItemOption -> { // 옵션 아이디에 해당하는 아이템 옵션 객체 가져오기 - ItemOptionsResponse itemOptionsResponse = itemOptionMap.get(orderItemOption.getItemOptionId()); + GetItemResponse.ItemOptionDto itemOptionDto = + itemOptionMap.get(orderItemOption.getItemOptionId()); return OrderDetailItemOption.of( orderItemOption, - itemOptionsResponse.getName(), - itemOptionsResponse.getOptionType() + itemOptionDto.getName(), + itemOptionDto.getOptionType() ); }) .collect(toList()); // 아이템 아이디에 해당하는 아이템 이름 가져오기 - String itemName = itemNameMap.get(orderItem.getItemId()); + String itemName = itemResponse.getName(); return OrderDetailItem.of(orderItem, itemName, orderDetailItemOptions); }) .collect(toList()); diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java index fff0948..8842fcb 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java @@ -34,9 +34,6 @@ public interface StoreClient { @GetMapping("/api/customer/items/{itemId}") Result> getItemAndItemOptions(@PathVariable(value = "itemId") Iterable itemIds); - @GetMapping("/item-options/{itemOptionIds}") - Result> getItemOptions(@PathVariable(value = "itemOptionIds") Iterable itemOptionIds); - default Map getStoreNameMap(Set storeIds) { List storeResponses = this.getStoreAllById(storeIds).getData(); return storeResponses.stream() @@ -53,11 +50,11 @@ public interface StoreClient { ); } - default Map getItemOptionMap(Iterable itemOptionIds) { - List itemOptionsResponses = this.getItemOptions(itemOptionIds).getData(); - return itemOptionsResponses.stream() + default Map getItemAndItemOptionMap(Iterable itemIds) { + List responses = this.getItemAndItemOptions(itemIds).getData(); + return responses.stream() .collect( - toMap(ItemOptionsResponse::getId, itemOptionsResponse -> itemOptionsResponse) + toMap(GetItemResponse::getId, getItemsResponse -> getItemsResponse) ); } } From d6ec6313f5cf5df86588aa32888fdd524b6b86d7 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 21 Mar 2022 18:11:26 +0900 Subject: [PATCH 3/8] =?UTF-8?q?fix(store):=20=EC=95=84=EC=9D=B4=ED=85=9C,?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=98=B5=EC=85=98=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0=20=EC=BF=BC=EB=A6=AC=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=ED=94=BD=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - n + 1 querydsl의 distinct가 없어 중복 객체가 전달되던 점 변경 --- .../item/repository/ItemRepositoryCustom.java | 1 + .../ItemOptionRepositoryCustom.java | 19 +-------------- .../itemoption/service/ItemOptionService.java | 23 +------------------ .../service/ItemOptionServiceImpl.java | 12 ++++++++++ .../itemoption/web/ItemOptionController.java | 4 ++-- 5 files changed, 17 insertions(+), 42 deletions(-) create mode 100644 store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionServiceImpl.java diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java index 78796bf..9523754 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java @@ -37,6 +37,7 @@ public class ItemRepositoryCustom { return queryFactory.selectFrom(item) .join(item.itemOptions,itemOption).fetchJoin() .where(item.id.in(itemIds)) + .distinct() .fetch(); } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/repository/ItemOptionRepositoryCustom.java b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/repository/ItemOptionRepositoryCustom.java index b211a40..c300d89 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/repository/ItemOptionRepositoryCustom.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/repository/ItemOptionRepositoryCustom.java @@ -1,28 +1,11 @@ package com.justpickup.storeservice.domain.itemoption.repository; -import com.justpickup.storeservice.domain.itemoption.entity.ItemOption; -import com.justpickup.storeservice.domain.itemoption.entity.QItemOption; -import com.querydsl.jpa.impl.JPAQueryFactory; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.util.List; - -import static com.justpickup.storeservice.domain.item.entity.QItem.item; - @Repository @RequiredArgsConstructor public class ItemOptionRepositoryCustom { - private final JPAQueryFactory queryFactory; - - public List findByItem(Long itemId) { - - return queryFactory.selectFrom(QItemOption.itemOption) - .join(QItemOption.itemOption.item) - .on(item.id.eq(itemId)) - .fetch(); - } - - } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionService.java b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionService.java index 0a1bad5..6d54383 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionService.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionService.java @@ -1,25 +1,4 @@ package com.justpickup.storeservice.domain.itemoption.service; -import com.justpickup.storeservice.domain.item.dto.ItemDto; -import com.justpickup.storeservice.domain.itemoption.dto.ItemOptionDto; -import com.justpickup.storeservice.domain.itemoption.repository.ItemOptionRepository; -import com.justpickup.storeservice.domain.itemoption.repository.ItemOptionRepositoryCustom; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@Slf4j -@RequiredArgsConstructor -public class ItemOptionService { - private final ItemOptionRepositoryCustom itemOptionRepositoryCustom; - - public List getItemOption( ItemDto itemDto){ - return itemOptionRepositoryCustom.findByItem(itemDto.getId()) - .stream().map(ItemOptionDto::new) - .collect(Collectors.toList()); - } +public interface ItemOptionService { } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionServiceImpl.java b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionServiceImpl.java new file mode 100644 index 0000000..2191f74 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/service/ItemOptionServiceImpl.java @@ -0,0 +1,12 @@ +package com.justpickup.storeservice.domain.itemoption.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + + +@Slf4j +@RequiredArgsConstructor +@Service +public class ItemOptionServiceImpl implements ItemOptionService { +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/web/ItemOptionController.java b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/web/ItemOptionController.java index f278507..c0e0fe3 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/web/ItemOptionController.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/itemoption/web/ItemOptionController.java @@ -1,5 +1,6 @@ package com.justpickup.storeservice.domain.itemoption.web; +import com.justpickup.storeservice.domain.itemoption.service.ItemOptionService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RestController; @@ -7,6 +8,5 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class ItemOptionController { - - + private final ItemOptionService itemOptionService; } From 3afe6b0adf6dee196a0264ff4961abf5f1dcf32f Mon Sep 17 00:00:00 2001 From: bum12ark Date: Mon, 21 Mar 2022 18:35:00 +0900 Subject: [PATCH 4/8] =?UTF-8?q?test(order):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20WebMvc=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- order-service/src/docs/asciidoc/api-docs.adoc | 2 + .../domain/order/web/OrderControllerTest.java | 105 +++++++++++++++++- 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/order-service/src/docs/asciidoc/api-docs.adoc b/order-service/src/docs/asciidoc/api-docs.adoc index f5c4776..8052a28 100644 --- a/order-service/src/docs/asciidoc/api-docs.adoc +++ b/order-service/src/docs/asciidoc/api-docs.adoc @@ -67,6 +67,8 @@ domain-httpRequestCode-etc == 주문 === 주문 수정 operation::order-patch[snippets='curl-request,http-request,http-response,path-parameters,request-fields,response-fields'] +=== 주문 상세보기 +operation::api-orderDetail[snippets='curl-request,http-request,http-response,path-parameters,response-fields'] == 점주 서비스 === 주문 페이지 diff --git a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java index b17c477..89ad9ee 100644 --- a/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java +++ b/order-service/src/test/java/com/justpickup/orderservice/domain/order/web/OrderControllerTest.java @@ -1,12 +1,12 @@ package com.justpickup.orderservice.domain.order.web; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.justpickup.orderservice.config.TestConfig; +import com.justpickup.orderservice.domain.order.dto.OrderDetailDto; import com.justpickup.orderservice.domain.order.entity.OrderStatus; -import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.service.OrderService; import com.justpickup.orderservice.domain.order.web.OrderController.PatchOrderRequest; +import com.justpickup.orderservice.global.client.store.OptionType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -18,11 +18,14 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import static org.junit.jupiter.api.Assertions.*; +import java.time.LocalDateTime; +import java.util.List; + +import static org.mockito.BDDMockito.given; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -77,4 +80,98 @@ class OrderControllerTest { ; } + + @Test + @DisplayName("[GET] 주문 상세 내역 가져오기") + void getOrderDetail() throws Exception { + // GIVEN + Long orderId = 1589L; + + given(orderService.findOrderDetail(orderId)).willReturn(getOrderDetailWillReturn(orderId)); + // THEN + ResultActions actions = mockMvc.perform(get("/api/order-detail/{orderId}", String.valueOf(orderId))); + // WHEN + actions.andExpect(status().isOk()) + .andDo(print()) + .andDo(document("api-orderDetail", + pathParameters( + parameterWithName("orderId").description("주문 고유번호") + ), + responseFields( + fieldWithPath("code").description("결과코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메세지"), + fieldWithPath("data.id").description("주문 고유번호"), + fieldWithPath("data.orderTime").description("주문 시간 [yyy-MM-dd]"), + fieldWithPath("data.orderPrice").description("주문 금액"), + fieldWithPath("data.user.id").description("주문한 회원 고유번호"), + fieldWithPath("data.user.name").description("주문한 회원 이름"), + fieldWithPath("data.user.phoneNumber").description("주문한 회원 전화번호"), + fieldWithPath("data.orderItems[*].id").description("주문아이템 고유번호"), + fieldWithPath("data.orderItems[*].itemId").description("아이템 고유번호"), + fieldWithPath("data.orderItems[*].totalPrice").description("주문아이템 총합계"), + fieldWithPath("data.orderItems[*].count").description("주문아이템 수량"), + fieldWithPath("data.orderItems[*].name").description("아이템 이름"), + fieldWithPath("data.orderItems[*].options[*].id").description("주문아이템옵션 고유번호"), + fieldWithPath("data.orderItems[*].options[*].itemOptionId").description("아이템옵션 고유번호"), + fieldWithPath("data.orderItems[*].options[*].name").description("아이템옵션 이름"), + fieldWithPath("data.orderItems[*].options[*].optionType").description("아이템옵션 타입") + ) + )) + ; + } + + private OrderDetailDto getOrderDetailWillReturn(Long orderId) { + OrderDetailDto.OrderDetailUser orderDetailUser = OrderDetailDto.OrderDetailUser.builder() + .id(6L) + .name("박상범") + .phoneNumber("010-1234-5678") + .build(); + + long id = 11371L; + long itemOptionId = 40L; + OrderDetailDto.OrderDetailItemOption ice = OrderDetailDto.OrderDetailItemOption.builder() + .id(id++) + .itemOptionId(itemOptionId++) + .name("ICE") + .optionType(OptionType.REQUIRED) + .build(); + + OrderDetailDto.OrderDetailItemOption hot = OrderDetailDto.OrderDetailItemOption.builder() + .id(id++) + .itemOptionId(itemOptionId++) + .name("HOT") + .optionType(OptionType.REQUIRED) + .build(); + + OrderDetailDto.OrderDetailItemOption plus = OrderDetailDto.OrderDetailItemOption.builder() + .id(id++) + .itemOptionId(itemOptionId++) + .name("시럽 추가") + .optionType(OptionType.OTHER) + .build(); + + OrderDetailDto.OrderDetailItem 카페라떼 = OrderDetailDto.OrderDetailItem.builder() + .id(id++) + .itemId(itemOptionId++) + .count(2) + .name("카페라떼") + .options(List.of(hot, plus)) + .build(); + + OrderDetailDto.OrderDetailItem 아메리카노 = OrderDetailDto.OrderDetailItem.builder() + .id(id++) + .itemId(itemOptionId++) + .count(2) + .options(List.of(ice)) + .name("아메리카노") + .build(); + + return OrderDetailDto.builder() + .id(orderId) + .orderTime(LocalDateTime.now()) + .orderPrice(76600L) + .user(orderDetailUser) + .orderItems(List.of(카페라떼, 아메리카노)) + .build(); + } } \ No newline at end of file From 9502da4bf062a52a043af68f58933c5907c6a2ac Mon Sep 17 00:00:00 2001 From: bum12ark Date: Tue, 22 Mar 2022 13:21:07 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat(owner-vue):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 지난 주문 - 주문 --- owner-vue/src/api/order.js | 3 + owner-vue/src/components/OrderCard.vue | 150 ++++++++-------- .../src/components/OrderDetailDialog.vue | 164 ++++++++++++++++++ owner-vue/src/views/PrevOrder.vue | 11 +- 4 files changed, 253 insertions(+), 75 deletions(-) create mode 100644 owner-vue/src/components/OrderDetailDialog.vue diff --git a/owner-vue/src/api/order.js b/owner-vue/src/api/order.js index b309bf6..9a592cb 100644 --- a/owner-vue/src/api/order.js +++ b/owner-vue/src/api/order.js @@ -25,5 +25,8 @@ export default { orderStatus: orderStatus } return axios.patch(process.env.VUE_APP_OWNER_SERVICE_BASEURL + "/order-service/order/" + orderId, body); + }, + getOrderDetail(orderId) { + return axios.get(process.env.VUE_APP_OWNER_SERVICE_BASEURL + "/order-service/api/order-detail/" + orderId); } } \ No newline at end of file diff --git a/owner-vue/src/components/OrderCard.vue b/owner-vue/src/components/OrderCard.vue index 15dffad..780ae67 100644 --- a/owner-vue/src/components/OrderCard.vue +++ b/owner-vue/src/components/OrderCard.vue @@ -1,84 +1,89 @@ diff --git a/owner-vue/src/components/OrderDetailDialog.vue b/owner-vue/src/components/OrderDetailDialog.vue new file mode 100644 index 0000000..f8b6ace --- /dev/null +++ b/owner-vue/src/components/OrderDetailDialog.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/owner-vue/src/views/PrevOrder.vue b/owner-vue/src/views/PrevOrder.vue index bf1615e..c4508cf 100644 --- a/owner-vue/src/views/PrevOrder.vue +++ b/owner-vue/src/views/PrevOrder.vue @@ -25,6 +25,12 @@ hide-default-footer class="elevation-1" > +
Date: Tue, 22 Mar 2022 17:29:39 +0900 Subject: [PATCH 6/8] =?UTF-8?q?style(owner-vue):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=ED=99=94=EB=A9=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- owner-vue/src/components/OrderCard.vue | 7 +++++++ owner-vue/src/components/OrderDetailDialog.vue | 4 +++- owner-vue/src/main.js | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/owner-vue/src/components/OrderCard.vue b/owner-vue/src/components/OrderCard.vue index 780ae67..2ddcd09 100644 --- a/owner-vue/src/components/OrderCard.vue +++ b/owner-vue/src/components/OrderCard.vue @@ -67,6 +67,13 @@ + + + + 주문 실패 + + +
diff --git a/owner-vue/src/components/OrderDetailDialog.vue b/owner-vue/src/components/OrderDetailDialog.vue index f8b6ace..ad55eed 100644 --- a/owner-vue/src/components/OrderDetailDialog.vue +++ b/owner-vue/src/components/OrderDetailDialog.vue @@ -21,6 +21,7 @@ +

{{orderInfo.storeName}}


{{orderId}}. {{orderInfo.orderStatus | getOrderStatusName }}


주문일시: {{ orderInfo.orderTime }}
주 문 자: {{ user.name }}
@@ -131,7 +132,8 @@ export default { id: orderDetail.id, orderTime: orderDetail.orderTime, orderPrice: orderDetail.orderPrice, - orderStatus: orderDetail.orderStatus + orderStatus: orderDetail.orderStatus, + storeName: orderDetail.storeName }; const orderItems = orderDetail.orderItems; diff --git a/owner-vue/src/main.js b/owner-vue/src/main.js index 408e90d..2a37957 100644 --- a/owner-vue/src/main.js +++ b/owner-vue/src/main.js @@ -27,8 +27,10 @@ Vue.filter('getOrderStatusName', function (orderStatus) { return "픽업대기중"; case "FINISHED": return "픽업완료됨"; + case "FAILED": + return "주문실패"; default: - break; + return orderStatus; } }); From 9937e69580375a3d7a99c5964a3262b4e97c9f52 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Tue, 22 Mar 2022 17:33:15 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix(customer-vue):=20=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=EB=82=B4=EC=97=AD=20=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 주문내역 메뉴에서 상세보기 버튼 클릭 시 상세보기 페이지로 이동 --- customer-vue/src/api/order.js | 4 +- .../src/components/OrderHistoryCard.vue | 8 +- customer-vue/src/main.js | 21 +++ customer-vue/src/router/router.js | 7 + customer-vue/src/views/OrderDetail.vue | 137 ++++++++++++++++++ customer-vue/src/views/OrderHistory.vue | 22 +-- 6 files changed, 179 insertions(+), 20 deletions(-) create mode 100644 customer-vue/src/views/OrderDetail.vue diff --git a/customer-vue/src/api/order.js b/customer-vue/src/api/order.js index 5ed1612..aae068c 100644 --- a/customer-vue/src/api/order.js +++ b/customer-vue/src/api/order.js @@ -24,5 +24,7 @@ export default { getOrder() { return axios.get(process.env.VUE_APP_ORDER_API_URL + "/order/orders"); }, - + getOrderDetail(orderId) { + return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL + "/order-service/api/order-detail/" + orderId); + } } \ No newline at end of file diff --git a/customer-vue/src/components/OrderHistoryCard.vue b/customer-vue/src/components/OrderHistoryCard.vue index 4ae1f59..3d354ec 100644 --- a/customer-vue/src/components/OrderHistoryCard.vue +++ b/customer-vue/src/components/OrderHistoryCard.vue @@ -12,7 +12,7 @@ - {{ card.orderStatus }} + {{ card.orderStatus | getOrderStatusName }}
{{ card.orderItemNames }} @@ -50,6 +50,7 @@ export default { name: "OrderHistoryCard", props: { card: { + orderId: String, storeId: Number, storeName: String, orderTime: String, @@ -66,7 +67,10 @@ export default { }) }, clickDetail: function() { - alert("준비 중입니다."); + this.$router.push({ + name: "order-detail", + params: {orderId: this.card.orderId} + }); } } } diff --git a/customer-vue/src/main.js b/customer-vue/src/main.js index 9f625bf..3f7aea6 100644 --- a/customer-vue/src/main.js +++ b/customer-vue/src/main.js @@ -19,10 +19,29 @@ axios.interceptors.request.use(function (config) { config.headers.Authorization = "Bearer " + jwt.getToken(); return config; }); + Vue.filter('currency', function (value) { var num = new Number(value); return num.toFixed(0).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,") }); +Vue.filter('getOrderStatusName', function (orderStatus) { + switch (orderStatus) { + case "PLACED": + return "주문신청"; + case "ACCEPTED": + return "주문수락"; + case "REJECTED": + return "주문거절"; + case "WAITING": + return "픽업대기"; + case "FINISHED": + return "픽업완료"; + case "FAILED": + return "주문실패"; + default: + break; + } +}); axios.interceptors.response.use( (response) => { @@ -43,6 +62,8 @@ axios.interceptors.response.use( alert("권한이 없습니다. 다시 로그인 해주세요"); return Promise.reject(error2); } + } else { + if (error.response.data.message) alert(error.response.data.message); } return Promise.reject(error); } diff --git a/customer-vue/src/router/router.js b/customer-vue/src/router/router.js index 21be65f..67027e7 100644 --- a/customer-vue/src/router/router.js +++ b/customer-vue/src/router/router.js @@ -82,6 +82,13 @@ const routes = [ name: 'mypage', component: () => import('../views/MyPage') }, + { + path: "/order-detail/:orderId", + beforeEnter: authCheck, + name: 'order-detail', + props: true, + component: () => import('../views/OrderDetail') + }, ] }, { diff --git a/customer-vue/src/views/OrderDetail.vue b/customer-vue/src/views/OrderDetail.vue new file mode 100644 index 0000000..7c1e299 --- /dev/null +++ b/customer-vue/src/views/OrderDetail.vue @@ -0,0 +1,137 @@ + + + + + \ No newline at end of file diff --git a/customer-vue/src/views/OrderHistory.vue b/customer-vue/src/views/OrderHistory.vue index 8b6f055..63831ee 100644 --- a/customer-vue/src/views/OrderHistory.vue +++ b/customer-vue/src/views/OrderHistory.vue @@ -51,14 +51,10 @@ export default { methods: { search: async function() { this.isLoading = true; - try { - this.page = 0; - const response = await orderApi.requestOrderHistory(this.page); - this.cards = []; - this.renderCard(response.data); - } catch (error) { - console.log(error); - } + this.page = 0; + const response = await orderApi.requestOrderHistory(this.page); + this.cards = []; + this.renderCard(response.data); this.isLoading = false; }, more: async function() { @@ -85,19 +81,11 @@ export default { storeId: order.storeId, storeName: order.storeName, orderPrice: order.orderPrice, - orderStatus: this.getOrderStatusName(order.orderStatus), + orderStatus: order.orderStatus, orderItemNames: this.getOrderItemName(order.orderItems) }) }); }, - getOrderStatusName(orderStatus) { - if (orderStatus === "PLACED") return "주문신청"; - if (orderStatus === "REJECTED") return "주문거절"; - if (orderStatus === "ACCEPTED") return "주문수락"; - if (orderStatus === "WAITING") return "픽업대기"; - if (orderStatus === "FINISHED") return "픽업완료"; - return orderStatus; - }, getOrderItemName(orderItems) { const itemSize = orderItems.length; if (itemSize == 1) return orderItems[0].orderItemName; From b7c585fc151774c6b9a69a508d6e60e4f87f7b68 Mon Sep 17 00:00:00 2001 From: bum12ark Date: Tue, 22 Mar 2022 17:35:41 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat(order):=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EB=A7=A4=EC=9E=A5?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/order/dto/OrderDetailDto.java | 39 ++++++++++++++++++- .../domain/order/entity/Order.java | 4 ++ .../repository/OrderRepositoryCustom.java | 1 + .../order/service/OrderServiceImpl.java | 11 ++++-- .../domain/order/web/OrderController.java | 9 +++-- 5 files changed, 57 insertions(+), 7 deletions(-) diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java index 7f6752a..9665d44 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDetailDto.java @@ -1,6 +1,7 @@ package com.justpickup.orderservice.domain.order.dto; import com.justpickup.orderservice.domain.order.entity.Order; +import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption; import com.justpickup.orderservice.global.client.store.OptionType; @@ -16,14 +17,32 @@ public class OrderDetailDto { private Long id; private LocalDateTime orderTime; private Long orderPrice; + private OrderStatus orderStatus; + private String storeName; private OrderDetailUser user; private List orderItems = new ArrayList<>(); - public static OrderDetailDto of(Order order, List orderItems, OrderDetailUser orderDetailUser) { + @Builder + public OrderDetailDto(Long id, LocalDateTime orderTime, Long orderPrice, OrderStatus orderStatus, + String storeName, OrderDetailUser user, List orderItems) { + this.id = id; + this.orderTime = orderTime; + this.orderPrice = orderPrice; + this.orderStatus = orderStatus; + this.storeName = storeName; + this.user = user; + this.orderItems = orderItems; + } + + public static OrderDetailDto of(Order order, String storeName, + List orderItems, OrderDetailUser orderDetailUser) { OrderDetailDto orderDetailDto = new OrderDetailDto(); orderDetailDto.id = order.getId(); orderDetailDto.orderTime = order.getOrderTime(); orderDetailDto.orderPrice = order.getOrderPrice(); + orderDetailDto.orderStatus = order.getOrderStatus(); + + orderDetailDto.storeName = storeName; orderDetailDto.user = orderDetailUser; orderDetailDto.orderItems = orderItems; @@ -53,6 +72,16 @@ public class OrderDetailDto { private String name; private List options = new ArrayList<>(); + @Builder + public OrderDetailItem(Long id, Long itemId, long totalPrice, long count, String name, List options) { + this.id = id; + this.itemId = itemId; + this.totalPrice = totalPrice; + this.count = count; + this.name = name; + this.options = options; + } + public static OrderDetailItem of(OrderItem orderItem, String name, List orderDetailItemOption) { OrderDetailItem orderDetailItem = new OrderDetailItem(); orderDetailItem.id = orderItem.getId(); @@ -73,6 +102,14 @@ public class OrderDetailDto { private String name; private OptionType optionType; + @Builder + public OrderDetailItemOption(Long id, Long itemOptionId, String name, OptionType optionType) { + this.id = id; + this.itemOptionId = itemOptionId; + this.name = name; + this.optionType = optionType; + } + public static OrderDetailItemOption of(OrderItemOption orderItemOption, String name, OptionType optionType) { OrderDetailItemOption orderDetailItemOption = new OrderDetailItemOption(); orderDetailItemOption.id = orderItemOption.getId(); diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java index 0fec5e1..e0c9b58 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java @@ -105,4 +105,8 @@ public class Order extends BaseEntity { public void fail() { this.orderStatus = OrderStatus.FAILED; } + + public void changOrderTime(LocalDateTime orderTime) { + this.orderTime = orderTime; + } } 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 c72df97..8123ef6 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 @@ -77,6 +77,7 @@ public class OrderRepositoryCustom { .leftJoin(order.transaction) .where( order.orderTime.between(search.getStartDateTime(), search.getEndDateTime()), + order.orderStatus.ne(OrderStatus.PENDING), order.storeId.eq(storeId) ) .fetchOne(); 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 a53f091..536c26a 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 @@ -243,8 +243,7 @@ public class OrderServiceImpl implements OrderService { List orderItemsWithOptions = orderItemRepositoryCustom.getOrderItemsWithOptions(order.getId()); - // 고객 정보 가져오기 - GetCustomerResponse customerInfo = userClient.getCustomerById(order.getUserId()).getData(); + Set itemIds = new HashSet<>(); @@ -286,6 +285,9 @@ public class OrderServiceImpl implements OrderService { }) .collect(toList()); + // 고객 정보 가져오기 + GetCustomerResponse customerInfo = userClient.getCustomerById(order.getUserId()).getData(); + // 주문한 사용자 정보 생성 OrderDetailUser orderDetailUser = OrderDetailUser.builder() .id(customerInfo.getUserId()) @@ -293,7 +295,10 @@ public class OrderServiceImpl implements OrderService { .name(customerInfo.getUserName()) .build(); - return OrderDetailDto.of(order, orderDetailItems, orderDetailUser); + // 매장 정보 가져오기 + GetStoreResponse storeInfo = storeClient.getStore(String.valueOf(order.getStoreId())).getData(); + + return OrderDetailDto.of(order, storeInfo.getName(), orderDetailItems, orderDetailUser); } } 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 79e01a9..e9df423 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 @@ -30,7 +30,7 @@ public class OrderController { public ResponseEntity patchOrder(@PathVariable("orderId") Long orderId, @RequestBody PatchOrderRequest patchOrderRequest) { OrderStatus orderStatus = patchOrderRequest.getOrderStatus(); - if (orderStatus == OrderStatus.PENDING && orderStatus == OrderStatus.FAILED) { + if (orderStatus == OrderStatus.PENDING || orderStatus == OrderStatus.FAILED) { throw new OrderException(orderStatus.getMessage() + "는 변경 불가능합니다."); } @@ -48,22 +48,25 @@ public class OrderController { public ResponseEntity getOrderDetail(@PathVariable Long orderId) { OrderDetailDto orderDetail = orderService.findOrderDetail(orderId); - return ResponseEntity.ok(Result.createSuccessResult(new OrderDetailResponse(orderDetail))); } @Data @NoArgsConstructor @AllArgsConstructor static class OrderDetailResponse { private Long id; + private OrderStatus orderStatus; private String orderTime; private Long orderPrice; + private String storeName; private OrderDetailUserResponse user; private List orderItems = new ArrayList<>(); public OrderDetailResponse(OrderDetailDto dto) { this.id = dto.getId(); - this.orderTime = dto.getOrderTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + this.orderStatus = dto.getOrderStatus(); + this.orderTime = dto.getOrderTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); this.orderPrice = dto.getOrderPrice(); + this.storeName = dto.getStoreName(); this.user = new OrderDetailUserResponse(dto.getUser()); this.orderItems = dto.getOrderItems().stream() .map(OrderDetailItemResponse::new)