지대한
1 year ago
22 changed files with 1021 additions and 294 deletions
@ -0,0 +1,54 @@
|
||||
package com.palnet.biz.api.acnt.cstmr.model; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
/** |
||||
* packageName : com.palnet.biz.api.acnt.cstmr.model |
||||
* fileName : AnctCstmrModel |
||||
* author : dhji |
||||
* date : 2023-09-22(022) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-09-22(022) dhji 최초 생성 |
||||
*/ |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@Data |
||||
public class AnctCstmrModel { |
||||
private Integer cstmrSno; |
||||
private String authId; |
||||
private String cstmrDivCd; |
||||
private String cstmrStatusCd; |
||||
private Instant cstmrStatusCngDt; |
||||
private Instant joinDt; |
||||
private String joinIp; |
||||
private String memberDivCd; |
||||
private Instant pswdUpdtDt; |
||||
private String siteCode; |
||||
private String userId; |
||||
private String rfrshToken; |
||||
private String trmnlId; |
||||
private String addr; |
||||
private String addrDtlCn; |
||||
private Instant brthdyDate; |
||||
private String clncd; |
||||
private String cntryCd; |
||||
private String email; |
||||
private String genderCd; |
||||
private String hpno; |
||||
private String ipinCi; |
||||
private String ipinDi; |
||||
private String joinCrtfyCd; |
||||
private String memberName; |
||||
private Instant updateDt; |
||||
private String updateUserId; |
||||
private String zip; |
||||
} |
@ -0,0 +1,103 @@
|
||||
package com.palnet.biz.api.bas.laanc.controller; |
||||
|
||||
import com.palnet.biz.api.bas.flight.template.service.TemplateService; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancLastRs; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancValidatedRs; |
||||
import com.palnet.biz.api.bas.laanc.service.BasLaancService; |
||||
import com.palnet.biz.api.comn.response.BasicResponse; |
||||
import com.palnet.biz.api.comn.response.ErrorResponse; |
||||
import com.palnet.biz.api.comn.response.SuccessResponse; |
||||
import com.palnet.comn.exception.CustomException; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import io.swagger.v3.oas.annotations.tags.Tag; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.http.HttpStatus; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.http.ResponseEntity; |
||||
import org.springframework.web.bind.annotation.*; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* packageName : com.palnet.biz.api.bas.laanc.controller |
||||
* fileName : BasLaancController |
||||
* author : dhji |
||||
* date : 2023-09-22(022) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-09-22(022) dhji 최초 생성 |
||||
*/ |
||||
@Slf4j |
||||
@Tag(name = "LAANC", description = "LAANC 관련 API") |
||||
@RequiredArgsConstructor |
||||
@RequestMapping(value = "/api/bas/laanc", produces = {MediaType.APPLICATION_JSON_VALUE}) |
||||
@RestController |
||||
public class BasLaancController { |
||||
|
||||
private final BasLaancService basLaancService; |
||||
private final TemplateService templateService; |
||||
|
||||
// LAANC 검증
|
||||
@PostMapping(value = "/plan/valid") |
||||
@ApiOperation(value = "LAANC 검증") |
||||
@Tag(name = "LAANC 검증", description = "LAANC 관련 API") |
||||
public ResponseEntity<? extends BasicResponse> validationLaanc(BasLaancPlanRq rq) { |
||||
BasLaancValidatedRs rs = null; |
||||
try { |
||||
log.debug(">>> rq : {}", rq); |
||||
rs = basLaancService.validationLaanc(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()); |
||||
resultMap.put("errorMessage", e.getMessage()); |
||||
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); |
||||
} 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<>(rs)); |
||||
} |
||||
|
||||
// 비행계획서 등록, 약관 등록, 공문 생성
|
||||
@PostMapping(value = "/plan/create") |
||||
@ApiOperation(value = "비행계획서 등록") |
||||
@Tag(name = "비행계획서", description = "비행계획서 관련 API") |
||||
public ResponseEntity<? extends BasicResponse> createPlan(@RequestBody BasLaancPlanRq rq) { |
||||
BasLaancLastRs rs = null; |
||||
try { |
||||
rs = basLaancService.createFlightPlan(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()); |
||||
resultMap.put("errorMessage", e.getMessage()); |
||||
return ResponseEntity.ok().body(new SuccessResponse<Map>(resultMap)); |
||||
} 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<>(rs)); |
||||
} |
||||
|
||||
@GetMapping("/laanc-pdf/download") |
||||
@Tag(name = "비행계획서", description = "비행계획서 관련 API") |
||||
@ApiOperation(value = "Laanc 공문 다운로드") |
||||
public void downloadPDF(int fileSno) { |
||||
|
||||
templateService.fileDownload(fileSno); |
||||
} |
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.palnet.biz.api.bas.laanc.model; |
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
||||
import com.palnet.biz.config.convert.InstantDateStrSerializer; |
||||
import lombok.Data; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
public class BasLaancArcrftModel { |
||||
private Integer planArcrftSno; |
||||
private Integer planSno; |
||||
private Integer arcrftSno; |
||||
private String idntfNum; |
||||
private String groupNm; |
||||
private String prdctNum; |
||||
private String arcrftTypeCd; |
||||
private String arcrftModelNm; |
||||
private String prdctCmpnNm; |
||||
@JsonSerialize(using = InstantDateStrSerializer.class) |
||||
private Instant prdctDate; |
||||
private double arcrftLngth; |
||||
private double arcrftWdth; |
||||
private double arcrftHght; |
||||
private double arcrftWght; |
||||
private String wghtTypeCd; |
||||
private String imageUrl; |
||||
private double takeoffWght; |
||||
private String useYn; |
||||
private String cameraYn; |
||||
private String insrncYn; |
||||
private String ownerNm; |
||||
private String createUserId; |
||||
private Instant createDt; |
||||
private String updateUserId; |
||||
private Instant updateDt; |
||||
private String docState = "R"; |
||||
private String idntfTypeCd; |
||||
// kac 추가 필드
|
||||
private String acrftInsuranceYn; |
||||
@JsonSerialize(using = InstantDateStrSerializer.class) |
||||
private Instant insuranceExperiod; |
||||
private String corporationNm; |
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.palnet.biz.api.bas.laanc.model; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
public class BasLaancAreaCoordModel { |
||||
private Integer planAreaCoordSno; |
||||
private Integer planAreaSno; |
||||
private double lat; |
||||
private double lon; |
||||
private String createUserId; |
||||
private Instant createDt; |
||||
private String docState = "R"; |
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.palnet.biz.api.bas.laanc.model; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class BasLaancAreaModel { |
||||
private Integer planAreaSno; |
||||
private Integer planSno; |
||||
private String areaType; |
||||
private String fltMethod; |
||||
private Integer bufferZone; |
||||
private String fltElev; |
||||
private String createUserId; |
||||
private Instant createDt; |
||||
private String updateUserId; |
||||
private Instant updateDt; |
||||
private String docState = "R"; |
||||
private List<BasLaancAreaCoordModel> coordList; |
||||
private List<BasLaancAreaCoordModel> bufferCoordList; |
||||
// kac 추가 필드
|
||||
private String fltMothoeRm; |
||||
} |
@ -0,0 +1,27 @@
|
||||
package com.palnet.biz.api.bas.laanc.model; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
public class BasLaancPilotModel { |
||||
private Integer planPilotSno; |
||||
private Integer planSno; |
||||
private Integer cstmrSno; |
||||
private String groupNm; |
||||
private String memberName; |
||||
private String email; |
||||
private String hpno; |
||||
private String clncd; |
||||
private String addr; |
||||
private String addrDtlCn; |
||||
private String zip; |
||||
private String qlfcNo; |
||||
private String carrer; |
||||
private String createUserId; |
||||
private Instant createDt; |
||||
private String updateUserId; |
||||
private Instant updateDt; |
||||
private String docState = "R"; |
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.palnet.biz.api.bas.laanc.model; |
||||
|
||||
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; |
||||
import lombok.Data; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class BasLaancPlanRq { |
||||
private Integer planSno; |
||||
private Integer cstmrSno; |
||||
private String memberName; |
||||
private Instant schFltStDt; |
||||
private Instant schFltEndDt; |
||||
private String fltPurpose; |
||||
|
||||
private String corpRegYn; |
||||
private String serviceType; |
||||
|
||||
private String docState = "R"; |
||||
private List<BasLaancAreaModel> areaList; |
||||
// private List<BasFlightPlanPilotModel> pilotList;
|
||||
private List<BasLaancArcrftModel> arcrftList; |
||||
|
||||
// laanc 정보
|
||||
private BasLaancValidatedRs validatedRs; |
||||
// 약관동의
|
||||
private List<AnctCstmrTermsModel> terms; |
||||
} |
@ -0,0 +1,43 @@
|
||||
package com.palnet.biz.api.bas.laanc.service; |
||||
|
||||
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancArcrftModel; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancAreaCoordModel; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancAreaModel; |
||||
import com.palnet.biz.api.bas.laanc.model.BasLaancPlanRq; |
||||
import com.palnet.biz.jpa.entity.*; |
||||
import org.mapstruct.Mapper; |
||||
import org.mapstruct.MappingTarget; |
||||
import org.mapstruct.ReportingPolicy; |
||||
import org.mapstruct.factory.Mappers; |
||||
|
||||
/** |
||||
* packageName : com.palnet.biz.api.bas.laanc.service |
||||
* fileName : BasLaancMapper |
||||
* author : dhji |
||||
* date : 2023-09-22(022) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-09-22(022) dhji 최초 생성 |
||||
*/ |
||||
@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE) |
||||
public interface BasLaancMapper { |
||||
BasLaancMapper MAPPER = Mappers.getMapper(BasLaancMapper.class); |
||||
|
||||
FltPlanBas mergeToEntity(@MappingTarget FltPlanBas rq1, FltPlanBas rq2); |
||||
|
||||
FltPlanBas modelToPlanEntity(AnctCstmrModel rq); |
||||
|
||||
FltPlanBas modelToPlanEntity(BasLaancPlanRq rq); |
||||
|
||||
FltPlanArea modelToPlanEntity(BasLaancAreaModel rq); |
||||
|
||||
FltPlanAreaCoord modelToPlanEntity(BasLaancAreaCoordModel rq); |
||||
|
||||
FltPlanArcrft modelToPlanEntity(BasLaancArcrftModel rq); |
||||
|
||||
FltPlanPilot modelToPilotEntity(AnctCstmrModel rq); |
||||
|
||||
} |
@ -0,0 +1,328 @@
|
||||
package com.palnet.biz.api.bas.laanc.service; |
||||
|
||||
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrModel; |
||||
import com.palnet.biz.api.acnt.cstmr.model.AnctCstmrTermsModel; |
||||
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
||||
import com.palnet.biz.api.bas.laanc.model.*; |
||||
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.PtyCstmrQueryRepository; |
||||
import com.palnet.biz.jpa.repository.pty.PtyGroupQueryRepository; |
||||
import com.palnet.biz.jpa.repository.pty.PtyTermsAgreeTxnRepository; |
||||
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.AirspaceUtils; |
||||
import com.palnet.comn.utils.AreaUtils; |
||||
import com.palnet.comn.utils.HttpUtils; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.locationtech.jts.geom.Coordinate; |
||||
import org.locationtech.jts.geom.Geometry; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* packageName : com.palnet.biz.api.bas.laanc.service |
||||
* fileName : BasLaancService |
||||
* author : dhji |
||||
* date : 2023-09-22(022) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-09-22(022) dhji 최초 생성 |
||||
*/ |
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
@Service |
||||
public class BasLaancService { |
||||
|
||||
|
||||
private final CtrTrnsLctnService ctrTrnsLctnService; |
||||
private final FltPlanBasRepository fltPlanBasRepository; |
||||
private final FltPlanArcrftRepository fltPlanArcrftRepository; |
||||
private final FltPlanAreaRepository fltPlanAreaRepository; |
||||
private final FltPlanAreaCoordRepository fltPlanAreaCoordRepository; |
||||
private final FltPlanPilotRepository fltPlanPilotRepository; |
||||
private final FltPlanQueryRepository fltPlanQueryRepository; |
||||
private final PtyGroupQueryRepository ptyPlanQueryRepository; |
||||
private final PtyCstmrQueryRepository ptyCstmrQueryRepository; |
||||
private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; |
||||
private final TsService tsService; |
||||
private final JwtTokenUtil jwtTokenUtil; |
||||
private final AreaUtils areaUtils; |
||||
|
||||
|
||||
// LAANC 검증
|
||||
public BasLaancValidatedRs validationLaanc(BasLaancPlanRq rq) { |
||||
BasLaancValidatedRs basLaancValidatedRs = this.validationAreaAndArcrft(rq); |
||||
|
||||
|
||||
// TODO 조종사 자격 및 기체보험 확인
|
||||
PilotValidRq pilotValidRq = PilotValidRq.builder() |
||||
.pilotci("조종사CI") |
||||
.declarationnum("기체신고번호") |
||||
.build(); |
||||
|
||||
PilotValidRs pilotValidRs = tsService.callPilotValid(pilotValidRq); |
||||
if (pilotValidRs == null) { |
||||
basLaancValidatedRs.setPilotQlfcYn("N"); |
||||
basLaancValidatedRs.setAcrftInsuranceYn("N"); |
||||
basLaancValidatedRs.setCorpRegYn("N"); |
||||
} else { |
||||
basLaancValidatedRs.setPilotQlfcYn(pilotValidRs.getPilotcredentialyn()); |
||||
basLaancValidatedRs.setAcrftInsuranceYn(pilotValidRs.getArcrftinsuranceyn()); |
||||
basLaancValidatedRs.setCorpRegYn(pilotValidRs.getCorpregyn()); |
||||
} |
||||
|
||||
return basLaancValidatedRs; |
||||
|
||||
} |
||||
|
||||
// 비행계획서 등록, 약관 등록, 공문 생성
|
||||
public BasLaancLastRs createFlightPlan(BasLaancPlanRq rq) { |
||||
BasLaancValidatedRs basLaancValidatedRs = this.validationAreaAndArcrft(rq); |
||||
// LAANC가 검증된것들만 DB저장
|
||||
if (!basLaancValidatedRs.isValidAirspace()) new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); |
||||
|
||||
|
||||
// 비행계획서 - // TODO 작성자 정보 불러와서 넣기
|
||||
String userId = jwtTokenUtil.getUserIdByToken(); |
||||
Integer cstmrSno = jwtTokenUtil.getCstmrSnoByToken(); |
||||
// 개인정보 가져오기 - 비행계획서 작성자 정보, 조종사 정보
|
||||
AnctCstmrModel cstmrInfo = ptyCstmrQueryRepository.findByCstmrSno(cstmrSno); |
||||
FltPlanBas cstmrFltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(cstmrInfo); |
||||
FltPlanBas rqFltPlanBas = BasLaancMapper.MAPPER.modelToPlanEntity(rq); |
||||
|
||||
FltPlanBas fltPlanBas = BasLaancMapper.MAPPER.mergeToEntity(rqFltPlanBas, cstmrFltPlanBas); |
||||
fltPlanBas.setDelYn("N"); |
||||
fltPlanBas.setAprvlYn("N"); |
||||
fltPlanBas.setCreateUserId(userId); |
||||
fltPlanBas.setUpdateUserId(userId); |
||||
// 사업자 유무 - TS 데이터
|
||||
fltPlanBas.setCorpRegYn(rq.getValidatedRs().getCorpRegYn()); // 사업자유무
|
||||
fltPlanBas.setServiceType("PAV-KAC"); |
||||
|
||||
FltPlanBas rBasEntity = fltPlanBasRepository.save(fltPlanBas); |
||||
Integer planSno = rBasEntity.getPlanSno(); |
||||
// 비행구역
|
||||
List<BasLaancAreaModel> basLaancAreaModelList = rq.getAreaList(); |
||||
if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { |
||||
for (BasLaancAreaModel laancAreaModel : basLaancAreaModelList) { |
||||
FltPlanArea areaEntity = BasLaancMapper.MAPPER.modelToPlanEntity(laancAreaModel); |
||||
areaEntity.setPlanSno(planSno); |
||||
areaEntity.setCreateUserId(userId); |
||||
areaEntity.setUpdateUserId(userId); |
||||
|
||||
FltPlanArea rAreaEntity = fltPlanAreaRepository.save(areaEntity); |
||||
Integer planAreaSno = rAreaEntity.getPlanAreaSno(); |
||||
List<BasLaancAreaCoordModel> laancAreaModelCoordList = laancAreaModel.getCoordList(); |
||||
if (laancAreaModelCoordList != null && !laancAreaModelCoordList.isEmpty()) { |
||||
for (BasLaancAreaCoordModel basLaancAreaCoordModel : laancAreaModelCoordList) { |
||||
FltPlanAreaCoord coordEntity = BasLaancMapper.MAPPER.modelToPlanEntity(basLaancAreaCoordModel); |
||||
coordEntity.setPlanAreaSno(planAreaSno); |
||||
coordEntity.setCreateUserId(userId); |
||||
fltPlanAreaCoordRepository.save(coordEntity); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// 조종사 - 사용자 정보로 저장
|
||||
FltPlanPilot pilotEntity = BasLaancMapper.MAPPER.modelToPilotEntity(cstmrInfo); |
||||
pilotEntity.setPlanSno(planSno); |
||||
pilotEntity.setCreateUserId(userId); |
||||
pilotEntity.setUpdateUserId(userId); |
||||
fltPlanPilotRepository.save(pilotEntity); |
||||
|
||||
|
||||
// 기체
|
||||
List<BasLaancArcrftModel> basLaancArcrftModelList = rq.getArcrftList(); |
||||
if (basLaancArcrftModelList != null && !basLaancArcrftModelList.isEmpty()) { |
||||
for (BasLaancArcrftModel basLaancArcrftModel : basLaancArcrftModelList) { |
||||
FltPlanArcrft arcrftEntity = BasLaancMapper.MAPPER.modelToPlanEntity(basLaancArcrftModel); |
||||
arcrftEntity.setPlanSno(planSno); |
||||
arcrftEntity.setCreateUserId(userId); |
||||
arcrftEntity.setUpdateUserId(userId); |
||||
// 추가 필드
|
||||
arcrftEntity.setAcrftInsuranceYn(rq.getValidatedRs().getAcrftInsuranceYn()); // 보험여부
|
||||
// arcrftEntity.setInsuranceExperiod(null); // 보헌 유효기간
|
||||
// arcrftEntity.setCorporationNm(null); // 법인명
|
||||
fltPlanArcrftRepository.save(arcrftEntity); |
||||
} |
||||
} |
||||
// 약관 저장
|
||||
if (rq.getTerms() != null && !rq.getTerms().isEmpty()) { |
||||
for (AnctCstmrTermsModel agree : rq.getTerms()) { |
||||
PtyTermsAgreeTxn agreeEntity = new PtyTermsAgreeTxn(); |
||||
agreeEntity.setCstmrSno(fltPlanBas.getCstmrSno()); |
||||
agreeEntity.setProcIp(HttpUtils.getRequestIp()); |
||||
agreeEntity.setTermsSno(agree.getTermsSno()); |
||||
agreeEntity.setUpdateDt(Instant.now()); |
||||
agreeEntity.setUpdateUserId(userId); |
||||
agreeEntity.setAgreeYn(agree.getAgreeYn()); |
||||
if (agree.getAgreeYn().equals("Y")) { |
||||
agreeEntity.setAgreeDt(Instant.now()); |
||||
} |
||||
ptyTermsAgreeTxnRepository.save(agreeEntity); |
||||
} |
||||
} else { |
||||
throw new CustomException(ErrorCode.FAIL, "약관등록 실패"); |
||||
} |
||||
// TODO PDF 생성 후 URL 가져오기
|
||||
BasLaancLastRs rs = BasLaancLastRs.builder() |
||||
.pdfUrl("....") |
||||
.build(); |
||||
return rs; |
||||
} |
||||
|
||||
// LAANC 검증 및 기체 중복 확인
|
||||
private BasLaancValidatedRs validationAreaAndArcrft(BasLaancPlanRq rq) { |
||||
|
||||
// 초기화
|
||||
BasLaancValidatedRs rs = BasLaancValidatedRs.builder() |
||||
.pilotQlfcYn("N") |
||||
.acrftInsuranceYn("N") |
||||
.acrftDuplicatedYn("N") |
||||
.planAreaDuplicatdYn("N") |
||||
.evaluatedTargetAreaYn("N") |
||||
.flightAreaYn("N") |
||||
.build(); |
||||
|
||||
|
||||
// 비행계획서
|
||||
List<FltPlanBas> fltPlanBasList = fltPlanBasRepository.findBySchFltStDtGreaterThanEqualAndSchFltEndDtLessThanEqualAndDelYn(rq.getSchFltEndDt(), rq.getSchFltStDt(), "N"); |
||||
if (fltPlanBasList != null && !fltPlanBasList.isEmpty()) { |
||||
|
||||
if (rq.getPlanSno() != null) { |
||||
// 동일한 비행계획서는 검증에서 제외 처리
|
||||
fltPlanBasList = fltPlanBasList.stream().filter(fltPlanBas -> !rq.getPlanSno().equals(fltPlanBas.getPlanSno())).collect(Collectors.toList()); |
||||
} |
||||
|
||||
// 비행계획서 planSno 모음
|
||||
List<Integer> planSnoList = fltPlanBasList.stream().map(FltPlanBas::getPlanSno).collect(Collectors.toList()); |
||||
|
||||
// 지역
|
||||
// List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoIn(planSnoList);
|
||||
|
||||
for (FltPlanBas fltPlanBas : fltPlanBasList) { |
||||
// 1. 구역조회
|
||||
List<FltPlanArea> fltPlanAreaList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(fltPlanBas.getPlanSno()); |
||||
|
||||
// 2. 좌표 조회 -> 영역 포함 여부 확인
|
||||
for (FltPlanArea fltPlanArea : fltPlanAreaList) { |
||||
String effectiveFltElev = fltPlanArea.getFltElev(); |
||||
List<FltPlanAreaCoord> fltPlanAreaCoordList = fltPlanAreaCoordRepository.findByPlanAreaSnoOrderByPlanAreaCoordSnoAsc(fltPlanArea.getPlanAreaSno()); |
||||
if (fltPlanAreaCoordList == null || fltPlanAreaCoordList.isEmpty()) continue; |
||||
|
||||
// 2-1 영역 좌표
|
||||
List<Coordinate> effectiveCoordList = fltPlanAreaCoordList.stream().map(fltPlanAreaCoord -> new Coordinate(fltPlanAreaCoord.getLon(), fltPlanAreaCoord.getLat())).collect(Collectors.toList()); |
||||
List<Coordinate> effectiveCoordBufferList = new ArrayList<>(); |
||||
// Query에서 조회한 좌표로 버퍼좌표 생성
|
||||
if ("LINE".equals(fltPlanArea.getAreaType())) { |
||||
List<Coordinate> trans = areaUtils.transform(effectiveCoordList, "EPSG:4326", "EPSG:5181"); |
||||
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); |
||||
effectiveCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); |
||||
} |
||||
if ("POLYGON".equals(fltPlanArea.getAreaType())) { |
||||
effectiveCoordBufferList.addAll(effectiveCoordList); |
||||
} |
||||
if ("CIRCLE".equals(fltPlanArea.getAreaType())) { |
||||
effectiveCoordBufferList = areaUtils.createCircle(effectiveCoordList.get(0), fltPlanArea.getBufferZone()); |
||||
} |
||||
|
||||
for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { |
||||
String targetFltElev = basLaancAreaModel.getFltElev(); |
||||
// TODO 추후 특정 고도 범위 확인
|
||||
boolean isEqualsFltElev = effectiveFltElev.equals(targetFltElev); |
||||
//rq로 들어온 좌표로 버퍼좌표 생성
|
||||
List<Coordinate> targetCoords = basLaancAreaModel.getCoordList().stream().map(coord -> new Coordinate(coord.getLon(), coord.getLat())).collect(Collectors.toList()); |
||||
List<Coordinate> targetBufferCoords = new ArrayList<>(); |
||||
if ("LINE".equals(basLaancAreaModel.getAreaType())) { |
||||
List<Coordinate> trans = areaUtils.transform(targetCoords, "EPSG:4326", "EPSG:5181"); |
||||
List<Coordinate> bufferList = areaUtils.buffer(trans, fltPlanArea.getBufferZone()); |
||||
targetBufferCoords = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); |
||||
} else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { |
||||
targetBufferCoords.addAll(targetCoords); |
||||
} else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { |
||||
targetBufferCoords = areaUtils.createCircle(targetCoords.get(0), fltPlanArea.getBufferZone()); |
||||
} |
||||
|
||||
// 검증
|
||||
Geometry targetGeometry = areaUtils.coordinateToGeometry(targetBufferCoords); |
||||
Geometry effectiveGeometry = areaUtils.coordinateToGeometry(effectiveCoordBufferList); |
||||
if (targetGeometry.intersects(effectiveGeometry) && isEqualsFltElev) { |
||||
rs.setPlanAreaDuplicatdYn("Y"); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
// 기체 중복 여부 확인
|
||||
List<BasLaancArcrftModel> arcrftList = rq.getArcrftList(); |
||||
if (arcrftList != null && !arcrftList.isEmpty()) { |
||||
List<FltPlanArcrft> fltPlanArcrftList = fltPlanArcrftRepository.findByPlanSnoIn(planSnoList); |
||||
if (fltPlanArcrftList != null && !fltPlanArcrftList.isEmpty()) { |
||||
boolean isDuplicatedArcrft = arcrftList.stream().anyMatch(arcrft -> |
||||
fltPlanArcrftList.stream().anyMatch(fltPlanArcrft -> |
||||
arcrft.getIdntfNum().equals(fltPlanArcrft.getIdntfNum()) |
||||
) |
||||
); |
||||
if (isDuplicatedArcrft) { |
||||
rs.setAcrftDuplicatedYn("Y"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
// 공역 중복 확인
|
||||
for (BasLaancAreaModel basLaancAreaModel : rq.getAreaList()) { |
||||
List<Coordinate> rqCoord = new ArrayList<>(); |
||||
List<Coordinate> rqCoordBufferList = new ArrayList<>(); |
||||
|
||||
//rq로 들어온 좌표로 버퍼좌표 생성
|
||||
for (BasLaancAreaCoordModel basLaancAreaCoordModel : basLaancAreaModel.getCoordList()) { |
||||
Coordinate coords = new Coordinate(basLaancAreaCoordModel.getLon(), basLaancAreaCoordModel.getLat()); |
||||
rqCoord.add(coords); |
||||
} |
||||
if ("LINE".equals(basLaancAreaModel.getAreaType())) { |
||||
List<Coordinate> trans = areaUtils.transform(rqCoord, "EPSG:4326", "EPSG:5181"); |
||||
List<Coordinate> bufferList = areaUtils.buffer(trans, basLaancAreaModel.getBufferZone()); |
||||
rqCoordBufferList = areaUtils.transform(bufferList, "EPSG:5181", "EPSG:4326"); |
||||
} else if ("POLYGON".equals(basLaancAreaModel.getAreaType())) { |
||||
rqCoordBufferList.addAll(rqCoord); |
||||
} else if ("CIRCLE".equals(basLaancAreaModel.getAreaType())) { |
||||
rqCoordBufferList = areaUtils.createCircle(rqCoord.get(0), basLaancAreaModel.getBufferZone()); |
||||
} |
||||
|
||||
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance(); |
||||
Geometry rqGeometry = airspaceUtils.createGeometryByCoordinate(rqCoordBufferList); |
||||
Integer fltElev = basLaancAreaModel.getFltElev() != null ? Integer.valueOf(basLaancAreaModel.getFltElev()) : 0; |
||||
AirspaceUtils.FeatureInfo featureInfo = new AirspaceUtils.FeatureInfo(null, null, 0, fltElev, rqGeometry); |
||||
|
||||
// 평가 가능 지역 판단
|
||||
boolean duplicatedAirspace = airspaceUtils.isDuplicatedAirspace(featureInfo); |
||||
rs.setEvaluatedTargetAreaYn(duplicatedAirspace ? "Y" : "N"); |
||||
|
||||
// 비행 가능 지역 판단
|
||||
if (duplicatedAirspace) { |
||||
boolean validLaancAirspace = airspaceUtils.isValidLaancAirspace(featureInfo); |
||||
rs.setFlightAreaYn(validLaancAirspace ? "Y" : "N"); |
||||
} else { |
||||
rs.setFlightAreaYn("N"); |
||||
} |
||||
|
||||
} |
||||
return rs; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue