From 225a32decf78b937844f93c08a39bd494316c8f4 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 21 Nov 2025 14:12:18 +0900 Subject: [PATCH 1/6] =?UTF-8?q?build:=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 1 + admin_list.txt | 27 ++----------------- open_builded.bat | 69 +++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 65 insertions(+), 32 deletions(-) diff --git a/.classpath b/.classpath index 6b85f05..5e8b180 100644 --- a/.classpath +++ b/.classpath @@ -26,6 +26,7 @@ + diff --git a/admin_list.txt b/admin_list.txt index f6b519d..820f5a6 100644 --- a/admin_list.txt +++ b/admin_list.txt @@ -1,26 +1,3 @@ #게시판 - 자료실에 파일 업로드 안 되는 문제 수정 건 -#src\main\resources\egovframework\egovProps\globals.properties -src\main\java\geoinfo\admins\board\CommunityController.java -src\main\java\geoinfo\admins\board\GroundReportController.java -src\main\java\geoinfo\admins\board\RefrncRoomController.java -src\main\java\geoinfo\admins\chLog\service\impl\DownloadAppServiceImpl.java -src\main\java\geoinfo\admins\chLog\ChInfoController.java -src\main\java\geoinfo\admins\chLog\DownloadAppController.java -src\main\java\geoinfo\admins\notice\NoticeMngController.java -src\main\java\geoinfo\admins\user\GeneralUserMngController.java -src\main\java\geoinfo\com\file\FileController.java - - - -src\main\java\geoinfo\admins\apiManagement\ApiManagementController.java -src\main\webapp\WEB-INF\views\admins\frame\top.jsp -src\main\webapp\WEB-INF\views\admins\main\index.jsp -src\main\webapp\WEB-INF\views\admins\main\main.jsp -src\main\webapp\WEB-INF\views\admins\mgmtApi\api-request-statistics-index.jsp -src\main\webapp\WEB-INF\views\admins\mgmtApi\left.jsp -src\main\webapp\images\admins\mgmtApi\1_tit_01.gif -src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\left.jsp -src\main\java\geoinfo\admins\apiManagement\ApiManagementController.java -src\main\java\geoinfo\admins\constructionProjectManagement\ConstructionProjectManagementController.java -src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\construction-user-mgmt-index.jsp -src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\left.jsp \ No newline at end of file +src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\construction-project-statistics-index.jsp +src\main\resources\geoinfo\sqlmap\mappers\admins\user\DrillingInquiryMapper.xml \ No newline at end of file diff --git a/open_builded.bat b/open_builded.bat index e32afe9..05d7e94 100644 --- a/open_builded.bat +++ b/open_builded.bat @@ -1,10 +1,65 @@ -explorer C:\Users\dbnt\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\geoinfo_admin +@echo off +setlocal enabledelayedexpansion +rem # ---------------------------------------------------------------------- +rem # ȯ : path.txt Ŭ θ а ũ̽ θ մϴ. +rem # ---------------------------------------------------------------------- -rem For 192.168.10.20 -hostname | find "DESKTOP-9C42CR8" > nul -if %errorlevel% == 0 ( -explorer D:\app_geoinfo\app\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\old-geoinfo-or-kr-admin -) else ( - echo goodbye +rem # target_directory ġ Ǵ η մϴ. +set "target_directory=%~dp0" +set "path_file=%target_directory%path.txt" +set "eclipse_path=" + +rem # path.txt ϴ Ȯմϴ. +if not exist "%path_file%" ( + echo [ERROR] "%path_file%" ã ϴ. ũƮ մϴ. + pause + exit /b ) + +rem # path.txt 'eclipse=' ϴ ã Ŭ θ մϴ. +for /f "tokens=1,* delims==" %%a in ('findstr /b "eclipse=" "%path_file%"') do ( + set "eclipse_path=%%b" +) + +if not defined eclipse_path ( + echo [ERROR] "%path_file%" Ŭ θ ã ϴ. + pause + exit /b +) + +rem # Ŭ θ ϴ. +set "prefs_file=!eclipse_path!\configuration\.settings\org.eclipse.ui.ide.prefs" + +if not exist "!prefs_file!" ( + echo [ERROR] Eclipse ã ϴ: "!prefs_file!" + pause + exit /b +) + +rem # Ͽ ֱ ũ̽ оɴϴ. +for /f "tokens=1,* delims==" %%a in ('findstr /b "RECENT_WORKSPACES=" "!prefs_file!"') do ( + set "workspaces_line=%%b" +) + +rem # \n ġȯϿ ΰ ù ° θ ɴϴ. +set "workspaces_line_cleaned=!workspaces_line:\n= !" +for /f "tokens=1" %%w in ("!workspaces_line_cleaned!") do ( + set "workspace_path=%%w" +) + +rem # ο Ե ̽ (\\) 齽(\) մϴ. +set "workspace_path=!workspace_path:\\=\!" + +rem # ̺ 'D\:\' ߸ 'D:\' ٷϴ. +set "drive_letter=!workspace_path:~0,1!" +if /i "!workspace_path:~1,2!" == "\:" ( + set "workspace_path=!drive_letter!:!workspace_path:~3!" +) + +rem # target_prefix մϴ. +set "target_prefix=!workspace_path!\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ld-geoinfo-or-kr-admin\" + +explorer "!target_prefix!" + +echo target_prefix: "!target_prefix!" \ No newline at end of file From eaab9989f3d6acbe7b31df466f854305d5d12167 Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 21 Nov 2025 16:10:31 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EA=B1=B4=EC=84=A4=ED=98=84?= =?UTF-8?q?=EC=9E=A5=20=ED=86=B5=EA=B3=84=EC=97=90=20=EA=B8=B0=EA=B4=80?= =?UTF-8?q?=EB=B3=84=20=EB=93=B1=EB=A1=9D=20=EA=B1=B4=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 1 + 2_apply.bat | 4 +- admin_list.txt | 2 +- ...nstructionProjectManagementController.java | 88 ++-- .../ConstructionProjectManagementMapper.java | 48 +++ .../ConstructionProjectManagementService.java | 16 + ...structionProjectManagementServiceImpl.java | 184 ++++++++ .../ConstructionProjectManagementMapper.xml | 126 ++++++ .../construction-project-statistics-index.jsp | 406 +++++++++++------- 9 files changed, 670 insertions(+), 205 deletions(-) create mode 100644 src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java create mode 100644 src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementService.java create mode 100644 src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java create mode 100644 src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index ae94e20..1c02d2a 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,7 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 encoding//src/main/java/geoinfo/admins/chLog/DownloadAppController.java=UTF-8 +encoding//src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-project-statistics-index.jsp=UTF-8 encoding//src/main/webapp/body/map/web3d/web3d.jsp=UTF-8 encoding//src/main/webapp/popups/pop_201705_01.jsp=UTF-8 encoding//src/test/java=UTF-8 diff --git a/2_apply.bat b/2_apply.bat index fed4a40..f5500a1 100644 --- a/2_apply.bat +++ b/2_apply.bat @@ -60,7 +60,7 @@ if /i "!workspace_path:~1,2!" == "\:" ( rem # target_prefix մϴ. set "target_prefix=!workspace_path!\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\geoinfo_admin\" -explorer "!target_prefix!" +#explorer "!target_prefix!" echo target_prefix: "!target_prefix!" @@ -117,7 +117,7 @@ if "!line:~-4!" == ".xml" ( set "target_file=%target_prefix%!relative_path!" ) -rem --- [ κ] --- +rem --- --- if defined source_file ( if exist "!source_file!" ( echo [COPY] diff --git a/admin_list.txt b/admin_list.txt index 820f5a6..2a57f21 100644 --- a/admin_list.txt +++ b/admin_list.txt @@ -1,3 +1,3 @@ #게시판 - 자료실에 파일 업로드 안 되는 문제 수정 건 src\main\webapp\WEB-INF\views\admins\constructionProjectManagement\construction-project-statistics-index.jsp -src\main\resources\geoinfo\sqlmap\mappers\admins\user\DrillingInquiryMapper.xml \ No newline at end of file +src\main\resources\geoinfo\sqlmap\mappers\admins\constructionProjectManagement\ConstructionProjectManagementMapper.xml \ No newline at end of file diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java b/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java index 3090fa0..e30ade0 100644 --- a/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/ConstructionProjectManagementController.java @@ -6,6 +6,7 @@ import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -25,6 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import egovframework.rte.psl.dataaccess.util.EgovMap; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import geoinfo.admins.constructionProjectManagement.service.ConstructionProjectManagementService; import geoinfo.admins.user.service.DrillingInquiryService; import geoinfo.admins.user.service.GeneralUserMngService; import geoinfo.admins.user.service.HomeTrainingService; @@ -32,8 +34,6 @@ import geoinfo.comm.util.strUtil; import geoinfo.session.UserInfo; import geoinfo.util.MyUtil; - - @Controller public class ConstructionProjectManagementController { @Resource(name = "generalUserMngService") @@ -43,11 +43,16 @@ public class ConstructionProjectManagementController { private HomeTrainingService homeTrainingService; - @Resource(name = "drillingInquiryService") - private DrillingInquiryService drillingInquiryService; + // [변경] 새로 만든 서비스 주입 + @Resource(name = "constructionProjectManagementService") + private ConstructionProjectManagementService constructionProjectManagementService; + + // [추가] 기존 검색/조회 기능을 위해 필요 (변수 선언 추가) + @Resource(name = "drillingInquiryService") + private DrillingInquiryService drillingInquiryService; /** - * 집합교육 화면 + * 건설현장 통계 화면 * @param params * @param model * @param response @@ -66,6 +71,41 @@ public class ConstructionProjectManagementController { return "admins/constructionProjectManagement/construction-project-statistics-index"; } + /** + * 건설현장 통계 데이터 조회 (AJAX) + */ + @RequestMapping(value = "admins/constructionProjectManagement/selectStatistics.do", method = RequestMethod.POST) + @ResponseBody + public JSONObject selectStatistics(HttpServletRequest request, @RequestBody String strJSON, HttpServletResponse response) { + JSONObject jsonResponse = new JSONObject(); + + try { + // 1. 파라미터 파싱 + JSONParser jsonParser = new JSONParser(); + JSONObject jsonObject = (JSONObject) jsonParser.parse(strJSON); + HashMap params = new HashMap<>(); + + if (jsonObject != null) { + for(Object key : jsonObject.keySet()){ + params.put((String)key, jsonObject.get(key)); + } + } + + // 2. 서비스 호출 (새로 만든 서비스 사용) + Map stats = constructionProjectManagementService.selectConstructionProjectStatistics(params); + + jsonResponse.put("result", "true"); + jsonResponse.put("data", stats); + + } catch (Exception e) { + jsonResponse.put("result", "false"); + jsonResponse.put("message", e.getMessage()); + e.printStackTrace(); + } + + return jsonResponse; + } + /** * 집합교육 추가 * @param request @@ -612,42 +652,6 @@ public class ConstructionProjectManagementController { return "admins/constructionProjectManagement/construction-user-detail"; } - // 발주기관 프로젝트목록 가져오기 -// @ResponseBody -// @RequestMapping(value = "/drilling-project-list", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") -// public String getDrillingProjectList(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap params) throws Exception { -// if (!UserInfo.isValidSession(request, response, "admin")) { -// return ""; -// } -// JSONObject jsonObject = new JSONObject(); -// strUtil sUtil = new strUtil(); -// -// String projectName = sUtil.checkNull((String)params.get("projectName")); -// -// JSONArray jsonListObject = new JSONArray(); -// -//// if( projectName == ""){ -//// jsonObject.put("resultMessage", "OK"); -//// jsonObject.put("resultCode", 200); -//// jsonObject.put("result", new JSONObject().put("list", jsonListObject)); -//// } else { -// JSONObject result = new JSONObject(); -// result.put("list", drillingInquiryService.drillingInquiryAutocompleteList(request, params)); -// -// jsonObject.put("resultMessage", "OK"); -// jsonObject.put("resultCode", 200); -// jsonObject.put("result", result); -//// } -// -// response.setContentType("application/json; charset=UTF-8"); // 응답 헤더 설정 -// response.setCharacterEncoding("UTF-8"); // 응답 데이터 인코딩 설정 (중요) -// -// try (OutputStream os = response.getOutputStream()) { // OutputStream 사용 -// os.write(jsonObject.toString().getBytes("UTF-8")); // UTF-8 인코딩하여 출력 -// } -// -// return null; // @ResponseBody이므로 반환 값은 필요 없습니다. -// } @RequestMapping(value = "/drilling/inquiry/list.do", method = RequestMethod.GET, produces = { "application/json; charset=utf-8" }) @ResponseBody public ResponseEntity drillingInquiryList ( @@ -771,4 +775,4 @@ public class ConstructionProjectManagementController { return "admins/constructionProjectManagement/construction-user-login-history"; } -} +} \ No newline at end of file diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java new file mode 100644 index 0000000..efb8bf3 --- /dev/null +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementMapper.java @@ -0,0 +1,48 @@ +package geoinfo.admins.constructionProjectManagement.service; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; + +import egovframework.rte.psl.dataaccess.mapper.Mapper; +import egovframework.rte.psl.dataaccess.util.EgovMap; + +@Mapper("constructionProjectManagementMapper") +public interface ConstructionProjectManagementMapper { + + /** + * 전체 건설현장 등록 건수 조회 + */ + public Long selectTotalCount(HashMap params) throws SQLException; + + /** + * 지역별 통계 조회 + */ + public List selectRegionCount(HashMap params) throws SQLException; + + /** + * 단계별 통계 조회 + */ + public List selectStageCount(HashMap params) throws SQLException; + + /** + * 최근 입력된 건설현장 목록 조회 (상위 N개) + */ + public List selectRecentProjects(HashMap params) throws SQLException; + + /** + * 통계 대상 기관명 목록 조회 + */ + public List selectStatTargetCompanies() throws SQLException; + + /** + * 기관명을 이용해 지역코드(GL, GM, GS) 구하기 (Stored Procedure 호출) + */ + public void spGetMasterCompanyDistrict(HashMap params) throws SQLException; + + /** + * 지역코드로 건설현장 수 구하기 + */ + public int selectSiteCountByDistrictCodes(HashMap params) throws SQLException; + +} \ No newline at end of file diff --git a/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementService.java b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementService.java new file mode 100644 index 0000000..28b863c --- /dev/null +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/service/ConstructionProjectManagementService.java @@ -0,0 +1,16 @@ +package geoinfo.admins.constructionProjectManagement.service; + +import java.util.HashMap; +import java.util.Map; + +public interface ConstructionProjectManagementService { + + /** + * 건설현장 통계 대시보드 데이터 조회 + * @param params 검색 조건 + * @return 통계 결과 Map (totalCount, regionList, stageList, recentList 등) + * @throws Exception + */ + public Map selectConstructionProjectStatistics(HashMap params) throws Exception; + +} \ 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 new file mode 100644 index 0000000..916524c --- /dev/null +++ b/src/main/java/geoinfo/admins/constructionProjectManagement/service/impl/ConstructionProjectManagementServiceImpl.java @@ -0,0 +1,184 @@ +package geoinfo.admins.constructionProjectManagement.service.impl; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import egovframework.rte.psl.dataaccess.util.EgovMap; +import geoinfo.admins.constructionProjectManagement.service.ConstructionProjectManagementMapper; +import geoinfo.admins.constructionProjectManagement.service.ConstructionProjectManagementService; +import geoinfo.admins.user.service.DrillingInputService; +import geoinfo.util.MyUtil; + +@Service("constructionProjectManagementService") +public class ConstructionProjectManagementServiceImpl implements ConstructionProjectManagementService { + + @Resource(name = "constructionProjectManagementMapper") + private ConstructionProjectManagementMapper constructionProjectManagementMapper; + + @Autowired + private DrillingInputService drillingInputService; + + /** + * 건설현장 통계 대시보드 데이터 조회 + */ + @Override + public Map selectConstructionProjectStatistics(HashMap params) throws Exception { + Map resultMap = new HashMap<>(); + + // 1. 사용자 권한 및 조직 코드 설정 (기존 로직) + String userId = MyUtil.getStringFromObject(params.get("userId")); + if (userId != null && !userId.isEmpty()) { + HashMap orgCodes = drillingInputService.getOrganizationUserGlGmGsGfCodes(userId); + if (orgCodes != null) { + params.put("masterCompanyOCode", orgCodes.get("v_gl")); + params.put("masterCompanyTwCode", orgCodes.get("v_gm")); + params.put("masterCompanyThCode", orgCodes.get("v_gs")); + params.put("masterCompanyName", orgCodes.get("v_gf")); + } + } + + try { + // 2. 전체 등록 수 조회 + Long totalCount = constructionProjectManagementMapper.selectTotalCount(params); + resultMap.put("totalCount", totalCount); + + // ================================================================= + // [기관별 통계 로직] v_gl='01' 필터링 및 코드순 정렬 + // ================================================================= + List> institutionStats = new ArrayList<>(); + + // 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'인 경우에만 처리 + 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); + + int siteCount = constructionProjectManagementMapper.selectSiteCountByDistrictCodes(countParams); + + // 그래프용 데이터 저장 (기관명, 건수, 정렬용 코드들) + 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); + + institutionStats.add(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); + } + }); + } + + // 결과 맵에 저장 (정렬된 리스트) + resultMap.put("institutionStats", institutionStats); + resultMap.put("busanCount", busanTotalCount); + + + // 3. 지역별 통계 조회 + List regionList = constructionProjectManagementMapper.selectRegionCount(params); + resultMap.put("regionList", regionList); + + // 4. 단계별 통계 조회 + List stageList = constructionProjectManagementMapper.selectStageCount(params); + Map stageCounts = new HashMap<>(); + + // 초기화 + stageCounts.put("feasibility", 0); + stageCounts.put("basicDesign", 0); + stageCounts.put("detailDesign", 0); + stageCounts.put("construction", 0); + stageCounts.put("completion", 0); + stageCounts.put("maintenance", 0); + + for (EgovMap map : stageList) { + String stateCode = String.valueOf(map.get("constStateCode")); + Integer cnt = Integer.parseInt(String.valueOf(map.get("cnt"))); + + if ("1".equals(stateCode)) stageCounts.put("feasibility", cnt); + else if ("2".equals(stateCode)) stageCounts.put("basicDesign", cnt); + else if ("3".equals(stateCode)) stageCounts.put("detailDesign", cnt); + else if ("4".equals(stateCode)) stageCounts.put("construction", cnt); + else if ("5".equals(stateCode)) stageCounts.put("completion", cnt); + else if ("6".equals(stateCode)) stageCounts.put("maintenance", cnt); + } + resultMap.put("stageCounts", stageCounts); + + // 5. 최근 입력된 건설현장 + params.put("firstIndex", 0); + params.put("recordCountPerPage", 5); + + List recentList = constructionProjectManagementMapper.selectRecentProjects(params); + resultMap.put("recentList", recentList); + + } catch (SQLException e) { + e.printStackTrace(); + throw new Exception("통계 데이터 조회 중 오류가 발생했습니다."); + } + + 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 new file mode 100644 index 0000000..762fdec --- /dev/null +++ b/src/main/resources/geoinfo/sqlmap/mappers/admins/constructionProjectManagement/ConstructionProjectManagementMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + AND A.CONST_NAME LIKE '%' || #{constName} || '%' + + + AND A.MASTER_COMPANY_NAME LIKE '%' || #{masterCompanyName} || '%' + + + AND A.MASTER_COMPANY_ADMIN LIKE '%' || #{masterCompanyAdmin} || '%' + + + AND A.MASTER_COMPANY_TEL LIKE '%' || #{masterCompanyTel} || '%' + + + AND A.CONST_TAG = #{constTag} + + + AND A.MASTER_COMPANY_O_CODE = #{masterCompanyOCode} + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 e0f516b..7f9de79 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 @@ -3,175 +3,261 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> - - + + + + + + + + - - - + - - + // [1] 문서 로드 완료 시 초기 실행 + document.addEventListener("DOMContentLoaded", function() { + // 초기 로딩 시 검색 조건 없이 전체 통계 조회 + moveConstructionUserDetail(); + }); - - + // [3] 화면 갱신 함수 + function renderStatistics(data) { + // (1) 전체 등록 수 + var totalCountElem = document.getElementById("total-count"); + if(totalCountElem) totalCountElem.textContent = (data.totalCount || 0) + " 건"; - -

