Browse Source

feat: 드론원스톱 한글 다운로드

feature/address-coordinate^2
지대한 2 months ago
parent
commit
508fe95c8b
  1. 3
      http/server/server.http
  2. 18
      pav-server/build.gradle
  3. 7
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java
  4. 170
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java
  5. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom2.hwpx
  6. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc.hwpx
  7. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc2.hwpx
  8. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc3.hwpx
  9. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc4.hwpx
  10. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc5.hwpx

3
http/server/server.http

@ -116,6 +116,9 @@ Authorization: {{accessToken}}
GET {{appHost}}/api/bas/dos/plan/download/pdf?searchStDt=2024-06-14&searchEndDt=2024-06-14 GET {{appHost}}/api/bas/dos/plan/download/pdf?searchStDt=2024-06-14&searchEndDt=2024-06-14
Authorization: {{accessToken}} Authorization: {{accessToken}}
### dos(드론원스톱) hwpx download
GET {{appHost}}/api/bas/dos/plan/download/han-com?searchStDt=2024-06-14&searchEndDt=2024-06-14
Authorization: {{accessToken}}
### dos(드론원스톱) 검토 수정 ### dos(드론원스톱) 검토 수정
PATCH {{appHost}}/api/bas/dos/plan/reviewed PATCH {{appHost}}/api/bas/dos/plan/reviewed

18
pav-server/build.gradle

