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

5.8 KiB

자동차 과태료 비교 로직 명세서

개요

자동차 과태료 부과 대상을 검증하기 위한 비교 로직 정의서입니다.

기본 설정

  • API 선택: YML flag 값에 따라 구/신 API 호출 결정
  • 통합 모델: 구/신 API 응답을 통일된 model object로 처리
    • 구 API: 자동차기본정보 API
    • 신 API: 자동차기본정보 API, 자동차등록원부(갑)
  • 통합 오브젝트: 자동차기본정보(구, 신)만 필요

처리 규칙

중요: 순서가 중요함!

  • 조건에 걸리는 순간 다음 차량번호 비교로 진행
  • 각 비교 로직별로 개별 API 호출 수행

비교 로직 상세

1. 상품용 검증

필요 API: 자동차등록원부(갑)

API 호출 순서

순서 API 입력 파라미터 출력 데이터
1 자동차기본정보 차량번호, 부과일자=검사일 차대번호, 소유자명
2 자동차기본정보 1.차대번호, 부과일자=오늘일자 차량번호, 성명, 민원인주민번호, 민원인법정동코드
3 자동차등록원본(갑) 2.차량번호, 2.성명, 2.민원인주민번호, 2.민원인법정동코드 갑부 상세 List

비교 조건

// 조건 1: 소유자명에 '상품용' 포함 여부
api.MBER_NM.contains("상품용")

// 조건 2: 갑부 상세 목록에서 명의이전 이력 확인
for (LedgerRecord record : 갑부상세List) {
    if (record.CHG_YMD >= TB_CAR_FFNLG_TRGT.유효기간만료일
        && record.CHG_YMD <= TB_CAR_FFNLG_TRGT.검사종료일자
        && record.CHANGE_JOB_SE_CODE == "11") {  // 11 = 명의이전 코드
        return true;
    }
}

결과 처리

  • 비고 컬럼: "[상품용] 갑부정보"

2. 이첩 검증 (이첩-1, 이첩-2 병합 로직)

필요 API: 자동차기본정보

부과기준일 결정

int dayCnt = TB_CAR_FFNLG_TRGT.DAYCNT;  // textFile 일수

if (dayCnt > 115) {
    // 이첩-2
    부과기준일 = TB_CAR_FFNLG_TRGT.검사종료일자.plusDays(115);
} else {
    // 이첩-1
    부과기준일 = TB_CAR_FFNLG_TRGT.검사일자;
}

API 호출

// 부과기준일 기준으로 자동차기본정보 API 호출
BasicResponse response = 자동차기본정보API.call(부과기준일, 차량번호);

법정동코드 비교 로직 (공통)

/**
 * 이첩 조건: 법정동코드 불일치 검증
 * 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
 */
private boolean checkTransferCondition_LegalDongMismatch(
    BasicResponse.Record basicInfo,
    String userId,
    String vhclno
) {
    String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode();

    // 1. 법정동코드 유효성 검사
    if (useStrnghldLegaldongCode == null || useStrnghldLegaldongCode.length() < 4) {
        log.debug("[이첩] 법정동코드 없음. 차량번호: {}", vhclno);
        return false;
    }

    // 2. 사용자 정보 조회
    SystemUserVO userInfo = userMapper.selectUser(userId);
    if (userInfo == null || userInfo.getOrgCd() == null) {
        log.debug("[이첩] 사용자 정보 없음. 사용자ID: {}", userId);
        return false;
    }

    // 3. 법정동코드 앞 4자리 vs 사용자 조직코드 앞 4자리 비교
    String legalDong4 = useStrnghldLegaldongCode.substring(0, 4);
    String userOrgCd = userInfo.getOrgCd();
    String userOrg4 = userOrgCd.length() >= 4
        ? userOrgCd.substring(0, 4)
        : userOrgCd;

    // 4. 일치 여부 판단
    if (legalDong4.equals(userOrg4)) {
        log.debug("[이첩] 법정동코드 일치. 차량번호: {}, 법정동: {}, 조직: {}",
            vhclno, legalDong4, userOrg4);
        return false;  // 일치하면 이첩 대상 아님
    }

    log.info("[이첩] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
        vhclno, legalDong4, userOrg4);
    return true;  // 불일치하면 이첩 대상
}

결과 처리

구분 조건 비고 컬럼 형식
이첩-1 DAYCNT <= 115 "서울시 용산구/ 이경호, 검사일사용본거지, [검사대상, 사용자 조직코드 앞 4자리 및 법정동명]"
이첩-2 DAYCNT > 115 "전라남도 순천시 / 김정대, 115일 도래지, [2개의 api 법정동코드 및 법정동명]"

데이터 모델

TB_CAR_FFNLG_TRGT (과태료 대상 테이블)

컬럼명 설명 용도
검사일 검사 기준일 API 호출 파라미터
검사종료일자 검사 종료 일자 115일 계산 기준
유효기간만료일 유효기간 만료일 상품용 갑부 비교 시작일
DAYCNT textFile 일수 이첩-1/2 분기 조건
비고 검증 결과 메시지 결과 저장

코드 정의

코드 코드값 설명
CHANGE_JOB_SE_CODE 11 명의이전

처리 흐름도

시작
  │
  ▼
[차량번호 조회]
  │
  ▼
[1. 상품용 검증] ──(조건 충족)──> [비고 기록] ──> [다음 차량]
  │
  │ (조건 미충족)
  ▼
[2. DAYCNT 확인]
  │
  ├─ (> 115) ──> [이첩-2: 115일 도래지 기준]
  │
  └─ (<= 115) ──> [이첩-1: 검사일 기준]
  │
  ▼
[법정동코드 비교]
  │
  ├─ (불일치) ──> [비고 기록] ──> [다음 차량]
  │
  └─ (일치) ──> [다음 차량]

구현 시 주의사항

  1. API 호출 순서 준수: 각 검증 단계별로 필요한 API만 호출
  2. 조건 우선순위: 상품용 > 이첩 순서로 검증
  3. 조기 종료: 조건 충족 시 즉시 다음 차량으로 이동
  4. 비고 컬럼: 각 조건별 정해진 형식으로 기록
  5. 법정동코드 길이 검증: 최소 4자리 이상 필요