shjung 1 年之前
父節點
當前提交
329a3a900a
共有 18 個文件被更改,包括 558 次插入37 次删除
  1. 108 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/ArpltnInforInqire.java
  2. 168 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/MsrStnAcctoRltmMesureDnsty.java
  3. 13 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpBody.java
  4. 9 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpHeader.java
  5. 40 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpItem.java
  6. 9 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpResponse.java
  7. 8 0
      src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpRoot.java
  8. 3 2
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/VilageFcstInfo.java
  9. 6 6
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtFcstItem.java
  10. 6 6
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtNcstItem.java
  11. 5 5
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageBody.java
  12. 2 2
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageHeader.java
  13. 9 9
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItem.java
  14. 1 1
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItems.java
  15. 2 2
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageResponse.java
  16. 1 1
      src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageRoot.java
  17. 152 1
      src/main/java/com/its/wthr/service/AtmpService.java
  18. 16 2
      src/test/java/com/its/wthr/WthrCommServerApplicationTests.java

+ 108 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/ArpltnInforInqire.java

@@ -0,0 +1,108 @@
+package com.its.wthr.openApi.arpltnInforInqireService;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+@Slf4j
+public class ArpltnInforInqire {
+
+    public String lookUpApi(StringBuilder urlBuilder) {
+        String result = "";
+        try {
+            URL url = new URL(urlBuilder.toString());
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(10000);   //The timeout in mills
+            conn.setRequestMethod("GET");
+            conn.setRequestProperty("Content-type", "application/json");
+
+            log.info("ArpltnInforInqire.lookUpApi: Response code, {}.", conn.getResponseCode());
+
+            BufferedReader rd;
+            if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
+                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+            } else {
+                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
+            }
+
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = rd.readLine()) != null) {
+                sb.append(line);
+            }
+            rd.close();
+            conn.disconnect();
+            result = sb.toString();
+        } catch (MalformedURLException e) {
+            log.error("ArpltnInforInqire.lookUpApi: MalformedURLException Error: {}", e.getMessage());
+        } catch (IOException e) {
+            log.error("ArpltnInforInqire.lookUpApi: IOException Error: {}", e.getMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 항목별 Grade 값 의미
+     * 적용 항목명 : khaiGrade, so2Grade, coGrade, o3Grade, no2Grade, pm10Grade, pm25Grade, pm25Grade1h, pm25Grade1h
+     * @param grade
+     * @return
+     */
+    public String getGradeDesc(String grade) {
+        if (grade == null) {
+            return "-";
+        }
+        String value = grade.trim();
+        if ("1".equals(value)) {
+            return "좋음";
+        }
+        if ("2".equals(value)) {
+            return "보통";
+        }
+        if ("3".equals(value)) {
+            return "나쁨";
+        }
+        if ("4".equals(value)) {
+            return "매우나쁨";
+        }
+        return "-";
+    }
+    /**
+     * 요청의 응답코드에 대한 오류메시지를 구한다.
+     * @param errorCode
+     * @return
+     */
+    public String getErrorMessage(String errorCode) {
+        String errorMessage = errorCode + ": 알수없는 오류코드";
+        int error = -99;
+        try {
+            error = Integer.parseInt(errorCode);
+        } catch (NumberFormatException e) {
+            return errorMessage;
+        }
+        switch(error) {
+            case  0: errorMessage = error + ": NORMAL_SERVICE, 정상"; break;
+            case  1: errorMessage = error + ": APPLICATION_ERROR, 어플리케이션 에러"; break;
+            case  2: errorMessage = error + ": DB_ERROR, 데이터베이스 에러"; break;
+            case  3: errorMessage = error + ": NODATA_ERROR, 데이터없음 에러"; break;
+            case  4: errorMessage = error + ": HTTP_ERROR, HTTP 에러"; break;
+            case  5: errorMessage = error + ": SERVICETIME_OUT, 서비스 연결실패 에러"; break;
+            case 10: errorMessage = error + ": INVALID_REQUEST_PARAMETER_ERROR, 잘못된 요청 파라메터 에러"; break;
+            case 11: errorMessage = error + ": NO_MANDATORY_REQUEST_PARAMETERS_ERROR, 필수요청 파라메터가 없음"; break;
+            case 12: errorMessage = error + ": NO_OPENAPI_SERVICE_ERROR, 해당 오픈 API 서비스가 없거나 폐기됨"; break;
+            case 20: errorMessage = error + ": SERVICE_ACCESS_DENIED_ERROR, 서비스 접근거부"; break;
+            case 22: errorMessage = error + ": LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR, 서비스 요청제한횟수 초과에러"; break;
+            case 30: errorMessage = error + ": SERVICE_KEY_IS_NOT_REGISTERED_ERROR, 등록되지 않은 서비스키"; break;
+            case 31: errorMessage = error + ": DEADLINE_HAS_EXPIRED_ERROR, 기한만료된 서비스키"; break;
+            case 32: errorMessage = error + ": UNREGISTERED_IP_ERROR, 등록되지 않은 IP"; break;
+            case 34: errorMessage = error + ": UNREGISTERED_REPORT, 보고서가 등록 되지 않음"; break;
+            default: errorMessage = error + ": 알수없는 오류코드"; break;
+        }
+        return errorMessage;
+    }
+
+}

+ 168 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/MsrStnAcctoRltmMesureDnsty.java

@@ -0,0 +1,168 @@
+package com.its.wthr.openApi.arpltnInforInqireService;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.wthr.openApi.arpltnInforInqireService.entity.AtmpItem;
+import com.its.wthr.openApi.arpltnInforInqireService.entity.AtmpRoot;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+@Slf4j
+@Getter
+public class MsrStnAcctoRltmMesureDnsty extends ArpltnInforInqire {
+
+    private int errorCode;
+    private String errorMsg;
+    private AtmpItem item = null;
+
+    public boolean getMsrStnAcctoRltmMesureDnsty(String apiServiceKey, String sttnName, String apiVersion) {
+        this.item = null;
+
+        //            https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty
+        //            ?serviceKey=2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D
+        //            &returnType=json
+        //            &numOfRows=100
+        //            &pageNo=1
+        //            &stationName=%EB%AA%85%EB%A5%9C%EB%8F%99
+        //            &dataTerm=DAILY
+        //            &ver=1.3
+        String apiUrl = "https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty";
+        String returnType = "json";
+
+        StringBuilder urlBuilder = new StringBuilder(apiUrl);
+        try {
+            urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + apiServiceKey);
+            urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode(returnType, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("100", "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8"));;
+            urlBuilder.append("&" + URLEncoder.encode("stationName","UTF-8") + "=" + URLEncoder.encode(sttnName, "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("dataTerm","UTF-8") + "=" + URLEncoder.encode("DAILY", "UTF-8"));
+            urlBuilder.append("&" + URLEncoder.encode("ver","UTF-8") + "=" + URLEncoder.encode(apiVersion, "UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            this.errorCode = -99;
+            this.errorMsg = "UnsupportedEncodingException.";
+            log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: {}, UnsupportedEncodingException {}", sttnName, e.getMessage());
+            return false;
+        }
+        log.info("{}", urlBuilder);
+        String result = lookUpApi(urlBuilder);
+        if (result.isEmpty()) {
+            this.errorCode = -99;
+            this.errorMsg = "데이터 수신 오류.";
+            log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: Http Get Error, {}, {}", sttnName, this.errorMsg);
+            return false;
+        }
+
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            AtmpRoot response = mapper.readValue(result, AtmpRoot.class);
+            if (!"00".equals(response.getResponse().getHeader().getResultCode())) {
+                this.errorCode = -99;
+                this.errorMsg = getErrorMessage(response.getResponse().getHeader().getResultCode());
+                log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: Recv Data Include ErrorCode, {}, {}, {}", sttnName, response.getResponse().getHeader().getResultCode(), this.errorMsg);
+                return false;
+            }
+            if (response.getResponse().getBody().getItems() == null || response.getResponse().getBody().getItems().isEmpty()) {
+                this.errorCode = -99;
+                this.errorMsg = "Response Item Data is empty.";
+                log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: Recv Data Item Empty, {}, {}", sttnName, this.errorMsg);
+                return false;
+            }
+            this.errorCode = 0;
+            this.errorMsg = "Success.";
+
+            for (int ii = 0; ii < response.getResponse().getBody().getItems().size(); ii++) {
+                AtmpItem obj = response.getResponse().getBody().getItems().get(ii);
+                if (obj.getPm10Value24() == null) {
+                    obj.setPm10Value24("");
+                }
+                if (obj.getPm25Value() == null) {
+                    obj.setPm25Value("");
+                }
+                if (obj.getPm25Value24() == null) {
+                    obj.setPm25Value24("");
+                }
+                if (obj.getPm25Grade() == null) {
+                    obj.setPm25Grade("");
+                }
+                if (obj.getPm10Grade1h() == null) {
+                    obj.setPm10Grade1h("");
+                }
+                if (obj.getPm25Grade1h() == null) {
+                    obj.setPm25Grade1h("");
+                }
+
+                if (obj.getSo2Flag() == null) {
+                    obj.setSo2Flag("");
+                }
+                if (obj.getCoFlag() == null) {
+                    obj.setCoFlag("");
+                }
+                if (obj.getO3Flag() == null) {
+                    obj.setO3Flag("");
+                }
+                if (obj.getNo2Flag() == null) {
+                    obj.setNo2Flag("");
+                }
+                if (obj.getPm10Flag() == null) {
+                    obj.setPm10Flag("");
+                }
+                if (obj.getPm25Flag() == null) {
+                    obj.setPm25Flag("");
+                }
+
+                String msrmDt = obj.getDataTime().trim();   // YYYY-MM-DD HH:MM
+                msrmDt = msrmDt.replaceAll("-", "");
+                msrmDt = msrmDt.replaceAll(":", "");
+                msrmDt = msrmDt.replaceAll(" ", "");
+                msrmDt = msrmDt  + "00";
+                obj.setDataTime(msrmDt);
+                String HH = msrmDt.substring(8, 10);
+                if (HH.equals("24")) {
+                    // 24시인경우 날짜가 변경되지 않고 24로 넘어오기 때문에 00시로 바꿔주기위해...
+                    SimpleDateFormat sdformat = new SimpleDateFormat("yyyyMMddHHmmss");
+                    String sDateTime = msrmDt.substring(0,8) + "230000";
+                    Date date = null;
+                    try {
+                        date = sdformat.parse(sDateTime);
+                    } catch (ParseException e) {
+                        log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: {}, ParseException exception.", sttnName);
+                        continue;
+                    }
+                    Calendar cal = Calendar.getInstance();
+                    cal.setTime(date);
+                    cal.add(Calendar.HOUR, 1);
+                    msrmDt = new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+                }
+                obj.setDataTime(msrmDt);
+            }
+
+            /**
+             * 가장 최근 데이터를 구한다.
+             */
+            int lastIdx = 0;
+            this.item = response.getResponse().getBody().getItems().get(lastIdx);
+            long lastDateTime = Long.parseLong(item.getDataTime());
+            for (int ii = 1; ii < response.getResponse().getBody().getItems().size(); ii++) {
+                AtmpItem obj = response.getResponse().getBody().getItems().get(ii);
+                long currDateTime = Long.parseLong(obj.getDataTime());
+                if (currDateTime > lastDateTime) {
+                    lastIdx = ii;
+                }
+            }
+            this.item = response.getResponse().getBody().getItems().get(lastIdx);
+        } catch (JsonProcessingException e) {
+            this.errorMsg = "JsonProcessingException.";
+            log.error("MsrStnAcctoRltmMesureDnsty.getMsrStnAcctoRltmMesureDnsty: {}, JsonProcessingException, {}", sttnName, e.getMessage());
+            return false;
+        }
+        return true;
+    }
+}

+ 13 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpBody.java

@@ -0,0 +1,13 @@
+package com.its.wthr.openApi.arpltnInforInqireService.entity;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+
+@Data
+public class AtmpBody {
+    private int numOfRows;               // 한 페이지 결과 수
+    private int pageNo;                  // 페이지 번호
+    private int totalCount;              // 전체 결과 수
+    private ArrayList<AtmpItem> items;   // 목록, 옵션
+}

+ 9 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpHeader.java

@@ -0,0 +1,9 @@
+package com.its.wthr.openApi.arpltnInforInqireService.entity;
+
+import lombok.Data;
+
+@Data
+public class AtmpHeader {
+    private String resultCode;   // 결과코드
+    private String resultMsg;    // 결과메시지
+}

+ 40 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpItem.java

@@ -0,0 +1,40 @@
+package com.its.wthr.openApi.arpltnInforInqireService.entity;
+
+import lombok.Data;
+
+/**
+ * 측정소별 실시간 측정정보 조회 Item
+ */
+@Data
+public class AtmpItem {
+    private String dataTime;         // 측정일, 오염도측정 연-월-일 시간:분, 2020-11-25 13:00
+    private String mangName;         // 측정망 정보, 측정망 정보(도시대기, 도로변대기, 국가배경농도, 교외대기, 항만), 도시대기
+
+    private String so2Value;         // 아황산가스 농도(단위: ppm), 0.007
+    private String coValue;          // 일산화탄소 농도(단위: ppm), 0.4
+    private String o3Value;          // 오존 농도(단위: ppm), 0.043
+    private String no2Value;         // 이산화질소 농도(단위: ppm), 0.024
+    private String pm10Value;        // 미세먼지(PM10) 농도(단위: ug/m3), 73
+    private String pm10Value24;      // - 미세먼지(PM10) 24시간 예측이동농도(단위: ug/m3), 55, 옵션
+    private String pm25Value;        // - 초미세먼지(PM2.5) 농도(단위: ug/m3), 44, 옵션
+    private String pm25Value24;      // - 초미세먼지(PM2.5) 24시간 예측이동농도(단위: ug/m3), 31, 옵션
+    private String khaiValue;        // 통합대기환경수치, 2
+
+    private String khaiGrade;        // 통합대기환경지수, 2
+    private String so2Grade;         // 아황산가스 지수, 1
+    private String coGrade;          // 일산화탄소 지수, 1
+    private String o3Grade;          // 오존 지수, 2
+    private String no2Grade;         // 이산화질소 지수, 1
+    private String pm10Grade;        // 미세먼지(PM10) 24시간 등급자료, 2
+    private String pm25Grade;        // - 초미세먼지(PM2.5) 24시간 등급자료, 2, 옵션
+    private String pm10Grade1h;      // - 미세먼지(PM10) 1시간 등급자료, 2, 옵션
+    private String pm25Grade1h;      // - 초미세먼지(PM2.5) 1시간 등급자료, 2, 옵션
+
+    private String so2Flag;          // 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 점검 및 교정
+    private String coFlag;           // 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 점검 및 교정
+    private String o3Flag;           // 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 점검 및 교정
+    private String no2Flag;          // 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 점검 및 교정
+    private String pm10Flag;         // 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 점검 및 교정
+    private String pm25Flag;         // - 측정자료 상태정보(점검및교정, 장비점검, 자료이상, 통신장애), 자료이상, 옵션
+
+}

+ 9 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpResponse.java

@@ -0,0 +1,9 @@
+package com.its.wthr.openApi.arpltnInforInqireService.entity;
+
+import lombok.Data;
+
+@Data
+public class AtmpResponse {
+    private AtmpBody body;
+    private AtmpHeader header;
+}

+ 8 - 0
src/main/java/com/its/wthr/openApi/arpltnInforInqireService/entity/AtmpRoot.java

@@ -0,0 +1,8 @@
+package com.its.wthr.openApi.arpltnInforInqireService.entity;
+
+import lombok.Data;
+
+@Data
+public class AtmpRoot {
+    private AtmpResponse response;
+}

+ 3 - 2
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/VilageFcstInfo.java

@@ -191,6 +191,7 @@ public class VilageFcstInfo {
     }
 
     public String lookUpApi(StringBuilder urlBuilder) {
+        String result = "";
         try {
             URL url = new URL(urlBuilder.toString());
             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
@@ -213,13 +214,13 @@ public class VilageFcstInfo {
             }
             rd.close();
             conn.disconnect();
-            return sb.toString();
+            result = sb.toString();
         } catch (MalformedURLException e) {
             log.error("MalformedURLException Error: {}", e.getMessage());
         } catch (IOException e) {
             log.error("IOException Error: {}", e.getMessage());
         }
-        return null;
+        return result;
     }
 
 }

+ 6 - 6
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtFcstItem.java

@@ -7,10 +7,10 @@ import lombok.Data;
  */
 @Data
 public class SrtFcstItem {
-    public String baseDate;
-    public String baseTime;
-    public String category;
-    public int nx;
-    public int ny;
-    public String obsrValue;
+    private String baseDate;
+    private String baseTime;
+    private String category;
+    private int nx;
+    private int ny;
+    private String obsrValue;
 }

+ 6 - 6
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/SrtNcstItem.java

@@ -7,10 +7,10 @@ import lombok.Data;
  */
 @Data
 public class SrtNcstItem {
-    public String baseDate;
-    public String baseTime;
-    public String category;
-    public int nx;
-    public int ny;
-    public String obsrValue;
+    private String baseDate;
+    private String baseTime;
+    private String category;
+    private int nx;
+    private int ny;
+    private String obsrValue;
 }

+ 5 - 5
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageBody.java

@@ -4,9 +4,9 @@ import lombok.Data;
 
 @Data
 public class VilageBody {
-    public String dataType;
-    public VilageItems items;
-    public int pageNo;
-    public int numOfRows;
-    public int totalCount;
+    private String dataType;
+    private VilageItems items;
+    private int pageNo;
+    private int numOfRows;
+    private int totalCount;
 }

+ 2 - 2
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageHeader.java

@@ -4,6 +4,6 @@ import lombok.Data;
 
 @Data
 public class VilageHeader {
-    public String resultCode;
-    public String resultMsg;
+    private String resultCode;
+    private String resultMsg;
 }

+ 9 - 9
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItem.java

@@ -7,16 +7,16 @@ import lombok.Data;
  */
 @Data
 public class VilageItem {
-    public String baseDate;
-    public String baseTime;
-    public String category;
+    private String baseDate;
+    private String baseTime;
+    private String category;
 
-    public String fcstDate;
-    public String fcstTime;
-    public String fcstValue;
+    private String fcstDate;
+    private String fcstTime;
+    private String fcstValue;
 
-    public String obsrValue;
+    private String obsrValue;
 
-    public int nx;
-    public int ny;
+    private int nx;
+    private int ny;
 }

+ 1 - 1
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageItems.java

@@ -6,5 +6,5 @@ import java.util.ArrayList;
 
 @Data
 public class VilageItems {
-    public ArrayList<VilageItem> item;
+    private ArrayList<VilageItem> item;
 }

+ 2 - 2
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageResponse.java

@@ -4,6 +4,6 @@ import lombok.Data;
 
 @Data
 public class VilageResponse {
-    public VilageHeader header;
-    public VilageBody body;
+    private VilageHeader header;
+    private VilageBody body;
 }

+ 1 - 1
src/main/java/com/its/wthr/openApi/vilageFcstInfoService/entity/VilageRoot.java

@@ -4,5 +4,5 @@ import lombok.Data;
 
 @Data
 public class VilageRoot {
-    public VilageResponse response;
+    private VilageResponse response;
 }

+ 152 - 1
src/main/java/com/its/wthr/service/AtmpService.java

@@ -3,6 +3,8 @@ package com.its.wthr.service;
 import com.its.app.utils.SysUtils;
 import com.its.wthr.config.AtmpConfig;
 import com.its.wthr.mapper.AtmpMapper;
+import com.its.wthr.openApi.arpltnInforInqireService.MsrStnAcctoRltmMesureDnsty;
+import com.its.wthr.openApi.arpltnInforInqireService.entity.AtmpItem;
 import com.its.wthr.process.DbmsJobData;
 import com.its.wthr.process.DbmsJobProcess;
 import com.its.wthr.process.DbmsJobType;
@@ -70,6 +72,148 @@ public class AtmpService extends AbstractXmlService {
         String sysTime = SysUtils.getSysTimeStr();
         log.info("AtmpService doJob Start...");
 
+        int errCnt = 0;
+        List<AtmpPltnSttsVo> atmpPltnSttsList = new ArrayList<>();
+        try {
+            log.info("AtmpService.doJbo: {} EA", AppRepository.getInstance().getAtmpPltnMap().size());
+            for (Map.Entry<String, AtmpPltnVo> e : AppRepository.getInstance().getAtmpPltnMap().entrySet()) {
+                AtmpPltnVo obj = e.getValue();
+                if (obj.getDEL_YN().equals("Y")) continue;
+
+                MsrStnAcctoRltmMesureDnsty request = new MsrStnAcctoRltmMesureDnsty();
+                boolean result = request.getMsrStnAcctoRltmMesureDnsty(this.config.getApiKey(), obj.getATMP_STTN_NM(), this.config.getApiVer());
+                if (result) {
+                    AtmpItem item = request.getItem();
+                    AtmpPltnSttsVo stts = new AtmpPltnSttsVo();
+
+                    stts.setATMP_STTN_NMBR(obj.getATMP_STTN_NMBR());
+                    stts.setMSRM_DT(item.getDataTime());
+                    stts.setMSRM_SYST_NM(item.getMangName());
+                    stts.setCO_VAL(item.getCoValue());
+                    stts.setSO2_VAL(item.getSo2Value());
+                    stts.setNO2_VAL(item.getNo2Value());
+                    stts.setO3_VAL(item.getO3Value());
+                    stts.setPM10_VAL(item.getPm10Value());
+                    stts.setPM10_24HH_VAL(item.getPm10Value24());
+                    stts.setPM25_VAL(item.getPm25Value());
+                    stts.setPM25_24HH_VAL(item.getPm25Value24());
+                    stts.setINTG_ATMP_VAL(item.getKhaiValue());
+                    stts.setINTG_ATMP_GRAD(item.getKhaiGrade());
+                    stts.setSO2_GRAD(item.getSo2Grade());
+                    stts.setCO_GRAD(item.getCoGrade());
+                    stts.setO3_GRAD(item.getO3Grade());
+                    stts.setNO2_GRAD(item.getNo2Grade());
+                    stts.setPM10_24HH_GRAD(item.getPm10Grade());
+                    stts.setPM25_24HH_GRAD(item.getPm25Grade());
+                    stts.setPM10_1HH_GRAD(item.getPm10Grade1h());
+                    stts.setPM25_1HH_GRAD(item.getPm25Grade1h());
+                    stts.setUPDT_DT(SysUtils.getSysTime());
+
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestResult(1);
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestValue(stts.toString());
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setValue(stts.getValue());
+
+                    atmpPltnSttsList.add(stts);
+                }
+                else {
+                    errCnt++;
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestResult(0);
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestValue(request.getErrorMsg());
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setValue(request.getErrorMsg());
+                }
+            }
+        }
+        catch(Exception e) {
+            log.error("AtmpService.doJob: {}", e.toString());
+        }
+
+        if (!atmpPltnSttsList.isEmpty()) {
+            this.dbmsJobProcess.add(new DbmsJobData(DbmsJobType.DATA_TYPE_ATMP, false, atmpPltnSttsList, atmpPltnSttsList.size()));
+        }
+
+        //////////////
+        ////////////// 네트워크 또는 기상청 서버 오류로 인한 오류가 발생했을 경우 재시도
+        //////////////
+        if (errCnt > 0) {
+            List<AtmpPltnSttsVo> atmpPltnSttsList2 = new ArrayList<>();
+            errCnt = 0;
+
+            try {
+                Thread.sleep(10000);
+            } catch (InterruptedException e) {
+                log.error("AtmpService doJob thread sleep exception");
+            }
+
+            for (Map.Entry<String, AtmpPltnVo> e : AppRepository.getInstance().getAtmpPltnMap().entrySet()) {
+                AtmpPltnVo obj = e.getValue();
+                if (obj.getRequestResult() == 1) {
+                    continue;
+                }
+
+                log.info("AtmpService.doJob-retry: {}-{}", obj.getATMP_STTN_NMBR(), obj.getATMP_STTN_NM());
+                MsrStnAcctoRltmMesureDnsty request = new MsrStnAcctoRltmMesureDnsty();
+                boolean result = request.getMsrStnAcctoRltmMesureDnsty(this.config.getApiKey(), obj.getATMP_STTN_NM(), this.config.getApiVer());
+                if (result) {
+                    AtmpItem item = request.getItem();
+                    AtmpPltnSttsVo stts = new AtmpPltnSttsVo();
+
+                    stts.setATMP_STTN_NMBR(obj.getATMP_STTN_NMBR());
+                    stts.setMSRM_DT(item.getDataTime());
+                    stts.setMSRM_SYST_NM(item.getMangName());
+                    stts.setCO_VAL(item.getCoValue());
+                    stts.setSO2_VAL(item.getSo2Value());
+                    stts.setNO2_VAL(item.getNo2Value());
+                    stts.setO3_VAL(item.getO3Value());
+                    stts.setPM10_VAL(item.getPm10Value());
+                    stts.setPM10_24HH_VAL(item.getPm10Value24());
+                    stts.setPM25_VAL(item.getPm25Value());
+                    stts.setPM25_24HH_VAL(item.getPm25Value24());
+                    stts.setINTG_ATMP_VAL(item.getKhaiValue());
+                    stts.setINTG_ATMP_GRAD(item.getKhaiGrade());
+                    stts.setSO2_GRAD(item.getSo2Grade());
+                    stts.setCO_GRAD(item.getCoGrade());
+                    stts.setO3_GRAD(item.getO3Grade());
+                    stts.setNO2_GRAD(item.getNo2Grade());
+                    stts.setPM10_24HH_GRAD(item.getPm10Grade());
+                    stts.setPM25_24HH_GRAD(item.getPm25Grade());
+                    stts.setPM10_1HH_GRAD(item.getPm10Grade1h());
+                    stts.setPM25_1HH_GRAD(item.getPm25Grade1h());
+                    stts.setUPDT_DT(SysUtils.getSysTime());
+
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestResult(1);
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestValue(stts.toString());
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setValue(stts.getValue());
+
+                    atmpPltnSttsList2.add(stts);
+                }
+                else {
+                    errCnt++;
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestResult(0);
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setRequestValue(request.getErrorMsg());
+                    AppRepository.getInstance().getAtmpPltnMap().get(obj.getATMP_STTN_NMBR()).setValue(request.getErrorMsg());
+                }
+
+                if (!atmpPltnSttsList2.isEmpty()) {
+                    this.dbmsJobProcess.add(new DbmsJobData(DbmsJobType.DATA_TYPE_ATMP, false, atmpPltnSttsList2, atmpPltnSttsList2.size()));
+                }
+            }
+        }
+        log.info("AtmpService doJob ..End...");
+
+        MainUI UI = MainUI.getInstance();
+        if (UI != null) {
+            UI.updateAtmpPltnStts(sysTime);
+        }
+    }
+
+    public void doJob_XML() {
+        if (!this.config.isEnabled()) {
+            return;
+        }
+
+        String sysTime = SysUtils.getSysTimeStr();
+        log.info("AtmpService doJob Start...");
+
         //load();
 
         int errCnt = 0;
@@ -199,7 +343,14 @@ public class AtmpService extends AbstractXmlService {
             log.error("{}, {}", atmpSttnNm, e.toString());
             atmpSttnNmUTF8 = atmpSttnNm;
         }
-
+        //            https://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty
+        //            ?serviceKey=2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D
+        //            &returnType=json
+        //            &numOfRows=100&
+        //            pageNo=1
+        //            &stationName=%EB%AA%85%EB%A5%9C%EB%8F%99
+        //            &dataTerm=DAILY
+        //            &ver=1.3
         String url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?";
         url = url + "serviceKey=" + this.config.getApiKey();
         url = url + "&returnType=xml";

+ 16 - 2
src/test/java/com/its/wthr/WthrCommServerApplicationTests.java

@@ -2,6 +2,7 @@ package com.its.wthr;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.wthr.openApi.arpltnInforInqireService.MsrStnAcctoRltmMesureDnsty;
 import com.its.wthr.openApi.vilageFcstInfoService.UltraSrtNcstData;
 import com.its.wthr.openApi.vilageFcstInfoService.entity.VilageItems;
 import com.its.wthr.openApi.vilageFcstInfoService.entity.VilageRoot;
@@ -84,7 +85,7 @@ public class WthrCommServerApplicationTests {
             throw new RuntimeException(e);
         }
 
-        log.info("{}", urlBuilder.toString());
+        log.info("{}", urlBuilder);
         String result = info.lookUpApi(urlBuilder);
         log.info("{}", result);
 
@@ -94,7 +95,7 @@ public class WthrCommServerApplicationTests {
             log.info("{}", response);
 
             if (response != null && response.getResponse() != null && response.getResponse().getBody() != null) {
-                VilageItems items = response.getResponse().getBody().items;
+                VilageItems items = response.getResponse().getBody().getItems();
                 if (items.getItem() != null) {
                     items.getItem().forEach(obj -> {
                         log.info("{}", obj);
@@ -106,4 +107,17 @@ public class WthrCommServerApplicationTests {
         }
     }
 
+    @Test
+    void testGetAtmp() {
+        MsrStnAcctoRltmMesureDnsty request = new MsrStnAcctoRltmMesureDnsty();
+        boolean result = request.getMsrStnAcctoRltmMesureDnsty("2y3qwo%2BwhlG6E%2BZfcyDKLMCr5Lp4gy%2BNgGuvWmgAdq7O%2Bf%2Fs4DPQz2ZD1rzDLowBq%2F6pfSi5F6UWlyM5meRiaw%3D%3D", "명륜동", "1.3");
+        if (result) {
+            log.info("{}", request.getItem());
+            log.info("{}", request.getErrorMsg());
+        }
+        else {
+            log.info("{}", request.getErrorMsg());
+        }
+    }
+
 }