건설현장 통계

-
+ // (2) 지역별 통계 + var busanElem = document.getElementById("busan-count"); + var daeguElem = document.getElementById("daegu-count"); + var sejongElem = document.getElementById("sejong-count"); + + if(busanElem) busanElem.textContent = "0 건"; + if(daeguElem) daeguElem.textContent = "0 건"; + if(sejongElem) sejongElem.textContent = "0 건"; + // 서버에서 계산된 부산 카운트가 있으면 우선 적용 + if(data.busanCount !== undefined && busanElem) { + busanElem.textContent = data.busanCount + " 건"; + } -
-
-
-

검색

-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- -
-
+ // 기존 리스트 기반 지역 카운트 (필요 시 사용) + if(data.regionList) { + data.regionList.forEach(function(item) { + var region = item.regionName || item.REGION_NAME || ""; + var count = item.cnt || item.CNT || 0; + + // 부산은 위에서 처리했으므로 제외하거나 중복 처리 가능 + if(region.indexOf("대구") >= 0 && daeguElem) daeguElem.textContent = count + " 건"; + else if(region.indexOf("세종") >= 0 && sejongElem) sejongElem.textContent = count + " 건"; + }); + } -

건설현장 등록 건수

-
-
-
-

전체 등록 수

-

12 건

