diff --git a/app/kac-app/build.gradle b/app/kac-app/build.gradle index d73864c..a683513 100644 --- a/app/kac-app/build.gradle +++ b/app/kac-app/build.gradle @@ -41,10 +41,11 @@ dependencies { implementation project(":web:security") implementation project(":web:api-common") implementation project(":data:ctr") + implementation project(":data:com") + implementation project(":data:flt") // implementation project(":data:cns") // implementation project(":data:com") -// implementation project(":data:flt") // implementation project(":data:other") // implementation project(":data:pty") } diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java index 897b823..a206c34 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java @@ -6,10 +6,7 @@ import kr.co.palnet.kac.common.model.common.SimpleControlDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @Slf4j @RequiredArgsConstructor @@ -20,7 +17,8 @@ public class InnerSocketController { private final InnerSocketService innerSocketService; // dorn의 control 조회 - public ResponseEntity getControlId(String objectId) { + @GetMapping("/control/{objectId}") + public ResponseEntity getControlId(@PathVariable String objectId) { log.debug(">>>>> getControlId <<<<<"); log.debug(">>>>> objectId : {} <<<<<", objectId); SimpleControlDto simpleControlDto = innerSocketService.getControlId(objectId); diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java index d5f46b9..16a38c9 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java @@ -3,12 +3,21 @@ package kr.co.palnet.kac.app.api.v1.inner.socket.service; import kr.co.palnet.kac.app.api.v1.inner.socket.storage.ControlGpsStorage; import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; +import kr.co.palnet.kac.core.exception.BaseErrorCode; +import kr.co.palnet.kac.data.com.domain.ComArcrftBas; +import kr.co.palnet.kac.data.com.domain.ComIdntfBas; +import kr.co.palnet.kac.data.com.repository.ComArcrftBasRepository; +import kr.co.palnet.kac.data.com.repository.ComIdntBasRepository; import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry; import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstryArea; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlBasRepository; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryAreaRepository; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryRepository; +import kr.co.palnet.kac.data.flt.model.FltPlanBas; +import kr.co.palnet.kac.data.flt.model.FltPlanCtrCntrlRel; +import kr.co.palnet.kac.data.flt.repository.FltPlanBasRepository; +import kr.co.palnet.kac.data.flt.repository.FltPlanCtrCntrlRelRepository; import kr.co.palnet.kac.util.CoordUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -24,14 +33,20 @@ import java.util.*; @Service @Transactional public class InnerSocketService { + private final FltPlanBasRepository fltPlanBasRepository; private final CtrCntrlBasRepository ctrCntrlBasRepository; private final CtrCntrlHstryRepository ctrCntrlHstryRepository; private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository; + private final ComArcrftBasRepository comArcrftBasRepository; + private final ComIdntBasRepository comIdntBasRepository; + private final FltPlanCtrCntrlRelRepository fltPlanCtrCntrlRelRepository; + private long STOP_UNKON = 5; // socket에 보내줄 control 조회 (controlId 발급용도) + @Transactional(readOnly = true) public SimpleControlDto getControlId(String objectId) { log.debug(">>>>> getControlId <<<<<"); log.debug(">>>>> objectId : {} <<<<<", objectId); @@ -78,8 +93,76 @@ public class InnerSocketService { } // socket으로부터 받은 dron 정보 저장 - public void setDronData(DroneDto dronDto) { - // TODO + public void setDronData(DroneDto droneDto) { + + if ("01".equals(droneDto.getTypeCd())) { + // 비행 이력 생성 + CtrCntrlBas ctrCntrlBas = ctrCntrlBasRepository.findById(droneDto.getControlId()).orElse(null); + if (ctrCntrlBas != null) { + log.debug(BaseErrorCode.DATA_ALREADY_EXISTS.message()); + ctrCntrlBas = null; + } else { + CtrCntrlBas insertCtrCntrlBas = CtrCntrlBas.builder() + .cntrlId(droneDto.getControlId()) + .idntfNum(droneDto.getObjectId()) + .objectTypeCd(droneDto.getObjectType()) + .statusCd(droneDto.getTypeCd()) + .procStatusYn("N") + .cntrlStDt(droneDto.getControlStartDt()) + .createDt(Instant.now()) + .updateDt(Instant.now()) + .build(); + + ctrCntrlBas = ctrCntrlBasRepository.save(insertCtrCntrlBas); + } + + + // 비행 이력, 비행 계획서 mapping + if (!"PA".equals(droneDto.getObjectId().substring(0, 2))) return; + + FltPlanCtrCntrlRel fltPlanCtrCntrlRel = new FltPlanCtrCntrlRel(); + + // 1. 식별 번호의 소유자 정보 저장. + ComIdntfBas comIdntfBas = comIdntBasRepository.findById(droneDto.getObjectId()).orElse(null); + + // 1-1. 식별 번호의 모델 정보 조회 + // PAV-KAC에서는 기초데이터가 필수가 아니여서 idntBas가 null일 수 있음. + ComArcrftBas comArcrftBas = null; + if (comIdntfBas != null && comIdntfBas.getArcrftSno() != null) { + comArcrftBas = comArcrftBasRepository.findById(comIdntfBas.getArcrftSno()).orElse(null); + } + + if (ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()) { + fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); + } + + if (ctrCntrlBas.getIdntfNum() != null && !ctrCntrlBas.getIdntfNum().isEmpty()) { + fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); + } + + if (comIdntfBas != null && comIdntfBas.getCstmrSno() != null) { + fltPlanCtrCntrlRel.setIdntfCstmrSno(comIdntfBas.getCstmrSno()); + } + + if (comArcrftBas != null && comArcrftBas.getGroupId() != null && !comArcrftBas.getGroupId().isEmpty()) { + fltPlanCtrCntrlRel.setGroupId(comArcrftBas.getGroupId()); + } + + // 2. 해당 되는 비행계획서 정보 저장. + List fltPlanBas = null; + if (ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()) { + fltPlanBas = fltPlanBasRepository.findAllByServerRctDtAndIdntfNum(ctrCntrlBas.getIdntfNum(), droneDto.getServerRcvDt()); + for (FltPlanBas plan : fltPlanBas) { + fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno()); + } + } + + + // 3. mapping 정보 주입. + if (fltPlanCtrCntrlRel.getCntrlId() != null && !fltPlanCtrCntrlRel.getCntrlId().isEmpty() && fltPlanCtrCntrlRel.getPlanSno() != null) { + fltPlanCtrCntrlRelRepository.save(fltPlanCtrCntrlRel); + } + } } /** diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java index 48e8893..206bf81 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java @@ -26,6 +26,7 @@ public class AppSecurityConfig extends SecurityConfig { // 시큐리티 적용 안하는 URL 목록 private final String[] IGNORE_URL = { + "/v1/inner/socket/**", "/v1/com/code/**", }; diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java index 6061c71..15a47b6 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java @@ -18,19 +18,15 @@ public class KacAppService { @Value("${app.kac-app.host}") private String kacAppHost; - private final String GET_CONTROL_ID = "/api/ctr/cntrl/id"; - private final String SEND_ALL = "/api/server/receiver/all"; + private final String GET_CONTROL_ID = "/v1/inner/socket/control"; + private final String SEND_ALL = "/v1/inner/socket/receiver/dron"; // control id 가져오기 public SimpleControlDto getControlId(String objectId) { RestClient client = getRestClient(); - String uriString = UriComponentsBuilder.fromPath(GET_CONTROL_ID) - .queryParam("objectId", objectId) - .build().toUriString(); - ResponseEntity resp = client.get() - .uri(uriString) + .uri(GET_CONTROL_ID + "/" + objectId) .retrieve() .toEntity(SimpleControlDto.class); diff --git a/data/com/build.gradle b/data/com/build.gradle index 200b0e8..72625fc 100644 --- a/data/com/build.gradle +++ b/data/com/build.gradle @@ -8,6 +8,7 @@ dependencies { annotationProcessor "jakarta.persistence:jakarta.persistence-api" implementation project(":common:config-db") + testRuntimeOnly "com.h2database:h2" } diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComArcrftBasRepository.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComArcrftBasRepository.java index c842153..e5a3a23 100644 --- a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComArcrftBasRepository.java +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComArcrftBasRepository.java @@ -3,5 +3,7 @@ package kr.co.palnet.kac.data.com.repository; import kr.co.palnet.kac.data.com.domain.ComArcrftBas; import org.springframework.data.jpa.repository.JpaRepository; -public interface ComArcrftBasRepository extends JpaRepository { +public interface ComArcrftBasRepository extends JpaRepository { + + } diff --git a/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java new file mode 100644 index 0000000..73bd842 --- /dev/null +++ b/data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java @@ -0,0 +1,8 @@ +package kr.co.palnet.kac.data.com.repository; + +import kr.co.palnet.kac.data.com.domain.ComIdntfBas; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ComIdntfBasRepository extends JpaRepository { + +} diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanCtrCntrlRel.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanCtrCntrlRel.java index a8f7e8d..0775f67 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanCtrCntrlRel.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanCtrCntrlRel.java @@ -21,7 +21,7 @@ public class FltPlanCtrCntrlRel { @Builder public static class FltPlanCtrCntrlRelId implements Serializable { private String cntrlId; - private Integer planSno; + private Long planSno; } // 관제ID @@ -32,7 +32,7 @@ public class FltPlanCtrCntrlRel { // 비행계획서일련번호 @Id @Column(name = "PLAN_SNO") // mysql :: "int unsigned" - private Integer planSno; + private Long planSno; // 식별번호 @Column(name = "IDNTF_NUM", length = 30, nullable = false) diff --git a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java index c467230..cf31659 100644 --- a/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java +++ b/data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java @@ -2,7 +2,17 @@ package kr.co.palnet.kac.data.flt.repository; import kr.co.palnet.kac.data.flt.model.FltPlanBas; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; -public interface FltPlanBasRepository extends JpaRepository { +import java.time.Instant; +import java.util.List; +public interface FltPlanBasRepository extends JpaRepository { + + @Query(""" + select distinct f from FltPlanBas f left join f.fltPlanArcrftList fltPlanArcrftList + where f.schFltStDt <= :serverRcvDt and f.schFltEndDt >= :serverRcvDt and fltPlanArcrftList.idntfNum = :idntfNum + """) + List findAllByServerRctDtAndIdntfNum(@Param("idntfNum") String idntfNum, @Param("serverRcvDt") Instant serverRcvDt); }