@ -111,6 +111,12 @@ dependencies {
implementation 'com.google.zxing:core:3.5.2' implementation 'com.google.zxing:core:3.5.2'
implementation 'com.google.zxing:javase:3.5.2' implementation 'com.google.zxing:javase:3.5.2'
// hancom
// implementation 'kr.dogfoot:hwplib:1.1.6'
implementation 'kr.dogfoot:hwpxlib:1.0.3'
testCompileOnly 'org.projectlombok:lombok:1.18.28' testCompileOnly 'org.projectlombok:lombok:1.18.28'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
@ -141,15 +147,15 @@ querydsl {
sourceSets { sourceSets {
main.java.srcDir querydslDir main.java.srcDir querydslDir
main.java.srcDir mapstructDir main.java.srcDir mapstructDir
} }
sourceSets.each { srcSet -> sourceSets.each { srcSet ->
println "["+srcSet.name+"]" println "[" + srcSet.name + "]"
print "-->Source directories: "+srcSet.allJava.srcDirs+"\n" print "-->Source directories: " + srcSet.allJava.srcDirs + "\n"
print "-->Output directories: "+srcSet.output.classesDirs.files+"\n" print "-->Output directories: " + srcSet.output.classesDirs.files + "\n"
println "" println ""
} }
configurations { configurations {
querydsl.extendsFrom compileClasspath querydsl.extendsFrom compileClasspath

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

@ -85,5 +85,12 @@ public class BasDosController {
basDosService.createPDF(rs); basDosService.createPDF(rs);
} }
@GetMapping("/plan/download/han-com")
public void downloadHanCom(BasDosPlanRq rq) {
List<BasDosPlanRs> rs = basDosService.getDosPlan(rq, PlanSelectType.DOWNLOAD);
basDosService.createHanCom(rs);
}
} }

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

@ -23,6 +23,15 @@ 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 com.palnet.comn.utils.PdfUtils;
import kr.dogfoot.hwpxlib.object.HWPXFile;
import kr.dogfoot.hwpxlib.object.content.section_xml.SectionXMLFile;
import kr.dogfoot.hwpxlib.object.content.section_xml.paragraph.Run;
import kr.dogfoot.hwpxlib.object.content.section_xml.paragraph.T;
import kr.dogfoot.hwpxlib.object.content.section_xml.paragraph.object.Table;
import kr.dogfoot.hwpxlib.object.content.section_xml.paragraph.object.table.Tc;
import kr.dogfoot.hwpxlib.object.content.section_xml.paragraph.object.table.Tr;
import kr.dogfoot.hwpxlib.reader.HWPXReader;
import kr.dogfoot.hwpxlib.writer.HWPXWriter;
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.*;
@ -32,13 +41,14 @@ 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.core.io.ClassPathResource;
import org.springframework.http.MediaType; 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;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.*;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.Instant; import java.time.Instant;
@ -328,6 +338,7 @@ public class BasDosService {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
// Excel 다운로드
public void createExcel(List<BasDosPlanRs> rs) { public void createExcel(List<BasDosPlanRs> rs) {
try (XSSFWorkbook workbook = new XSSFWorkbook()) { try (XSSFWorkbook workbook = new XSSFWorkbook()) {
@ -484,6 +495,7 @@ public class BasDosService {
} }
} }
// PDF 다운로드
public void createPDF(List<BasDosPlanRs> rs) { public void createPDF(List<BasDosPlanRs> rs) {
List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>(); List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>();
@ -620,4 +632,160 @@ public class BasDosService {
return (int) ((pixelWidth / 6.0) * 256); return (int) ((pixelWidth / 6.0) * 256);
} }
// 한컴 생성
public void createHanCom(List<BasDosPlanRs> rs) {
// 한글 파일 읽기
File baseHanComFile = getBaseHanComFile();
if (baseHanComFile == null) {
throw new CustomException(ErrorCode.FILE_CREATE_FAIL);
}
try {
HWPXFile hwpxFile = HWPXReader.fromFile(baseHanComFile);
SectionXMLFile sectionXMLFile = hwpxFile.sectionXMLFileList().get(0);
Table table = (Table) sectionXMLFile.getPara(4).getRun(0).getRunItem(0);
Tr trByClone = table.getTr(1).clone();
table.removeTr(1);
table.rowCnt((short) 1);
LocalDate applyDtMin = null;
LocalDate applyDtMax = null;
int count = 0;
for (BasDosPlanRs planRs : rs) {
for (BasDosPlanAreaRs areaRs : planRs.getAreaList()) {
count++;
Tr tr = trByClone.clone();
applyDtMin = applyDtMin == null ? areaRs.getApplyDt() : applyDtMin.isBefore(areaRs.getApplyDt()) ? applyDtMin : areaRs.getApplyDt();
applyDtMax = applyDtMax == null ? areaRs.getApplyDt() : applyDtMax.isAfter(areaRs.getApplyDt()) ? applyDtMax : areaRs.getApplyDt();
int colNum = 0;
for (Tc tc : tr.tcs()) {
Run run = tc.subList().getPara(0).getRun(0);
run.removeAllRunItems();
T t = null;
switch (colNum) {
case 0:
t = new T();
t.addText(count + "");
run.addRunItem(t);
break;
case 1:
t = new T();
t.addText(planRs.getApplyNm() != null ? planRs.getApplyNm() : "");
run.addRunItem(t);
break;
case 2:
t = new T();
t.addText(areaRs.getAddr1() != null ? areaRs.getAddr1() : "");
run.addRunItem(t);
break;
case 3:
t = new T();
t.addText(areaRs.getAddr2() != null ? areaRs.getAddr2() : "");
run.addRunItem(t);
break;
case 4:
t = new T();
t.addText(areaRs.getAddr3() != null ? areaRs.getAddr3() : "");
run.addRunItem(t);
break;
case 5:
t = new T();
t.addText((areaRs.getBufferZone() != null ? areaRs.getBufferZone() + "" : "-"));
run.addRunItem(t);
break;
case 6:
t = new T();
t.addText(areaRs.getFltElevMax() != null
? areaRs.getFltElevMax() != 0D
? areaRs.getFltElevMax() + ""
: "불가"
: "비대상");
run.addRunItem(t);
break;
case 7:
t = new T();
t.addText("");
run.addRunItem(t);
break;
}
colNum++;
tc.cellAddr().rowAddr((short) count);
}
table.addTr(tr);
}
}
table.rowCnt((short) ++count);
String applyDtStr = "";
if (applyDtMin != null && applyDtMax != null) {
if (applyDtMin.equals(applyDtMax)) {
String dayOfWeek = applyDtMin.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.KOREAN); // 요일
applyDtStr = applyDtMin.format(DateTimeFormatter.ofPattern("yy.M.d")) + "(" + dayOfWeek + ")";
} else {
String firstDayOfWeek = applyDtMin.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.KOREAN); // 요일
String secondDayOfWeek = applyDtMax.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.KOREAN); // 요일
applyDtStr = applyDtMin.format(DateTimeFormatter.ofPattern("yy.M.d")) + "(" + firstDayOfWeek + ")~" + applyDtMax.format(DateTimeFormatter.ofPattern("yy.M.d")) + "(" + secondDayOfWeek + ")";
}
}
// 신청일자 적용
T tApplyDt = (T) sectionXMLFile.getPara(1).getRun(0).getRunItem(0);
String applyStr = tApplyDt.onlyText();
tApplyDt.clear();
tApplyDt.addText(applyStr.replace("{{applyDt}}", applyDtStr));
// size 적용
T tCount = (T) sectionXMLFile.getPara(3).getRun(1).getRunItem(0);
String tCountStr = tCount.onlyText();
tCount.clear();
tCount.addText(tCountStr.replace("{{count}}", count + ""));
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy.M.d.");
String nowStr = now.format(formatter);
String filename = "관제권 내 초경량비행장치 비행승인 관련 검토결과('" + applyDtStr + ").hwpx";
String encodedFilename = URLEncoder.encode(filename, StandardCharsets.UTF_8);
HttpServletResponse response = HttpUtils.getResponse();
// 컨텐츠 타입과 파일명 지정
response.setContentType("ms-vnd/hwpx");
response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\";filename*=UTF-8''" + encodedFilename);
HWPXWriter.toStream(hwpxFile, response.getOutputStream());
response.getOutputStream().flush();
} catch (Exception e) {
throw new CustomException(ErrorCode.FILE_CREATE_FAIL);
}
}
private File getBaseHanComFile() {
try {
ClassPathResource sampleDoc = new ClassPathResource("templates/hancom/dos_hancom_doc.hwpx");
InputStream inputStream = sampleDoc.getInputStream();
File tempFile = File.createTempFile(String.valueOf(inputStream.hashCode()), ".tmp");
tempFile.deleteOnExit();
try (OutputStream outputStream = new FileOutputStream(tempFile)) {
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
}
return tempFile;
} catch (Exception e) {
log.error("ERROR: {}", e.getStackTrace()[0]);
return null;
}
}
} }

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom2.hwpx

Binary file not shown.

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom_doc.hwpx

Binary file not shown.

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom_doc2.hwpx

Binary file not shown.

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom_doc3.hwpx

Binary file not shown.

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom_doc4.hwpx

Binary file not shown.

BIN
pav-server/src/main/resources/templates/hancom/dos_hancom_doc5.hwpx

Binary file not shown.
Loading…
Cancel
Save