Browse Source

valid 수정

pull/10/head
지대한 12 months ago
parent
commit
f00388da34
  1. 1
      pav-server/src/main/java/com/palnet/biz/api/bas/flight/model/BasFlightPlanAreaModel.java
  2. 1
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/model/BasLaancAreaModel.java
  3. 69
      pav-server/src/main/java/com/palnet/biz/api/bas/laanc/service/BasLaancService.java
  4. 15
      pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java
  5. 4
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  6. 4
      pav-server/src/main/java/com/palnet/biz/jpa/entity/FltPlanArea.java
  7. 3
      pav-server/src/main/java/com/palnet/comn/code/ErrorCode.java
  8. 1
      pav-server/src/main/java/com/palnet/comn/utils/AirspaceUtils.java
  9. 41
      pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java
  10. BIN
      pav-server/src/main/resources/templates/fonts/H2GTRE.ttf
  11. BIN
      pav-server/src/main/resources/templates/fonts/gulim003.ttf
  12. BIN
      pav-server/src/main/resources/templates/fonts/gulim004.ttf
  13. 98
      pav-server/src/main/resources/templates/laanc/official_document.html
  14. 14
      pav-server/src/test/java/com/palnet/biz/api/comn/file/service/ComnFileServiceTest.java

1
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;

1
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;

69
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<BasLaancAreaModel> 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<BasLaancAreaCoordModel> 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)

15
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;

4
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();

4
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;

3
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", "외부서버 호출에 실패하였습니다.");

1
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
*/

41
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);

BIN
pav-server/src/main/resources/templates/fonts/H2GTRE.ttf

Binary file not shown.

BIN
pav-server/src/main/resources/templates/fonts/gulim003.ttf

Binary file not shown.

BIN
pav-server/src/main/resources/templates/fonts/gulim004.ttf

Binary file not shown.

98
pav-server/src/main/resources/templates/laanc/official_document.html

