|
|
@ -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; |
|
|
@ -79,8 +89,7 @@ public class BasDosService { |
|
|
|
|
|
|
|
|
|
|
|
List<Long> planSnoList = planBasList.stream().map(DosFltPlanBas::getPlanSno).collect(Collectors.toList()); |
|
|
|
List<Long> planSnoList = planBasList.stream().map(DosFltPlanBas::getPlanSno).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<DosFltPlanArea> areaList = dosFltPlanQueryRepository.findByPlanSnoInAndAddrOrderByZoneNoAsc(planSnoList, rq); |
|
|
|
List<DosFltPlanArea> areaList = dosFltPlanAreaRepository.findByPlanSnoInOrderByZoneNoAsc(planSnoList); |
|
|
|
|
|
|
|
List<DosFltPlanResult> resultList = dosFltPlanResultRepository.findByPlanSnoIn(planSnoList); |
|
|
|
List<DosFltPlanResult> resultList = dosFltPlanResultRepository.findByPlanSnoIn(planSnoList); |
|
|
|
|
|
|
|
|
|
|
|
List<BasDosPlanRs> rs = new ArrayList<>(); |
|
|
|
List<BasDosPlanRs> rs = new ArrayList<>(); |
|
|
@ -193,6 +202,7 @@ public class BasDosService { |
|
|
|
.dtl(area.getDtl()) |
|
|
|
.dtl(area.getDtl()) |
|
|
|
.era(area.getEra()) |
|
|
|
.era(area.getEra()) |
|
|
|
.rm(area.getRm()) |
|
|
|
.rm(area.getRm()) |
|
|
|
|
|
|
|
.reviewedType(area.getReviewedType()) |
|
|
|
.bufferCoordList(bufferCoordList) |
|
|
|
.bufferCoordList(bufferCoordList) |
|
|
|
.build(); |
|
|
|
.build(); |
|
|
|
areaRsList.add(areaRs); |
|
|
|
areaRsList.add(areaRs); |
|
|
@ -229,8 +239,8 @@ public class BasDosService { |
|
|
|
* |
|
|
|
* |
|
|
|
* @param rq |
|
|
|
* @param rq |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public void updatePlan(List<UpdatePlanRq> rq) { |
|
|
|
public void updatePlan(List<BasDosUpdatePlanRq> rq) { |
|
|
|
for (UpdatePlanRq planRq : rq) { |
|
|
|
for (BasDosUpdatePlanRq planRq : rq) { |
|
|
|
if (planRq.getPlanAreaSno() == null) { |
|
|
|
if (planRq.getPlanAreaSno() == null) { |
|
|
|
log.info("planAreaSno is empty."); |
|
|
|
log.info("planAreaSno is empty."); |
|
|
|
continue; |
|
|
|
continue; |
|
|
@ -286,6 +296,26 @@ public class BasDosService { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 검토 수정 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param rq |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void updatePlanReviewed(DosBasPlanReviewedRq rq) { |
|
|
|
|
|
|
|
List<Long> planAreaSnoList = rq.getPlanAreaSnoList(); |
|
|
|
|
|
|
|
List<DosFltPlanArea> planAreaList = dosFltPlanAreaRepository.findByPlanAreaSnoIn(planAreaSnoList); |
|
|
|
|
|
|
|
if (planAreaList == null || planAreaList.isEmpty()) { |
|
|
|
|
|
|
|
log.warn("update data is not found"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (DosFltPlanArea area : planAreaList) { |
|
|
|
|
|
|
|
area.setReviewedType(rq.getReviewedType()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dosFltPlanAreaRepository.saveAll(planAreaList); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Buffer 좌표 추출 |
|
|
|
* Buffer 좌표 추출 |
|
|
|
* 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다. |
|
|
|
* 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다. |
|
|
@ -307,6 +337,11 @@ public class BasDosService { |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Excel 다운로드 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param rs |
|
|
|
|
|
|
|
*/ |
|
|
|
public void createExcel(List<BasDosPlanRs> rs) { |
|
|
|
public void createExcel(List<BasDosPlanRs> rs) { |
|
|
|
|
|
|
|
|
|
|
|
try (XSSFWorkbook workbook = new XSSFWorkbook()) { |
|
|
|
try (XSSFWorkbook workbook = new XSSFWorkbook()) { |
|
|
@ -463,6 +498,11 @@ public class BasDosService { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* PDF 다운로드 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param rs |
|
|
|
|
|
|
|
*/ |
|
|
|
public void createPDF(List<BasDosPlanRs> rs) { |
|
|
|
public void createPDF(List<BasDosPlanRs> rs) { |
|
|
|
|
|
|
|
|
|
|
|
List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>(); |
|
|
|
List<ValidPdfModel.ValidFlighgModel> validFlightList = new ArrayList<>(); |
|
|
@ -499,7 +539,7 @@ public class BasDosService { |
|
|
|
|
|
|
|
|
|
|
|
StringBuilder dateString = new StringBuilder(); |
|
|
|
StringBuilder dateString = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
|
|
if(dateList.get(0).equals(dateList.get(dateList.size() - 1))){ |
|
|
|
if (dateList.get(0).equals(dateList.get(dateList.size() - 1))) { |
|
|
|
String date = dateList.get(0).format(DateTimeFormatter.ofPattern("yy.M.d")); |
|
|
|
String date = dateList.get(0).format(DateTimeFormatter.ofPattern("yy.M.d")); |
|
|
|
String week = dateList.get(0).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.KOREAN).replace("요일", ""); |
|
|
|
String week = dateList.get(0).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.KOREAN).replace("요일", ""); |
|
|
|
|
|
|
|
|
|
|
@ -598,4 +638,169 @@ public class BasDosService { |
|
|
|
// return (pixelWidth * 256) / 8;
|
|
|
|
// return (pixelWidth * 256) / 8;
|
|
|
|
return (int) ((pixelWidth / 6.0) * 256); |
|
|
|
return (int) ((pixelWidth / 6.0) * 256); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 한글 다운로드 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param rs |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
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()) { |
|
|
|
|
|
|
|
ApprovalCd approvalCd = ApprovalCd.fromCode(areaRs.getApprovalCd()); |
|
|
|
|
|
|
|
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() + "" |
|
|
|
|
|
|
|
: "불가" |
|
|
|
|
|
|
|
: "비대상"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (approvalCd == ApprovalCd.UNAPPROVED) { |
|
|
|
|
|
|
|
run.charPrIDRef("17"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
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 + 1)); |
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|