From d41a2975d3fabf92bae4672430e3bd55178487ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Mon, 8 Dec 2025 14:33:17 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AF=B8=ED=95=84=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20MD=20=ED=8C=8C=EC=9D=BC=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/자동차과태료_비교로직_정리-[미필].md | 260 ++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 docs/자동차과태료_비교로직_정리-[미필].md diff --git a/docs/자동차과태료_비교로직_정리-[미필].md b/docs/자동차과태료_비교로직_정리-[미필].md new file mode 100644 index 0000000..a08c364 --- /dev/null +++ b/docs/자동차과태료_비교로직_정리-[미필].md @@ -0,0 +1,260 @@ +# 자동차 과태료 비교 로직 명세서 (미필) + +## 개요 + +자동차 과태료 부과 대상(미필)을 검증하기 위한 비교 로직 정의서입니다. + +### 구현 위치 +- **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 소스 기준 전면 작성 | 실제 코드와 일치하도록 정리 | + +### 처리 규칙 + +> **중요**: 순서가 중요함! +> 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 <= 검사유효기간 종료일 + - 가장 마지막 일자 선택 + ← 없으면 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`) + +**처리상태코드**: `02` (상품용) +**클래스**: `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 > 검사유효기간 종료일 + - 가장 마지막 일자 선택 + ← 없으면 return null + +3. Step4 소유자명 확인 + - "상품용" 포함 → 상품용(02) + - "상품용" 미포함 → 상품용(02) + +→ 모든 조건 충족: 상품용(02) 처리 +``` + +#### 결과 분기 + +| Step4 소유자명 | 처리상태코드 | 비고 형식 | +|---------------|-------------|-----------| +| 상품용 포함 | `02` (상품용) | 명의이전(날짜) 이전소유자 상품용 | +| 상품용 미포함 | `02` (상품용) | 명의이전(날짜) | + +#### DB 업데이트 필드 + +```java +existingData.setTaskPrcsSttsCd("02"); // 상품용 +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) 레코드 존재 │ +│ + 소유자회원번호 일치 │ +│ → 조건 충족: 상품용(02) │ +└──────────────────────────────────────────────┘ + │ (조건 미충족) + ▼ +┌──────────────────────────────────────────────┐ +│ 2. 명의이전 소유자 확인 (OwnerTransferOmChecker)│ +│ 조건: 부과일자 소유자명에 상품용 미포함 │ +│ + 검사유효기간종료일 이후 명의이전 존재│ +│ → 조건 충족: 상품용(02) │ +└──────────────────────────────────────────────┘ + │ (조건 미충족) + ▼ +┌──────────────────────────────────────────────┐ +│ 3. 이첩 (TransferOmChecker) │ +│ 조건: 소유자명에 상품용 미포함 │ +│ + 1단계/2단계 소유자 다름 │ +│ + 1단계/3단계 소유자 다름 │ +│ + 법정동코드 앞4자리 != 조직코드 앞4자리│ +│ → 조건 충족: 이첩(03) │ +└──────────────────────────────────────────────┘ + │ (조건 미충족) + ▼ +[다음 차량] +``` + +--- + +## 요약 정리 + +### 처리상태코드 매핑 + +| 코드 | 상태명 | 처리 로직 | 클래스 | +|------|--------|----------|--------| +| 02 | 상품용 | 부과일자 소유자가 상품용 + 명의이전(11) | `ProductUseOmChecker` | +| 02 | 상품용 | 검사유효기간종료일 이후 명의이전 존재 | `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-08 +**실제 소스 코드 기준**: om_checker 폴더 내 Checker 클래스들 +**분석 대상 클래스**: 3개 (ProductUseOmChecker, OwnerTransferOmChecker, TransferOmChecker)