From bc5d1622a6c0c13c5783725ecfb3039310ddc01f Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 21 Nov 2025 17:03:32 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B1=B4=EC=84=A4=ED=98=84=EC=9E=A5=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=97=90=EC=84=9C=20=EA=B1=B4=EC=84=A4?= =?UTF-8?q?=ED=98=84=EC=9E=A5=20=ED=86=B5=EA=B3=84=EC=97=90=20=EB=B0=9C?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=EA=B4=80=20=EB=B3=84=20=EA=B1=B4=EC=84=A4?= =?UTF-8?q?=ED=98=84=EC=9E=A5=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=83=81=ED=83=9C=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EA=B4=80=EB=B3=84=20=EC=84=B1=EA=B3=BC=20=ED=98=84=ED=99=A9=20?= =?UTF-8?q?=EA=B5=AC=ED=97=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConstructionProjectManagementMapper.java | 10 + ...structionProjectManagementServiceImpl.java | 147 ++++---- .../ConstructionProjectManagementMapper.xml | 41 ++- .../construction-project-statistics-index.jsp | 339 ++++++++++-------- 4 files changed, 327 insertions(+), 210 deletions(-) diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java index efb8bf3..9ab65e5 100644 --- a/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java @@ -45,4 +45,14 @@ public interface ConstructionProjectManagementMapper { */ public int selectSiteCountByDistrictCodes(HashMap params) throws SQLException; + /** + * [신규] 기관별 입력 상태별(PROJECT_STATE_CODE) 현황 조회 + */ + public List selectProjectStateCountByDistrictCodes(HashMap params) throws SQLException; + + /** + * [신규] 기관별 성과 현황(CONST_STATE_CODE - 공사단계) 조회 + */ + public List selectConstStateCountByDistrictCodes(HashMap params) throws SQLException; + } \ No newline at end of file diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java b/src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java index 916524c..818c874 100644 --- a/src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java @@ -28,14 +28,11 @@ public class ConstructionProjectManagementServiceImpl implements ConstructionPro @Autowired private DrillingInputService drillingInputService; - /** - * 건설현장 통계 대시보드 데이터 조회 - */ @Override public Map selectConstructionProjectStatistics(HashMap params) throws Exception { Map resultMap = new HashMap<>(); - // 1. 사용자 권한 및 조직 코드 설정 (기존 로직) + // 1. 사용자 권한 및 조직 코드 설정 String userId = MyUtil.getStringFromObject(params.get("userId")); if (userId != null && !userId.isEmpty()) { HashMap orgCodes = drillingInputService.getOrganizationUserGlGmGsGfCodes(userId); @@ -53,99 +50,129 @@ public class ConstructionProjectManagementServiceImpl implements ConstructionPro resultMap.put("totalCount", totalCount); // ================================================================= - // [기관별 통계 로직] v_gl='01' 필터링 및 코드순 정렬 + // [기관별 통계 로직] 데이터 합산 및 정렬 // ================================================================= - List> institutionStats = new ArrayList<>(); + // 중복 기관 합산을 위한 맵 (Key: 기관명) + Map> uniqueStatsMap = new HashMap<>(); - // A. 통계 대상 기관명 목록 조회 List companyList = constructionProjectManagementMapper.selectStatTargetCompanies(); - - // 부산 지역(v_gl='01') 합계용 변수 int busanTotalCount = 0; if (companyList != null) { for (String companyName : companyList) { if (companyName == null || companyName.trim().isEmpty()) continue; - // B. SP 호출하여 지역코드(GL, GM, GS) 획득 HashMap spParams = new HashMap<>(); spParams.put("projectMasterCompanyName", companyName); - // SP 실행 (OUT 변수는 spParams에 담김: v_gl, v_gm, v_gs) constructionProjectManagementMapper.spGetMasterCompanyDistrict(spParams); String v_gl = (String) spParams.get("v_gl"); String v_gm = (String) spParams.get("v_gm"); String v_gs = (String) spParams.get("v_gs"); - // [필터링 조건] v_gl이 '01'인 경우에만 처리 + // [필터링] v_gl이 '01'인 경우에만 처리 if ("01".equals(v_gl)) { - // C. 해당 지역코드로 건설현장 수 카운트 - HashMap countParams = new HashMap<>(); - countParams.put("v_gl", v_gl); - countParams.put("v_gm", v_gm); - countParams.put("v_gs", v_gs); + // [명칭 보정] 한국도로공사 코드인 경우 이름을 강제 통일 (울산광역시 -> 한국도로공사 등) + if ("01".equals(v_gl) && "02".equals(v_gm) && "002".equals(v_gs)) { + companyName = "한국도로공사"; + } - int siteCount = constructionProjectManagementMapper.selectSiteCountByDistrictCodes(countParams); + HashMap queryParams = new HashMap<>(); + queryParams.put("v_gl", v_gl); + queryParams.put("v_gm", v_gm); + queryParams.put("v_gs", v_gs); + + // 1) 전체 건수 + int siteCount = constructionProjectManagementMapper.selectSiteCountByDistrictCodes(queryParams); - // 그래프용 데이터 저장 (기관명, 건수, 정렬용 코드들) - Map stat = new HashMap<>(); - stat.put("name", companyName); - stat.put("count", siteCount); - stat.put("gl", v_gl); - stat.put("gm", v_gm); - stat.put("gs", v_gs); + // 2) 입력 상태별 현황 + List inputStateList = constructionProjectManagementMapper.selectProjectStateCountByDistrictCodes(queryParams); + int[] inputStatusData = new int[7]; + for(EgovMap m : inputStateList) { + int code = MyUtil.getIntegerFromObject(m.get("code")); + int cnt = MyUtil.getIntegerFromObject(m.get("cnt")); + if(code >= 0 && code <= 6) inputStatusData[code] = cnt; + } + + // 3) 성과 현황 + List perfStateList = constructionProjectManagementMapper.selectConstStateCountByDistrictCodes(queryParams); + int[] performanceData = new int[6]; + for(EgovMap m : perfStateList) { + int code = MyUtil.getIntegerFromObject(m.get("code")); + int cnt = MyUtil.getIntegerFromObject(m.get("cnt")); + if(code >= 1 && code <= 6) performanceData[code - 1] = cnt; + } - institutionStats.add(stat); + // [데이터 합산 로직] 이미 존재하는 기관명이면 데이터 누적 + if (uniqueStatsMap.containsKey(companyName)) { + Map existing = uniqueStatsMap.get(companyName); + + // 건수 합산 + int currentCount = (Integer) existing.get("count"); + existing.put("count", currentCount + siteCount); + + // 입력상태 배열 합산 + int[] exInput = (int[]) existing.get("inputStatusData"); + for(int i=0; i<7; i++) exInput[i] += inputStatusData[i]; + existing.put("inputStatusData", exInput); + + // 성과현황 배열 합산 + int[] exPerf = (int[]) existing.get("performanceData"); + for(int i=0; i<6; i++) exPerf[i] += performanceData[i]; + existing.put("performanceData", exPerf); + + } else { + // 신규 추가 + Map stat = new HashMap<>(); + stat.put("name", companyName); + stat.put("count", siteCount); + stat.put("gl", v_gl); + stat.put("gm", v_gm); + stat.put("gs", v_gs); + stat.put("inputStatusData", inputStatusData); + stat.put("performanceData", performanceData); + + uniqueStatsMap.put(companyName, stat); + } - // 부산 지역 합계 누적 busanTotalCount += siteCount; } } - - // [정렬] GL_CODE ASC, GM_CODE ASC, GS_CODE ASC 순서로 정렬 - Collections.sort(institutionStats, new Comparator>() { - @Override - public int compare(Map o1, Map o2) { - String gl1 = (String) o1.get("gl"); - String gl2 = (String) o2.get("gl"); - int result = compareString(gl1, gl2); - if (result != 0) return result; - - String gm1 = (String) o1.get("gm"); - String gm2 = (String) o2.get("gm"); - result = compareString(gm1, gm2); - if (result != 0) return result; - - String gs1 = (String) o1.get("gs"); - String gs2 = (String) o2.get("gs"); - return compareString(gs1, gs2); - } - - // null-safe string comparison - private int compareString(String s1, String s2) { - if (s1 == null) s1 = ""; - if (s2 == null) s2 = ""; - return s1.compareTo(s2); - } - }); } - // 결과 맵에 저장 (정렬된 리스트) + // Map 값을 List로 변환 + List> institutionStats = new ArrayList<>(uniqueStatsMap.values()); + + // [정렬] GL_CODE ASC, GM_CODE ASC, GS_CODE ASC 순서로 정렬 + Collections.sort(institutionStats, new Comparator>() { + @Override + public int compare(Map o1, Map o2) { + String gl1 = (String) o1.get("gl"); String gl2 = (String) o2.get("gl"); + int result = compareString(gl1, gl2); if (result != 0) return result; + + String gm1 = (String) o1.get("gm"); String gm2 = (String) o2.get("gm"); + result = compareString(gm1, gm2); if (result != 0) return result; + + String gs1 = (String) o1.get("gs"); String gs2 = (String) o2.get("gs"); + return compareString(gs1, gs2); + } + private int compareString(String s1, String s2) { + return (s1 == null ? "" : s1).compareTo(s2 == null ? "" : s2); + } + }); + resultMap.put("institutionStats", institutionStats); resultMap.put("busanCount", busanTotalCount); - // 3. 지역별 통계 조회 List regionList = constructionProjectManagementMapper.selectRegionCount(params); resultMap.put("regionList", regionList); - // 4. 단계별 통계 조회 + // 4. 단계별 통계 List stageList = constructionProjectManagementMapper.selectStageCount(params); Map stageCounts = new HashMap<>(); - - // 초기화 stageCounts.put("feasibility", 0); stageCounts.put("basicDesign", 0); stageCounts.put("detailDesign", 0); @@ -169,7 +196,6 @@ public class ConstructionProjectManagementServiceImpl implements ConstructionPro // 5. 최근 입력된 건설현장 params.put("firstIndex", 0); params.put("recordCountPerPage", 5); - List recentList = constructionProjectManagementMapper.selectRecentProjects(params); resultMap.put("recentList", recentList); @@ -180,5 +206,4 @@ public class ConstructionProjectManagementServiceImpl implements ConstructionPro return resultMap; } - } \ No newline at end of file diff --git a/src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml b/src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml index 762fdec..9648494 100644 --- a/src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml +++ b/src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml @@ -1,10 +1,9 @@ - - + AND A.CONST_NAME LIKE '%' || #{constName} || '%' @@ -26,7 +25,7 @@ - + - + - + - + - + - + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-project-statistics-index.jsp b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-project-statistics-index.jsp index 7f9de79..41a9e97 100644 --- a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-project-statistics-index.jsp +++ b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-project-statistics-index.jsp @@ -12,32 +12,56 @@ + +