|
|
|
|
# 자동차 과태료 비교 로직 명세서 (미필)
|
|
|
|
|
|
|
|
|
|
## 개요
|
|
|
|
|
|
|
|
|
|
자동차 과태료 부과 대상(미필)을 검증하기 위한 비교 로직 정의서입니다.
|
|
|
|
|
|
|
|
|
|
### 구현 위치
|
|
|
|
|
- **Checker 클래스**: `src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/`
|
|
|
|
|
- `ProductUseOmChecker.java` - 1. 상품용
|
|
|
|
|
- `OwnerTransferOmChecker.java` - 2. 명의이전 소유자 확인
|
|
|
|
|
- `TransferOmChecker.java` - 3. 이첩
|
|
|
|
|
|
|
|
|
|
### 기본 설정
|
|
|
|
|
- 비교로직에 사용되는 API: `ExternalVehicleApiServiceImpl.getBasicInfo`, `getLedgerInfo` 호출
|
|
|
|
|
- 날짜 유틸리티: `DateUtil.parseDate()`, `DateUtil.formatDateString()` 사용
|
|
|
|
|
- **미필 부과일자**: 검사유효기간 종료일 + 146일 (`levyCrtrYmd`)
|
|
|
|
|
|
|
|
|
|
### 문서 이력
|
|
|
|
|
|
|
|
|
|
| 일자 | 변경 내용 | 비고 |
|
|
|
|
|
|------|----------|------|
|
|
|
|
|
| 2025-12-08 | om_checker 소스 기준 전면 작성 | 실제 코드와 일치하도록 정리 |
|
|
|
|
|
| 2025-12-09 | 검사유효기간 종료일 + 31일 로직 반영 | ProductUseOmChecker, OwnerTransferOmChecker |
|
|
|
|
|
|
|
|
|
|
### 처리 규칙
|
|
|
|
|
|
|
|
|
|
> **중요**: 순서가 중요함!
|
|
|
|
|
> 1. 상품용 → 2. 명의이전 소유자 확인 → 3. 이첩
|
|
|
|
|
> - 조건에 걸리는 순간 다음 차량번호 비교로 진행
|
|
|
|
|
> - 각 비교 로직별로 개별 API 호출 수행
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 비교 로직 상세
|
|
|
|
|
|
|
|
|
|
### 1. 상품용 검증 (`ProductUseOmChecker`)
|
|
|
|
|
|
|
|
|
|
**처리상태코드**: `02` (상품용)
|
|
|
|
|
**클래스**: `ProductUseOmChecker.java`
|
|
|
|
|
|
|
|
|
|
#### API 호출 순서
|
|
|
|
|
|
|
|
|
|
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|
|
|
|
|
|------|-----|--------------|-------------|------|
|
|
|
|
|
| 1 | 자동차기본정보 | `차량번호`, `부과일자=검사유효기간종료일+146일` | `차대번호(vin)`, `소유자명`, `대표소유자회원번호` | 부과일자 기준 소유자 확인 |
|
|
|
|
|
| 2 | 자동차기본정보 | `1.차대번호`, `부과일자=오늘` | `차량번호`, `성명`, `주민번호`, `법정동코드` | 현재 소유자 정보 |
|
|
|
|
|
| 3 | 자동차등록원부(갑) | `2.차량번호`, `2.성명`, `2.주민번호`, `2.법정동코드` | 갑부 상세 List | 명의이전 이력 조회 |
|
|
|
|
|
| 4 | 자동차기본정보 | `1.차대번호`, `부과일자=CHG_YMD` | `소유자명`, `대표소유자회원번호` | 명의이전 시점 소유자 확인 |
|
|
|
|
|
|
|
|
|
|
#### 비교 조건
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
1. Step1 소유자명.contains("상품용") ← 상품용 아니면 return null
|
|
|
|
|
|
|
|
|
|
2. Step2 대표소유자회원번호 == Step1 대표소유자회원번호
|
|
|
|
|
← 불일치면 return null
|
|
|
|
|
|
|
|
|
|
3. 갑부에서 명의이전(11) 레코드 찾기
|
|
|
|
|
- CHG_TASK_SE_CD == "11"
|
|
|
|
|
- CHG_YMD <= 검사유효기간 종료일 + 31일
|
|
|
|
|
- 가장 마지막 일자 선택
|
|
|
|
|
← 없으면 return null
|
|
|
|
|
|
|
|
|
|
4. Step4 대표소유자회원번호 == Step1 대표소유자회원번호
|
|
|
|
|
← 불일치면 return null
|
|
|
|
|
|
|
|
|
|
→ 모든 조건 충족: 상품용(02) 처리
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### DB 업데이트 필드
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
existingData.setTaskPrcsSttsCd("02"); // 상품용
|
|
|
|
|
existingData.setCarBscMttrInqFlnm(step4OwnerName);
|
|
|
|
|
existingData.setCarRegFrmbkChgTaskSeCd("11");
|
|
|
|
|
existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 2. 명의이전 소유자 확인 (`OwnerTransferOmChecker`)
|
|
|
|
|
|
|
|
|
|
**처리상태코드**: `01` (그대로 접수)
|
|
|
|
|
**클래스**: `OwnerTransferOmChecker.java`
|
|
|
|
|
|
|
|
|
|
#### API 호출 순서
|
|
|
|
|
|
|
|
|
|
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|
|
|
|
|
|------|-----|--------------|-------------|------|
|
|
|
|
|
| 1 | 자동차기본정보 | `차량번호`, `부과일자=검사유효기간종료일+146일` | `차대번호(vin)`, `소유자명` | 부과일자 기준 소유자 확인 |
|
|
|
|
|
| 2 | 자동차기본정보 | `1.차대번호`, `부과일자=오늘` | `차량번호`, `성명`, `주민번호`, `법정동코드` | 현재 소유자 정보 |
|
|
|
|
|
| 3 | 자동차등록원부(갑) | `2.차량번호`, `2.성명`, `2.주민번호`, `2.법정동코드` | 갑부 상세 List | 명의이전 이력 조회 |
|
|
|
|
|
| 4 | 자동차기본정보 | `1.차대번호`, `부과일자=CHG_YMD-1일` | `소유자명` | 명의이전 직전 소유자 확인 |
|
|
|
|
|
|
|
|
|
|
#### 비교 조건
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
1. Step1 소유자명.contains("상품용") → return null (1번에서 처리됨)
|
|
|
|
|
!Step1 소유자명.contains("상품용") → 계속 진행
|
|
|
|
|
|
|
|
|
|
2. 갑부에서 명의이전(11) 레코드 찾기
|
|
|
|
|
- CHG_TASK_SE_CD == "11"
|
|
|
|
|
- CHG_YMD > 검사유효기간 종료일 + 31일
|
|
|
|
|
- 가장 마지막 일자 선택
|
|
|
|
|
← 없으면 return null
|
|
|
|
|
|
|
|
|
|
3. Step4 소유자명 확인
|
|
|
|
|
- "상품용" 포함 → 접수(01)
|
|
|
|
|
- "상품용" 미포함 → 접수(01)
|
|
|
|
|
|
|
|
|
|
→ 모든 조건 충족: 접수(01) 처리
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 결과 분기
|
|
|
|
|
|
|
|
|
|
| Step4 소유자명 | 처리상태코드 | 비고 형식 |
|
|
|
|
|
|---------------|-----------|-----------|
|
|
|
|
|
| 상품용 포함 | `01` (접수) | 명의이전(날짜) 이전소유자 상품용 |
|
|
|
|
|
| 상품용 미포함 | `01` (접수) | 명의이전(날짜) |
|
|
|
|
|
|
|
|
|
|
#### DB 업데이트 필드
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
existingData.setTaskPrcsSttsCd("01"); // 접수
|
|
|
|
|
existingData.setCarBscMttrInqFlnm(step4OwnerName);
|
|
|
|
|
existingData.setCarRegFrmbkChgTaskSeCd("11");
|
|
|
|
|
existingData.setCarRegFrmbkChgYmd(targetRecord.getChgYmd());
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 3. 이첩 검증 (`TransferOmChecker`)
|
|
|
|
|
|
|
|
|
|
**처리상태코드**: `03` (이첩)
|
|
|
|
|
**클래스**: `TransferOmChecker.java`
|
|
|
|
|
|
|
|
|
|
#### API 호출 순서
|
|
|
|
|
|
|
|
|
|
| 순서 | API | 입력 파라미터 | 출력 데이터 | 용도 |
|
|
|
|
|
|------|-----|--------------|-------------|------|
|
|
|
|
|
| 1 | 자동차기본정보 | `차량번호`, `부과일자=검사유효기간종료일+146일` | `소유자명`, `소유자회원번호`, `사용본거지법정동코드`, `차대번호` | 부과일자 기준 정보 |
|
|
|
|
|
| 2 | 자동차기본정보 | `1.차대번호`, `부과일자=검사유효기간종료일-90일` | `소유자명`, `소유자회원번호` | 90일 전 소유자 확인 |
|
|
|
|
|
| 3 | 자동차기본정보 | `1.차대번호`, `부과일자=오늘` | `소유자명`, `소유자회원번호` | 현재 소유자 확인 |
|
|
|
|
|
|
|
|
|
|
#### 비교 조건
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
1. Step1 소유자명.contains("상품용") → return null (1번에서 처리됨)
|
|
|
|
|
!Step1 소유자명.contains("상품용") → 계속 진행
|
|
|
|
|
|
|
|
|
|
2. Step1 소유자회원번호 != Step2 소유자회원번호
|
|
|
|
|
← 불일치면 return null
|
|
|
|
|
|
|
|
|
|
3. Step1 소유자회원번호 != Step3 소유자회원번호
|
|
|
|
|
← 불일치면 return null
|
|
|
|
|
|
|
|
|
|
4. 법정동코드 앞 4자리 == 사용자 조직코드 앞 4자리
|
|
|
|
|
← 일치하면 return null
|
|
|
|
|
|
|
|
|
|
→ 불일치: 이첩(03) 처리
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 결과 처리
|
|
|
|
|
|
|
|
|
|
| 구분 | 비고 컬럼 형식 |
|
|
|
|
|
|------|---------------|
|
|
|
|
|
| 이첩 | `"{시군구명}, 115일 도래지, [법정동코드: {legalDong4}, 법정동명: {sggNm}]"` |
|
|
|
|
|
|
|
|
|
|
#### DB 업데이트 필드
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
existingData.setTaskPrcsSttsCd("03"); // 이첩
|
|
|
|
|
existingData.setCarBscMttrInqFlnm(step1RprsOwnrNm);
|
|
|
|
|
existingData.setCarBscMttrInqSggCd(sggCd);
|
|
|
|
|
existingData.setCarBscMttrInqSggNm(sggNm);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 처리 흐름도
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
시작
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
[차량번호 조회]
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
┌──────────────────────────────────────────────┐
|
|
|
|
|
│ 1. 상품용 (ProductUseOmChecker) │
|
|
|
|
|
│ 조건: 부과일자 소유자명.contains("상품용") │
|
|
|
|
|
│ + 명의이전(11) 레코드 존재 │
|
|
|
|
|
│ + CHG_YMD <= 검사유효기간종료일+31일 │
|
|
|
|
|
│ + 소유자회원번호 일치 │
|
|
|
|
|
│ → 조건 충족: 상품용(02) │
|
|
|
|
|
└──────────────────────────────────────────────┘
|
|
|
|
|
│ (조건 미충족)
|
|
|
|
|
▼
|
|
|
|
|
┌──────────────────────────────────────────────┐
|
|
|
|
|
│ 2. 명의이전 소유자 확인 (OwnerTransferOmChecker)│
|
|
|
|
|
│ 조건: 부과일자 소유자명에 상품용 미포함 │
|
|
|
|
|
│ + CHG_YMD > 검사유효기간종료일+31일 │
|
|
|
|
|
│ + 명의이전(11) 레코드 존재 │
|
|
|
|
|
│ → 조건 충족: 접수(01) │
|
|
|
|
|
└──────────────────────────────────────────────┘
|
|
|
|
|
│ (조건 미충족)
|
|
|
|
|
▼
|
|
|
|
|
┌──────────────────────────────────────────────┐
|
|
|
|
|
│ 3. 이첩 (TransferOmChecker) │
|
|
|
|
|
│ 조건: 소유자명에 상품용 미포함 │
|
|
|
|
|
│ + 1단계/2단계 소유자 같음 │
|
|
|
|
|
│ + 1단계/3단계 소유자 같음 │
|
|
|
|
|
│ + 법정동코드 앞4자리 != 조직코드 앞4자리│
|
|
|
|
|
│ → 조건 충족: 이첩(03) │
|
|
|
|
|
└──────────────────────────────────────────────┘
|
|
|
|
|
│ (조건 미충족)
|
|
|
|
|
▼
|
|
|
|
|
[다음 차량]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 요약 정리
|
|
|
|
|
|
|
|
|
|
### 처리상태코드 매핑
|
|
|
|
|
|
|
|
|
|
| 코드 | 상태명 | 처리 로직 | 클래스 |
|
|
|
|
|
|------|--------|--------------------------|--------|
|
|
|
|
|
| 02 | 상품용 | 부과일자 소유자가 상품용 + 명의이전(11) CHG_YMD <= 종료일+31일 | `ProductUseOmChecker` |
|
|
|
|
|
| 01 | 접수 | 검사유효기간종료일+31일 이후 명의이전 존재 | `OwnerTransferOmChecker` |
|
|
|
|
|
| 03 | 이첩 | 소유자 일치 + 법정동코드 불일치 | `TransferOmChecker` |
|
|
|
|
|
|
|
|
|
|
### 미필 vs 지연 비교
|
|
|
|
|
|
|
|
|
|
| 구분 | 미필 | 지연 |
|
|
|
|
|
|------|-----|------|
|
|
|
|
|
| 부과일자 | 검사유효기간 종료일 + 146일 | 검사일 |
|
|
|
|
|
| 상품용 조건 | 부과일자 기준 소유자명 | 검사일 기준 소유자명 |
|
|
|
|
|
| Checker 개수 | 3개 | 7개 |
|
|
|
|
|
| 이첩 로직 | 3단계 API + 소유자 비교 | DAYCNT 기반 |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 참고 상수 및 유틸리티
|
|
|
|
|
|
|
|
|
|
### 상수
|
|
|
|
|
```java
|
|
|
|
|
// 부과일자 계산 (미필)
|
|
|
|
|
levyCrtrYmd = 검사유효기간 종료일 + 146일
|
|
|
|
|
|
|
|
|
|
// 처리상태코드
|
|
|
|
|
TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_02_PRODUCT_USE = "02"
|
|
|
|
|
TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_03_TRANSFER = "03"
|
|
|
|
|
|
|
|
|
|
// 변경업무구분코드
|
|
|
|
|
"11" = 명의이전
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
**문서 최종 수정일**: 2025-12-09
|
|
|
|
|
**실제 소스 코드 기준**: om_checker 폴더 내 Checker 클래스들
|
|
|
|
|
**분석 대상 클래스**: 3개 (ProductUseOmChecker, OwnerTransferOmChecker, TransferOmChecker)
|
|
|
|
|
**주요 변경사항**: 검사유효기간 종료일 + 31일 로직 적용
|