|
|
|
@ -23,6 +23,15 @@ import com.palnet.comn.utils.AirspaceUtils;
|
|
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
|
import com.palnet.comn.utils.HttpUtils; |
|
|
|
|
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.extern.slf4j.Slf4j; |
|
|
|
|
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.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.locationtech.jts.geom.Geometry; |
|
|
|
|
import org.springframework.core.io.ClassPathResource; |
|
|
|
|
import org.springframework.http.MediaType; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.*; |
|
|
|
|
import java.net.URLEncoder; |
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
|
import java.time.Instant; |
|
|
|
@ -328,6 +338,7 @@ public class BasDosService {
|
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Excel 다운로드
|
|
|
|
|
public void createExcel(List<BasDosPlanRs> rs) { |
|
|
|
|
|
|
|
|
|
try (XSSFWorkbook workbook = new XSSFWorkbook()) { |
|
|
|
@ -484,6 +495,7 @@ public class BasDosService {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// PDF 다운로드
|
|
|
|
|
public void createPDF(List<BasDosPlanRs> rs) { |
|
|
|
|
|
|
|
|
|
List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>(); |
|
|
|
@ -620,4 +632,160 @@ public class BasDosService {
|
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|