|
|
@ -7,16 +7,17 @@ import java.net.HttpURLConnection; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
|
|
|
|
import java.time.Duration; |
|
|
|
import java.time.Instant; |
|
|
|
import java.time.Instant; |
|
|
|
|
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.LocalTime; |
|
|
|
import java.time.LocalTime; |
|
|
|
|
|
|
|
import java.time.Period; |
|
|
|
|
|
|
|
import java.time.ZoneId; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
|
|
|
|
import java.util.Calendar; |
|
|
|
import java.util.Calendar; |
|
|
|
import java.util.Date; |
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Optional; |
|
|
|
|
|
|
|
import java.util.UUID; |
|
|
|
import java.util.UUID; |
|
|
|
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
@ -25,7 +26,6 @@ import org.json.simple.parser.JSONParser; |
|
|
|
import org.json.simple.parser.ParseException; |
|
|
|
import org.json.simple.parser.ParseException; |
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.cache.annotation.Cacheable; |
|
|
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
|
@ -36,6 +36,7 @@ import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
|
|
import com.palnet.biz.api.bas.flight.service.BasFlightMapper; |
|
|
|
import com.palnet.biz.api.bas.flight.service.BasFlightMapper; |
|
|
|
import com.palnet.biz.api.comn.model.ControlGpsDataContext; |
|
|
|
import com.palnet.biz.api.comn.model.ControlGpsDataContext; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftComplModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftWarnModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftWarnModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; |
|
|
@ -43,7 +44,6 @@ import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketContainsRq; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketContainsRq; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketDataModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWarnLogModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWarnLogModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWeatherModel; |
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWeatherModel; |
|
|
|
import com.palnet.biz.jpa.entity.ComArcrftBas; |
|
|
|
import com.palnet.biz.jpa.entity.ComArcrftBas; |
|
|
@ -68,7 +68,6 @@ import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; |
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrSchedulerService; |
|
|
|
|
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
import com.palnet.comn.model.GPHistoryModel; |
|
|
|
import com.palnet.comn.model.GPHistoryModel; |
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
@ -820,4 +819,88 @@ public class CtrCntrlService { |
|
|
|
returnCoord.setY(ny); |
|
|
|
returnCoord.setY(ny); |
|
|
|
return returnCoord; |
|
|
|
return returnCoord; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* TODO 비행 종료 데이터 상세 조회 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param controlId |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public CtrCntrlArcrftComplModel getComplete(String controlId) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CtrCntrlArcrftComplModel result = new CtrCntrlArcrftComplModel(); |
|
|
|
|
|
|
|
List<CtrCntrlHstry> completeInfo = query.getCompleteInfo(controlId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Double mvDistanceAll = 0.0; |
|
|
|
|
|
|
|
Duration duration = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(completeInfo.size() > 2) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Instant start = completeInfo.get(0).getSrvrRcvDt(); |
|
|
|
|
|
|
|
Instant end = completeInfo.get(completeInfo.size()-1).getSrvrRcvDt(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(start != null && end != null) { |
|
|
|
|
|
|
|
LocalDate startDate = start.atZone(ZoneId.of("Asia/Seoul")).toLocalDate(); |
|
|
|
|
|
|
|
LocalDate endDate = end.atZone(ZoneId.of("Asia/Seoul")).toLocalDate(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
duration = Duration.between(startDate, endDate); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int from = 0, to = 1; from <completeInfo.size()-2; from++, to++) { |
|
|
|
|
|
|
|
Coordinate fromCoord = new Coordinate(); |
|
|
|
|
|
|
|
Coordinate toCoord = new Coordinate(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fromCoord.setX(completeInfo.get(from).getLat()); |
|
|
|
|
|
|
|
fromCoord.setY(completeInfo.get(from).getLon()); |
|
|
|
|
|
|
|
toCoord.setX(completeInfo.get(to).getLat()); |
|
|
|
|
|
|
|
toCoord.setY(completeInfo.get(to).getLon()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (fromCoord.x != toCoord.x || fromCoord.y != toCoord.y) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double distance = calculateDistance(fromCoord, toCoord); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mvDistanceAll += distance; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double speedAvg = completeInfo.stream() |
|
|
|
|
|
|
|
.mapToDouble(CtrCntrlHstry::getSpeed) // Integer를 int로 매핑
|
|
|
|
|
|
|
|
.average() |
|
|
|
|
|
|
|
.orElse(0.0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double elevAvg = completeInfo.stream() |
|
|
|
|
|
|
|
.mapToDouble(CtrCntrlHstry::getElev) // Integer를 int로 매핑
|
|
|
|
|
|
|
|
.average() |
|
|
|
|
|
|
|
.orElse(0.0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result.setElevAvg(elevAvg); |
|
|
|
|
|
|
|
result.setSpeedAvg(speedAvg); |
|
|
|
|
|
|
|
result.setMvDistance(mvDistanceAll*1000); |
|
|
|
|
|
|
|
if(duration != null) result.setMvTime(duration.toString()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static double calculateDistance(Coordinate coord1, Coordinate coord2) { |
|
|
|
|
|
|
|
double earthRadius = 6371; // 지구의 반지름 (단위: km)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 위도와 경도를 라디안으로 변환
|
|
|
|
|
|
|
|
double lat1 = Math.toRadians(coord1.x); |
|
|
|
|
|
|
|
double lon1 = Math.toRadians(coord1.y); |
|
|
|
|
|
|
|
double lat2 = Math.toRadians(coord2.x); |
|
|
|
|
|
|
|
double lon2 = Math.toRadians(coord2.y); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Haversine 공식을 사용하여 두 지점 간의 거리 계산
|
|
|
|
|
|
|
|
double dlon = lon2 - lon1; |
|
|
|
|
|
|
|
double dlat = lat2 - lat1; |
|
|
|
|
|
|
|
double a = Math.sin(dlat / 2) * Math.sin(dlat / 2) |
|
|
|
|
|
|
|
+ Math.cos(lat1) * Math.cos(lat2) * Math.sin(dlon / 2) * Math.sin(dlon / 2); |
|
|
|
|
|
|
|
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); |
|
|
|
|
|
|
|
double distance = earthRadius * c; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return distance; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|