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);
+}