JAVA를 잡아라!...
최종 프로젝트_관리자_매출 관리 본문
[ 관리자_매출관리 기능 ]
- 매출 현황 페이지
- 상품별 매출 출력
- 매출 검색
- 전일 대비 매출 페이지
- 전일/금일 시간대별 매출 그래프
- 금일 상품 매출 TOP10 출력
- 월별 매출 페이지
- 월별 매출 그래프
- 금월 상품 매출 TOP10 출력
📌 매출 검색 기능
1. ajax로 비동기 요청
2-1. 해당 요청 url의 메서드에서 Service로 비즈니스로직(CRUD)을 사용
2-2. 해당 Service(인터페이스) 구현체
3-1. DAO로 데이터액세스로직(CRUD) 수행
ProductDAO.java _해당 로직 부분의 코드만 참조 ↓
package com.webWeavers.weaveGlow.biz.product;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository("productDAO")
public class ProductDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
// ------------------------------------- AdminPage_매출관리 -------------------------------------
// 검색조건별 매출현황 쿼리문 반환 함수
private static String selectAllProductSalesQuery(ProductDTO productDTO) {
// 상품별 카테고리 정보 조회 CTE
String query = "WITH P_CATEGORY AS (\r\n"
+ "SELECT\r\n"
+ " CZ.PRODUCT_PK,\r\n"
+ " C.CATEGORY_NAME,\r\n"
+ " GROUP_CONCAT(S.SUBCATEGORY_NAME ORDER BY S.SUBCATEGORY_PK) AS SUBCATEGORY_NAME\r\n" // 여러 ROW로 되어 있는 데이터(GROUP BY를 통해 그룹핑 된 결과)를 하나의 ROW로 묶어서 출력
+ "FROM CATEGORIZATION CZ\r\n"
+ "INNER JOIN SUBCATEGORY S ON CZ.SUBCATEGORY_PK = S.SUBCATEGORY_PK\r\n"
+ "INNER JOIN CATEGORY C ON S.CATEGORY_PK = C.CATEGORY_PK\r\n"
+ "WHERE 1 = 1";
// 카테고리 및 서브카테고리 조건
if(productDTO.getCategoryPK() > 0) {
//System.out.println("[로그] 카테고리");
query += " AND C.CATEGORY_PK = " + productDTO.getCategoryPK();
}
if(productDTO.getSubCategoryPK() > 0) {
//System.out.println("[로그] 서브카테고리");
query += " AND S.SUBCATEGORY_PK = " + productDTO.getSubCategoryPK();
}
// 쿼리 SELECT절 (상품정보, 매출정보, 카테고리정보)
query += "\r\nGROUP BY CZ.PRODUCT_PK, C.CATEGORY_NAME\r\n"
+ ")\r\n"
+ "SELECT\r\n"
+ " P.PRODUCT_PK,\r\n"
+ " P.PRODUCT_NAME,\r\n"
+ " P.PRODUCT_PRICE,\r\n"
+ " COALESCE(SUM(B.BUYPRODUCT_CNT), 0) AS TOTAL_CNT,\r\n" // 상품별 전체 구매개수 (NULL이면 0반환)
+ " COALESCE((P.PRODUCT_PRICE * SUM(B.BUYPRODUCT_CNT)), 0) AS TOTAL_PRICE,\r\n" // 상품별 전체 매출 (NULL이면 0반환)
+ " GROUP_CONCAT(S.SERIAL_REGDATE ORDER BY S.SERIAL_PK) AS SERIAL_REGDATE,\r\n"
+ " PC.CATEGORY_NAME,\r\n"
+ " PC.SUBCATEGORY_NAME\r\n"
+ "FROM PRODUCT P\r\n"
+ "LEFT JOIN BUYPRODUCT B ON P.PRODUCT_PK = B.PRODUCT_PK\r\n" // 구매개수 추출
+ "LEFT JOIN SERIAL S ON B.SERIAL_PK = S.SERIAL_PK\r\n" // 주문일 추출
+ "INNER JOIN P_CATEGORY PC ON P.PRODUCT_PK = PC.PRODUCT_PK\r\n" // 카테고리 정보 추출
+ "WHERE 1 = 1";
// 시작일 및 종료일 조건
if(productDTO.getStartDate() != "" && productDTO.getStartDate() != null) {
System.out.println("로그1 들어옴");
query += " AND S.SERIAL_REGDATE >= '" + productDTO.getStartDate() + "'";
}
if(productDTO.getEndDate() != "" && productDTO.getEndDate() != null) {
System.out.println("로그2 들어옴");
query += " AND S.SERIAL_REGDATE <= DATE_ADD('" + productDTO.getEndDate() + "', INTERVAL 1 DAY)";
}
// 쿼리 GROUP BY, ORDER BY 부분
query += "\r\nGROUP BY P.PRODUCT_PK, P.PRODUCT_NAME, P.PRODUCT_PRICE, PC.CATEGORY_NAME, PC.SUBCATEGORY_NAME\r\n"
+ "ORDER BY TOTAL_PRICE DESC";
System.out.println(query);
return query;
}
public List<ProductDTO> selectAll(ProductDTO productDTO) {
System.out.println(productDTO.getMemberID());
Object[] args1 = { productDTO.getMemberID() };
Object[] args2 = { productDTO.getMemberID(), productDTO.getProductName() };
try {
// User_메인페이지(판매량순, 찜순)
if (productDTO.getSearchCondition().equals("userMain")) { // 쿼리반환함수 인자 : DTO를 줘도되지만 정렬조건만 있어도돼서 개별로줌
return jdbcTemplate.query(selectAllMainPageProductList(productDTO.getSortType()), args1, new ProductListUserRowMapper());
}
...
// Admin_매출현황페이지
else if (productDTO.getSearchCondition().equals("adminProductSales")) {
return jdbcTemplate.query(selectAllProductSalesQuery(productDTO), new ProductSalesAdminRowMapper());
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
}
//selectAll_Admin_매출관리>매출현황페이지
class ProductSalesAdminRowMapper implements RowMapper<ProductDTO> {
@Override
public ProductDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
ProductDTO data = new ProductDTO();
data.setProductPK(rs.getInt("PRODUCT_PK"));
data.setProductName(rs.getString("PRODUCT_NAME"));
data.setProductPrice(rs.getInt("PRODUCT_PRICE"));
data.setTotalCnt(rs.getInt("TOTAL_CNT"));
data.setTotalPrice(rs.getInt("TOTAL_PRICE"));
data.setCategoryName(rs.getString("CATEGORY_NAME"));
data.setSubCategoryName(rs.getString("SUBCATEGORY_NAME"));
return data;
}
}
3-2. 해당 SELECT문
private static String selectAllProductSalesQuery(ProductDTO productDTO)
해당 함수는 검색조건별 쿼리문이 동적으로 형성되어 최종 쿼리문이 반환됨
총 3가지의 검색조건이 있으며
조건을 설정하지 않은 전체 매출이 기본적으로 출력되며,
조건을 설정할때마다 해당 조건의 쿼리문이 String으로 결합하면서 조건문이 추가됨
⭐ 프로그램 실행
'팀 프로젝트' 카테고리의 다른 글
최종 프로젝트_관리자_대시보드 (0) | 2024.03.29 |
---|---|
MySQL_매출 현황 : GROUP_CONCAT, COALESCE, IFNULL (0) | 2024.03.27 |
최종 프로젝트_관리자_상품 관리 (0) | 2024.03.25 |
최종 프로젝트_관리자_회원 관리 (0) | 2024.03.25 |
최종 프로젝트_DBMS 이관 (Oracle → MySQL) (0) | 2024.03.14 |