-
-
-
-
-

부산광역시

-

12 건

-
-
-
-
-

대구광역시

-

0 건

-
-
-
-
-

세종특별자치시

-

0 건

-
-
-
+ // (3) 최근 입력된 건설현장 + var recentArea = document.getElementById("recent-project-area"); + var recentHtml = '

최근 입력된 건설현장

'; + + if(data.recentList && data.recentList.length > 0) { + data.recentList.forEach(function(project) { + var name = project.constName || project.CONST_NAME || ""; + var spot = project.projectStartSpot || project.PROJECT_START_SPOT || ""; + var spotShort = spot.split(" ")[0]; + recentHtml += '

' + name + ' - ' + spotShort + '

'; + }); + } else { + recentHtml += '

최근 등록된 데이터가 없습니다.

'; + } + recentHtml += '
' + + '
'; + if(recentArea) recentArea.innerHTML = recentHtml; -
-
-
-

최근 입력된 건설현장

-

부산 북항 재개발 사업 - 부산광역시

-

가덕도 신공항 건설공사 - 부산광역시

-

부산 에코델타시티 조성사업 - 부산광역시

-

동해남부선 복선전철화 사업 - 부산광역시

-

부산 도시철도 1호선 연장 공사 - 부산광역시

-
-
- -
-
-
-
-
-
-

