From 3defdae200e7c703d6623b32a4f9ab5f04decd96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EC=A7=80=EC=9D=B8?= Date: Wed, 15 Apr 2026 16:07:19 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EA=B8=B0=EC=97=85=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9E=85=EB=A0=A5=EC=8B=9C=EC=8A=A4=ED=85=9C:=20?= =?UTF-8?q?=EC=95=94=EC=84=9D=EC=8B=9C=ED=97=98-=20=EC=A0=90=ED=95=98?= =?UTF-8?q?=EC=A4=91(TEMP=5FROCK=5FPOINTLOAD),=20=EC=A0=88=EB=A6=AC?= =?UTF-8?q?=EB=A9=B4=EC=A0=84=EB=8B=A8(TEMP=5FROCK=5FJOINTSHEAR)=20=20-=20?= =?UTF-8?q?=EC=96=91=EC=8B=9D=20=EC=83=81=EB=8B=A8=EC=A4=84=EC=97=90=20?= =?UTF-8?q?=EC=95=88=EB=82=B4=EB=AC=B8=EA=B5=AC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=90=98=EC=96=B4=20=EC=8B=9C=ED=8A=B8=EA=B5=AC=EC=97=AD=20?= =?UTF-8?q?=EC=9E=AC=EC=A0=95=EC=9D=98=20excelWp=20=3D=20ExcelUtil.getRsWp?= =?UTF-8?q?(strFile,=20=EB=B6=80=EB=B6=84=20=20-=20=EC=97=91=EC=85=80=20?= =?UTF-8?q?=EC=96=91=EC=8B=9D'=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=B2=88?= =?UTF-8?q?=ED=98=B8,=20=EC=8B=9C=EB=A3=8C=EB=B2=88=ED=98=B8,=20=EC=8B=9C?= =?UTF-8?q?=ED=97=98=ED=9A=9F=EC=88=98'=20=EC=B6=94=EA=B0=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8A=A4=EB=B0=80=EB=A6=BC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=20-=20=EA=B7=B8=EB=9E=98=ED=94=84=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EB=8A=94=20row=20=EC=88=98=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20=EC=8B=9C=EB=A3=8C=EB=B2=88=ED=98=B8=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EC=B2=98=EB=A6=AC=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20=20-=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=82=AC(=EB=8F=99=EC=9D=BC?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=B2=88=ED=98=B8(?= =?UTF-8?q?=EB=AC=BC=EC=84=B1=EC=8B=9C=ED=97=98=EC=83=98=ED=94=8C=EB=B2=88?= =?UTF-8?q?=ED=98=B8),=20=EC=8B=9C=EB=A3=8C=EB=B2=88=ED=98=B8,=20=EC=8B=9C?= =?UTF-8?q?=ED=97=98=ED=9A=9F=EC=88=98)=20=EC=8B=9C=EC=97=90=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B0=98=ED=99=98=20=20-=20?= =?UTF-8?q?=EC=97=91=EC=85=80=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EC=8B=9C=20TEMP=ED=8C=8C=EC=9D=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=B2=98=EB=A6=AC=20=EC=A4=91=20=EC=A0=90=ED=95=98?= =?UTF-8?q?=EC=A4=91,=20=EC=A0=88=EB=A6=AC=EB=A9=B4=EC=A0=84=EB=8B=A8?= =?UTF-8?q?=EC=9D=80=20=EA=B7=B8=EB=9E=98=ED=94=84=20=EC=88=98=EA=B0=80=20?= =?UTF-8?q?row=20=EC=88=98=EC=99=80=201:1=EC=9D=B4=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=EC=8B=9C=EB=A3=8C=EA=B0=9C=EC=88=98=EC=99=80=201:1=EC=9D=B8=20?= =?UTF-8?q?=EA=B4=80=EA=B3=84=EB=A1=9C=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80.(public=20boolean=20imageSave=20?= =?UTF-8?q?=EC=9D=98=20Set=20movedFileSet=20=EB=B6=80=EB=B6=84)=20?= =?UTF-8?q?=20-=20=ED=85=8C=EC=9D=B4=EB=B8=94=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EB=90=9C=20=EC=BB=AC=EB=9F=BC=20SAMPLE=5FCODE=20?= =?UTF-8?q?=EB=B3=B5=ED=95=A9=20PK=20=EC=B2=98=EB=A6=AC=EB=90=A8=EC=97=90?= =?UTF-8?q?=20=EB=94=B0=EB=9D=BC=20NULL=EC=97=90=EB=9F=AC=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=20=EB=B0=A9=EC=A7=80=20(/RockServiceImpl.java)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ManageExcelUploadProc03Controller.java | 232 +++++++++++++----- .../rock/service/impl/RockServiceImpl.java | 12 + .../egovframework/sqlmap/mapper/regi/rock.xml | 12 +- 3 files changed, 197 insertions(+), 59 deletions(-) diff --git a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java index 4698401e..744930cc 100644 --- a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java +++ b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java @@ -15,8 +15,10 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; import javax.annotation.Resource; @@ -27,7 +29,6 @@ import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; @@ -180,6 +181,7 @@ public class ManageExcelUploadProc03Controller { _holeCode = _holeCode.replaceAll("\\.", "").replaceAll("/", "").replaceAll("\\\\", "").replaceAll ("&",""); String _uploadCd = request.getParameter("UPLOAD_CD"); _uploadCd = _uploadCd.replaceAll("\\.", "").replaceAll("/", "").replaceAll("\\\\", "").replaceAll ("&",""); + JSONArray _jsonArray = JSONArray.fromObject((String)request.getParameter("DATA")); try { @@ -847,6 +849,7 @@ public class ManageExcelUploadProc03Controller { rockService.insertTempRockPointloadInfo(map); } } + listMap = ("".equals(saveMap.get("rjo6List")))?null:(List>) saveMap.get("rjo6List"); if(null != listMap){ for(HashMap map : listMap){ @@ -1702,21 +1705,21 @@ public class ManageExcelUploadProc03Controller { } if("Y".equals(classInfoMap.get("rockTriaxial"))){ if("".equals((String)resultMap.get("resultMsg"))){ - excelWp = ExcelUtil.getRsWp(strFile, "삼축압축정보", 0, 2, 19); + excelWp = ExcelUtil.getRsWp(strFile, "삼축압축정보", 0, 2, 19); resultMap = checkStep03_600_rockTriaxial(request, params, excelWp, savePath, strFile,_projectCode,_holeCode); jaRtr6 = (null == resultMap.get("list") || "".equals(resultMap.get("list")))?null:JSONArray.fromObject(resultMap.get("list")); } } if("Y".equals(classInfoMap.get("rockPointload"))){ if("".equals((String)resultMap.get("resultMsg"))){ - excelWp = ExcelUtil.getRsWp(strFile, "점하중정보", 0, 1, 9); + excelWp = ExcelUtil.getRsWp(strFile, "점하중정보", 0, 2, 12); // 1번째 행에 가이드 내용 있음 resultMap = checkStep03_600_rockPointload(request, params, excelWp, savePath, strFile,_projectCode,_holeCode); jaRpo6 = (null == resultMap.get("list") || "".equals(resultMap.get("list")))?null:JSONArray.fromObject(resultMap.get("list")); } } if("Y".equals(classInfoMap.get("rockJointshear"))){ if("".equals((String)resultMap.get("resultMsg"))){ - excelWp = ExcelUtil.getRsWp(strFile, "절리면전단정보", 0, 1, 9); + excelWp = ExcelUtil.getRsWp(strFile, "절리면전단정보", 0, 2, 12);// 1번째 행에 가이드 내용 있음 resultMap = checkStep03_600_rockJointshear(request, params, excelWp, savePath, strFile,_projectCode,_holeCode); jaRjo6 = (null == resultMap.get("list") || "".equals(resultMap.get("list")))?null:JSONArray.fromObject(resultMap.get("list")); } @@ -3231,27 +3234,48 @@ public class ManageExcelUploadProc03Controller { String fmtMsg = "[암석시험정보 - 절리면전단정보] %s|"; try{ List> list = new ArrayList>(); - resultMsg = imageUpload(params,"절리면전단정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 절리면전단정보시험 그래프] %s|", "절리면전단시험결과 그래프",excelWp.getLength()); +// resultMsg = imageUpload(params,"절리면전단정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 절리면전단정보시험 그래프] %s|", "절리면전단시험결과 그래프",excelWp.getLength()); + // [YJI / 26.04.14] 그래프 개수는 시료개수(RJOINT_CODE단위) 와 같다. + Set SampleSet = new HashSet<>(); + + for(int i = 0; i < excelWp.getLength(); i++){ + String sampleNo = excelWp.get("col1", i).trim(); + if(!sampleNo.isEmpty()){ + SampleSet.add(sampleNo); + } + } + int SampleCnt = SampleSet.size(); // [YJI / 26.04.14] 시료개수 + resultMsg = imageUpload(params,"절리면전단정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 절리면전단정보시험 그래프] %s|", "절리면전단시험결과 그래프",SampleCnt); + Set duplicateCheckSet = new HashSet<>(); // [YJI / 26.04.14] 중복입력값 확인용 테스트번호(물성시험 샘플코드), 시료번호(rjoint_code), 시험횟수(test_order) for(int i=0; i < excelWp.getLength(); i++){ if(!StringUtil.containsCharOnly(excelWp.get("col0",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "심도From는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "테스트번호는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col1",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "심도To는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "시료번호는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col2",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "내부마찰각은 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "시험횟수는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col3",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "점착력은 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "심도From는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col4",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "수직응력은 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "심도To는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col5",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "전단응력은 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "내부마찰각은 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col6",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "점착력은 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col7",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "수직응력은 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col8",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "전단응력은 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col9",i).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, "절리면 압축강도는 실수만 입력이 가능합니다."); } @@ -3261,26 +3285,57 @@ public class ManageExcelUploadProc03Controller { } HashMap map = new HashMap<>(); + int testNo = Integer.valueOf(excelWp.get("col0",i).trim()); // 사용자가 입력한 순번(물성시험 샘플을 순번으로 찾을때 사용) + String targetSampleCode = null; + for (Map sample : _sampleInfoList) { + String sampleCode = (String) sample.get("SAMPLE_CODE"); + // SAMPLE_CODE 끝 숫자 추출 + String numberPart = sampleCode.replaceAll(".*?(\\d+)$", "$1"); + int number = Integer.parseInt(numberPart); + if (number == testNo) { + targetSampleCode = sampleCode; + break; + } + } + + if (targetSampleCode == null) { // 테스트번호에 매핑되는 물성시험 sample코드가 존재하지 않음 + throw new IllegalArgumentException( + String.format("물성시험 시료번호를 확인 하세요. (테스트 번호:%s)",testNo)); + } + String sampleNo = excelWp.get("col1",i).trim(); // 시료번호 + String testOrderStr = excelWp.get("col2",i).trim(); // 시험횟수 + // 🔥 중복 체크 KEY 생성 + String duplicateKey = targetSampleCode + "|" + sampleNo + "|" + testOrderStr; + // 🔥 중복 검사 + if (duplicateCheckSet.contains(duplicateKey)) { + params.put("resultMsg", "중복되는 시료번호 및 시험횟수가 있습니다. 확인하세요."); + return params; + } else { + duplicateCheckSet.add(duplicateKey); + } + map.put("PROJECT_CODE" , _projectCode); map.put("HOLE_CODE" , _holeCode); - map.put("RJOINT_CODE" , _holeCode + "J" + StringUtil.lpad(Integer.toString(i+1), "0", 2)); - map.put("testOrder" , i+1); - map.put("rjointDepthFrom" , excelWp.get("col0", i)); - map.put("rjointDepthTo" , excelWp.get("col1", i)); - map.put("rjointPhi" , excelWp.get("col2", i)); - map.put("rjointC" , excelWp.get("col3", i)); - map.put("rjointNoramlStress", excelWp.get("col4", i)); - map.put("rjointShearStress" , excelWp.get("col5", i)); - map.put("rjointJcs" , excelWp.get("col6", i)); - map.put("rjointRemark" , excelWp.get("col7", i)); + map.put("SAMPLE_CODE" , targetSampleCode); + map.put("RJOINT_CODE" , _holeCode + "J" + StringUtil.lpad(excelWp.get("col1", i), "0", 2)); + map.put("testOrder" , excelWp.get("col2", i)); + map.put("rjointDepthFrom" , excelWp.get("col3", i)); + map.put("rjointDepthTo" , excelWp.get("col4", i)); + map.put("rjointPhi" , excelWp.get("col5", i)); + map.put("rjointC" , excelWp.get("col6", i)); + map.put("rjointNoramlStress", excelWp.get("col7", i)); + map.put("rjointShearStress" , excelWp.get("col8", i)); + map.put("rjointJcs" , excelWp.get("col9", i)); + map.put("rjointRemark" , excelWp.get("col10", i)); map.put("USERID" , request.getSession().getAttribute("USERID")); - map.put("testNo" , excelWp.get("col0", i)); +// map.put("testNo" , excelWp.get("col0", i)); - map.put("graphImage" , params.get("GRAPH_IMAGE"+i) ); - map.put("graphLocal" , params.get("GRAPH_LOCAL"+i) ); - - map.put("GRAPH_IMAGE" , params.get("GRAPH_IMAGE"+i) ); - map.put("GRAPH_LOCAL" , params.get("GRAPH_LOCAL"+i) ); + // [YJI / 26.04.14] 각 샘플번호 순서에 해당하는 그래프와 연결해줘야한다. (params의 그래프이미지는 index로 처리되어 맞춰준다) + map.put("graphImage" , params.get("GRAPH_IMAGE"+(Integer.parseInt(sampleNo)-1)) ); + map.put("graphLocal" , params.get("GRAPH_LOCAL"+(Integer.parseInt(sampleNo)-1)) ); + + map.put("GRAPH_IMAGE" , params.get("GRAPH_IMAGE"+(Integer.parseInt(sampleNo)-1)) ); + map.put("GRAPH_LOCAL" , params.get("GRAPH_LOCAL"+(Integer.parseInt(sampleNo)-1)) ); //rockService.insertTempRockJointshearInfo(params); list.add(map); @@ -3292,7 +3347,10 @@ public class ManageExcelUploadProc03Controller { params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); logger.debug(e.getMessage()); logger.debug("error", e); - } catch (Exception e) { + } catch (IllegalArgumentException e) { + params.put("resultMsg", e.getMessage()); + logger.debug(e.getMessage()); + } catch (Exception e) { params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); logger.debug(e.getMessage()); logger.debug("error", e); @@ -3310,27 +3368,49 @@ public class ManageExcelUploadProc03Controller { try{ List> list = new ArrayList>(); - resultMsg = imageUpload(params,"점하중정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 점하중정보시험 그래프] %s|", "점하중시험결과 그래프",excelWp.getLength()); +// resultMsg = imageUpload(params,"점하중정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 점하중정보시험 그래프] %s|", "점하중시험결과 그래프",excelWp.getLength()); + // [YJI / 26.04.14] 그래프 개수는 시료개수(ROCK_POINT_CODE단위) 와 같다. + Set sampleSet = new HashSet<>(); + + for(int i = 0; i < excelWp.getLength(); i++){ + String sampleNo = excelWp.get("col1", i).trim(); + if(!sampleNo.isEmpty()){ + sampleSet.add(sampleNo); + } + } + int sampleCnt = sampleSet.size(); // [YJI / 26.04.14] 시료개수 + resultMsg = imageUpload(params,"점하중정보 그래프", savePath, strFile, resultMsg, "[암석시험정보 - 점하중정보시험 그래프] %s|", "점하중시험결과 그래프",sampleCnt); + + Set duplicateCheckSet = new HashSet<>(); // [YJI / 26.04.14] 중복입력값 확인용 테스트번호(물성시험 샘플코드), 시료번호(rock_point_code), 시험횟수(test_order) for(int i=0; i < excelWp.getLength(); i++){ if(!StringUtil.containsCharOnly(excelWp.get("col0",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "심도From는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "테스트번호는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col1",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "심도To는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "시료번호는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col2",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "시료직경은 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "시험횟수는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col3",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "시료길이는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "심도From는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col4",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "인장강도는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "심도To는 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col5",i).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, "점하중강도는 실수만 입력이 가능합니다."); + resultMsg += String.format(fmtMsg, "시료직경은 실수만 입력이 가능합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col6",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "시료길이는 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col7",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "인장강도는 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col8",i).trim(),"0123456789.")){ + resultMsg += String.format(fmtMsg, "점하중강도는 실수만 입력이 가능합니다."); + } + if(!StringUtil.containsCharOnly(excelWp.get("col9",i).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, "일축압축강도는 실수만 입력이 가능합니다."); } @@ -3340,26 +3420,57 @@ public class ManageExcelUploadProc03Controller { } HashMap map = new HashMap<>(); + int testNo = Integer.valueOf(excelWp.get("col0",i).trim()); // 사용자가 입력한 순번(물성시험 샘플을 순번으로 찾을때 사용) + String targetSampleCode = null; + for (Map sample : _sampleInfoList) { + String sampleCode = (String) sample.get("SAMPLE_CODE"); + // SAMPLE_CODE 끝 숫자 추출 + String numberPart = sampleCode.replaceAll(".*?(\\d+)$", "$1"); + int number = Integer.parseInt(numberPart); + if (number == testNo) { + targetSampleCode = sampleCode; + break; + } + } + if (targetSampleCode == null) { // 테스트번호에 매핑되는 물성시험 sample코드가 존재하지 않음 + throw new IllegalArgumentException( + String.format("물성시험 시료번호를 확인 하세요. (테스트 번호:%s)",testNo)); + } + String sampleNo = excelWp.get("col1",i).trim(); // 시료번호 + String testOrderStr = excelWp.get("col2",i).trim(); // 시험횟수 + // 🔥 중복 체크 KEY 생성 + String duplicateKey = targetSampleCode + "|" + sampleNo + "|" + testOrderStr; + // 🔥 중복 검사 + if (duplicateCheckSet.contains(duplicateKey)) { + throw new IllegalArgumentException( + String.format("점하중 정보가 중복됩니다. 확인하세요. (테스트번호:%s, 시료번호:%s, 시험횟수:%s)", + testNo, sampleNo, testOrderStr)); + } else { + duplicateCheckSet.add(duplicateKey); + } + map.put("PROJECT_CODE" , _projectCode); map.put("HOLE_CODE" , _holeCode); - map.put("ROCK_POINT_CODE" , _holeCode + "O" + StringUtil.lpad(Integer.toString(i+1), "0", 2)); - map.put("testOrder" , i+1); - map.put("depthFrom" , excelWp.get("col0", i)); - map.put("depthTo" , excelWp.get("col1", i)); - map.put("dia" , excelWp.get("col2", i)); - map.put("length" , excelWp.get("col3", i)); - map.put("tesilestrength", excelWp.get("col4", i)); - map.put("pointstrength" , excelWp.get("col5", i)); - map.put("uniaxial" , excelWp.get("col6", i)); - map.put("remark" , excelWp.get("col7", i)); + map.put("SAMPLE_CODE" , targetSampleCode); + map.put("ROCK_POINT_CODE" , _holeCode + "O" + StringUtil.lpad(excelWp.get("col1", i), "0", 2)); + map.put("testOrder" , excelWp.get("col2", i)); + map.put("depthFrom" , excelWp.get("col3", i)); + map.put("depthTo" , excelWp.get("col4", i)); + map.put("dia" , excelWp.get("col5", i)); + map.put("length" , excelWp.get("col6", i)); + map.put("tesilestrength", excelWp.get("col7", i)); + map.put("pointstrength" , excelWp.get("col8", i)); + map.put("uniaxial" , excelWp.get("col9", i)); + map.put("remark" , excelWp.get("col10", i)); map.put("USERID" , request.getSession().getAttribute("USERID")); - map.put("testNo" , excelWp.get("col0", i)); - - map.put("graphImage" , params.get("GRAPH_IMAGE"+i) ); - map.put("graphLocal" , params.get("GRAPH_LOCAL"+i) ); - - map.put("GRAPH_IMAGE" , params.get("GRAPH_IMAGE"+i) ); - map.put("GRAPH_LOCAL" , params.get("GRAPH_LOCAL"+i) ); +// map.put("testNo" , excelWp.get("col0", i)); + + // [YJI / 26.04.14] 각 샘플번호 순서에 해당하는 그래프와 연결해줘야한다. (params의 그래프이미지는 index로 처리되어 맞춰준다) + map.put("graphImage" , params.get("GRAPH_IMAGE"+(Integer.parseInt(sampleNo)-1)) ); + map.put("graphLocal" , params.get("GRAPH_LOCAL"+(Integer.parseInt(sampleNo)-1)) ); + + map.put("GRAPH_IMAGE" , params.get("GRAPH_IMAGE"+(Integer.parseInt(sampleNo)-1)) ); + map.put("GRAPH_LOCAL" , params.get("GRAPH_LOCAL"+(Integer.parseInt(sampleNo)-1)) ); //rockService.insertTempRockPointloadInfo(params); list.add(map); @@ -3371,6 +3482,9 @@ public class ManageExcelUploadProc03Controller { params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); logger.debug(e.getMessage()); logger.debug("error", e); + } catch (IllegalArgumentException e) { + params.put("resultMsg", e.getMessage()); + logger.debug(e.getMessage()); } catch (Exception e) { params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); logger.debug(e.getMessage()); @@ -8229,12 +8343,20 @@ public class ManageExcelUploadProc03Controller { */ public boolean imageSave(boolean blFileMove,HashMap saveMap,HttpServletRequest request,String moveFolder, String _projectCode, String _holeCode, String moveSaveFolder,WebUtil wUtil,String checkList)throws Exception{ - List> listMap2 = null; + List> listMap2 = null; listMap2 = ("".equals(saveMap.get(checkList)))?null:(List>) saveMap.get(checkList); if(null != listMap2) { + Set movedFileSet = new HashSet<>(); // [YJI / 26.04.15] 암석-점하중, 절리면전단은 샘플+횟수 별 list 데이타가 있음. 그래프는 샘플별이라 중복되어 if문을 탈출하여 중복 체크 처리에 사용 for(int i=0; i< listMap2.size(); i++) { - if(blFileMove){ - blFileMove = moveFile(request, (String)listMap2.get(i).get("graphImage"), moveFolder, ""); + String fileName = (String) listMap2.get(i).get("graphImage"); //[YJI / 26.04.15] 파일이동 처리 전 동일 파일 처리 여부 확인을 위한 파일명 취득 +// if(blFileMove){ + if(blFileMove && !movedFileSet.contains(fileName)){ + // [YJI / 26.04.15] 파일 이동 처리 전 동일 파일 처리인지 먼저 체크. +// blFileMove = moveFile(request, (String)listMap2.get(i).get("graphImage"), moveFolder, ""); + boolean result = moveFile(request, fileName, moveFolder, ""); + if(result){ + movedFileSet.add(fileName); // 🔥 이동 완료 기록 + } String path2 = request.getSession().getServletContext().getRealPath("/"); path2 = path2 + "files"+ "\\" + "web"+ "\\" + "CH"+"\\" + _projectCode+"\\"+_holeCode+"\\"+moveSaveFolder; String path3 = request.getSession().getServletContext().getRealPath("/"); diff --git a/src/main/java/geoinfo/regi/rock/service/impl/RockServiceImpl.java b/src/main/java/geoinfo/regi/rock/service/impl/RockServiceImpl.java index 067b14c1..6512e350 100644 --- a/src/main/java/geoinfo/regi/rock/service/impl/RockServiceImpl.java +++ b/src/main/java/geoinfo/regi/rock/service/impl/RockServiceImpl.java @@ -187,6 +187,9 @@ public class RockServiceImpl implements RockService { @Override public int insertTempRockJointshear(HashMap params) throws Exception { + if ("".equals(params.get("SAMPLE_CODE"))) { // [YJI / 26.04.14] 컬러 추가(SAMPLE_CODE)로 Not NULL 관련 처리 + params.put("SAMPLE_CODE", "NODATA"); + } return rockMapper.insertTempRockJointshear(params); } @@ -207,6 +210,9 @@ public class RockServiceImpl implements RockService { @Override public int insertTempRockJointshearInfo(HashMap params) throws Exception { + if ("".equals(params.get("SAMPLE_CODE"))) { // [YJI / 26.04.14] 컬러 추가(SAMPLE_CODE)로 Not NULL 관련 처리 + params.put("SAMPLE_CODE", "NODATA"); + } return rockMapper.insertTempRockJointshearInfo(params); } @@ -232,6 +238,9 @@ public class RockServiceImpl implements RockService { @Override public int insertTempRockPointload(HashMap params) throws Exception { + if ("".equals(params.get("SAMPLE_CODE"))) { // [YJI / 26.04.14] 컬러 추가(SAMPLE_CODE)로 Not NULL 관련 처리 + params.put("SAMPLE_CODE", "NODATA"); + } return rockMapper.insertTempRockPointload(params); } @Override @@ -251,6 +260,9 @@ public class RockServiceImpl implements RockService { @Override public int insertTempRockPointloadInfo(HashMap params) throws Exception { + if ("".equals(params.get("SAMPLE_CODE"))) { // [YJI / 26.04.14] 컬러 추가(SAMPLE_CODE)로 Not NULL 관련 처리 + params.put("SAMPLE_CODE", "NODATA"); + } return rockMapper.insertTempRockPointloadInfo(params); } diff --git a/src/main/resources/egovframework/sqlmap/mapper/regi/rock.xml b/src/main/resources/egovframework/sqlmap/mapper/regi/rock.xml index 95f29fef..bc56328c 100644 --- a/src/main/resources/egovframework/sqlmap/mapper/regi/rock.xml +++ b/src/main/resources/egovframework/sqlmap/mapper/regi/rock.xml @@ -669,7 +669,8 @@ GRAPH_IMAGE , GRAPH_LOCAL , USERID , - DATETIME + DATETIME, + SAMPLE_CODE )VALUES( #{PROJECT_CODE}, #{HOLE_CODE}, @@ -686,7 +687,8 @@ #{GRAPH_IMAGE}, #{GRAPH_LOCAL}, #{USERID}, - SYSDATE + SYSDATE, + #{SAMPLE_CODE} ) @@ -823,7 +825,8 @@ GRAPH_IMAGE , GRAPH_LOCAL , USERID , - DATETIME + DATETIME, + SAMPLE_CODE )VALUES( #{PROJECT_CODE}, #{HOLE_CODE}, @@ -840,7 +843,8 @@ #{GRAPH_IMAGE}, #{GRAPH_LOCAL}, #{USERID}, - SYSDATE + SYSDATE, + #{SAMPLE_CODE} ) From 06c078fef8f0d831d5ae1ec8f3e35ac923522f65 Mon Sep 17 00:00:00 2001 From: thkim Date: Thu, 16 Apr 2026 13:35:34 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EC=97=91=EC=85=80=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8=ED=98=84=EC=9E=A5=EC=8B=9C=ED=97=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20>=20=ED=98=84=EC=9E=A5=ED=88=AC=EC=88=98?= =?UTF-8?q?=20=EC=8B=9C=ED=97=98=20>=20=EB=B6=80=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=95=88=20=EB=90=98=EB=8A=94=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ManageExcelUploadProc03Controller.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java index 206136cb..054bb6bf 100644 --- a/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java +++ b/src/main/java/geoinfo/regi/manageList/ManageExcelUploadProc03Controller.java @@ -5572,6 +5572,7 @@ public class ManageExcelUploadProc03Controller { } params.put("list", (list.size() < 1)?"":list); + params.put("resultMsg", resultMsg); } catch (NumberFormatException e) { params.put("resultMsg", "엑셀형식이 맞지 않습니다. 확인하세요."); logger.debug(e.getMessage()); @@ -5612,24 +5613,21 @@ public class ManageExcelUploadProc03Controller { resultMsg = String.format(fmtMsg, k+"번째 테스트 번호는 반드시 입력해야 합니다."); } if(!StringUtil.containsCharOnly(excelWp.get("col1",k).trim(),"0123456789.")){ - resultMsg += String.format(fmtMsg, k+"번째 시간간격은 실수만 입력이 가능합니다."); - } - if(!StringUtil.containsCharOnly(excelWp.get("col2",k).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, k+"번째 시간간격(sec)은 실수만 입력이 가능합니다."); } - if(!StringUtil.containsCharOnly(excelWp.get("col3",k).trim(),"0123456789.-")){ - resultMsg += String.format(fmtMsg, k+"번째 총수두(cm)는 실수만 입력이 가능합니다."); + if(!StringUtil.containsCharOnly(excelWp.get("col2",k).trim(),"0123456789.-")){ + resultMsg += String.format(fmtMsg, k+"번째 총수두(cm)는 실수와 -(하이픈) 입력이 가능합니다."); } - if(!StringUtil.containsCharOnly(excelWp.get("col4",k).trim(),"0123456789.")){ + if(!StringUtil.containsCharOnly(excelWp.get("col3",k).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, k+"번째 수두차(cm)는 실수만 입력이 가능합니다."); } - if(!StringUtil.containsCharOnly(excelWp.get("col5",k).trim(),"0123456789.")){ + if(!StringUtil.containsCharOnly(excelWp.get("col4",k).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, k+"번째 유출수량(c㎥)은 실수만 입력이 가능합니다."); } - if(!StringUtil.containsCharOnly(excelWp.get("col6",k).trim(),"0123456789.")){ + if(!StringUtil.containsCharOnly(excelWp.get("col5",k).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, k+"번째 수량(c㎥)은 실수만 입력이 가능합니다."); } - if(!StringUtil.containsCharOnly(excelWp.get("col7",k).trim(),"0123456789.")){ + if(!StringUtil.containsCharOnly(excelWp.get("col6",k).trim(),"0123456789.")){ resultMsg += String.format(fmtMsg, k+"번째 투수계수(K,cm/sec)는 실수만 입력이 가능합니다."); } @@ -5666,6 +5664,10 @@ public class ManageExcelUploadProc03Controller { } HashMap map = new HashMap<>(); + String fieldperSubTotalHead = excelWp.get("col2", k).trim(); + if("-".equals(fieldperSubTotalHead)) { + fieldperSubTotalHead = "-999"; + } String fieldperSubFallingHead = excelWp.get("col3", k).trim(); if("-".equals(fieldperSubFallingHead)) { fieldperSubFallingHead = "-999"; @@ -5676,8 +5678,7 @@ public class ManageExcelUploadProc03Controller { map.put("fieldperCode", mFieldperCode); map.put("fieldperOrder", tNo); map.put("fieldperSubTime", excelWp.get("col1", k).trim()); - map.put("fieldperSubTotalHead", excelWp.get("col2", k).trim()); -// map.put("fieldperSubFallingHead", excelWp.get("col3", k).trim()); // [YJI / 26.04.09] 엑셀 업로드 '-' 입력 지원. 입력값이 '-' 이면 DB에 저장은 -999로 한다. + map.put("fieldperSubTotalHead", fieldperSubTotalHead); map.put("fieldperSubFallingHead", fieldperSubFallingHead); map.put("fieldperSubWaterLoose", excelWp.get("col4", k).trim()); map.put("fieldperSubQuantity", excelWp.get("col5", k).trim());