Browse Source

드론관제 - 비행 종료된 드론에 대한 정보 제공 기능 추가

pull/6/head
qkr7828(박재우) 1 year ago
parent
commit
c358419a29
  1. 21
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  2. 20
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java
  3. 95
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  4. 29
      pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java

21
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java

@ -296,4 +296,25 @@ public class CtrCntrlController {
} }
return ResponseEntity.ok().body(new SuccessResponse(result)); return ResponseEntity.ok().body(new SuccessResponse(result));
} }
/**
* TODO 비행 관제 기체의 비정상 상황 확인
*
* @param cntrlId
* @return
*/
@GetMapping("/complete/{cntrlId}")
@ApiOperation(value = "TODO 비행 완료된 기체의 정보 확인")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
public ResponseEntity<? extends BasicResponse> flightCompleteInfo(@PathVariable String cntrlId) {
CtrCntrlArcrftComplModel result = new CtrCntrlArcrftComplModel();
try {
result = service.getComplete(cntrlId);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse(result));
}
} }

20
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
/**
* TODO 비행 종료된 기체의 정보
*
*/
@Data
public class CtrCntrlArcrftComplModel {
private Double mvDistance; // 총 비행 거리
private String mvTime; // 총 비행 시간
private Double elevAvg; // 평균 고도
private Double speedAvg; // 평균 속도
}

95
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java

@ -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;
}
} }

29
pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java

@ -1717,4 +1717,33 @@ public List<AnlsHstryDetailModel> listCntrlHstry(String id){
return result; return result;
} }
public List<CtrCntrlHstry> getCompleteInfo(String cntrlId){
QCtrCntrlBas qCntrlBasEntity = QCtrCntrlBas.ctrCntrlBas;
QCtrCntrlHstry qCtrCntrHstry = QCtrCntrlHstry.ctrCntrlHstry;
BooleanBuilder builder = new BooleanBuilder();
builder.and(qCtrCntrHstry.cntrlId.eq(cntrlId));
builder.and(qCntrlBasEntity.statusCd.eq("99"));
List<CtrCntrlHstry> result = query.select(Projections.bean(CtrCntrlHstry.class ,
qCtrCntrHstry.lat,
qCtrCntrHstry.lon ,
qCtrCntrHstry.speed ,
qCtrCntrHstry.speedType ,
qCtrCntrHstry.elev ,
qCtrCntrHstry.elevType ,
qCtrCntrHstry.mvDstnc ,
qCtrCntrHstry.mvDstncType
))
.from(qCtrCntrHstry)
.leftJoin(qCntrlBasEntity)
.on(qCntrlBasEntity.cntrlId.eq(qCtrCntrHstry.cntrlId))
.where(builder)
.orderBy(qCtrCntrHstry.srvrRcvDt.asc())
.fetch();
return result;
}
} }

Loading…
Cancel
Save