Browse Source

feat: kac-app <-> socket 통신

- search control id
- send and save drone data
feature/socket
지대한 7 months ago
parent
commit
2d9588eacf
  1. 3
      app/kac-app/build.gradle
  2. 8
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java
  3. 87
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java
  4. 1
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java
  5. 10
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java
  6. 1
      data/com/build.gradle
  7. 4
      data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComArcrftBasRepository.java
  8. 8
      data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java
  9. 4
      data/flt/src/main/java/kr/co/palnet/kac/data/flt/model/FltPlanCtrCntrlRel.java
  10. 12
      data/flt/src/main/java/kr/co/palnet/kac/data/flt/repository/FltPlanBasRepository.java

3
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")
}

8
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<SimpleControlDto> getControlId(String objectId) {
@GetMapping("/control/{objectId}")
public ResponseEntity<SimpleControlDto> getControlId(@PathVariable String objectId) {
log.debug(">>>>> getControlId <<<<<");
log.debug(">>>>> objectId : {} <<<<<", objectId);
SimpleControlDto simpleControlDto = innerSocketService.getControlId(objectId);

87
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> 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);
}
}
}
/**

1
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/**",
};

10
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<SimpleControlDto> resp = client.get()
.uri(uriString)
.uri(GET_CONTROL_ID + "/" + objectId)
.retrieve()
.toEntity(SimpleControlDto.class);

1
data/com/build.gradle

@ -8,6 +8,7 @@ dependencies {
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
implementation project(":common:config-db")
testRuntimeOnly "com.h2database:h2"
}

4
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<ComArcrftBas, Integer> {
public interface ComArcrftBasRepository extends JpaRepository<ComArcrftBas, Long> {
}

8
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<ComIdntfBas, ComIdntfBas.ComIdntfBasId> {
}

4
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)

12
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<FltPlanBas, Integer> {
import java.time.Instant;
import java.util.List;
public interface FltPlanBasRepository extends JpaRepository<FltPlanBas, Long> {
@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<FltPlanBas> findAllByServerRctDtAndIdntfNum(@Param("idntfNum") String idntfNum, @Param("serverRcvDt") Instant serverRcvDt);
}

Loading…
Cancel
Save