From e8e362f4c062018ded58a6778397de34029eec0f 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 11:22:21 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AF=B8=ED=95=84=20:=20=EC=9D=B4=EC=B2=A9=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4-2=20=EB=B2=88=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/om_checker/TransferOmChecker.java | 165 +++++++++++------- 1 file changed, 103 insertions(+), 62 deletions(-) diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/TransferOmChecker.java b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/TransferOmChecker.java index bc7fb13..3abaa61 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/TransferOmChecker.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registrationOm/service/impl/om_checker/TransferOmChecker.java @@ -19,10 +19,20 @@ import org.springframework.stereotype.Component; import java.time.LocalDate; /** - * 7. 이첩 검증 (미필) + * 2. 이첩 검증 api-1번호출.!소유자명.contains("상품용") * - *

DAYCNT 기반 부과기준일 계산 및 법정동코드 비교

- *

미필의 경우 부과일자 = 검사유효기간 종료일 + 146일

+ * 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) {