Browse Source

feat: 드론원스톱 신청목록 PDF 다운로드

feature/address-coordinate
LeeGyoungDo 3 months ago
parent
commit
5b01e5f9e5
  1. 14
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java
  2. 71
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java
  3. 6
      pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java
  4. 65
      pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ValidPdfModel.java
  5. 55
      pav-server/src/main/resources/templates/laanc/valid_document.html

14
pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java

@ -62,4 +62,18 @@ public class BasDosController {
basDosService.createExcel(rs); basDosService.createExcel(rs);
} }
/**
* PDF 다운로드
* @param rq
*/
@GetMapping("/plan/download/pdf")
public void downloadPDF(BasDosPlanRq rq){
List<BasDosPlanRs> rs = basDosService.getDosPlan(rq, PlanSelectType.DOWNLOAD);
basDosService.createPDF(rs);
}
} }

71
pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java

@ -1,6 +1,13 @@
package com.palnet.biz.api.bas.dos.service; package com.palnet.biz.api.bas.dos.service;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import com.palnet.biz.api.bas.dos.model.*; import com.palnet.biz.api.bas.dos.model.*;
import com.palnet.biz.api.comn.file.model.ValidPdfModel;
import com.palnet.biz.api.external.model.ApprovalCd; import com.palnet.biz.api.external.model.ApprovalCd;
import com.palnet.biz.api.external.model.DosApprovalResult; import com.palnet.biz.api.external.model.DosApprovalResult;
import com.palnet.biz.api.external.service.DronOneStopService; import com.palnet.biz.api.external.service.DronOneStopService;
@ -15,6 +22,7 @@ import com.palnet.comn.exception.CustomException;
import com.palnet.comn.utils.AirspaceUtils; import com.palnet.comn.utils.AirspaceUtils;
import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.AreaUtils;
import com.palnet.comn.utils.HttpUtils; import com.palnet.comn.utils.HttpUtils;
import com.palnet.comn.utils.PdfUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
@ -24,6 +32,7 @@ import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -36,10 +45,8 @@ import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.time.format.TextStyle;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@ -53,6 +60,7 @@ public class BasDosService {
private final DosFltPlanQueryRepository dosFltPlanQueryRepository; private final DosFltPlanQueryRepository dosFltPlanQueryRepository;
private final DronOneStopService dronOneStopService; private final DronOneStopService dronOneStopService;
private final AreaUtils areaUtils; private final AreaUtils areaUtils;
private final PdfUtils pdfUtils;
/** /**
* 드론원스톱 비행계획 조회 * 드론원스톱 비행계획 조회
@ -453,6 +461,61 @@ public class BasDosService {
} }
} }
public void createPDF(List<BasDosPlanRs> rs){
String todayDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yy.M.d"));
String todayWeek = LocalDate.now().getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.KOREAN).replace("요일", "");
List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>();
for(BasDosPlanRs basDosPlanRs : rs){
for(BasDosPlanAreaRs area : basDosPlanRs.getAreaList()){
ValidPdfModel.ValidFlighgModel node = new ValidPdfModel.ValidFlighgModel();
node.setApplyNm(basDosPlanRs.getApplyNm());
node.setAddr1(area.getAddr1());
node.setAddr2(area.getAddr2());
node.setAddr3(area.getAddr3());
node.setFltElev(area.getFltElev());
node.setFltElevMax(area.getFltElevMax());
node.setRm(area.getRm());
validFlightList.add(node);
}
}
ValidPdfModel pdfModel = new ValidPdfModel();
pdfModel.setTodayDate(todayDate);
pdfModel.setTodayWeek(todayWeek);
pdfModel.setValidFlightList(validFlightList);
String html = pdfUtils.getHtmlToString(pdfModel);
String fileName = todayDate + "_비행승인 결과" + ".pdf";
String encodedFilename = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
HttpServletResponse response = HttpUtils.getResponse();
response.setContentType(MediaType.APPLICATION_PDF_VALUE);
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\";filename*=UTF-8''" + encodedFilename);
try {
PdfWriter pdfWriter = new PdfWriter(response.getOutputStream());
PdfDocument pdfDoc = new PdfDocument(pdfWriter);
ConverterProperties converterProperties = new ConverterProperties();
FontProvider fontProvider = new FontProvider();
fontProvider.addFont("templates/fonts/gulim003.ttf", PdfEncodings.IDENTITY_H);
fontProvider.addFont("templates/fonts/gulim004.ttf", PdfEncodings.IDENTITY_H);
fontProvider.addFont("templates/fonts/H2GTRE.ttf", PdfEncodings.IDENTITY_H);
String defaultFontFamily = fontProvider.getDefaultFontFamily();
log.debug(">>> defaultFontFamily : {}", defaultFontFamily);
converterProperties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(html, pdfDoc, converterProperties);
}catch (IOException e){
log.error("", e);
new CustomException(ErrorCode.FILE_CREATE_FAIL);
}
}
private XSSFCellStyle getDefaultCellStyle(XSSFWorkbook workbook, DosExcelCellStyleType type) { private XSSFCellStyle getDefaultCellStyle(XSSFWorkbook workbook, DosExcelCellStyleType type) {
XSSFCellStyle style = workbook.createCellStyle(); XSSFCellStyle style = workbook.createCellStyle();

6
pav-server/src/main/java/com/palnet/biz/api/comn/file/model/LaancPdfModel.java

@ -4,8 +4,10 @@ import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
import lombok.*; import lombok.*;
import lombok.extern.slf4j.Slf4j;
@Data @Data
@Slf4j
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class LaancPdfModel extends PdfBaseModel { public class LaancPdfModel extends PdfBaseModel {
@ -43,9 +45,9 @@ public class LaancPdfModel extends PdfBaseModel {
result.put(key, value); result.put(key, value);
} }
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
e.printStackTrace(); log.error("",e);
} catch (IllegalAccessException e){ } catch (IllegalAccessException e){
e.printStackTrace(); log.error("",e);
} }
return result; return result;

65
pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ValidPdfModel.java

@ -0,0 +1,65 @@
package com.palnet.biz.api.comn.file.model;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
@Slf4j
public class ValidPdfModel extends PdfBaseModel{
private String todayDate;
private String todayWeek;
private List<ValidFlighgModel> validFlightList;
public ValidPdfModel (){
init();
}
@Override
public void init() {
super.setTemplate("laanc/valid_document");
}
@Override
public Map<String, Object> getParam() {
Field[] fields = getClass().getDeclaredFields();
HashMap<String, Object> result = new HashMap<>();
try {
for(Field field : fields){
Object value = field.get(this);
String key = field.getName();
result.put(key, value);
}
} catch (IllegalArgumentException e) {
log.error("",e);
} catch (IllegalAccessException e){
log.error("",e);
}
return result;
}
@Data
public static class ValidFlighgModel{
private String applyNm; // 민원인
private String addr1; // 행정구역1
private String addr2; // 행정구역2
private String addr3; // 상세주소
private Double bufferZone; // 반경
private Double fltElev; // 고도
private Double fltElevMax; // 최고비행 해발고도
private String rm; // 비고
}
}

55
pav-server/src/main/resources/templates/laanc/valid_document.html

@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="width:100%;max-width:780px;margin:20px auto;">
<div style="text-align:center;">
<h2 style="margin:20px auto;font-size:20px;border-top:3px solid #0045d4;border-bottom:3px solid #0045d4;
background:#ebf6f7;padding:8px 0;">
관제권 내 초경량비행장치 비행승인 관련 검토 결과
</h2>
</div>
<div style="text-align:right">
<span>[[${todayDate}]]([[${todayWeek}]]) 관제통신과</span>
</div>
<div>
<h4 style="font-size:17px;margin-top:0;">비행승인 관련 검토 결과 <span style="font-size:15px">(검토 구역 : 23개소)</span></h4>
</div>
<div>
<table style="width:100%;border-collapse: collapse">
<thead>
<tr>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">순번</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">민원인</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">행정구역1</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">행정구역2</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">상세주소</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">반경<br>(m)</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">최고비행<br>해발고도(m)</th>
<th style="border:1px solid #777;background:#e0eed1;padding:4px;text-align:center;vertical-align:middle;font-size:15px;height:50px">비고</th>
</tr>
</thead>
<tbody>
<th:block th:each="data:${validFlightList}">
<tr>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${dataStat.count}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.applyNm}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.addr1}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.addr2}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.addr3}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.fltElev}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.fltElevMax}"></span></td>
<td style="border:1px solid #777;background:#fff;padding:4px;text-align:center;vertical-align:middle;font-size:14px;height:50px"><span th:text="${data.rm}"></span></td>
</tr>
</th:block>
</tbody>
</table>
</div>
</div>
</body>
</html>
Loading…
Cancel
Save