From ab91d39ac46678aef7bb1bcf88677738311ea43f Mon Sep 17 00:00:00 2001 From: thkim Date: Mon, 16 Mar 2026 18:52:02 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B2=80=EC=88=98=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EB=8C=80=EA=B8=B0=20=EB=AA=A9=EB=A1=9D=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=88=84=EB=A5=BC=20=EB=95=8C,=20RMR=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20(=EC=A4=91=EB=B3=B5)=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/geoinfo/com/WebConfirm.java | 92 ++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/src/main/java/geoinfo/com/WebConfirm.java b/src/main/java/geoinfo/com/WebConfirm.java index a5a5418a..99b0c216 100644 --- a/src/main/java/geoinfo/com/WebConfirm.java +++ b/src/main/java/geoinfo/com/WebConfirm.java @@ -343,6 +343,77 @@ public class WebConfirm return result; } + /** + * TEMP_RMR 테이블의 RMR 데이터 중복을 검사합니다. + * (HOLE_CODE, DEPTH_FROM, DEPTH_TO 조합 중복 검사) + * + * @param request HttpServletRequest + * @param PROJECT_CODE 검사할 프로젝트 코드 + * @return 유효성 검사 결과 (success: true/false, errorMessage: "...") + */ + private Map validationCheckTempRmr(HttpServletRequest request, final String PROJECT_CODE) { + Map result = new HashMap<>(); + DatabaseQuery validationQuery = null; + ResultSet rs = null; + + // HOLE_CODE, DEPTH_FROM, DEPTH_TO 조합으로 중복 건 조회 SQL + final String validationSql = "SELECT " + + " HOLE_CODE, " + + " DEPTH_FROM, " + + " DEPTH_TO, " + + " COUNT(1) AS \"COUNT\" " + + "FROM " + + " TEMP_RMR " + + "WHERE " + + " PROJECT_CODE = [PROJECT_CODE] " + + "GROUP BY " + + " HOLE_CODE, " + + " DEPTH_FROM, " + + " DEPTH_TO " + + "HAVING " + + " 1 < COUNT(1)"; + + try { + validationQuery = new DatabaseQuery(validationSql); + validationQuery.setParam("PROJECT_CODE", PROJECT_CODE); + + rs = validationQuery.execute(connection); + + StringBuilder errorMessages = new StringBuilder(); + + while (rs.next()) { + String holeCode = rs.getString("HOLE_CODE"); + double depthFrom = rs.getDouble("DEPTH_FROM"); + double depthTo = rs.getDouble("DEPTH_TO"); + int count = rs.getInt("COUNT"); + + errorMessages.append("- " + holeCode + " 시추공의 RMR 심도구간 " + depthFrom + "m ~ " + depthTo + "m 데이터가 " + count + "개 중복됨.\\n"); + } + + if (errorMessages.length() > 0) { + result.put("success", false); + result.put("errorMessage", errorMessages.toString().trim()); + } else { + result.put("success", true); + result.put("errorMessage", ""); + } + + } catch (SQLException e) { + logger.error("RMR validation check error", e); + result.put("success", false); + result.put("errorMessage", "RMR 유효성 검사 중 데이터베이스 오류가 발생했습니다: " + e.getMessage()); + } finally { + try { + if (rs != null) rs.close(); + if (validationQuery != null) validationQuery.close(); + } catch (SQLException sqle) { + logger.error("Error closing validation resources", sqle); + } + } + + return result; + } + @@ -391,6 +462,25 @@ public class WebConfirm throw new SQLException("등록에 실패하였습니다.\\n\\n토사 압밀시험 정보(TEMP_CONSOLIDATION) 중 시료코드, 하중, 간극비 조합이 중복되었습니다. 데이터를 확인해 주세요:\\n\\n" + errorMessage); } // ========================================================================== + + + // ========================================================================== + // RMR 정보(TEMP_RMR) PK 중복 체크 수행 + // ========================================================================== + Map rmrValidation = validationCheckTempRmr(request, PROJECT_CODE); + + if (!(Boolean) rmrValidation.get("success")) { + String errorMessage = (String) rmrValidation.get("errorMessage"); + logger.warn("RMR validation failed for PROJECT_CODE [{}]: {}", PROJECT_CODE, errorMessage); + + // SQLException을 발생시켜 전체 트랜잭션을 롤백하고 사용자에게 에러 메시지 전달 + throw new SQLException("등록에 실패하였습니다.\\n\\nRMR(암반평가) 정보 중 동일한 시추공 내에 중복된 심도 구간이 존재합니다. 중복 제거 후 다시 시도해주세요:\\n\\n" + errorMessage); + } + // ========================================================================== + + + + // 유효성 체크 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ @@ -525,7 +615,7 @@ public class WebConfirm logger.warn("Header Date validation failed for PROJECT_CODE [{}]: {}", PROJECT_CODE, errorMessage); // SQLException을 발생시켜 롤백 처리 및 사용자에게 메시지 전달 - throw new SQLException("등록에 실패하였습니다.\\n\\n시추공 정보(TEMP_HEADER)의 조사기간 형식이 올바르지 않습니다.\\nYYYYMMDD 형식의 8자리 숫자여야 합니다. 데이터를 확인해 주세요:\\n\\n" + errorMessage); + throw new SQLException("등록에 실패하였습니다.\\n\\n시추공 정보(TEMP_HEADER)의 조사기간 형식이 올바르지 않습니다.\\nYYYYMMDD 형식의 8자리 숫자가 아니거나 실제 존재하지 않는 날짜입니다. 데이터를 확인해 주세요:\\n\\n" + errorMessage); } // ==========================================================================