Browse Source

fix: 드론원스톱 비행계획 목록 검색조건 추가

feature/address-coordinate
지대한 5 months ago
parent
commit
1d50397e21
  1. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java
  2. 78
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java
  3. 17
      pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java
  4. 39
      pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java

2
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java

@ -14,4 +14,6 @@ import java.time.LocalDate;
public class BasDosPlanRq {
private LocalDate searchStDt;
private LocalDate searchEndDt;
private String applyNo;
private String approvalCd;
}

78
pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java

@ -7,7 +7,7 @@ import com.palnet.biz.jpa.entity.DosFltPlanArea;
import com.palnet.biz.jpa.entity.DosFltPlanBas;
import com.palnet.biz.jpa.entity.DosFltPlanResult;
import com.palnet.biz.jpa.repository.dos.DosFltPlanAreaRepository;
import com.palnet.biz.jpa.repository.dos.DosFltPlanBasRepository;
import com.palnet.biz.jpa.repository.dos.DosFltPlanQueryRepository;
import com.palnet.biz.jpa.repository.dos.DosFltPlanResultRepository;
import com.palnet.comn.utils.AreaUtils;
import lombok.RequiredArgsConstructor;
@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@Slf4j
@ -27,24 +28,24 @@ import java.util.stream.Collectors;
@Service
public class BasDosService {
private final DosFltPlanBasRepository dosFltPlanBasRepository;
private final DosFltPlanAreaRepository dosFltPlanAreaRepository;
private final DosFltPlanResultRepository dosFltPlanResultRepository;
private final DosFltPlanQueryRepository dosFltPlanQueryRepository;
private final AreaUtils areaUtils;
/**
* 드론원스톱 비행계획 조회
* 비행계획서 버퍼 좌표(비행구역데이터로 추출)
*
* @param rq
* @return
* @param rq: BasDosPlanRq
* @return List<BasDosPlanRs>
*/
@Transactional(readOnly = true)
public List<BasDosPlanRs> getDosPlan(BasDosPlanRq rq) {
List<DosFltPlanBas> planBasList = dosFltPlanBasRepository.findBySchFltStDtLessThanEqualAndSchFltEndDtGreaterThanEqualOrderByApplyDtAscCreateDtAsc(rq.getSearchEndDt(), rq.getSearchStDt());
List<DosFltPlanBas> planBasList = dosFltPlanQueryRepository.findPlanByBasSearch(rq);
if(planBasList.isEmpty()) {
if (planBasList.isEmpty()) {
return new ArrayList<>();
}
@ -54,29 +55,45 @@ public class BasDosService {
List<DosFltPlanArea> areaList = dosFltPlanAreaRepository.findByPlanSnoInOrderByZoneNoAsc(planSnoList);
List<DosFltPlanResult> resultList = dosFltPlanResultRepository.findByPlanSnoIn(planSnoList);
List<BasDosPlanRs> rs = planBasList.stream().map(bas -> {
List<BasDosPlanRs> rs = new ArrayList<>();
for (DosFltPlanBas bas : planBasList) {
Long planSno = bas.getPlanSno();
List<BasDosPlanAreaRs> areaRsList = areaList.stream()
.filter(area -> area.getPlanSno().equals(planSno))
.map(area -> {
DosFltPlanResult dosFltPlanResult = resultList.stream().filter(result -> result.getPlanAreaSno().equals(area.getPlanAreaSno())).findFirst().get();
return BasDosPlanAreaRs.builder()
.planAreaSno(area.getPlanAreaSno())
.planSno(area.getPlanSno())
.zoneNo(area.getZoneNo())
.bufferZone(area.getBufferZone())
.fltElev(area.getFltElev())
.lat(area.getLat())
.lon(area.getLon())
.approvalCd(dosFltPlanResult.getApprovalCd())
.bufferCoordList(getBufferCoords(area))
.build();
}).collect(Collectors.toList());
return BasDosPlanRs.builder()
List<BasDosPlanAreaRs> areaRsList = new ArrayList<>();
for (DosFltPlanArea area : areaList) {
if (area.getPlanSno().equals(planSno)) {
Optional<DosFltPlanResult> first = resultList.stream().filter(result -> result.getPlanAreaSno().equals(area.getPlanAreaSno())).findFirst();
String approvalCd = "";
if(first.isPresent()){
DosFltPlanResult dosFltPlanResult = first.get();
approvalCd = dosFltPlanResult.getApprovalCd();
}
if (rq.getApprovalCd() != null && !rq.getApprovalCd().equals(approvalCd)) {
continue;
}
BasDosPlanAreaRs areaRs = BasDosPlanAreaRs.builder()
.planAreaSno(area.getPlanAreaSno())
.planSno(area.getPlanSno())
.zoneNo(area.getZoneNo())
.bufferZone(area.getBufferZone())
.fltElev(area.getFltElev())
.lat(area.getLat())
.lon(area.getLon())
.approvalCd(approvalCd)
.bufferCoordList(getBufferCoords(area))
.build();
areaRsList.add(areaRs);
}
}
if (areaRsList.isEmpty()) {
continue;
}
BasDosPlanRs basRs = BasDosPlanRs.builder()
.planSno(bas.getPlanSno())
.applyNo(bas.getApplyNo())
.applyDt(bas.getApplyDt())
@ -87,7 +104,8 @@ public class BasDosService {
.createDt(bas.getCreateDt())
.areaList(areaRsList)
.build();
}).collect(Collectors.toList());
rs.add(basRs);
}
return rs;
}
@ -95,8 +113,8 @@ public class BasDosService {
* Buffer 좌표 추출
* 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다.
*
* @param area
* @return
* @param area: DosFltPlanArea
* @return List<Map<String, Double>>
*/
private List<Map<String, Double>> getBufferCoords(DosFltPlanArea area) {
// Circle만 체크

17
pav-server/src/main/java/com/palnet/biz/api/external/service/DronOneStopService.java vendored

@ -13,7 +13,6 @@ import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.JsonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Coordinate;
@ -92,7 +91,7 @@ public class DronOneStopService {
validFltAplyChkList.put(fltaply.getAplyno(), validZoneList);
});
// TODO: Laanc 검증(고도 중점)
// Laanc 검증(고도 중점)
for (String key : validFltAplyChkList.keySet()) {
List<Map<String, Object>> validZoneList = validFltAplyChkList.get(key);
validZoneList.forEach(saveZone -> {
@ -103,20 +102,6 @@ public class DronOneStopService {
// 좌표 추출 - 중심 좌표
Coordinate centerPoint = new Coordinate((Double) saveZone.get("lon"), (Double) saveZone.get("lat"));
// Buffer 추출 - 테두리 좌표
List<Coordinate> coordBuffers = areaUtils.createCircle(centerPoint, bufferZone);
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(coordBuffers);
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0.0, fltElev, rqGeometry);
/*
- 김포공항 관제지역 - O: 허용 관제권이 아닌 지역(미대상 지역)
- 김포공항 관제지역 승인 - P: 관제권내 허용고도
- 김포공항 관제지역 미승인 - F: 관제권내 제한고도
*/
ApprovalCd approvalCd = getApprovalCd(bufferZone, fltElev, centerPoint);
saveZone.put("approvalCd", approvalCd.getCode());
});

39
pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java

@ -0,0 +1,39 @@
package com.palnet.biz.jpa.repository.dos;
import com.palnet.biz.api.bas.dos.model.BasDosPlanRq;
import com.palnet.biz.jpa.entity.DosFltPlanBas;
import com.palnet.biz.jpa.entity.QDosFltPlanBas;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import java.util.List;
@Slf4j
@RequiredArgsConstructor
@Repository
public class DosFltPlanQueryRepository {
private final JPAQueryFactory query;
public List<DosFltPlanBas> findPlanByBasSearch(BasDosPlanRq rq) {
QDosFltPlanBas bas = QDosFltPlanBas.dosFltPlanBas;
BooleanBuilder builder = new BooleanBuilder();
if(rq.getSearchEndDt() != null) {
builder.and(bas.schFltStDt.loe(rq.getSearchEndDt()));
}
if(rq.getSearchStDt() != null) {
builder.and(bas.schFltEndDt.goe(rq.getSearchStDt()));
}
if(rq.getApplyNo() != null) {
builder.and(bas.applyNo.eq(rq.getApplyNo()));
}
return query.selectFrom(bas)
.where(builder)
.fetch();
}
}
Loading…
Cancel
Save