From 7cfc4bc47f0cc92c014121366ae736350e6a84b3 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Wed, 9 Mar 2022 11:46:53 +0900 Subject: [PATCH] =?UTF-8?q?feat(order-service,=20customer-vue):=20?= =?UTF-8?q?=EC=A3=BC=EB=AC=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 장바구니 데이터 조회 - 주문 페이지 개발 --- customer-vue/src/api/order.js | 10 +- customer-vue/src/components/AppNavigation.vue | 26 ++-- customer-vue/src/router/router.js | 16 ++- customer-vue/src/views/ItemDetail.vue | 63 ++++----- customer-vue/src/views/OrderPage.vue | 120 ++++++++++++++++++ order-service/build.gradle | 4 +- .../domain/order/dto/FetchOrderDto.java | 49 +++++++ .../domain/order/dto/OrderDto.java | 2 + .../domain/order/entity/Order.java | 4 +- .../order/repository/OrderRepository.java | 3 +- .../repository/OrderRepositoryCustom.java | 20 +++ .../domain/order/service/OrderService.java | 3 + .../order/service/OrderServiceImpl.java | 22 +++- .../order/web/OrderCustomerApiController.java | 56 +++++++- .../domain/orderItem/dto/OrderItemDto.java | 6 +- .../src/main/resources/application.yml | 2 +- 16 files changed, 335 insertions(+), 71 deletions(-) create mode 100644 customer-vue/src/views/OrderPage.vue create mode 100644 order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/FetchOrderDto.java diff --git a/customer-vue/src/api/order.js b/customer-vue/src/api/order.js index bb473b2..5ed1612 100644 --- a/customer-vue/src/api/order.js +++ b/customer-vue/src/api/order.js @@ -16,5 +16,13 @@ export default { } item.itemOptionIds.push(item.requireOption) return axios.post(process.env.VUE_APP_ORDER_API_URL+'/order/item', item); - } + }, + saveOrder(order){ + //만약 동시요청으로 장바구니가 두개 생겨버린다면? + return axios.post(process.env.VUE_APP_ORDER_API_URL + "/order/orders", order); + }, + getOrder() { + return axios.get(process.env.VUE_APP_ORDER_API_URL + "/order/orders"); + }, + } \ No newline at end of file diff --git a/customer-vue/src/components/AppNavigation.vue b/customer-vue/src/components/AppNavigation.vue index 8650ed4..fba55f2 100644 --- a/customer-vue/src/components/AppNavigation.vue +++ b/customer-vue/src/components/AppNavigation.vue @@ -4,18 +4,22 @@ dense color="white" elevation="1" + > - - mdi-arrow-left - - - - - - - - mdi-magnify - + + + + mdi-arrow-left + + + + + + + + mdi-magnify + + diff --git a/customer-vue/src/router/router.js b/customer-vue/src/router/router.js index 54d96f9..2737a03 100644 --- a/customer-vue/src/router/router.js +++ b/customer-vue/src/router/router.js @@ -59,13 +59,19 @@ const routes = [ name: 'login', component: () => import('../views/LoginPage') }, + { + path: "/item/:storeId/:itemId", + name: 'itemDetail', + component: () => import('../views/ItemDetail') + }, + { + path: "/order", + name: 'orderPage', + component: () => import('../views/OrderPage') + }, ] }, - { - path: "/item/:storeId/:itemId", - name: 'itemDetail', - component: () => import('../views/ItemDetail') - }, + { path: '/auth', diff --git a/customer-vue/src/views/ItemDetail.vue b/customer-vue/src/views/ItemDetail.vue index e45a33e..da391a2 100644 --- a/customer-vue/src/views/ItemDetail.vue +++ b/customer-vue/src/views/ItemDetail.vue @@ -1,6 +1,5 @@ \ No newline at end of file diff --git a/customer-vue/src/views/OrderPage.vue b/customer-vue/src/views/OrderPage.vue new file mode 100644 index 0000000..c5f79a3 --- /dev/null +++ b/customer-vue/src/views/OrderPage.vue @@ -0,0 +1,120 @@ + + + + + \ No newline at end of file diff --git a/order-service/build.gradle b/order-service/build.gradle index 9bd342f..f4ad1b7 100644 --- a/order-service/build.gradle +++ b/order-service/build.gradle @@ -35,7 +35,7 @@ dependencies { /*implementation 'org.springframework.boot:spring-boot-starter-amqp'*/ /*implementation 'org.springframework.boot:spring-boot-starter-security'*/ /*implementation 'org.springframework.cloud:spring-cloud-starter-config'*/ - /*implementation 'org.springframework.kafka:spring-kafka'*/ + implementation 'org.springframework.kafka:spring-kafka' // https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' @@ -46,7 +46,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // testImplementation 'org.springframework.amqp:spring-rabbit-test' -// testImplementation 'org.springframework.kafka:spring-kafka-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' // testImplementation 'org.springframework.security:spring-security-test' testImplementation 'com.h2database:h2' diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/FetchOrderDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/FetchOrderDto.java new file mode 100644 index 0000000..e002ef8 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/FetchOrderDto.java @@ -0,0 +1,49 @@ +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.dto.OrderItemDto; +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import com.justpickup.orderservice.domain.orderItemOption.dto.OrderItemOptionDto; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@NoArgsConstructor +public class FetchOrderDto { + private Long id; + + private Long userId; + + private String userName; + + private Long userCouponId; + + private Long orderPrice; + + private Long storeId; + + private LocalDateTime orderTime; + + private Long usedPoint; + + private OrderStatus orderStatus; + + private List orderItemDtoList; + + + public FetchOrderDto(Order order) { + this.id = order.getId(); + this.userId = order.getUserId(); + this.orderPrice = order.getOrderPrice(); + this.storeId = order.getStoreId(); + this.orderItemDtoList = order.getOrderItems().stream() + .map(orderItem -> OrderItemDto.of(orderItem.getId(),orderItem.getItemId(),orderItem.getPrice(),orderItem.getCount(),orderItem.getOrderItemOptions().stream().map(orderItemOption -> new OrderItemOptionDto(orderItemOption.getId())).collect(Collectors.toList()))) + .collect(Collectors.toList()); + } + +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java index f93393f..4574286 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java @@ -84,6 +84,8 @@ public class OrderDto { } + + // == 변수 변경 메소드 == // public void setUserName(String userName) { this.userName = userName; 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 f7759d2..94c114d 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 @@ -85,8 +85,10 @@ public class Order extends BaseEntity { transaction.setOrder(this); } - public void addOrderItem(OrderItem orderItem) { + public Order addOrderItem(OrderItem orderItem) { this.orderItems.add(orderItem); + this.orderPrice += orderItem.getPrice(); orderItem.setOrder(this); + return this; } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java index 95bfa0f..337e2b9 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java @@ -1,10 +1,11 @@ package com.justpickup.orderservice.domain.order.repository; import com.justpickup.orderservice.domain.order.entity.Order; +import com.justpickup.orderservice.domain.order.entity.OrderStatus; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface OrderRepository extends JpaRepository { - Optional findByUserId(Long userId); + Optional findByUserIdAndOrderStatus(Long userId, OrderStatus orderStatus); } 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 9dc4317..e90e0a5 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 @@ -3,6 +3,7 @@ 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.justpickup.orderservice.domain.order.entity.OrderStatus; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -14,8 +15,12 @@ import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import static com.justpickup.orderservice.domain.order.entity.QOrder.order; +import static com.justpickup.orderservice.domain.orderItem.entity.QOrderItem.orderItem; +import static com.justpickup.orderservice.domain.orderItemOption.entity.QOrderItemOption.orderItemOption; +import static com.justpickup.orderservice.domain.transaction.entity.QTransaction.transaction; @Repository @RequiredArgsConstructor @@ -104,4 +109,19 @@ public class OrderRepositoryCustom { return new SliceImpl<>(contents, pageable, hasNext); } + + public Optional fetchOrder(Long userId){ + + return Optional.ofNullable(queryFactory.selectFrom(order) + .leftJoin(order.orderItems, orderItem).fetchJoin() + .leftJoin(orderItem.orderItemOptions,orderItemOption) + .leftJoin(order.transaction,transaction) + .where( + order.userId.eq(userId), + order.orderStatus.eq(OrderStatus.PENDING) + ) + .distinct() + .fetchOne()); + + } } 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 c08a9ff..6f9f98c 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 @@ -1,5 +1,6 @@ package com.justpickup.orderservice.domain.order.service; +import com.justpickup.orderservice.domain.order.dto.FetchOrderDto; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition; import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch; @@ -15,4 +16,6 @@ public interface OrderService { Page findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId); SliceImpl findOrderHistory(Pageable pageable, Long userId); void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId); + FetchOrderDto fetchOrder(Long userId); + void saveOrder(Long userId); } 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 d1cc9e2..5f969bf 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 @@ -1,9 +1,11 @@ package com.justpickup.orderservice.domain.order.service; +import com.justpickup.orderservice.domain.order.dto.FetchOrderDto; 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.entity.OrderStatus; import com.justpickup.orderservice.domain.order.repository.OrderRepository; import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; @@ -103,7 +105,6 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional public void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId) { - orderItemDto.getCount(); //orderItemOption Entity를 생성한다. List orderItemOptions = orderItemDto.getOrderItemOptionDtoList() @@ -119,11 +120,26 @@ public class OrderServiceImpl implements OrderService { //HARD_CODE Long userCouponId=0L; - Optional optionalOrder = orderRepository.findByUserId(userId); + Optional optionalOrder = orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING); if(optionalOrder.isPresent()){ - optionalOrder.get().addOrderItem(orderItem); + if(optionalOrder.get().addOrderItem(orderItem) + .getStoreId().equals(storeId)) + throw new RuntimeException("장바구니에 여러 카페의 메뉴를 담을수 없습니다."); }else{ orderRepository.save(Order.of(userId,userCouponId,storeId,orderItemDto.getPrice(),orderItem)); } } + + @Override + public FetchOrderDto fetchOrder(Long userId) { + Order order = orderRepositoryCustom.fetchOrder(userId) + .orElseThrow(RuntimeException::new); + + return new FetchOrderDto(order); + } + + @Override + public void saveOrder(Long userId) { + + } } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderCustomerApiController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderCustomerApiController.java index b054d95..3ce6811 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderCustomerApiController.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderCustomerApiController.java @@ -1,9 +1,11 @@ package com.justpickup.orderservice.domain.order.web; +import com.justpickup.orderservice.domain.order.dto.FetchOrderDto; import com.justpickup.orderservice.domain.order.dto.OrderDto; import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.service.OrderService; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; +import com.justpickup.orderservice.domain.orderItemOption.dto.OrderItemOptionDto; import com.justpickup.orderservice.global.dto.Result; import lombok.AllArgsConstructor; import lombok.Data; @@ -99,7 +101,7 @@ public class OrderCustomerApiController { requestItem.itemId, requestItem.getPrice(), requestItem.getCount(), - requestItem.getItemOptionIds()); + requestItem.getItemOptionIds().stream().map(OrderItemOptionDto::new).collect(Collectors.toList())); orderService.addItemToBasket(orderItemDto,requestItem.getStoreId() ,Long.parseLong(userId)); return ResponseEntity.status(HttpStatus.NO_CONTENT) .body(Result.createSuccessResult(null)); @@ -117,6 +119,58 @@ public class OrderCustomerApiController { } + @GetMapping("/orders") + public ResponseEntity getOrder(@RequestHeader(value = "user-id") String userId){ + FetchOrderDto fetchOrderDto = orderService.fetchOrder(Long.parseLong(userId)); + ResponseOrder responseOrder = new ResponseOrder(fetchOrderDto); + + return ResponseEntity.ok(Result.createSuccessResult(responseOrder)); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ResponseOrder{ + private Long storeId; + private List<_OrderItemDto> _orderItemDtos; + private Long totalPrice; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class _OrderItemDto { + private Long itemId; + private List itemOptionIds; + private Long price; + + public _OrderItemDto(OrderItemDto orderItemDto) { + + this.itemId = orderItemDto.getItemId(); + this.itemOptionIds = orderItemDto.getOrderItemOptionDtoList() + .stream() + .map(OrderItemOptionDto::getId) + .collect(Collectors.toList()); + this.price = orderItemDto.getPrice(); + } + } + + public ResponseOrder(FetchOrderDto fetchOrderDto){ + this.storeId = fetchOrderDto.getStoreId(); + this._orderItemDtos = fetchOrderDto.getOrderItemDtoList().stream() + .map(_OrderItemDto::new) + .collect(Collectors.toList()); + this.totalPrice = fetchOrderDto.getOrderPrice(); + + } + + } + + @PostMapping("/orders") + public ResponseEntity saveOrder(@RequestHeader(value = "user-id") String userId){ + orderService.saveOrder(Long.parseLong(userId)); + + return ResponseEntity.status(HttpStatus.CREATED).body(Result.createSuccessResult(null)); + } diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java index ca3969d..3953476 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java @@ -42,15 +42,13 @@ public class OrderItemDto { .build(); } - public static OrderItemDto of(Long id, Long itemId, Long price, Long count, List itemOptionIds) { + public static OrderItemDto of(Long id, Long itemId, Long price, Long count, List orderItemOptions) { OrderItemDto orderItemDto = new OrderItemDto(); orderItemDto.id = id; orderItemDto.itemId = itemId; orderItemDto.price = price; orderItemDto.count = count; - orderItemDto.orderItemOptionDtoList = itemOptionIds.stream() - .map(OrderItemOptionDto::new) - .collect(Collectors.toList()); + orderItemDto.orderItemOptionDtoList = orderItemOptions; return orderItemDto; } diff --git a/order-service/src/main/resources/application.yml b/order-service/src/main/resources/application.yml index cf21c99..e85d530 100644 --- a/order-service/src/main/resources/application.yml +++ b/order-service/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 0 + port: 54329 spring: application: