Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,36 @@ public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}

public static Order createOrder(Member member, Delivery delivery,
OrderItem... orderItems) {
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for (OrderItem orderItem : orderItems) {
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}


public void cancel() {
if (delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니 다.");
}
this.setStatus(OrderStatus.CANCEL);
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}

public int getTotalPrice() {
int totalPrice = 0;
for (OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,22 @@ public class OrderItem {

private int orderPrice; //주문 가격
private int count;

public static OrderItem createOrderItem(Item item, int orderPrice, int
count) {
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
item.removeStock(count);
return orderItem;
}

public void cancel() {
getItem().addStock(count);
}

public int getTotalPrice() {
return getOrderPrice() * getCount();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class OrderSearch {

private String memberName;
private OrderStatus orderStatus;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public void save(Item item) {
em.persist(item);
}
else{
em.merge(item);
em.merge(item);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package jpabook.jpashop.repository;

import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.*;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderSearch;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class OrderRepository {

private final EntityManager em;

public void save(Order order) {
em.persist(order);
}

public Order findOne(Long id) {
return em.find(Order.class, id);
}

public List<Order> findAllByString(OrderSearch orderSearch){

String jpql = "select o from Order o join o.member m";
boolean isFirstCondition = true;

if(orderSearch.getOrderStatus() != null){
if(isFirstCondition){
jpql += " where";
isFirstCondition = false;
}
else{
jpql += " and";
}
jpql += " o.status = :status";
}

if (StringUtils.hasText(orderSearch.getMemberName())) {
if (isFirstCondition) {
jpql += " where";
isFirstCondition = false;
} else {
jpql += " and";
}
jpql += " m.name like :name";
}

TypedQuery<Order> query = em.createQuery(jpql, Order.class)
.setMaxResults(1000);

if (orderSearch.getOrderStatus() != null) {
query = query.setParameter("status", orderSearch.getOrderStatus());
}
if (StringUtils.hasText(orderSearch.getMemberName())) {
query = query.setParameter("name", orderSearch.getMemberName());
}
return query.getResultList();
}

public List<Order> findAllByCriteria(OrderSearch orderSearch) {

CriteriaBuilder cb = em.getCriteriaBuilder();

CriteriaQuery<Order> cq = cb.createQuery(Order.class);

Root<Order> o = cq.from(Order.class);
Join<Order, Member> m = o.join("member", JoinType.INNER); //회원과 조인
List<Predicate> criteria = new ArrayList<>();

if (orderSearch.getOrderStatus() != null) {
Predicate status = cb.equal(o.get("status"),
orderSearch.getOrderStatus());
criteria.add(status);
}

if (StringUtils.hasText(orderSearch.getMemberName())) {
Predicate name =
cb.like(m.<String>get("name"), "%" +
orderSearch.getMemberName() + "%");
criteria.add(name);
}

cq.where(cb.and(criteria.toArray(new Predicate[criteria.size()])));
TypedQuery<Order> query = em.createQuery(cq).setMaxResults(1000); //최대1000건
return query.getResultList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

import java.util.List;

import static org.springframework.data.jpa.domain.AbstractPersistable_.id;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {

Expand All @@ -27,4 +28,14 @@ public List<Item> findItems() {
public Item findOne(Long itemId) {
return itemRepository.findOne(itemId);
}

@Transactional
public void updateItem(Long id, String name, int price, int stockQuantity) {

Item item = itemRepository.findOne(id);
item.setName(name);
item.setPrice(price);
item.setStockQuantity(stockQuantity);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package jpabook.jpashop.service;

import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import jpabook.jpashop.repository.MemberRepository;
import jpabook.jpashop.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderService {

private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;

@Transactional
public Long order(Long memberId, Long itemId, int count) {

Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);

Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
delivery.setStatus(DeliveryStatus.READY);

OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(),
count);


Order order = Order.createOrder(member, delivery, orderItem);

orderRepository.save(order);
return order.getId();
}

@Transactional
public void cancelOrder(Long orderId) {

Order order = orderRepository.findOne(orderId);
order.cancel();
}

public List<Order> findOrders(OrderSearch orderSearch) {
return orderRepository.findAllByString(orderSearch);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package jpabook.jpashop.web;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BookForm {

private Long id;

private String name;
private int price;
private int stockQuantity;

private String author;
private String isbn;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package jpabook.jpashop.web;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@Slf4j
public class HomeController {

@RequestMapping("/")
public String home() {
log.info("home controller");
return "home";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package jpabook.jpashop.web;

import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@Controller
@RequiredArgsConstructor
public class ItemController {

private final ItemService itemService;

@GetMapping(value = "/items/new")
public String createForm(Model model) {
model.addAttribute("form", new BookForm());
return "items/createItemForm";
}

@PostMapping(value = "/items/new")
public String create(BookForm form) {

Book book = new Book();
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());

itemService.saveItem(book);
return "redirect:/items";
}

@GetMapping(value = "/items")
public String list(Model model) {

List<Item> items = itemService.findItems();
model.addAttribute("items", items);
return "items/itemList";
}

@GetMapping(value = "/items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model
model) {

Book item = (Book) itemService.findOne(itemId);

BookForm form = new BookForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
form.setAuthor(item.getAuthor());
form.setIsbn(item.getIsbn());

model.addAttribute("form", form);
return "items/updateItemForm";
}

@PostMapping(value = "/items/{itemId}/edit")
public String updateItem(@PathVariable Long itemId,@ModelAttribute("form") BookForm form){

itemService.updateItem(itemId,form.getName(),form.getPrice(),form.getStockQuantity());
return "redirect:/items";
}
}
Loading