From d8bbc6ad944306ca022a6d04921c085495aaefc0 Mon Sep 17 00:00:00 2001 From: moong Date: Fri, 28 Nov 2025 17:41:07 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=A1=B0=ED=9A=8C=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EA=B2=BD=EA=B3=A0=ED=86=B5=EA=B3=84=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../caution/controller/CautionController.java | 28 +- .../search/caution/mapper/CautionMapper.java | 11 +- .../biz/search/caution/model/CautionDto.java | 69 ++- .../caution/service/CautionService.java | 6 +- .../service/impl/CautionServiceImpl.java | 117 +++- .../mapper/biz/search/CautionMapper_maria.xml | 181 +++---- .../WEB-INF/views/biz/search/caution.jsp | 509 +++++++++--------- 7 files changed, 527 insertions(+), 394 deletions(-) diff --git a/src/main/java/go/kr/project/biz/search/caution/controller/CautionController.java b/src/main/java/go/kr/project/biz/search/caution/controller/CautionController.java index 041aff0..bf98b26 100644 --- a/src/main/java/go/kr/project/biz/search/caution/controller/CautionController.java +++ b/src/main/java/go/kr/project/biz/search/caution/controller/CautionController.java @@ -12,6 +12,10 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; import java.util.List; @Controller @@ -22,7 +26,6 @@ public class CautionController { private final CautionService cautionService; @GetMapping("/search/caution/caution.do") - public String cautionPageReturn() { return "biz/search/caution" + TilesConstants.BASE; } @@ -33,8 +36,27 @@ public class CautionController { dto.setTotalCount(0); dto.setPagingYn("N"); - List result = cautionService.selectAllSearch(dto); + List result = cautionService.selectAllSearch(dto); + + return ApiResponseUtil.successWithGrid(result, dto); + } + + @GetMapping("/search/caution/caution-hwp-download.do") + public void downloadCautionHwp(@ModelAttribute CautionDto.Request.Search dto, + HttpServletResponse response) throws Exception { + + byte[] fileBytes = cautionService.generateCautionStatsHwp(dto); + + String fileName = "경고통계_" + LocalDate.now() + ".hwp"; + String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()) + .replaceAll("\\+", "%20"); + + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", + "attachment; filename=\"" + encodedFileName + "\";"); + response.setContentLength(fileBytes.length); - return ApiResponseUtil.successWithGrid(result,dto); + response.getOutputStream().write(fileBytes); + response.getOutputStream().flush(); } } diff --git a/src/main/java/go/kr/project/biz/search/caution/mapper/CautionMapper.java b/src/main/java/go/kr/project/biz/search/caution/mapper/CautionMapper.java index 25af756..09a53e9 100644 --- a/src/main/java/go/kr/project/biz/search/caution/mapper/CautionMapper.java +++ b/src/main/java/go/kr/project/biz/search/caution/mapper/CautionMapper.java @@ -8,5 +8,14 @@ import java.util.List; @Mapper public interface CautionMapper { - List selectAllSearch(CautionDto.Request.Search dto); + // List selectAllSearch(CautionDto.Request.Search dto); + + + List selectYearStats(CautionDto.Request.Search dto); + + List selectDeviceStats(CautionDto.Request.Search dto); + + List selectTypeStats(CautionDto.Request.Search dto); + + List selectDetailStats(CautionDto.Request.Search dto); } diff --git a/src/main/java/go/kr/project/biz/search/caution/model/CautionDto.java b/src/main/java/go/kr/project/biz/search/caution/model/CautionDto.java index 1f25688..8f1cad4 100644 --- a/src/main/java/go/kr/project/biz/search/caution/model/CautionDto.java +++ b/src/main/java/go/kr/project/biz/search/caution/model/CautionDto.java @@ -4,6 +4,8 @@ import go.kr.project.system.common.model.PagingVO; import lombok.Getter; import lombok.Setter; +import java.util.List; + public class CautionDto { public static class Request { @@ -12,26 +14,10 @@ public class CautionDto { public static class Search extends PagingVO { - private String searchCondition; - private String searchCondition1; - private String searchCondition2; - private String searchCondition3; - private String searchCondition4; - private String searchKeyword; + private String gridId; + private String searchStartDt; private String searchEndDt; - private String searchCarno; - private String searchName; - private String searchJno; - private String searchUser; - private String searchTel; - private String searchBbsno; - private String searchPos; - private String searchAddr; - private String searchTime1; - private String searchTime2; - private String worker; - } } @@ -63,11 +49,52 @@ public class CautionDto { } @Getter @Setter - public static class Violation { + public static class YearStats { + private String year; + private String insCnt; + private String violCnt; + private String totalCnt; + } - private String vlCode; + @Getter + @Setter + public static class DeviceStats { + private String year; + private String cctvCnt; + private String smgCnt; + private String totalCnt; + } + + @Getter + @Setter + public static class TypeStats { private String vlId; + private String insCnt; + private String violCnt; + private String totalCnt; + } + @Getter + @Setter + public static class DetailStats { + private String year; + private String instructNormalCnt; + private String instructRegistCnt; + private String sajunNormalCnt; + private String sajunRegistCnt; + private String bugwaNormalCnt; + private String bugwaRegistCnt; + private String dokNormalCnt; + private String dokRegistCnt; + private String totalCnt; } - } + @Getter + @Setter + public static class StatsForHwp { + private List yearList; + private List deviceList; + private List typeList; + private List detailList; + } + } } diff --git a/src/main/java/go/kr/project/biz/search/caution/service/CautionService.java b/src/main/java/go/kr/project/biz/search/caution/service/CautionService.java index d4e442c..647a1b9 100644 --- a/src/main/java/go/kr/project/biz/search/caution/service/CautionService.java +++ b/src/main/java/go/kr/project/biz/search/caution/service/CautionService.java @@ -6,5 +6,9 @@ import java.util.List; public interface CautionService { - List selectAllSearch(CautionDto.Request.Search dto); + List selectAllSearch(CautionDto.Request.Search dto); + + CautionDto.Response.StatsForHwp getStatsForHwp(CautionDto.Request.Search dto); + + byte[] generateCautionStatsHwp(CautionDto.Request.Search dto) throws Exception; } diff --git a/src/main/java/go/kr/project/biz/search/caution/service/impl/CautionServiceImpl.java b/src/main/java/go/kr/project/biz/search/caution/service/impl/CautionServiceImpl.java index b626ab6..27e0e98 100644 --- a/src/main/java/go/kr/project/biz/search/caution/service/impl/CautionServiceImpl.java +++ b/src/main/java/go/kr/project/biz/search/caution/service/impl/CautionServiceImpl.java @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; @Service @@ -18,13 +19,125 @@ public class CautionServiceImpl extends EgovAbstractServiceImpl implements Cauti private final CautionMapper cautionMapper; @Override - public List selectAllSearch(CautionDto.Request.Search dto) { + public List selectAllSearch(CautionDto.Request.Search dto) { - List list = cautionMapper.selectAllSearch(dto); + String gridId = dto.getGridId(); + log.info("selectAllSearch gridId = {}", gridId); + List list; + + if ("YEAR".equals(gridId)) { + list = cautionMapper.selectYearStats(dto); + } else if ("DEVICE".equals(gridId)) { + list = cautionMapper.selectDeviceStats(dto); + } else if ("TYPE".equals(gridId)) { + list = cautionMapper.selectTypeStats(dto); + } else if ("DETAIL".equals(gridId)) { + list = cautionMapper.selectDetailStats(dto); + } else { + list = Collections.emptyList(); + } + + log.info("gridId={}, resultSize={}", gridId, list.size()); return list; + } + + @Override + public CautionDto.Response.StatsForHwp getStatsForHwp(CautionDto.Request.Search dto) { + if (dto.getSearchStartDt() != null) { + dto.setSearchStartDt(dto.getSearchStartDt().replaceAll("-", "")); + } + if (dto.getSearchEndDt() != null) { + dto.setSearchEndDt(dto.getSearchEndDt().replaceAll("-", "")); + } + + CautionDto.Response.StatsForHwp stats = new CautionDto.Response.StatsForHwp(); + + stats.setYearList( cautionMapper.selectYearStats(dto)); + stats.setDeviceList( cautionMapper.selectDeviceStats(dto)); + stats.setTypeList( cautionMapper.selectTypeStats(dto)); + stats.setDetailList( cautionMapper.selectDetailStats(dto)); + + return stats; } + @Override + public byte[] generateCautionStatsHwp(CautionDto.Request.Search dto) throws Exception { + + CautionDto.Response.StatsForHwp stats = getStatsForHwp(dto); + + + StringBuilder sb = new StringBuilder(); + + sb.append("[경고 통계]\n"); + sb.append("조회기간: ") + .append(dto.getSearchStartDt()) + .append(" ~ ") + .append(dto.getSearchEndDt()) + .append("\n\n"); + + sb.append("1. 연도별 경고/과태료/전체\n"); + if (stats.getYearList() != null) { + for (CautionDto.Response.YearStats y : stats.getYearList()) { + sb.append(y.getYear()).append("년 경고:") + .append(y.getInsCnt()) + .append(" 과태료:") + .append(y.getViolCnt()) + .append(" 합계:") + .append(y.getTotalCnt()) + .append("\n"); + } + } + sb.append("\n"); + + sb.append("2. 단속장비/안전신문고\n"); + if (stats.getDeviceList() != null) { + for (CautionDto.Response.DeviceStats d : stats.getDeviceList()) { + sb.append(d.getYear()).append("년 자동단속기:") + .append(d.getCctvCnt()) + .append(" 안전신문고:") + .append(d.getSmgCnt()) + .append(" 합계:") + .append(d.getTotalCnt()) + .append("\n"); + } + } + sb.append("\n"); + + sb.append("3. 위반유형별 경고/과태료/합계\n"); + if (stats.getTypeList() != null) { + for (CautionDto.Response.TypeStats t : stats.getTypeList()) { + sb.append(t.getVlId()).append(" 경고:") + .append(t.getInsCnt()) + .append(" 과태료:") + .append(t.getViolCnt()) + .append(" 합계:") + .append(t.getTotalCnt()) + .append("\n"); + } + } + sb.append("\n"); + + sb.append("4. 단계별(계도/사전/부과/독촉) 합계\n"); + if (stats.getDetailList() != null) { + for (CautionDto.Response.DetailStats d : stats.getDetailList()) { + sb.append(d.getYear()).append("년 ") + .append("계도(일반/등기): ") + .append(d.getInstructNormalCnt()).append("/").append(d.getInstructRegistCnt()) + .append(" 사전(일반/등기): ") + .append(d.getSajunNormalCnt()).append("/").append(d.getSajunRegistCnt()) + .append(" 부과(일반/등기): ") + .append(d.getBugwaNormalCnt()).append("/").append(d.getBugwaRegistCnt()) + .append(" 독촉(일반/등기): ") + .append(d.getDokNormalCnt()).append("/").append(d.getDokRegistCnt()) + .append(" 합계: ") + .append(d.getTotalCnt()) + .append("\n"); + } + } + + return sb.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8); + } } diff --git a/src/main/resources/mybatis/mapper/biz/search/CautionMapper_maria.xml b/src/main/resources/mybatis/mapper/biz/search/CautionMapper_maria.xml index fbe969c..e951271 100644 --- a/src/main/resources/mybatis/mapper/biz/search/CautionMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/biz/search/CautionMapper_maria.xml @@ -4,123 +4,80 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - AND M.MM_STATE = #{searchCondition1} - - - - - AND M.MM_DLGB = #{searchCondition2} - - - - - AND M.MM_INGB = #{searchCondition3} - - - - - - - - - - - - AND M.MM_CARNO LIKE CONCAT('%', #{searchCarno}, '%') - - - - - AND O.OM_NAME LIKE CONCAT('%', #{searchName}, '%') - - - - - AND O.OM_JNO LIKE CONCAT('%', #{searchJno}, '%') - + SELECT SUBSTR(mm_date,1,4) AS year, + CONCAT(COUNT(NULLIF(CASE WHEN mm_state = '83' THEN '0' + WHEN mm_state = '84' THEN '0' + ELSE '1' END, '1'))) AS insCnt, + CONCAT(COUNT(NULLIF(CASE WHEN mm_state = '83' THEN '0' + WHEN mm_state = '84' THEN '0' + ELSE '1' END, '0'))) AS violCnt, + CONCAT(COUNT(*)) AS totalCnt + FROM cp_main + WHERE mm_state IN ('21','31','42','51','52','53','54','55','71','72','73','74','75','83','84') + AND mm_date BETWEEN REPLACE(#{searchStartDt}, '-', '') AND REPLACE(#{searchEndDt}, '-', '') + GROUP BY SUBSTR(mm_date,1,4) + - - - AND A.AS_USER LIKE CONCAT('%', #{searchUser}, '%') - + + - - - - + - + diff --git a/src/main/webapp/WEB-INF/views/biz/search/caution.jsp b/src/main/webapp/WEB-INF/views/biz/search/caution.jsp index 798d236..1c86524 100644 --- a/src/main/webapp/WEB-INF/views/biz/search/caution.jsp +++ b/src/main/webapp/WEB-INF/views/biz/search/caution.jsp @@ -44,143 +44,98 @@ -
-
-
-
-
- - -
- -
-
연도별 합계
-
-
- - -
-
연도별 단속수단
-
-
- - -
-
위반유형별
-
-
-
- - -
-
-
상세 통계
-
-
-
-
-
+
+ +
+
+
+
+ +
-