diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java index e1334f73..5b0fbc17 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java @@ -11,6 +11,7 @@ public class BasFlightPlanAreaModel { private Integer planSno; private String areaType; private String fltMethod; + private String fltAreaAddr; private Integer bufferZone; private String fltElev; private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java index d5136f80..26a80e65 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java @@ -12,6 +12,7 @@ public class BasLaancAreaModel { private Integer planSno; private String areaType; private FltMethod fltMethod; + private String fltAreaAddr; private Integer bufferZone; private String fltElev; private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java index b739ed5a..bd17d043 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java @@ -23,6 +23,7 @@ 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 com.palnet.comn.utils.InstantUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.locationtech.jts.geom.Coordinate; @@ -113,14 +114,14 @@ public class BasLaancService { // 판단구역 - 공역과 겹칠 경우, 비행가능여부 BasLaancValidatedRs validationPlanAirspaceRs = this.validationPlanAreaAndArcrft(rq); - rs.setEvaluatedTargetArea(validationPlanAirspaceRs.isEvaluatedTargetArea()); - rs.setFlightArea(validationPlanAirspaceRs.isFlightArea()); + rs.setPlanAreaDuplicatd(validationPlanAirspaceRs.isPlanAreaDuplicatd()); + rs.setArcrftDuplicated(validationPlanAirspaceRs.isArcrftDuplicated()); + // 비행구역 중복여부, 기체 중복여부 BasLaancValidatedRs validationPlanDbRs = this.validationPlanAirspace(rq); - rs.setPlanAreaDuplicatd(validationPlanDbRs.isPlanAreaDuplicatd()); - rs.setArcrftDuplicated(validationPlanDbRs.isArcrftDuplicated()); - + rs.setEvaluatedTargetArea(validationPlanDbRs.isEvaluatedTargetArea()); + rs.setFlightArea(validationPlanDbRs.isFlightArea()); return rs; } @@ -138,7 +139,7 @@ public class BasLaancService { // BasLaancMapper.MAPPER.merge(basLaancValidatedRs, validatedRs); // LAANC가 검증된것들만 DB저장 - if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_DATA_DUPLICATE); + if (!basLaancValidatedRs.isValid()) throw new CustomException(ErrorCode.PLAN_LAANC_NOT_VALID); // 비행계획서 @@ -175,11 +176,27 @@ public class BasLaancService { List basLaancAreaModelList = rq.getAreaList(); if (basLaancAreaModelList != null && !basLaancAreaModelList.isEmpty()) { for (BasLaancAreaModel laancAreaModel : basLaancAreaModelList) { + + // 주소 가져오기 + try { + double firstLat = laancAreaModel.getCoordList().get(0).getLat(); + double firstLon = laancAreaModel.getCoordList().get(0).getLon(); + CtrTrnsLctnModel ctrTrnsLctnModel = ctrTrnsLctnService.convertLatlonToAddress(firstLat, firstLon); + String address = ctrTrnsLctnModel.getArea1() + " " + + ctrTrnsLctnModel.getArea2() + " " + + ctrTrnsLctnModel.getLandNm() + " " + + ctrTrnsLctnModel.getLandNum(); + laancAreaModel.setFltAreaAddr(address); + } catch (Exception e) { + log.error("get first coords to address fail. : ", e); + } + 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 laancAreaModelCoordList = laancAreaModel.getCoordList(); @@ -238,30 +255,36 @@ public class BasLaancService { } else { throw new CustomException(ErrorCode.FAIL, "약관등록 실패"); } + + String address = ""; // PDF 생성 후 URL 가져오기 LaancPdfModel laancPdfModel = new LaancPdfModel(); - laancPdfModel.setUserName(fltPlanBas.getMemberName()); + laancPdfModel.setPilotName(cstmrInfo.getMemberName()); + + if (rq.getAreaList() != null && !rq.getAreaList().isEmpty()) { + address = rq.getAreaList().get(0).getFltAreaAddr(); + laancPdfModel.setAddress(address); + laancPdfModel.setElev(rq.getAreaList().get(0).getFltElev()); + } + if (rq.getArcrftList() != null && !rq.getArcrftList().isEmpty()) { + laancPdfModel.setArcrftType(rq.getArcrftList().get(0).getArcrftTypeCd().getValue()); + laancPdfModel.setIdntfNum(rq.getArcrftList().get(0).getIdntfNum()); + } + laancPdfModel.setBirthDate(InstantUtils.toDateString(cstmrInfo.getBrthdyDate())); +// laancPdfModel.setSchFltStDt(InstantUtils.toDatetimeString(rq.getSchFltStDt())); +// laancPdfModel.setSchFltEndDt(InstantUtils.toDatetimeString(rq.getSchFltEndDt())); +// laancPdfModel.setCreateDt(InstantUtils.toDatetimeString(Instant.now())); + laancPdfModel.setSchFltStDt(InstantUtils.toDatetimeStringByFormat(rq.getSchFltStDt(), "yyyy.MM.dd HH:mm")); + laancPdfModel.setSchFltEndDt(InstantUtils.toDatetimeStringByFormat(rq.getSchFltEndDt(), "yyyy.MM.dd HH:mm")); + laancPdfModel.setCreateDt(InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyy.MM.dd HH:mm")); + laancPdfModel.setFltPurpose(rq.getFltPurpose().getValue()); + + ComFileBas comFileBas = comnFileService.makePdf(laancPdfModel); String sb = FILE_DOWNLOAD_URL + "?fileSno=" + comFileBas.getFileSno(); - // 주소 가져오기 - String address = ""; - try { - double firstLat = rq.getAreaList().get(0).getCoordList().get(0).getLat(); - double firstLon = rq.getAreaList().get(0).getCoordList().get(0).getLon(); - CtrTrnsLctnModel ctrTrnsLctnModel = ctrTrnsLctnService.convertLatlonToAddress(firstLat, firstLon); - address = ctrTrnsLctnModel.getArea1() + " " + - ctrTrnsLctnModel.getArea2() + " " + - ctrTrnsLctnModel.getLandNm() + " " + - ctrTrnsLctnModel.getLandNum(); - - } catch (Exception e) { - log.error("get first coords to address fail. : ", e); - address = ""; - } - BasLaancLastRs rs = BasLaancLastRs.builder() .pdfUrl(sb) .pdfUrl(address) diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java index 6f7cdabe..d84e3813 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java @@ -10,11 +10,16 @@ import lombok.*; public class LaancPdfModel extends PdfBaseModel { // TODO : 아직 파라미터가 정해지지 않음 - private String userName; // 조종사 이름 - - private int userAge; // 조종사 나이 - - private String userGender; // 조종사 성별 + private String pilotName; // 조종사 이름 + private String birthDate; // 조종사 생년월일 + private String schFltStDt; // 비행시작일시 + private String schFltEndDt; // 비행종료일시 + private String fltPurpose; // 비행목적 + private String arcrftType; // 등록 종류 + private String idntfNum; // 신고번호 + private String address; // 주소 + private String elev; // 고도 + private String createDt; // 신청일자 // 정적 이미지 private String imgMlit; diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index d008dd79..fc09b581 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java @@ -64,7 +64,7 @@ public class ComnFileService { */ public ComFileBas makePdf(LaancPdfModel model) { - String airUser = model.getUserName(); + String airUser = model.getPilotName(); String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 String fileName = getLaancSaveName(airUser, etc); @@ -80,7 +80,7 @@ public class ComnFileService { } String htmlContent = pdfUtils.getHtmlToString(model); - System.out.println(">>>" + htmlContent); +// System.out.println(">>>" + htmlContent); ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName); String userId = jwtTokenUtil.getUserIdByToken(); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java index 70183629..a4e2e8ef 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java @@ -1,6 +1,5 @@ package com.palnet.biz.jpa.entity; -import com.palnet.biz.jpa.entity.converter.ArcrftTypeCdConverter; import com.palnet.biz.jpa.entity.converter.FltMethodConverter; import com.palnet.biz.jpa.entity.type.FltMethod; import lombok.Data; @@ -30,6 +29,9 @@ public class FltPlanArea { @Column(name = "FLT_METHOD") private FltMethod fltMethod; + @Column(name = "FLT_AREA_ADDR") + private String fltAreaAddr; + @Column(name = "BUFFER_ZONE") private Integer bufferZone; diff --git a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java index 15c37e3d..0598b49a 100644 --- a/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java +++ b/pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java @@ -10,7 +10,8 @@ public enum ErrorCode { DATA_NO("DT003", "데이터 미존재"), DB_ERROR("DB001" , "디비 처리중 오류"), PLAN_DATA_DUPLICATE("FT500", "이미 등록된 비행계획서의 비행구역과 비행시간이 일치합니다.\n비행시간 또는 비행구역을 수정하여 주십시오."), - ARCRFT_DATA_DUPLICATE("FT500", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), + ARCRFT_DATA_DUPLICATE("FT501", "해당 기체는 다른 비행계획서에서 이미 등록된 기체입니다.\n비행시간 또는 기체 정보를 확인하여 주십시오."), + PLAN_LAANC_NOT_VALID("FT502", "LAANC를 통과하지 못한 비행계획서입니다."), EXTERNAL_API_ERROR("EA500", "외부서버 호출에 실패하였습니다."); diff --git a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java index 1eaec054..d92d4d18 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java @@ -314,6 +314,7 @@ public class AirspaceUtils { 126.9097436,37.4477632 126.7679513,37.4853679 + */ diff --git a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java index 7f75825f..242c7a3c 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -95,7 +95,46 @@ public class PdfUtils { // FontProvider를 사용하여 한글 폰트 지정 FontProvider fontProvider = new FontProvider(); - fontProvider.addFont("templates/fonts/NanumGothic.ttf", PdfEncodings.IDENTITY_H); + // NanumGothic은 한글 폰트 +// fontProvider.addFont("templates/fonts/NanumGothic.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/NanumGothic-Bold.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/NanumGothic-ExtraBold.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/NanumGothic-Regular.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/hy-gothic.ttf", PdfEncodings.IDENTITY_H); + /* + fontName = "Dotum" + fullNameLowerCase = "dotum" + fontNameLowerCase = "dotum" + familyNameLowerCase = "dotum" + */ + fontProvider.addFont("templates/fonts/gulim003.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/gulim003.otf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/gulim003.woff", PdfEncodings.IDENTITY_H); + /* + fontName = "DotumChe" + fullNameLowerCase = "dotumche" + fontNameLowerCase = "dotumche" + familyNameLowerCase = "dotumche" + */ + fontProvider.addFont("templates/fonts/gulim004.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/gulim004.otf", PdfEncodings.IDENTITY_H); + /* + fontName = "H2gtrE" + fullNameLowerCase = "hygothic-extra" + fontNameLowerCase = "h2gtre" + familyNameLowerCase = "hygothic-extra" + */ + fontProvider.addFont("templates/fonts/H2GTRE.ttf", PdfEncodings.IDENTITY_H); +// fontProvider.addFont("templates/fonts/H2GTRE.otf", PdfEncodings.IDENTITY_H); + /* + fontName = "MalgunGothic" + fullNameLowerCase = "malgun gothic" + fontNameLowerCase = "malgungothic" + familyNameLowerCase = "malgun gothic" + */ +// fontProvider.addFont("templates/fonts/malgun.ttf", PdfEncodings.IDENTITY_H); + String defaultFontFamily = fontProvider.getDefaultFontFamily(); + log.debug(">>> defaultFontFamily : {}", defaultFontFamily); converterProperties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(htmlContent, pdfDoc, converterProperties); diff --git a/pav-server/src/main/resources/templates/fonts/H2GTRE.ttf b/pav-server/src/main/resources/templates/fonts/H2GTRE.ttf new file mode 100644 index 00000000..9cf39845 Binary files /dev/null and b/pav-server/src/main/resources/templates/fonts/H2GTRE.ttf differ diff --git a/pav-server/src/main/resources/templates/fonts/gulim003.ttf b/pav-server/src/main/resources/templates/fonts/gulim003.ttf new file mode 100644 index 00000000..3de8725f Binary files /dev/null and b/pav-server/src/main/resources/templates/fonts/gulim003.ttf differ diff --git a/pav-server/src/main/resources/templates/fonts/gulim004.ttf b/pav-server/src/main/resources/templates/fonts/gulim004.ttf new file mode 100644 index 00000000..f2328992 Binary files /dev/null and b/pav-server/src/main/resources/templates/fonts/gulim004.ttf differ diff --git a/pav-server/src/main/resources/templates/laanc/official_document.html b/pav-server/src/main/resources/templates/laanc/official_document.html index fc3b157d..545f972c 100644 --- a/pav-server/src/main/resources/templates/laanc/official_document.html +++ b/pav-server/src/main/resources/templates/laanc/official_document.html @@ -4,27 +4,89 @@ - -11 -11 +
+ + + + + + + + +
+ logo + + "위대한 헌신, 영원히 가슴에" +
+ 김포항공관리사무소 +
+
+ logo +
+
+
"위대한 헌신, 영원히 가슴에"
+
김포항공관리사무소
+
+
+
+

수신 님(조종자 이름)

+

제목 비행승인 완료

+

-

Thymeleaf Tutorials

-

이름 : [[${userName}]]

-

나이 : [[${userAge}]]

-

성별 : [[${userGender}]]

+
+

<초경량비행장치 비행 승인(알림)>

+

1. 초경량비행장치 비행승인 신청 (신청일자) 관련입니다.

+

2. 귀하께서 신청한 초경량비행장치 비행을 「항공안전법」 제127조제3항 및 같은 법

+

시행규칙 제308조제3항에 따라 다음과 같이 승인하였음을 알려드립니다.

+

가. 비행개요

+

1) 비행일시: (비행시작일시) ~ (비행종료일시)

+

[주간(일출 ~ 일몰)에 가시권내 비행에 한함]

+

2) 비행목적: (비행목적)

+

※ 촬영금지시설 유무는 항공촬영 신청(국방부)을 통해 별도로 확인 필요

+

3) 비행장치 종류 및 조종자

