diff --git a/src/main/java/kr/xit/fims/biz/cmm/dto/FimsCrackdownDTO.java b/src/main/java/kr/xit/fims/biz/cmm/dto/FimsCrackdownDTO.java
index a9269604..c4cd88ea 100644
--- a/src/main/java/kr/xit/fims/biz/cmm/dto/FimsCrackdownDTO.java
+++ b/src/main/java/kr/xit/fims/biz/cmm/dto/FimsCrackdownDTO.java
@@ -93,6 +93,8 @@ public class FimsCrackdownDTO {
private FimsCrackdownDTO.Info infoDTO;
//private FimsCrackdownDTO.Info infoDTO;
//private FimsCrackdownDTO.Info infoDTO;
+
+ private String extnlVhcleUrl;
}
@Data
diff --git a/src/main/java/kr/xit/fims/biz/cmm/dto/NtriDTO.java b/src/main/java/kr/xit/fims/biz/cmm/dto/NtriDTO.java
new file mode 100644
index 00000000..152049b8
--- /dev/null
+++ b/src/main/java/kr/xit/fims/biz/cmm/dto/NtriDTO.java
@@ -0,0 +1,251 @@
+package kr.xit.fims.biz.cmm.dto;
+
+import java.io.Serializable;
+
+import javax.validation.constraints.Size;
+
+import org.springmodules.validation.bean.conf.loader.annotation.handler.NotEmpty;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+public class NtriDTO {
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ public static class Request implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private NtriCmmHeader header;
+ private NtriRequestBody> body;
+ }
+
+ /**
+ * 실시간 연계 전문 표준 헤더
+ */
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ @ToString
+ public static class NtriCmmHeader implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ //--------------------------------------------------
+ // 전문헤더
+ //--------------------------------------------------
+ /**
+ * 전송일자 - varchar 14
+ * 요청시 필수
+ * 데이터 전송 (생성 ) 일자 [형식 :YYYYMMDDHH24MISS ]
+ */
+ @NotEmpty
+ @Size(min = 14, max = 14, message = "전송일자(14자)")
+ private String ifDate;
+ /**
+ *
+ * 연계메세지키 - varchar 49
+ * 요청시 필수
+ * 각 연계 메시지의 식별을 위한 고유 식별키
+ * (이용기관과 제공기관 간 메시지키를 통한 정보조회 시 필요 )
+ * [형식 : 시스템코드 + 년월일시분초 (yyMMddHHmmssSSS)+“-“+자바 UUID ('-'제외 )]
+ * [시스템코드 : 세무행정 (T), 대국민 (W), 세외수입 (N), 행정지원 (A), 연계 (L), 유관기관 (E ), 개별시스템 (Z)
+ * [예시 : T211103155123435-e7def4c1652a478e9c77525ab5b3ebda ]
+ *
+ */
+ @NotEmpty
+ @Size(min = 49, max = 49, message = "연계메세지키(49자)")
+ private String ifMsgKey;
+
+ //--------------------------------------------------
+ // 거래정보
+ //--------------------------------------------------
+ /**
+ * 인터페이스ID - varchar 30
+ * 요청시 필수
+ * 연계 항목 고유식별 아이디 - 차세대 세외수입 연계팀에서 부여
+ * 예시 ) EBD_1613000001_1741000TAX_0020
+ */
+ @NotEmpty
+ @Size(min = 30, max = 30, message = "인터페이스ID(30자)")
+ private String ifId;
+ /**
+ * 출발지시스템코드 - varchar 10
+ * 요청시 필수
+ * 기관코드 (행정표준코드 7 자리 ) + 시스템코드 (3 자리 )
+ */
+ @NotEmpty
+ @Size(min = 10, max = 10, message = "출발지 시스템 코드(10자)")
+ private String source;
+ /**
+ * 도착지시스템코드 - varchar 10
+ * 요청/응답시 필수
+ * 기관코드 (행정표준코드 7 자리 ) + 시스템코드 (3 자리 )
+ */
+ @NotEmpty
+ @Size(min = 10, max = 10, message = "도착지 시스템 코드(10자)")
+ private String target;
+ /**
+ * 데이타구분 - varchar 1
+ * 요청/응답시 필수
+ * 데이터 송 /수신 구분 (S:요청 /송신 , R:응답 /수신 )
+ */
+ @NotEmpty
+ @Size(min = 1, max = 1, message = "데이타 구분(S:요청/송신, R:응답/수신)")
+ private String ifType;
+
+ //--------------------------------------------------
+ // 데이터 정보
+ //--------------------------------------------------
+ /**
+ * 데이터 형식 - varchar 1
+ * 요청시 필수
+ * 연계 데이터 형식
+ * (D : 딜리미터 (‘|’ 등 ), F : Fixed-Length, X : XML, J : JSON)
+ */
+ @NotEmpty
+ @Size(min = 1, max = 1, message = "데이타 형식(D:delimiter / F:fixed-length / J:json)")
+ private String ifFormat;
+
+ //--------------------------------------------------
+ // 처리결과(출력부)
+ //--------------------------------------------------
+ /**
+ * 연계처리결과명 - varchar 150
+ * 연계처리 결과 내용 - Success : 성공 , 그 외 : 오류 메시지
+ */
+ @Size(max = 150, message = "연계처리결과명(~150자)")
+ private String retName;
+ /**
+ * 연계결과처리코드 - varchar 10
+ * 전송요청시 공백 , 연계 처리후 결과코드 용도
+ * (프레임웍 /연계팀에서 정의한 코드만 기록 됨 , 업무에서 사용 불가 ) 연계팀 => 200 :성공 , 500 : 실패
+ */
+ @Size(max = 10, message = "연계결과처리코드(~10자)")
+ private String retCode;
+ }
+
+ /**
+ * 파일연계 전문 헤더
+ */
+
+ /**
+ * Body
+ */
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class NtriRequestBody implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private T reqVo;
+ }
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class NtriResponseBody implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private T resVo;
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ public static class Imposition implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 자치단체코드 : 행정표준코드관리시스템의 자치단테코드
+ */
+ @NotEmpty
+ @Size(min = 7, max = 7, message = "자치단체코드(7자)")
+ private String sgbCd;
+ /**
+ * 연계대상코드 : 세외수입에서 부여한 시스템코드(연계 확정시 코드부여)
+ */
+ @NotEmpty
+ @Size(min = 15, max = 15, message = "연계대상코드(15자)")
+ private String linkTrgtCd;
+ /**
+ * 연계관리키 : 연계대상 기관에서 관리하는 유일키
+ */
+ @NotEmpty
+ @Size(min = 50, max = 50, message = "연계관리키(50자)")
+ private String linkMngKey;
+ /**
+ * 부서코드 : 행정표준코드관리시스템의 부서코드
+ */
+ @NotEmpty
+ @Size(min = 7, max = 7, message = "부서코드(7자)")
+ private String dptCd;
+ /**
+ * 특별회계사업코드 : 특별회계 세목코드를 사용한 경우특별회계사업코드 필요
+ * 회계구분이 '51','61' 인경우에만 해당
+ * "차세대 세외수입시스템과 자치단체 개별 및 특화시스템간 연계 테스트 안내" 공문 붙임 문서 참조
+ */
+ @NotEmpty
+ @Size(min = 4, max = 4, message = "특별회계사업코드(4자)")
+ @Builder.Default
+ private String spclFisBizCd = "0000";
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ public static class ImpositionRes implements Serializable {
+ private static final long serialVersionUID = 1L;
+ /**
+ * 자치단체코드 - varchar 7
+ */
+ @Size(min = 7, max = 7, message = "자치단체코드(7자)")
+ private String sgbCd;
+ /**
+ * 연계대상코드 - varchar 15
+ */
+ @Size(min = 15, max = 15, message = "연계대상코드(15자)")
+ private String linkTrgtCd;
+ /**
+ * 연계관리키 - varchar 50
+ */
+ @Size(min = 50, max = 50, message = "연계관리키(50자)")
+ private String linkMngKey;
+ /**
+ * 연계결과코드 - varchar 30
+ */
+ @Size(max = 30, message = "연계결과코드(~30자)")
+ private String linkRstCd;
+ /**
+ * 연계결과메세지 - varchar 200
+ */
+ @Size(max = 200, message = "연계결과메세지(~200자)")
+ private String linkRstMsg;
+ }
+
+
+
+
+
+
+
+
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ public static class ReqVO1 implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private String sgbCd;
+ private String bldgAcbKey;
+ private String ownrAcbKey;
+ private String rowNo;
+ }
+}
diff --git a/src/main/java/kr/xit/fims/biz/cmm/web/FimsCrackDownMgtController.java b/src/main/java/kr/xit/fims/biz/cmm/web/FimsCrackDownMgtController.java
index 54b1886f..70b80d7d 100644
--- a/src/main/java/kr/xit/fims/biz/cmm/web/FimsCrackDownMgtController.java
+++ b/src/main/java/kr/xit/fims/biz/cmm/web/FimsCrackDownMgtController.java
@@ -41,6 +41,8 @@ public class FimsCrackDownMgtController {
private String rcvBusonlyCctvPath;
@Value("#{prop['file.rcv.natl-newspaper.path']}")
private String rcvNatlNewspaperPath;
+ @Value("#{prop['app.extnl.vhcle.url']}")
+ private String extnlVhcleUrl;
private final IFimsCrackdownMgtService service;
private final IRtCrackdownMgtService rtService;
@@ -50,7 +52,9 @@ public class FimsCrackDownMgtController {
public ModelAndView cmmFimsCrackdownEditPopup(final FimsCrackdownDTO.Request dto){
ModelAndView mav = new ModelAndView();
+ dto.setExtnlVhcleUrl(extnlVhcleUrl);
mav.addObject("param", dto);
+
if(Objects.equals(FimsConst.RegltProcessSttusCode.CRACKDOWN_INIT.getCode(), dto.getRegltProcessSttusCode())) {
mav.addObject("pageTitle", "초기자료 편집");
}else if(Objects.equals(FimsConst.RegltProcessSttusCode.CRACKDOWN.getCode(), dto.getRegltProcessSttusCode())) {
diff --git a/src/main/java/kr/xit/framework/support/util/HttpUtil.java b/src/main/java/kr/xit/framework/support/util/HttpUtil.java
new file mode 100644
index 00000000..0fd7d5d2
--- /dev/null
+++ b/src/main/java/kr/xit/framework/support/util/HttpUtil.java
@@ -0,0 +1,188 @@
+package kr.xit.framework.support.util;
+
+import org.springframework.http.*;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.util.Assert;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class HttpUtil {
+
+ // 헤더
+ private HttpHeaders headers;
+ // 요청 바디 : 쌍
+ private MultiValueMap body;
+ // 타임아웃
+ private HttpComponentsClientHttpRequestFactory factory;
+ // 요청 URL
+ private StringBuilder urlBuilder;
+ private boolean queryStringToken;
+ private String url;
+ // 요청 방식
+ private String method;
+
+ public HttpUtil(){
+ this.headers = new HttpHeaders();
+ this.factory = new HttpComponentsClientHttpRequestFactory();
+ this.factory.setConnectTimeout(5000);
+ this.factory.setReadTimeout(5000);
+ this.body = new LinkedMultiValueMap();
+ this.queryStringToken = true;
+ }
+
+ /**
+ * content-type 설정 : new MediaType 설정 값
+ *
+ * @param type
+ * @param subType
+ * @param charSet
+ * @return
+ */
+ public HttpUtil contentType(String type, String subType, String charSet){
+ this.headers.setContentType(new MediaType(type, subType, Charset.forName(charSet)));
+ return this;
+ }
+
+ /**
+ * connect-timeout 설정
+ * default : 5초
+ *
+ * @param time
+ * @return
+ */
+ public HttpUtil connectTimeout(int time){
+ this.factory.setConnectTimeout(time);
+ return this;
+ }
+
+ /**
+ * read-timeout 설정
+ * default : 5초
+ *
+ * @param time
+ * @return
+ */
+ public HttpUtil readTimeout(int time){
+ this.factory.setReadTimeout(time);
+ return this;
+ }
+
+ /**
+ * 요청 URL 설정
+ *
+ * @param url
+ * @return
+ */
+ public HttpUtil url(String url) {
+ this.urlBuilder = new StringBuilder();
+ urlBuilder.append(url);
+ return this;
+ }
+
+ /**
+ * 쿼리스트링 설정
+ *
+ * @param name
+ * @param value
+ * @return
+ */
+ public HttpUtil queryString(String name, String value) {
+ Assert.notNull(urlBuilder, "url 미입력");
+
+ if(queryStringToken) {
+ urlBuilder.append("?")
+ .append(name)
+ .append("=")
+ .append(value);
+ queryStringToken = false;
+ } else {
+ urlBuilder.append("&")
+ .append(name)
+ .append("=")
+ .append(value);
+ }
+
+ return this;
+ }
+
+ /**
+ * 요청 방식 설정(get, post)
+ *
+ * @param method
+ * @return
+ */
+ public HttpUtil method(String method) {
+ this.method = method.toUpperCase();
+ return this;
+ }
+
+ /**
+ * 요청 헤더 설정
+ *
+ * @param name
+ * @param value
+ * @return
+ */
+ public HttpUtil header(String name, String value){
+ headers.set(name, value);
+ return this;
+ }
+
+ /**
+ * body 요청 파라미터 설정 : key, value
+ *
+ * @param key
+ * @param value
+ * @return
+ */
+ public HttpUtil body(String key, String value){
+ this.body.add(key, value);
+ return this;
+ }
+
+ /**
+ * body 요청 파라미터 설정 : map
+ *
+ * @param params
+ * @return
+ */
+ public HttpUtil body(HashMap params){
+ Iterator itr = params.keySet().iterator();
+ while(itr.hasNext()){
+ String key = itr.next();
+ body.add(key, (String)params.get(key));
+ }
+ return this;
+ }
+
+ /**
+ * HTTP 요청 후 결과 반환(status, header, body)
+ *
+ * @return
+ */
+ public HashMap build(){
+ HashMap result = new HashMap<>();
+
+ RestTemplate restTemplate = new RestTemplate(factory);
+ HttpEntity> entity = new HttpEntity<>(body, headers);
+ url = urlBuilder.toString();
+
+ ResponseEntity response = null;
+ if ("GET".equals(method)){
+ response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
+ } else if("POST".equals(method)) {
+ response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+ }
+
+ result.put("status", response.getStatusCode());
+ result.put("header", response.getHeaders());
+ result.put("body", response.getBody());
+
+ return result;
+ }
+}
diff --git a/src/main/resources/props/local/globals.properties b/src/main/resources/props/local/globals.properties
index 6087ccf2..a08f59ea 100644
--- a/src/main/resources/props/local/globals.properties
+++ b/src/main/resources/props/local/globals.properties
@@ -148,3 +148,5 @@ file.res.root=/Users/minuk/data/fims/extnl/res
#file.res.root=D:/data/fims/extnl/res
file.rcv.natl-newspaper.path=/natl-newspaper
file.rcv.busonly-cctv.path=/busonly
+
+app.extnl.vhcle.url=http://localhost:18090
diff --git a/src/main/webapp/WEB-INF/jsp/fims/biz/cmm/cmmFimsCrackdownEditPopup.jsp b/src/main/webapp/WEB-INF/jsp/fims/biz/cmm/cmmFimsCrackdownEditPopup.jsp
index 6f0cd4ef..9ad1e71a 100644
--- a/src/main/webapp/WEB-INF/jsp/fims/biz/cmm/cmmFimsCrackdownEditPopup.jsp
+++ b/src/main/webapp/WEB-INF/jsp/fims/biz/cmm/cmmFimsCrackdownEditPopup.jsp
@@ -292,6 +292,7 @@ Date Author Description
let regltSeCode = '';
let schParam = null;
+ let extnlVhcleUrl = '';
/* *******************************
* Biz function
@@ -420,22 +421,51 @@ Date Author Description
return false;
}
- // FIXME :: callback 형태로 단속 건수 조회
+
+ ///////////////////////////////////////////////////
+ // FIXME :: 차적조회 연계 완료후 적용
+ ///////////////////////////////////////////////////
+ /*
+ const data = {
+ vhcleNo: $('input[name=vhcleNo]').val(),
+ date: "20220111"
+ }
+
+ let url = extnlVhcleUrl + '/api/v1/vhcle/findVhcle';
cmmAjax({
showSuccessMsg: false
- , url: fimsApiUrl.FIND_CRACKDOWN_VHCLE_NO_CNT
- , data: {vhcleNo: $('input[name=vhcleNo]').val()}
+ , contentType: "application/json"
+ , url
+ , data: JSON.stringify(data)
, success: (res) => {
- fnPopupBiz.showCrackdownVhcleNoCnt(res.data?.contents);
- alert('call 차적조회 인터페이스후 해당 차량번호의 단속건수 조회');
+ alert('차적조회 결과 : \n' + JSON.stringify(res));
+ //$('input[name=vhcleNm]').val(res.vhcleNm);
+ //$('input[name=vhcleColor]').val(res.vhcleColor);
$('input[name=vhcleNm]').val('차량명칭');
$('input[name=vhcleColor]').val('차량색상');
- }
- })
-
-
-
+ */
+ ///////////////////////////////////////////////////
+ // FIXME :: 차적조회 연계 완료후 적용
+ ///////////////////////////////////////////////////
+ alert('차적조회 연계 call')
+ $('input[name=vhcleNm]').val('차량명칭');
+ $('input[name=vhcleColor]').val('차량색상');
+ cmmAjax({
+ showSuccessMsg: false
+ , url: fimsApiUrl.FIND_CRACKDOWN_VHCLE_NO_CNT
+ , data: {vhcleNo: $('input[name=vhcleNo]').val()}
+ , success: (res) => {
+ fnPopupBiz.showCrackdownVhcleNoCnt(res.data?.contents);
+ }
+ })
+
+
+ // }
+ //})
+ ///////////////////////////////////////////////////
+ // FIXME :: 차적조회 연계 완료후 적용
+ ///////////////////////////////////////////////////
}
,callbackEnlightErpp: (data) => {
@@ -702,6 +732,7 @@ Date Author Description
**************************************************************************/
$(document).ready(function(){
+ extnlVhcleUrl = 'http://localhost:18090'
fnPopupBiz.search({
regltId: '${param.regltId}'
,regltSeCode: '${param.regltSeCode}'