diff --git a/src/main/java/go/kr/project/api/model/response/BasicResponse.java b/src/main/java/go/kr/project/api/model/response/BasicResponse.java index 9b0fb84..1e0b665 100644 --- a/src/main/java/go/kr/project/api/model/response/BasicResponse.java +++ b/src/main/java/go/kr/project/api/model/response/BasicResponse.java @@ -16,12 +16,15 @@ import java.util.List; @Setter public class BasicResponse { + /** 연계결과코드 */ @JsonProperty("CNTC_RESULT_CODE") private String cntcResultCode; + /** 연계결과상세 */ @JsonProperty("CNTC_RESULT_DTLS") private String cntcResultDtls; + /** 레코드 목록 */ @JsonProperty("record") private List record; @@ -32,89 +35,173 @@ public class BasicResponse { @Getter @Setter public static class Record { + /** 생산년도 */ @JsonProperty("PRYE") private String prye; + /** 등록일자 */ @JsonProperty("REGIST_DE") private String registDe; + /** 말소등록구분코드 */ @JsonProperty("ERSR_REGIST_SE_CODE") private String ersrRegistSeCode; + /** 말소등록구분명 */ @JsonProperty("ERSR_REGIST_SE_NM") private String ersrRegistSeNm; + /** 말소등록일자 */ @JsonProperty("ERSR_REGIST_DE") private String ersrRegistDe; + /** 등록상세코드 */ @JsonProperty("REGIST_DETAIL_CODE") private String registDetailCode; + /** 배기량 */ @JsonProperty("DSPLVL") private String dsplvl; + /** 사용본거지법정동코드 */ @JsonProperty("USE_STRNGHLD_LEGALDONG_CODE") private String useStrnghldLegaldongCode; + /** 사용본거지행정동코드 */ @JsonProperty("USE_STRNGHLD_ADSTRD_CODE") private String useStrnghldAdstrdCode; + /** 사용본거지산 */ @JsonProperty("USE_STRNGHLD_MNTN") private String useStrnghldMntn; + /** 사용본거지번지 */ @JsonProperty("USE_STRNGHLD_LNBR") private String useStrnghldLnbr; + /** 사용본거지호 */ @JsonProperty("USE_STRNGHLD_HO") private String useStrnghldHo; + /** 사용본거지주소명 */ @JsonProperty("USE_STRNGHLD_ADRES_NM") private String useStrnghldAdresNm; + /** 사용본거지도로명코드 */ @JsonProperty("USE_STRNGHLD_ROAD_NM_CODE") private String useStrnghldRoadNmCode; + /** 사용본거지지하건물구분코드 */ @JsonProperty("USGSRHLD_UNDGRND_BULD_SE_CODE") private String usgsrhldUndgrndBuldSeCode; + /** 사용본거지건물본번 */ @JsonProperty("USE_STRNGHLD_BULD_MAIN_NO") private String useStrnghldBuldMainNo; + /** 사용본거지건물부번 */ @JsonProperty("USE_STRNGHLD_BULD_SUB_NO") private String useStrnghldBuldSubNo; + /** 사용본거지주소전체 */ @JsonProperty("USGSRHLD_ADRES_FULL") private String usgsrhldAdresFull; + /** 소유자구분코드 */ @JsonProperty("MBER_SE_CODE") private String mberSeCode; + /** 소유자명 */ @JsonProperty("MBER_NM") private String mberNm; + /** 소유자구분번호 */ @JsonProperty("MBER_SE_NO") private String mberSeNo; + /** 전화번호 */ @JsonProperty("TELNO") private String telno; + /** 소유자법정동코드 */ @JsonProperty("OWNER_LEGALDONG_CODE") private String ownerLegaldongCode; + /** 소유자행정동코드 */ @JsonProperty("OWNER_ADSTRD_CODE") private String ownerAdstrdCode; + /** 소유자산 */ @JsonProperty("OWNER_MNTN") private String ownerMntn; + /** 소유자번지 */ @JsonProperty("OWNER_LNBR") private String ownerLnbr; + /** 소유자호 */ @JsonProperty("OWNER_HO") private String ownerHo; + /** 소유자주소명 */ @JsonProperty("OWNER_ADRES_NM") private String ownerAdresNm; + /** 소유자도로명코드 */ @JsonProperty("OWNER_ROAD_NM_CODE") private String ownerRoadNmCode; + /** 소유자지하건물구분코드 */ @JsonProperty("OWNER_UNDGRND_BULD_SE_CODE") private String ownerUndgrndBuldSeCode; + /** 소유자건물본번 */ @JsonProperty("OWNER_BULD_MAIN_NO") private String ownerBuldMainNo; + /** 소유자건물부번 */ @JsonProperty("OWNER_BULD_SUB_NO") private String ownerBuldSubNo; + /** 소유자주소전체 */ @JsonProperty("OWNER_ADRES_FULL") private String ownerAdresFull; + /** 변경후차량번호 */ @JsonProperty("AFTR_VHRNO") private String aftrVhrno; + /** 사용연료코드 */ @JsonProperty("USE_FUEL_CODE") private String useFuelCode; + /** 용도구분코드 */ @JsonProperty("PRPOS_SE_CODE") private String prposSeCode; + /** 제작사명 */ @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; + /** 변경전차량번호 */ @JsonProperty("FRNT_VHRNO") private String frntVhrno; + /** 차량번호 */ @JsonProperty("VHRNO") private String vhrno; + /** 차대번호 */ @JsonProperty("VIN") private String vin; + /** 차명 */ @JsonProperty("CNM") private String cnm; + /** 차량총중량 */ @JsonProperty("VHCLE_TOT_WT") private String vhcleTotWt; + /** 자동차보험종료일자 */ @JsonProperty("CAAG_ENDDE") private String caagEndde; + /** 변경일자 */ @JsonProperty("CHANGE_DE") private String changeDe; + /** 차종분류코드 */ @JsonProperty("VHCTY_ASORT_CODE") private String vhctyAsortCode; + /** 차종유형코드 */ @JsonProperty("VHCTY_TY_CODE") private String vhctyTyCode; + /** 차종구분코드 */ @JsonProperty("VHCTY_SE_CODE") private String vhctySeCode; + /** 최대적재량 */ @JsonProperty("MXMM_LDG") private String mxmmLdg; + /** 차종분류명 */ @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; + /** 차종유형명 */ @JsonProperty("VHCTY_TY_NM") private String vhctyTyNm; + /** 차종구분명 */ @JsonProperty("VHCTY_SE_NM") private String vhctySeNm; + /** 최초등록일자 */ @JsonProperty("FRST_REGIST_DE") private String frstRegistDe; + /** 형식명 */ @JsonProperty("FOM_NM") private String fomNm; + /** 취득일자 */ @JsonProperty("ACQS_DE") private String acqsDe; + /** 취득종료일자 */ @JsonProperty("ACQS_END_DE") private String acqsEndDe; + /** 연식월 */ @JsonProperty("YBL_MD") private String yblMd; + /** 이전등록일자 */ @JsonProperty("TRANSR_REGIST_DE") private String transrRegistDe; + /** 특정등록상태코드 */ @JsonProperty("SPCF_REGIST_STTUS_CODE") private String spcfRegistSttusCode; + /** 색상명 */ @JsonProperty("COLOR_NM") private String colorNm; + /** 저당건수 */ @JsonProperty("MRTG_CO") private String mrtgCo; + /** 압류건수 */ @JsonProperty("SEIZR_CO") private String seizrCo; + /** 압인건수 */ @JsonProperty("STMD_CO") private String stmdCo; + /** 번호판보관여부 */ @JsonProperty("NMPL_CSDY_AT") private String nmplCsdyAt; + /** 번호판보관반납일자 */ @JsonProperty("NMPL_CSDY_REMNR_DE") private String nmplCsdyRemnrDe; + /** 원산지구분코드 */ @JsonProperty("ORIGIN_SE_CODE") private String originSeCode; + /** 번호판규격코드 */ @JsonProperty("NMPL_STNDRD_CODE") private String nmplStndrdCode; + /** 취득금액 */ @JsonProperty("ACQS_AMOUNT") private String acqsAmount; + /** 검사유효기간시작일자 */ @JsonProperty("INSPT_VALID_PD_BGNDE") private String insptValidPdBgnde; + /** 검사유효기간종료일자 */ @JsonProperty("INSPT_VALID_PD_ENDDE") private String insptValidPdEndde; + /** 사용본거지우편번호코드 */ @JsonProperty("USE_STRNGHLD_GRC_CODE") private String useStrnghldGrcCode; + /** 화물차승차정원수 */ @JsonProperty("TKCAR_PSCAP_CO") private String tkcarPscapCo; + /** 사양번호 */ @JsonProperty("SPMNNO") private String spmnno; + /** 주행거리 */ @JsonProperty("TRVL_DSTNC") private String trvlDstnc; + /** 최초등록신청번호 */ @JsonProperty("FRST_REGIST_RQRCNO") private String frstRegistRqrcno; + /** 자진말소예방공지일자 */ @JsonProperty("VLNT_ERSR_PRVNTC_NTICE_DE") private String vlntErsrPrvntcNticeDe; + /** 등록기관명 */ @JsonProperty("REGIST_INSTT_NM") private String registInsttNm; + /** 처리불가사유코드 */ @JsonProperty("PROCESS_IMPRTY_RESN_CODE") private String processImprtyResnCode; + /** 처리불가사유상세 */ @JsonProperty("PROCESS_IMPRTY_RESN_DTLS") private String processImprtyResnDtls; + /** 차체길이 */ @JsonProperty("CBD_LT") private String cbdLt; + /** 차체너비 */ @JsonProperty("CBD_BT") private String cbdBt; + /** 차체높이 */ @JsonProperty("CBD_HG") private String cbdHg; + /** 최초최대적재량 */ @JsonProperty("FRST_MXMM_LDG") private String frstMxmmLdg; + /** 연료소비율 */ @JsonProperty("FUEL_CNSMP_RT") private String fuelCnsmpRt; + /** 전기복합연료소비율 */ @JsonProperty("ELCTY_CMPND_FUEL_CNSMP_RT") private String elctyCmpndFuelCnsmpRt; } diff --git a/src/main/java/go/kr/project/api/model/response/LedgerResponse.java b/src/main/java/go/kr/project/api/model/response/LedgerResponse.java index 95c473e..97b1073 100644 --- a/src/main/java/go/kr/project/api/model/response/LedgerResponse.java +++ b/src/main/java/go/kr/project/api/model/response/LedgerResponse.java @@ -16,186 +16,247 @@ import java.util.List; @Setter public class LedgerResponse { + /** 연계결과코드 */ @JsonProperty("CNTC_RESULT_CODE") private String cntcResultCode; + /** 연계결과상세 */ @JsonProperty("CNTC_RESULT_DTLS") private String cntcResultDtls; + /** 원부그룹번호 */ @JsonProperty("LEDGER_GROUP_NO") private String ledgerGroupNo; + /** 원부개별화번호 */ @JsonProperty("LEDGER_INDVDLZ_NO") private String ledgerIndvdlzNo; + /** 차량관리번호 */ @JsonProperty("VHMNO") private String vhmno; + /** 차량번호 */ @JsonProperty("VHRNO") private String vhrno; + /** 차대번호 */ @JsonProperty("VIN") private String vin; + /** 차종분류코드 */ @JsonProperty("VHCTY_ASORT_CODE") private String vhctyAsortCode; + /** 차종분류명 */ @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; + /** 차명 */ @JsonProperty("CNM") private String cnm; + /** 색상코드 */ @JsonProperty("COLOR_CODE") private String colorCode; + /** 색상명 */ @JsonProperty("COLOR_NM") private String colorNm; + /** 번호판규격코드 */ @JsonProperty("NMPL_STNDRD_CODE") private String nmplStndrdCode; + /** 번호판규격명 */ @JsonProperty("NMPL_STNDRD_NM") private String nmplStndrdNm; + /** 용도구분코드 */ @JsonProperty("PRPOS_SE_CODE") private String prposSeCode; + /** 용도구분명 */ @JsonProperty("PRPOS_SE_NM") private String prposSeNm; + /** 제작사명 */ @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; + /** 형식명 */ @JsonProperty("FOM_NM") private String fomNm; + /** 취득금액 */ @JsonProperty("ACQS_AMOUNT") private String acqsAmount; + /** 등록상세코드 */ @JsonProperty("REGIST_DETAIL_CODE") private String registDetailCode; + /** 등록상세명 */ @JsonProperty("REGIST_DETAIL_NM") private String registDetailNm; + /** 최초등록일자 */ @JsonProperty("FRST_REGIST_DE") private String frstRegistDe; + /** 자동차보험종료일자 */ @JsonProperty("CAAG_ENDDE") private String caagEndde; + /** 생산년도 */ @JsonProperty("PRYE") private String prye; + /** 사양번호1 */ @JsonProperty("SPMNNO1") private String spmnno1; + /** 사양번호2 */ @JsonProperty("SPMNNO2") private String spmnno2; + /** 연식월 */ @JsonProperty("YBL_MD") private String yblMd; + /** 주행거리 */ @JsonProperty("TRVL_DSTNC") private String trvlDstnc; + /** 검사유효기간시작일자 */ @JsonProperty("INSPT_VALID_PD_BGNDE") private String insptValidPdBgnde; + /** 검사유효기간종료일자 */ @JsonProperty("INSPT_VALID_PD_ENDDE") private String insptValidPdEndde; + /** 점검유효기간시작일자 */ @JsonProperty("CHCK_VALID_PD_BGNDE") private String chckValidPdBgnde; + /** 점검유효기간종료일자 */ @JsonProperty("CHCK_VALID_PD_ENDDE") private String chckValidPdEndde; + /** 등록신청구분명 */ @JsonProperty("REGIST_REQST_SE_NM") private String registReqstSeNm; + /** 최초등록신청번호 */ @JsonProperty("FRST_REGIST_RQRCNO") private String frstRegistRqrcno; + /** 번호판보관반납일자 */ @JsonProperty("NMPL_CSDY_REMNR_DE") private String nmplCsdyRemnrDe; + /** 번호판보관여부 */ @JsonProperty("NMPL_CSDY_AT") private String nmplCsdyAt; + /** 영업용사용기간 */ @JsonProperty("BSS_USE_PD") private String bssUsePd; + /** 직권말소예방공지일자 */ @JsonProperty("OCTHT_ERSR_PRVNTC_NTICE_DE") private String octhtErsrPrvntcNticeDe; + /** 말소등록일자 */ @JsonProperty("ERSR_REGIST_DE") private String ersrRegistDe; + /** 말소등록구분코드 */ @JsonProperty("ERSR_REGIST_SE_CODE") private String ersrRegistSeCode; + /** 말소등록구분명 */ @JsonProperty("ERSR_REGIST_SE_NM") private String ersrRegistSeNm; + /** 저당건수 */ @JsonProperty("MRTGCNT") private String mrtgcnt; + /** 차량건수 */ @JsonProperty("VHCLECNT") private String vhclecnt; + /** 압인건수 */ @JsonProperty("STMDCNT") private String stmdcnt; + /** 주소1 */ @JsonProperty("ADRES1") private String adres1; + /** 주소명1 */ @JsonProperty("ADRES_NM1") private String adresNm1; + /** 주소 */ @JsonProperty("ADRES") private String adres; + /** 주소명 */ @JsonProperty("ADRES_NM") private String adresNm; + /** 개인법인여부 */ @JsonProperty("INDVDL_BSNM_AT") private String indvdlBsnmAt; + /** 전화번호 */ @JsonProperty("TELNO") private String telno; + /** 소유자명 */ @JsonProperty("MBER_NM") private String mberNm; + /** 소유자구분코드 */ @JsonProperty("MBER_SE_CODE") private String mberSeCode; + /** 소유자구분번호 */ @JsonProperty("MBER_SE_NO") private String mberSeNo; + /** 면세대상자구분코드 */ @JsonProperty("TAXXMPT_TRGTER_SE_CODE") private String taxxmptTrgterSeCode; + /** 면세대상자구분코드명 */ @JsonProperty("TAXXMPT_TRGTER_SE_CODE_NM") private String taxxmptTrgterSeCodeNm; + /** 건수사항 */ @JsonProperty("CNT_MATTER") private String cntMatter; + /** 읍면동명 */ @JsonProperty("EMD_NM") private String emdNm; + /** 예방건수 */ @JsonProperty("PRVNTCCNT") private String prvntccnt; + /** 수출이행여부확인일자 */ @JsonProperty("XPORT_FLFL_AT_STTEMNT_DE") private String xportFlflAtSttemntDe; + /** 협력사신청번호 */ @JsonProperty("PARTN_RQRCNO") private String partnRqrcno; + /** 레코드 목록 */ @JsonProperty("record") private List record; @@ -206,18 +267,31 @@ public class LedgerResponse { @Getter @Setter public static class Record { + /** 메인체크 */ @JsonProperty("MAINCHK") private String mainchk; + /** 변경작업구분코드 */ @JsonProperty("CHANGE_JOB_SE_CODE") private String changeJobSeCode; + /** 주번호 */ @JsonProperty("MAINNO") private String mainno; + /** 부번호 */ @JsonProperty("SUBNO") private String subno; + /** 상세내역 */ @JsonProperty("DTLS") private String dtls; + /** 신청번호 */ @JsonProperty("RQRCNO") private String rqrcno; + /** 차량관리번호 */ @JsonProperty("VHMNO") private String vhmno; + /** 원부그룹번호 */ @JsonProperty("LEDGER_GROUP_NO") private String ledgerGroupNo; + /** 원부개별화번호 */ @JsonProperty("LEDGER_INDVDLZ_NO") private String ledgerIndvdlzNo; + /** 구분명 */ @JsonProperty("GUBUN_NM") private String gubunNm; + /** 변경일자 */ @JsonProperty("CHANGE_DE") private String changeDe; + /** 상세일련번호 */ @JsonProperty("DETAIL_SN") private String detailSn; + /** 플래그 */ @JsonProperty("FLAG") private String flag; public String getMainchk() { return mainchk; } diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java index 88ef5fd..eb6e07c 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java @@ -20,10 +20,10 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; -import java.util.List; -import java.util.Map; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; +import java.util.List; +import java.util.Map; /** * 자동차 과태료 대상 등록 Controller @@ -35,7 +35,7 @@ import java.net.URLEncoder; @Slf4j @Tag(name = "자동차 과태료 대상 등록", description = "자동차 과태료 대상 등록 및 목록 조회 API") public class CarFfnlgTrgtController { - + private final CarFfnlgTrgtService service; private final CommonCodeService commonCodeService; @@ -238,30 +238,59 @@ public class CarFfnlgTrgtController { @Operation(summary = "과태료 대상 삭제", description = "과태료 대상을 삭제(논리삭제)합니다.") public ResponseEntity delete( @Parameter(description = "과태료 대상 ID") @RequestParam String carFfnlgTrgtId) { - + log.info("과태료 대상 삭제 요청 - ID: {}", carFfnlgTrgtId); - + try { String dltr = SessionUtil.getUserId(); if (dltr == null || dltr.isEmpty()) { return ApiResponseUtil.error("로그인 정보가 없습니다."); } - + CarFfnlgTrgtVO vo = new CarFfnlgTrgtVO(); vo.setCarFfnlgTrgtId(carFfnlgTrgtId); vo.setDltr(dltr); - + int result = service.delete(vo); - + if (result > 0) { return ApiResponseUtil.success(MessageConstants.Common.DELETE_SUCCESS); } else { return ApiResponseUtil.error(MessageConstants.Common.DELETE_ERROR); } - + } catch (Exception e) { log.error("과태료 대상 삭제 중 오류 발생", e); return ApiResponseUtil.error("삭제 중 오류가 발생했습니다: " + e.getMessage()); } } + + /** + * 선택된 목록에 대해 API 호출 및 기본정보/등록원부 비교 + * @param targetList 선택된 과태료 대상 목록 + * @return 비교 결과 + */ + @PostMapping("/compareWithApi.ajax") + @ResponseBody + @Operation(summary = "API 호출 및 데이터 비교", description = "선택된 목록에 대해 차량 API를 호출하고 기본정보 및 등록원부와 비교합니다.") + public ResponseEntity compareWithApi(@RequestBody List> targetList) { + log.info("API 호출 및 비교 요청 - 선택된 데이터 건수: {}", targetList != null ? targetList.size() : 0); + + try { + Map resultData = service.compareWithApi(targetList); + + int successCount = (int) resultData.get("successCount"); + int failCount = (int) resultData.get("failCount"); + String message = String.format("API 호출 및 비교 완료\n성공: %d건, 실패: %d건", successCount, failCount); + + return ApiResponseUtil.success(resultData, message); + + } catch (IllegalArgumentException e) { + log.error("파라미터 검증 오류", e); + return ApiResponseUtil.error(e.getMessage()); + } catch (Exception e) { + log.error("API 호출 및 비교 중 오류 발생", e); + return ApiResponseUtil.error("처리 중 오류가 발생했습니다: " + e.getMessage()); + } + } } diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/CarFfnlgTrgtService.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/CarFfnlgTrgtService.java index 1801672..44d85e2 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/CarFfnlgTrgtService.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/CarFfnlgTrgtService.java @@ -69,4 +69,12 @@ public interface CarFfnlgTrgtService { * @return EUC-KR 인코딩 바이트 배열 */ byte[] generateEucKrDownloadBytes(CarFfnlgTrgtVO vo); + + /** + * 선택된 목록에 대해 API 호출 및 기본정보/등록원부 비교 + * + * @param targetList 선택된 과태료 대상 목록 (carFfnlgTrgtId, vhclno, inspYmd 포함) + * @return 비교 결과 (compareResults, totalCount, successCount, failCount) + */ + Map compareWithApi(List> targetList); } diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java index af994c9..cfabbd3 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java @@ -1,6 +1,9 @@ package go.kr.project.carInspectionPenalty.registration.service.impl; import egovframework.exception.MessageException; +import go.kr.project.api.model.VehicleApiResponseVO; +import go.kr.project.api.model.request.BasicRequest; +import go.kr.project.api.service.VehicleInfoService; import go.kr.project.carInspectionPenalty.registration.config.CarFfnlgTxtParseConfig; import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper; import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO; @@ -21,6 +24,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** * 자동차 과태료 대상 Service 구현체 @@ -29,9 +33,10 @@ import java.util.Map; @RequiredArgsConstructor @Slf4j public class CarFfnlgTrgtServiceImpl implements CarFfnlgTrgtService { - + private final CarFfnlgTrgtMapper mapper; private final CarFfnlgTxtParseConfig parseConfig; + private final VehicleInfoService vehicleInfoService; // 날짜 형식 (YYYYMMDD) private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); @@ -889,4 +894,161 @@ public class CarFfnlgTrgtServiceImpl implements CarFfnlgTrgtService { return false; } + + /** + * 선택된 목록에 대해 API 호출 및 기본정보/등록원부 비교 + * + * @param targetList 선택된 과태료 대상 목록 + * @return 비교 결과 + */ + @Override + public Map compareWithApi(List> targetList) { + log.info("========== API 호출 및 비교 시작 =========="); + log.info("선택된 데이터 건수: {}", targetList != null ? targetList.size() : 0); + + if (targetList == null || targetList.isEmpty()) { + throw new IllegalArgumentException("선택된 데이터가 없습니다."); + } + + List> compareResults = new ArrayList<>(); + int successCount = 0; + int failCount = 0; + + for (Map target : targetList) { + String carFfnlgTrgtId = target.get("carFfnlgTrgtId"); + String vhclno = target.get("vhclno"); + String inspYmd = target.get("inspYmd"); + + log.info("처리 중 - 차량번호: {}, 검사일자: {}", vhclno, inspYmd); + + Map compareResult = new HashMap<>(); + compareResult.put("carFfnlgTrgtId", carFfnlgTrgtId); + compareResult.put("vhclno", vhclno); + + try { + // 1. 기존 데이터 조회 + CarFfnlgTrgtVO existingData = new CarFfnlgTrgtVO(); + existingData.setCarFfnlgTrgtId(carFfnlgTrgtId); + existingData = mapper.selectOne(existingData); + + if (existingData == null) { + compareResult.put("success", false); + compareResult.put("message", "기존 데이터를 찾을 수 없습니다."); + failCount++; + compareResults.add(compareResult); + continue; + } + + // 2. API 호출 (통합 조회) + BasicRequest apiRequest = new BasicRequest(); + apiRequest.setVhrno(vhclno); + apiRequest.setLevyStdde(inspYmd != null ? inspYmd.replace("-", "") : ""); + apiRequest.setInqireSeCode("01"); // 조회구분코드 기본값 + + VehicleApiResponseVO apiResponse = vehicleInfoService.getVehicleInfo(apiRequest); + + if (!apiResponse.isSuccess()) { + compareResult.put("success", false); + compareResult.put("message", "API 호출 실패: " + apiResponse.getMessage()); + failCount++; + compareResults.add(compareResult); + continue; + } + + // 3. 데이터 비교 + Map comparisonDetail = compareData(existingData, apiResponse); + + compareResult.put("success", true); + compareResult.put("message", "비교 완료"); + compareResult.put("comparisonDetail", comparisonDetail); + successCount++; + + } catch (Exception e) { + log.error("데이터 비교 중 오류 발생 - 차량번호: {}", vhclno, e); + compareResult.put("success", false); + compareResult.put("message", "비교 중 오류: " + e.getMessage()); + failCount++; + } + + compareResults.add(compareResult); + } + + Map resultData = new HashMap<>(); + resultData.put("compareResults", compareResults); + resultData.put("totalCount", targetList.size()); + resultData.put("successCount", successCount); + resultData.put("failCount", failCount); + + log.info("========== API 호출 및 비교 완료 =========="); + log.info("성공: {}건, 실패: {}건", successCount, failCount); + + return resultData; + } + + /** + * 기존 데이터와 API 응답 데이터를 비교하는 로직 + * TODO: 실제 비교 로직은 요구사항에 맞게 수정 필요 + * + * @param existingData 기존 과태료 대상 데이터 + * @param apiResponse API 응답 데이터 + * @return 비교 결과 상세 + */ + private Map compareData(CarFfnlgTrgtVO existingData, VehicleApiResponseVO apiResponse) { + Map comparison = new HashMap<>(); + + // 기본정보 비교 + if (apiResponse.getBasicInfo() != null && apiResponse.getBasicInfo().getRecord() != null + && !apiResponse.getBasicInfo().getRecord().isEmpty()) { + Map basicComparison = new HashMap<>(); + + // 예시: 차량번호 비교 + String existingVhclno = existingData.getVhclno(); + String apiVhclno = apiResponse.getBasicInfo().getRecord().get(0).getVhrno(); + basicComparison.put("차량번호_일치여부", Objects.equals(existingVhclno, apiVhclno) ? "일치" : "불일치"); + basicComparison.put("기존_차량번호", existingVhclno); + basicComparison.put("API_차량번호", apiVhclno); + + // 예시: 소유자명 비교 + String existingOwnrNm = existingData.getOwnrNm(); + String apiOwnrNm = apiResponse.getBasicInfo().getRecord().get(0).getMberNm(); + basicComparison.put("소유자명_일치여부", Objects.equals(existingOwnrNm, apiOwnrNm) ? "일치" : "불일치"); + basicComparison.put("기존_소유자명", existingOwnrNm); + basicComparison.put("API_소유자명", apiOwnrNm); + + comparison.put("기본정보_비교", basicComparison); + } + + // 등록원부 비교 + if (apiResponse.getLedgerInfo() != null) { + Map ledgerComparison = new HashMap<>(); + + // 예시: 차량번호 비교 (등록원부) + String existingVhclno = existingData.getVhclno(); + String apiVhclno = apiResponse.getLedgerInfo().getVhrno(); + ledgerComparison.put("차량번호_일치여부", Objects.equals(existingVhclno, apiVhclno) ? "일치" : "불일치"); + + // TODO: 추가적인 등록원부 필드 비교 로직 작성 + // 예: 차대번호, 등록일자 등 + + comparison.put("등록원부_비교", ledgerComparison); + } + + // 전체 일치 여부 판단 + boolean allMatched = true; + if (apiResponse.getBasicInfo() != null && apiResponse.getBasicInfo().getRecord() != null + && !apiResponse.getBasicInfo().getRecord().isEmpty()) { + String existingVhclno = existingData.getVhclno(); + String apiVhclno = apiResponse.getBasicInfo().getRecord().get(0).getVhrno(); + String existingOwnrNm = existingData.getOwnrNm(); + String apiOwnrNm = apiResponse.getBasicInfo().getRecord().get(0).getMberNm(); + + if (!Objects.equals(existingVhclno, apiVhclno) || !Objects.equals(existingOwnrNm, apiOwnrNm)) { + allMatched = false; + } + } + + comparison.put("전체_일치여부", allMatched ? "일치" : "불일치"); + + return comparison; + } } diff --git a/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp b/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp index 19d86df..ce21577 100644 --- a/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp +++ b/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp @@ -10,6 +10,7 @@
과태료 대상 목록
+ @@ -386,6 +387,11 @@ self.deleteData(); }); + // API 호출 버튼 클릭 + $("#callApiBtn").on('click', function() { + self.callApiAndCompare(); + }); + // 목록 다운로드 버튼 클릭 $("#downloadBtn").on('click', function() { var url = buildDownloadUrl(); @@ -429,18 +435,18 @@ */ deleteData: function() { var checkedRows = this.grid.instance.getCheckedRows(); - + if (checkedRows.length === 0) { alert("삭제할 데이터를 선택해주세요."); return; } - + if (!confirm(checkedRows.length + "건의 데이터를 삭제하시겠습니까?")) { return; } - + var deletePromises = []; - + checkedRows.forEach(function(row) { var promise = $.ajax({ url: '', @@ -451,13 +457,71 @@ }); deletePromises.push(promise); }); - + $.when.apply($, deletePromises).done(function() { alert("삭제가 완료되었습니다."); CarFfnlgTrgtList.grid.reload(); }).fail(function() { alert("삭제 중 오류가 발생했습니다."); }); + }, + + /** + * API 호출 및 데이터 비교 + */ + callApiAndCompare: function() { + var checkedRows = this.grid.instance.getCheckedRows(); + + if (checkedRows.length === 0) { + alert("API 호출할 데이터를 선택해주세요."); + return; + } + + if (!confirm(checkedRows.length + "건의 데이터에 대해 API를 호출하고 비교하시겠습니까?")) { + return; + } + + // 선택된 행 데이터 배열 준비 + var targetList = checkedRows.map(function(row) { + return { + carFfnlgTrgtId: row.carFfnlgTrgtId, + vhclno: row.vhclno, + inspYmd: row.inspYmd, + ownrNm: row.ownrNm, + carNm: row.carNm + }; + }); + + // 로딩 메시지 표시 (선택사항) + var loadingMsg = "API 호출 및 비교 중입니다...\n잠시만 기다려주세요."; + console.log(loadingMsg); + + // AJAX 호출 + $.ajax({ + url: '', + type: 'POST', + contentType: 'application/json', + data: JSON.stringify(targetList), + success: function(response) { + if (response.success) { + alert("API 호출 및 비교가 완료되었습니다.\n\n" + response.message); + + // 비교 결과 상세 보기 (콘솔 출력) + if (response.data && response.data.compareResults) { + console.log("비교 결과 상세:", response.data.compareResults); + } + + // 그리드 새로고침 + CarFfnlgTrgtList.grid.reload(); + } else { + alert("오류: " + response.message); + } + }, + error: function(xhr, status, error) { + console.error("API 호출 실패:", error); + alert("API 호출 중 오류가 발생했습니다.\n" + error); + } + }); } };