+

가) 비행기체종류(신고번호): ()

+

나) 조종자(생년월일): 님 ()

+

4) 비행경로/고도(반경)

+

- /m

+

나. 비행승인 조건

+

1) 위 가. 관련사항 반드시 준수 및 개인·법인·단체·인근 군부대 등과 별도 협의

+

등 필요시 해당사항 조치 후 비행할 것

+

2) 군부대의 경우 「군사기지 및 군사시설보호법」 제5조 및 제9조에 따라

+

보호구역에서의 금지 또는 제한사항이 엄격히 적용되오니 관할부대의 관련규정을

+

반드시 준수할 것.

+

3) 국방부장관이 관할하는 공역(空域) 내에서는 「행정권한의 위임 및 위탁에 관한

+

규정」 제41조제6항에 따라 국방부장관으로부터 비행승인 등을 받아야 비행이

+

가능함

+

4)「항공안전법 시행규칙」 제310조(초경량비행장치 조종자의 준수사항) 준수 철저

+

5) 주거지역, 상업지역 등 인구가 밀집된 지역이나 사람이 많이 모인 장소의

+

상공에서 인명 또는 재산에 위험을 초래할 우려가 있는 방법으로 비행하는 행위

+

금지

+

6) 사람 또는 건축물이 밀집된 지역의 상공에서 건축물과 충돌할 우려가 있는

