From 19dc7dd29e4b001d882325acd077ade9efd76bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9D=B8?= Date: Tue, 20 Jan 2026 14:46:21 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=9C=EC=A3=BC=EA=B8=B0=EA=B4=80=20?= =?UTF-8?q?=EA=B1=B4=EC=84=A4=ED=98=84=EC=9E=A5=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=8B=9C=20=EA=B1=B4=EC=84=A4=EC=82=AC=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../input/DrillingInputController.java | 70 ++++++++ .../input/service/DrillingInputMapper.java | 1 + .../input/service/DrillingInputService.java | 7 + .../impl/DrillingInputServiceImpl.java | 69 +++++++- .../drilling/input/DrillingInputMapper.xml | 19 +++ .../views/drilling/input/drilling_input.jsp | 160 +++++++++++++++++- 6 files changed, 313 insertions(+), 13 deletions(-) diff --git a/src/main/java/geoinfo/drilling/input/DrillingInputController.java b/src/main/java/geoinfo/drilling/input/DrillingInputController.java index bcb02cdf..a5c0a7fe 100644 --- a/src/main/java/geoinfo/drilling/input/DrillingInputController.java +++ b/src/main/java/geoinfo/drilling/input/DrillingInputController.java @@ -168,6 +168,76 @@ public class DrillingInputController { return jSONOResponse; } + + // 발주기관 건설사목록 가져오기 + @ResponseBody + @RequestMapping(value = "/drilling-company-list", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public String getDrillingCompanyList(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap params) throws Exception { + + JSONObject jsonObject = new JSONObject(); + strUtil sUtil = new strUtil(); + + String projectName = sUtil.checkNull((String)params.get("companyName")); + + 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", drillingInputService.selectConstructCompanyList(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이므로 반환 값은 필요 없습니다. + } + + // [발주기관 > 건설현장입력] 건설사 계정 선택시 이름, 연락처 자동셋팅 + @ResponseBody + @RequestMapping(value = "/const-user-info", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public String getConstUserInfo(HttpServletRequest request, HttpServletResponse response, @RequestParam HashMap params) throws Exception { + + JSONObject jsonObject = new JSONObject(); + strUtil sUtil = new strUtil(); + + String userid = sUtil.checkNull((String)params.get("encUserid")); + + JSONArray jsonListObject = new JSONArray(); + + if( userid == ""){ + jsonObject.put("resultMessage", "OK"); + jsonObject.put("resultCode", 200); + jsonObject.put("result", new JSONObject().put("data", jsonListObject)); + } else { + JSONObject result = new JSONObject(); + result.put("data", drillingInputService.selectConstructUserInfo(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이므로 반환 값은 필요 없습니다. + } /** * 발주 기관 사용자의 소속을 가져온다. diff --git a/src/main/java/geoinfo/drilling/input/service/DrillingInputMapper.java b/src/main/java/geoinfo/drilling/input/service/DrillingInputMapper.java index 8eac99ba..272da038 100644 --- a/src/main/java/geoinfo/drilling/input/service/DrillingInputMapper.java +++ b/src/main/java/geoinfo/drilling/input/service/DrillingInputMapper.java @@ -15,6 +15,7 @@ public interface DrillingInputMapper { public void spGetMasterCompanyDistrict(HashMap spGetMasterCompanyDistrictParams) throws SQLException; + public List selectConstructCompanyList(HashMap params) throws SQLException; public EgovMap getDepartments(HashMap params) throws SQLException; public HashMap spUdtTblCsi(HashMap params) throws SQLException; diff --git a/src/main/java/geoinfo/drilling/input/service/DrillingInputService.java b/src/main/java/geoinfo/drilling/input/service/DrillingInputService.java index 29dab6dc..e99881a5 100644 --- a/src/main/java/geoinfo/drilling/input/service/DrillingInputService.java +++ b/src/main/java/geoinfo/drilling/input/service/DrillingInputService.java @@ -1,15 +1,22 @@ package geoinfo.drilling.input.service; +import java.sql.SQLException; import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.json.simple.JSONObject; +import egovframework.rte.psl.dataaccess.util.EgovMap; + public interface DrillingInputService { HashMap getOrganizationUserGlGmGsGfCodes(String userId) throws Exception; HashMap drillingInputAdd(HttpServletRequest request, HashMap params) throws Exception; + List selectConstructCompanyList(HashMap params) throws Exception; + Map selectConstructUserInfo(HashMap params) throws Exception; void getDepartments(HttpServletRequest request, HashMap params, JSONObject jsonResponse) throws Exception; HashMap updateProjectCodeAndProjectStateCodeByCid(HttpServletRequest request, HashMap params) throws Exception; HashMap updateProjectCodeAndProjectStateCodeByProjectCode(HttpServletRequest request, HashMap params) throws Exception; diff --git a/src/main/java/geoinfo/drilling/input/service/impl/DrillingInputServiceImpl.java b/src/main/java/geoinfo/drilling/input/service/impl/DrillingInputServiceImpl.java index 81690c5a..4031ab8f 100644 --- a/src/main/java/geoinfo/drilling/input/service/impl/DrillingInputServiceImpl.java +++ b/src/main/java/geoinfo/drilling/input/service/impl/DrillingInputServiceImpl.java @@ -1,26 +1,26 @@ package geoinfo.drilling.input.service.impl; -import geoinfo.drilling.input.service.DrillingInputMapper; -import geoinfo.drilling.input.service.DrillingInputService; -import geoinfo.drilling.inquiry.service.DrillingInquiryService; -import geoinfo.main.login.service.LoginMapper; -import geoinfo.util.MyUtil; - import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import egovframework.com.cmm.service.EgovProperties; import egovframework.rte.psl.dataaccess.util.EgovMap; +import geoinfo.com.CryptoUtil; +import geoinfo.drilling.input.service.DrillingInputMapper; +import geoinfo.drilling.input.service.DrillingInputService; +import geoinfo.drilling.inquiry.service.DrillingInquiryService; +import geoinfo.main.login.service.LoginMapper; +import geoinfo.util.MyUtil; @Service("drillingInputService") public class DrillingInputServiceImpl implements DrillingInputService { @@ -76,6 +76,11 @@ public class DrillingInputServiceImpl implements DrillingInputService { params.put("masterCompanyThCode", MyUtil.getStringFromObject( spGetMasterCompanyDistrictParams.get("v_gs") )); params.put("masterCompanyName", MyUtil.getStringFromObject( spGetMasterCompanyDistrictParams.get("v_gf") )); + // 건설사 계정 연결(암호화된 userid 복호화) + String encryptId = MyUtil.getStringFromObject( params.get("encUserid") ); + String decryptId = CryptoUtil.decryptQuickAES(encryptId); + + params.put("constUserid", decryptId); try { @@ -88,7 +93,50 @@ public class DrillingInputServiceImpl implements DrillingInputService { } } + + @Override + public List selectConstructCompanyList(HashMap params) throws Exception { + List list = new ArrayList(); + list = drillingInputMapper.selectConstructCompanyList(params); + + for (EgovMap map : list) { + + String userid = (String) map.get("userid"); + if (userid == null) continue; + + // 암호화 +// String encryptId = CryptoUtil.encryptAES256(userid, secret_key); + String encryptId = CryptoUtil.encryptQuickAES(userid); + // userid 제거 + map.remove("userid"); + + // 복호화 (검증 or 필요 시) +// String decryptId = CryptoUtil.decryptAES256(encryptId, secret_key); + + map.put("encryptId", encryptId); +// map.put("decryptId", decryptId); + } + + return list; + } + @Override + public Map selectConstructUserInfo(HashMap params) throws Exception { + Map result = new HashMap(); + // 건설사 계정 연결(암호화된 userid 복호화) + String encryptId = MyUtil.getStringFromObject( params.get("encUserid") ); + String decryptId = CryptoUtil.decryptQuickAES(encryptId); + params.put("userid", decryptId); + + Map infoData = loginMapper.selectWebMemberIn(params); + + if (result != infoData) { + result.put("phone", infoData.get("phone")); + result.put("userName", infoData.get("user_name")); + } + return result; + } + @Override public void getDepartments(HttpServletRequest request, HashMap params, JSONObject jsonResponse) throws Exception { @@ -252,7 +300,12 @@ public class DrillingInputServiceImpl implements DrillingInputService { findConstCompanyCodeByConstCompanyNameParams.put("masterCompanyTwCode", MyUtil.getStringFromObject( findConstCompanyCodeByConstCompanyNameParams.get("v_gm") )); findConstCompanyCodeByConstCompanyNameParams.put("masterCompanyThCode", MyUtil.getStringFromObject( findConstCompanyCodeByConstCompanyNameParams.get("v_gs") )); findConstCompanyCodeByConstCompanyNameParams.put("masterCompanyName", MyUtil.getStringFromObject( findConstCompanyCodeByConstCompanyNameParams.get("v_gf") )); + + // 건설사 계정 연결(암호화된 userid 복호화) + String encryptId = MyUtil.getStringFromObject( params.get("encUserid") ); + String decryptId = CryptoUtil.decryptQuickAES(encryptId); + params.put("constUserid", decryptId); try { diff --git a/src/main/resources/egovframework/sqlmap/mapper/drilling/input/DrillingInputMapper.xml b/src/main/resources/egovframework/sqlmap/mapper/drilling/input/DrillingInputMapper.xml index 628aea1e..e5affc49 100644 --- a/src/main/resources/egovframework/sqlmap/mapper/drilling/input/DrillingInputMapper.xml +++ b/src/main/resources/egovframework/sqlmap/mapper/drilling/input/DrillingInputMapper.xml @@ -34,6 +34,7 @@ #{constCompanyTel}, 'C', #{userId}, + #{constUserid}, #{v_CID, mode=OUT, jdbcType=INTEGER}, #{v_RetCode, mode=OUT, jdbcType=INTEGER}, #{v_RetMsg, mode=OUT, jdbcType=VARCHAR} @@ -61,6 +62,23 @@ ) } + + + + + + `; if (tableId > 1) { @@ -338,6 +371,99 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe }); + document.querySelectorAll('.const-company-dept').forEach(function (companyNameInput) { + document.addEventListener('keyup', function (e) { + if (!e.target.classList.contains('const-company-dept')) return; + + const companyNameInput = e.target; + const companyName = companyNameInput.value.trim(); + const suggestionListDiv = companyNameInput + .closest('td') + .querySelector('.suggestionList'); + const hiddenUserIdInput = companyNameInput + .closest('td') + .querySelector('input[type="hidden"][name="const-user-id"]'); + const tableContainerDiv = companyNameInput + .closest('div') + if (!suggestionListDiv) return; + + if (companyName.length === 0) { + suggestionListDiv.style.display = 'none'; + return; + } + + $.ajax({ + type: 'GET', + url: '/drilling-company-list.json', + dataType: 'json', + data: { + companyName: companyName, + isProjectNameChecking: 'true' + }, + success: function (json) { + + suggestionListDiv.innerHTML = ''; + suggestionListDiv.style.display = 'none'; + + const list = json?.result?.list || []; + if (list.length === 0) return; + + list.forEach(function (item) { + + const suggestionItem = document.createElement('div'); + let maskedid = ''; + let partName = ''; + let newAddress = ''; + if (item.maskedid) maskedid = item.maskedid; + if (item.partName) partName = item.partName; + if (item.newAddress) newAddress = item.newAddress; + + const keyword = companyName; + const regex = new RegExp(keyword, 'gi'); + const boldCompanyName = item.companyName.replace( + regex, + '' + keyword + '' + ); + + suggestionItem.innerHTML = + '' + boldCompanyName + '
' + + '' + maskedid + '(' + partName + ')' + '/' + newAddress + ''; + + suggestionItem.addEventListener('click', function () { + companyNameInput.value = item.companyName; + hiddenUserIdInput.value = item.encryptId; + suggestionListDiv.style.display = 'none'; + setConstInfo(item.encryptId, tableContainerDiv); // 건설사 계정 선택시 이름, 연락처 자동 셋팅 + }); + + suggestionListDiv.appendChild(suggestionItem); + }); + + const rect = companyNameInput.getBoundingClientRect(); + suggestionListDiv.style.display = 'block'; + } + }); + }); + }); + + // 사용자가 추천 목록 외부를 클릭하면 목록 숨기기 (선택적) +/* document.onclick = function(event) { + if (event.target !== companyNameInput && event.target !== suggestionListDiv && !suggestionListDiv.contains(event.target)) { + suggestionListDiv.style.display = "none"; + } + };*/ + document.addEventListener('click', function (e) { + document.querySelectorAll('.suggestionList').forEach(function (list) { + + if (list.contains(e.target)) return; + + const input = list.closest('td')?.querySelector('.const-company-dept'); + if (input && input === e.target) return; + + list.style.display = 'none'; + }); + }); }); // 사업 등록 처리 @@ -390,6 +516,7 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe var constCompanyNameEle = document.getElementById('const-company-dept-' + dataIndexValue); if (constCompanyNameEle) { jsonItem.constCompanyName = constCompanyNameEle.value; + jsonItem.constCompanyName = constCompanyNameEle.value; } // 건설사 - 담당자 var constCompanyAdminEle = document.getElementById('const-company-admin-' + dataIndexValue); @@ -401,7 +528,10 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe if (constCompanyTelEle) { jsonItem.constCompanyTel = constCompanyTelEle.value; } - + + // 건설사 - 선택한 건설사 userid + var hiddenUseridEle = document.getElementById('const-user-id-' + dataIndexValue); + jsonItem.encUserid = hiddenUseridEle.value; if (cid) { jsonItem.cid=cid; } @@ -571,6 +701,24 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe         xhr.send();     } + function setConstInfo(encId, tblIdx) { + $.ajax({ + type: 'GET', + url: '/const-user-info.json', + dataType: 'json', + data: { + encUserid: encId + }, + success: function (json) { +// console.log(json) + let data = json.result.data + tblIdx.querySelector('input[id*=const-company-admin-]').value = data.userName; + tblIdx.querySelector('input[id*=const-company-tel-]').value = data.phone; + + } + }); + } + function triggerExcelUpload() { // 숨겨진 파일 선택 input을 클릭시킴 document.getElementById('excel-file-input').click(); @@ -704,13 +852,15 @@ if (request.getSession().getAttribute("CLS") == null || "2".equals(request.getSe 건설사 - - + + + +