Browse Source

feat: 드론원스톱 처리유형 분리(관제과, 운항과)

pull/19/head
지대한 4 weeks ago
parent
commit
adf4885c12
  1. 25
      http/server/server.http
  2. 16
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/controller/BasDosController.java
  3. 22
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/BasDosPlanRq.java
  4. 21
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/DosBasPlanReviewedProcRq.java
  5. 6
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/DosBasPlanReviewedRq.java
  6. 59
      pav-server/src/main/java/com/palnet/biz/api/bas/dos/service/BasDosService.java
  7. 30
      pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java
  8. 11
      pav-server/src/main/java/com/palnet/biz/config/convert/CodeToReviewdProcTypeConverter.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/ReviewedProcTypeConverter.java
  11. 39
      pav-server/src/main/java/com/palnet/biz/jpa/entity/type/ReviewedProcType.java
  12. 20
      pav-server/src/main/java/com/palnet/biz/jpa/entity/type/ReviewedType.java

25
http/server/server.http

@ -225,19 +225,36 @@ Authorization: {{accessToken}}
GET {{appHost}}/api/bas/dos/plan/download/han-com?searchStDt=2023-06-14&searchEndDt=2025-06-14
Authorization: {{accessToken}}
### dos(드론원스톱) 검토 수정
### dos(드론원스톱) 검토 수정 - 운항과
PATCH {{appHost}}/api/bas/dos/plan/reviewed
Authorization: {{accessToken}}
Content-Type: application/json
{
"planAreaSnoList": [
42,
43
11,
12,
13
],
"reviewedType": "R"
"reviewedType": "Q"
}
### dos(드론원스톱) 검토 처리 수정 - 관제과
PATCH {{appHost}}/api/bas/dos/plan/reviewed/proc
Authorization: {{accessToken}}
Content-Type: application/json
{
"planAreaSnoList": [
11,
12,
13
],
"reviewedProcType": "P"
}
### 계정정보로 부서 바운더리 가져오기
GET http://localhost:8080/api/comn/coordinate/boundary
Authorization: {{accessToken}}

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