+

방법으로 근접하여 비행하는 행위 금지

+

7) 인명이나 재산에 위험을 초래할 우려가 있는 낙하물 투하(投下) 금지

+

8) 시정(視程) 5km 이상에서만 비행할 것

+

9) 비행경로 주변에서 시계비행 항공기(헬리콥터 등) 운항시 비행을 일시 중단할 것

+

10) 자동비행기능의 정상작동 여부를 이륙시마다 확인할 것

+

11) 무인비행장치와 통제장치 간 신호차단시 승인받은 비행고도 이하를 유지하면서

+

이륙 위치로 복귀하여 착륙하도록 비행장치의 기능을 사전에 설정할 것

+

12) 무인비행장치 조종능력 상실 등 우발상황 발생시 관계기관(02-2660-2151)에 지체

+

없이 보고하고 비상연락체계를 항상 유지할 것

+

13) 김포국제공항 항공기 이륙·착륙 경로 및 시계비행 항공기 운항에 영향을 주지

+

않도록 비행경로 등에 대한 관리·감독을 철저히 할 것

+

14) 조종자에 대한 비행 및 안전 관련 교육 철저

+

15) 소음 등 민원 발생시 비행 금지

+

16) 사람 또는 건축물 밀집지역 회피비행 철저

+

17) 비행 전 비행지역에 대한 기상 및 항공고시보(NOTAM) 확인 철저

