package com.eactive.ext.kjb.statistics; import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; 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.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.ApiStatsDay; import com.eactive.eai.rms.data.entity.onl.kjb.statistics.ApiStatsDayService; import com.eactive.ext.kjb.statistics.mapping.ApiStatsUIMapper; import com.eactive.ext.kjb.statistics.service.ApiStatsExcelExportService; import com.eactive.ext.kjb.statistics.ui.ApiStatsChartUI; import com.eactive.ext.kjb.statistics.ui.ApiStatsSearch; import com.eactive.ext.kjb.statistics.ui.ApiStatsUI; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Controller @RequiredArgsConstructor public class ApiStatsDayController { private final ApiStatsDayService service; private final ApiStatsUIMapper mapper; private final ApiStatsExcelExportService excelExportService; @GetMapping(value = "/onl/kjb/statistics/apiStatsDayMan.view") public String view() { return "/onl/kjb/statistics/apiStatsDayMan"; } @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=LIST") public ResponseEntity> selectList(ApiStatsSearch search, Pageable pageable) { Pageable sortedPageable = PageRequest.of( pageable.getPageNumber(), pageable.getPageSize(), Sort.by(Sort.Order.desc("statTime"))); Page page = service.selectList(search, sortedPageable); Page uiPage = page.map(mapper::toVo); return ResponseEntity.ok(new GridResponse<>(uiPage)); } @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=CHART") public ResponseEntity> selectChartData(ApiStatsSearch search) { List chartData = service.selectChartData(search); return ResponseEntity.ok(chartData); } @PostMapping(value = "/onl/kjb/statistics/apiStatsDayMan.json", params = "cmd=EXCEL_EXPORT") public void exportToExcel(ApiStatsSearch search, HttpServletResponse response) throws IOException { log.info("Excel export started - search: {}", search); try { List dataList = service.selectListForExcel(search); log.info("Data retrieved - count: {}", dataList.size()); if (dataList.isEmpty()) { log.warn("No data found for export"); response.setStatus(HttpServletResponse.SC_NO_CONTENT); response.setContentType("application/json; charset=UTF-8"); response.getWriter().write("{\"message\":\"조회된 데이터가 없습니다.\"}"); response.getWriter().flush(); return; } List uiList = dataList.stream() .map(mapper::toVo) .collect(Collectors.toList()); log.info("Data converted to UI list - count: {}", uiList.size()); String fileName = generateFileName(search); log.info("Generating Excel file: {}", fileName); excelExportService.exportApiStats(uiList, fileName, response); log.info("Excel export completed successfully"); } catch (Exception e) { log.error("Excel export failed - error: {}", e.getMessage(), e); if (!response.isCommitted()) { response.reset(); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.setContentType("application/json; charset=UTF-8"); response.getWriter().write("{\"message\":\"Excel 파일 생성 중 오류가 발생했습니다: " + e.getMessage() + "\"}"); response.getWriter().flush(); } else { log.error("Cannot send error response - response already committed"); } } } private String generateFileName(ApiStatsSearch search) { String timeRange = StringUtils.isNotBlank(search.getSearchStartDateTime()) ? search.getSearchStartDateTime() : LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); return "API일별통계_" + timeRange + ".xlsx"; } }