Browse Source

비행구역조회

pull/16/head
지대한 10 months ago
parent
commit
f68773d718
  1. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java
  2. 27
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java
  3. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java
  4. 4
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java
  5. 41
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java
  6. 243
      pav-server/src/main/java/com/palnet/biz/jpa/repository/flt/FltPlanQueryRepository.java

3
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanArcrftModel.java

@ -15,6 +15,7 @@ public class BasFlightPlanArcrftModel {
private String groupNm;
private String prdctNum;
private String arcrftTypeCd;
private String arcrftTypeNm;
private String arcrftModelNm;
private String prdctCmpnNm;
@JsonSerialize(using = InstantDateStrSerializer.class)
@ -23,6 +24,8 @@ public class BasFlightPlanArcrftModel {
private double arcrftWdth;
private double arcrftHght;
private double arcrftWght;
private String arcrftWghtCd;
private String arcrftWghtNm;
private String wghtTypeCd;
private String imageUrl;
private double takeoffWght;

27
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java

@ -1,16 +1,24 @@
package com.palnet.biz.api.bas.flight.model;
import com.palnet.biz.jpa.entity.type.FltMethod;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BasFlightPlanAreaModel {
private Integer planAreaSno;
private Integer planSno;
private String areaType;
private String fltMethod;
private String fltMethodNm;
private String fltAreaAddr;
private Integer bufferZone;
private String fltElev;
@ -23,4 +31,23 @@ public class BasFlightPlanAreaModel {
private List<BasFlightPlanAreaCoordModel> bufferCoordList;
// kac 추가 필드
private String fltMothoeRm;
// public BasFlightPlanAreaModel(Integer planAreaSno, Integer planSno, String areaType, FltMethod fltMethod, String fltAreaAddr, Integer bufferZone, String fltElev, String createUserId, Instant createDt, String updateUserId, Instant updateDt, String docState, List<BasFlightPlanAreaCoordModel> coordList, List<BasFlightPlanAreaCoordModel> bufferCoordList, String fltMothoeRm) {
// this.planAreaSno = planAreaSno;
// this.planSno = planSno;
// this.areaType = areaType;
// this.fltMethod = fltMethod.getCode();
// this.fltMethodNm = fltMethod.getValue();
// this.fltAreaAddr = fltAreaAddr;
// this.bufferZone = bufferZone;
// this.fltElev = fltElev;
// this.createUserId = createUserId;
// this.createDt = createDt;
// this.updateUserId = updateUserId;
// this.updateDt = updateDt;
// this.docState = docState;
// this.coordList = coordList;
// this.bufferCoordList = bufferCoordList;
// this.fltMothoeRm = fltMothoeRm;
// }
}

3
pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanModel.java

@ -21,6 +21,9 @@ public class BasFlightPlanModel {
private Instant schFltStDt;
private Instant schFltEndDt;
private String fltPurpose;
private String fltPurposeNm;
private String fltType;
private String fltTypeNm;
private String aprvlYn;
private String delYn;
private String createUserId;

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

@ -155,12 +155,12 @@ public class CtrCntrlController {
@GetMapping("/flight_plan/{idntfNum}")
@ApiOperation(value = "TODO 비행 관제 사용자 비행 계획서 정보")
@Tag(name = "드론 관제 시스템", description = "드론 관제 관련 API")
@ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class)
@ApiImplicitParam(name = "idtfNum",value = "식별번호", dataTypeClass = String.class, paramType = "query")
public ResponseEntity<? extends BasicResponse> findFlightPlan(@PathVariable("idntfNum") String idntfNum) {
List<BasFlightPlanModel> list;
try {
list = service.getFlightPlan(idntfNum);
list = service.getFlightPlanForKac(idntfNum);
} catch (Exception e) {
log.error("IGNORE : {}", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)

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

@ -70,6 +70,7 @@ public class CtrCntrlService {
private final FltPlanAreaCoordRepository planCoordRepository;
private final AreaUtils areaUtils;
private final ControlGpsDataContext shareContext;
private final FltPlanQueryRepository fltPlanQueryRepository;
@ -363,6 +364,46 @@ public class CtrCntrlService {
return rs;
}
/**
* 식별 번호에 해당되는 비행구역 조회
* KAC에서는 기초데이터를 먼저 입력하는 것이 아닌 비행계획서만 작성하므로 생략되는 로직이 있음
* 따라서 별도로 구성함
* @param idntfNum
* @return
*/
public List<BasFlightPlanModel> getFlightPlanForKac(String idntfNum) {
List<BasFlightPlanModel> rs = fltPlanQueryRepository.getPlanByIdntfNum(idntfNum);
// Line일 경우 버퍼 생성
if(rs != null && !rs.isEmpty()){
rs.forEach(r -> {
List<BasFlightPlanAreaModel> areaList = r.getAreaList();
if(areaList != null && !areaList.isEmpty()){
areaList.forEach(a -> {
List<BasFlightPlanAreaCoordModel> coordList = a.getCoordList();
if(coordList != null && !coordList.isEmpty()){
// Buffer 영역 생성 저장
if ("LINE".equals(a.getAreaType())) {
List<Coordinate> convertCoordinates = areaUtils.convertCoordinates(coordList);
List<Coordinate> transCoordList = areaUtils.transform(convertCoordinates, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(transCoordList, a.getBufferZone());
List<Coordinate> transBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); // buffer 영역 좌표계 변환
List<BasFlightPlanAreaCoordModel> bufferCoordList = areaUtils.convertModel(transBufferList);
a.setBufferCoordList(bufferCoordList);
}
}
});
}
});
}
return rs;
}
/**
* TODO 비행 관제 비정상 상황 판별
*

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

@ -1,58 +1,13 @@
package com.palnet.biz.jpa.repository.flt;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.palnet.biz.api.main.dash.model.MainCurrentStcsModel;
import com.querydsl.core.types.dsl.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
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.*;
import com.palnet.biz.api.main.dash.model.MainDashFlightListModel;
import com.palnet.biz.api.main.dash.model.MainDashStcsModel;
import com.palnet.biz.api.main.statistics.model.FlightStcsValueModel;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.QComArcrftBas;
import com.palnet.biz.jpa.entity.QComFileBas;
import com.palnet.biz.jpa.entity.QComIdntfBas;
import com.palnet.biz.jpa.entity.QCtrCntrlBas;
import com.palnet.biz.jpa.entity.QCtrCntrlHstryArea;
import com.palnet.biz.jpa.entity.QFltPlanArcrft;
import com.palnet.biz.jpa.entity.QFltPlanArea;
import com.palnet.biz.jpa.entity.QFltPlanAreaCoord;
import com.palnet.biz.jpa.entity.QFltPlanBas;
import com.palnet.biz.jpa.entity.QFltPlanCtrCntrlRel;
import com.palnet.biz.jpa.entity.QFltPlanPilot;
import com.palnet.biz.jpa.entity.QPtyCstmrDtl;
import com.palnet.biz.jpa.entity.QPtyCstmrGroup;
import com.palnet.biz.jpa.entity.QPtyGroupBas;
import com.palnet.biz.jpa.model.LaancAprvSearchDto;
import com.palnet.biz.jpa.model.LaancPlanArcrftDto;
import com.palnet.biz.jpa.model.LaancPlanAreaDto;
import com.palnet.biz.jpa.model.LaancPlanDto;
import com.palnet.biz.jpa.model.LaancPlanPilotDto;
import com.palnet.biz.jpa.model.LaancPlanareaCoordDto;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.entity.type.*;
import com.palnet.biz.jpa.model.*;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.InstantUtils;
import com.querydsl.core.BooleanBuilder;
@ -62,17 +17,23 @@ import com.querydsl.core.types.ConstantImpl;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.ComparableExpressionBase;
import com.querydsl.core.types.dsl.DateTemplate;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.StringTemplate;
import com.querydsl.core.types.dsl.*;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Repository
@ -115,6 +76,7 @@ public class FltPlanQueryRepository {
}
builder.and(bas.delYn.ne("Y"));
List<BasFlightPlanModel> r = query
.from(bas)
.leftJoin(area)
@ -2060,4 +2022,175 @@ public class FltPlanQueryRepository {
return result;
}
// 기체번호로 비행계획서 조회
public List<BasFlightPlanModel> getPlanByIdntfNum(String idntfNum) {
QFltPlanBas bas = QFltPlanBas.fltPlanBas;
QFltPlanArcrft arcrft = QFltPlanArcrft.fltPlanArcrft;
QFltPlanArea area = QFltPlanArea.fltPlanArea;
QFltPlanAreaCoord coord = QFltPlanAreaCoord.fltPlanAreaCoord;
Instant fltNowDt = Instant.now();
List<BasFlightPlanModel> rs = query.from(bas)
.leftJoin(arcrft)
.on(bas.planSno.eq(arcrft.planSno))
.leftJoin(area)
.on(area.planSno.eq(area.planSno))
.where(
arcrft.idntfNum.eq(idntfNum)
.and(bas.aprvlYn.eq("Y"))
.and(bas.schFltStDt.before(fltNowDt))
.and(bas.schFltEndDt.after(fltNowDt))
)
.orderBy(bas.createDt.desc())
.transform(
GroupBy.groupBy(bas.planSno)
.list(Projections.bean(
BasFlightPlanModel.class,
bas.planSno,
bas.groupId,
bas.cstmrSno,
bas.memberName,
bas.fltType.stringValue().as("fltType"),
bas.email,
bas.hpno,
bas.clncd,
bas.addr,
bas.addrDtlCn,
bas.zip,
bas.schFltStDt,
bas.schFltEndDt,
bas.fltPurpose.stringValue().as("fltPurpose"),
bas.aprvlYn,
bas.delYn,
bas.fileGroupNo,
bas.createUserId,
bas.createDt,
bas.updateUserId,
bas.updateDt,
bas.corpRegYn,
bas.serviceType,
GroupBy.list(Projections.bean(
BasFlightPlanAreaModel.class,
area.planAreaSno,
area.planSno,
area.areaType,
area.fltMethod.stringValue().as("fltMethod"),
area.bufferZone,
area.fltElev,
area.createUserId,
area.createDt,
area.updateUserId,
area.updateDt,
area.fltMothoeRm
).skipNulls()).as("areaList"),
GroupBy.list(Projections.bean(
BasFlightPlanArcrftModel.class,
arcrft.planArcrftSno,
arcrft.planSno,
arcrft.arcrftSno,
arcrft.idntfNum,
arcrft.groupNm,
arcrft.prdctNum,
arcrft.arcrftTypeCd.stringValue().as("arcrftTypeCd"),
arcrft.arcrftModelNm,
arcrft.prdctCmpnNm,
arcrft.prdctDate,
arcrft.arcrftLngth,
arcrft.arcrftWdth,
arcrft.arcrftHght,
arcrft.arcrftWght,
arcrft.arcrftWghtCd.stringValue().as("arcrftWghtCd"),
arcrft.wghtTypeCd,
arcrft.imageUrl,
arcrft.takeoffWght,
arcrft.useYn,
arcrft.cameraYn,
arcrft.insrncYn,
arcrft.ownerNm,
arcrft.createUserId,
arcrft.createDt,
arcrft.updateUserId,
arcrft.updateDt,
arcrft.acrftInsuranceYn,
arcrft.insuranceExperiod,
arcrft.corporationNm
).skipNulls()).as("arcrftList")
).skipNulls())
);
if (rs != null && !rs.isEmpty()) {
// enum cd -> nm
for (BasFlightPlanModel p : rs) {
if (p == null) continue;
FltType fltType = FltType.fromCode(p.getFltType());
if (fltType != null) p.setFltTypeNm(fltType.getValue());
FltPurpose fltPurpose = FltPurpose.fromCode(p.getFltPurpose());
if (fltPurpose != null) p.setFltPurposeNm(fltPurpose.getValue());
if (p.getAreaList() != null && !p.getAreaList().isEmpty()) {
for (BasFlightPlanAreaModel a : p.getAreaList()) {
if (a == null) continue;
FltMethod fltMethod = FltMethod.fromCode(a.getFltMethod());
if (fltMethod != null) a.setFltMethodNm(fltMethod.getValue());
}
}
if (p.getArcrftList() != null && !p.getArcrftList().isEmpty()) {
for (BasFlightPlanArcrftModel c : p.getArcrftList()) {
if (c == null) continue;
ArcrftTypeCd arcrftTypeCd = ArcrftTypeCd.fromCode(c.getArcrftTypeCd());
if (arcrftTypeCd != null) c.setArcrftTypeNm(arcrftTypeCd.getValue());
ArcrftWghtCd arcrftWghtCd = ArcrftWghtCd.fromCode(c.getArcrftWghtCd());
if (arcrftWghtCd != null) c.setArcrftWghtNm(arcrftWghtCd.getValue());
}
}
}
List<Integer> areaSnoList = rs.stream()
.filter(p -> p != null && p.getAreaList() != null && !p.getAreaList().isEmpty())
.map(p -> {
List<BasFlightPlanAreaModel> areaList = p.getAreaList();
return areaList.stream().map(BasFlightPlanAreaModel::getPlanAreaSno).collect(Collectors.toList());
}).flatMap(Collection::stream).collect(Collectors.toList());
List<BasFlightPlanAreaCoordModel> coordEntities = query.select(
Projections.bean(
BasFlightPlanAreaCoordModel.class,
coord.planAreaCoordSno,
coord.planAreaSno,
coord.lat,
coord.lon,
coord.createUserId,
coord.createDt
)
)
.from(coord)
.where(coord.planAreaSno.in(areaSnoList))
.orderBy(coord.planAreaSno.asc(), coord.planAreaCoordSno.asc())
.fetch();
Map<Integer, List<BasFlightPlanAreaCoordModel>> coordMap = coordEntities.stream().collect(Collectors.groupingBy(BasFlightPlanAreaCoordModel::getPlanAreaSno));
if (!areaSnoList.isEmpty()) {
rs.forEach(r -> {
List<BasFlightPlanAreaModel> areaList = r.getAreaList();
areaList.forEach(a -> {
List<BasFlightPlanAreaCoordModel> coordList = coordMap.get(a.getPlanAreaSno());
if (coordList != null && !coordList.isEmpty()) {
a.setCoordList(coordList);
}
});
});
}
}
return rs;
}
}
Loading…
Cancel
Save