feat(order): 점주 서비스 주문 Feign 클라이언트 통신 추가

This commit is contained in:
bum12ark
2022-03-14 21:08:48 +09:00
parent 8191bb028c
commit d3aa81cc76
12 changed files with 157 additions and 69 deletions

View File

@@ -50,6 +50,10 @@ public class OrderMainDto {
.orderItems(orderItems)
.build();
}
public void changeUserName(String userName) {
this.userName = userName;
}
}
@Getter @Builder
@@ -64,5 +68,9 @@ public class OrderMainDto {
.itemId(orderItem.getItemId())
.build();
}
public void changeItemName(String itemName) {
this.itemName = itemName;
}
}
}

View File

@@ -29,11 +29,11 @@ public class Order extends BaseEntity {
private Long storeId;
private Long orderPrice;
private long orderPrice;
private LocalDateTime orderTime;
private Long usedPoint;
private long usedPoint;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
@@ -45,32 +45,11 @@ public class Order extends BaseEntity {
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
public static Order of(Long userId, Long userCouponId, Long storeId, Long orderPrice,
Transaction transaction, OrderItem... orderItems) {
public static Order of(Long userId, Long userCouponId, Long storeId, OrderItem orderItem) {
Order order = new Order();
order.userId = userId;
order.userCouponId = userCouponId;
order.storeId = storeId;
order.orderPrice = orderPrice;
order.setTransaction(transaction);
for (OrderItem orderItem : orderItems) {
order.addOrderItem(orderItem);
}
order.usedPoint = 0L;
order.orderStatus = OrderStatus.PLACED;
order.orderTime = LocalDateTime.now();
return order;
}
public static Order of(Long userId, Long userCouponId, Long storeId, Long orderPrice,
OrderItem orderItem) {
Order order = new Order();
order.userId = userId;
order.userCouponId = userCouponId;
order.storeId = storeId;
order.orderPrice = orderPrice;
order.addOrderItem(orderItem);
@@ -80,14 +59,25 @@ public class Order extends BaseEntity {
return order;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
transaction.setOrder(this);
public static Order of(Long userId, Long userCouponId, Long storeId, List<OrderItem> orderItems) {
Order order = new Order();
order.userId = userId;
order.userCouponId = userCouponId;
order.storeId = storeId;
for (OrderItem item : orderItems) {
order.addOrderItem(item);
}
order.usedPoint = 0L;
order.orderStatus = OrderStatus.PENDING;
order.orderTime = LocalDateTime.now();
return order;
}
public Order addOrderItem(OrderItem orderItem) {
this.orderItems.add(orderItem);
this.orderPrice += (orderItem.getPrice()*orderItem.getCount());
this.orderPrice += orderItem.getTotalPrice();
orderItem.setOrder(this);
return this;
}
@@ -97,15 +87,18 @@ public class Order extends BaseEntity {
return this;
}
public void placed() {
this.orderStatus = OrderStatus.PLACED;
}
public void order() {
this.orderStatus = OrderStatus.ORDER;
}
public void reject() {
this.orderStatus = OrderStatus.REJECT;
/**
* 전체 주문 가격 조회
*/
public int getTotalPrice() {
int totalPrice = 0;
for (OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}

View File

@@ -44,7 +44,6 @@ public class OrderRepositoryCustom {
List<Order> orders = queryFactory
.selectFrom(order)
.join(order.transaction).fetchJoin()
.where(
orderIdLt(condition.getLastOrderId()),
order.orderTime.between(start, end),

View File

@@ -12,7 +12,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.SliceImpl;
public interface OrderService {
OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId);
OrderMainDto findOrderMain(OrderSearchCondition condition, Long userId);
Page<OrderDto> findPrevOrderMain(PrevOrderSearch search, Pageable pageable, Long storeId);
SliceImpl<OrderDto> findOrderHistory(Pageable pageable, Long userId);
void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId);

View File

@@ -9,6 +9,12 @@ 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.orderItemOption.entity.OrderItemOption;
import com.justpickup.orderservice.global.client.store.GetItemResponse;
import com.justpickup.orderservice.global.client.store.StoreByUserIdResponse;
import com.justpickup.orderservice.global.client.store.StoreClient;
import com.justpickup.orderservice.global.client.user.GetCustomerResponse;
import com.justpickup.orderservice.global.client.user.UserClient;
import com.justpickup.orderservice.global.dto.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
@@ -17,6 +23,7 @@ import org.springframework.data.domain.SliceImpl;
import org.springframework.data.support.PageableExecutionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StopWatch;
import java.util.List;
import java.util.Optional;
@@ -32,16 +39,36 @@ public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository;
private final OrderRepositoryCustom orderRepositoryCustom;
private final OrderSender orderSender;
private final StoreClient storeClient;
private final UserClient userClient;
@Override
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long userId) {
Result<StoreByUserIdResponse> store = storeClient.getStoreByUserId(userId);
// 주문 가져오기
OrderMainResult orderMainResult = orderRepositoryCustom.findOrderMain(condition, storeId);
OrderMainResult orderMainResult = orderRepositoryCustom.findOrderMain(condition, store.getData().getId());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
int count = 0;
// 사용자명 및 아이템 이름 가져오기
// getUserNameAndItemName(orderDtoList);
OrderMainDto returnDto = OrderMainDto.of(orderMainResult.getOrders(), orderMainResult.isHasNext());
for (OrderMainDto._Order order : returnDto.getOrders()) {
for (OrderMainDto._OrderItem orderItem : order.getOrderItems()) {
count += 1;
Result<GetItemResponse> item = storeClient.getItem(orderItem.getItemId());
orderItem.changeItemName(item.getData().getName());
}
count += 1;
GetCustomerResponse customerResponse = userClient.getCustomerById(order.getUserId()).getData();
order.changeUserName(customerResponse.getUserName());
}
stopWatch.stop();
log.info("Feign count = {}, [StopWatch] {}", count, stopWatch.prettyPrint());
return OrderMainDto.of(orderMainResult.getOrders(), orderMainResult.isHasNext());
return returnDto;
}
@Override
@@ -97,7 +124,7 @@ public class OrderServiceImpl implements OrderService {
.getStoreId().equals(storeId))
throw new OrderException("장바구니에 여러 카페의 메뉴를 담을수 없습니다.");
}else{
orderRepository.save(Order.of(userId,userCouponId,storeId,0L,orderItem));
orderRepository.save(Order.of(userId,userCouponId,storeId,orderItem));
}
}

View File

@@ -4,6 +4,7 @@ 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.dto.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
@@ -34,7 +35,7 @@ public class OrderController {
return ResponseEntity.ok(Result.createSuccessResult(null));
}
@Data @NoArgsConstructor
@Data @NoArgsConstructor @AllArgsConstructor
static class PatchOrderRequest {
private OrderStatus orderStatus;
}

View File

@@ -22,6 +22,7 @@ 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.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -41,12 +42,11 @@ public class OrderOwnerApiController {
private final PrevOrderSearchValidator prevOrderSearchValidator;
@GetMapping("/order-main")
public ResponseEntity<Result> orderMain(@Valid OrderSearchCondition condition) {
// TODO: 2022/03/10 Feign client storeId 가져오기 구현 필요
Long userId = 1L;
Long storeId = 1L;
public ResponseEntity<Result> orderMain(@Valid OrderSearchCondition condition,
@RequestHeader(value="user-id") String userHeader) {
Long userId = Long.valueOf(userHeader);
OrderMainDto orderMainDto = orderService.findOrderMain(condition, storeId);
OrderMainDto orderMainDto = orderService.findOrderMain(condition, userId);
OrderMainResponse orderMainResponse = new OrderMainResponse(orderMainDto);

View File

@@ -1,7 +1,6 @@
package com.justpickup.orderservice.domain.orderItem.entity;
import com.justpickup.orderservice.domain.order.entity.Order;
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption;
import com.justpickup.orderservice.global.entity.BaseEntity;
import lombok.AccessLevel;
@@ -65,4 +64,11 @@ public class OrderItem extends BaseEntity {
}
return orderItem;
}
/**
* 주문상품 전체 가격 조회
*/
public long getTotalPrice() {
return price * count;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
package com.justpickup.orderservice.global.client.store;
import lombok.Data;
@Data
public class StoreByUserIdResponse {
private Long id;
private String name;
}

View File

@@ -4,10 +4,15 @@ import com.justpickup.orderservice.global.dto.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service")
@FeignClient("STORE-SERVICE")
public interface StoreClient {
@GetMapping("/item/{itemId}")
Result<GetItemResponse> getItem(@PathVariable("itemId") Long itemId);
@GetMapping("/api/owner/store/")
Result<StoreByUserIdResponse> getStoreByUserId(@RequestHeader(value="user-id") Long userId);
}

View File

@@ -5,9 +5,9 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "USER-SERVICE", url = "127.0.0.1:8001/user-service")
@FeignClient("USER-SERVICE")
public interface UserClient {
@GetMapping("/customer/{userId}")
Result<GetCustomerResponse> getUser(@PathVariable("userId") Long userId);
Result<GetCustomerResponse> getCustomerById(@PathVariable("userId") Long userId);
}