### feat: 비고 상세 생성 로직 개선 및 데이터 처리 로직 확장

- **비고 상세 생성 및 업데이트**
  - `ComparisonOmRemarkBuilder` 및 `ComparisonRemarkBuilder` 수정:
    - 비고 상세 생성 시 API 호출 및 비교 과정, 판정 근거 등 추가 기록.
    - 각 판정 유형별로 세부 정보를 포함하도록 형식 개선.

- **Checker 로직 개선**
  - `OwnerCloseWithin31Checker`, `OwnerLevyOver31Checker` 등 `delay_checker` 클래스:
    - 명의이전일자 및 검사일 간 조건 비교 로직 확장.
    - 추가 쿼리 조건 및 상세한 레코드 비교 로직 포함.

- **DB 스키마 변경**
  - `tb_car_ffnlg_trgt`, `tb_car_ffnlg_trgt_incmp` 테이블:
    - `RMRK_DTL` 컬럼 타입을 `TEXT`로 변경.
    - `RMRK_DTL` 컬럼 신규 추가로 비고 상세 저장 로직을 지원.

- **API 수정**
  - `ComparisonRemarkBuilder.buildOwnerLevyOver31RemarkDetail` 메서드:
    - `vldPrdExpryYmd`, `inspEndYmd` 등 추가 파라미터 처리.
    - 검사종료일 및 유효기간만료일에 따른 추가 비교 로직 반영.

- **기타**
  - 기존 비고 생성 로직 리팩토링 및 상세 기록을 위한 주석 추가.
  - 변경 사항을 반영한 추가 SQL 파일 작성 및 테이블 변경 적용.
main
박성영 4 days ago
parent f6c70be983
commit cadf5af5a3

@ -21,7 +21,7 @@ create table tb_car_ffnlg_trgt
TASK_PRCS_STTS_CD varchar(2) null comment '업무 처리 상태 코드',
TASK_PRCS_YMD varchar(8) null comment '업무 처리 일자',
RMRK varchar(4000) null comment '비고',
RMRK_DTL varchar(4000) null comment '비고 상세',
RMRK_DTL TEXT null comment '비고 상세',
CAR_BASS_MATTER_INQIRE_ID varchar(20) null comment '자동차 기본 사항 조회 ID',
CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID',
CAR_BSC_MTTR_INQ_FLNM varchar(75) null comment '자동차 기본 사항 조회 성명',
@ -39,3 +39,7 @@ create table tb_car_ffnlg_trgt
)
comment '자동차 과태료 대상';
ALTER TABLE tb_car_ffnlg_trgt
ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';

@ -17,7 +17,7 @@ create table tb_car_ffnlg_trgt_incmp
TASK_PRCS_STTS_CD varchar(2) null comment '업무 처리 상태 코드',
TASK_PRCS_YMD varchar(8) null comment '업무 처리 일자',
RMRK varchar(4000) null comment '비고',
RMRK_DTL varchar(4000) null comment '비고 상세',
RMRK_DTL TEXT null comment '비고 상세',
CAR_BASS_MATTER_INQIRE_ID varchar(20) null comment '자동차 기본 사항 조회 ID',
CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID',
CAR_BSC_MTTR_INQ_FLNM varchar(75) null comment '자동차 기본 사항 조회 성명',
@ -35,3 +35,7 @@ create table tb_car_ffnlg_trgt_incmp
)
comment '자동차 과태료 대상 미필';
ALTER TABLE tb_car_ffnlg_trgt_incmp
ADD COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세';

