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.
VIPS/docs/자동차과태료_비교로직_정리-[미필].md

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 순서:

  1. 상품용 → 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번)