단계별 건수

-

타당성조사 및 계획검토: 12건

-

기본설계: 0건

-

실시설계: 0건

-

시공중: 0건

-

준공: 0건

-

유지보수: 0건

-
-
-
-
-

프로젝트 연결률

-

부산광역시: 8.33%

-

대전광역시: 0%

-

세종특별자치시: 0%

-

서울특별시: 0%

-

대구광역시: 0%

-
-
- -
-
-
-
-
-
-
-
-

Text

-
-
-
-
-

Text

-
-
-
-
- -
+ // (4) 단계별 건수 차트 + updateStageChart(data.stageCounts || {}); + + // (5) [신규] 기관별 등록 건수 차트 업데이트 + updateInstitutionChart(data.institutionStats || []); + } -
- - + // 단계별 차트 그리기 + function updateStageChart(stageCounts) { + var chartData = [ + stageCounts.feasibility || 0, + stageCounts.basicDesign || 0, + stageCounts.detailDesign || 0, + stageCounts.construction || 0, + stageCounts.completion || 0, + stageCounts.maintenance || 0 + ]; + + var stageFeasElem = document.getElementById("stage-feasibility"); + if(stageFeasElem) stageFeasElem.textContent = (stageCounts.feasibility || 0) + "건"; + + var ctx = document.getElementById('myChart'); + if(!ctx) return; + + if (myChartInstance) myChartInstance.destroy(); + + myChartInstance = new Chart(ctx, { + type: 'bar', + data: { + labels: ['타당성조사', '기본설계', '실시설계', '시공중', '준공', '유지보수'], + datasets: [{ + label: '건설현장 단계별 건수', + data: chartData, + backgroundColor: 'rgba(54, 162, 235, 0.2)', + borderColor: 'rgba(54, 162, 235, 1)', + borderWidth: 1 + }] + }, + options: { scales: { y: { beginAtZero: true } } } + }); + } + + // [신규] 기관별 차트 그리기 함수 + function updateInstitutionChart(instStats) { + var ctx = document.getElementById('institutionChart'); + if(!ctx) return; + + if (instChartInstance) instChartInstance.destroy(); + + var labels = []; + var data = []; + + // 데이터 분리 및 라벨 보정 + instStats.forEach(function(stat) { + var name = stat.name; + + // [라벨 보정] '울산광역시' -> '한국도로공사' + if (name === '울산광역시') { + name = '한국도로공사'; + } + + labels.push(name); + data.push(stat.count); + }); + + instChartInstance = new Chart(ctx, { + type: 'bar', // 막대 그래프 + data: { + labels: labels, + datasets: [{ + label: '등록 건수', + data: data, + backgroundColor: 'rgba(75, 192, 192, 0.5)', // 색상 설정 + borderColor: 'rgba(75, 192, 192, 1)', + borderWidth: 1 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + beginAtZero: true, + ticks: { stepSize: 1 } // 정수 단위 표시 + } + }, + plugins: { + legend: { display: false }, // 범례 숨김 (단일 데이터셋이므로) + title: { + display: true, + text: '기관별 건설현장 등록 현황', + font: { size: 16 } + } + } + } + }); + } + + + + +

