지대한
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