Browse Source

Merge branch 'develop' into feature/address-coordinate

feature/address-coordinate
lkd9125(이경도) 2 months ago
parent
commit
b9a43a6d98
  1. 23
      http/server/server.http
  2. 18
      pav-server/build.gradle
  3. 39
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java
  4. 3
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanAreaRs.java
  5. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java
  6. 2
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosUpdatePlanRq.java
  7. 20
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/DosBasPlanReviewedRq.java
  8. 217
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java
  9. 6
      pav-server/src/main/java/com/palnet/biz/jpa/entity/DosFltPlanArea.java
  10. 27
      pav-server/src/main/java/com/palnet/biz/jpa/entity/converter/ReviewedTypeConverter.java
  11. 36
      pav-server/src/main/java/com/palnet/biz/jpa/entity/type/ReviewedType.java
  12. 57
      pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java
  13. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom2.hwpx
  14. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc.hwpx
  15. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc2.hwpx
  16. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc3.hwpx
  17. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc4.hwpx
  18. BIN
      pav-server/src/main/resources/templates/hancom/dos_hancom_doc5.hwpx

23
http/server/server.http

@ -31,8 +31,8 @@ POST {{appHost}}/api/acnt/jwt/login
Content-Type: application/json Content-Type: application/json
{ {
"userId": "dos-gmp", "userId": "GMPATC",
"userPswd": "palnet!234" "userPswd": "GMPATC12!@"
} }
> {% > {%
@ -114,4 +114,21 @@ Authorization: {{accessToken}}
### dos(드론원스톱) pdf download ### dos(드론원스톱) pdf download
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=2023-06-14&searchEndDt=2025-06-14
Authorization: {{accessToken}}
### dos(드론원스톱) 검토 수정
PATCH {{appHost}}/api/bas/dos/plan/reviewed
Authorization: {{accessToken}}
Content-Type: application/json
{
"planAreaSnoList": [
42,
43
],
"reviewedType": "R"
}

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

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

@ -1,9 +1,6 @@
package com.palnet.biz.api.bas.dos.controller; package com.palnet.biz.api.bas.dos.controller;
import com.palnet.biz.api.bas.dos.model.BasDosPlanRq; import com.palnet.biz.api.bas.dos.model.*;
import com.palnet.biz.api.bas.dos.model.BasDosPlanRs;
import com.palnet.biz.api.bas.dos.model.PlanSelectType;
import com.palnet.biz.api.bas.dos.model.UpdatePlanRq;
import com.palnet.biz.api.bas.dos.service.BasDosService; import com.palnet.biz.api.bas.dos.service.BasDosService;
import com.palnet.comn.code.ErrorCode; import com.palnet.comn.code.ErrorCode;
import com.palnet.comn.exception.CustomException; import com.palnet.comn.exception.CustomException;
@ -44,16 +41,32 @@ public class BasDosController {
* @return * @return
*/ */
@PutMapping("/plan") @PutMapping("/plan")
public ResponseEntity<?> updateDosPlan(@RequestBody List<UpdatePlanRq> rq) { public ResponseEntity<?> updateDosPlan(@RequestBody List<BasDosUpdatePlanRq> rq) {
if(rq == null || rq.isEmpty()) { if (rq == null || rq.isEmpty()) {
throw new CustomException(ErrorCode.NON_VALID_PARAMETER); throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
} }
basDosService.updatePlan(rq); basDosService.updatePlan(rq);
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
/**
* 비행계획 검토
*
* @param rq
* @return
*/
@PatchMapping("/plan/reviewed")
public ResponseEntity<?> updateDosPlanReviewed(@RequestBody DosBasPlanReviewedRq rq) {
if (rq == null || rq.getPlanAreaSnoList() == null || rq.getPlanAreaSnoList().isEmpty() || rq.getReviewedType() == null) {
throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
}
basDosService.updatePlanReviewed(rq);
return ResponseEntity.ok().build();
}
/** /**
* 엑셀 다운로드 * 엑셀 다운로드
*
* @param rq * @param rq
*/ */
@GetMapping("/plan/download/excel") @GetMapping("/plan/download/excel")
@ -64,14 +77,26 @@ public class BasDosController {
/** /**
* PDF 다운로드 * PDF 다운로드
*
* @param rq * @param rq
*/ */
@GetMapping("/plan/download/pdf") @GetMapping("/plan/download/pdf")
public void downloadPDF(BasDosPlanRq rq){ public void downloadPDF(BasDosPlanRq rq) {
List<BasDosPlanRs> rs = basDosService.getDosPlan(rq, PlanSelectType.DOWNLOAD); List<BasDosPlanRs> rs = basDosService.getDosPlan(rq, PlanSelectType.DOWNLOAD);
basDosService.createPDF(rs); basDosService.createPDF(rs);
} }
/**
* 한글 다운로드
*
* @param rq
*/
@GetMapping("/plan/download/han-com")
public void downloadHanCom(BasDosPlanRq rq) {
List<BasDosPlanRs> rs = basDosService.getDosPlan(rq, PlanSelectType.DOWNLOAD);
basDosService.createHanCom(rs);
}
} }

3
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanAreaRs.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.bas.dos.model; package com.palnet.biz.api.bas.dos.model;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -49,6 +50,8 @@ public class BasDosPlanAreaRs {
private String era; private String era;
// 비고 // 비고
private String rm; private String rm;
// 검토유형
private ReviewedType reviewedType;
// 수정일시 // 수정일시
private Instant updateDt; private Instant updateDt;
// 생성일시 // 생성일시

20
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java

@ -1,5 +1,6 @@
package com.palnet.biz.api.bas.dos.model; package com.palnet.biz.api.bas.dos.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -12,9 +13,28 @@ import java.time.LocalDate;
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class BasDosPlanRq { public class BasDosPlanRq {
@Schema(description = "검색시작일자" , example = "2024-06-01", implementation = LocalDate.class)
private LocalDate searchStDt; private LocalDate searchStDt;
@Schema(description = "검색끝일자" , example = "2024-06-30", implementation = LocalDate.class)
private LocalDate searchEndDt; private LocalDate searchEndDt;
@Schema(description = "문서번호" , implementation = String.class)
private String applyNo; private String applyNo;
@Schema(description = "승인코드", implementation = String.class)
private String approvalCd; private String approvalCd;
@Schema(description = "바운더리" , example = "GIMPO", implementation = String.class)
private String selectZone; private String selectZone;
@Schema(description = "시/구 주소" , example = "인천광역시", implementation = String.class)
private String ctprvn;
@Schema(description = "시/군/구 주소" , example = "남동구", implementation = String.class)
private String sig;
@Schema(description = "상세주소" , example = "만수동", implementation = String.class)
private String address;
} }

2
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/UpdatePlanRq.java → pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosUpdatePlanRq.java

@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class UpdatePlanRq { public class BasDosUpdatePlanRq {
// 비행계획일련번호 // 비행계획일련번호
// private Long planSno; // private Long planSno;
// 비행구역일련번호 // 비행구역일련번호

20
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/DosBasPlanReviewedRq.java

@ -0,0 +1,20 @@
package com.palnet.biz.api.bas.dos.model;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DosBasPlanReviewedRq {
// 비행구역일련번호
private List<Long> planAreaSnoList;
// 검토 타입
private ReviewedType reviewedType;
}

217
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;
@ -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;
}
}
} }

6
pav-server/src/main/java/com/palnet/biz/jpa/entity/DosFltPlanArea.java

@ -1,5 +1,7 @@
package com.palnet.biz.jpa.entity; package com.palnet.biz.jpa.entity;
import com.palnet.biz.jpa.entity.converter.ReviewedTypeConverter;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -50,6 +52,10 @@ public class DosFltPlanArea {
// 비고 // 비고
@Column(name = "RM") @Column(name = "RM")
private String rm; private String rm;
// 검토 타입
@Convert(converter = ReviewedTypeConverter.class)
@Column(name = "REVIEWED_TYPE")
private ReviewedType reviewedType;
// 수정일시 // 수정일시
@Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP") @Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP")
private Instant updateDt; private Instant updateDt;

27
pav-server/src/main/java/com/palnet/biz/jpa/entity/converter/ReviewedTypeConverter.java

@ -0,0 +1,27 @@
package com.palnet.biz.jpa.entity.converter;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import org.apache.commons.lang3.StringUtils;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Objects;
@Converter
public class ReviewedTypeConverter implements AttributeConverter<ReviewedType, String> {
@Override
public String convertToDatabaseColumn(ReviewedType attribute) {
if (Objects.isNull(attribute)) {
return null;
}
return attribute.getCode();
}
@Override
public ReviewedType convertToEntityAttribute(String dbData) {
if (StringUtils.isBlank(dbData)) {
return null;
}
return ReviewedType.fromCode(dbData);
}
}

36
pav-server/src/main/java/com/palnet/biz/jpa/entity/type/ReviewedType.java

@ -0,0 +1,36 @@
package com.palnet.biz.jpa.entity.type;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
public enum ReviewedType {
REVIEWED("R", "완료"),
WAIT("W", "대기"),
CANCEL("C", "취소");
private final String code;
@Getter
private final String value;
@JsonValue
public String getCode() {
return code;
}
ReviewedType(String code, String value) {
this.code = code;
this.value = value;
}
@JsonCreator
public static ReviewedType fromCode(String code) {
for (ReviewedType reviewedType : ReviewedType.values()) {
if (reviewedType.getCode().equals(code)) {
return reviewedType;
}
}
return null;
}
}

57
pav-server/src/main/java/com/palnet/biz/jpa/repository/dos/DosFltPlanQueryRepository.java

@ -1,7 +1,9 @@
package com.palnet.biz.jpa.repository.dos; package com.palnet.biz.jpa.repository.dos;
import com.palnet.biz.api.bas.dos.model.BasDosPlanRq; import com.palnet.biz.api.bas.dos.model.BasDosPlanRq;
import com.palnet.biz.jpa.entity.DosFltPlanArea;
import com.palnet.biz.jpa.entity.DosFltPlanBas; import com.palnet.biz.jpa.entity.DosFltPlanBas;
import com.palnet.biz.jpa.entity.QDosFltPlanArea;
import com.palnet.biz.jpa.entity.QDosFltPlanBas; import com.palnet.biz.jpa.entity.QDosFltPlanBas;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
@ -21,6 +23,19 @@ public class DosFltPlanQueryRepository {
public List<DosFltPlanBas> findPlanByBasSearch(BasDosPlanRq rq) { public List<DosFltPlanBas> findPlanByBasSearch(BasDosPlanRq rq) {
QDosFltPlanBas bas = QDosFltPlanBas.dosFltPlanBas; QDosFltPlanBas bas = QDosFltPlanBas.dosFltPlanBas;
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea;
short idx = 0;
StringBuilder districtAddr = new StringBuilder();
if(rq.getCtprvn() != null && !rq.getCtprvn().isBlank()) {
districtAddr.append(rq.getCtprvn());
idx ++;
}
if(rq.getSig() != null && !rq.getSig().isBlank()) {
if(idx > 0) districtAddr.append(" ");
districtAddr.append(rq.getSig());
}
BooleanBuilder builder = new BooleanBuilder(); BooleanBuilder builder = new BooleanBuilder();
@ -33,10 +48,52 @@ public class DosFltPlanQueryRepository {
if(StringUtils.hasText(rq.getApplyNo())) { if(StringUtils.hasText(rq.getApplyNo())) {
builder.and(bas.applyNo.eq(rq.getApplyNo())); builder.and(bas.applyNo.eq(rq.getApplyNo()));
} }
if(!districtAddr.toString().isBlank()){
builder.and(qDosFltPlanArea.addr.like("%" + districtAddr.toString() + "%"));
}
if(rq.getAddress() != null && !rq.getAddress().isEmpty()){
builder.and(qDosFltPlanArea.addr.like("%" + rq.getAddress() + "%"));
}
return query.selectFrom(bas) return query.selectFrom(bas)
.leftJoin(qDosFltPlanArea)
.on(bas.planSno.eq(qDosFltPlanArea.planSno))
.where(builder) .where(builder)
.orderBy(bas.applyDt.desc(), bas.applyNo.desc()) .orderBy(bas.applyDt.desc(), bas.applyNo.desc())
.groupBy(bas.planSno)
.fetch();
}
public List<DosFltPlanArea> findByPlanSnoInAndAddrOrderByZoneNoAsc(List<Long> planSno, BasDosPlanRq rq){
QDosFltPlanArea qDosFltPlanArea = QDosFltPlanArea.dosFltPlanArea;
short idx = 0;
StringBuilder districtAddr = new StringBuilder();
if(rq.getCtprvn() != null && !rq.getCtprvn().isBlank()) {
districtAddr.append(rq.getCtprvn());
idx ++;
}
if(rq.getSig() != null && !rq.getSig().isBlank()) {
if(idx > 0) districtAddr.append(" ");
districtAddr.append(rq.getSig());
}
BooleanBuilder builder = new BooleanBuilder();
builder.and(qDosFltPlanArea.planSno.in(planSno));
if(!districtAddr.toString().isBlank()){
builder.and(qDosFltPlanArea.addr.like("%" + districtAddr.toString() + "%"));
}
if(rq.getAddress() != null && !rq.getAddress().isEmpty()){
builder.and(qDosFltPlanArea.addr.like("%" + rq.getAddress() + "%"));
}
return query
.select(qDosFltPlanArea)
.from(qDosFltPlanArea)
.where(builder)
.orderBy(qDosFltPlanArea.zoneNo.asc())
.fetch(); .fetch();
} }
} }

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