@ -4,27 +4,89 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style>
body {
font-family: NanumGothic, serif;
font-family: 'dotum';
}
p {
background-color: #e73a3a;
}
div {
background-color: #e73a3a;
}
</style>
</head>
<!--<body style="font-family: NanumGothic, serif;">-->
<body>
<img style="width:100px; height:100px;" th:src="@{${imgMlit}}" alt="11"/>
<img style="width:100px; height:100px;" th:src="@{${imgExpo}}" alt="11"/>
<div>
<table style="width: 100%">
<tr>
<td rowspan="2" style="width: 100px">
<img th:src="@{${imgMlit}}" alt="logo"/>
</td>
<td>
<span>"위대한 헌신, 영원히 가슴에"</span>
</td>
</tr>
<tr>
<td>
<span style="font-family: 'hygothic-extra'">김포항공관리사무소</span>
</td>
</tr>
</table>
<div style="width: 100px; position: absolute">
<img th:src="@{${imgMlit}}" alt="logo"/>
</div>
<div style="font">
<div style="font-size: 8px;">"위대한 헌신, 영원히 가슴에"</div>
<div style="font-family: 'hygothic-extra'">김포항공관리사무소</div>
</div>
</div>
<div>
<p>수신 <span th:text="${pilotName}"></span>님(조종자 이름)</p>
<p>제목 비행승인 완료</p>
</div>
<hr/>
<p style="color: #3ae743; height: 100px">Thymeleaf Tutorials</p>
<p>이름 : [[${userName}]]</p>
<p>나이 : [[${userAge}]]</p>
<p>성별 : [[${userGender}]]</p>
<div>
<p>&lt;초경량비행장치 비행 승인(알림)&gt;</p>
<p>1. 초경량비행장치 비행승인 신청 <span th:text="${createDt}"></span>(신청일자) 관련입니다.</p>
<p>2. 귀하께서 신청한 초경량비행장치 비행을 「항공안전법」 제127조제3항 및 같은 법</p>
<p>시행규칙 제308조제3항에 따라 다음과 같이 승인하였음을 알려드립니다.</p>
<p>가. 비행개요</p>
<p>1) 비행일시: <span th:text="${schFltStDt}"/> (비행시작일시) ~ <span th:text="${schFltEndDt}"/> (비행종료일시)</p>
<p>[주간(일출 ~ 일몰)에 가시권내 비행에 한함]</p>
<p>2) 비행목적: <span th:text="${fltPurpose}"/>(비행목적)</p>
<p>※ 촬영금지시설 유무는 항공촬영 신청(국방부)을 통해 별도로 확인 필요</p>
<p>3) 비행장치 종류 및 조종자</p>
<p>가) 비행기체종류(신고번호): <span th:text="${arcrftType}"/>(<span th:text="${idntfNum}"/>)</p>
<p>나) 조종자(생년월일): <span th:text="${pilotName}"/>님 (<span th:text="${birthDate}"/>)</p>
<p>4) 비행경로/고도(반경)</p>
<p>- <span th:text="${address}"/>/<span th:text="${elev}"/>m</p>
<p>나. 비행승인 조건</p>
<p>1) 위 가. 관련사항 반드시 준수 및 개인·법인·단체·인근 군부대 등과 별도 협의</p>
<p>등 필요시 해당사항 조치 후 비행할 것</p>
<p>2) 군부대의 경우 「군사기지 및 군사시설보호법」 제5조 및 제9조에 따라</p>
<p>보호구역에서의 금지 또는 제한사항이 엄격히 적용되오니 관할부대의 관련규정을</p>
<p>반드시 준수할 것.</p>
<p>3) 국방부장관이 관할하는 공역(空域) 내에서는 「행정권한의 위임 및 위탁에 관한</p>
<p>규정」 제41조제6항에 따라 국방부장관으로부터 비행승인 등을 받아야 비행이</p>
<p>가능함</p>
<p>4)「항공안전법 시행규칙」 제310조(초경량비행장치 조종자의 준수사항) 준수 철저</p>
<p>5) 주거지역, 상업지역 등 인구가 밀집된 지역이나 사람이 많이 모인 장소의</p>
<p>상공에서 인명 또는 재산에 위험을 초래할 우려가 있는 방법으로 비행하는 행위</p>
<p>금지</p>
<p>6) 사람 또는 건축물이 밀집된 지역의 상공에서 건축물과 충돌할 우려가 있는</p>
<p>방법으로 근접하여 비행하는 행위 금지</p>
<p>7) 인명이나 재산에 위험을 초래할 우려가 있는 낙하물 투하(投下) 금지</p>
<p>8) 시정(視程) 5km 이상에서만 비행할 것</p>
<p>9) 비행경로 주변에서 시계비행 항공기(헬리콥터 등) 운항시 비행을 일시 중단할 것</p>
<p>10) 자동비행기능의 정상작동 여부를 이륙시마다 확인할 것</p>
<p>11) 무인비행장치와 통제장치 간 신호차단시 승인받은 비행고도 이하를 유지하면서</p>
<p>이륙 위치로 복귀하여 착륙하도록 비행장치의 기능을 사전에 설정할 것</p>
<p>12) 무인비행장치 조종능력 상실 등 우발상황 발생시 관계기관(02-2660-2151)에 지체</p>
<p>없이 보고하고 비상연락체계를 항상 유지할 것</p>
<p>13) 김포국제공항 항공기 이륙·착륙 경로 및 시계비행 항공기 운항에 영향을 주지</p>
<p>않도록 비행경로 등에 대한 관리·감독을 철저히 할 것</p>
<p>14) 조종자에 대한 비행 및 안전 관련 교육 철저</p>
<p>15) 소음 등 민원 발생시 비행 금지</p>
<p>16) 사람 또는 건축물 밀집지역 회피비행 철저</p>
<p>17) 비행 전 비행지역에 대한 기상 및 항공고시보(NOTAM) 확인 철저</p>
<p>18) 비행승인 기간 중 조종자가 추가되는 경우 변경승인을 받은 후 비행할 것</p>
<p>19) 「항공사업법」 제70조 항공보험 등의 가입의무에 해당하는 신청자(영리 및</p>
<p>국가·지방자치단체 등)는 비행기간에 대한 보험 유효기간을 확인할 것</p>
<p>20) 사고 발생시 지체 없이 아래의 연락처로 통보할 것</p>
<p>- 일과 중 032-740-2169, 공휴일 및 야간 032-740-2107.</p>
</div>
</body>
</html>
</html>

14
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());
}

Loading…
Cancel
Save