diff --git a/src/main/java/geoinfo/com/WebConfirm.java b/src/main/java/geoinfo/com/WebConfirm.java index 99b0c216..21ce71c9 100644 --- a/src/main/java/geoinfo/com/WebConfirm.java +++ b/src/main/java/geoinfo/com/WebConfirm.java @@ -415,6 +415,86 @@ public class WebConfirm } + /** + * TEMP_DSF 테이블의 불연속면(DSF) 데이터 중복을 검사합니다. + * (DSF_DEPTH_FROM, DSF_DEPTH_TO, DSF_DECOMPOSITION, DSF_STRENGTH, DSF_FRACTURING, HOLE_CODE 조합 중복 검사) + * + * @param request HttpServletRequest + * @param PROJECT_CODE 검사할 프로젝트 코드 + * @return 유효성 검사 결과 (success: true/false, errorMessage: "...") + */ + private Map validationCheckTempDsf(HttpServletRequest request, final String PROJECT_CODE) { + Map result = new HashMap<>(); + DatabaseQuery validationQuery = null; + ResultSet rs = null; + + // PK 구성 컬럼 전체를 그룹화하여 2건 이상인 데이터 조회 + final String validationSql = "SELECT " + + " HOLE_CODE, " + + " DSF_DEPTH_FROM, " + + " DSF_DEPTH_TO, " + + " DSF_DECOMPOSITION, " + + " DSF_STRENGTH, " + + " DSF_FRACTURING, " + + " COUNT(1) AS \"COUNT\" " + + "FROM " + + " TEMP_DSF " + + "WHERE " + + " PROJECT_CODE = [PROJECT_CODE] " + + "GROUP BY " + + " HOLE_CODE, " + + " DSF_DEPTH_FROM, " + + " DSF_DEPTH_TO, " + + " DSF_DECOMPOSITION, " + + " DSF_STRENGTH, " + + " DSF_FRACTURING " + + "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 dFrom = rs.getDouble("DSF_DEPTH_FROM"); + double dTo = rs.getDouble("DSF_DEPTH_TO"); + String decomp = isnull(rs.getString("DSF_DECOMPOSITION"), "미입력"); + String strength = isnull(rs.getString("DSF_STRENGTH"), "미입력"); + String fract = isnull(rs.getString("DSF_FRACTURING"), "미입력"); + int count = rs.getInt("COUNT"); + + errorMessages.append("- " + holeCode + " 시추공의 불연속면 데이터(심도:" + dFrom + "~" + dTo + "m, 구성:" + decomp + ", 강도:" + strength + ", 간격:" + fract + ")가 " + 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("DSF validation check error", e); + result.put("success", false); + result.put("errorMessage", "불연속면 유효성 검사 중 데이터베이스 오류가 발생했습니다: " + 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; + } + @@ -479,6 +559,20 @@ public class WebConfirm // ========================================================================== + // ========================================================================== + // 불연속면 정보(TEMP_DSF) PK 중복 체크 수행 + // ========================================================================== + Map dsfValidation = validationCheckTempDsf(request, PROJECT_CODE); + + if (!(Boolean) dsfValidation.get("success")) { + String errorMessage = (String) dsfValidation.get("errorMessage"); + logger.warn("DSF validation failed for PROJECT_CODE [{}]: {}", PROJECT_CODE, errorMessage); + + // SQLException을 발생시켜 전체 트랜잭션을 롤백하고 사용자에게 에러 메시지 전달 + throw new SQLException("등록에 실패하였습니다.\\n\\n불연속면(DSF) 정보 중 모든 필드값이 완전히 동일한 중복 데이터가 존재합니다. 데이터를 확인해 주세요:\\n\\n" + errorMessage); + } + // ========================================================================== + // 유효성 체크 ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