건설현장 통계

+
+
+
+
+ + +
+
+
+

기관별 등록 건수

+
+ +
+
+
+
+ +
+ +
+
+

최근 입력된 건설현장

+

로딩 중...

+
+
+ + +
+
+

단계별 건수

+

타당성조사 및 계획검토: 0건

+

기본설계: 0건

+

실시설계: 0건

+

시공중: 0건

+

준공: 0건

+

유지보수: 0건

+
+
+ + +
+
+ +
+
+
+ +
+
+
+
+ + \ No newline at end of file From cc0df911c0360c8c42b9bfe3375d9e69b1398593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9D=B8?= Date: Fri, 21 Nov 2025 16:37:30 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20content=20?= =?UTF-8?q?=EC=98=81=EC=97=AD=20=EB=86=92=EC=9D=B4=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapp/WEB-INF/views/admins/board/left.jsp | 4 ++-- .../webapp/WEB-INF/views/admins/chLog/left.jsp | 4 ++-- .../constructionProjectManagement/left.jsp | 4 ++-- .../WEB-INF/views/admins/frame/mainframe.jsp | 2 +- .../WEB-INF/views/admins/frame/mainframe2.jsp | 2 +- .../WEB-INF/views/admins/greport/left.jsp | 4 ++-- .../webapp/WEB-INF/views/admins/main/main.jsp | 6 +++--- .../WEB-INF/views/admins/manager/left.jsp | 4 ++-- .../WEB-INF/views/admins/mgmtApi/left.jsp | 4 ++-- .../webapp/WEB-INF/views/admins/notice/left.jsp | 4 ++-- .../webapp/WEB-INF/views/admins/user/left.jsp | 4 ++-- .../WEB-INF/views/admins/userLog/left.jsp | 4 ++-- src/main/webapp/images/admins/left_bak_2511.jpg | Bin 0 -> 27104 bytes 13 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 src/main/webapp/images/admins/left_bak_2511.jpg diff --git a/src/main/webapp/WEB-INF/views/admins/board/left.jsp b/src/main/webapp/WEB-INF/views/admins/board/left.jsp index b8b672c..120730b 100644 --- a/src/main/webapp/WEB-INF/views/admins/board/left.jsp +++ b/src/main/webapp/WEB-INF/views/admins/board/left.jsp @@ -7,7 +7,7 @@ - + diff --git a/src/main/webapp/WEB-INF/views/admins/frame/mainframe.jsp b/src/main/webapp/WEB-INF/views/admins/frame/mainframe.jsp index c919e3d..069cbba 100644 --- a/src/main/webapp/WEB-INF/views/admins/frame/mainframe.jsp +++ b/src/main/webapp/WEB-INF/views/admins/frame/mainframe.jsp @@ -16,7 +16,7 @@ var waitWin; 727보다 크게 하는 경우는 문제 없습니다. --> - + diff --git a/src/main/webapp/WEB-INF/views/admins/frame/mainframe2.jsp b/src/main/webapp/WEB-INF/views/admins/frame/mainframe2.jsp index 0136078..5b81eaf 100644 --- a/src/main/webapp/WEB-INF/views/admins/frame/mainframe2.jsp +++ b/src/main/webapp/WEB-INF/views/admins/frame/mainframe2.jsp @@ -16,7 +16,7 @@ var waitWin; 727보다 크게 하는 경우는 문제 없습니다. --> - + diff --git a/src/main/webapp/WEB-INF/views/admins/greport/left.jsp b/src/main/webapp/WEB-INF/views/admins/greport/left.jsp index b12e45a..886e2a4 100644 --- a/src/main/webapp/WEB-INF/views/admins/greport/left.jsp +++ b/src/main/webapp/WEB-INF/views/admins/greport/left.jsp @@ -7,7 +7,7 @@ -
+ diff --git a/src/main/webapp/WEB-INF/views/admins/notice/left.jsp b/src/main/webapp/WEB-INF/views/admins/notice/left.jsp index 5cdb894..d38bf92 100644 --- a/src/main/webapp/WEB-INF/views/admins/notice/left.jsp +++ b/src/main/webapp/WEB-INF/views/admins/notice/left.jsp @@ -8,7 +8,7 @@ - '; + } for( idx in obj.datas ) { const constStartDate = obj.datas[idx].constStartDate == null ? '알 수 없음' : obj.datas[idx].constStartDate; const constEndDate = obj.datas[idx].constEndDate == null ? '알 수 없음' : obj.datas[idx].constEndDate; diff --git a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-detail.jsp b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-detail.jsp index 3c6c6a8..21b942b 100644 --- a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-detail.jsp +++ b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-user-detail.jsp @@ -62,7 +62,9 @@ dataListEle.innerHTML = ''; var content = ''; - + if (obj.datas.length < 1) { + content = ''; + } for( idx in obj.datas ) { const constStartDate = obj.datas[idx].constStartDate == null ? '알 수 없음' : obj.datas[idx].constStartDate; const constEndDate = obj.datas[idx].constEndDate == null ? '알 수 없음' : obj.datas[idx].constEndDate; From bc5d1622a6c0c13c5783725ecfb3039310ddc01f Mon Sep 17 00:00:00 2001 From: thkim Date: Fri, 21 Nov 2025 17:03:32 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=EA=B1=B4=EC=84=A4=ED=98=84?= =?UTF-8?q?=EC=9E=A5=20=EA=B4=80=EB=A6=AC=EC=97=90=EC=84=9C=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=98=84=EC=9E=A5=20=ED=86=B5=EA=B3=84=EC=97=90=20?= =?UTF-8?q?=EB=B0=9C=EC=A3=BC=EA=B8=B0=EA=B4=80=20=EB=B3=84=20=EA=B1=B4?= =?UTF-8?q?=EC=84=A4=ED=98=84=EC=9E=A5=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=85=EB=A0=A5=EC=83=81=ED=83=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B8=B0=EA=B4=80=EB=B3=84=20=EC=84=B1=EA=B3=BC=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=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 @@ + +
+ diff --git a/src/main/webapp/WEB-INF/views/admins/userLog/left.jsp b/src/main/webapp/WEB-INF/views/admins/userLog/left.jsp index 864057c..8bd59ab 100644 --- a/src/main/webapp/WEB-INF/views/admins/userLog/left.jsp +++ b/src/main/webapp/WEB-INF/views/admins/userLog/left.jsp @@ -9,7 +9,7 @@ + + + + + + +
+ +
+ +
+
+ + +
+
+ +
Total: -
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
연번사업명입력상태사업내용발주기관현황건설사현황
사업기간사업단계
(설계 시공 준공 유지관리)
담당부서담당자담당연락처건설사명담당자담당연락처
+ +
+
+ + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/left.jsp b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/left.jsp index bdd6582..26b4bd9 100644 --- a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/left.jsp +++ b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/left.jsp @@ -77,6 +77,9 @@ img { border:0; } + diff --git a/src/main/webapp/com/img/common/icon/ico_btn_big_map.png b/src/main/webapp/com/img/common/icon/ico_btn_big_map.png new file mode 100644 index 0000000000000000000000000000000000000000..a80da58ad3a77322dd6d35ee4cda4a13bed18fcf GIT binary patch literal 1837 zcmbVNX;2eq7>*)WDgquTqOh!>R-5c*bCDea5)J_kVqg#zg-v!h#E@*G+BII&;a?amME;>|=RGYJ&QSTLI4gyEE$0AdW7mQWEGZd-bh z2h(r?jI{<+Z7=p!+0O1KFC@ew+QefZ#S!*;-qN<3f z0bA@&4yH4V356hw#lp7;`4p{%1TvWnf)NNocr1cvwiy}B$}^fL4QhxW%o{4y|L0f@MTdnoI*>WMU%ZAbZ2dbvP=5gM?zSSj|%l z1Tar56OlYjfDt@GC=L<{aG6vrlMd?n5+4@9GKC;qB$f&hfgmzm5spZr!VnQ6fkmt= z8|20q%?xJL5QDaLtnC4=@T*)joF*`aq7x}9W3UV2(O7qhr!3}g z?KS!oas)x^vIsnirVPNxB%``7I6&eW0V$CoJeU+}cv4&><*7-5lqVwyOav1M9wZ9_ z2l)8^O&-KL1=&00KbY zJ7P%J`tzrRu#2VN8Jy@dmsFZOKhXL23D3N!056LQX?HJvA9%vz$8GBCywtxd)5EW3 zMN>b$927Hh4H^JDcc?kID{-a zmQuL*b}YHGJ}K|{d|PW)R_23()cr^9pDe9Zxt81Z|FH#-z8Tt#BM&F|dXw)YP$1KD zTUdX()^Y2O(`k~|hSx91tc%wk4{ZsnO=?wjty1_0p(y{w#fk?9qy@wC&Mq5!WQU?k z;zMf5v6IzsT+6LX6-$#1Nu{DqeAh)$=AO*#niOoxy&JwxPrg~y+_q~aW=*}bao?X) z_q^%u?9eW_emwB)a`yx63tjigr&-^;b^RrvQnB=%rsr`VCws}5*wmhk_b!*H#d#<= zGUYyBpP;KAJ?30@H+8DGe0ax}hQ^L2_nJ`!J~=aNZS!jiR@)r)^Sb_WUOOWx+v!zq z?<%fgnyEYZ<~iL|<(&NDGgLfN%NhFi-G{id7I)>i53<53YW2( z8MX2JmE9eOo~{TIiyg0>5br7s;RX_wFpAa%kQo`nr|mNyEql?zEh{TaUeSIfe?_m_ zcmG~;p8LUyl(<5#`ugm{Pt876l@(3OwzjHqZHY5abfqM{vQ60((`eP;9?h;L&Hd9~ z&)U8{NPTRaYJOLbP&1qR+_Fts^5fkh%hvB%^Q!pO*%P$4pZ{fjFEPtQ0UTcEIbLH- m;LplAb0N1k7wVt+{SeOer`xvOljn%-Kd_j{xQJ>+TK+#ipS&ah literal 0 HcmV?d00001 diff --git a/src/main/webapp/com/img/common/icon/ico_btn_search.png b/src/main/webapp/com/img/common/icon/ico_btn_search.png new file mode 100644 index 0000000000000000000000000000000000000000..239f78f4f1b239db4c07eda9c2d7ea882ade68b4 GIT binary patch literal 1505 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!WpKsVXIz(~Q|QqR!L z#Kg=%N5ROz$Uxt~RNv4@*U-$$z{JYXTmcG{fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr62to{@q^cxGNo zetEGbSc9*xm1kaYNn&1ds;7&s63_^}%*+%kLsK(LCj%E_S63%vLqk_5M@vUjOA}*P zH%B8!V>4HCm|mCsATTyAK;qT@(WYQ;4UF zV@SoVH`DfaO9cuXzu)CKQ6NcF`J#4+j;ey-Lx&BP8;qvTFj8N#;Y0if{tc5H4m>&` z$~If%kfVa&6_K4zM~;~^No~2YfbEMyR#U~~_c>)J=YBlCjx*fy!`Gdg-~E2G$K2Sz zv*U>GEYCX|-ZuWfduH{VNh-0s%dF=18}4c7TfqF)HFX8cTp<6{s>(3cC0j17WMbUa z{807FoV#k1JtNkJC7R7{)j6HCF(RXXj^lBL`rB+Fb537MxS-zgr_TOqk)>3x+mf3p zMhl%5IxGz6_+hR$eRc1}U8V1M4+ziG5bC^8V6kMi7!TXYw9SD^6Bp!d_x@NB)99q? zVZ`&qwpq_|)4>FX)7LUgG-jWjbo}wd6DzL24z!TDw!pufao?l%N=fsZ6*gfDWHOfq zU2J$?&baMP-uJDx(djap`uaj0HFomM^-kNbGhV;?kTHGn(WIME;f)RsH{O;VleQMz(^3)j0fs_MN;+PFeG zZ2fiD{r8`*f1bf$-^1kpQ+e{q7hRL$_2&9zPgif7z5SN-`G6}*Gkv;l=4=z3=CyQ6 zt&8^`p76Zummf(8mz;XKsl#pYqOjF}uL?;Dbsu%Hn}5A#&y;d=#_gu>+a>Nfwb#5Y zu$XdX{`u#NZsufFFUwJ6=eBLMNbTR?CEn)GEqZG82Oh6g!dd2)()Ld47n)zNeZlx}M Date: Fri, 21 Nov 2025 16:41:43 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=EA=B1=B4=EC=84=A4=ED=98=84=EC=9E=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=B3=B4=EA=B0=80=20=EC=97=86?= =?UTF-8?q?=EC=9C=BC=EB=A9=B4=20=EA=B8=B0=EB=B3=B8=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=AA=A9=EB=A1=9D=20=EC=97=86=EC=9D=8C=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constructionProjectManagement/construction-site-index.jsp | 3 +++ .../construction-user-detail.jsp | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-site-index.jsp b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-site-index.jsp index 3def249..e7e212e 100644 --- a/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-site-index.jsp +++ b/src/main/webapp/WEB-INF/views/admins/constructionProjectManagement/construction-site-index.jsp @@ -62,6 +62,9 @@ var content = ''; + if (obj.datas.length < 1) { + content = '
조회된 건설현장이 없습니다.
조회된 건설현장이 없습니다.