From 8f3055561a245156e5c78150a9bbec70c0108063 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 21 Sep 2023 13:56:38 +0900 Subject: [PATCH] =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BasFlightController.java | 35 +++--- .../template/service/TemplateService.java | 109 ++++++++++++++++++ .../vo/{LanncPdfVO.java => LaancPdfVO.java} | 4 +- .../utils/PdfUtils.java} | 90 +++------------ 4 files changed, 148 insertions(+), 90 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java rename pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/{LanncPdfVO.java => LaancPdfVO.java} (93%) rename pav-server/src/main/java/com/palnet/{biz/api/bas/flight/template/service/PdfService.java => comn/utils/PdfUtils.java} (72%) diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index 81729951..ccc71b26 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -25,8 +25,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import com.palnet.biz.api.bas.flight.service.BasFlightService; -import com.palnet.biz.api.bas.flight.template.service.PdfService; -import com.palnet.biz.api.bas.flight.template.vo.LanncPdfVO; +import com.palnet.biz.api.bas.flight.template.service.TemplateService; +import com.palnet.biz.api.bas.flight.template.vo.LaancPdfVO; import com.palnet.biz.api.comn.model.ComnPagingRs; import com.palnet.biz.api.comn.response.BasicResponse; import com.palnet.biz.api.comn.response.ErrorResponse; @@ -35,6 +35,7 @@ import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.AreaUtils; +import com.palnet.comn.utils.PdfUtils; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -51,15 +52,19 @@ public class BasFlightController { private final Environment env; private final CtrTrnsLctnService ctrTrnsLctnService; private final AreaUtils utils; - private final PdfService pdfService; + private final TemplateService templateService; + private final PdfUtils pdfUtils; + + @Autowired - public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, PdfService pdfService) { + public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, TemplateService templateService, PdfUtils pdfUtils) { this.basFlightService = basFlightService; this.env = env; this.ctrTrnsLctnService = ctrTrnsLctnService; this.utils = AreaUtils; - this.pdfService = pdfService; + this.templateService = templateService; + this.pdfUtils = pdfUtils; } @GetMapping("/area") @@ -390,18 +395,14 @@ public class BasFlightController { @PostMapping("/laanc-pdf/create") @Tag(name = "비행계획서", description = "비행계획서 관련 API") - @ApiOperation(value = "Lannc 공문 PDF생성") - public void createLancePDF(@RequestBody LanncPdfVO vo) { - - String airUser = vo.getUserName(); - String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 - String fileName = pdfService.getSaveName(airUser, etc); - - // PDF 생성 및 저장 - String htmlContent = pdfService.getHtmlToString(vo); - ComFileBas comFileBas = pdfService.generatePDF(htmlContent, fileName); - - pdfService.save(comFileBas); + @ApiOperation(value = "Laanc 공문 PDF생성") + public void createLancePDF(@RequestBody LaancPdfVO vo) { + + // PDF 생성 및 저장 + ComFileBas comFileBas = templateService.makeLaancPdf(vo); + + // DB 저장 + templateService.save(comFileBas); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java new file mode 100644 index 00000000..09b0a7b1 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java @@ -0,0 +1,109 @@ +package com.palnet.biz.api.bas.flight.template.service; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.Map; +import java.util.Map.Entry; + +import javax.transaction.Transactional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.bas.flight.template.vo.LaancPdfVO; +import com.palnet.biz.jpa.entity.ComFileBas; +import com.palnet.biz.jpa.repository.com.ComFileBasRepository; +import com.palnet.comn.utils.InstantUtils; +import com.palnet.comn.utils.PdfUtils; + +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +public class TemplateService { + + @Autowired + private PdfUtils pdfUtils; + + @Autowired + private JwtTokenUtil jwtTokenUtil; + + @Autowired + private ComFileBasRepository comFileBasRepository; + + @Value("${base-url}") + private String BASE_PATH; + + private final String FILE_EXTENSION = ".pdf"; + + /** + * 파일명 만들기, 앞에 기본으로 금일 날짜있음 + * [예시] 20230102_[추가파라미터] + * @param etcName + * @return + */ + private String getLaancSaveName(String ...etcName){ + + String date = InstantUtils.toDateString(Instant.now()).replace("-", ""); + + StringBuilder result = new StringBuilder(); + result.append(date); + + for(String name : etcName){ + result.append("-") + .append(name); + } + + result.append(this.FILE_EXTENSION); + + return result.toString(); + } + + /** + * PDF 생성 + * @param vo + * @return + */ + public ComFileBas makeLaancPdf(LaancPdfVO vo){ + + String airUser = vo.getUserName(); + String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 + String fileName = getLaancSaveName(airUser, etc); + + String htmlContent = pdfUtils.getHtmlToString(vo); + ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName); + + String userId = jwtTokenUtil.getUserIdByToken(); + comFileBas.setCreateUserId(userId); + + return comFileBas; + } + + + + /** + * DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 + * @param comFileBas + */ + @Transactional + public void save(ComFileBas comFileBas){ + + // DB Insert + ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileSnoDesc(); + int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; + + comFileBas.setFileGroupNo(fileGroupNo); + + comFileBasRepository.save(comFileBas); + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LanncPdfVO.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LaancPdfVO.java similarity index 93% rename from pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LanncPdfVO.java rename to pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LaancPdfVO.java index 2cf3196d..5ac4fed0 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LanncPdfVO.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/vo/LaancPdfVO.java @@ -10,7 +10,7 @@ import lombok.ToString; @Getter @Setter @ToString -public class LanncPdfVO extends PdfBaseVO{ +public class LaancPdfVO extends PdfBaseVO{ // TODO : 아직 파라미터가 정해지지 않음 private String userName; // 조종사 이름 @@ -20,7 +20,7 @@ public class LanncPdfVO extends PdfBaseVO{ private String userGender; // 조종사 성별 - public LanncPdfVO (){ + public LaancPdfVO (){ init(); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/PdfService.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java similarity index 72% rename from pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/PdfService.java rename to pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java index 84a1ed55..0eff1f6c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/PdfService.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -1,4 +1,4 @@ -package com.palnet.biz.api.bas.flight.template.service; +package com.palnet.comn.utils; import java.io.File; import java.io.FileOutputStream; @@ -12,11 +12,9 @@ import java.time.Instant; import java.util.Map; import java.util.Map.Entry; -import javax.transaction.Transactional; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; @@ -40,51 +38,19 @@ import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.flight.template.vo.PdfBaseVO; import com.palnet.biz.jpa.entity.ComFileBas; -import com.palnet.biz.jpa.repository.com.ComFileBasRepository; -import com.palnet.comn.utils.InstantUtils; - -import lombok.extern.slf4j.Slf4j; -@Service -@Slf4j -public class PdfService { - - @Autowired - private TemplateEngine templateEngine; +@Component +public class PdfUtils { - @Autowired - private JwtTokenUtil jwtTokenUtil; @Autowired - private ComFileBasRepository comFileBasRepository; + private TemplateEngine templateEngine; @Value("${base-url}") private String BASE_PATH; private final String FILE_EXTENSION = ".pdf"; - /** - * 파일명 만들기, 앞에 기본으로 금일 날짜있음 - * [예시] 20230102_[추가파라미터] - * @param etcName - * @return - */ - public String getSaveName(String ...etcName){ - - String date = InstantUtils.toDateString(Instant.now()).replace("-", ""); - - StringBuilder result = new StringBuilder(); - result.append(date); - - for(String name : etcName){ - result.append("-") - .append(name); - } - - result.append(this.FILE_EXTENSION); - - return result.toString(); - } /** * Thymeleaf HTML 파일을 데이터 바인딩하여 String으로 변환 @@ -99,8 +65,10 @@ public class PdfService { // Thymeleaf 방식 html에 입힐 데이터 바인딩 Context context = new Context(); - for(Entry entry : param.entrySet()){ - context.setVariable(entry.getKey(), param.get(entry.getKey())); + for(Entry entry : param.entrySet()){ + String key = entry.getKey(); + + context.setVariable(key, param.get(key)); } // 앞 뒤 prefix, suffix는 yml에 정의해놓음 @@ -139,7 +107,8 @@ public class PdfService { pdfDocument.open(); /* - CSS 설정 TODO : 추후 템플릿 CSS 맞춰야 할것 + CSS 설정 + TODO : CSS 파일이 따로 있을시 임포트해주는 방법, CSS 파일 적용은 필수는 아니지만, 글꼴 적용은 꼭해야만 함 jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용 CSS의 색깔은 키워드로 표기 X, #e73a3a 등 16진법으로 표기 해야함 */ @@ -148,7 +117,7 @@ public class PdfService { CSSResolver cssResolver = new StyleAttrCSSResolver(); cssResolver.addCss(cssFile); - // Font 설정 TODO : 추후 템플릿 CSS 맞춰야 할것 + // Font 설정 XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic"); CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); @@ -170,23 +139,19 @@ public class PdfService { } catch (IOException e) { e.printStackTrace(); - } catch (DocumentException e1){ - e1.printStackTrace(); - } catch (Exception e2){ - e2.printStackTrace(); + } catch (DocumentException e){ + e.printStackTrace(); + } catch (Exception e){ + e.printStackTrace(); } finally{ pdfDocument.close(); } - - - String userId = jwtTokenUtil.getUserIdByToken(); - + result.setFileGroupNo(0); result.setFilePath(this.BASE_PATH); result.setFileExt(this.FILE_EXTENSION); - result.setCreateDt(Instant.now()); - result.setCreateUserId(userId); + result.setCreateDt(Instant.now()); result.setFileSaveNm(fileName); result.setFileOriNm(fileName); @@ -194,28 +159,11 @@ public class PdfService { String filePath = result.getFileOriNm(); long fileSize = Files.size(Paths.get(pdfPath + filePath)) / 1024; - if(fileSize > 0) result.setFileSize(String.valueOf(fileSize)); + if(fileSize >= 0) result.setFileSize(String.valueOf(fileSize)); } catch (IOException e) { e.printStackTrace(); } return result; } - - /** - * DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 - * @param comFileBas - */ - @Transactional - public void save(ComFileBas comFileBas){ - - // DB Insert - ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileSnoDesc(); - int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; - - comFileBas.setFileGroupNo(fileGroupNo); - - comFileBasRepository.save(comFileBas); - } - }