diff --git a/src/main/java/egovframework/config/RestTemplateConfig.java b/src/main/java/egovframework/config/RestTemplateConfig.java new file mode 100644 index 0000000..915a1c2 --- /dev/null +++ b/src/main/java/egovframework/config/RestTemplateConfig.java @@ -0,0 +1,25 @@ +package egovframework.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate 설정 클래스 + * 외부 API 호출을 위한 RestTemplate Bean 설정 + */ +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + + // 타임아웃 설정 (30초) + factory.setConnectTimeout(30000); + factory.setReadTimeout(30000); + + return new RestTemplate(factory); + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/search/CarInspectionPenaltyController.java b/src/main/java/go/kr/project/carInspectionPenalty/search/CarInspectionPenaltyController.java index a24623b..4226c63 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/search/CarInspectionPenaltyController.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/search/CarInspectionPenaltyController.java @@ -1,21 +1,30 @@ package go.kr.project.carInspectionPenalty.search; import egovframework.constant.TilesConstants; +import egovframework.util.ApiResponseUtil; +import go.kr.project.carInspectionPenalty.service.ExternalVehicleApiService; +import go.kr.project.carInspectionPenalty.vo.VehicleApiResponseVO; import go.kr.project.common.service.CommonCodeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Controller @RequestMapping("/carInspectionPenalty/search") @RequiredArgsConstructor @Slf4j +@Tag(name = "자동차 검사 과태료 조회", description = "자동차 검사 과태료 조회 API") public class CarInspectionPenaltyController { private final CommonCodeService commonCodeService; + private final ExternalVehicleApiService externalVehicleApiService; @GetMapping("/list.do") public String list( Model model ) { @@ -23,5 +32,31 @@ public class CarInspectionPenaltyController { return "carInspectionPenalty/search/list" + TilesConstants.BASE; } + /** + * 차량 정보 조회 API + * 여러 차량번호를 받아서 VMIS-interface API를 호출하여 차량 정보를 조회합니다. + * + * @param vehicleNumbers 차량번호 리스트 + * @return 차량 정보 조회 결과 + */ + @PostMapping("/getVehiclesInfo.do") + @ResponseBody + @Operation(summary = "차량 정보 조회", description = "차량번호 리스트를 받아서 차량 기본정보와 등록원부 정보를 조회합니다.") + public ResponseEntity getVehiclesInfo(@RequestBody List vehicleNumbers) { + log.info("차량 정보 조회 요청 - 차량 수: {}", vehicleNumbers.size()); + + try { + // 차량 정보 조회 + List vehicles = externalVehicleApiService.getVehiclesInfo(vehicleNumbers); + + log.info("차량 정보 조회 완료 - 총 {}건", vehicles.size()); + + return ApiResponseUtil.success(vehicles, "차량 정보 조회가 완료되었습니다."); + + } catch (Exception e) { + log.error("차량 정보 조회 중 오류 발생", e); + return ApiResponseUtil.error("조회 중 오류가 발생했습니다: " + e.getMessage()); + } + } } \ No newline at end of file diff --git a/src/main/java/go/kr/project/carInspectionPenalty/service/ExternalVehicleApiService.java b/src/main/java/go/kr/project/carInspectionPenalty/service/ExternalVehicleApiService.java new file mode 100644 index 0000000..a0313f5 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/service/ExternalVehicleApiService.java @@ -0,0 +1,203 @@ +package go.kr.project.carInspectionPenalty.service; + +import go.kr.project.carInspectionPenalty.vo.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * 차량 API 호출 서비스 + * VMIS-interface 프로그램의 API를 호출하여 차량 정보를 조회하는 서비스 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class ExternalVehicleApiService { + + private final RestTemplate restTemplate; + + // VMIS-interface API URL + private static final String VMIS_API_BASE_URL = "http://localhost:8081/api/v1/vehicles"; + private static final String BASIC_INFO_URL = VMIS_API_BASE_URL + "/basic"; + private static final String LEDGER_INFO_URL = VMIS_API_BASE_URL + "/ledger"; + + /** + * 여러 차량번호에 대한 정보를 일괄 조회 + * + * @param vehicleNumbers 차량번호 리스트 + * @return 차량 정보 응답 리스트 + */ + public List getVehiclesInfo(List vehicleNumbers) { + log.info("차량 정보 일괄 조회 시작 - 대상 차량 수: {}", vehicleNumbers.size()); + + List responses = new ArrayList<>(); + + for (String vehicleNumber : vehicleNumbers) { + try { + VehicleApiResponseVO response = getVehicleInfo(vehicleNumber); + responses.add(response); + } catch (Exception e) { + log.error("차량번호 {} 조회 중 오류 발생: {}", vehicleNumber, e.getMessage(), e); + + // 오류 발생 시에도 응답 객체 생성하여 추가 + VehicleApiResponseVO errorResponse = VehicleApiResponseVO.builder() + .vhrno(vehicleNumber) + .success(false) + .message("조회 실패: " + e.getMessage()) + .build(); + responses.add(errorResponse); + } + } + + log.info("차량 정보 일괄 조회 완료 - 성공: {}, 실패: {}", + responses.stream().filter(VehicleApiResponseVO::isSuccess).count(), + responses.stream().filter(r -> !r.isSuccess()).count()); + + return responses; + } + + /** + * 단일 차량번호에 대한 정보 조회 + * + * @param vehicleNumber 차량번호 + * @return 차량 정보 응답 + */ + public VehicleApiResponseVO getVehicleInfo(String vehicleNumber) { + log.info("차량 정보 조회 시작 - 차량번호: {}", vehicleNumber); + + VehicleApiResponseVO response = new VehicleApiResponseVO(); + response.setVhrno(vehicleNumber); + + try { + // 1. 차량 기본정보 조회 + VehicleBasicInfoVO basicInfo = getBasicInfo(vehicleNumber); + response.setBasicInfo(basicInfo); + + // 2. 자동차 등록원부 조회 + VehicleLedgerVO ledgerInfo = getLedgerInfo(vehicleNumber); + response.setLedgerInfo(ledgerInfo); + + // 3. 결과 검증 + if (basicInfo != null && "00".equals(basicInfo.getCntcResultCode())) { + response.setSuccess(true); + response.setMessage("조회 성공"); + log.info("차량번호 {} 조회 성공", vehicleNumber); + } else { + response.setSuccess(false); + response.setMessage(basicInfo != null ? basicInfo.getCntcResultDtls() : "조회 실패"); + log.warn("차량번호 {} 조회 실패 - {}", vehicleNumber, response.getMessage()); + } + + } catch (Exception e) { + response.setSuccess(false); + response.setMessage("API 호출 오류: " + e.getMessage()); + log.error("차량번호 {} API 호출 중 오류 발생", vehicleNumber, e); + } + + return response; + } + + /** + * 차량 기본정보 조회 API 호출 + * VMIS-interface의 RequestEnricher가 기본 설정값을 자동으로 채워주므로 차량번호만 전송 + * + * @param vehicleNumber 차량번호 + * @return 차량 기본정보 + */ + private VehicleBasicInfoVO getBasicInfo(String vehicleNumber) { + log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", vehicleNumber); + + // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정) + VehicleBasicRequestVO request = VehicleBasicRequestVO.builder() + .vhrno(vehicleNumber) + .build(); + + // Envelope로 감싸기 + Envelope requestEnvelope = new Envelope<>(request); + + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + + try { + // API 호출 + ResponseEntity> responseEntity = restTemplate.exchange( + BASIC_INFO_URL, + HttpMethod.POST, + requestEntity, + new ParameterizedTypeReference>() {} + ); + + if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { + List data = responseEntity.getBody().getData(); + if (data != null && !data.isEmpty()) { + return data.get(0); + } + } + + log.warn("차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber); + return null; + + } catch (Exception e) { + log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", vehicleNumber, e); + throw new RuntimeException("차량 기본정보 조회 실패: " + e.getMessage(), e); + } + } + + /** + * 자동차 등록원부(갑) 조회 API 호출 + * VMIS-interface의 RequestEnricher가 기본 설정값을 자동으로 채워주므로 차량번호만 전송 + * + * @param vehicleNumber 차량번호 + * @return 등록원부 정보 + */ + private VehicleLedgerVO getLedgerInfo(String vehicleNumber) { + log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", vehicleNumber); + + // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정) + VehicleLedgerRequestVO request = VehicleLedgerRequestVO.builder() + .vhrno(vehicleNumber) + .build(); + + // Envelope로 감싸기 + Envelope requestEnvelope = new Envelope<>(request); + + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + + try { + // API 호출 + ResponseEntity> responseEntity = restTemplate.exchange( + LEDGER_INFO_URL, + HttpMethod.POST, + requestEntity, + new ParameterizedTypeReference>() {} + ); + + if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { + List data = responseEntity.getBody().getData(); + if (data != null && !data.isEmpty()) { + return data.get(0); + } + } + + log.warn("자동차 등록원부 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber); + return null; + + } catch (Exception e) { + log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", vehicleNumber, e); + throw new RuntimeException("자동차 등록원부 조회 실패: " + e.getMessage(), e); + } + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/Envelope.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/Envelope.java new file mode 100644 index 0000000..4951a90 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/Envelope.java @@ -0,0 +1,32 @@ +package go.kr.project.carInspectionPenalty.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 공통 래퍼: { "data": [ ... ] } + * VMIS-interface API 호출 시 사용하는 공통 Envelope 클래스 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@Getter +@Setter +public class Envelope { + + @JsonProperty("data") + private List data = new ArrayList<>(); + + public Envelope() {} + + public Envelope(T single) { + if (single != null) this.data.add(single); + } + + public Envelope(List data) { + this.data = data; + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleApiResponseVO.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleApiResponseVO.java new file mode 100644 index 0000000..c016f14 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleApiResponseVO.java @@ -0,0 +1,28 @@ +package go.kr.project.carInspectionPenalty.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * 차량 API 통합 응답 VO + * 차량 기본정보와 등록원부 정보를 함께 담는 VO + */ +@Getter +@Setter +@Builder +@AllArgsConstructor +public class VehicleApiResponseVO { + + private String vhrno; // 차량번호 + private boolean success; // 성공 여부 + private String message; // 메시지 + + private VehicleBasicInfoVO basicInfo; // 차량 기본정보 + private VehicleLedgerVO ledgerInfo; // 등록원부 정보 + + public VehicleApiResponseVO() { + this.success = true; + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicInfoVO.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicInfoVO.java new file mode 100644 index 0000000..c617079 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicInfoVO.java @@ -0,0 +1,80 @@ +package go.kr.project.carInspectionPenalty.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 차량 기본정보 조회 응답 VO + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@Getter +@Setter +public class VehicleBasicInfoVO { + + @JsonProperty("CNTC_RESULT_CODE") + private String cntcResultCode; + + @JsonProperty("CNTC_RESULT_DTLS") + private String cntcResultDtls; + + @JsonProperty("record") + private List record; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + @Getter + @Setter + public static class Record { + @JsonProperty("VHRNO") private String vhrno; // 차량번호 + @JsonProperty("VIN") private String vin; // 차대번호 + @JsonProperty("CNM") private String cnm; // 차명 + @JsonProperty("MBER_NM") private String mberNm; // 소유자명 + @JsonProperty("MBER_SE_NO") private String mberSeNo; // 소유자번호 + @JsonProperty("TELNO") private String telno; // 전화번호 + @JsonProperty("PRYE") private String prye; // 연식 + @JsonProperty("REGIST_DE") private String registDe; // 등록일 + @JsonProperty("FRST_REGIST_DE") private String frstRegistDe; // 최초등록일 + @JsonProperty("COLOR_NM") private String colorNm; // 색상명 + @JsonProperty("DSPLVL") private String dsplvl; // 배기량 + @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; // 차종종별명 + @JsonProperty("VHCTY_TY_NM") private String vhctyTyNm; // 차종유형명 + @JsonProperty("VHCTY_SE_NM") private String vhctySeNm; // 차종분류명 + @JsonProperty("INSPT_VALID_PD_BGNDE") private String insptValidPdBgnde; // 검사유효기간시작일 + @JsonProperty("INSPT_VALID_PD_ENDDE") private String insptValidPdEndde; // 검사유효기간종료일 + @JsonProperty("USGSRHLD_ADRES_FULL") private String usgsrhldAdresFull; // 사용본거지전체주소 + @JsonProperty("OWNER_ADRES_FULL") private String ownerAdresFull; // 소유자전체주소 + + // 추가 필드들 + @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("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("MBER_SE_CODE") private String mberSeCode; + @JsonProperty("VHCLE_TOT_WT") private String vhcleTotWt; + @JsonProperty("CAAG_ENDDE") private String caagEndde; + @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("FOM_NM") private String fomNm; + @JsonProperty("USE_FUEL_CODE") private String useFuelCode; + @JsonProperty("PRPOS_SE_CODE") private String prposSeCode; + @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; + @JsonProperty("ACQS_AMOUNT") private String acqsAmount; + @JsonProperty("TKCAR_PSCAP_CO") private String tkcarPscapCo; + @JsonProperty("SPMNNO") private String spmnno; + @JsonProperty("TRVL_DSTNC") private String trvlDstnc; + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicRequestVO.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicRequestVO.java new file mode 100644 index 0000000..dacedc5 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleBasicRequestVO.java @@ -0,0 +1,42 @@ +package go.kr.project.carInspectionPenalty.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * 차량 기본정보 조회 요청 VO + */ +@Getter +@Setter +@Builder +public class VehicleBasicRequestVO { + + @JsonProperty("INFO_SYS_ID") + private String infoSysId; + + @JsonProperty("INFO_SYS_IP") + private String infoSysIp; + + @JsonProperty("SIGUNGU_CODE") + private String sigunguCode; + + @JsonProperty("CNTC_INFO_CODE") + private String cntcInfoCode; + + @JsonProperty("CHARGER_ID") + private String chargerId; + + @JsonProperty("CHARGER_IP") + private String chargerIp; + + @JsonProperty("CHARGER_NM") + private String chargerNm; + + @JsonProperty("VHRNO") + private String vhrno; // 차량번호 + + @JsonProperty("ONES_INFORMATION_OPEN") + private String onesInformationOpen; +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerRequestVO.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerRequestVO.java new file mode 100644 index 0000000..3e52bbe --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerRequestVO.java @@ -0,0 +1,42 @@ +package go.kr.project.carInspectionPenalty.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +/** + * 자동차 등록원부(갑) 조회 요청 VO + */ +@Getter +@Setter +@Builder +public class VehicleLedgerRequestVO { + + @JsonProperty("INFO_SYS_ID") + private String infoSysId; + + @JsonProperty("INFO_SYS_IP") + private String infoSysIp; + + @JsonProperty("SIGUNGU_CODE") + private String sigunguCode; + + @JsonProperty("CNTC_INFO_CODE") + private String cntcInfoCode; + + @JsonProperty("CHARGER_ID") + private String chargerId; + + @JsonProperty("CHARGER_IP") + private String chargerIp; + + @JsonProperty("CHARGER_NM") + private String chargerNm; + + @JsonProperty("VHRNO") + private String vhrno; // 차량번호 + + @JsonProperty("ONES_INFORMATION_OPEN") + private String onesInformationOpen; +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerVO.java b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerVO.java new file mode 100644 index 0000000..86d9fd9 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/vo/VehicleLedgerVO.java @@ -0,0 +1,103 @@ +package go.kr.project.carInspectionPenalty.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 자동차 등록원부(갑) 조회 응답 VO + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@Getter +@Setter +public class VehicleLedgerVO { + + @JsonProperty("CNTC_RESULT_CODE") + private String cntcResultCode; + + @JsonProperty("CNTC_RESULT_DTLS") + private String cntcResultDtls; + + @JsonProperty("VHRNO") + private String vhrno; // 차량번호 + + @JsonProperty("VIN") + private String vin; // 차대번호 + + @JsonProperty("CNM") + private String cnm; // 차명 + + @JsonProperty("COLOR_NM") + private String colorNm; // 색상명 + + @JsonProperty("PRYE") + private String prye; // 연식 + + @JsonProperty("FRST_REGIST_DE") + private String frstRegistDe; // 최초등록일 + + @JsonProperty("MBER_NM") + private String mberNm; // 소유자명 + + @JsonProperty("MBER_SE_CODE") + private String mberSeCode; // 회원구분코드 + + @JsonProperty("MBER_SE_NO") + private String mberSeNo; // 회원번호 + + @JsonProperty("TELNO") + private String telno; // 전화번호 + + @JsonProperty("INSPT_VALID_PD_BGNDE") + private String insptValidPdBgnde; // 검사유효기간시작일 + + @JsonProperty("INSPT_VALID_PD_ENDDE") + private String insptValidPdEndde; // 검사유효기간종료일 + + @JsonProperty("ADRES") + private String adres; // 주소 + + @JsonProperty("ADRES_NM") + private String adresNm; // 상세주소 + + @JsonProperty("record") + private List record; + + // 추가 필드들 + @JsonProperty("LEDGER_GROUP_NO") private String ledgerGroupNo; + @JsonProperty("LEDGER_INDVDLZ_NO") private String ledgerIndvdlzNo; + @JsonProperty("VHMNO") private String vhmno; + @JsonProperty("VHCTY_ASORT_CODE") private String vhctyAsortCode; + @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; + @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("CAAG_ENDDE") private String caagEndde; + @JsonProperty("YBL_MD") private String yblMd; + @JsonProperty("TRVL_DSTNC") private String trvlDstnc; + @JsonProperty("ERSR_REGIST_DE") private String ersrRegistDe; + @JsonProperty("ERSR_REGIST_SE_CODE") private String ersrRegistSeCode; + @JsonProperty("ERSR_REGIST_SE_NM") private String ersrRegistSeNm; + @JsonProperty("NMPL_CSDY_AT") private String nmplCsdyAt; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + @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("CHANGE_DE") private String changeDe; + @JsonProperty("GUBUN_NM") private String gubunNm; + } +} diff --git a/src/main/webapp/WEB-INF/views/carInspectionPenalty/search/list.jsp b/src/main/webapp/WEB-INF/views/carInspectionPenalty/search/list.jsp index f07f8ac..54cfb81 100644 --- a/src/main/webapp/WEB-INF/views/carInspectionPenalty/search/list.jsp +++ b/src/main/webapp/WEB-INF/views/carInspectionPenalty/search/list.jsp @@ -119,20 +119,81 @@ self.openRegisterPopup(); }); + // 차량조회 버튼 클릭 이벤트 + $("#btnCarExternalApiCall").on('click', function() { + self.callVehicleApi(); + }); + + }, + + /** + * 차량 정보 조회 API 호출 + */ + callVehicleApi: function() { + var self = this; + + // 임시 테스트용 차량번호 (실제로는 그리드에서 선택된 차량번호를 가져와야 함) + var vehicleNumbers = ["12가3456", "34나5678", "56다7890"]; + + // 확인 메시지 + if (!confirm("총 " + vehicleNumbers.length + "건의 차량 정보를 조회하시겠습니까?")) { + return; + } + + // API 호출 + $.ajax({ + url: '/carInspectionPenalty/search/getVehiclesInfo.do', + type: 'POST', + contentType: 'application/json', + data: JSON.stringify(vehicleNumbers), + success: function(response) { + + if (response.success) { + console.log("차량 정보 조회 성공:", response.data); + + // 성공/실패 건수 계산 + var successCount = 0; + var failCount = 0; + + response.data.forEach(function(vehicle) { + if (vehicle.success) { + successCount++; + console.log("차량번호: " + vehicle.vhrno + " 조회 성공"); + console.log("- 기본정보:", vehicle.basicInfo); + console.log("- 등록원부:", vehicle.ledgerInfo); + } else { + failCount++; + console.log("차량번호: " + vehicle.vhrno + " 조회 실패 - " + vehicle.message); + } + }); + + // 결과 메시지 표시 + alert("차량 정보 조회가 완료되었습니다.\n\n" + + "성공: " + successCount + "건\n" + + "실패: " + failCount + "건\n\n" + + "자세한 내용은 콘솔을 확인하세요."); + + // TODO: 조회된 정보를 그리드에 표시하거나 DB에 저장하는 로직 추가 + + } else { + alert("차량 정보 조회에 실패했습니다.\n\n" + response.message); + } + }, + error: function(xhr, status, error) { + console.error("API 호출 오류:", error); + alert("차량 정보 조회 중 오류가 발생했습니다.\n\n" + error); + } + }); }, /** * 모듈 초기화 */ init: function() { - - // 그리드 생성 - this.grid.create(); + // 이벤트 핸들러 설정 this.eventBindEvents(); - - this.grid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page}); } };