diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java index 9d5394f..9a2f77d 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/CtrCntrlController.java @@ -199,6 +199,12 @@ public class CtrCntrlController { return ResponseEntity.ok().body(new SuccessResponse(rs)); } + /** + * TODO 실시간 Control ID 발급 + * + * @param id + * @return + */ @GetMapping("/id/{id}") public ResponseEntity getId(@PathVariable String id) { Map result; @@ -212,6 +218,14 @@ public class CtrCntrlController { return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * TODO 비행 관제 기체의 비정상 상황 확인 + * + * @param id + * @param lat + * @param lon + * @return + */ @GetMapping("/warn/{id}/{lat}/{lon}") public ResponseEntity checkWarring(@PathVariable String id, @PathVariable Double lat, diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java index d881fc1..329c881 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java @@ -16,4 +16,6 @@ public class CtrCntrlArcrftWarnModel { private Integer warnCount; + private boolean controlWarnCd = false; + } diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java index 5e3ae8f..8701857 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/CtrCntrlService.java @@ -20,7 +20,7 @@ import com.palnet.comn.utils.AreaUtils; import com.palnet.comn.utils.DateUtils; import org.apache.commons.lang3.StringUtils; import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -178,9 +178,9 @@ public class CtrCntrlService { */ public List getWarnLog(String controlId) { List logs = warnLogRepository.findAllByCntrlId(controlId); - List warnLog = new ArrayList(); + List warnLog = new ArrayList<>(); - for(CtrCntrlWarnLog log : logs) { + for (CtrCntrlWarnLog log : logs) { CtrCntrlWarnLogModel model = new CtrCntrlWarnLogModel(); model.setCntrlId(log.getCntrlId()); @@ -190,40 +190,74 @@ public class CtrCntrlService { warnLog.add(model); } + return warnLog; } + /** + * TODO 기체 별 최신 비정상 로그 및 비정상 로그 전체 개수 + * @param id + * @return + */ + @Transactional public List getArcrftWarnList(String id) { Map map = new HashMap<>(); List result = new ArrayList<>(); - if("".equals(id) || id == null) return null; + if ("".equals(id) || id == null) return null; String[] ids = id.indexOf(",") > -1 ? id.split(",") : new String[] {id}; - for(String cntrlId : ids) { + for (String cntrlId : ids) { CtrCntrlArcrftWarnModel model = new CtrCntrlArcrftWarnModel(); CtrCntrlBas control = cntrlBasRepository.findById(cntrlId).orElse(null); - CtrCntrlWarnLog warnLog = warnLogRepository.findFirstByCntrlIdOrderByOccurDtDesc(cntrlId); - Integer warnCount = warnLogRepository.countByCntrlId(cntrlId); + CtrCntrlHstry hisControl = cntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(cntrlId).orElse(null); + + if (hisControl != null) { + List flightPlan = this.getFlightPlan(control.getIdntfNum()); + + if (flightPlan != null && !flightPlan.isEmpty()) { + CtrCntrlPlanContainsRq containsRq = new CtrCntrlPlanContainsRq(); + containsRq.setIdntfNum(control.getIdntfNum()); + containsRq.setLat(hisControl.getLat()); + containsRq.setLon(hisControl.getLon()); + containsRq.setPlanList(flightPlan); - if(control != null) { - if(warnLog != null) { - model.setWarnType(warnLog.getWarnType()); - model.setOccurDt(warnLog.getOccurDt()); - model.setCreateDt(warnLog.getCreateDt()); - model.setCreateUserId(warnLog.getCreateUserId()); + CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = this.checkPlanContains(containsRq); + model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); } + } - model.setCntrlId(control.getCntrlId()); - model.setIdntfNum(control.getIdntfNum()); - model.setWarnCount(warnCount); + if (model.isControlWarnCd()) { + CtrCntrlWarnLog log = new CtrCntrlWarnLog(); + + log.setCntrlId(control.getCntrlId()); + log.setIdntfNum(control.getIdntfNum()); + log.setOccurDt(hisControl.getSrvrRcvDt()); + log.setLat(hisControl.getLat()); + log.setLon(hisControl.getLon()); + log.setElev(hisControl.getElev()); + log.setCreateDt(DateUtils.nowDate()); + log.setWarnType("PLAN"); + warnLogRepository.save(log); + } + CtrCntrlWarnLog warnLog = warnLogRepository.findFirstByCntrlIdOrderByOccurDtDesc(cntrlId); + Integer warnCount = warnLogRepository.countByCntrlId(cntrlId); + + if (warnLog != null) { + model.setWarnType(warnLog.getWarnType()); + model.setOccurDt(warnLog.getOccurDt()); + model.setCreateDt(warnLog.getCreateDt()); + model.setCreateUserId(warnLog.getCreateUserId()); } + model.setCntrlId(control.getCntrlId()); + model.setIdntfNum(control.getIdntfNum()); + model.setWarnCount(warnCount); + result.add(model); -// map.put(cntrlId, model); } return result; @@ -244,10 +278,10 @@ public class CtrCntrlService { // 기체 식별 정보 조회 ComIdntfBas idntfBas = idntfRepository.findById(idntfNum).orElse(null); - if(idntfBas != null) { + if (idntfBas != null) { ComArcrftBas arcrftBas = arcrftRepository.findById(idntfBas.getArcrftSno()).orElse(null); - if(arcrftBas != null) { + if (arcrftBas != null) { // 비행 계획 기체 조회 List arcrftList = planArcrftRepository. findByIdntfNumAndArcrftSnoOrderByPlanArcrftSnoAsc(idntfNum, arcrftBas.getArcrftSno()); @@ -322,9 +356,9 @@ public class CtrCntrlService { int countSuccess = 0; - if(rq.getIdntfNum() != null) { - for(BasFlightPlanModel plan : rq.getPlanList()) { - for(BasFlightPlanAreaModel area : plan.getAreaList()) { + if (rq.getIdntfNum() != null) { + for (BasFlightPlanModel plan : rq.getPlanList()) { + for (BasFlightPlanAreaModel area : plan.getAreaList()) { List planArea = areaUtils.convertCoordinates(area.getCoordList()); // 드론 위치 @@ -336,33 +370,28 @@ public class CtrCntrlService { */ boolean areaContains = true; // boolean airspaceContains = false; - if("LINE".equals(area.getAreaType())) { + if ("LINE".equals(area.getAreaType())) { List transPlanArea = areaUtils.transform(planArea, "EPSG:4326", "EPSG:5181"); List planBuffer = areaUtils.buffer(transPlanArea, area.getBufferZone()); List transPlanBuffer = areaUtils.transform(planBuffer, "EPSG:5181", "EPSG:4326"); areaContains = areaUtils.contains(transPlanBuffer, targetCoord); - log.info("LINE CONTAINS : {}", areaContains); -// airspaceContains = areaUtils.contains(targetCoord); +// log.info("LINE CONTAINS : {}", areaContains); } - if("POLYGON".equals(area.getAreaType())) { + if ("POLYGON".equals(area.getAreaType())) { planArea.add(planArea.get(0)); areaContains = areaUtils.contains(planArea, targetCoord); -// airspaceContains = areaUtils.contains(targetCoord); } - if("CIRCLE".equals(area.getAreaType())) { + if ("CIRCLE".equals(area.getAreaType())) { List circle = areaUtils.createCircle(planArea.get(0), area.getBufferZone()); -// List transCircle = areaUtils.transform(circle, "EPSG:5181", "EPSG:4326"); - areaContains = areaUtils.contains(circle, targetCoord); -// airspaceContains = areaUtils.contains(targetCoord); + } -// if(areaContains || !airspaceContains) countSuccess++; - if(areaContains) countSuccess++; + if (areaContains) countSuccess++; } } } @@ -380,6 +409,12 @@ public class CtrCntrlService { } + /** + * TODO + * + * @param id + * @return + */ public Map getId(String id) { Map result = new HashMap<>(); @@ -389,14 +424,14 @@ public class CtrCntrlService { boolean isControl = false; - if(latestControl != null) { + if (latestControl != null) { CtrCntrlHstry latestHistory = cntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(latestControl.getCntrlId()).orElse(null); - if(latestHistory != null) { + if (latestHistory != null) { long diffMinute = DateUtils.diffMinute(latestHistory.getSrvrRcvDt(), new Date()); - log.info("DIFF MINUTE : {}", diffMinute); +// log.info("DIFF MINUTE : {}", diffMinute); - if("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) { + if ("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) { isControl = false; } if(!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) { @@ -410,7 +445,7 @@ public class CtrCntrlService { isControl = false; } - if(isControl) { + if (isControl) { result.put("controlId", latestControl.getCntrlId()); result.put("typeCd", "02"); result.put("areaTrnsYn", "E"); @@ -433,7 +468,7 @@ public class CtrCntrlService { List planList = this.getFlightPlan(id); result.put("controlWarnCd", "N"); - if(planList != null && !planList.isEmpty()) { + if (planList != null && !planList.isEmpty()) { CtrCntrlPlanContainsRq containsRq = new CtrCntrlPlanContainsRq(); containsRq.setIdntfNum(id); containsRq.setLat(lat); diff --git a/src/main/java/com/palnet/biz/config/WebSecurityConfig.java b/src/main/java/com/palnet/biz/config/WebSecurityConfig.java index f24a967..71e8336 100644 --- a/src/main/java/com/palnet/biz/config/WebSecurityConfig.java +++ b/src/main/java/com/palnet/biz/config/WebSecurityConfig.java @@ -38,7 +38,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final String[] PERMITTED_URL = { "/api/acnt/**", "/api/ctr/cntrl/id/**", - "/api/ctr/cntrl/warn/**", /* swagger v2 */ "/v2/api-docs", "/swagger-resources", diff --git a/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java b/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java index 1de43c0..c4faec3 100644 --- a/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java +++ b/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java @@ -113,36 +113,6 @@ public class MessageServiceImpl implements MessageService { shareContext.putIdntfKey(model.getObjectId(), controlID); } -// if(shareContext.getIndtfKey(model.getObjectId()) == null) { -// String controlID = UUID.randomUUID().toString(); -// -// model.setControlId(controlID); -// model.setTypeCd("01"); -// model.setAreaTrnsYn("N"); -// model.setControlStartDt(DateUtils.getCurrentTime()); -// -// // 기체 식별번호의 관제 ID 저장 (single ton) -// shareContext.putIdntfKey(model.getObjectId(), controlID); -// } else { -// model.setControlId(shareContext.getIndtfKey(model.getObjectId())); -// model.setTypeCd("02"); -// model.setAreaTrnsYn("E"); -// } - - // 비행구역 Contains Check -// List planList = ctrCntrlService.getFlightPlan(model.getObjectId()); -// -// if(planList != null && !planList.isEmpty()) { -// CtrCntrlPlanContainsRq containsRq = new CtrCntrlPlanContainsRq(); -// containsRq.setIdntfNum(model.getObjectId()); -// containsRq.setLat(model.getLat()); -// containsRq.setLon(model.getLng()); -// containsRq.setPlanList(planList); -// -// CtrCntrlPlanContainsRs ctrCntrlPlanContainsRs = ctrCntrlService.checkPlanContains(containsRq); -// model.setControlWarnCd(ctrCntrlPlanContainsRs.isWarning()); -// } - return model; } @@ -167,22 +137,6 @@ public class MessageServiceImpl implements MessageService { if(model.getTypeCd().equals("01") || model.getTypeCd().equals("99")) { ctrCntrlJpaService.insertCtrCntrlHstryArea(dbModel, ctrCntrlHstry.getHstrySno()); } - - // 비정상 상황 로그 데이터 생성 - if(model.isControlWarnCd()) { - CtrCntrlWarnLog log = new CtrCntrlWarnLog(); - - log.setCntrlId(model.getControlId()); - log.setIdntfNum(model.getObjectId()); - log.setOccurDt(DateUtils.stringToDatetime(model.getServerRcvDt())); - log.setLat(model.getLat()); - log.setLon(model.getLng()); - log.setElev(model.getElev()); - log.setCreateDt(DateUtils.nowDate()); - log.setWarnType("PLAN"); - - warnLogRepository.save(log); - } } @Override