|
|
|
|
@ -19,10 +19,20 @@ import org.springframework.stereotype.Component;
|
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 7. 이첩 검증 (미필)
|
|
|
|
|
* 2. 이첩 검증 api-1번호출.!소유자명.contains("상품용")
|
|
|
|
|
*
|
|
|
|
|
* <p>DAYCNT 기반 부과기준일 계산 및 법정동코드 비교</p>
|
|
|
|
|
* <p>미필의 경우 부과일자 = 검사유효기간 종료일 + 146일</p>
|
|
|
|
|
* API 호출 3단계:
|
|
|
|
|
* 1) 자동차기본정보(차량번호, 부과일자=검사유효기간 + 146일) → 소유자명
|
|
|
|
|
* 2) 자동차기본정보(차량번호, 부과일자=검사유효기간 - 90일) → 소유자명
|
|
|
|
|
* 3) 자동차기본정보(차량번호, 부과일자=오늘) → 소유자명
|
|
|
|
|
*
|
|
|
|
|
* 비교조건:
|
|
|
|
|
* - 1단계: 소유자, 사용본거지법정동코드
|
|
|
|
|
* - 2단계: 1단계 소유자 = 2단계 소유자 동일
|
|
|
|
|
* - 3단계: 1단계 소유자 = 3단계 소유자 동일
|
|
|
|
|
*
|
|
|
|
|
* 법정동코드 비교:
|
|
|
|
|
* - 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Component
|
|
|
|
|
@ -40,21 +50,6 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
|
|
|
|
|
String vhclno = existingData.getVhclno();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// TODO : DAYCNT 는 어떻게 가져옴?
|
|
|
|
|
// DAYCNT 가져오기
|
|
|
|
|
//String daycntStr = existingData.getDaycnt();
|
|
|
|
|
String daycntStr = "111";
|
|
|
|
|
if (daycntStr == null || daycntStr.isEmpty()) {
|
|
|
|
|
log.debug("[이첩-미필] DAYCNT 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int daycnt = Integer.parseInt(daycntStr);
|
|
|
|
|
log.info("[이첩-미필] DAYCNT: {} - 차량번호: {}", daycnt, vhclno);
|
|
|
|
|
|
|
|
|
|
// 부과기준일 계산
|
|
|
|
|
String levyCrtrYmd;
|
|
|
|
|
String transferType;
|
|
|
|
|
String inspVldPrd = existingData.getInspVldPrd();
|
|
|
|
|
|
|
|
|
|
// 검사유효기간에서 종료일 추출
|
|
|
|
|
@ -64,97 +59,143 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
|
|
|
|
|
inspVldPrdEnd = dates.length > 1 ? dates[1].trim().replace("-", "") : null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (daycnt > 115) {
|
|
|
|
|
// 이첩-2: 부과기준일 = 검사유효기간 종료일 + 115일
|
|
|
|
|
LocalDate inspVldPrdEndDate = DateUtil.parseDate(inspVldPrdEnd);
|
|
|
|
|
LocalDate levyCrtrDate = inspVldPrdEndDate.plusDays(115);
|
|
|
|
|
levyCrtrYmd = levyCrtrDate.format(DATE_FORMATTER);
|
|
|
|
|
transferType = "이첩-2";
|
|
|
|
|
log.info("[이첩-2-미필] 부과기준일 = 검사유효기간 종료일({}) + 115일 = {}", inspVldPrdEnd, levyCrtrYmd);
|
|
|
|
|
} else {
|
|
|
|
|
// 이첩-1: 부과기준일 = 부과일자 (검사유효기간 종료일 + 146일)
|
|
|
|
|
levyCrtrYmd = existingData.getLevyCrtrYmd();
|
|
|
|
|
transferType = "이첩-1";
|
|
|
|
|
log.info("[이첩-1-미필] 부과기준일 = 부과일자 = {}", levyCrtrYmd);
|
|
|
|
|
if (inspVldPrdEnd == null) {
|
|
|
|
|
log.debug("[이첩-미필] 검사유효기간 종료일 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 1단계: 자동차기본정보(차량번호, 부과일자=검사유효기간 + 146일)
|
|
|
|
|
// 부과일자는 이미 146일로 계산되어 있음
|
|
|
|
|
String step1Ymd = existingData.getLevyCrtrYmd();
|
|
|
|
|
|
|
|
|
|
log.info("[이첩-미필] 1단계 API 호출 - 차량번호: {}, 부과일자: {}", vhclno, step1Ymd);
|
|
|
|
|
NewBasicRequest step1Request = createBasicRequest(vhclno, null, step1Ymd);
|
|
|
|
|
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
|
|
|
|
|
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtIncmpId());
|
|
|
|
|
|
|
|
|
|
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
|
|
|
|
|
log.warn("[이첩-미필] 1단계 응답 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NewBasicResponse.Record step1Record = step1Response.getRecord().get(0);
|
|
|
|
|
String step1RprsOwnrNm = step1Record.getRprsOwnrNm(); // 검사일 기준 소유자명
|
|
|
|
|
String step1RprsvOwnrIdecno = step1Record.getRprsvOwnrIdecno(); // 검사일 기준 소유자 회원번호
|
|
|
|
|
String step1UsgsrhldStdgCd = step1Record.getUsgsrhldStdgCd(); // 1단계 사용본거지법정동코드
|
|
|
|
|
|
|
|
|
|
// 소유자명에 "상품용" 포함 여부 체크
|
|
|
|
|
if (step1RprsOwnrNm != null && step1RprsOwnrNm.contains("상품용")) {
|
|
|
|
|
log.debug("[이첩-미필] 소유자명에 '상품용' 포함 - 차량번호: {}, 소유자명: {}", vhclno, step1RprsOwnrNm);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("[이첩-미필] 1단계 - 소유자명: {}, 법정동코드: {}", step1RprsOwnrNm, step1UsgsrhldStdgCd);
|
|
|
|
|
|
|
|
|
|
// 2단계: 자동차기본정보(차량번호, 부과일자=검사유효기간 - 90일)
|
|
|
|
|
LocalDate inspVldPrdEndDate = DateUtil.parseDate(inspVldPrdEnd);
|
|
|
|
|
LocalDate step2Date = inspVldPrdEndDate.minusDays(90);
|
|
|
|
|
String step2Ymd = step2Date.format(DATE_FORMATTER);
|
|
|
|
|
|
|
|
|
|
log.info("[이첩-미필] 2단계 API 호출 - 차량번호: {}, 부과일자: {}", vhclno, step2Ymd);
|
|
|
|
|
NewBasicRequest step2Request = createBasicRequest(vhclno, null, step2Ymd);
|
|
|
|
|
NewBasicResponse step2Response = apiService.getBasicInfo(step2Request);
|
|
|
|
|
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step2Response, existingData.getCarFfnlgTrgtIncmpId());
|
|
|
|
|
|
|
|
|
|
if (step2Response == null || step2Response.getRecord() == null || step2Response.getRecord().isEmpty()) {
|
|
|
|
|
log.warn("[이첩-미필] 2단계 응답 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 자동차기본정보 API 호출 (부과기준일 기준)
|
|
|
|
|
log.info("[{}-미필] 자동차기본정보 조회 - 차량번호: {}, 부과기준일: {}", transferType, vhclno, levyCrtrYmd);
|
|
|
|
|
NewBasicResponse.Record step2Record = step2Response.getRecord().get(0);
|
|
|
|
|
String step2RprsOwnrNm = step2Record.getRprsOwnrNm(); // 2단계 소유자명
|
|
|
|
|
String step2RprsvOwnrIdecno = step2Record.getRprsvOwnrIdecno(); // 2단계 소유자 회원번호
|
|
|
|
|
|
|
|
|
|
NewBasicRequest request = createBasicRequest(vhclno, null, levyCrtrYmd);
|
|
|
|
|
NewBasicResponse response = apiService.getBasicInfo(request);
|
|
|
|
|
log.info("[이첩-미필] 2단계 - 소유자명: {}", step2RprsOwnrNm);
|
|
|
|
|
|
|
|
|
|
// API 응답에 CAR_FFNLG_TRGT_INCMP_ID 업데이트
|
|
|
|
|
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(response, existingData.getCarFfnlgTrgtIncmpId());
|
|
|
|
|
// 2단계 비교: 1단계 소유자 = 2단계 소유자 동일 체크
|
|
|
|
|
if (step1RprsvOwnrIdecno != null && step1RprsvOwnrIdecno.equals(step2RprsvOwnrIdecno)) {
|
|
|
|
|
log.debug("[이첩-미필] 1단계와 2단계 소유자 동일 - 차량번호: {}, 소유자: {}", vhclno, step1RprsOwnrNm);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3단계: 자동차기본정보(차량번호, 부과일자=오늘)
|
|
|
|
|
String step3Ymd = LocalDate.now().format(DATE_FORMATTER);
|
|
|
|
|
|
|
|
|
|
if (response == null || response.getRecord() == null || response.getRecord().isEmpty()) {
|
|
|
|
|
log.warn("[{}-미필] 응답 없음 - 차량번호: {}", transferType, vhclno);
|
|
|
|
|
log.info("[이첩-미필] 3단계 API 호출 - 차량번호: {}, 부과일자: {}", vhclno, step3Ymd);
|
|
|
|
|
NewBasicRequest step3Request = createBasicRequest(vhclno, null, step3Ymd);
|
|
|
|
|
NewBasicResponse step3Response = apiService.getBasicInfo(step3Request);
|
|
|
|
|
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step3Response, existingData.getCarFfnlgTrgtIncmpId());
|
|
|
|
|
|
|
|
|
|
if (step3Response == null || step3Response.getRecord() == null || step3Response.getRecord().isEmpty()) {
|
|
|
|
|
log.warn("[이첩-미필] 3단계 응답 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NewBasicResponse.Record record = response.getRecord().get(0);
|
|
|
|
|
String usgsrhldStdgCd = record.getUsgsrhldStdgCd(); // 사용본거지법정동코드
|
|
|
|
|
NewBasicResponse.Record step3Record = step3Response.getRecord().get(0);
|
|
|
|
|
String step3RprsOwnrNm = step3Record.getRprsOwnrNm(); // 3단계 소유자명
|
|
|
|
|
String step3RprsvOwnrIdecno = step3Record.getRprsvOwnrIdecno(); // 3단계 소유자 회원번호
|
|
|
|
|
|
|
|
|
|
log.info("[{}-미필] API 응답 - 사용본거지법정동코드: {}", transferType, usgsrhldStdgCd);
|
|
|
|
|
log.info("[이첩-미필] 3단계 - 소유자명: {}", step3RprsOwnrNm);
|
|
|
|
|
|
|
|
|
|
// 3단계 비교: 1단계 소유자 = 3단계 소유자 동일 체크
|
|
|
|
|
if (step1RprsvOwnrIdecno != null && step1RprsvOwnrIdecno.equals(step3RprsvOwnrIdecno)) {
|
|
|
|
|
log.debug("[이첩-미필] 1단계와 3단계 소유자 동일 - 차량번호: {}, 소유자: {}", vhclno, step1RprsOwnrNm);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 법정동코드 유효성 검사
|
|
|
|
|
if (usgsrhldStdgCd == null || usgsrhldStdgCd.length() < 4) {
|
|
|
|
|
log.debug("[{}-미필] 법정동코드 없음 - 차량번호: {}", transferType, vhclno);
|
|
|
|
|
if (step1UsgsrhldStdgCd == null || step1UsgsrhldStdgCd.length() < 4) {
|
|
|
|
|
log.debug("[이첩-미필] 법정동코드 없음 - 차량번호: {}", vhclno);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 세션에서 사용자 정보 조회
|
|
|
|
|
LoginUserVO userInfo = SessionUtil.getLoginUser();
|
|
|
|
|
if (userInfo == null || userInfo.getOrgCd() == null) {
|
|
|
|
|
log.debug("[{}-미필] 사용자 정보 없음", transferType);
|
|
|
|
|
log.debug("[이첩-미필] 사용자 정보 없음");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 법정동코드 앞 4자리 vs 사용자 조직코드 앞 4자리 비교
|
|
|
|
|
String legalDong4 = usgsrhldStdgCd.substring(0, 4);
|
|
|
|
|
String legalDong4 = step1UsgsrhldStdgCd.substring(0, 4);
|
|
|
|
|
String userOrgCd = userInfo.getOrgCd();
|
|
|
|
|
String userOrg4 = userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : userOrgCd;
|
|
|
|
|
|
|
|
|
|
if (legalDong4.equals(userOrg4)) {
|
|
|
|
|
log.debug("[{}-미필] 법정동코드 일치 - 차량번호: {}, 법정동: {}, 조직: {}",
|
|
|
|
|
transferType, vhclno, legalDong4, userOrg4);
|
|
|
|
|
log.debug("[이첩-미필] 법정동코드 일치 - 차량번호: {}, 법정동: {}, 조직: {}",
|
|
|
|
|
vhclno, legalDong4, userOrg4);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("[{}-미필] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
|
|
|
|
|
transferType, vhclno, legalDong4, userOrg4);
|
|
|
|
|
log.info("[이첩-미필] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
|
|
|
|
|
vhclno, legalDong4, userOrg4);
|
|
|
|
|
|
|
|
|
|
// 시군구 코드 및 시군구명 조회
|
|
|
|
|
String sggCd = usgsrhldStdgCd.length() >= 5 ? usgsrhldStdgCd.substring(0, 5) : usgsrhldStdgCd;
|
|
|
|
|
String sggCd = step1UsgsrhldStdgCd.length() >= 5 ? step1UsgsrhldStdgCd.substring(0, 5) : step1UsgsrhldStdgCd;
|
|
|
|
|
String sggNm = carFfnlgTrgtIncmpMapper.selectSggNmBySggCd(sggCd);
|
|
|
|
|
if (sggNm == null || sggNm.isEmpty()) {
|
|
|
|
|
log.warn("[{}-미필] 시군구명 조회 실패 - 시군구코드: {}", transferType, sggCd);
|
|
|
|
|
log.warn("[이첩-미필] 시군구명 조회 실패 - 시군구코드: {}", sggCd);
|
|
|
|
|
sggNm = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 비고 생성
|
|
|
|
|
String rmrk;
|
|
|
|
|
if ("이첩-1".equals(transferType)) { // 5번
|
|
|
|
|
rmrk = ComparisonOmRemarkBuilder.buildTransferCase1Remark(sggNm, userOrg4);
|
|
|
|
|
} else { // 7번
|
|
|
|
|
rmrk = ComparisonOmRemarkBuilder.buildTransferCase2Remark(sggNm, legalDong4);
|
|
|
|
|
}
|
|
|
|
|
// 비고 생성 (이첩-2 케이스)
|
|
|
|
|
String rmrk = ComparisonOmRemarkBuilder.buildTransferCase2Remark(sggNm, legalDong4);
|
|
|
|
|
|
|
|
|
|
// DB 업데이트
|
|
|
|
|
existingData.setCarBassMatterInqireId(response.getGeneratedId());
|
|
|
|
|
existingData.setCarBassMatterInqireId(step1Response.getGeneratedId());
|
|
|
|
|
existingData.setTaskPrcsSttsCd(TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_03_TRANSFER);
|
|
|
|
|
existingData.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER));
|
|
|
|
|
existingData.setCarBscMttrInqFlnm(existingData.getOwnrNm());
|
|
|
|
|
existingData.setCarBscMttrInqFlnm(step1RprsOwnrNm);
|
|
|
|
|
existingData.setCarBscMttrInqSggCd(sggCd);
|
|
|
|
|
existingData.setCarBscMttrInqSggNm(sggNm);
|
|
|
|
|
existingData.setRmrk(rmrk);
|
|
|
|
|
|
|
|
|
|
int updateCount = carFfnlgTrgtIncmpMapper.update(existingData);
|
|
|
|
|
if (updateCount == 0) {
|
|
|
|
|
throw new MessageException(String.format("[%s-미필] 업데이트 실패: %s", transferType, vhclno));
|
|
|
|
|
throw new MessageException(String.format("[이첩-미필] 업데이트 실패: %s", vhclno));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("[{}-미필] 처리 완료! 차량번호: {}, 시군구: {}({})", transferType, vhclno, sggNm, sggCd);
|
|
|
|
|
log.info("[이첩-미필] 처리 완료! 차량번호: {}, 시군구: {}({})", vhclno, sggNm, sggCd);
|
|
|
|
|
return TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_03_TRANSFER;
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|