설정 초기화 진행 중...

internalApi
박성영 1 month ago
parent 1c43a6487d
commit 59ff10783d

@ -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);
}
}

@ -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<String> vehicleNumbers) {
log.info("차량 정보 조회 요청 - 차량 수: {}", vehicleNumbers.size());
try {
// 차량 정보 조회
List<VehicleApiResponseVO> vehicles = externalVehicleApiService.getVehiclesInfo(vehicleNumbers);
log.info("차량 정보 조회 완료 - 총 {}건", vehicles.size());
return ApiResponseUtil.success(vehicles, "차량 정보 조회가 완료되었습니다.");
} catch (Exception e) {
log.error("차량 정보 조회 중 오류 발생", e);
return ApiResponseUtil.error("조회 중 오류가 발생했습니다: " + e.getMessage());
}
}
}

@ -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<VehicleApiResponseVO> getVehiclesInfo(List<String> vehicleNumbers) {
log.info("차량 정보 일괄 조회 시작 - 대상 차량 수: {}", vehicleNumbers.size());
List<VehicleApiResponseVO> 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<VehicleBasicRequestVO> requestEnvelope = new Envelope<>(request);
// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Envelope<VehicleBasicRequestVO>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
try {
// API 호출
ResponseEntity<Envelope<VehicleBasicInfoVO>> responseEntity = restTemplate.exchange(
BASIC_INFO_URL,
HttpMethod.POST,
requestEntity,
new ParameterizedTypeReference<Envelope<VehicleBasicInfoVO>>() {}
);
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<VehicleBasicInfoVO> 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<VehicleLedgerRequestVO> requestEnvelope = new Envelope<>(request);
// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Envelope<VehicleLedgerRequestVO>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
try {
// API 호출
ResponseEntity<Envelope<VehicleLedgerVO>> responseEntity = restTemplate.exchange(
LEDGER_INFO_URL,
HttpMethod.POST,
requestEntity,
new ParameterizedTypeReference<Envelope<VehicleLedgerVO>>() {}
);
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<VehicleLedgerVO> 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);
}
}
}

@ -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<T> {
@JsonProperty("data")
private List<T> data = new ArrayList<>();
public Envelope() {}
public Envelope(T single) {
if (single != null) this.data.add(single);
}
public Envelope(List<T> data) {
this.data = data;
}
}

@ -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;
}
}

@ -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> 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;
}
}

@ -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;
}

@ -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;
}

@ -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> 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;
}
}

@ -119,6 +119,71 @@
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);
}
});
},
/**
@ -126,13 +191,9 @@
*/
init: function() {
// 그리드 생성
this.grid.create();
// 이벤트 핸들러 설정
this.eventBindEvents();
this.grid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page});
}
};

Loading…
Cancel
Save