diff --git a/pom.xml b/pom.xml index 3aca14e..80cae1e 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,12 @@ 0.0.1-SNAPSHOT + + com.googlecode.json-simple + json-simple + 1.1.1 + + diff --git a/src/main/java/cokr/xit/adds/cmm/model/ApiUtil.java b/src/main/java/cokr/xit/adds/cmm/model/ApiUtil.java index c524135..4eac526 100644 --- a/src/main/java/cokr/xit/adds/cmm/model/ApiUtil.java +++ b/src/main/java/cokr/xit/adds/cmm/model/ApiUtil.java @@ -1,236 +1,105 @@ -// package cokr.xit.adds.cmm.model; -// -// import java.io.FileInputStream; -// import java.io.IOException; -// import java.io.StringReader; -// import java.net.http.HttpResponse; -// import java.time.LocalDate; -// import java.time.format.DateTimeFormatter; -// import java.time.format.DateTimeParseException; -// import java.util.List; -// import java.util.Set; -// -// import javax.validation.ConstraintViolation; -// import javax.validation.Validator; -// import javax.xml.XMLConstants; -// import javax.xml.transform.stream.StreamSource; -// import javax.xml.validation.Schema; -// import javax.xml.validation.SchemaFactory; -// -// import org.apache.commons.lang3.ObjectUtils; -// import org.apache.commons.lang3.StringUtils; -// import org.json.simple.JSONObject; -// import org.springframework.http.HttpHeaders; -// import org.xml.sax.SAXException; -// -// import com.fasterxml.jackson.core.type.TypeReference; -// -// import cokr.xit.adds.core.spring.exception.ApiCustomException; -// import cokr.xit.foundation.data.JSON; -// import cokr.xit.foundation.web.WebClient; -// -// /** -// *
-//  * description :
-//  *
-//  * author      : limju
-//  * date        : 2024-04-04
-//  * ======================================================================
-//  * 변경일         변경자        변경 내용
-//  * ----------------------------------------------------------------------
-//  * 2024-04-04    limju       최초 생성
-//  *
-//  * 
-// */ -// public class ApiUtil { -// -// /** -// * 유효성 검증 -// * errList가 null인 경우 유효성 검증 실패 시 예외 throw ApiCustomException -// * -// * @param t validatable object -// * @param errList error list -// * @param validator validator -// */ -// public static void validate(final T t, final List errList, final Validator validator) { -// final Set> list = validator.validate(t); -// -// if(!list.isEmpty()) { -// final List errors = list.stream() -// .map(row -> String.format("%s=%s", row.getPropertyPath(), row.getMessageTemplate())) -// .toList(); -// -// // 추가적인 유효성 검증이 필요 없는 경우 -// if(errList == null){ -// if(!errors.isEmpty()) throw ApiCustomException.create(errors.toString()); -// return; -// } -// errList.addAll(errors); -// } -// } -// -// public static void checkYmdError(String dt, String fieldName) { -// String msg = "유효한 일자가 아닙니다."; -// if(ObjectUtils.isEmpty(fieldName)){ -// msg = "ymd=" + msg; -// }else{ -// msg = fieldName + "=" + msg; -// } -// try { -// final LocalDate rdt = LocalDate.parse(dt, DateTimeFormatter.ofPattern("yyyyMMdd")); -// if(!dt.equals(DateTimeFormatter.ofPattern("yyyyMMdd").format(rdt))){ -// throw ApiCustomException.create(msg); -// } -// } catch (DateTimeParseException e) { -// throw ApiCustomException.create(msg); -// } -// } -// -// public static void checkDatetimeError(String dt, String fieldName) { -// String msg = "유효한 일시가 아닙니다."; -// if(ObjectUtils.isEmpty(fieldName)){ -// msg = "ymd=" + msg; -// }else{ -// msg = fieldName + "=" + msg; -// } -// try { -// final LocalDate rdt = LocalDate.parse(dt, DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); -// if(!dt.equals(DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(rdt))){ -// throw ApiCustomException.create(msg); -// } -// } catch (DateTimeParseException e) { -// throw ApiCustomException.create(msg); -// } -// } -// -// /** -// * NimsApi 호출 - x-www-form-urlencoded 방식 -// * @param uri String -// * @param cls T -// * @return String -// */ -// public static String callNimsApi(String uri, T cls) { -// HttpResponse rslt = new WebClient().post(request -> { -// request.contentType(WebClient.Request.ContentType.FORM); -// request.uri(uri); -// toData(request, cls); -// }); -// return rslt.body(); -// } -// -// /** -// * irosApi 호출 - x-www-form-urlencoded 방식 -// * @param uri String -// * @param param String -// * @return String -// */ -// public static String callIrosApi(String uri, String param) { -// HttpResponse rslt = new WebClient().get(request -> { -// request.header(HttpHeaders.CONTENT_TYPE, "application/json"); -// request.contentType(WebClient.Request.ContentType.FORM); -// request.uri(uri + param); -// }); -// return rslt.body(); -// } -// -// /** -// * Object -> data로 변환 -// * @param request WebClient.Request -// * @param obj Object -// */ -// public static void toData(final WebClient.Request request, final Object obj){ -// if(ObjectUtils.isEmpty(obj)) return; -// -// JSONObject jsonObj = toObjByObj(obj, JSONObject.class); -// for (Object key : jsonObj.keySet()) { -// // API 호출 시 필요없는 파라메터 제외 -// if("userId".equals(key) || "dbSkipYn".equals(key)) continue; -// request.data((String) key, ObjectUtils.isEmpty(jsonObj.get(key))? StringUtils.EMPTY: jsonObj.get(key)); -// } -// } -// -// /** -// * Object -> class로 변환 -// * @param obj Object -// * @param cls Class -// * @return T -// */ -// public static T toObjByObj(final Object obj, final Class cls) { -// try { -// return ObjectUtils.isNotEmpty(obj)? new JSON().getObjectMapper().convertValue(obj, cls) : null; -// } catch (IllegalArgumentException e) { -// throw ApiCustomException.create(e.getLocalizedMessage()); -// } -// } -// -// /** -// * Object -> TypeReference로 변환 -// * @param obj Object -// * @param typeRef TypeReference -// * @return T -// */ -// public static T toObjByObj(final Object obj, final TypeReference typeRef) { -// try { -// return ObjectUtils.isNotEmpty(obj)? new JSON().getObjectMapper().convertValue(obj, typeRef) : null; -// } catch (IllegalArgumentException e) { -// throw ApiCustomException.create(e.getLocalizedMessage()); -// } -// } -// -// /** -// * XML 유효성 검증 -// * @param xmlStr String -// * @param xsdFilePathName String -// * @return boolean -// */ -// public static boolean validateXml(final String xmlStr, final String xsdFilePathName) { -// try { -// FileInputStream fis = new FileInputStream(xsdFilePathName); -// SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); -// Schema schema = sf.newSchema(new StreamSource(fis)); -// -// javax.xml.validation.Validator validator = schema.newValidator(); -// validator.validate(new StreamSource(new StringReader(xmlStr))); -// return true; -// -// } catch (SAXException | IOException e) { -// throw ApiCustomException.create(e.getMessage()); -// } -// } -// -// /** -// * XML 유효성 검증 -// * @param xmlStr String -// * @param xsdFilePath String -// * @return boolean -// */ -// public static boolean validateXmlFromXmlStr(final String xmlStr, final String xsdFilePath) { -// try { -// FileInputStream fis = new FileInputStream(xsdFilePath); -// SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); -// Schema schema = sf.newSchema(new StreamSource(fis)); -// -// javax.xml.validation.Validator validator = schema.newValidator(); -// validator.validate(new StreamSource(new StringReader(xmlStr))); -// return true; -// -// } catch (SAXException | IOException e) { -// throw ApiCustomException.create(e.getMessage()); -// } -// } -// -// /** -// * XML 유효성 검증 -// * @param xmlFilePath String -// * @param xsdFilePath String -// * @return boolean -// */ -// public static boolean validateXmlFromFile(String xmlFilePath, final String xsdFilePath) { -// try (FileInputStream fileInputStream = new FileInputStream(xmlFilePath)) { -// byte[] bytes = fileInputStream.readAllBytes(); -// return validateXmlFromXmlStr(new String(bytes), xsdFilePath); -// }catch (IOException e) { -// throw ApiCustomException.create(e.getMessage()); -// } -// } -// } +package cokr.xit.adds.cmm.model; + +import java.net.http.HttpResponse; + +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; +import org.springframework.http.HttpHeaders; + +import com.fasterxml.jackson.core.type.TypeReference; + +import cokr.xit.foundation.data.JSON; +import cokr.xit.foundation.web.WebClient; + +/** + *
+ * description :
+ *
+ * author      : limju
+ * date        : 2024-04-04
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2024-04-04    limju       최초 생성
+ *
+ * 
+ */ +public class ApiUtil { + + + /** + * NimsApi 호출 - x-www-form-urlencoded 방식 + * @param uri String + * @param cls T + * @return String + */ + public static String callNimsApi(String uri, T cls) { + HttpResponse rslt = new WebClient().post(request -> { + request.contentType(WebClient.Request.ContentType.FORM); + request.uri(uri); + toData(request, cls); + }); + return rslt.body(); + } + + /** + * irosApi 호출 - x-www-form-urlencoded 방식 + * @param uri String + * @param param String + * @return String + */ + public static String callIrosApi(String uri, String param) { + HttpResponse rslt = new WebClient().get(request -> { + request.header(HttpHeaders.CONTENT_TYPE, "application/json"); + request.contentType(WebClient.Request.ContentType.FORM); + request.uri(uri + param); + }); + return rslt.body(); + } + + /** + * Object -> data로 변환 + * @param request WebClient.Request + * @param obj Object + */ + public static void toData(final WebClient.Request request, final Object obj){ + if(ObjectUtils.isEmpty(obj)) return; + + JSONObject jsonObj = toObjByObj(obj, JSONObject.class); + for (Object key : jsonObj.keySet()) { + // API 호출 시 필요없는 파라메터 제외 + request.data((String) key, ObjectUtils.isEmpty(jsonObj.get(key))? StringUtils.EMPTY: jsonObj.get(key)); + } + } + + /** + * Object -> class로 변환 + * @param obj Object + * @param cls Class + * @return T + */ + public static T toObjByObj(final Object obj, final Class cls) { + try { + return ObjectUtils.isNotEmpty(obj)? new JSON().getObjectMapper().convertValue(obj, cls) : null; + } catch (IllegalArgumentException e) { + //throw new Exception(e.getLocalizedMessage()); + return null; + } + } + + /** + * Object -> TypeReference로 변환 + * @param obj Object + * @param typeRef TypeReference + * @return T + */ + public static T toObjByObj(final Object obj, final TypeReference typeRef) { + try { + return ObjectUtils.isNotEmpty(obj)? new JSON().getObjectMapper().convertValue(obj, typeRef) : null; + } catch (IllegalArgumentException e) { + //throw ApiCustomException.create(e.getLocalizedMessage()); + return null; + } + } +} diff --git a/src/main/java/cokr/xit/adds/cmm/model/NimsApiRequest.java b/src/main/java/cokr/xit/adds/cmm/model/NimsApiRequest.java new file mode 100644 index 0000000..90b4d5f --- /dev/null +++ b/src/main/java/cokr/xit/adds/cmm/model/NimsApiRequest.java @@ -0,0 +1,346 @@ +package cokr.xit.adds.cmm.model; + +import org.apache.commons.lang3.StringUtils; + +import lombok.Data; + +/** + *
+ * description :
+ *
+ * packageName : cokr.xit.adds.inf.nims.model
+ * fileName    : NimsApiRequest
+ * author      : limju
+ * date        : 2024-03-21
+ * ======================================================================
+ * 변경일         변경자        변경 내용
+ * ----------------------------------------------------------------------
+ * 2024-03-21    limju       최초 생성
+ *
+ * 
+ */ + +public class NimsApiRequest { + /** + * 마약류 취급자 정보 조회 request + */ + @Data + public static class BsshInfoReq { + + /** + * 인증키 + */ + private String k; + + /** + * 조회범위 + * 1-전체, 2-내거래처 + */ + private String fg; + + /** + * 조회 페이지 + */ + private String pg; + + /** + * 사업자 등록 번호 + */ + private String bi; + + /** + * 요양기관번호 + */ + private String hp; + + /** + * 업체명(like 검색) + */ + private String bn; + + /** + * 취급자식별번호 + * 보고자의 마약류취급자 식별번호 + */ + private String bc; + + /** + * 기준일자 이후 + * yyyyMMdd + */ + private String ymd; + + /** + *
+         * 조회범위2
+         * 1:NK(취급승인)포함 - default
+         * 2:NK(취급승인)제외
+         * 
+ */ + private String fg2 = "1"; + + /** + *
+         * DB 조회 skip 여부
+         * DB먼저 조회 하고 없는 경우 NIMS API 조회 호출
+         * true 인 경우 DB 조회 skip
+         * 
+ */ + private String dbSkipYn = "N"; + + /** + *
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String userId; + } + + /** + * 상품 정보 조회 request + */ + @Data + public static class ProductInfoReq { + /** + * 인증키 + */ + private String k; + + /** + * 조회범위 + * 1-전체, 2-내거래품목, 3-청구코드매핑 + */ + private String fg; + + /** + * 조회 페이지 + */ + private String pg; + + /** + * 기준일자 이후 + * yyyyMMdd + */ + private String ymd; + + /** + * 중점/일반 구분 + * 1:중점 + * 2:일반 + */ + private String fg2; + + /** + * 제품코드 + * 제품코드(like 검색) + * 조회범위(pg)가 3인 경우 청구 코드 + */ + private String p; + + /** + * 제품명(like 검색) + */ + private String pn; + + /** + *
+         * DB 조회 skip 여부
+         * DB먼저 조회 하고 없는 경우 NIMS API 조회 호출
+         * true 인 경우 DB 조회 skip
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String dbSkipYn = "N"; + + /** + *
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String userId; + } + + @Data + public static class DsuseRptInfoReq { + /** + * 인증키 + */ + private String k; + + /** + * 조회기준일자(1-보고일,2-취급일) + * 1-보고일자 : 병의원에서 NIMS에 폐기 보고한 날짜 - 본 시스템에서는 사용하지 않음 + * 2-취급일자 + */ + private String fg = "2"; + + /** + * 조회 페이지 + */ + private String pg; + + /** + * 보고유형 + * 빈값 : 전체 + * 0: 신규, 1: 취소, 2: 변경 + */ + private String fg2; + + /** + * 보고구분코드 + * AAR - 폐기보고 고정 + */ + private String se = "AAR"; + + /** + * 조회 시작일(yyyyMMdd) + * 최대 1개월 + */ + private String sdt; + + /** + * 조회 종료일(yyyyMMdd) + * 최대 1개월 + */ + private String edt; + + /** + * 마약류 취급자 식별 번호 + */ + private String bc; + + /** + * 업체명 + */ + private String bn; + + /** + * 사용자 보고 식별 번호 + */ + private String ur; + + /** + * 폐기 보고 상태 + * "": 전체, 01: 확인, 02: 보류, 03: 정정, 04: 미처리 + */ + private String ps; + + /** + *
+         * 관할관청기관코드
+         * 4050147 - 처인구보건소
+         * 4050148 - 기흥구보건소
+         * 4050149 - 수지구보건소
+         * 
+ */ + private String gc; + + /** + *
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String userId; + } + + /** + * 제품 일련 번호 정보 조회 request + */ + @Data + public static class MnfSeqInfoReq { + /** + * 인증키 + */ + private String k; + + /** + * 조회범위 : 실제는 동일 + * 1-제조번호, 2-일련번호, 3-바코드/RFID + */ + private String fg; + + /** + * 조회 페이지 + */ + private String pg; + + /** + * 제품코드 + * 제품코드(like 검색) + * 조회범위(pg)가 3인 경우 청구 코드 + */ + private String p; + + + /** + * 기준일자 이후 + * yyyyMMdd + */ + private String ymd; + + /** + * 제품코드 : like 검색 - 오류 -> 사용하지 말것 + */ + private String t = StringUtils.EMPTY; + + /** + *
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String userId; + } + + /** + * 관할 허가 관청 정보 조회 request + */ + @Data + public static class JurisdictionGovInfoReq { + /** + * 인증키 + */ + private String k; + + /** + * 조회범위 + * 1-전체 + */ + private String fg; + + /** + * 조회 페이지 + */ + private String pg; + + /** + * 기관명 + */ + private String onm; + + /** + * 기관 코드 + */ + private String ocd; + + /** + * 주소 + */ + private String adr; + + /** + *
+         * DB 조회 skip 여부
+         * DB먼저 조회 하고 없는 경우 NIMS API 조회 호출
+         * true 인 경우 DB 조회 skip
+         * 
+ */ + private String dbSkipYn = "N"; + + /** + *
+         * 업무상 필요에 의해 추가
+         * 
+ */ + private String userId; + } +} diff --git a/src/main/java/cokr/xit/adds/nims/web/AddsNimsController.java b/src/main/java/cokr/xit/adds/nims/web/AddsNimsController.java index 87009d3..a874057 100644 --- a/src/main/java/cokr/xit/adds/nims/web/AddsNimsController.java +++ b/src/main/java/cokr/xit/adds/nims/web/AddsNimsController.java @@ -12,16 +12,23 @@ import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; +import net.minidev.json.JSONObject; +import net.minidev.json.parser.ParseException; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import cokr.xit.adds.cmm.model.ApiBaseResponse; +import cokr.xit.adds.cmm.model.ApiUtil; import cokr.xit.adds.cmm.model.DsuseMappingInfo; import cokr.xit.adds.cmm.model.DsuseReceiptDtl; import cokr.xit.adds.cmm.model.DsuseRsltInfo; +import cokr.xit.adds.cmm.model.NimsApiRequest; import cokr.xit.adds.cmmn.hwp.format.DisposeProcessDetails; import cokr.xit.adds.cmmn.hwp.format.DisposeResultReport; import cokr.xit.adds.nims.DsuseMgtDocQuery; @@ -42,8 +49,6 @@ import cokr.xit.base.web.ApplicationController; import cokr.xit.foundation.data.DataObject; import cokr.xit.foundation.data.JSON; import cokr.xit.foundation.web.WebClient; -import net.minidev.json.JSONObject; -import net.minidev.json.parser.ParseException; @Controller @RequestMapping( @@ -57,6 +62,12 @@ public class AddsNimsController extends ApplicationController { @Value("${app.file.root.path}") private String fileRootPath; + @Value("${app.inf.nims.api.bsshInfo}") + private String bsshInfoEndpoint; + + @Value("${app.inf.nims.api.productAndseqInfo}") + private String productAndseqInfoEndpoint; + @Resource(name="defaultOgdpBean") private DefaultOgdpBean defaultOgdpBean; @@ -69,6 +80,7 @@ public class AddsNimsController extends ApplicationController { @Resource(name="fileService") private FileService fileService; + private JSON json = new JSON(); //------------------------------------------------------------------------------------------------- // 신청서 접수 //------------------------------------------------------------------------------------------------- @@ -470,8 +482,21 @@ public class AddsNimsController extends ApplicationController { //------------------------------------------------------------------------------------------------- //TODO : 서버통신으로 변경 할것 - @RequestMapping(name="마약류폐기 신청서 접수 조회", value="") - public ModelAndView getbsshList(ProductQuery query) throws JsonProcessingException, ParseException { + @RequestMapping(value = "/getNimsProductInfoKdAndMnfSeqInfo.do", name="제품 & 시리얼번호 검색", produces = "application/json;charset=UTF-8") + public @ResponseBody ApiBaseResponse> getNimsProductInfoKdAndMnfSeqInfo(@ModelAttribute NimsApiRequest.ProductInfoReq dto) throws JsonProcessingException, ParseException { + String rslt = ApiUtil.callNimsApi(apiHost + productAndseqInfoEndpoint, dto); + return json.parse(rslt, new TypeReference<>() {}); + } + + @RequestMapping(value = "/getNimsBsshInfoSt.do", name="업체(마약류취급자) 검색", produces = "application/json;charset=UTF-8") + public @ResponseBody ApiBaseResponse> getNimsBsshInfoSt(@ModelAttribute NimsApiRequest.BsshInfoReq dto) throws JsonProcessingException, ParseException { + String rslt = ApiUtil.callNimsApi(apiHost + bsshInfoEndpoint, dto); + return json.parse(rslt, new TypeReference<>() {}); + } + + //TODO : 서버통신으로 변경 할것 + @RequestMapping(name="업체(마약류취급자) 검색", value="") + public ModelAndView getbsshList2(ProductQuery query) throws JsonProcessingException, ParseException { ModelAndView mav = new ModelAndView(); JSON json = new JSON(); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b6d47fd..1876d98 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -52,6 +52,22 @@ app: file: root: path: ${app.data.root.path}/files/ + inf: + nims: + api: + # 업체(마약류 취급자) 조회 + bsshInfo: /api/biz/nims/v1/getNimsBsshInfoSt + # 제품 조회 + productInfo: /api/biz/nims/v1/getNimsProductInfoKd + # 제품 & 시리얼 번호 조회 + productAndseqInfo: /api/biz/nims/v1/getNimsProductInfoKdAndMnfSeqInfo + # 제품 시리얼 번호 조회 + seqInfo: /api/biz/nims/v1/getNimsMnfSeqInfo + # 관할관청 조회 + jurisdictionGovInfo: /api/biz/nims/v1/getNimsJurisdictionGovInfo + # 폐기보고 조회 + nimsDsuseRptInfo: /api/biz/nims/v1/getNimsDsuseRptInfo + logging: file: diff --git a/src/main/webapp/WEB-INF/jsp/adds/nims/bssh-popup.jsp b/src/main/webapp/WEB-INF/jsp/adds/nims/bssh-popup.jsp index 06cbd8f..c9754a1 100644 --- a/src/main/webapp/WEB-INF/jsp/adds/nims/bssh-popup.jsp +++ b/src/main/webapp/WEB-INF/jsp/adds/nims/bssh-popup.jsp @@ -39,13 +39,13 @@ - 취급자번호 + 취급자번호 취급업체명 업종명 - 대표자 - 허가번호 - 구분 - 담당자명 + 대표자 + 허가번호 + 담당자명 + 구분 @@ -58,8 +58,8 @@ {indutyNm} {rprsntvNm} {prmisnNo} - {hdntCd} {chrgNm} + {hdntNm}