diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java index 8263554c..759d9a20 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java @@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -62,6 +64,18 @@ public class ComnSunrisesetService { */ public List getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { if(rq == null || !rq.hasCoord()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - return comRiseSetQueryRepository.findAllBySearchCoordTransform(rq); + + LocalDate stDate = LocalDate.now(); + LocalDate endDate = stDate.plusMonths(6); + + String location = comRiseSetQueryRepository.findLocationByGeo(rq); + String stDateStr = stDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + List list = comRiseSetBasRepository.findByLocStDateAndLocEndDateNearLocation(stDateStr, endDateStr, location); + + return ComnSunrisesetMapper.MAPPER.toRs(list); } + + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java index 11e8d724..f7942a8c 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java @@ -26,6 +26,33 @@ public interface ComRiseSetBasRepository extends JpaRepository findByLocStDateAndLocEndDate(@Param("locStDate") String locStDate, @Param("locEndDate") String locEndDate); + /** + * RQ로 받은 location[지역]과 RQ로 받은 일자별로 가장 가까운 도시 SELECT함 + * SELECT + * NEAR.* + * FROM + * ( + * SELECT + * *, + * CAST( + * ST_DISTANCE_SPHERE( + * POINT(LON, LAT), + * POINT( + * (SELECT DISTINCT LON FROM COM_RISE_SET_BAS WHERE LOCATION = :location), + * (SELECT DISTINCT LAT FROM COM_RISE_SET_BAS WHERE LOCATION = :location) + * ) + * ) AS SIGNED + * ) AS DIST + * FROM COM_RISE_SET_BAS + * WHERE LOC_DATE BETWEEN :locStDate AND :locEndDate + * ORDER BY LOC_DATE ASC , DIST ASC ) + * AS NEAR + * GROUP BY NEAR.LOC_DATE + * @param locStDate + * @param locEndDate + * @param location + * @return + */ @Query(value = "SELECT NEAR.* FROM ( SELECT *, CAST( ST_DISTANCE_SPHERE( POINT(LON, LAT), POINT( (SELECT DISTINCT LON FROM COM_RISE_SET_BAS WHERE LOCATION = :location), (SELECT DISTINCT LAT FROM COM_RISE_SET_BAS WHERE LOCATION = :location) ) ) AS SIGNED ) AS DIST FROM COM_RISE_SET_BAS WHERE LOC_DATE BETWEEN :locStDate AND :locEndDate ORDER BY LOC_DATE ASC , DIST ASC ) AS NEAR GROUP BY NEAR.LOC_DATE", nativeQuery = true) List findByLocStDateAndLocEndDateNearLocation(@Param("locStDate") String locStDate, @Param("locEndDate") String locEndDate, @Param("location") String location); 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 c46e9541..ce004d30 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 @@ -249,4 +249,32 @@ public class ComRiseSetQueryRepository { .fetch(); return rs; } + + public String findLocationByGeo(ComnSunrisesetCoordRq rq){ + QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; + + BooleanBuilder builder = new BooleanBuilder(); + LocalDate stDate = LocalDate.now(); + LocalDate endDate = stDate.plusMonths(6); + String stDateStr = stDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + builder.and(bas.id.locDate.goe(stDateStr)); + builder.and(bas.id.locDate.loe(endDateStr)); + + return query.select(bas.id.location) + .from(bas) + .where(builder) + .groupBy(bas.id.location) + .orderBy(Expressions.stringTemplate("ST_Distance_Sphere({0}, {1})", + Expressions.stringTemplate("POINT({0}, {1})", + rq.getLon(), + rq.getLat() + ), + Expressions.stringTemplate("POINT({0}, {1})", + bas.lon, + bas.lat + ) + ).asc()) + .fetchFirst(); + } }