JAVA를 잡아라!...

최종 프로젝트_관리자_매출 관리 본문

팀 프로젝트

최종 프로젝트_관리자_매출 관리

onivv 2024. 3. 26. 17:31

[ 관리자_매출관리 기능 ]

  1. 매출 현황 페이지
    • 상품별 매출 출력
    • 매출 검색
  2. 전일 대비 매출 페이지
    • 전일/금일 시간대별 매출 그래프
    • 금일 상품 매출 TOP10 출력
  3. 월별 매출 페이지
    1. 월별 매출 그래프
    2. 금월 상품 매출 TOP10  출력

 

📌 매출 검색 기능

1. ajax로 비동기 요청

adminSales.js

 

2-1. 해당 요청 url의 메서드에서 Service로 비즈니스로직(CRUD)을 사용

AdminController.java


2-2. 해당 Service(인터페이스) 구현체

ProductSercviceImpl.java

 

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으로 결합하면서 조건문이 추가됨

카테고리 및 서브카테고리 조건
기간 조건

 

⭐ 프로그램 실행

상품별 조건에 부합하는 매출내역
쿼리문(함수리턴값) 로그 결과