diff --git a/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java b/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java new file mode 100644 index 00000000..89678313 --- /dev/null +++ b/src/main/java/com/bulkpurchase/domain/dto/product/ProductForSalesVolumeSortDTO.java @@ -0,0 +1,46 @@ +package com.bulkpurchase.domain.dto.product; + +import com.bulkpurchase.domain.entity.user.User; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ProductForSalesVolumeSortDTO { + private Long productID; + private String productName; + private Double price; + private Integer stock; + private String username; // 판매자 이름 + private List imageUrls; + private Long totalQuantity; + private User user; + + public ProductForSalesVolumeSortDTO(Long productID, String productName, Double price, Integer stock, String username, List imageUrls, Long totalQuantity, User user) { + this.productID = productID; + this.productName = productName; + this.price = price; + this.stock = stock; + this.username = username; + this.imageUrls = imageUrls; + this.totalQuantity = totalQuantity; + this.user = user; + } + + public ProductForSalesVolumeSortDTO(Long productID, String productName, Double price, Integer stock, String username, Long totalQuantity, User user) { + this.productID = productID; + this.productName = productName; + this.price = price; + this.stock = stock; + this.username = username; + this.totalQuantity = totalQuantity; + this.user = user; + } + + + + public ProductForSalesVolumeSortDTO() { + } +} diff --git a/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java b/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java index ee10b133..f4b4929f 100644 --- a/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java +++ b/src/main/java/com/bulkpurchase/domain/repository/product/ProductRepository.java @@ -1,5 +1,6 @@ package com.bulkpurchase.domain.repository.product; +import com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO; import com.bulkpurchase.domain.entity.user.User; import com.bulkpurchase.domain.entity.product.Product; import com.bulkpurchase.domain.enums.ProductStatus; @@ -45,4 +46,18 @@ public interface ProductRepository extends JpaRepository { @Query("SELECT p FROM Product p ORDER BY p.productID desc ") List findAllProducts(); + + @Query(value = "SELECT new com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO" + + "(p.productID, p.productName, p.price, p.stock, p.user.username, p.imageUrls,SUM(od.quantity) , p.user)" + + "FROM OrderDetail od JOIN od.product p " + + "WHERE p.productName LIKE %:productName% " + + "GROUP BY p.productID, p.productName, p.price, p.stock, p.user.username, p.imageUrls,od.order, p.user " + + "ORDER BY SUM(od.quantity) DESC", + countQuery = "SELECT COUNT(DISTINCT p.productID) " + + "FROM OrderDetail od JOIN od.product p " + + "WHERE p.productName LIKE %:productName%", + nativeQuery = false) + Page findByProductNameContainingAndOrderBySalesVolume(@Param("productName") String productName, Pageable pageable); + + } diff --git a/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java b/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java index 3b082aa2..e8b456c6 100644 --- a/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java +++ b/src/main/java/com/bulkpurchase/domain/service/product/ProductService.java @@ -1,6 +1,7 @@ package com.bulkpurchase.domain.service.product; import com.bulkpurchase.domain.dto.product.ProductForCouponDTO; +import com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO; import com.bulkpurchase.domain.entity.user.User; import com.bulkpurchase.domain.enums.ProductStatus; import lombok.RequiredArgsConstructor; @@ -80,4 +81,8 @@ public String findProductNameById(Long productId) { public Page findPageByProductNameContaining(Pageable pageable, String productName) { return productRepository.findByProductNameContaining(pageable, productName); } + + public Page findProductsBySearchTermAndSortBySalesVolume(String productName, Pageable pageable) { + return productRepository.findByProductNameContainingAndOrderBySalesVolume(productName, pageable); + } } diff --git a/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java b/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java index 62c699bb..e865845a 100644 --- a/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java +++ b/src/main/java/com/bulkpurchase/web/controller/product/ProductSearchController.java @@ -1,11 +1,13 @@ package com.bulkpurchase.web.controller.product; +import com.bulkpurchase.domain.dto.product.ProductForSalesVolumeSortDTO; import com.bulkpurchase.domain.entity.product.Product; import com.bulkpurchase.domain.service.product.ProductService; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -18,20 +20,48 @@ public class ProductSearchController { private final ProductService productService; @GetMapping("/product/search") - public String productSearchView(@RequestParam(value = "q", required = false) String productName, @RequestParam(value = "p", required = false) Integer page, Model model) { - int size = 12; + public String productSearchView(@RequestParam(value = "q", required = false) String productName, + @RequestParam(value = "p", required = false) Integer page, + @RequestParam(value = "sortField", required = false) String sortField, + @RequestParam(value = "sortDir", required = false) String sortDir , + @RequestParam(value = "size", required = false) Integer size, + Model model) { + if (size == null) { + size = 12; + } if (page==null) { page = 1; } + + if (sortDir == null) { + sortDir = "desc"; + } if (productName == null) { return "redirect:/"; } - Pageable pageable = PageRequest.of(page-1, size); - Page productPage = productService.findPageByProductNameContaining(pageable, productName); - model.addAttribute("productPage", productPage); - model.addAttribute("totalPages", productPage.getTotalPages()); + + + if (sortField == null) { + sortField = "productID"; + } + + if (sortField.equals("salesVolume")) { + Page productPage = productService.findProductsBySearchTermAndSortBySalesVolume(productName, PageRequest.of(page - 1, size)); + model.addAttribute("productPage", productPage); + model.addAttribute("totalPages", productPage.getTotalPages()); + System.out.println("productPage = " + productPage); + } else { + Sort sort = Sort.by(Sort.Direction.fromString(sortDir), sortField); + Pageable pageable = PageRequest.of(page-1, size, sort); + Page productPage = productService.findPageByProductNameContaining(pageable, productName); + model.addAttribute("productPage", productPage); + model.addAttribute("totalPages", productPage.getTotalPages()); + } + model.addAttribute("page", page); model.addAttribute("q", productName); + model.addAttribute("sortField", sortField); + model.addAttribute("sortDir", sortDir); return "product/productSearchView"; } } diff --git a/src/main/resources/templates/product/productSearchView.html b/src/main/resources/templates/product/productSearchView.html index 057d0645..8c0abfa1 100644 --- a/src/main/resources/templates/product/productSearchView.html +++ b/src/main/resources/templates/product/productSearchView.html @@ -63,11 +63,9 @@ .floating-buttons { position: fixed; - right: 550px; /* 조정값 */ + right: 50px; /* 조정값 */ top: 50%; - transform: translateY(-50%); - display: flex; - flex-direction: column; + transform: translateY(-80%); /* 세로 중앙 정렬 */ } .floating-buttons button { @@ -105,11 +103,11 @@
- - - - - + + 낮은 가격순 + 높은 가격순 + 판매량순 + 최신순