From 1832faf12e9a7af6e7fb8ce311257b6644f18870 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 21 Sep 2023 10:39:47 +0900 Subject: [PATCH] =?UTF-8?q?VO=EC=B6=94=EA=B0=80=20,=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BasFlightController.java | 37 +++--- .../biz/api/bas/flight/dto/LanncPdfVO.java | 54 ++++++++ .../biz/api/bas/flight/dto/PdfBaseVO.java | 16 +++ .../repository/com/ComFileBasRepository.java | 2 +- .../java/com/palnet/comn/utils/PdfUtils.java | 124 ++++++++++++------ pav-server/src/main/resources/application.yml | 8 +- 6 files changed, 179 insertions(+), 62 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java 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 cdd6f68..1aeb5d1 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 @@ -23,6 +23,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import com.palnet.biz.api.bas.flight.dto.LanncPdfVO; + import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq; import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; @@ -37,7 +39,6 @@ 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.biz.jpa.entity.ComFileBas; -import com.palnet.biz.jpa.repository.com.ComFileBasRepository; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.AreaUtils; @@ -58,15 +59,14 @@ public class BasFlightController { private final Environment env; private final CtrTrnsLctnService ctrTrnsLctnService; private final AreaUtils utils; - private final PdfUtils pdfUtils; + private final PdfUtils pdfUtils; @Autowired - public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, ComFileBasRepository comFileBasRepository, PdfUtils pdfUtils) { + public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, PdfUtils pdfUtils) { this.basFlightService = basFlightService; this.env = env; this.ctrTrnsLctnService = ctrTrnsLctnService; this.utils = AreaUtils; - this.comFileBasRepository = comFileBasRepository; this.pdfUtils = pdfUtils; } @@ -391,25 +391,22 @@ public class BasFlightController { for(Coordinate a : coordList) { System.out.println("["+a.getX() + ", " + a.getY()+"],"); } - } - - private final ComFileBasRepository comFileBasRepository; - - @GetMapping("/test/createLancePDF") - public void createLancePDF() { + } + @PostMapping("/lance-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 = pdfUtils.getSaveName(airUser, etc); - HashMap param = new HashMap<>(); - param.put("userName", "이경도"); - param.put("userAge", 25); - param.put("userGender", "M"); + // PDF 생성 및 저장 + String htmlContent = pdfUtils.getHtmlToString(vo); + ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName); - pdfUtils.getSaveName("LanncPDF.pdf"); - - String htmlContent = pdfUtils.getHtmlToString(param); - - ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent); - comFileBasRepository.save(comFileBas); + pdfUtils.save(comFileBas); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java new file mode 100644 index 0000000..e6ad3f0 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/LanncPdfVO.java @@ -0,0 +1,54 @@ +package com.palnet.biz.api.bas.flight.dto; + +import java.lang.reflect.Field; +import java.util.HashMap; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class LanncPdfVO extends PdfBaseVO{ + + // TODO : 아직 파라미터가 정해지지 않음 + private String userName; // 조종사 이름 + + private int userAge; // 조종사 나이 + + private String userGender; // 조종사 성별 + + + public LanncPdfVO (){ + init(); + } + + public HashMap getParam(){ + + Field[] fields = getClass().getDeclaredFields(); + + HashMap result = new HashMap<>(); + + try { + for(Field field : fields){ + Object value = field.get(this); + String key = field.getName(); + + result.put(key, value); + } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e){ + e.printStackTrace(); + } + + return result; + } + + @Override + public void init() { + super.setTemplate("official_document"); + } + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java new file mode 100644 index 0000000..d3da421 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/dto/PdfBaseVO.java @@ -0,0 +1,16 @@ +package com.palnet.biz.api.bas.flight.dto; + +import java.util.Map; + +import lombok.Data; + +@Data +public abstract class PdfBaseVO { + + private String template; + + public abstract void init(); + + public abstract Map getParam(); + +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java index acda944..db35bd9 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java @@ -8,5 +8,5 @@ import com.palnet.biz.jpa.entity.ComFileBas; @Repository public interface ComFileBasRepository extends JpaRepository{ - + public ComFileBas findFirstByOrderByFileSnoDesc(); } 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 403aaf5..93d297f 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 @@ -11,8 +11,13 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; import java.util.HashMap; +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.Component; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; @@ -35,7 +40,9 @@ import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.bas.flight.dto.PdfBaseVO; import com.palnet.biz.jpa.entity.ComFileBas; +import com.palnet.biz.jpa.repository.com.ComFileBasRepository; import lombok.extern.slf4j.Slf4j; @@ -49,23 +56,30 @@ public class PdfUtils { @Autowired private JwtTokenUtil jwtTokenUtil; - // @Value("${}") // 기본 경로 지정할 곳 - private final String BASE_PATH = ""; + @Autowired + private ComFileBasRepository comFileBasRepository; - private final String FILE_BASE_NAME = "LANNC_PDF"; + @Value("${base-url}") + private String BASE_PATH; private final String FILE_EXTENSION = ".pdf"; - public String getSaveName(String baseName){ + /** + * 파일명 만들기, 앞에 기본으로 금일 날짜있음 + * @param etcName + * @return + */ + public String getSaveName(String ...etcName){ String date = InstantUtils.toDateString(Instant.now()).replace("-", ""); StringBuilder result = new StringBuilder(); - result.append(date) - .append("_") - .append(System.currentTimeMillis()) - .append("_") - .append(baseName); + result.append(date); + + for(String name : etcName){ + result.append("-") + .append(name); + } return result.toString(); } @@ -73,19 +87,23 @@ public class PdfUtils { /** * Thymeleaf HTML 파일을 데이터 바인딩하여 String으로 변환 * @param - * @param param + * @param pdfDto * @return */ - public > String getHtmlToString(T param){ + public String getHtmlToString(T pdfDto){ + + Map param = pdfDto.getParam(); + // Thymeleaf 방식 html에 입힐 데이터 바인딩 - Context context = new Context(); - context.setVariable("userName", param.get("userName")); - context.setVariable("userAge", param.get("userAge")); - context.setVariable("userGender", param.get("userGender")); + Context context = new Context(); + + for(Entry entry : param.entrySet()){ + context.setVariable(entry.getKey(), param.get(entry.getKey())); + } - // official_document은 html이름임 , 앞 뒤 prefix, suffix는 yml에 정의해놓음 - // official_document html에 바인딩할 데이터 넣고 돌려서 String형식으로 뽑아옴 - String htmlContent = templateEngine.process("official_document", context); + // 앞 뒤 prefix, suffix는 yml에 정의해놓음 + // html에 바인딩할 데이터 넣고 파싱이후 String형식으로 뽑아옴 + String htmlContent = templateEngine.process(pdfDto.getTemplate(), context); return htmlContent; } @@ -93,31 +111,42 @@ public class PdfUtils { /** * HTML 태그로 이루어진 String값을 PDF로 변환 * @param htmlContent + * @param fileName + * @return */ - public ComFileBas generatePDF(String htmlContent){ + public ComFileBas generatePDF(String htmlContent, String fileName){ + // PDF 용지 설정하기 Document pdfDocument = new Document(); ComFileBas result = new ComFileBas(); + + String pdfPath = new StringBuilder() + .append(this.BASE_PATH) + .append(InstantUtils.toDateString(Instant.now()).replace("-", "")) + .append("/").toString(); try { - String fileName = getSaveName(this.FILE_BASE_NAME + this.FILE_EXTENSION); - + + // 폴더 생성 + new File(pdfPath).mkdirs(); + // File 저장 기본경로는 main 아래로 기본으로 잡힘 - PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(fileName)); + PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(pdfPath + fileName + this.FILE_EXTENSION)); writer.setInitialLeading(12.5f); pdfDocument.open(); - - CSSResolver cssResolver = new StyleAttrCSSResolver(); - // CSS - // jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용 - // CSS의 색깔은 키워드로 표기 X, #e73a3a 등 16진법으로 표기 해야함 + /* + CSS 설정 TODO : 추후 템플릿 CSS 맞춰야 할것 + jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용 + CSS의 색깔은 키워드로 표기 X, #e73a3a 등 16진법으로 표기 해야함 + */ InputStream cssStream = getClass().getClassLoader().getResourceAsStream("static/css/pdf.css"); CssFile cssFile = XMLWorkerHelper.getCSS(cssStream); + CSSResolver cssResolver = new StyleAttrCSSResolver(); cssResolver.addCss(cssFile); - // Font + // Font 설정 TODO : 추후 템플릿 CSS 맞춰야 할것 XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic"); CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); @@ -136,10 +165,7 @@ public class PdfUtils { XMLParser xmlParser = new XMLParser(xmlWorker, Charset.forName("UTF-8")); xmlParser.parse(stringReader); - - result.setFileSaveNm(fileName); - result.setFileOriNm(fileName); - + } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e1){ @@ -151,13 +177,6 @@ public class PdfUtils { pdfDocument.close(); } - try { - long fileSize = Files.size(Paths.get(this.BASE_PATH + result.getFileOriNm())) / 1024; - - if(fileSize > 0) result.setFileSize(String.valueOf(fileSize)); - } catch (IOException e) { - e.printStackTrace(); - } String userId = jwtTokenUtil.getUserIdByToken(); @@ -166,10 +185,35 @@ public class PdfUtils { result.setFileExt(this.FILE_EXTENSION); result.setCreateDt(Instant.now()); result.setCreateUserId(userId); + result.setFileSaveNm(fileName); + result.setFileOriNm(fileName); - log.error("Entity -> {}", result); + try { + String filePath = this.BASE_PATH + result.getFileOriNm() + this.FILE_EXTENSION; + long fileSize = Files.size(Paths.get(pdfPath + filePath)) / 1024; + + 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); + } + } diff --git a/pav-server/src/main/resources/application.yml b/pav-server/src/main/resources/application.yml index cccf1b5..691dc30 100644 --- a/pav-server/src/main/resources/application.yml +++ b/pav-server/src/main/resources/application.yml @@ -63,6 +63,8 @@ api: client-secret-key: Q4K4OtUYol search-url : https://openapi.naver.com/v1/search/local.json +base-url: + --- spring: @@ -108,6 +110,7 @@ api: client-secret-key: Q4K4OtUYol search-url : https://openapi.naver.com/v1/search/local.json +base-url: /data/server/files --- spring: @@ -162,6 +165,7 @@ api: client-secret-key: Q4K4OtUYol search-url : https://openapi.naver.com/v1/search/local.json +base-url: /data/server/files --- spring: @@ -210,4 +214,6 @@ api: naver: client-id: WGEct3bJhQC0pyMsP_GK client-secret-key: Q4K4OtUYol - search-url : https://openapi.naver.com/v1/search/local.json \ No newline at end of file + search-url : https://openapi.naver.com/v1/search/local.json + +base-url: /data/server/files \ No newline at end of file