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}'