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.4 KiB

자동차 과태료 비교 로직 정리

개요

중요 사항

  • ⚠️ 순서가 중요합니다!
  • 조건에 걸리는 순간 다음 차량번호 비교를 진행합니다.

로직 변경 사항

변경 전

  • 하나의 API를 호출해서 비교 로직 진행

변경 후

  1. 기본 호출: TB_CAR_FFNLG_TRGT.검사일 기준으로 API 호출 (기본정보 + 갑부정보)
  2. 추가 호출: 각 비교 로직마다 필요한 API 추가 호출
    • 차량기본정보
    • 갑부정보
    • 기본정보 + 갑부정보

예시: 이첩-2의 경우, (TB_CAR_FFNLG_TRGT.검사종료일자 + 115일) 기준으로 차량기본정보 API 추가 호출


비교 로직 상세

1. 상품용 검증 [차량기본정보 필요]

조건

  1. TB_CAR_FFNLG_TRGT.검사일 기준 API 호출
  2. api.MBER_NM like '%상품용%'
  3. 갑부 상세(LedgerRecord) 리스트에서 다음 조건 확인:
    (List.CHG_YMD between TB_CAR_FFNLG_TRGT.유효기간만료일 and TB_CAR_FFNLG_TRGT.검사종료일자)
    AND
    (List.CHANGE_JOB_SE_CODE = '11')  -- 명의이전 코드
    

처리 결과

  • TB_CAR_FFNLG_TRGT.비고: "[상품용] 갑부정보"

2. 이첩-1 [차량등록원부(갑) 필요]

조건

  1. TB_CAR_FFNLG_TRGT.검사일 기준 API 호출
  2. 법정동코드 불일치 검증

검증 로직 (Java)

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

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

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

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

    if (legalDong4.equals(userOrg4)) {
        log.debug("[이첩][조건1] 법정동코드 일치. 차량번호: {}, 법정동: {}, 조직: {}",
                vhclno, legalDong4, userOrg4);
        return false;
    }

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

처리 결과

  • TB_CAR_FFNLG_TRGT.비고: "서울시 용산구 / 이경호, 검사일사용본거지, [검사대상, 사용자 조직코드 앞 4자리 및 법정동명]"

3. 이첩-2 [차량기본정보 필요]

조건

  1. TB_CAR_FFNLG_TRGT.DAYCNT (textFile 일수) > 115
  2. 검사일 기준 API 호출
  3. (검사종료일자 + 115일) 기준 API 호출 (추가)
  4. 2번 API와 3번 API의 자동차기본정보 비교
    • 사용본거지법정동코드 앞 4자리가 다를 경우

처리 결과

  • TB_CAR_FFNLG_TRGT.비고: "전라남도 순천시 / 김정대, 115일 도래지, [2개의 API 법정동코드 및 법정동명]"

데이터 흐름도

TB_CAR_FFNLG_TRGT (과태료 대상)
    ↓
검사일 기준 API 호출 (기본정보 + 갑부정보)
    ↓
┌─────────────┬─────────────┬─────────────┐
│   상품용    │   이첩-1    │   이첩-2    │
│  검증 로직  │  검증 로직  │  검증 로직  │
└─────────────┴─────────────┴─────────────┘
    ↓             ↓             ↓
조건 만족 시 비고 업데이트 → 다음 차량번호 처리

핵심 필드 매핑

테이블 필드명 설명
TB_CAR_FFNLG_TRGT 검사일 API 호출 기준일 (기본)
TB_CAR_FFNLG_TRGT 검사종료일자 이첩-2에서 +115일 계산에 사용
TB_CAR_FFNLG_TRGT 유효기간만료일 상품용 검증 기간 시작일
TB_CAR_FFNLG_TRGT DAYCNT 일수 (이첩-2 조건)
TB_CAR_FFNLG_TRGT 비고 검증 결과 저장
API 기본정보 MBER_NM 회원명 (상품용 검증)
API 기본정보 useStrnghldLegaldongCode 사용본거지법정동코드 (이첩 검증)
API 갑부 상세 CHG_YMD 변경일자 (상품용 기간 검증)
API 갑부 상세 CHANGE_JOB_SE_CODE 변경작업구분코드 (명의이전: 11)
사용자 정보 OrgCd 조직코드 (이첩-1 검증)

주의사항

  1. 순차 처리: 각 차량번호는 조건에 걸리는 즉시 다음 차량번호로 넘어갑니다.
  2. API 호출 최적화: 기본적으로 검사일 기준 API를 호출하고, 필요시에만 추가 호출합니다.
  3. 로그 기록: 각 검증 단계마다 상세 로그를 남겨 추적 가능하도록 합니다.
  4. 에러 처리: API 호출 실패 또는 데이터 부재 시 적절한 에러 처리가 필요합니다.