크루메이트 코드 리뷰!!

식단 관리 - 열량 차트

행복하게사는게꿈 2020. 9. 18. 04:19

구글차트에 넣어줄 데이터 요청

function graph(){
	$.ajax({
		url : '${pageContext.request.contextPath}/user/diet/dietMemGraphList',
		error : function(result){
			alert('dietMemGraphList 에러');
		},
		success : function(result){
			

// 			$('#chart_chart').empty();
			
			google.charts.load('current', {'packages':['line','controls']});
			chartDrowFun.chartDrow(result);		
		}
	})	
}

 

요청을 받는 컨트롤러

@RequestMapping("dietMemGraphList")
	public ModelAndView dietMemGraph(ModelAndView andView, Map<String, String> params, HttpServletRequest request,
			HttpSession session) throws Exception {

		session = request.getSession();

		MemberVO memberInfo = (MemberVO) session.getAttribute("LOGIN_MEMBERINFO");

		params.put("mem_no", memberInfo.getMem_no());

		List<Diet_dayVO> dietDayMemList = dietService.dietMemGraphList(params);

		andView.addObject("dietDayMemList", dietDayMemList);

		andView.setViewName("jsonConvertView");
		
		return andView;
	}

 

실행되는 쿼리

SELECT *
from(
SELECT c.MEM_NO MEM_NO, d.DD_DATE DD_DATE, d.DD_KCAL DD_KCAL, c.DAY_KCAL DAY_KCAL
		FROM (
			SELECT MEM_NO, dm_no, DAY_KCAL, TO_CHAR(DM_DATE, 'YYYY-MM-DD') dm_date
			FROM DIET_MEM
			WHERE dm_no IN (
				SELECT max(a.dm_no) dm_no
				FROM diet_mem a, diet_day b
				WHERE a.MEM_NO = b.MEM_NO
				AND b.dd_date = TO_CHAR(a.DM_DATE, 'YYYY-MM-DD')
				GROUP BY dd_date)
			AND TO_CHAR(DM_DATE, 'YYYY-MM-DD') IN (
													SELECT dd_date
													FROM diet_mem a, diet_day b
													WHERE a.MEM_NO = b.MEM_NO
													AND b.dd_date = TO_CHAR(a.DM_DATE, 'YYYY-MM-DD')
													GROUP BY dd_date
													)
			)c , DIET_DAY d
		WHERE c.dm_date = d.dd_date
		AND d.mem_no = #{mem_no}
		ORDER BY dd_date)
		WHERE mem_no = #{mem_no}

 

//차트
var chartDrowFun = {

 chartDrow : function(e){

     // 보낼 데이터 - mem_no, 

     // 필요한거 dietMem의 dm_date, day_kcal
     
     // diet_day의 dd_kcal 
     var chartData = '';
     //날짜형식 변경하고 싶으시면 이 부분 수정하세요.
     var chartDateformat     = 'MM월dd일';
     //라인차트의 라인 수
     var chartLineCount    = 10;
     //컨트롤러 바 차트의 라인 수
     var controlLineCount    = 10;


     function drawDashboard() {

       var data = new google.visualization.DataTable();
       //그래프에 표시할 컬럼 추가
       data.addColumn('datetime' , '날짜');
       data.addColumn('number'   , '섭취 열량');
       data.addColumn('number'   , '목표 열량');
       

       //그래프에 표시할 데이터
       var dataRow = [];

       for(var i = 0; i < e.dietDayMemList.length; i++){ //데이터 삽입
           
     	  var dd_kcal = e.dietDayMemList[i].dd_kcal;
          var day_kcal = e.dietDayMemList[i].day_kcal;

           dataRow = [new Date(e.dietDayMemList[i].dd_date.split('-')[0], e.dietDayMemList[i].dd_date.split('-')[1] -1,e.dietDayMemList[i].dd_date.split('-')[2], '00'), Number(dd_kcal), Number(day_kcal)];
           data.addRow(dataRow);
       }
         var chart = new google.visualization.ChartWrapper({
           chartType   : 'LineChart',
           containerId : 'lineChartArea', //라인 차트 생성할 영역
           options     : {
                           isStacked   : 'percent',
                           focusTarget : 'category',
                           height          : 500,
                           width           : 1150,
							  chartArea: {left:30,top:20, bottom:50, top : 100},
                           legend          : { position: "top", textStyle: {fontSize: 13}},
                           pointSize        : 5,
                           tooltip          : {textStyle : {fontSize:12}, showColorCode : true,trigger: 'both'},
                           hAxis              : {format: chartDateformat, gridlines:{count:chartLineCount,units: {
                                                               years : {format: ['yyyy년']},
                                                               months: {format: ['MM월']},
                                                               days  : {format: ['dd일']},
                                                               hours : {format: ['HH시']}}
                                                             },textStyle: {fontSize:12}},
             vAxis              : {minValue: 100,viewWindow:{min:0},gridlines:{count:-1},textStyle:{fontSize:12}},
             animation        : {startup: true,duration: 1000,easing: 'in' },
             annotations    : {pattern: chartDateformat,
                             textStyle: {
                             fontSize: 15,
                             bold: true,
                             italic: true,
                             color: '#871b47',
                             auraColor: '#d799ae',
                             opacity: 0.8,
                             pattern: chartDateformat
                           }
                         }
           }
         });

         var control = new google.visualization.ControlWrapper({
           controlType: 'ChartRangeFilter',
           containerId: 'controlsArea',  //control bar를 생성할 영역
           options: {
               ui:{
                     chartType: 'LineChart',
                     chartOptions: {
                     chartArea: {'width': '70%','height' : 130},
                       hAxis: {'baselineColor': 'none', format: chartDateformat, textStyle: {fontSize:12},
                         gridlines:{count:controlLineCount,units: {
                               years : {format: ['yyyy년']},
                               months: {format: ['MM월']},
                               days  : {format: ['dd일']},
                               hours : {format: ['HH시']}}
                         }}
                     }
               },
                 filterColumnIndex: 0
             }
         });

         var date_formatter = new google.visualization.DateFormat({ pattern: chartDateformat});
         date_formatter.format(data, 0);

         var dashboard = new google.visualization.Dashboard(document.getElementById('Line_Controls_Chart'));
         window.addEventListener('resize', function() { dashboard.draw(data); }, false); //화면 크기에 따라 그래프 크기 변경
         dashboard.bind([control], [chart]);
         dashboard.draw(data);

     }
       google.charts.setOnLoadCallback(drawDashboard);

   }
 }