diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java index ce004d30..88a62275 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java @@ -8,6 +8,7 @@ import com.palnet.biz.jpa.entity.QComRiseSetBas; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringTemplate; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -34,6 +35,30 @@ import java.util.List; public class ComRiseSetQueryRepository { private final JPAQueryFactory query; + public List findCompleteBySearch(){ + QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; + + LocalDate today = LocalDate.now(); + LocalDate afterOneYear = LocalDate.now().plusYears(1); + + StringTemplate locDate = Expressions.stringTemplate("DATE_FORMAT({0} , '%Y-%m-%d')", bas.id.locDate); + StringTemplate todayDate = Expressions.stringTemplate("DATE_FORMAT({0} , '%Y-%m-%d')", today.toString()); + StringTemplate afterOneYearDate = Expressions.stringTemplate("DATE_FORMAT({0} , '%Y-%m-%d')", afterOneYear.toString()); + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(locDate.goe(todayDate)); + builder.and(locDate.loe(afterOneYearDate)); + + return query + .select(bas.id.locDate) + .from(bas) + .where(builder) + .groupBy(bas.id.locDate) + .having(bas.count().eq(205L)) + .fetch(); + + } + public List findAllBySearch(ComnSunrisesetRq rq) { QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; diff --git a/pav-server/src/main/java/com/palnet/biz/scheduler/external/SunRiseSetScheduler.java b/pav-server/src/main/java/com/palnet/biz/scheduler/external/SunRiseSetScheduler.java index 8f5f4fad..c0e72663 100644 --- a/pav-server/src/main/java/com/palnet/biz/scheduler/external/SunRiseSetScheduler.java +++ b/pav-server/src/main/java/com/palnet/biz/scheduler/external/SunRiseSetScheduler.java @@ -16,6 +16,7 @@ public class SunRiseSetScheduler { @Scheduled(cron = "0 0 4 * * *") // 매일 새벽 4시 public void run(){ sunRiseSchedulerService.sunsetSchedule(); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/scheduler/external/service/SunRiseSchedulerService.java b/pav-server/src/main/java/com/palnet/biz/scheduler/external/service/SunRiseSchedulerService.java index a661973f..016e30d0 100644 --- a/pav-server/src/main/java/com/palnet/biz/scheduler/external/service/SunRiseSchedulerService.java +++ b/pav-server/src/main/java/com/palnet/biz/scheduler/external/service/SunRiseSchedulerService.java @@ -7,6 +7,7 @@ import com.palnet.biz.api.external.service.SunRiseSetMapper; import com.palnet.biz.jpa.entity.ComRiseSetBas; import com.palnet.biz.jpa.entity.ComRiseSetBasPK; import com.palnet.biz.jpa.repository.com.ComRiseSetBasRepository; +import com.palnet.biz.jpa.repository.com.ComRiseSetQueryRepository; import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; import lombok.RequiredArgsConstructor; @@ -17,15 +18,16 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.DefaultUriBuilderFactory; import org.springframework.web.util.UriComponentsBuilder; import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; @Service @@ -35,6 +37,8 @@ public class SunRiseSchedulerService { private final ComRiseSetBasRepository comRiseSetBasRepository; + private final ComRiseSetQueryRepository comRiseSetQueryRepository; + @Value("${external.sunriseset.url}") private String SUN_HOST; @@ -74,19 +78,33 @@ public class SunRiseSchedulerService { public void sunsetSchedule(){ - this.dayCallCount = 0; - List todayLocation = this.todayLocation(); - LocalDate today = LocalDate.now(); List timeColumn = List.of("sunrise", "suntransit", "sunset", "moonrise", "moontransit", "moonset", "civilm", "civile", "nautm", "naute", "astm", "aste"); + List yearDaysList = new ArrayList<>(); - List sunRiseSet = new ArrayList<>(); + LocalDate today = LocalDate.now(); - // 내일부터 약180일 데이터 INSERT - for(int i = 0; i <= 180; i ++){ + for(int i = 0; i <= 365; i ++){ today = today.plusDays(1); String locdate = today.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + yearDaysList.add(locdate); + } + + List removeDate = comRiseSetQueryRepository.findCompleteBySearch(); + + HashSet set = new HashSet<>(yearDaysList); + set.removeAll(removeDate); + + List remainingDays = new ArrayList<>(set); + Collections.sort(remainingDays); + + List todayLocation = this.getLocation(); + List sunRiseSet = new ArrayList<>(); + + for(int i = 0; i < remainingDays.size(); i++){ + String locdate = remainingDays.get(i); + for(int j = 0; j < todayLocation.size(); j ++){ try { String location = todayLocation.get(j); @@ -128,9 +146,9 @@ public class SunRiseSchedulerService { }catch (CustomException e) { String errorCode = e.getErrorCode(); - if(errorCode.equals("LT001")) throw new CustomException(ErrorCode.fromCode(errorCode)); + if(errorCode.equals("LT001")) log.error("LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR"); }catch (Exception e){ - log.error("API CALL Error :: location {} , locdate {}", locdate, locdate); + log.error("API CALL Error :: location {} , locdate {}", location, locdate); log.error("", e); } } @@ -142,18 +160,28 @@ public class SunRiseSchedulerService { } } - log.info("dayCallCount => {}", this.dayCallCount); + if(!sunRiseSet.isEmpty()) comRiseSetBasRepository.saveAll(sunRiseSet); } private List callSunRiseSet(String locdate, String location) throws CustomException { - String uriStr = UriComponentsBuilder.fromUriString(AREA_RISE_SEET_INFO_URL) - .queryParam("serviceKey", SUN_KEY) - .queryParam("locdate", locdate) - .queryParam("location", location) - .build().toUriString(); + String uriStr = null; + + try{ + uriStr = UriComponentsBuilder.fromUriString(AREA_RISE_SEET_INFO_URL) + .queryParam("serviceKey", SUN_KEY) + .queryParam("locdate", locdate) + .queryParam("location",URLEncoder.encode(location, StandardCharsets.UTF_8)) + .build().toUriString(); + } catch(Exception e){ + e.printStackTrace(); + } + + DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(SUN_HOST); + factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); WebClient client = WebClient.builder() + .uriBuilderFactory(factory) .baseUrl(SUN_HOST) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE) .build(); @@ -191,55 +219,10 @@ public class SunRiseSchedulerService { } } - private List todayLocation (){ - int count = this.init(); - int changeCount = this.arraySelect(count); - - List todayLocation = new ArrayList<>(); - - for(int i = 0; i < 4; i ++){ - if(changeCount == 4) changeCount = 0; - String[] arr = this.location[i][changeCount]; - - todayLocation.addAll(Arrays.asList(arr)); - changeCount ++; - } - - // 중복제거 - HashSet set = new HashSet<>(todayLocation); - - return new ArrayList<>(set); - } - - private int arraySelect(int count){ - int result; - - switch (count){ - case 1 : - result = 0; - break; - case 2 : - result = 1; - break; - case 3 : - result= 2; - break; - case 4 : - result = 3; - break; - default: - throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - } - - return result; - } - - - private int init(){ - - int day = LocalDate.now().getDayOfMonth(); - - return (day % 4) + 1; + private List getLocation() { + String locationStr = "가거도, 가평, 강릉, 강원고성, 강진, 강화, 거제, 거창, 격렬비도, 경기광주, 경산, 경주, 경주시감포읍, 경주시산내면, 계룡, 고령, 고성, 고양, 고창, 고흥, 곡성, 공주, 과천, 광명, 광양, 광주, 괴산, 괴산군연풍면, 구례, 구리, 구미, 군산, 군위, 군포, 금산, 기장, 김제, 김천, 김천시부항면, 김포, 김해, 나주, 남양주, 남원, 남해, 논산, 단양, 달성, 담양, 당진, 대관령, 대구, 대덕전파천문대, 대전, 덕적도, 독도, 동두천, 동해, 마라도, 목포, 무안, 무주, 문경, 밀양, 백령도, 변산, 보령, 보성, 보은, 보현산천문대, 봉화, 부산, 부안, 부여, 부천, 사천, 산청, 삼산도, 삼척, 상주, 서귀포, 서산, 서울, 서천, 성남, 성산일출, 성주, 세종, 소백산천문대, 속초, 수원, 순창, 순천, 승주, 시흥, 신안, 신안군임자면, 아산, 안동, 안산, 안성, 안양, 양구, 양산, 양양, 양주, 양평, 어청도, 여수, 여수공항, 여주, 연세KVN, 연천, 연평도, 영광, 영덕, 영동, 영암, 영양, 영월, 영주, 영천, 예산, 예천, 오산, 옥천, 옹진, 완도, 완주, 용인, 울릉, 울산, 울산KVN, 울주, 울진, 원주, 위도, 음성, 의령, 의성, 의왕, 의정부, 이천, 익산, 인제, 인제군기린면, 인천, 임실, 장성, 장수, 장흥, 전주, 정선, 정읍, 제주, 제주레이더, 제천, 주문진, 증평, 진도, 진안, 진주, 진천, 진해, 창녕, 창원, 천안, 철원, 청도, 청송, 청양, 청주, 청주공항, 추자도, 추풍령, 춘양, 춘천, 충주, 칠곡, 탐라KVN, 태백, 태안, 통영, 파주, 평창, 평창KVN, 평택, 포천, 포항, 하남, 하동, 함안, 함양, 함평, 합천, 해남, 홍성, 홍천, 홍천군내면, 홍천군서석면, 화성, 화순, 화천, 횡성, 흑산도"; +// String locationStr = "김포"; + return Arrays.stream(locationStr.split(",")).map(String::trim).distinct().filter(str -> !str.isEmpty()).collect(Collectors.toList()); } } diff --git a/pav-server/src/main/resources/application.properties b/pav-server/src/main/resources/application.properties index 3750696c..e286db67 100644 --- a/pav-server/src/main/resources/application.properties +++ b/pav-server/src/main/resources/application.properties @@ -13,8 +13,9 @@ naver.api.url=https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc ### 일출/일몰 ### external.sunriseset.url=http://apis.data.go.kr/B090041/openapi/service/RiseSetInfoService #external.sunriseset.key=b%2FStm6AMT3EwXc5kOvwnjK%2FPB57Ay1WzkIGVx5WaMt0MyRt3TEPgcJ%2Fur45GrnVOZKs2sfIWKUX3BTl8eYwVFw%3D%3D -external.sunriseset.key=b/Stm6AMT3EwXc5kOvwnjK/PB57Ay1WzkIGVx5WaMt0MyRt3TEPgcJ/ur45GrnVOZKs2sfIWKUX3BTl8eYwVFw== - +#external.sunriseset.key=b/Stm6AMT3EwXc5kOvwnjK/PB57Ay1WzkIGVx5WaMt0MyRt3TEPgcJ/ur45GrnVOZKs2sfIWKUX3BTl8eYwVFw== +external.sunriseset.key=r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4%2F45y0uVNw6BaYbgpKmL%2BLUDFVTfIYUmEe4K%2FaniEjdV9mg5t82Q%3D%3D +#external.sunriseset.key=r6RMUsk3Vtama7D6uq7MiWV9dTC9MwfIIr4/45y0uVNw6BaYbgpKmL+LUDFVTfIYUmEe4K/aniEjdV9mg5t82Q== ### TS ### external.ts.url=http://121.137.95.45:8170 external.ts.return.uri=/api/external/laanc/vc/callback