+

18) 비행승인 기간 중 조종자가 추가되는 경우 변경승인을 받은 후 비행할 것

+

19) 「항공사업법」 제70조 항공보험 등의 가입의무에 해당하는 신청자(영리 및

+

국가·지방자치단체 등)는 비행기간에 대한 보험 유효기간을 확인할 것

+

20) 사고 발생시 지체 없이 아래의 연락처로 통보할 것

+

- 일과 중 032-740-2169, 공휴일 및 야간 032-740-2107.

+
- + \ No newline at end of file diff --git a/pav-server/src/test/java/com/palnet/biz/api/comn/file/service/ComnFileServiceTest.java b/pav-server/src/test/java/com/palnet/biz/api/comn/file/service/ComnFileServiceTest.java index b10f75ed..f49b8830 100644 --- a/pav-server/src/test/java/com/palnet/biz/api/comn/file/service/ComnFileServiceTest.java +++ b/pav-server/src/test/java/com/palnet/biz/api/comn/file/service/ComnFileServiceTest.java @@ -18,9 +18,17 @@ class ComnFileServiceTest { @Test void makePdf() { LaancPdfModel model = new LaancPdfModel(); - model.setUserName("test"); - model.setUserGender("M"); - model.setUserName("쿠쿠다스"); + model.setPilotName("TESTER"); + + model.setAddress("주소 언저리 123"); + model.setElev("123"); + model.setArcrftType("무인정찰기"); + model.setIdntfNum("1230-1123"); + model.setBirthDate("1986-05-13"); + model.setSchFltStDt("2021.12.10 10:00"); + model.setSchFltEndDt("2021.12.10 11:00"); + model.setCreateDt("2021.11.10 09:00"); + model.setFltPurpose("안얄라쥼"); ComFileBas comFileBas = comnFileService.makePdf(model); System.out.println(comFileBas.toString()); }