|
|
@ -1,6 +1,5 @@ |
|
|
|
package com.palnet.biz.api.ctr.cntrl.service; |
|
|
|
package com.palnet.biz.api.ctr.cntrl.service; |
|
|
|
|
|
|
|
|
|
|
|
import java.awt.Toolkit; |
|
|
|
|
|
|
|
import java.io.BufferedReader; |
|
|
|
import java.io.BufferedReader; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStreamReader; |
|
|
|
import java.io.InputStreamReader; |
|
|
@ -15,11 +14,9 @@ import java.util.Date; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import java.util.Optional; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.UUID; |
|
|
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.*; |
|
|
|
|
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
|
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.json.simple.JSONObject; |
|
|
|
import org.json.simple.JSONObject; |
|
|
|
import org.json.simple.parser.JSONParser; |
|
|
|
import org.json.simple.parser.JSONParser; |
|
|
@ -29,13 +26,22 @@ import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.jwt.model.JwtGroupModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaCoordModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanAreaModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
|
|
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
|
|
import com.palnet.biz.api.bas.flight.service.BasFlightMapper; |
|
|
|
import com.palnet.biz.api.bas.flight.service.BasFlightMapper; |
|
|
|
import com.palnet.biz.api.comn.model.ControlGpsDataContext; |
|
|
|
import com.palnet.biz.api.comn.model.ControlGpsDataContext; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlArcrftWarnModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlDtlModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupArcrftModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlGroupModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRq; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlPlanContainsRs; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketContainsRq; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlSocketDataModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWarnLogModel; |
|
|
|
|
|
|
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlWeatherModel; |
|
|
|
import com.palnet.biz.jpa.entity.ComArcrftBas; |
|
|
|
import com.palnet.biz.jpa.entity.ComArcrftBas; |
|
|
|
import com.palnet.biz.jpa.entity.ComIdntfBas; |
|
|
|
import com.palnet.biz.jpa.entity.ComIdntfBas; |
|
|
|
import com.palnet.biz.jpa.entity.CtrCntrlBas; |
|
|
|
import com.palnet.biz.jpa.entity.CtrCntrlBas; |
|
|
@ -56,6 +62,9 @@ import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaCoordRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanAreaRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
|
|
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; |
|
|
|
|
|
|
|
import com.palnet.biz.scheduler.ctr.model.CtrTrnsLctnModel; |
|
|
|
|
|
|
|
import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; |
|
|
|
import com.palnet.comn.model.GPHistoryModel; |
|
|
|
import com.palnet.comn.model.GPHistoryModel; |
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
import com.palnet.comn.utils.AreaUtils; |
|
|
|
import com.palnet.comn.utils.DateUtils; |
|
|
|
import com.palnet.comn.utils.DateUtils; |
|
|
@ -71,6 +80,9 @@ public class CtrCntrlService { |
|
|
|
private JwtTokenUtil jwtTokenUtil; |
|
|
|
private JwtTokenUtil jwtTokenUtil; |
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
private CtrTrnsLctnService ctrTrnsLctnService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
|
|
private FltPlanCtrCntrlRelRepository relRepository; |
|
|
|
|
|
|
|
|
|
|
|
private final CtrCntrlQueryRepository query; |
|
|
|
private final CtrCntrlQueryRepository query; |
|
|
|
private final CtrCntrlBasRepository cntrlBasRepository; |
|
|
|
private final CtrCntrlBasRepository cntrlBasRepository; |
|
|
|
private final CtrCntrlHstryRepository cntrlHstryRepository; |
|
|
|
private final CtrCntrlHstryRepository cntrlHstryRepository; |
|
|
@ -254,32 +266,41 @@ public class CtrCntrlService { |
|
|
|
|
|
|
|
|
|
|
|
CtrCntrlBas control = cntrlBasRepository.findById(cntrlId).orElse(null); |
|
|
|
CtrCntrlBas control = cntrlBasRepository.findById(cntrlId).orElse(null); |
|
|
|
CtrCntrlHstry hisControl = cntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(cntrlId).orElse(null); |
|
|
|
CtrCntrlHstry hisControl = cntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(cntrlId).orElse(null); |
|
|
|
List<BasFlightPlanModel> flightPlan = new ArrayList<>(); |
|
|
|
// List<BasFlightPlanModel> flightPlan = new ArrayList<>();
|
|
|
|
if (hisControl != null && control != null) { |
|
|
|
// if (control != null) {
|
|
|
|
flightPlan = this.getFlightPlan(control.getIdntfNum()); |
|
|
|
// flightPlan = this.getFlightPlan(control.getIdntfNum());
|
|
|
|
} else { |
|
|
|
// }
|
|
|
|
flightPlan = this.getFlightPlan(hisControl.getTrmnlId()); |
|
|
|
int planSno = relRepository.getPlanSno(control.getIdntfNum()); |
|
|
|
} |
|
|
|
FltPlanArea planAreaData = planAreaRepository.getPlanData(planSno); |
|
|
|
if (flightPlan != null && !flightPlan.isEmpty()) { |
|
|
|
|
|
|
|
CtrCntrlPlanContainsRq containsRq = new CtrCntrlPlanContainsRq(); |
|
|
|
List<FltPlanAreaCoord> coordList = planCoordRepository.getCoordinate(planAreaData.getPlanAreaSno()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CtrCntrlSocketContainsRq containsRq = new CtrCntrlSocketContainsRq(); |
|
|
|
|
|
|
|
if (control != null) { |
|
|
|
containsRq.setIdntfNum(control.getIdntfNum()); |
|
|
|
containsRq.setIdntfNum(control.getIdntfNum()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (planAreaData != null) { |
|
|
|
containsRq.setLat(hisControl.getLat()); |
|
|
|
containsRq.setLat(hisControl.getLat()); |
|
|
|
containsRq.setLon(hisControl.getLon()); |
|
|
|
containsRq.setLon(hisControl.getLon()); |
|
|
|
containsRq.setPlanList(flightPlan); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = this.checkPlanContains(containsRq); |
|
|
|
if (hisControl != null) { |
|
|
|
model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); |
|
|
|
containsRq.setAreaType(planAreaData.getAreaType()); |
|
|
|
|
|
|
|
containsRq.setBufferZone(planAreaData.getBufferZone()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (coordList != null) { |
|
|
|
|
|
|
|
containsRq.setCoordList(coordList); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = this.checkSocketContains(containsRq); |
|
|
|
|
|
|
|
model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); |
|
|
|
|
|
|
|
|
|
|
|
if (model.isControlWarnCd()) { |
|
|
|
if (model.isControlWarnCd()) { |
|
|
|
CtrCntrlWarnLog log = new CtrCntrlWarnLog(); |
|
|
|
CtrCntrlWarnLog log = new CtrCntrlWarnLog(); |
|
|
|
if(control != null) { |
|
|
|
|
|
|
|
log.setCntrlId(control.getCntrlId()); |
|
|
|
log.setCntrlId(control.getCntrlId()); |
|
|
|
log.setIdntfNum(control.getIdntfNum()); |
|
|
|
log.setIdntfNum(control.getIdntfNum()); |
|
|
|
} else { |
|
|
|
|
|
|
|
log.setCntrlId(hisControl.getCntrlId()); |
|
|
|
|
|
|
|
log.setIdntfNum(hisControl.getTrmnlId()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
log.setOccurDt(hisControl.getSrvrRcvDt()); |
|
|
|
log.setOccurDt(hisControl.getSrvrRcvDt()); |
|
|
|
log.setLat(hisControl.getLat()); |
|
|
|
log.setLat(hisControl.getLat()); |
|
|
|
log.setLon(hisControl.getLon()); |
|
|
|
log.setLon(hisControl.getLon()); |
|
|
@ -297,18 +318,10 @@ public class CtrCntrlService { |
|
|
|
model.setCreateDt(warnLog.getCreateDt()); |
|
|
|
model.setCreateDt(warnLog.getCreateDt()); |
|
|
|
model.setCreateUserId(warnLog.getCreateUserId()); |
|
|
|
model.setCreateUserId(warnLog.getCreateUserId()); |
|
|
|
} |
|
|
|
} |
|
|
|
if(control != null) { |
|
|
|
|
|
|
|
model.setCntrlId(control.getCntrlId()); |
|
|
|
model.setCntrlId(control.getCntrlId()); |
|
|
|
model.setIdntfNum(control.getIdntfNum()); |
|
|
|
model.setIdntfNum(control.getIdntfNum()); |
|
|
|
model.setWarnCount(warnCount); |
|
|
|
model.setWarnCount(warnCount); |
|
|
|
|
|
|
|
|
|
|
|
result.add(model); |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
model.setCntrlId(hisControl.getCntrlId()); |
|
|
|
|
|
|
|
model.setIdntfNum(hisControl.getTrmnlId()); |
|
|
|
|
|
|
|
model.setWarnCount(warnCount); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result.add(model); |
|
|
|
result.add(model); |
|
|
|
} |
|
|
|
} |
|
|
|
return result; |
|
|
|
return result; |
|
|
@ -458,6 +471,70 @@ public class CtrCntrlService { |
|
|
|
return rs; |
|
|
|
return rs; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* TODO 임시)warnList 최적화 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param rq |
|
|
|
|
|
|
|
* @return |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public CtrCntrlPlanContainsRs checkSocketContains(CtrCntrlSocketContainsRq rq) { |
|
|
|
|
|
|
|
CtrCntrlPlanContainsRs rs = new CtrCntrlPlanContainsRs(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int countSuccess = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (rq.getIdntfNum() != null) { |
|
|
|
|
|
|
|
List<Coordinate> planArea = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(FltPlanAreaCoord coord : rq.getCoordList()) { |
|
|
|
|
|
|
|
Coordinate coordinate = new Coordinate(coord.getLon(), coord.getLat()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
planArea.add(coordinate); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 드론 위치
|
|
|
|
|
|
|
|
Coordinate targetCoord = new Coordinate(rq.getLon(), rq.getLat()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 1. 비행 구역에 벗어나면 모든 경우의 수는 비정상 상황으로 판단 |
|
|
|
|
|
|
|
* 2. 비정상 상황 TYPE(비행구역, 공역)에 따라 구분 (미적용) |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
boolean areaContains = true; |
|
|
|
|
|
|
|
// boolean airspaceContains = false;
|
|
|
|
|
|
|
|
switch(rq.getAreaType()) { |
|
|
|
|
|
|
|
case "LINE" : |
|
|
|
|
|
|
|
List<Coordinate> transPlanArea = areaUtils.transform(planArea, "EPSG:4326", "EPSG:5181"); |
|
|
|
|
|
|
|
List<Coordinate> planBuffer = areaUtils.buffer(transPlanArea, rq.getBufferZone()); |
|
|
|
|
|
|
|
List<Coordinate> transPlanBuffer = areaUtils.transform(planBuffer, "EPSG:5181", "EPSG:4326"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
areaContains = areaUtils.contains(transPlanBuffer, targetCoord); |
|
|
|
|
|
|
|
// log.info("LINE CONTAINS : {}", areaContains);
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "POLYGON" : |
|
|
|
|
|
|
|
planArea.add(planArea.get(0)); |
|
|
|
|
|
|
|
areaContains = areaUtils.contains(planArea, targetCoord); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case "CIRCLE" : |
|
|
|
|
|
|
|
List<Coordinate> circle = areaUtils.createCircle(planArea.get(0), rq.getBufferZone()); |
|
|
|
|
|
|
|
areaContains = areaUtils.contains(circle, targetCoord); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (areaContains) countSuccess++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 1개라도
|
|
|
|
|
|
|
|
if (countSuccess > 0) { |
|
|
|
|
|
|
|
rs.setWarning(false); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
rs.setWarning(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rs.setIdntfNum(rq.getIdntfNum()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return rs; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* TODO 비행 이력 Control-Id 발급 |
|
|
|
* TODO 비행 이력 Control-Id 발급 |
|
|
|