diff --git a/src/main/java/geoinfo/drilling/inquiry/DrillingInquiryController.java b/src/main/java/geoinfo/drilling/inquiry/DrillingInquiryController.java index 2de1d977..cd6ba7cc 100644 --- a/src/main/java/geoinfo/drilling/inquiry/DrillingInquiryController.java +++ b/src/main/java/geoinfo/drilling/inquiry/DrillingInquiryController.java @@ -387,26 +387,31 @@ public class DrillingInquiryController { idx++; // sb.append(row.get("cid")).append(","); - sb.append(s(row.get("constName"))).append(","); - sb.append(s(row.get("projectStateCodeName"))).append(","); + sb.append(csv(row.get("constName"))).append(","); + sb.append(csv(row.get("projectStateCodeName"))).append(","); // 사업기간 constStartDate ~ constEndDate - sb.append(s(row.get("constStartDate"))).append(" ~ ").append(s(row.get("constEndDate"))).append(","); + sb.append(csv(row.get("constStartDate"))).append(" ~ ").append(csv(row.get("constEndDate"))).append(","); - sb.append(s(row.get("constStateCodeName"))).append(","); - sb.append(s(row.get("masterCompanyDept"))).append(","); - sb.append(s(row.get("masterCompanyAdmin"))).append(","); - sb.append(s(row.get("masterCompanyTel"))).append(","); - sb.append(s(row.get("constCompanyDept"))).append(","); - sb.append(s(row.get("constCompanyAdmin"))).append(","); - sb.append(s(row.get("constCompanyTel"))).append("\n"); + sb.append(csv(row.get("constStateCodeName"))).append(","); + sb.append(csv(row.get("masterCompanyDept"))).append(","); + sb.append(csv(row.get("masterCompanyAdmin"))).append(","); + sb.append(csv(row.get("masterCompanyTel"))).append(","); + sb.append(csv(row.get("coinstCompanyDept"))).append(","); + sb.append(csv(row.get("constCompanyAdmin"))).append(","); + sb.append(csv(row.get("constCompanyTel"))).append("\n"); } byte[] csvBytes = sb.toString().getBytes("UTF-8"); byte[] bom = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF}; // ---------- ★ 한글 파일명 브라우저별 처리 ---------- - String filename = "건설현장조회.csv"; + String excelFileNm = "건설현장조회"; + if (params.get("excelFileNm") != null && !"".equals(params.get("excelFileNm"))) { + excelFileNm = (String) params.get("excelFileNm"); + + } + String filename = excelFileNm+".csv"; String userAgent = request.getHeader("User-Agent"); String encodedFilename; @@ -434,4 +439,26 @@ public class DrillingInquiryController { private String s(Object o) { return o == null ? "" : o.toString(); } + + private String csv(Object o) { + if (o == null) return ""; + + String value = o.toString(); + + boolean needQuote = + value.contains(",") || + value.contains("\"") || + value.contains("\n") || + value.contains("\r"); + + if (value.contains("\"")) { + value = value.replace("\"", "\"\""); + } + + if (needQuote) { + value = "\"" + value + "\""; + } + + return value; + } } diff --git a/src/main/resources/egovframework/sqlmap/mapper/regi/regi.xml b/src/main/resources/egovframework/sqlmap/mapper/regi/regi.xml index 4d796730..b23bdcd9 100644 --- a/src/main/resources/egovframework/sqlmap/mapper/regi/regi.xml +++ b/src/main/resources/egovframework/sqlmap/mapper/regi/regi.xml @@ -35,16 +35,26 @@ ST.MODIFY_ITEM, tcsi.CID, tcsi.CRT_USERID, - tcsi.CONST_USERID + tcsi.CONST_USERID, + tgld.GL_DISTRICT, + tgmd.GM_DISTRICT, + tgsd.GS_DISTRICT, + COALESCE(tgsd.GS_DISTRICT, tgmd.GM_DISTRICT, tgld.GL_DISTRICT) AS last_district -- 우선순위: GS -> GM -> GL 순으로 NULL이 아닌 값을 선택 FROM TEMP_PROJECT_INFO A LEFT JOIN (SELECT * FROM (SELECT L.* ,ROW_NUMBER() OVER (PARTITION BY PROJECT_CODE ORDER BY REG_DATE DESC) AS RN FROM TEMP_SMS_LOG L) - WHERE RN = 1) B ON A.PROJECT_CODE = B.PROJECT_CODE - LEFT JOIN TEMP_MANAGE_STATE ST ON ST.PROJECT_CODE = A.PROJECT_CODE - AND ST.STATE = '5' - LEFT JOIN TEMP_CONSTRUCT_SITE_INFO tcsi ON tcsi.PROJECT_CODE = A.PROJECT_CODE + WHERE RN = 1) B ON A.PROJECT_CODE = B.PROJECT_CODE + LEFT JOIN TEMP_MANAGE_STATE ST ON ST.PROJECT_CODE = A.PROJECT_CODE + AND ST.STATE = '5' + LEFT JOIN TEMP_CONSTRUCT_SITE_INFO tcsi ON tcsi.PROJECT_CODE = A.PROJECT_CODE + LEFT JOIN TBL_GL_DISTRICT tgld ON tcsi.MASTER_COMPANY_O_CODE = tgld.GL_CODE + LEFT JOIN TBL_GM_DISTRICT tgmd ON tcsi.MASTER_COMPANY_O_CODE = tgmd.GL_CODE + AND tcsi.MASTER_COMPANY_TW_CODE = tgmd.GM_CODE + LEFT JOIN TBL_GS_DISTRICT tgsd ON tcsi.MASTER_COMPANY_O_CODE = tgsd.GL_CODE + AND tcsi.MASTER_COMPANY_TW_CODE = tgsd.GM_CODE + AND tcsi.MASTER_COMPANY_TH_CODE = tgsd.GS_CODE WHERE NVL(A.USE_YN,' ') <> 'N' AND A.USERID = #{userId} ]]> diff --git a/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry.jsp b/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry.jsp index 14cedda5..9cc5f537 100644 --- a/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry.jsp +++ b/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry.jsp @@ -441,6 +441,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe params.append("constCompanyAdmin", trim($('#company-admin').val())); params.append("constCompanyTel", trim($('#company-tel').val())); params.append("excelDownload", "Y"); + params.append("excelFileNm", "건설현장 조회"); // 페이지 정보 const pagingEle = document.getElementById('paging'); diff --git a/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry_project.jsp b/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry_project.jsp index cbdb6f93..21597dc4 100644 --- a/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry_project.jsp +++ b/src/main/webapp/WEB-INF/views/drilling/inquiry/drilling_inquiry_project.jsp @@ -239,6 +239,35 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe }); + /** + * 발주기관 목록화면 tr 드래그 시 상세화면 이동 방지처리 + * 드래그 이벤트와 클릭이벤트를 구분하여 감지한다. + */ + function clickExcelListDown() { + const params = new URLSearchParams(); + + params.append("constTag", trim($('#const-tag').val())); + params.append("constName", trim($('#const-name').val())); + params.append("constStartDate", trim($('#const-start-date').val())); + params.append("constEndDate", trim($('#const-end-date').val())); + params.append("constStateCode", trim($('#const-state-code').val())); + params.append("projectStateCode", 6); + params.append("constCompanyName", trim($('#company-dept').val())); + params.append("constCompanyAdmin", trim($('#company-admin').val())); + params.append("constCompanyTel", trim($('#company-tel').val())); + params.append("excelDownload", "Y"); + params.append("excelFileNm", "관리 시추정보 현황"); + + // 페이지 정보 + const pagingEle = document.getElementById('paging'); + params.append("nPage", pagingEle.getAttribute("data-npage")); + params.append("nCount", pagingEle.getAttribute("data-ncount")); + + // AJAX가 아닌 직접 다운로드 요청 + window.location.href = "/drilling/inquiry/csvDownload.do?" + params.toString(); + $('#excelDownload').val(""); + } + /** * 발주기관 목록화면 tr 드래그 시 상세화면 이동 방지처리 * 드래그 이벤트와 클릭이벤트를 구분하여 감지한다. @@ -287,6 +316,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe -
Total: -
+
+
+ +
+
Total: -
+
+
diff --git a/src/main/webapp/WEB-INF/views/drilling/mgmt/project.jsp b/src/main/webapp/WEB-INF/views/drilling/mgmt/project.jsp index 5f360a59..c7f53f90 100644 --- a/src/main/webapp/WEB-INF/views/drilling/mgmt/project.jsp +++ b/src/main/webapp/WEB-INF/views/drilling/mgmt/project.jsp @@ -251,6 +251,35 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe }); + /** + * 발주기관 목록화면 tr 드래그 시 상세화면 이동 방지처리 + * 드래그 이벤트와 클릭이벤트를 구분하여 감지한다. + */ + function clickExcelListDown() { + const params = new URLSearchParams(); + + params.append("constTag", trim($('#const-tag').val())); + params.append("constName", trim($('#const-name').val())); + params.append("constStartDate", trim($('#const-start-date').val())); + params.append("constEndDate", trim($('#const-end-date').val())); + params.append("constStateCode", trim($('#const-state-code').val())); + params.append("projectStateCode", trim($('#project-state-code').val())); + params.append("constCompanyName", trim($('#company-dept').val())); + params.append("constCompanyAdmin", trim($('#company-admin').val())); + params.append("constCompanyTel", trim($('#company-tel').val())); + params.append("excelDownload", "Y"); + params.append("excelFileNm", "시추정보 관리"); + + // 페이지 정보 + const pagingEle = document.getElementById('paging'); + params.append("nPage", pagingEle.getAttribute("data-npage")); + params.append("nCount", pagingEle.getAttribute("data-ncount")); + + // AJAX가 아닌 직접 다운로드 요청 + window.location.href = "/drilling/inquiry/csvDownload.do?" + params.toString(); + $('#excelDownload').val(""); + } + /** * 발주기관 목록화면 tr 드래그 시 상세화면 이동 방지처리 * 드래그 이벤트와 클릭이벤트를 구분하여 감지한다. @@ -299,6 +328,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe -
Total: -
+
+
+ +
+
Total: -
+
+
diff --git a/src/main/webapp/WEB-INF/views/drilling/statistics/drilling_notice.jsp b/src/main/webapp/WEB-INF/views/drilling/statistics/drilling_notice.jsp index deae4c02..8f947a4c 100644 --- a/src/main/webapp/WEB-INF/views/drilling/statistics/drilling_notice.jsp +++ b/src/main/webapp/WEB-INF/views/drilling/statistics/drilling_notice.jsp @@ -112,6 +112,7 @@ function getStatusInfo(statusCode) { /** * API 호출 결과를 받아 화면에 이력 목록을 표시하는 콜백 함수 */ + var historyData; function displayHistoryList(response) { // ▼▼▼ [수정] 대상 ID를 'notification-list-full'로 변경 var notificationList = document.getElementById('notification-list-full'); @@ -120,7 +121,7 @@ function displayHistoryList(response) { if (response && response.resultCode === 200 && response.datas) { var datas = response.datas; var contentHtml = ''; - + historyData = response.datas; // 전역 변수에 셋팅(엑셀다운로드시 필요) for (var i = 0; i < datas.length; i++) { var item = datas[i]; @@ -169,10 +170,74 @@ function displayHistoryList(response) { console.error("Error fetching history list:", response.resultMessage); } } +/** + * 알림내역 CSV 다운로드 + */ + function clickExcelListDown() { + console.log(historyData); + + if (!historyData || historyData.length === 0) { + alert("다운로드할 데이터가 없습니다."); + return; + } + + const headers = [ + "프로젝트명", + "이전상태", + "변경상태", + "변경일시" + ]; + + const STATE_MAP = { + "0": "미입력", + "1": "입력 중", + "2": "검수 준비 대기중", + "3": "검수중", + "4": "수정 요청", + "6": "검수 완료", + "6": "등록 완료" + }; + + const rows = historyData.map(function (item) { + return [ + item.constName, + STATE_MAP[item.preProjectStateCode] || item.preProjectStateCode, + STATE_MAP[item.projectStateCode] || item.projectStateCode, + item.modDt + ]; + }); + + let csvContent = ""; + csvContent += headers.join(",") + "\n"; + + rows.forEach(function (row) { + csvContent += row + .map(function (value) { + return '"' + String(value).replace(/"/g, '""') + '"'; + }) + .join(",") + "\n"; + }); + + const blob = new Blob( + ["\uFEFF" + csvContent], + { type: "text/csv;charset=utf-8;" } + ); + + const link = document.createElement("a"); + const url = URL.createObjectURL(blob); + + link.href = url; + link.download = "상태변경이력.csv"; + document.body.appendChild(link); + link.click(); + + document.body.removeChild(link); + URL.revokeObjectURL(url); +}
-
+

알림

@@ -181,31 +246,32 @@ function displayHistoryList(response) {
-
-
-
+
+
+
  • 알림 내역
도움말
-

알림 내역

-
-
-
-
-

건설현장 프로젝트 상태 변경 이력

-
-
-
알림 목록을 불러오는 중입니다...
-
-
-
+

알림 내역

+
+
+
+
+

건설현장 프로젝트 상태 변경 이력

+ +
+
+
알림 목록을 불러오는 중입니다...
+
+
+
-
+
-
+
diff --git a/src/main/webapp/WEB-INF/views/web/index.jsp b/src/main/webapp/WEB-INF/views/web/index.jsp index 689b3bbc..4df06ad2 100644 --- a/src/main/webapp/WEB-INF/views/web/index.jsp +++ b/src/main/webapp/WEB-INF/views/web/index.jsp @@ -166,6 +166,7 @@ function kendoGrid() { dataSource : gridData, columns: [ { field: "rowNumber", width: 50, title: "순번", template: "" }, + {field: "reqCompany", width: 180, title: "배정 발주기관", template: function (data) { return data.lastDistrict || data.gsDistrict || data.gmDistrict || data.glDistrict || ""; }, attributes: { style: "text-align: left" }}, { field: "projectName", title: "프로젝트명",