diff --git a/docs/지연-샘플용-utf-8-1.txt b/docs/지연-샘플용-utf-8-1.txt index f0af3a9..c842198 100644 --- a/docs/지연-샘플용-utf-8-1.txt +++ b/docs/지연-샘플용-utf-8-1.txt @@ -8,7 +8,7 @@ 검사소 검사일자 자동차번호 소유자명 주민등록번호 차 명 차 종 용 도 종료일 일수 과태료 최종등록일 주 소 유효기간만료일 매매상품용 ------------------------------------------------------------------------------------------------------------------------------------------------- -H494 2025-09-01 162고6489 (주)지앤티테크 1244110241315 엠뱅크언더리프 특수차구난형소영업용 2025-08-25 7 4만원 +H494 2025-09-01 *162고6489 1244110241315 엠뱅크언더리프 특수차구난형소영업용 2025-08-25 *7 4만원 2025-07-14 경기도 용인시 기흥구 강남로 9, 111-111호(신행동, 진주만프라자) 2020-12-05 H494 2025-09-01 271구5475 (주)케이비캐피탈 1301110013499 엠뱅크언더리프 특수차구난형소영업용 2024-09-24 303 60만원 diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java index 824adf0..82f55bc 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java @@ -709,12 +709,9 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements dataLineNumber, vo.getVhclno())); } - // 4. 소유자명 검증 - if (vo.getOwnrNm() == null || vo.getOwnrNm().isEmpty()) { - errors.add(String.format("[데이터 %d] 소유자명이 누락되었습니다. 차량번호: %s", - dataLineNumber, vhclno)); - } else if (vo.getOwnrNm().length() > 75) { - errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s", + // 4. 소유자명 검증 (소유자명에 null or 공백 들어올수 있음 - 필수 아님) + if (vo.getOwnrNm() != null && !vo.getOwnrNm().isEmpty() && vo.getOwnrNm().length() > 75) { + errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s", dataLineNumber, vo.getOwnrNm(), vhclno)); } @@ -780,9 +777,15 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements } // 9. 일수 검증 (값이 있는 경우에만) - if (vo.getDaycnt() != null && !vo.getDaycnt().isEmpty() && !isNumeric(vo.getDaycnt())) { - errors.add(String.format("[데이터 %d] 일수는 숫자여야 합니다. 일수: %s, 차량번호: %s", - dataLineNumber, vo.getDaycnt(), vhclno)); + // 일수에 '*' 특수문자가 포함될 수 있음 (재검여부 표시용) + if (vo.getDaycnt() != null && !vo.getDaycnt().isEmpty()) { + String daycnt = vo.getDaycnt().trim(); + // '*' 제거 후 숫자 검증 + String daycntWithoutAsterisk = daycnt.replace("*", "").trim(); + if (!daycntWithoutAsterisk.isEmpty() && !isNumeric(daycntWithoutAsterisk)) { + errors.add(String.format("[데이터 %d] 일수는 숫자 또는 '*숫자' 형식이어야 합니다. 일수: %s, 차량번호: %s", + dataLineNumber, vo.getDaycnt(), vhclno)); + } } return errors; @@ -827,11 +830,12 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements /** * 차량번호 형식 검증 - * + * * 유효한 형식: * - 일반: 12가3456, 123가4567 (2~3자리 숫자 + 한글 + 4자리 숫자) * - 특수: 경기11사2222 (지역명 + 숫자 + 한글 + 숫자) - * + * - '*' 특수문자 포함 가능 (전출차량 등 특정 상황 표시) + * * @param vhclno 차량번호 * @return 유효성 여부 */ @@ -839,36 +843,44 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements if (vhclno == null || vhclno.isEmpty()) { return false; } - + // 공백 제거 vhclno = vhclno.trim(); - - // 최소 길이 체크 (예: 12가3456 = 7자) - if (vhclno.length() < 7) { + + // '*' 특수문자를 임시로 제거하여 검증 (전출차량 등 특정 상황 표시용) + String vhclnoWithoutAsterisk = vhclno.replace("*", ""); + + // '*'만 있는 경우는 제외 + if (vhclnoWithoutAsterisk.isEmpty()) { return false; } - + + // 최소 길이 체크 (예: 12가3456 = 7자, *12가3456 = 8자) + if (vhclnoWithoutAsterisk.length() < 7) { + return false; + } + // 패턴1: 일반 차량번호 (2~3자리 숫자 + 한글 1자 + 4자리 숫자) - // 예: 12가3456, 123가4567 - if (vhclno.matches("\\d{2,3}[가-힣]\\d{4}")) { + // 예: 12가3456, 123가4567, *12가3456 + if (vhclnoWithoutAsterisk.matches("\\d{2,3}[가-힣]\\d{4}")) { return true; } - + // 패턴2: 지역명이 포함된 차량번호 (한글 + 숫자 + 한글 + 숫자) - // 예: 경기11사2222, 서울12가3456 - if (vhclno.matches("[가-힣]+\\d+[가-힣]\\d+")) { + // 예: 경기11사2222, 서울12가3456, *경기11사2222 + if (vhclnoWithoutAsterisk.matches("[가-힣]+\\d+[가-힣]\\d+")) { return true; } - + // 패턴3: 특수 차량번호 (숫자 + 한글 + 숫자) - // 예: 22고2222, 33마3333 - if (vhclno.matches("\\d+[가-힣]+\\d+")) { + // 예: 22고2222, 33마3333, *22고2222 + if (vhclnoWithoutAsterisk.matches("\\d+[가-힣]+\\d+")) { return true; } - + // 그 외의 경우는 일단 허용 (실제 차량번호 형식이 다양할 수 있음) // 최소한 한글과 숫자가 모두 포함되어 있는지 확인 - return vhclno.matches(".*[가-힣].*") && vhclno.matches(".*\\d.*"); + return vhclnoWithoutAsterisk.matches(".*[가-힣].*") && vhclnoWithoutAsterisk.matches(".*\\d.*"); } /** diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java index b8abf9c..f95aa4d 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java @@ -33,6 +33,19 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co */ @Override public String executeComparison(CarFfnlgTrgtVO existingData) { + // ========== 특수문자 '*' 제거 (전출차량, 재검여부 표시용) ========== + // 차량번호에서 '*' 제거 + if (existingData.getVhclno() != null) { + String cleanVhclno = existingData.getVhclno().replace("*", ""); + existingData.setVhclno(cleanVhclno); + } + + // 일수에서 '*' 제거 + if (existingData.getDaycnt() != null) { + String cleanDaycnt = existingData.getDaycnt().replace("*", ""); + existingData.setDaycnt(cleanDaycnt); + } + String vhclno = existingData.getVhclno(); log.info("========== 비교 로직 시작: {} ==========", vhclno); diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/AbstractComparisonChecker.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/AbstractComparisonChecker.java index 800c346..60359e4 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/AbstractComparisonChecker.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/delay_checker/AbstractComparisonChecker.java @@ -36,7 +36,7 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker { /** * 자동차기본정보 요청 객체 생성 * - * @param vhrno 차량번호 + * @param vhrno 차량번호 (전출차량 표시 '*' 포함 가능) * @param vin 차대번호 * @param levyCrtrYmd 부과일자 * @return NewBasicRequest @@ -48,7 +48,9 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker { record.setLevyCrtrYmd(levyCrtrYmd); if (vhrno != null) { - record.setVhrno(vhrno); + // API 호출 시 '*' 특수문자 제거 (전출차량 표시용) + String cleanVhrno = vhrno.replace("*", ""); + record.setVhrno(cleanVhrno); record.setInqSeCd("3"); // 3: 자동차번호 } else if (vin != null) { record.setVin(vin); @@ -62,7 +64,7 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker { /** * 자동차등록원부(갑) 요청 객체 생성 * - * @param vhrno 차량번호 + * @param vhrno 차량번호 (전출차량 표시 '*' 포함 가능) * @param ownerNm 성명 * @param idecno 주민번호 * @param legalDongCd 법정동코드 @@ -71,8 +73,9 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker { protected NewLedgerRequest createLedgerRequest(String vhrno, String ownerNm, String idecno, String legalDongCd) { NewLedgerRequest request = new NewLedgerRequest(); - // 차량번호 - request.setVhrno(vhrno); + // API 호출 시 '*' 특수문자 제거 (전출차량 표시용) + String cleanVhrno = vhrno != null ? vhrno.replace("*", "") : vhrno; + request.setVhrno(cleanVhrno); // 민원인 정보 request.setCvlprNm(ownerNm); diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/CarFfnlgTrgtIncmpServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/CarFfnlgTrgtIncmpServiceImpl.java index 53da29e..3321c1e 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/CarFfnlgTrgtIncmpServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/CarFfnlgTrgtIncmpServiceImpl.java @@ -789,10 +789,8 @@ public class CarFfnlgTrgtIncmpServiceImpl extends EgovAbstractServiceImpl implem errors.add(String.format("[데이터 %d] 차량번호가 너무 깁니다. 차량번호: %s (최대 30자)", dataLineNumber, vo.getVhclno())); } - // 2. 소유자명 검증 - if (vo.getOwnrNm() == null || vo.getOwnrNm().isEmpty()) { - errors.add(String.format("[데이터 %d] 소유자명이 누락되었습니다. 차량번호: %s", dataLineNumber, vhclno)); - } else if (vo.getOwnrNm().length() > 75) { + // 2. 소유자명 검증 (소유자명에 null or 공백 들어올수 있음 - 필수 아님) + if (vo.getOwnrNm() != null && !vo.getOwnrNm().isEmpty() && vo.getOwnrNm().length() > 75) { errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s", dataLineNumber, vo.getOwnrNm(), vhclno)); }