Browse Source

LAANC 임시 코드 및 비행계획서 등록/수정

pull/5/head
지대한 1 year ago
parent
commit
0c1111c657
  1. 178
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java
  2. 26
      pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java
  3. 30
      pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java
  4. 41
      pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java
  5. 5
      pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java

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

@ -1,24 +1,30 @@
package com.palnet.biz.api.bas.flight.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
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.*;
import com.palnet.biz.api.bas.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import com.palnet.biz.api.external.service.TsService;
import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.repository.flt.*;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
@ -26,40 +32,27 @@ import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
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.group.model.BasGroupJoinModel;
import com.palnet.biz.api.comn.model.ComnPagingRs;
import com.palnet.biz.jpa.entity.FltPlanArcrft;
import com.palnet.biz.jpa.entity.FltPlanArea;
import com.palnet.biz.jpa.entity.FltPlanAreaCoord;
import com.palnet.biz.jpa.entity.FltPlanBas;
import com.palnet.biz.jpa.entity.FltPlanPilot;
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository;
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel;
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService;
import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.EncryptUtils;
import lombok.extern.log4j.Log4j2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Log4j2
@Slf4j
@RequiredArgsConstructor
@Service
@Transactional(readOnly = true)
public class BasFlightService {
@Autowired
private CtrTrnsLctnService ctrTrnsLctnService;
private final CtrTrnsLctnService ctrTrnsLctnService;
private final FltPlanBasRepository fltPlanBasRepository;
private final FltPlanArcrftRepository fltPlanArcrftRepository;
private final FltPlanAreaRepository fltPlanAreaRepository;
@ -67,28 +60,10 @@ public class BasFlightService {
private final FltPlanPilotRepository fltPlanPilotRepository;
private final FltPlanQueryRepository fltPlanQueryRepository;
private final PtyGroupQueryRepository ptyPlanQueryRepository;
private final TsService tsService;
private final JwtTokenUtil jwtTokenUtil;
private final AreaUtils areaUtils;
public BasFlightService(FltPlanBasRepository fltPlanBasRepository,
FltPlanArcrftRepository fltPlanArcrftRepository,
FltPlanAreaRepository fltPlanAreaRepository,
FltPlanAreaCoordRepository fltPlanAreaCoordRepository,
FltPlanPilotRepository fltPlanPilotRepository,
FltPlanQueryRepository fltPlanQueryRepository,
PtyGroupQueryRepository ptyPlanQueryRepository,
JwtTokenUtil jwtTokenUtil,
AreaUtils areaUtils) {
this.fltPlanBasRepository = fltPlanBasRepository;
this.fltPlanArcrftRepository = fltPlanArcrftRepository;
this.fltPlanAreaRepository = fltPlanAreaRepository;
this.fltPlanAreaCoordRepository = fltPlanAreaCoordRepository;
this.fltPlanPilotRepository = fltPlanPilotRepository;
this.fltPlanQueryRepository = fltPlanQueryRepository;
this.ptyPlanQueryRepository = ptyPlanQueryRepository;
this.jwtTokenUtil = jwtTokenUtil;
this.areaUtils = areaUtils;
}
// 비행계획서 조회
public ComnPagingRs<BasFlightPlanModel> listPlan(BasFlightPlanListRq rq) {
@ -181,6 +156,7 @@ public class BasFlightService {
.planAreaDuplicatdYn("N")
.build();
boolean isEqualsFltElev = false;
List<BasFlightPlanAreaModel> rqAreaList = rq.getAreaList();
String rqFltElev = rqAreaList.get(0).getFltElev();
@ -293,6 +269,35 @@ public class BasFlightService {
}
}
// 공역 중복 확인
for (BasFlightPlanAreaModel rqArea : rq.getAreaList()) {
List<Coordinate> rqCoord = new ArrayList<>();
List<Coordinate> rqCoordBufferList = new ArrayList<>();
//rq로 들어온 좌표로 버퍼좌표 생성
for (BasFlightPlanAreaCoordModel coord : rqArea.getCoordList()) {
Coordinate coords = new Coordinate(coord.getLon(), coord.getLat());
rqCoord.add(coords);
}
if ("LINE".equals(rqArea.getAreaType())) {
List<Coordinate> trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181");
List<Coordinate> bufferList = areaUtils.buffer(trans, rqArea.getBufferZone());
rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326");
} else if ("POLYGON".equals(rqArea.getAreaType())) {
rqCoordBufferList.addAll(rqCoord);
} else if ("CIRCLE".equals(rqArea.getAreaType())) {
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), rqArea.getBufferZone());
}
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList);
Integer fltElev = Integer.valueOf(rqArea.getFltElev());
if(fltElev == null) fltElev = 0;
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry);
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo);
rs.setAirspaceDuplicatedYn(duplicatedAirspace ? "Y" : "N");
}
return rs;
}
@ -302,12 +307,22 @@ public class BasFlightService {
// 비행계획서 유효성 검사.
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
PilotValidRq pilotValidRq = PilotValidRq.builder()
.pilotci("조종사CI")
.declarationnum("기체신고번호")
.build();
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq);
if(pilotValidRs == null){
rs.setPilotQlfcYn("N");
rs.setAcrftInsuranceYn("N");
} else {
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn());
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn());
}
// TODO LAANC가 검증된것들만 DB저장 - LAANC가 미승인이라도 저장해야하는지 확인 필요
if(!rs.isValid()) return rs;
// 비행계획서
@ -317,6 +332,10 @@ public class BasFlightService {
basEntity.setAprvlYn("N");
basEntity.setCreateUserId(userId);
basEntity.setUpdateUserId(userId);
// 사업자 유무 - TS 데이터
basEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
basEntity.setServiceType("PAV-KAC");
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity);
Integer planSno = rBasEntity.getPlanSno();
// 비행구역
@ -327,6 +346,7 @@ public class BasFlightService {
areaEntity.setPlanSno(planSno);
areaEntity.setCreateUserId(userId);
areaEntity.setUpdateUserId(userId);
FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity);
Integer planAreaSno = rAreaEntity.getPlanAreaSno();
List<BasFlightPlanAreaCoordModel> coordModelList = areaModel.getCoordList();
@ -362,6 +382,10 @@ public class BasFlightService {
arcrftEntity.setPlanSno(planSno);
arcrftEntity.setCreateUserId(userId);
arcrftEntity.setUpdateUserId(userId);
// 추가 필드
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
// arcrftEntity.setCorporationNm(null); // 법인명
fltPlanArcrftRepository.save(arcrftEntity);
}
}
@ -372,15 +396,24 @@ public class BasFlightService {
@Transactional
public BasFlightPlanLaancRs updatePlan(BasFlightPlanModel rq) {
// 비행계획서 유효성 검사.
// 비행계획서 유효성 검사.
BasFlightPlanLaancRs rs = this.planValid(rq);
// TODO 공역 중복 확인
rs.setAirspaceDuplicatedYn("N");
// TODO 조종사 자격 및 기체보험 확인
rs.setPilotQlfcYn("Y");
rs.setAcrftInsuranceYn("Y");
PilotValidRq pilotValidRq = PilotValidRq.builder()
.pilotci("조종사CI")
.declarationnum("기체신고번호")
.build();
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq);
if(pilotValidRs == null){
rs.setPilotQlfcYn("N");
rs.setAcrftInsuranceYn("N");
} else {
rs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn());
rs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn());
}
// LAANC가 검증된것들만 DB저장
if(!rs.isValid()) return rs;
if (rq != null && rq.getPlanSno() != null) {
@ -390,6 +423,10 @@ public class BasFlightService {
FltPlanBas planEntity = fltPlanBasRepository.findById(planSno).orElseThrow();
BasFlightMapper.mapper.updateEntityByModel(planEntity, rq);
planEntity.setUpdateUserId(userId);
// 사업자 유무 - TS 데이터
planEntity.setCorpRegYn(pilotValidRs.getCorpregyn()); // 사업자유무
// planEntity.setServiceType("PAV-KAC");
fltPlanBasRepository.save(planEntity);
// 비행구역
@ -406,6 +443,7 @@ public class BasFlightService {
BasFlightMapper.mapper.updateEntityByModel(areaEntity, areaModel);
}
areaEntity.setUpdateUserId(userId);
fltPlanAreaRepository.save(areaEntity);
@ -487,6 +525,8 @@ public class BasFlightService {
} else {
BasFlightMapper.mapper.updateEntityByModel(arcrftEntity, arcrftModel);
}
// 추가 필드
arcrftEntity.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); // 보험여부
fltPlanArcrftRepository.save(arcrftEntity);
}
List<FltPlanArcrft> deleteArcrftEntity = arcrftEntityList.stream().filter(fltPlanArcrft -> {

26
pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRq.java vendored

@ -0,0 +1,26 @@
package com.palnet.biz.api.external.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.external.model
* fileName : PilotValidRq
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PilotValidRq {
private String pilotci; // 조종사 ci - 본인인증
private String declarationnum; // 기체신고번호
}

30
pav-server/src/main/java/com/palnet/biz/api/external/model/PilotValidRs.java vendored

@ -0,0 +1,30 @@
package com.palnet.biz.api.external.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.external.model
* fileName : PilotValidRq
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PilotValidRs {
private String rspCode; // 결과코드
private String rspMessage; // 결과메시지
private String pilotcredentialyn; // 조종사자격증명여부
private String arcrftinsuranceyn; // 기체보험가입여부
private String arcrftdeclaration; // 기체신고여부
private String corpregyn; // 사업자유무
}

41
pav-server/src/main/java/com/palnet/biz/api/external/service/TsService.java vendored

@ -0,0 +1,41 @@
package com.palnet.biz.api.external.service;
import com.palnet.biz.api.external.model.PilotValidRq;
import com.palnet.biz.api.external.model.PilotValidRs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* packageName : com.palnet.biz.api.external.service
* fileName : TsService
* author : dhji
* date : 2023-09-21(021)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-09-21(021) dhji 최초 생성
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class TsService {
public PilotValidRs callPilotValid(PilotValidRq rq) {
// if(rq.getPilotci() == null || rq.getDeclarationnum() == null) {
// return null;
// }
// TODO: call pilot valid api
// RS 임시코드 - 추후 조건에 따른 TRUE/FALSE 처리 필요
PilotValidRs pilotValidRs = new PilotValidRs();
pilotValidRs.setRspCode("200");
pilotValidRs.setRspMessage("success");
pilotValidRs.setPilotcredentialyn("Y");
pilotValidRs.setArcrftinsuranceyn("Y");
pilotValidRs.setArcrftdeclaration("Y");
pilotValidRs.setCorpregyn("Y");
return pilotValidRs;
}
}

5
pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java

@ -10,8 +10,9 @@ public enum ErrorCode {
DATA_NO("DT003", "데이터 미존재"),
DB_ERROR("DB001" , "디비 처리중 오류"),
PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."),
ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오.");
ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."),
EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다.");
private final String code;

Loading…
Cancel
Save