Browse Source

Merge commit 'c358419a2922a26d10a16daf8b129c170323790d' into feature/lannc/pdf-create

pull/3/head
lkd9125 1 year ago
parent
commit
651da27170
  1. 5
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java
  2. 47
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java
  3. 1
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java
  4. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java
  5. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java
  6. 37
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java
  7. 1
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java
  8. 74
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  9. 21
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  10. 20
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftComplModel.java
  11. 95
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  12. 2
      pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java
  13. 29
      pav-server/src/main/java/com/palnet/biz/jpa/repository/ctr/CtrCntrlQueryRepository.java
  14. 2
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java
  15. 2
      pav-socket/build.gradle
  16. 2
      pav-websocket/build.gradle
  17. 2
      settings.gradle

5
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRqModel.java

@ -1,11 +1,10 @@
package com.palnet.biz.api.acnt.jwt.model;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
@NoArgsConstructor

47
pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java

@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.palnet.biz.api.bas.flight.model.*;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
@ -24,15 +25,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.palnet.biz.api.bas.flight.dto.LanncPdfVO;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel;
import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs;
import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.flight.service.BasFlightService;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.comn.response.BasicResponse;
@ -116,7 +108,7 @@ public class BasFlightController {
@GetMapping(value = "/plan/detail/{planSno}")
@ApiOperation(value = "비행계획서 상세 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class)
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> detailPlan(@PathVariable("planSno") Integer planSno) {
BasFlightPlanModel result = null;
try {
@ -135,14 +127,14 @@ public class BasFlightController {
@ApiOperation(value = "비행계획서 등록")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
BasFlightPlanLaancRs rs = null;
try {
log.error(">>> rq : {}", rq);
boolean result = basFlightService.createPlan(rq);
resultMap.put("result", result);
log.info(">>> resultMap : " , resultMap);
log.debug(">>> rq : {}", rq);
rs = basFlightService.createPlan(rq);
log.debug(">>> rs : {}", rs);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -154,7 +146,7 @@ public class BasFlightController {
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 비행계획서 수정
@ -162,12 +154,12 @@ public class BasFlightController {
@ApiOperation(value = "비행계획서 수정")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> updatePlan(@RequestBody BasFlightPlanModel rq) {
Map<String, Object> resultMap = new HashMap<String, Object>();
BasFlightPlanLaancRs rs = null;
try {
boolean result = basFlightService.updatePlan(rq);
resultMap.put("result", result);
rs = basFlightService.updatePlan(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<String, Object>();
log.error("IGNORE : {}", e);
resultMap.put("result", false);
resultMap.put("errorCode", e.getErrorCode());
@ -179,14 +171,14 @@ public class BasFlightController {
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().body(new SuccessResponse<>(resultMap));
return ResponseEntity.ok().body(new SuccessResponse<>(rs));
}
// 비행계획서 삭제
@DeleteMapping(value = "/plan/delete/{planSno}")
@ApiOperation(value = "비행계획서 삭제")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "planSno",value = "비행계획서일련번호", dataTypeClass = Integer.class)
@ApiImplicitParam(name = "planSno", value = "비행계획서일련번호", dataTypeClass = Integer.class)
public ResponseEntity<? extends BasicResponse> deletePlan(@PathVariable("planSno") Integer planSno) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
@ -211,7 +203,7 @@ public class BasFlightController {
@GetMapping(value = "/plan/pilot/{groupId}")
@ApiOperation(value = "그룹의 조종사 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class)
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findPilot(@PathVariable("groupId") String groupId) {
List<BasFlightPlanPilotModel> result = null;
try {
@ -226,11 +218,12 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 그룹 기체 조회
@GetMapping(value = "/plan/arcrft/{groupId}")
@ApiOperation(value = "그룹의 기체 조회")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
@ApiImplicitParam(name = "groupId",value = "그룹ID", dataTypeClass = String.class)
@ApiImplicitParam(name = "groupId", value = "그룹ID", dataTypeClass = String.class)
public ResponseEntity<? extends BasicResponse> findArcrft(@PathVariable("groupId") String groupId) {
List<BasFlightPlanArcrftModel> result = null;
try {
@ -265,7 +258,7 @@ public class BasFlightController {
@GetMapping("/plan/api/weather")
@ApiOperation(value = "비행계획서 날씨")
@Tag(name = "비행계획서", description = "비행계획서 관련 API")
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq){
public ResponseEntity<? extends BasicResponse> restApiGetWeather(BasFlightWeatherModel rq) {
JSONObject jsonObject = null;
try {
@ -279,6 +272,7 @@ public class BasFlightController {
return ResponseEntity.ok().body(new SuccessResponse<>(jsonObject));
}
// 비행계획서 리스트(승인)
@GetMapping(value = "/aprv/list")
@ApiOperation(value = "비행계획서 리스트(승인)")
@ -295,6 +289,7 @@ public class BasFlightController {
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
// 비행계획서 승인/미승인
@PutMapping(value = "/aprv/proc")
@ApiOperation(value = "비행 계획서 승인/미승인")
@ -388,8 +383,8 @@ public class BasFlightController {
Coordinate circleCoord = new Coordinate(getY, getX);
List<Coordinate> coordList = utils.createCircle(circleCoord, buffer);
for(Coordinate a : coordList) {
System.out.println("["+a.getX() + ", " + a.getY()+"],");
for (Coordinate a : coordList) {
System.out.println("[" + a.getX() + ", " + a.getY() + "],");
}
}

1
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordModel.java

@ -3,7 +3,6 @@ package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
@Data
public class BasFlightPlanAreaCoordModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordQueryList.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.flight.model;
import java.util.List;
import lombok.Data;
import org.locationtech.jts.geom.Coordinate;
import lombok.Data;
import java.util.List;
@Data
public class BasFlightPlanAreaCoordQueryList {

2
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaCoordRq.java

@ -1,7 +1,5 @@
package com.palnet.biz.api.bas.flight.model;
import java.util.Date;
import lombok.Data;
@Data

37
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanLaancRs.java

@ -0,0 +1,37 @@
package com.palnet.biz.api.bas.flight.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.bas.flight.model
* fileName : BasFlightPlanErrorRS
* author : dhji
* date : 2023-09-19(019)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-19(019) dhji 최초 생성
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BasFlightPlanLaancRs {
private String pilotQlfcYn; // 자격여부
private String acrftInsuranceYn; // 항공기보험여부
private String acrftDuplicatedYn; // 기체 중복여부
private String planAreaDuplicatdYn; // 비행계획서비행구역 중복여부
private String airspaceDuplicatedYn; // 공역 중복여부
public boolean isValid() {
return "Y".equals(pilotQlfcYn)
&& "Y".equals(acrftInsuranceYn)
&& "N".equals(acrftDuplicatedYn)
&& "N".equals(planAreaDuplicatdYn)
&& "N".equals(airspaceDuplicatedYn);
}
}

1
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightScheduleRs.java

@ -3,7 +3,6 @@ package com.palnet.biz.api.bas.flight.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
@Data
public class BasFlightScheduleRs {

74
pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java

@ -13,6 +13,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.palnet.biz.api.bas.flight.model.*;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
@ -27,16 +28,6 @@ import org.springframework.transaction.annotation.Transactional;
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel;
import com.palnet.biz.api.bas.flight.model.BasFlightScheduleRs;
import com.palnet.biz.api.bas.flight.model.BasFlightWeatherModel;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
@ -181,7 +172,14 @@ public class BasFlightService {
return rs;
}
public void planValid(BasFlightPlanModel rq) {
public BasFlightPlanLaancRs planValid(BasFlightPlanModel rq) {
BasFlightPlanLaancRs rs = BasFlightPlanLaancRs.builder()
.pilotQlfcYn("N")
.acrftInsuranceYn("N")
.airspaceDuplicatedYn("N")
.acrftDuplicatedYn("N")
.planAreaDuplicatdYn("N")
.build();
boolean isEqualsFltElev = false;
List<BasFlightPlanAreaModel> rqAreaList = rq.getAreaList();
String rqFltElev = rqAreaList.get(0).getFltElev();
@ -197,10 +195,12 @@ public class BasFlightService {
}
List<BasFlightPlanAreaCoordRq> effectivePlanCount = fltPlanQueryRepository.CoordCount(rq);
for (BasFlightPlanModel i : effectivePlanList) {
if (rq.getPlanSno().equals(i.getPlanSno())) return;
// TODO 의미?
if (rq.getPlanSno().equals(i.getPlanSno())) return rs;
}
if (effectivePlanList != null && !effectivePlanList.isEmpty()) {
for (BasFlightPlanModel plan : effectivePlanList) {
plan: for (BasFlightPlanModel plan : effectivePlanList) {
// 1. 구역 조회
List<FltPlanArea> areaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(plan.getPlanSno());
@ -251,23 +251,29 @@ public class BasFlightService {
} else if ("CIRCLE".equals(rqArea.getAreaType())) {
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone());
}
//검증
//검증 - 비행계획서 비행구역 중복확인
overlapCheck = areaUtils.overlaps(rqCoordBufferList, effectiveCoordBufferList);
overlapCheck2 = areaUtils.overlaps(effectiveCoordBufferList, rqCoordBufferList);
if ((overlapCheck || overlapCheck2) && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
rs.setPlanAreaDuplicatdYn("Y");
break plan;
}
for (Coordinate coord : effectiveCoordBufferList) {
containCheck = areaUtils.contains(rqCoordBufferList, coord);
if (containCheck && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
rs.setPlanAreaDuplicatdYn("Y");
break plan;
}
}
for (Coordinate coord : rqCoordBufferList) {
containCheck2 = areaUtils.contains(effectiveCoordBufferList, coord);
if (containCheck2 && isEqualsFltElev) {
throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
// throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE);
rs.setPlanAreaDuplicatdYn("Y");
break plan;
}
}
}
@ -275,24 +281,34 @@ public class BasFlightService {
}
// 3. 중복 기체 확인
for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) {
acrft: for (BasFlightPlanAreaCoordRq idntfNum : effectivePlanCount) {
for (BasFlightPlanArcrftModel rqArcrft : rq.getArcrftList()) {
if (rqArcrft.getIdntfNum().equals(idntfNum.getIdntfNum())) {
throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE);
// throw new CustomException(ErrorCode.ARCRFT_DATA_DUPLICATE);
rs.setAcrftDuplicatedYn("Y");
break acrft;
}
}
}
}
}
return rs;
}
// 비행계획서 등록
@Transactional
public boolean createPlan(BasFlightPlanModel rq) {
public BasFlightPlanLaancRs createPlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
this.planValid(rq);
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
if(!rs.isValid()) return rs;
// 비행계획서
String userId = jwtTokenUtil.getUserIdByToken();
@ -349,15 +365,23 @@ public class BasFlightService {
fltPlanArcrftRepository.save(arcrftEntity);
}
}
return true;
return rs;
}
// 비행계획서 수정
@Transactional
public boolean updatePlan(BasFlightPlanModel rq) {
public BasFlightPlanLaancRs updatePlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
this.planValid(rq);
// 비행계획서 유효성 검사.
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
if(!rs.isValid()) return rs;
if (rq != null && rq.getPlanSno() != null) {
String userId = jwtTokenUtil.getUserIdByToken();
@ -475,7 +499,7 @@ public class BasFlightService {
fltPlanArcrftRepository.deleteAll(deleteArcrftEntity);
}
}
return true;
return rs;
}
// 비행계획서 삭제

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));
}
/**
* 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.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
@ -25,7 +26,6 @@ import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
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.service.BasFlightMapper;
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.CtrCntrlDtlModel;
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.CtrCntrlPlanContainsRs;
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.CtrCntrlWeatherModel;
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.FltPlanCtrCntrlRelRepository;
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.comn.model.GPHistoryModel;
import com.palnet.comn.utils.AreaUtils;
@ -820,4 +819,88 @@ public class CtrCntrlService {
returnCoord.setY(ny);
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;
}
}

2
pav-server/src/main/java/com/palnet/biz/config/convert/InstantStringDeserializer.java

@ -48,7 +48,7 @@ public class InstantStringDeserializer extends JsonDeserializer<Instant> {
return Instant.parse(dateString);
}
} catch (Exception e) {
log.error("ERROR : ", e);
log.error("instant parse error : {} => param: {}", e.getMessage(), p.getValueAsString());
return null;
}
}

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

2
pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java

@ -669,7 +669,7 @@ public class FltPlanQueryRepository {
/**
* 김포공항, 비행승인 통계 API
* @param yyyymm
* @param date
* @return
*/
public List<MainDashStcsModel> mainKacStcsPlanAllow(String date, String[] formatParam){

2
pav-socket/build.gradle

@ -20,7 +20,7 @@ jar {
}
dependencies {
implementation project(':pav-common')
// implementation project(':pav-common')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

2
pav-websocket/build.gradle

@ -20,7 +20,7 @@ jar {
}
dependencies {
implementation project(':pav-common')
// implementation project(':pav-common')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'io.netty:netty-all:4.1.63.Final'

2
settings.gradle

@ -1,6 +1,6 @@
rootProject.name = 'pav-be-kac'
include 'pav-common'
//include 'pav-common'
include 'pav-socket'
include 'pav-websocket'
include 'pav-server'

Loading…
Cancel
Save