|
|
|
@ -1,22 +1,45 @@
|
|
|
|
|
package com.palnet.biz.api.bas.flight.service; |
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Arrays; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.locationtech.jts.geom.GeometryFactory; |
|
|
|
|
import org.locationtech.jts.geom.Polygon; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; |
|
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.*; |
|
|
|
|
import com.palnet.biz.jpa.entity.*; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightAprovRq; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordRq; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanListRq; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; |
|
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanResultMessageRq; |
|
|
|
|
import com.palnet.biz.jpa.entity.FltPlanArcrft; |
|
|
|
|
import com.palnet.biz.jpa.entity.FltPlanArea; |
|
|
|
|
import com.palnet.biz.jpa.entity.FltPlanAreaCoord; |
|
|
|
|
import com.palnet.biz.jpa.entity.FltPlanBas; |
|
|
|
|
import com.palnet.biz.jpa.entity.FltPlanPilot; |
|
|
|
|
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.*; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanPilotRepository; |
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; |
|
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
|
import com.palnet.comn.utils.EncryptUtils; |
|
|
|
|
import com.palnet.comn.utils.FlightUtils; |
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.log4j.Log4j2; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Log4j2 |
|
|
|
@ -44,11 +67,11 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
// 비행계획서 상세 조회
|
|
|
|
|
public BasFlightPlanModel detailPlan(Integer planSno) { |
|
|
|
|
BasFlightPlanModel rs = new BasFlightPlanModel(); |
|
|
|
|
BasFlightPlanModel rs = new BasFlightPlanModel(); |
|
|
|
|
// 비행계획서
|
|
|
|
|
FltPlanBas planEntity = fltPlanBasRepository.findByPlanSnoAndDelYnNot(planSno, "Y").orElse(null); |
|
|
|
|
if(planEntity != null){ |
|
|
|
|
rs = BasFlightMapper.mapper.entityToModel(planEntity); |
|
|
|
|
rs = BasFlightMapper.mapper.entityToModel(planEntity); |
|
|
|
|
// 버퍼영역
|
|
|
|
|
List<FltPlanArea> areaEntityList = fltPlanAreaRepository.findByPlanSnoOrderByPlanAreaSnoAsc(planSno); |
|
|
|
|
if (areaEntityList != null && !areaEntityList.isEmpty()) { |
|
|
|
@ -88,7 +111,141 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
// 비행계획서 등록
|
|
|
|
|
public boolean createPlan(BasFlightPlanModel rq) { |
|
|
|
|
// 비행계획서
|
|
|
|
|
// 비행계획서 등록 시 계획일자 중복 , 비행구역 중복 체크
|
|
|
|
|
GeometryFactory geometryFactory = new GeometryFactory(); |
|
|
|
|
List<BasFlightPlanArcrftModel> arcrftModelList = rq.getArcrftList(); |
|
|
|
|
List<BasFlightPlanAreaModel> areaModelList = rq.getAreaList(); |
|
|
|
|
for(int i = 0; i < arcrftModelList.size(); i++) { |
|
|
|
|
String idntfNum = arcrftModelList.get(i).getIdntfNum(); |
|
|
|
|
int size = fltPlanQueryRepository.arcrftCheck(rq, idntfNum).size(); |
|
|
|
|
if( size != 0) { |
|
|
|
|
BasFlightPlanResultMessageRq dateCheck = new BasFlightPlanResultMessageRq(); |
|
|
|
|
dateCheck.setDateCheck(false); |
|
|
|
|
return false; |
|
|
|
|
}else { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
List<Coordinate> coordList = new ArrayList<>(); |
|
|
|
|
List<Coordinate> bufferCoord = new ArrayList<>(); |
|
|
|
|
List<BasFlightPlanAreaCoordRq> queryList = fltPlanQueryRepository.CoordCheck(rq); |
|
|
|
|
List<BasFlightPlanAreaCoordRq> queryCount = fltPlanQueryRepository.CoordCount(rq); |
|
|
|
|
String type = null; |
|
|
|
|
String queryType = null; |
|
|
|
|
Integer bufferZone = null; |
|
|
|
|
Integer queryBufferZone = null; |
|
|
|
|
Coordinate queryCoord = null; |
|
|
|
|
Coordinate coord = null; |
|
|
|
|
for(int i = 0; i<arcrftModelList.size(); i++) { |
|
|
|
|
List<BasFlightPlanAreaCoordModel> coordModelList = areaModelList.get(i).getCoordList(); |
|
|
|
|
type = rq.getAreaList().get(i).getAreaType(); |
|
|
|
|
bufferZone = rq.getAreaList().get(i).getBufferZone(); |
|
|
|
|
Double lat; |
|
|
|
|
Double lon; |
|
|
|
|
|
|
|
|
|
for(int j = 0; j<coordModelList.size(); j++) { |
|
|
|
|
lat = rq.getAreaList().get(i).getCoordList().get(j).getLat(); |
|
|
|
|
lon = rq.getAreaList().get(i).getCoordList().get(j).getLon(); |
|
|
|
|
coord = new Coordinate(lon , lat); |
|
|
|
|
coordList.add(coord); |
|
|
|
|
} |
|
|
|
|
if("POLYGON".equals(type)) { |
|
|
|
|
coord = new Coordinate(rq.getAreaList().get(i).getCoordList().get(0).getLon(),rq.getAreaList().get(i).getCoordList().get(0).getLat()); |
|
|
|
|
coordList.add(coord); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
List<Coordinate> transCoordList = areaUtils.transform(coordList, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
if("LINE".equals(type)){ |
|
|
|
|
bufferCoord = areaUtils.buffer(transCoordList, bufferZone); |
|
|
|
|
} |
|
|
|
|
if("CIRCLE".equals(type)) { |
|
|
|
|
bufferCoord = areaUtils.createCircle(coord, bufferZone); |
|
|
|
|
} |
|
|
|
|
if("POLYGON".equals(type)) { |
|
|
|
|
Polygon polygon = geometryFactory.createPolygon(coordList.toArray(new Coordinate[] {})); |
|
|
|
|
Coordinate[] coords = polygon.getCoordinates(); |
|
|
|
|
bufferCoord.addAll(Arrays.asList(coords)); |
|
|
|
|
} |
|
|
|
|
List<Coordinate> reverseBufferList = areaUtils.transform(bufferCoord, "EPSG:5181","EPSG:4326"); |
|
|
|
|
int k=0; |
|
|
|
|
for(int i = 0; i<queryCount.size(); i++) { |
|
|
|
|
List<Coordinate> queryBufferCoord = new ArrayList<>(); |
|
|
|
|
List<Coordinate> queryCoordList = new ArrayList<>(); |
|
|
|
|
queryType = queryCount.get(i).getAreaType(); |
|
|
|
|
queryBufferZone = queryCount.get(i).getBufferZone(); |
|
|
|
|
for(int j=0; j< queryCount.get(i).getCnt(); j++) { |
|
|
|
|
Double lat = queryList.get(k).getLat(); |
|
|
|
|
Double lon = queryList.get(k).getLon(); |
|
|
|
|
System.out.println(lon + "," + lat); |
|
|
|
|
k++; |
|
|
|
|
queryCoord = new Coordinate(lon , lat); |
|
|
|
|
queryCoordList.add(queryCoord); |
|
|
|
|
} |
|
|
|
|
List<Coordinate> transQueryCoordList = areaUtils.transform(queryCoordList, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
if("LINE".equals(queryType)){ |
|
|
|
|
queryBufferCoord = areaUtils.buffer(transQueryCoordList, queryBufferZone); |
|
|
|
|
} |
|
|
|
|
if("CIRCLE".equals(queryType)) { |
|
|
|
|
queryBufferCoord = areaUtils.createCircle(queryCoord, queryBufferZone); |
|
|
|
|
} |
|
|
|
|
if("POLYGON".equals(queryType)) { |
|
|
|
|
queryCoord = new Coordinate(queryCoordList.get(0).getX(),queryCoordList.get(0).getY()); |
|
|
|
|
queryCoordList.add(queryCoord); |
|
|
|
|
Polygon polygon = geometryFactory.createPolygon(queryCoordList.toArray(new Coordinate[] {})); |
|
|
|
|
Coordinate[] coords = polygon.getCoordinates(); |
|
|
|
|
queryBufferCoord.addAll(Arrays.asList(coords)); |
|
|
|
|
} |
|
|
|
|
List<Coordinate> reverseQueryBufferList = areaUtils.transform(queryBufferCoord, "EPSG:5181","EPSG:4326"); |
|
|
|
|
queryCoord = new Coordinate(reverseQueryBufferList.get(0).getX(),reverseQueryBufferList.get(0).getY()); |
|
|
|
|
reverseQueryBufferList.add(queryCoord); |
|
|
|
|
Coordinate[] rqPoly= null; |
|
|
|
|
Coordinate[] queryPoly= null; |
|
|
|
|
boolean rqContains = false; |
|
|
|
|
boolean queryContains = false; |
|
|
|
|
List<Coordinate> rqCooCheck = new ArrayList<>(); |
|
|
|
|
List<Coordinate> queryCooCheck = new ArrayList<>(); |
|
|
|
|
if("LINE".equals(type)) { |
|
|
|
|
rqPoly = reverseBufferList.toArray(new Coordinate[] {}); |
|
|
|
|
} else { |
|
|
|
|
rqPoly = bufferCoord.toArray(new Coordinate[] {}); |
|
|
|
|
} |
|
|
|
|
if("LINE".equals(queryType)) { |
|
|
|
|
queryPoly = reverseQueryBufferList.toArray(new Coordinate[] {}); |
|
|
|
|
} else { |
|
|
|
|
queryPoly = queryBufferCoord.toArray(new Coordinate[] {}); |
|
|
|
|
} |
|
|
|
|
for(Coordinate co : rqPoly) { |
|
|
|
|
Coordinate coo = new Coordinate(co.x , co.y); |
|
|
|
|
rqCooCheck.add(coo); |
|
|
|
|
} |
|
|
|
|
System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ"); |
|
|
|
|
for(Coordinate co : queryPoly) { |
|
|
|
|
Coordinate coo = new Coordinate(co.x , co.y); |
|
|
|
|
queryCooCheck.add(coo); |
|
|
|
|
} |
|
|
|
|
for(Coordinate co : queryPoly) { |
|
|
|
|
Coordinate coo = new Coordinate(co.x , co.y); |
|
|
|
|
boolean Q = areaUtils.contains(rqCooCheck, coo); |
|
|
|
|
if(Q == true) { |
|
|
|
|
rqContains = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for(Coordinate co : rqPoly) { |
|
|
|
|
Coordinate coo = new Coordinate(co.x , co.y); |
|
|
|
|
boolean Q = areaUtils.contains(queryCooCheck, coo); |
|
|
|
|
if(Q == true) { |
|
|
|
|
queryContains = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
boolean check = FlightUtils.overlaps(rqPoly, queryPoly); |
|
|
|
|
boolean checks = FlightUtils.overlaps(queryPoly, rqPoly); |
|
|
|
|
if(check == true || checks == true || rqContains == true || queryContains == true) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//비행계획서
|
|
|
|
|
String userId = jwtTokenUtil.getCstmrSnoByToken().toString(); |
|
|
|
|
FltPlanBas basEntity = BasFlightMapper.mapper.modelToEntity(rq); |
|
|
|
|
basEntity.setDelYn("N"); |
|
|
|
@ -98,7 +255,6 @@ public class BasFlightService {
|
|
|
|
|
FltPlanBas rBasEntity = fltPlanBasRepository.save(basEntity); |
|
|
|
|
Integer planSno = rBasEntity.getPlanSno(); |
|
|
|
|
// 비행구역
|
|
|
|
|
List<BasFlightPlanAreaModel> areaModelList = rq.getAreaList(); |
|
|
|
|
if (areaModelList != null && !areaModelList.isEmpty()) { |
|
|
|
|
for (BasFlightPlanAreaModel areaModel : areaModelList) { |
|
|
|
|
FltPlanArea areaEntity = BasFlightMapper.mapper.modelToEntity(areaModel); |
|
|
|
@ -133,7 +289,6 @@ public class BasFlightService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 기체
|
|
|
|
|
List<BasFlightPlanArcrftModel> arcrftModelList = rq.getArcrftList(); |
|
|
|
|
if (arcrftModelList != null && !arcrftModelList.isEmpty()) { |
|
|
|
|
for (BasFlightPlanArcrftModel arcrftModel : arcrftModelList) { |
|
|
|
|
FltPlanArcrft arcrftEntity = BasFlightMapper.mapper.modelToEntity(arcrftModel); |
|
|
|
@ -222,7 +377,7 @@ public class BasFlightService {
|
|
|
|
|
if(pilotEntity == null){ |
|
|
|
|
pilotEntity = BasFlightMapper.mapper.modelToEntity(pilotModel); |
|
|
|
|
pilotEntity.setUpdateUserId(userId); |
|
|
|
|
// pilotEntity.setCreateUserId(userId);
|
|
|
|
|
pilotEntity.setCreateUserId(userId); |
|
|
|
|
|
|
|
|
|
}else { |
|
|
|
|
BasFlightMapper.mapper.updateEntityByModel(pilotEntity, pilotModel); |
|
|
|
@ -248,6 +403,7 @@ public class BasFlightService {
|
|
|
|
|
if(arcrftEntity == null){ |
|
|
|
|
arcrftEntity = BasFlightMapper.mapper.modelToEntity(arcrftModel); |
|
|
|
|
arcrftEntity.setUpdateUserId(userId); |
|
|
|
|
arcrftEntity.setCreateUserId(userId); |
|
|
|
|
}else { |
|
|
|
|
BasFlightMapper.mapper.updateEntityByModel(arcrftEntity, arcrftModel); |
|
|
|
|
} |
|
|
|
|