@ -112,15 +112,42 @@ public class ComparisonRemarkBuilder {
public static String buildProductUseRemarkDetail(String vhclno, String inspYmd,
String step1OwnerNm, String targetChgYmd, String step4OwnerNm) {
StringBuilder sb = new StringBuilder();
sb.append("[상품용 판정]\n");
sb.append("[상품용 판정 - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 포함되어 있고, ");
sb.append("갑부 상세에서 변경업무구분코드 '21'(변경등록) 레코드 확인됨");
return truncateToMaxLength(sb.toString());
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → O\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사종료일자\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 갑부 변경일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n");
sb.append(" - 변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 검사일자 기준 소유자명에 '상품용' 포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사종료일자 이내에 존재\n");
sb.append("3. 갑부 변경일자 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일\n");
sb.append("→ 상품용 판정 (처리상태: 02_상품용)\n");
return sb.toString();
}
/**
@ -138,17 +165,53 @@ public class ComparisonRemarkBuilder {
String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
StringBuilder sb = new StringBuilder();
sb.append("[내사종결 - 명의이전 이전소유자 상품용 판정]\n");
sb.append("[내사종결 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString(
DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n");
sb.append("=== 일수 계산 ===\n");
sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n");
sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 미포함이나, ");
sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'이고, ");
sb.append("명의이전일이 검사일로부터 31일 이내임");
return truncateToMaxLength(sb.toString());
sb.append("기준일수: 31일\n");
sb.append("조건 확인: ").append(daysBetween).append("일 ≤ 31일 → 이내\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n");
sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n");
sb.append("4. 명의이전일이 검사일로부터 31일 이내 (").append(daysBetween).append("일)\n");
sb.append("→ 내사종결 - 명의이전 이전소유자 상품용 판정 (처리상태: 04_내사종결)\n");
return sb.toString();
}
/**
@ -166,16 +229,53 @@ public class ComparisonRemarkBuilder {
String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
StringBuilder sb = new StringBuilder();
sb.append("[내사종결 - 명의이전 판정]\n");
sb.append("[내사종결 - 명의이전 판정 - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n");
sb.append(" - 명의이전 시점 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n");
sb.append(" - 명의이전 시점 소유자명에 '상품용' 포함 → X\n\n");
sb.append("=== 일수 계산 ===\n");
sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n");
sb.append("판정근거: 검사일 기준 소유자와 명의이전 전 소유자가 동일하고, ");
sb.append("명의이전일이 검사일로부터 31일 이내임");
return truncateToMaxLength(sb.toString());
sb.append("기준일수: 31일\n");
sb.append("조건 확인: ").append(daysBetween).append("일 ≤ 31일 → 이내\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n");
sb.append("3. 명의이전 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일 (소유자 변동 없음)\n");
sb.append("4. 명의이전 시점 소유자명에 '상품용' 미포함\n");
sb.append("5. 명의이전일이 검사일로부터 31일 이내 (").append(daysBetween).append("일)\n");
sb.append("→ 내사종결 - 명의이전 판정 (처리상태: 04_내사종결)\n");
return sb.toString();
}
/**
@ -193,17 +293,54 @@ public class ComparisonRemarkBuilder {
String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
StringBuilder sb = new StringBuilder();
sb.append("[날짜수정후부과 - 명의이전 이전소유자 상품용 판정]\n");
sb.append("[날짜수정후부과 - 명의이전 이전소유자 상품용 판정 - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사일자\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString(
DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n");
sb.append("=== 일수 계산 ===\n");
sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n");
sb.append("판정근거: 검사일 기준 소유자명에 '상품용' 미포함이나, ");
sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'이고, ");
sb.append("명의이전일이 검사일로부터 31일 초과함 (부과일자 수정 필요)");
return truncateToMaxLength(sb.toString());
sb.append("기준일수: 31일\n");
sb.append("조건 확인: ").append(daysBetween).append("일 > 31일 → 초과\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사일자 이내에 존재\n");
sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n");
sb.append("4. 명의이전일이 검사일로부터 31일 초과 (").append(daysBetween).append("일)\n");
sb.append("→ 날짜수정후부과 - 명의이전 이전소유자 상품용 판정 (처리상태: 05_날짜수정후부과)\n");
sb.append("※ 부과일자를 명의이전일자로 수정하여 재부과 필요\n");
return sb.toString();
}
/**
@ -211,26 +348,74 @@ public class ComparisonRemarkBuilder {
*
* @param vhclno
* @param inspYmd
* @param vldPrdExpryYmd
* @param inspEndYmd
* @param step1OwnerNm Step1
* @param targetChgYmd
* @param step4OwnerNm Step4 ( )
* @param daysBetween
* @return
*/
public static String buildOwnerLevyOver31RemarkDetail(String vhclno, String inspYmd,
String step1OwnerNm, String targetChgYmd,
public static String buildOwnerLevyOver31RemarkDetail(String vhclno, String inspYmd, String vldPrdExpryYmd,
String inspEndYmd, String step1OwnerNm, String targetChgYmd,
String step4OwnerNm, long daysBetween) {
StringBuilder sb = new StringBuilder();
sb.append("[날짜수정후부과 - 명의이전 판정]\n");
sb.append("[날짜수정후부과 - 명의이전 판정 - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("검사일 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("유효기간만료일: ").append(DateUtil.formatDateString(vldPrdExpryYmd)).append("\n");
sb.append("유효기간만료일 - 90일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n");
sb.append("검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append("31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspYmd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 검사일자(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 유효기간만료일-90일 ≤ 변경일자(CHG_YMD) ≤ 검사종료일자\n");
sb.append(" · 범위: ").append(DateUtil.formatDateString(
DateUtil.parseDate(vldPrdExpryYmd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(" ~ ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n");
sb.append(" - 명의이전 시점 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n");
sb.append(" - 명의이전 시점 소유자명에 '상품용' 포함 → X\n\n");
sb.append("=== 일수 계산 ===\n");
sb.append("검사일~명의이전일 일수: ").append(daysBetween).append("일\n");
sb.append("판정근거: 검사일 기준 소유자와 명의이전 전 소유자가 동일하고, ");
sb.append("명의이전일이 검사일로부터 31일 초과함 (부과일자 수정 필요)");
return truncateToMaxLength(sb.toString());
sb.append("기준일수: 31일\n");
sb.append("조건 확인: ").append(daysBetween).append("일 > 31일 → 초과\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 검사일자 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사기간(유효기간만료일-90일 ~ 검사종료일자) 내에 존재\n");
sb.append("3. 명의이전 시점의 대표소유자 회원번호와 검사일자 기준 대표소유자 회원번호가 동일 (소유자 변동 없음)\n");
sb.append("4. 명의이전 시점 소유자명에 '상품용' 미포함\n");
sb.append("5. 명의이전일이 검사일로부터 31일 초과 (").append(daysBetween).append("일)\n");
sb.append("→ 날짜수정후부과 - 명의이전 판정 (처리상태: 05_날짜수정후부과)\n");
sb.append("※ 부과일자를 명의이전일자로 수정하여 재부과 필요\n");
return sb.toString();
}
/**
@ -248,16 +433,35 @@ public class ComparisonRemarkBuilder {
String ownerNm, String usgsrhldStdgCd,
String sggNm, String userOrgCd) {
StringBuilder sb = new StringBuilder();
sb.append("[이첩 판정 - 검사일 사용본거지]\n");
sb.append("[이첩 판정 - 검사일 사용본거지 (이첩-1) - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사일자: ").append(DateUtil.formatDateString(inspYmd)).append("\n");
sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n");
sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n");
sb.append("판정근거: DAYCNT가 115일 이하이고, ");
sb.append("검사일 기준 사용본거지법정동코드 앞 4자리가 현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임");
return truncateToMaxLength(sb.toString());
sb.append("DAYCNT: 115일 이하\n");
sb.append("부과기준일: 검사일자 (DAYCNT ≤ 115이므로)\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과기준일(검사일자)(").append(DateUtil.formatDateString(inspYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n\n");
sb.append("=== 법정동코드 비교 ===\n");
String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : "";
String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : "";
sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n");
sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n");
sb.append("코드 불일치 → 이첩 대상\n");
sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. DAYCNT ≤ 115일이므로 부과기준일 = 검사일자\n");
sb.append("2. 검사일자 기준 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n");
sb.append("→ 이첩 판정 - 검사일 사용본거지 (처리상태: 03_이첩)\n");
return sb.toString();
}
/**
@ -276,17 +480,39 @@ public class ComparisonRemarkBuilder {
String ownerNm, String usgsrhldStdgCd,
String sggNm, String userOrgCd, String daycnt) {
StringBuilder sb = new StringBuilder();
sb.append("[이첩 판정 - 115일 도래지]\n");
sb.append("[이첩 판정 - 115일 도래지 (이첩-2) - 지연]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append("DAYCNT: ").append(StringUtil.nvl(daycnt)).append("일\n");
sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n");
sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n");
sb.append("판정근거: DAYCNT가 115일 초과이고, ");
sb.append("검사종료일+115일 기준 사용본거지법정동코드 앞 4자리가 현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임");
return truncateToMaxLength(sb.toString());
sb.append("DAYCNT: ").append(StringUtil.nvl(daycnt)).append("일 (115일 초과)\n");
sb.append("부과기준일 계산: 검사종료일자 + 115일 = ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspEndYmd).plusDays(115).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과기준일(검사종료일자+115일)(").append(DateUtil.formatDateString(
DateUtil.parseDate(inspEndYmd).plusDays(115).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n\n");
sb.append("=== 법정동코드 비교 ===\n");
String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : "";
String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : "";
sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n");
sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n");
sb.append("코드 불일치 → 이첩 대상\n");
sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. DAYCNT > 115일(").append(StringUtil.nvl(daycnt)).append("일)이므로 부과기준일 = 검사종료일자 + 115일\n");
sb.append("2. 부과기준일 기준 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n");
sb.append("→ 이첩 판정 - 115일 도래지 (처리상태: 03_이첩)\n");
return sb.toString();
}
/**

@ -213,7 +213,7 @@ public class OwnerLevyOver31Checker extends AbstractComparisonChecker {
// ========== 비고 생성 ==========
String rmrk = ComparisonRemarkBuilder.buildOwnerChangeRemark(targetRecord, sggNm, ownerNm);
String rmrkDtl = ComparisonRemarkBuilder.buildOwnerLevyOver31RemarkDetail(
vhclno, inspYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween);
vhclno, inspYmd, vldPrdExpryYmd, inspEndYmd, step1OwnerName, targetChgYmd, step4OwnerName, daysBetween);
// ========== DB 업데이트 ==========
existingData.setCarBassMatterInqireId(step1Response.getGeneratedId());

@ -88,16 +88,48 @@ public class ComparisonOmRemarkBuilder {
String levyCrtrYmd, String step1OwnerNm,
String targetChgYmd, String step4OwnerNm) {
StringBuilder sb = new StringBuilder();
sb.append("[상품용 판정 - 미필]\n");
sb.append("[상품용 판정 - 미필]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n");
sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("판정근거: 부과일자 기준 소유자명에 '상품용' 포함되어 있고, ");
sb.append("갑부 상세에서 변경업무구분코드 '21'(변경등록) 레코드 확인됨");
return truncateToMaxLength(sb.toString());
sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → O\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) ≤ 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 변경일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 갑부 변경일자(").append(DateUtil.formatDateString(targetChgYmd)).append(")\n");
sb.append(" - 변경일 기준 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step4 대표소유자 회원번호 → 일치\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이내에 존재\n");
sb.append("3. 갑부 변경일자 시점의 대표소유자 회원번호와 부과일자 기준 대표소유자 회원번호가 동일\n");
sb.append("→ 상품용 판정 (처리상태: 02_상품용)\n");
return sb.toString();
}
/**
@ -115,16 +147,50 @@ public class ComparisonOmRemarkBuilder {
String levyCrtrYmd, String step1OwnerNm,
String targetChgYmd, String step4OwnerNm) {
StringBuilder sb = new StringBuilder();
sb.append("[명의이전 이전소유자 상품용 판정 - 미필]\n");
sb.append("[명의이전 이전소유자 상품용 판정 - 미필]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n");
sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("판정근거: 부과일자 기준 소유자명에 '상품용' 미포함이나, ");
sb.append("갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드의 이전 소유자가 '상품용'임");
return truncateToMaxLength(sb.toString());
sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) > 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString(
DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: 명의이전 전 소유자명에 '상품용' 포함 → O\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이후에 존재\n");
sb.append("3. 명의이전일자-1일 시점의 소유자명에 '상품용' 포함\n");
sb.append("→ 명의이전 이전소유자 상품용 판정 (처리상태: 01_접수)\n");
return sb.toString();
}
/**
@ -142,16 +208,52 @@ public class ComparisonOmRemarkBuilder {
String levyCrtrYmd, String step1OwnerNm,
String targetChgYmd, String step4OwnerNm) {
StringBuilder sb = new StringBuilder();
sb.append("[미수검명의이전 판정 - 미필]\n");
sb.append("[미수검명의이전 판정 - 미필]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n");
sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("부과일자 기준 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append("갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n");
sb.append("명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append("판정근거: 부과일자 기준 소유자와 명의이전 전 소유자가 동일하고, ");
sb.append("명의이전이 검사유효기간 종료일 이후에 발생함 (미수검 상태에서 명의이전)");
return truncateToMaxLength(sb.toString());
sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("검사유효기간 종료일 + 31일 기준일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(step1OwnerNm)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 목적: 차량번호, 성명, 주민번호, 법정동코드 조회\n\n");
sb.append("Step3) 자동차등록원부(갑) 조회\n");
sb.append(" - 조회 기준: 차량번호 + 성명 + 주민번호 + 법정동코드\n");
sb.append(" - 검색 조건:\n");
sb.append(" · 변경업무구분코드(CHG_TASK_SE_CD) = '11' (명의이전)\n");
sb.append(" · 변경일자(CHG_YMD) > 검사유효기간 종료일+31일 (").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).plusDays(31).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" · 조건 충족하는 레코드 중 가장 마지막 일자 선택\n");
sb.append(" - 선택된 갑부 명의이전 일자: ").append(DateUtil.formatDateString(targetChgYmd)).append("\n\n");
sb.append("Step4) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 명의이전일자-1일(").append(DateUtil.formatDateString(
DateUtil.parseDate(targetChgYmd).minusDays(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 명의이전 전 소유자명: ").append(StringUtil.nvl(step4OwnerNm)).append("\n");
sb.append(" - 조건 확인: 부과일자 기준 소유자 = 명의이전 전 소유자 → 동일\n");
sb.append(" - 명의이전 전 소유자명에 '상품용' 포함 → X\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 갑부 상세에서 변경업무구분코드 '11'(명의이전) 레코드가 검사유효기간 종료일+31일 이후에 존재\n");
sb.append("3. 명의이전 전 소유자명과 부과일자 기준 소유자명이 동일 (미수검 상태에서 명의이전 발생)\n");
sb.append("4. 명의이전 전 소유자명에 '상품용' 미포함\n");
sb.append("→ 미수검명의이전 판정 (처리상태: 01_접수)\n");
return sb.toString();
}
/**
@ -170,17 +272,49 @@ public class ComparisonOmRemarkBuilder {
String levyCrtrYmd, String ownerNm,
String usgsrhldStdgCd, String sggNm, String userOrgCd) {
StringBuilder sb = new StringBuilder();
sb.append("[이첩 판정 - 미필]\n");
sb.append("[이첩 판정 - 미필]\n\n");
sb.append("=== 기본 정보 ===\n");
sb.append("차량번호: ").append(StringUtil.nvl(vhclno)).append("\n");
sb.append("검사유효기간 종료일: ").append(DateUtil.formatDateString(inspVldPrdEnd)).append("\n");
sb.append("부과기준일자(+146일): ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append("사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n");
sb.append("현재 사용자 조직코드: ").append(StringUtil.nvl(userOrgCd)).append("\n");
sb.append("판정근거: 부과기준일자 기준 사용본거지법정동코드 앞 4자리가 ");
sb.append("현재 사용자 조직코드 앞 4자리와 불일치하여 이첩 대상임");
return truncateToMaxLength(sb.toString());
sb.append("부과기준일자 계산: 검사유효기간 종료일 + 146일 = ").append(DateUtil.formatDateString(levyCrtrYmd)).append("\n");
sb.append("검사유효기간 종료일 - 90일: ").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append("\n\n");
sb.append("=== API 호출 및 비교 과정 ===\n");
sb.append("Step1) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차량번호 + 부과일자(").append(DateUtil.formatDateString(levyCrtrYmd)).append(")\n");
sb.append(" - 소유자명: ").append(StringUtil.nvl(ownerNm)).append("\n");
sb.append(" - 사용본거지법정동코드: ").append(StringUtil.nvl(usgsrhldStdgCd)).append("\n");
sb.append(" - 조건 확인: 소유자명에 '상품용' 포함 여부 → X\n\n");
sb.append("Step2) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 검사유효기간 종료일-90일(").append(DateUtil.formatDateString(
DateUtil.parseDate(inspVldPrdEnd).minusDays(90).format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"))
)).append(")\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step2 대표소유자 회원번호 → 동일\n\n");
sb.append("Step3) 자동차기본정보 조회\n");
sb.append(" - 조회 기준: 차대번호 + 오늘일자\n");
sb.append(" - 조건 확인: Step1 대표소유자 회원번호 = Step3 대표소유자 회원번호 → 동일\n\n");
sb.append("=== 법정동코드 비교 ===\n");
String legalDong4 = usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 4 ? usgsrhldStdgCd.substring(0, 4) : "";
String userOrg4 = userOrgCd != null && userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : "";
sb.append("사용본거지법정동코드 앞 4자리: ").append(legalDong4).append("\n");
sb.append("현재 사용자 조직코드 앞 4자리: ").append(userOrg4).append("\n");
sb.append("코드 불일치 → 이첩 대상\n");
sb.append("시군구코드: ").append(usgsrhldStdgCd != null && usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : "").append("\n");
sb.append("시군구명: ").append(StringUtil.nvl(sggNm)).append("\n\n");
sb.append("=== 판정 근거 ===\n");
sb.append("1. 부과일자(검사유효기간 종료일+146일) 기준 소유자명에 '상품용' 미포함\n");
sb.append("2. 부과일자/검사유효기간 종료일-90일/오늘일자 세 시점의 대표소유자 회원번호 모두 동일 (소유자 변동 없음)\n");
sb.append("3. 사용본거지법정동코드 앞 4자리와 현재 사용자 조직코드 앞 4자리가 불일치\n");
sb.append("→ 이첩 판정 (처리상태: 03_이첩, 115일 도래지)\n");
return sb.toString();
}
/**

Loading…
Cancel
Save