You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
13 KiB
13 KiB
자동차 과태료 비교 로직 명세서 (미필)
개요
자동차 과태료 부과 대상(미필)을 검증하기 위한 비교 로직 정의서입니다.
구현 위치
- Main Service:
src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/ComparisonOmServiceImpl.java - Checker 클래스:
src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/ProductUseOmChecker.java- 1. 상품용 : 상품용TransferOmChecker.java- 2. 이첩 : 경기도 과천시/ 이정호, 115일 도래지OwnerTransferOmChecker.java- 3. 명의이전 소유자 확인 : 명의이전(25.9.5.) 이전소유자 상품용, 경상남도 창원시/ 현대캐피탈 주식회사, 미수검명의이전(25.5.19.)(37하1553)
기본 설정
- 비교로직에 사용되는 API:
ExternalVehicleApiServiceImpl.getBasicInfo,getLedgerInfo호출 - 날짜 유틸리티:
DateUtil.parseDate(),DateUtil.formatDateString()사용 - 미필 부과일자: 검사유효기간 종료일 + 146일 (
levyCrtrYmd)
문서 이력
| 일자 | 변경 내용 | 비고 |
|---|---|---|
| 2025-12-15 | Step 0, Step 1 공통 로직 추가 및 순서 변경 | 이첩 순서 변경 (3번→2번) |
| 2025-12-09 | 검사유효기간 종료일 + 31일 로직 반영 | ProductUseOmChecker, OwnerTransferOmChecker |
| 2025-12-08 | om_checker 소스 기준 전면 작성 | 실제 코드와 일치하도록 정리 |
처리 규칙
중요: 순서가 중요함!
공통 로직 (한 번만 실행):
- Step 0: 자동차기본정보 조회 (차량번호 + 오늘일자)
- Step 1: 자동차기본정보 조회 (차대번호 + 부과일자)
Checker 순서:
- 상품용 → 2. 이첩 → 3. 명의이전 소유자 확인
- 조건에 걸리는 순간 다음 차량번호 비교로 진행
- 각 Checker는 공통 API 응답(step0Response, step1Response)을 파라미터로 받음
공통 로직 (ComparisonOmServiceImpl)
Step 0: 자동차기본정보 조회 (현재 차량 정보)
API 호출: getBasicInfo
| 입력 | 값 |
|---|---|
| 차량번호 | vhclno |
| 부과일자 | 오늘 날짜 (LocalDate.now()) |
출력:
step0Response→ 모든 Checker에 전달- 주요 필드:
vin(차대번호)
실패 시: 비교 로직 종료 (return null)
Step 1: 자동차기본정보 조회 (부과일자 기준 정보)
API 호출: getBasicInfo
| 입력 | 값 |
|---|---|
| 차대번호 | step0Response.vin |
| 부과일자 | 검사유효기간 종료일 + 146일 (levyCrtrYmd) |
출력:
step1Response→ 모든 Checker에 전달- 주요 필드:
소유자명,대표소유자회원번호
실패 시: 비교 로직 종료 (return null)
비교 로직 상세
1. 상품용 검증 (ProductUseOmChecker)
처리상태코드: 02 (상품용)
클래스: ProductUseOmChecker.java
추가 API 호출 순서
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|---|---|---|---|---|
| 2 | 자동차기본정보 | step0.차대번호, 부과일자=오늘 |
차량번호, 성명, 주민번호, 법정동코드 |
현재 소유자 정보 |
| 3 | 자동차등록원부(갑) | 2.차량번호, 2.성명, 2.주민번호, 2.법정동코드 |
갑부 상세 List | 명의이전 이력 조회 |
| 4 | 자동차기본정보 | step0.차대번호, 부과일자=CHG_YMD |
소유자명, 대표소유자회원번호 |
명의이전 시점 소유자 확인 |
참고: Step 0, Step 1은 공통 로직에서 이미 호출됨
비교 조건
1. step1Response 소유자명.contains("상품용") ← 상품용 아니면 return null
2. step1Response 대표소유자회원번호 == step0Response 대표소유자회원번호
← 불일치면 return null
3. 갑부에서 명의이전(11) 레코드 찾기
- CHG_TASK_SE_CD == "11"
- CHG_YMD <= 검사유효기간 종료일 + 31일
- 가장 마지막 일자 선택
← 없으면 return null
4. Step4 대표소유자회원번호 == step1Response 대표소유자회원번호
← 불일치면 return null
→ 모든 조건 충족: 상품용(02) 처리
DB 업데이트 필드
existingData.setTaskPrcsSttsCd("02"); // 상품용
existingData.setCarBscMttrInqFlnm(step4OwnerName);
existingData.setCarRegFrmbkChgTaskSeCd("11");
existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
2. 이첩 검증 (TransferOmChecker)
처리상태코드: 03 (이첩)
클래스: TransferOmChecker.java
추가 API 호출 순서
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|---|---|---|---|---|
| 2 | 자동차기본정보 | step0.차대번호, 부과일자=검사유효기간종료일-90일 |
소유자명, 소유자회원번호 |
90일 전 소유자 확인 |
| 3 | 자동차기본정보 | step0.차대번호, 부과일자=오늘 |
소유자명, 소유자회원번호 |
현재 소유자 확인 |
참고: Step 0, Step 1은 공통 로직에서 이미 호출됨
비교 조건
1. step1Response 소유자명.contains("상품용") → return null (1번에서 처리됨)
!step1Response 소유자명.contains("상품용") → 계속 진행
2. step1Response 소유자회원번호 != Step2 소유자회원번호
← 일치하면 return null
3. step1Response 소유자회원번호 != Step3 소유자회원번호
← 일치하면 return null
4. 법정동코드 앞 4자리 == 사용자 조직코드 앞 4자리
← 일치하면 return null
→ 불일치: 이첩(03) 처리
결과 처리
| 구분 | 비고 컬럼 형식 |
|---|---|
| 이첩 | "{시군구명}, 115일 도래지, [법정동코드: {legalDong4}, 법정동명: {sggNm}]" |
DB 업데이트 필드
existingData.setTaskPrcsSttsCd("03"); // 이첩
existingData.setCarBscMttrInqFlnm(step1RprsOwnrNm);
existingData.setCarBscMttrInqSggCd(sggCd);
existingData.setCarBscMttrInqSggNm(sggNm);
3. 명의이전 소유자 확인 (OwnerTransferOmChecker)
처리상태코드: 01 (그대로 접수)
클래스: OwnerTransferOmChecker.java
추가 API 호출 순서
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|---|---|---|---|---|
| 2 | 자동차기본정보 | step0.차대번호, 부과일자=오늘 |
차량번호, 성명, 주민번호, 법정동코드 |
현재 소유자 정보 |
| 3 | 자동차등록원부(갑) | 2.차량번호, 2.성명, 2.주민번호, 2.법정동코드 |
갑부 상세 List | 명의이전 이력 조회 |
| 4 | 자동차기본정보 | step0.차대번호, 부과일자=CHG_YMD-1일 |
소유자명 |
명의이전 직전 소유자 확인 |
참고: Step 0, Step 1은 공통 로직에서 이미 호출됨
비교 조건
1. step1Response 소유자명.contains("상품용") → return null (1번에서 처리됨)
!step1Response 소유자명.contains("상품용") → 계속 진행
2. 갑부에서 명의이전(11) 레코드 찾기
- CHG_TASK_SE_CD == "11"
- CHG_YMD > 검사유효기간 종료일 + 31일
- 가장 마지막 일자 선택
← 없으면 return null
3. Step4 소유자명 확인
- "상품용" 포함 → 접수(01)
- "상품용" 미포함 → 접수(01)
→ 모든 조건 충족: 접수(01) 처리
결과 분기
| Step4 소유자명 | 처리상태코드 | 비고 형식 |
|---|---|---|
| 상품용 포함 | 01 (접수) |
명의이전(날짜) 이전소유자 상품용 |
| 상품용 미포함 | 01 (접수) |
명의이전(날짜) |
DB 업데이트 필드
existingData.setTaskPrcsSttsCd("01"); // 접수
existingData.setCarBscMttrInqFlnm(step4OwnerName);
existingData.setCarRegFrmbkChgTaskSeCd("11");
existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
처리 흐름도
시작
│
▼
[차량번호 조회]
│
▼
┌──────────────────────────────────────────────┐
│ 공통: Step 0 - 자동차기본정보 (차량번호, 오늘) │
│ → step0Response (차대번호) │
└──────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 공통: Step 1 - 자동차기본정보 (차대번호, 부과일자)│
│ → step1Response (소유자명) │
│ 부과일자 = 검사유효기간종료일 + 146일 │
└──────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 1. 상품용 (ProductUseOmChecker) │
│ 조건: step1 소유자명.contains("상품용") │
│ + 명의이전(11) 레코드 존재 │
│ + CHG_YMD <= 검사유효기간종료일+31일 │
│ + 소유자회원번호 일치 │
│ → 조건 충족: 상품용(02) │
└──────────────────────────────────────────────┘
│ (조건 미충족)
▼
┌──────────────────────────────────────────────┐
│ 2. 이첩 (TransferOmChecker) │
│ 조건: 소유자명에 상품용 미포함 │
│ + step1/step2 소유자 다름 │
│ + step1/step3 소유자 다름 │
│ + 법정동코드 앞4자리 != 조직코드 앞4자리│
│ → 조건 충족: 이첩(03) │
└──────────────────────────────────────────────┘
│ (조건 미충족)
▼
┌──────────────────────────────────────────────┐
│ 3. 명의이전 소유자 확인 (OwnerTransferOmChecker)│
│ 조건: step1 소유자명에 상품용 미포함 │
│ + CHG_YMD > 검사유효기간종료일+31일 │
│ + 명의이전(11) 레코드 존재 │
│ → 조건 충족: 접수(01) │
└──────────────────────────────────────────────┘
│ (조건 미충족)
▼
[다음 차량]
요약 정리
공통 로직
| Step | API 호출 | 입력 | 출력 | 용도 |
|---|---|---|---|---|
| Step 0 | 자동차기본정보 | 차량번호 + 오늘일자 | step0Response (차대번호) | 현재 차량 기본 정보 |
| Step 1 | 자동차기본정보 | 차대번호 + 부과일자 | step1Response (소유자명, 회원번호) | 부과일자 기준 소유자 정보 |
처리상태코드 매핑
| 순서 | 코드 | 상태명 | 처리 로직 | 클래스 |
|---|---|---|---|---|
| 1 | 02 | 상품용 | step1 소유자가 상품용 + 명의이전(11) CHG_YMD <= 종료일+31일 | ProductUseOmChecker |
| 2 | 03 | 이첩 | step1/step2/step3 소유자 비교 + 법정동코드 불일치 | TransferOmChecker |
| 3 | 01 | 접수 | 검사유효기간종료일+31일 이후 명의이전 존재 | OwnerTransferOmChecker |
미필 vs 지연 비교
| 구분 | 미필 | 지연 |
|---|---|---|
| 부과일자 | 검사유효기간 종료일 + 146일 | 검사일 |
| Step 1 기준일 | 부과일자 (종료일+146일) | 검사일 |
| 상품용 조건 | step1(부과일자) 기준 소유자명 | step1(검사일) 기준 소유자명 |
| Checker 개수 | 3개 | 7개 |
| 이첩 로직 | 3단계 API + 소유자 비교 | DAYCNT 기반 |
| 공통 로직 | Step 0, Step 1 | Step 0, Step 1 |
참고 상수 및 유틸리티
상수
// 부과일자 계산 (미필)
levyCrtrYmd = 검사유효기간 종료일 + 146일
// 처리상태코드
TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_01_RECEIPT = "01"
TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_02_PRODUCT_USE = "02"
TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_03_TRANSFER = "03"
// 변경업무구분코드
"11" = 명의이전
문서 최종 수정일: 2025-12-15 실제 소스 코드 기준: ComparisonOmServiceImpl, om_checker 폴더 내 Checker 클래스들 분석 대상 클래스: 4개 (ComparisonOmServiceImpl + 3개 Checker) 주요 변경사항: Step 0, Step 1 공통 로직 추가, 이첩 순서 변경 (3번→2번)