Browse Source

feat: 좌표로 일출일몰 List 조회 시 없는 해당 날짜에 없는 도시는 가장 가까운도시 추적하여 대신 조회하도록 변경.

pull/17/head
lkd9125(이경도) 8 months ago
parent
commit
ff2fa08919
  1. 16
      pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java
  2. 27
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java
  3. 28
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java

16
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<ComnSunrisesetRs> 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<ComRiseSetBas> list = comRiseSetBasRepository.findByLocStDateAndLocEndDateNearLocation(stDateStr, endDateStr, location);
return ComnSunrisesetMapper.MAPPER.toRs(list);
}
}

27
pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetBasRepository.java

@ -26,6 +26,33 @@ public interface ComRiseSetBasRepository extends JpaRepository<ComRiseSetBas, Co
@Query(value = "SELECT R FROM COM_RISE_SET_BAS R WHERE LOC_DATE >= :locStDate AND LOC_DATE <= :locEndDate", nativeQuery = true)
List<ComRiseSetBas> 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<ComRiseSetBas> findByLocStDateAndLocEndDateNearLocation(@Param("locStDate") String locStDate, @Param("locEndDate") String locEndDate, @Param("location") String location);

28
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();
}
}

Loading…
Cancel
Save