@ -50,7 +50,7 @@ public class BasDosController {
}
/**
* 비행계획 검토
* 비행계획 검토 - 운항과
*
* @param rq
* @return
@ -64,6 +64,20 @@ public class BasDosController {
return ResponseEntity.ok().build();
}
/**
* 비행계획 검토 - 관제과
* @param rq
* @return
*/
@PatchMapping("/plan/reviewed/proc")
public ResponseEntity<?> updateDosPlanReviewedProc(@RequestBody DosBasPlanReviewedProcRq rq) {
if (rq == null || rq.getPlanAreaSnoList() == null || rq.getPlanAreaSnoList().isEmpty() || rq.getReviewedProcType() == null) {
throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
}
basDosService.updatePlanReviewedProc(rq);
return ResponseEntity.ok().build();
}
/**
* 엑셀 다운로드
*

22
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;
import com.palnet.biz.jpa.entity.type.ReviewedProcType;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
@ -15,30 +16,33 @@ import java.time.LocalDate;
@Builder
public class BasDosPlanRq {
@Schema(description = "검색시작일자" , example = "2024-06-01", implementation = LocalDate.class)
@Schema(description = "검색시작일자", example = "2024-06-01", implementation = LocalDate.class)
private LocalDate searchStDt;
@Schema(description = "검색끝일자" , example = "2024-06-30", implementation = LocalDate.class)
@Schema(description = "검색끝일자", example = "2024-06-30", implementation = LocalDate.class)
private LocalDate searchEndDt;
@Schema(description = "문서번호" , implementation = String.class)
@Schema(description = "문서번호", example = "201118-1010", implementation = String.class)
private String applyNo;
@Schema(description = "승인코드", implementation = String.class)
@Schema(description = "승인코드", example = "S", implementation = String.class)
private String approvalCd;
@Schema(description = "바운더리" , example = "GIMPO", implementation = String.class)
@Schema(description = "바운더리", example = "GIMPO", implementation = String.class)
private String selectZone;
@Schema(description = "시/구 주소" , example = "인천광역시", implementation = String.class)
@Schema(description = "시/구 주소", example = "인천광역시", implementation = String.class)
private String ctprvn;
@Schema(description = "시/군/구 주소" , example = "남동구", implementation = String.class)
@Schema(description = "시/군/구 주소", example = "남동구", implementation = String.class)
private String sig;
@Schema(description = "상세주소" , example = "만수동", implementation = String.class)
@Schema(description = "상세주소", example = "만수동", implementation = String.class)
private String address;
@Schema(description = "검토결과" , example = "W", implementation = ReviewedType.class)
@Schema(description = "검토유형(운항과)", example = "W", implementation = ReviewedType.class)
private ReviewedType reviewedType;
@Schema(description = "검토유형(관제과)", example = "W", implementation = ReviewedProcType.class)
private ReviewedProcType reviewedProcType;
}

21
pav-server/src/main/java/com/palnet/biz/api/bas/dos/model/DosBasPlanReviewedProcRq.java

@ -0,0 +1,21 @@
package com.palnet.biz.api.bas.dos.model;
import com.palnet.biz.jpa.entity.type.ReviewedProcType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DosBasPlanReviewedProcRq {
@Schema(description = "비행구역일련번호", example = "[1, 2, 3]", type = "array")
private List<Long> planAreaSnoList;
@Schema(description = "검토처리유형", example = "P", implementation = ReviewedProcType.class)
private ReviewedProcType reviewedProcType;
}

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

@ -1,6 +1,7 @@
package com.palnet.biz.api.bas.dos.model;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -13,8 +14,9 @@ import java.util.List;
@AllArgsConstructor
@Builder
public class DosBasPlanReviewedRq {
// 비행구역일련번호
@Schema(description = "비행구역일련번호", example = "[1, 2, 3]", type = "array")
private List<Long> planAreaSnoList;
// 검토 타입
@Schema(description = "검토 타입", example = "Q", implementation = ReviewedType.class)
private ReviewedType reviewedType;
}

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

@ -16,6 +16,7 @@ import com.palnet.biz.api.external.service.DronOneStopService;
import com.palnet.biz.jpa.entity.DosFltPlanArea;
import com.palnet.biz.jpa.entity.DosFltPlanBas;
import com.palnet.biz.jpa.entity.DosFltPlanResult;
import com.palnet.biz.jpa.entity.type.ReviewedProcType;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import com.palnet.biz.jpa.repository.dos.*;
import com.palnet.comn.code.ErrorCode;
@ -158,10 +159,11 @@ public class BasDosService {
if (cptAuthCode != null) {
Coordinate centerPoint = new Coordinate(area.getLon(), area.getLat());
if ("DF0002".equals(cptAuthCode)) {
// 검토요청한 건에 대해만 보이도록(reviewedType - REQUEST(요청), REQUEST_CANCEL(요청취소), REQUEST_AGAIN(재요청), REVIEWED(완료))
if (area.getReviewedType() != ReviewedType.REQUEST && area.getReviewedType() != ReviewedType.REQUEST_AGAIN && area.getReviewedType() != ReviewedType.REQUEST_CANCEL && area.getReviewedType() != ReviewedType.REVIEWED) {
// 관제과와 관련된 내용으로만 필터링 reviewedProcType이 null이 아니라면 표출
if (area.getReviewedProcType() == null) {
continue;
}
// 관제과(9.3km)
AirspaceUtils airspaceUtils = AirspaceUtils.getInstance();
List<AirspaceUtils.FeatureInfo> airspaces = airspaceUtils.getAirspaces(AirspaceUtils.AirspaceType.GIMPO);
@ -207,7 +209,7 @@ public class BasDosService {
}
}
bufferCoordList = coordBuffers.stream().map(coord -> Map.of("lat", coord.y, "lon", coord.x)).collect(Collectors.toList());
if(area.getReqRadius() != null && area.getReqRadius() > 0) {
if (area.getReqRadius() != null && area.getReqRadius() > 0) {
List<Coordinate> reqCoordBuffers = areaUtils.createCircle(new Coordinate(area.getLon(), area.getLat()), area.getReqRadius());
reqBufferCoordList = reqCoordBuffers.stream().map(coord -> Map.of("lat", coord.y, "lon", coord.x)).collect(Collectors.toList());
}
@ -400,11 +402,16 @@ public class BasDosService {
}
/**
* 검토 수정
* 검토 수정 - 운항과
*
* @param rq
*/
public void updatePlanReviewed(DosBasPlanReviewedRq rq) {
ReviewedType reqReviewedType = rq.getReviewedType();
if (reqReviewedType == null || reqReviewedType == ReviewedType.CANCEL || reqReviewedType == ReviewedType.PROCESS) {
log.warn("request reviewedType is not valid : {}", reqReviewedType);
throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
}
List<Long> planAreaSnoList = rq.getPlanAreaSnoList();
List<DosFltPlanArea> planAreaList = dosFltPlanAreaRepository.findByPlanAreaSnoIn(planAreaSnoList);
if (planAreaList == null || planAreaList.isEmpty()) {
@ -413,12 +420,56 @@ public class BasDosService {
}
for (DosFltPlanArea area : planAreaList) {
if (reqReviewedType == ReviewedType.WAIT || reqReviewedType == ReviewedType.UNNECESSARY) {
area.setReviewedProcType(null);
} else if (reqReviewedType == ReviewedType.REQUEST) {
area.setReviewedProcType(ReviewedProcType.WAIT);
} else if (reqReviewedType == ReviewedType.RE_REQUEST) {
area.setReviewedProcType(ReviewedProcType.RE_REVIEW);
} else if (reqReviewedType == ReviewedType.SUCCESS) {
area.setReviewedProcType(ReviewedProcType.SUCCESS);
}
area.setReviewedType(rq.getReviewedType());
}
dosFltPlanAreaRepository.saveAll(planAreaList);
}
/**
* 검토 수정 - 관제과
*
* @param rq
*/
public void updatePlanReviewedProc(DosBasPlanReviewedProcRq rq) {
ReviewedProcType reqReviewedProcType = rq.getReviewedProcType();
if (reqReviewedProcType == null || reqReviewedProcType == ReviewedProcType.SUCCESS || reqReviewedProcType == ReviewedProcType.WAIT || reqReviewedProcType == ReviewedProcType.RE_REVIEW) {
log.warn("request reviewedProcType is not valid : {}", reqReviewedProcType);
throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
}
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) {
if(area.getReviewedProcType() == ReviewedProcType.SUCCESS) {
log.warn("reviewedProcType is not changed because status is SUCCESS: area:{}/rq:{}", area.getReviewedProcType(), rq.getReviewedProcType());
continue;
}
if (reqReviewedProcType == ReviewedProcType.CANCEL) {
area.setReviewedType(ReviewedType.CANCEL);
} else if (reqReviewedProcType == ReviewedProcType.PROCESS) {
area.setReviewedType(ReviewedType.PROCESS);
}
area.setReviewedProcType(rq.getReviewedProcType());
}
dosFltPlanAreaRepository.saveAll(planAreaList);
}
/**
* Buffer 좌표 추출
* 비행구역의 데이터를 이용하여 주변의 좌표를 추출한다.

30
pav-server/src/main/java/com/palnet/biz/config/WebMvcConfig.java

@ -1,6 +1,7 @@
package com.palnet.biz.config;
import com.palnet.biz.config.convert.CodeToFltPurposeBinding;
import com.palnet.biz.config.convert.CodeToReviewdProcTypeConverter;
import com.palnet.biz.config.convert.CodeToReviewdTypeConverter;
import com.palnet.biz.config.convert.StringToInstantBinding;
import org.springframework.context.annotation.Bean;
@ -35,7 +36,7 @@ public class WebMvcConfig implements WebMvcConfigurer{
// public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// converters.add(escapingConverter());
// }
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
/*registry.addResourceHandler("/web/**").addResourceLocations("/web/")
.setCacheControl(CacheControl.maxAge(10, TimeUnit.DAYS)).resourceChain(true)
@ -43,22 +44,22 @@ public class WebMvcConfig implements WebMvcConfigurer{
.addResolver(new VersionResourceResolver()
.addContentVersionStrategy("/**"))
.addTransformer(new AppCacheManifestTransformer());*/
// html 가능 하게 설정
/*registry.addResourceHandler("/**").addResourceLocations("/web/hcws/html/");*/
}
@Bean
public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
return new ResourceUrlEncodingFilter();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
//임시로 크로스오리진 전체를 품
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS");
}
//
// @Bean
// public HttpMessageConverter escapingConverter() {
@ -82,30 +83,31 @@ public class WebMvcConfig implements WebMvcConfigurer{
//
// return escapingConverter;
// }
@Override
@Override
public void addFormatters(FormatterRegistry registry) {
// json
// json
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateFormatter(DateTimeFormatter.ofPattern(dateFormat));
registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern(dateTimeFormat));
registrar.registerFormatters(registry);
registry.addConverter(new StringToInstantBinding());
registry.addConverter(new CodeToFltPurposeBinding());
registry.addConverter(new CodeToReviewdTypeConverter());
registry.addConverter(new StringToInstantBinding());
registry.addConverter(new CodeToFltPurposeBinding());
registry.addConverter(new CodeToReviewdTypeConverter());
registry.addConverter(new CodeToReviewdProcTypeConverter());
/* ISO 타입.
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
*/
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//접근고유ID 체크 Interceptor
/*registry.addInterceptor(accsUUIDcheckInterceptor)
.addPathPatterns("/sendbox/")

11
pav-server/src/main/java/com/palnet/biz/config/convert/CodeToReviewdProcTypeConverter.java

@ -0,0 +1,11 @@
package com.palnet.biz.config.convert;
import com.palnet.biz.jpa.entity.type.ReviewedProcType;
import org.springframework.core.convert.converter.Converter;
public class CodeToReviewdProcTypeConverter implements Converter<String, ReviewedProcType> {
@Override
public ReviewedProcType convert(String s) {
return ReviewedProcType.fromCode(s);
}
}

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

@ -1,6 +1,8 @@
package com.palnet.biz.jpa.entity;
import com.palnet.biz.jpa.entity.converter.ReviewedProcTypeConverter;
import com.palnet.biz.jpa.entity.converter.ReviewedTypeConverter;
import com.palnet.biz.jpa.entity.type.ReviewedProcType;
import com.palnet.biz.jpa.entity.type.ReviewedType;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -65,6 +67,10 @@ public class DosFltPlanArea {
// 재검토 사유
@Column(name = "REVIEWED_REASON")
private String reviewedReason;
// 검토 타입
@Convert(converter = ReviewedProcTypeConverter.class)
@Column(name = "REVIEWED_PROC_TYPE")
private ReviewedProcType reviewedProcType;
// 장애물 제한 표면
@Column(name = "LIMIT_ZONE")
private String limitZone;

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

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

39
pav-server/src/main/java/com/palnet/biz/jpa/entity/type/ReviewedProcType.java

@ -0,0 +1,39 @@
package com.palnet.biz.jpa.entity.type;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
public enum ReviewedProcType {
WAIT("W", "대기"), // 검토대기(운항과로 부터 요청)
CANCEL("C", "취소"), // 검토요청취소
PROCESS("P", "처리"), // 검토처리
RE_REVIEW("R", "재검토"), // 재검토(운항과로 부터 재요청)
SUCCESS("S", "완료"); // 검토완료(운항과 완료에 의한 변경)
private final String code;
@Getter
private final String value;
@JsonValue
public String getCode() {
return code;
}
ReviewedProcType(String code, String value) {
this.code = code;
this.value = value;
}
@JsonCreator
public static ReviewedProcType fromCode(String code) {
for (ReviewedProcType reviewedType : ReviewedProcType.values()) {
if (reviewedType.getCode().equals(code)) {
return reviewedType;
}
}
return null;
}
}

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

@ -5,12 +5,20 @@ import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
public enum ReviewedType {
REVIEWED("R", "검토완료"), // 검토완료 - 김포공항기준(운항과, 관제과)
WAIT("W", "검토대기"), // 최초 - 대상지역
UNNECESSARY("U", "검토불필요"), // 최초 - 비대상지역
REQUEST("Q", "검토요청"), // 검토요청 - 김포공항기준(운항과 > 관제과)
REQUEST_AGAIN("A", "검토재요청"), // 검토재요청 - 김포공항기준(관제과 > 운항과)
REQUEST_CANCEL("C", "검토요청취소"); // 검토요청취소 - 김포공항기준(관제과 > 운항과)
// REVIEWED("R", "검토완료"), // 검토완료 - 김포공항기준(운항과, 관제과)
// WAIT("W", "검토대기"), // 최초 - 대상지역
// UNNECESSARY("U", "검토불필요"), // 최초 - 비대상지역
// REQUEST("Q", "검토요청"), // 검토요청 - 김포공항기준(운항과 > 관제과)
// REQUEST_AGAIN("A", "검토재요청"), // 검토재요청 - 김포공항기준(관제과 > 운항과)
// REQUEST_CANCEL("C", "검토요청취소"); // 검토요청취소 - 김포공항기준(관제과 > 운항과)
WAIT("W", "대기"), // 검토대기
UNNECESSARY("U", "불필요"), // 검토불필요
REQUEST("Q", "요청"), // 검토요청(관제과로 요청)
CANCEL("C", "요청취소"), // 검토요청취소(관제과로부터 요청취소) - 관제과에 의한 처리
PROCESS("P", "요청처리"), // 검토처리(관제과로부터 처리) - 관제과에 의한 처리
RE_REQUEST("R", "재요청"), // 검토재요청(관제과로 재요청)
SUCCESS("S", "완료"); // 검토완료
private final String code;
@Getter

Loading…
Cancel
Save