Compare commits
7 Commits
master
...
feature/re
Author | SHA1 | Date |
---|---|---|
지대한 | 683ae23396 | 2 months ago |
지대한 | 6ebc9a7e08 | 1 year ago |
지대한 | b0ebcb1d8c | 1 year ago |
지대한 | b2c8df5ae9 | 1 year ago |
지대한 | 13ae901633 | 1 year ago |
지대한 | 02e3fe5ca2 | 1 year ago |
지대한 | 4fcd911176 | 1 year ago |
15 changed files with 194 additions and 395 deletions
@ -0,0 +1,58 @@ |
|||||||
|
package com.palnet.biz.api.ctr.cntrl.controller; |
||||||
|
|
||||||
|
import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlModel; |
||||||
|
import com.palnet.biz.api.ctr.cntrl.service.SocketReceiverService; |
||||||
|
import com.palnet.comn.model.GPModel; |
||||||
|
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 java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.concurrent.Callable; |
||||||
|
|
||||||
|
/** |
||||||
|
* packageName : com.palnet.biz.api.ctr.cntrl.controller |
||||||
|
* fileName : SocketReciverController |
||||||
|
* author : dhji |
||||||
|
* date : 2023-08-29(029) |
||||||
|
* description : |
||||||
|
* =========================================================== |
||||||
|
* DATE AUTHOR NOTE |
||||||
|
* ----------------------------------------------------------- |
||||||
|
* 2023-08-29(029) dhji 최초 생성 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
|
@RestController |
||||||
|
@RequestMapping("/api/server") |
||||||
|
public class SocketReceiverController { |
||||||
|
|
||||||
|
private final SocketReceiverService socketReceiverService; |
||||||
|
@PostMapping("/receiver") |
||||||
|
public ResponseEntity<?> receiver(@RequestBody GPModel model) { |
||||||
|
System.out.println("socket message : " + model); |
||||||
|
socketReceiverService.insert(model); |
||||||
|
return ResponseEntity.ok().build(); |
||||||
|
} |
||||||
|
|
||||||
|
@PostMapping("/receiver/async") |
||||||
|
public Callable<String> asyncReceiver(@RequestBody GPModel model) { |
||||||
|
return () -> { |
||||||
|
log.info("websocket message : {}", model); |
||||||
|
socketReceiverService.insert(model); |
||||||
|
return "OK"; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@PostMapping("/receiver/all") |
||||||
|
public ResponseEntity<?> receiver(@RequestBody Map<String, List<GPModel>> models) { |
||||||
|
// System.out.println("socket message : " + models);
|
||||||
|
socketReceiverService.insertAll(models); |
||||||
|
return ResponseEntity.ok().build(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
package com.palnet.biz.api.ctr.cntrl.service; |
||||||
|
|
||||||
|
import com.palnet.biz.jpa.entity.*; |
||||||
|
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository; |
||||||
|
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository; |
||||||
|
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; |
||||||
|
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; |
||||||
|
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository; |
||||||
|
import com.palnet.biz.jpa.service.ctr.CtrCntrlJpaService; |
||||||
|
import com.palnet.comn.model.GPDatabaseModel; |
||||||
|
import com.palnet.comn.model.GPModel; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
import org.springframework.util.StopWatch; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* packageName : com.palnet.biz.api.ctr.cntrl.service |
||||||
|
* fileName : SocketReciverService |
||||||
|
* author : dhji |
||||||
|
* date : 2023-08-29(029) |
||||||
|
* description : |
||||||
|
* =========================================================== |
||||||
|
* DATE AUTHOR NOTE |
||||||
|
* ----------------------------------------------------------- |
||||||
|
* 2023-08-29(029) dhji 최초 생성 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
|
@Service |
||||||
|
public class SocketReceiverService { |
||||||
|
|
||||||
|
private final CtrCntrlJpaService ctrCntrlJpaService; |
||||||
|
private final PtyDronQueryRepository ptyDronQueryRepository; |
||||||
|
private final ComArcrftBasRepository arcrftBasRepository; |
||||||
|
private final ComIdntBasRepository idntBasRepository; |
||||||
|
private final FltPlanQueryRepository fltPlanQueryRepository; |
||||||
|
private final FltPlanCtrCntrlRelRepository ctrCntrlRelRepository; |
||||||
|
|
||||||
|
@Transactional |
||||||
|
public void insert(GPModel model) { |
||||||
|
GPDatabaseModel dbModel = new GPDatabaseModel(); |
||||||
|
BeanUtils.copyProperties(model, dbModel); |
||||||
|
|
||||||
|
if ("01".equals(model.getTypeCd())) { |
||||||
|
String prodNumber = ptyDronQueryRepository.findIdntfNumByProdNumber(model.getObjectId()); |
||||||
|
dbModel.setProdNumber(prodNumber); |
||||||
|
|
||||||
|
// 비행 이력 생성
|
||||||
|
CtrCntrlBas ctrCntrlBas = ctrCntrlJpaService.insertCtrCntrlBas(dbModel); |
||||||
|
|
||||||
|
// 비행 이력, 비행 계획서 mapping
|
||||||
|
if ("PA".equals(model.getObjectId().substring(0, 2))) { |
||||||
|
FltPlanCtrCntrlRel fltPlanCtrCntrlRel = new FltPlanCtrCntrlRel(); |
||||||
|
|
||||||
|
// 1. 식별 번호의 소유자 정보 저장.
|
||||||
|
ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null); |
||||||
|
|
||||||
|
// 1-1. 식별 번호의 모델 정보 조회
|
||||||
|
ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); |
||||||
|
|
||||||
|
if (idntfBas != null && arcrftBas != null) { |
||||||
|
fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); |
||||||
|
fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); |
||||||
|
fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno()); |
||||||
|
fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId()); |
||||||
|
} |
||||||
|
|
||||||
|
// 2. 해당 되는 비행계획서 정보 저장.
|
||||||
|
List<FltPlanBas> planArcrft = |
||||||
|
fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); |
||||||
|
|
||||||
|
if (!planArcrft.isEmpty()) { |
||||||
|
for (FltPlanBas plan : planArcrft) { |
||||||
|
fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 3. mapping 정보 주입.
|
||||||
|
if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) { |
||||||
|
ctrCntrlRelRepository.save(fltPlanCtrCntrlRel); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Drone인 경우에만 history 생성
|
||||||
|
CtrCntrlHstry ctrCntrlHstry = ctrCntrlJpaService.insertCtrCntrlHstry(dbModel); |
||||||
|
|
||||||
|
if ("01".equals(model.getTypeCd()) || "99".equals(model.getTypeCd())) { |
||||||
|
ctrCntrlJpaService.insertCtrCntrlHstryArea(dbModel, ctrCntrlHstry.getHstrySno()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Transactional |
||||||
|
public void insertAll(Map<String, List<GPModel>> models) { |
||||||
|
// TODO 일괄 처리 필요
|
||||||
|
log.info(">>> models :: {}", models.size()); |
||||||
|
StopWatch stopWatch = new StopWatch(); |
||||||
|
stopWatch.start(); |
||||||
|
for (String key : models.keySet()) { |
||||||
|
List<GPModel> list = models.get(key); |
||||||
|
log.info(">>> models size :: {}", list.size()); |
||||||
|
for (GPModel model : list) { |
||||||
|
log.info(">> model: {}", model); |
||||||
|
this.insert(model); |
||||||
|
} |
||||||
|
} |
||||||
|
stopWatch.stop(); |
||||||
|
log.info(">>> insertAll time : {}", stopWatch.getTotalTimeSeconds()); |
||||||
|
} |
||||||
|
} |
@ -1,86 +0,0 @@ |
|||||||
package com.palnet.biz.config; |
|
||||||
|
|
||||||
import com.rabbitmq.client.ShutdownSignalException; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.amqp.core.*; |
|
||||||
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; |
|
||||||
import org.springframework.amqp.rabbit.connection.Connection; |
|
||||||
import org.springframework.amqp.rabbit.connection.ConnectionFactory; |
|
||||||
import org.springframework.amqp.rabbit.connection.ConnectionListener; |
|
||||||
import org.springframework.amqp.rabbit.core.RabbitTemplate; |
|
||||||
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; |
|
||||||
import org.springframework.context.annotation.Bean; |
|
||||||
import org.springframework.context.annotation.Configuration; |
|
||||||
import org.springframework.core.env.Environment; |
|
||||||
|
|
||||||
@Configuration |
|
||||||
@Slf4j |
|
||||||
public class MessageConfig { |
|
||||||
private final Environment env; |
|
||||||
|
|
||||||
public MessageConfig(Environment env) { |
|
||||||
this.env = env; |
|
||||||
} |
|
||||||
|
|
||||||
// @Bean
|
|
||||||
// public CachingConnectionFactory cachingConnectionFactory() {
|
|
||||||
// CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
|
|
||||||
//
|
|
||||||
// connectionFactory.setHost(env.getProperty("spring.rabbitmq.host"));
|
|
||||||
// connectionFactory.setPort(Integer.parseInt(env.getProperty("spring.rabbitmq.port")));
|
|
||||||
// connectionFactory.setUsername(env.getProperty("spring.rabbitmq.username"));
|
|
||||||
// connectionFactory.setPassword(env.getProperty("spring.rabbitmq.password"));
|
|
||||||
//
|
|
||||||
// return connectionFactory;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Bean |
|
||||||
public Jackson2JsonMessageConverter converter() { |
|
||||||
return new Jackson2JsonMessageConverter(); |
|
||||||
} |
|
||||||
|
|
||||||
// @Bean
|
|
||||||
// public DirectExchange appDroneExchange() {
|
|
||||||
// return new DirectExchange(env.getProperty("message.app.exchange-name"));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Bean
|
|
||||||
// public DirectExchange websocketDroneExchange() {
|
|
||||||
// return new DirectExchange(env.getProperty("message.websocket.exchange-name"));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Bean
|
|
||||||
// public Queue appDroneQueue() {
|
|
||||||
// return new Queue(env.getProperty("message.app.queue-name"), false);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Bean
|
|
||||||
// public Queue websocketDroneQueue() {
|
|
||||||
// return new Queue(env.getProperty("message.websocket.queue-name"), false);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Bean
|
|
||||||
// public Binding appDroneBinding(Queue appDroneQueue, DirectExchange appDroneExchange) {
|
|
||||||
// return BindingBuilder.bind(appDroneQueue)
|
|
||||||
// .to(appDroneExchange)
|
|
||||||
// .with(env.getProperty("message.app.routing-key"));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Bean
|
|
||||||
// public Binding websocketDroneBinding(Queue websocketDroneQueue, DirectExchange websocketDroneExchange) {
|
|
||||||
// return BindingBuilder.bind(websocketDroneQueue)
|
|
||||||
// .to(websocketDroneExchange)
|
|
||||||
// .with(env.getProperty("message.websocket.routing-key"));
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Bean |
|
||||||
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) { |
|
||||||
RabbitTemplate rabbitTemplate = new RabbitTemplate(); |
|
||||||
|
|
||||||
rabbitTemplate.setConnectionFactory(connectionFactory); |
|
||||||
rabbitTemplate.setMessageConverter(converter); |
|
||||||
|
|
||||||
return rabbitTemplate; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,22 +0,0 @@ |
|||||||
package com.palnet.biz.message; |
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.stereotype.Component; |
|
||||||
|
|
||||||
import java.util.concurrent.CountDownLatch; |
|
||||||
|
|
||||||
@Component |
|
||||||
@Slf4j |
|
||||||
public class Receiver { |
|
||||||
|
|
||||||
private CountDownLatch latch = new CountDownLatch(1); |
|
||||||
|
|
||||||
public void receiveMessage(String message) { |
|
||||||
log.info("Received <" + message); |
|
||||||
latch.countDown(); |
|
||||||
} |
|
||||||
|
|
||||||
public CountDownLatch getLatch() { |
|
||||||
return latch; |
|
||||||
} |
|
||||||
} |
|
@ -1,53 +0,0 @@ |
|||||||
package com.palnet.biz.message.consumer; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
|
||||||
import com.palnet.biz.message.service.MessageService; |
|
||||||
import com.palnet.comn.model.GPModel; |
|
||||||
import com.palnet.comn.utils.JsonUtils; |
|
||||||
import com.rabbitmq.client.Channel; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitHandler; |
|
||||||
import org.springframework.amqp.rabbit.annotation.RabbitListener; |
|
||||||
import org.springframework.amqp.support.AmqpHeaders; |
|
||||||
import org.springframework.messaging.handler.annotation.Header; |
|
||||||
import org.springframework.stereotype.Component; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
@Component |
|
||||||
@Slf4j |
|
||||||
public class MessageConsumer { |
|
||||||
|
|
||||||
private final MessageService messageService; |
|
||||||
private final ObjectMapper objectMapper; |
|
||||||
|
|
||||||
public MessageConsumer(MessageService messageService) { |
|
||||||
this.messageService = messageService; |
|
||||||
this.objectMapper = JsonUtils.getObjectMapper(); |
|
||||||
} |
|
||||||
|
|
||||||
@RabbitHandler |
|
||||||
@RabbitListener(queues = {"app.drone.queue"}) |
|
||||||
public void receivedDroneMessage(final String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException { |
|
||||||
try { |
|
||||||
GPModel model = objectMapper.readValue(message, GPModel.class); |
|
||||||
|
|
||||||
messageService.insert(model); // GPS 정보 DB 동기화 처리
|
|
||||||
|
|
||||||
/* channel.queueDeclare(message, true, false, false, null); rabbitMQ 서버 강제 종료 등 Queue가 유실되는 것을 방지하기 위해 disk에 Queue를 적재 ( Queue 영속성 ) |
|
||||||
-> 이 옵션 설정시 Queue의 유실은 방지할 수 있으나 Consumer Ack의 응답률이 절반으로 떨어지게 되고 , Unacked -> Ready로 되돌아가는 Queue가 생김 */ |
|
||||||
// channel.basicConsume(message, true, null);
|
|
||||||
|
|
||||||
channel.basicAck(tag, true); // channel 유지를 위해 Consumer -> Producer로 수신 확인 신호를 자동으로 전송
|
|
||||||
|
|
||||||
// channel.exchangeDeclare(message, "direct", true); Queue Exchange 방식 지정(binding 안되어있으면 설정)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (RuntimeException e) { |
|
||||||
channel.basicReject(tag, false); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,13 +0,0 @@ |
|||||||
package com.palnet.biz.message.service; |
|
||||||
|
|
||||||
import com.palnet.comn.model.GPModel; |
|
||||||
|
|
||||||
public interface MessageService { |
|
||||||
|
|
||||||
GPModel mapper(GPModel model); |
|
||||||
|
|
||||||
void insert(GPModel model); |
|
||||||
|
|
||||||
void sendToMessage(GPModel model); |
|
||||||
|
|
||||||
} |
|
@ -1,203 +0,0 @@ |
|||||||
package com.palnet.biz.message.service.impl; |
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException; |
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper; |
|
||||||
|
|
||||||
import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel; |
|
||||||
import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel; |
|
||||||
import com.palnet.biz.jpa.entity.*; |
|
||||||
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository; |
|
||||||
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository; |
|
||||||
import com.palnet.biz.jpa.repository.ctr.CtrCntrlBasRepository; |
|
||||||
import com.palnet.biz.jpa.repository.ctr.CtrCntrlHstryRepository; |
|
||||||
import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository; |
|
||||||
import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository; |
|
||||||
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; |
|
||||||
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; |
|
||||||
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository; |
|
||||||
import com.palnet.biz.jpa.service.ctr.CtrCntrlJpaService; |
|
||||||
import com.palnet.biz.api.comn.model.ControlGpsDataContext; |
|
||||||
import com.palnet.biz.message.service.MessageService; |
|
||||||
import com.palnet.comn.model.GPDatabaseModel; |
|
||||||
import com.palnet.comn.model.GPModel; |
|
||||||
import com.palnet.comn.utils.DateUtils; |
|
||||||
import com.palnet.comn.utils.JsonUtils; |
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
import org.springframework.amqp.rabbit.core.RabbitTemplate; |
|
||||||
import org.springframework.beans.BeanUtils; |
|
||||||
import org.springframework.core.env.Environment; |
|
||||||
import org.springframework.scheduling.annotation.Async; |
|
||||||
import org.springframework.stereotype.Service; |
|
||||||
import org.springframework.transaction.annotation.Transactional; |
|
||||||
|
|
||||||
import java.util.*; |
|
||||||
|
|
||||||
@Service |
|
||||||
@Slf4j |
|
||||||
public class MessageServiceImpl implements MessageService { |
|
||||||
|
|
||||||
private final CtrCntrlJpaService ctrCntrlJpaService; |
|
||||||
private final CtrCntrlBasRepository ctrCntrlBasRepository; |
|
||||||
private final CtrCntrlHstryRepository ctrCntrlHstryRepository; |
|
||||||
private final PtyDronQueryRepository ptyDronQueryRepository; |
|
||||||
private final ComArcrftBasRepository arcrftBasRepository; |
|
||||||
private final ComIdntBasRepository idntBasRepository; |
|
||||||
private final FltPlanQueryRepository fltPlanQueryRepository; |
|
||||||
private final FltPlanCtrCntrlRelRepository ctrCntrlRelRepository; |
|
||||||
private final ControlGpsDataContext shareContext; |
|
||||||
private final RabbitTemplate rabbitTemplate; |
|
||||||
private final Environment env; |
|
||||||
private final ObjectMapper objectMapper; |
|
||||||
|
|
||||||
public MessageServiceImpl(CtrCntrlJpaService ctrCntrlJpaService, |
|
||||||
CtrCntrlBasRepository ctrCntrlBasRepository, |
|
||||||
CtrCntrlHstryRepository ctrCntrlHstryRepository, |
|
||||||
PtyDronQueryRepository ptyDronQueryRepository, |
|
||||||
ComArcrftBasRepository arcrftBasRepository, |
|
||||||
ComIdntBasRepository idntBasRepository, |
|
||||||
FltPlanQueryRepository fltPlanQueryRepository, |
|
||||||
FltPlanCtrCntrlRelRepository ctrCntrlRelRepository, |
|
||||||
ControlGpsDataContext shareContext, |
|
||||||
RabbitTemplate rabbitTemplate, |
|
||||||
Environment env |
|
||||||
) { |
|
||||||
this.ctrCntrlJpaService = ctrCntrlJpaService; |
|
||||||
this.ctrCntrlBasRepository = ctrCntrlBasRepository; |
|
||||||
this.ctrCntrlHstryRepository = ctrCntrlHstryRepository; |
|
||||||
this.ptyDronQueryRepository = ptyDronQueryRepository; |
|
||||||
this.arcrftBasRepository = arcrftBasRepository; |
|
||||||
this.idntBasRepository = idntBasRepository; |
|
||||||
this.fltPlanQueryRepository = fltPlanQueryRepository; |
|
||||||
this.ctrCntrlRelRepository = ctrCntrlRelRepository; |
|
||||||
this.shareContext = shareContext; |
|
||||||
this.rabbitTemplate = rabbitTemplate; |
|
||||||
this.env = env; |
|
||||||
this.objectMapper = JsonUtils.getObjectMapper(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* TODO Control-Id Mapping |
|
||||||
* |
|
||||||
* @param model |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
@Transactional(readOnly = true) |
|
||||||
public GPModel mapper(GPModel model) { |
|
||||||
/* 식별번호의 가장 최근 이력 불러오기 */ |
|
||||||
CtrCntrlBas latestControl = ctrCntrlBasRepository.findFirstByIdntfNumOrderByCreateDtDesc(model.getObjectId()).orElse(null); |
|
||||||
|
|
||||||
boolean isControl = false; |
|
||||||
if(latestControl != null) { |
|
||||||
CtrCntrlHstry latestHistory = ctrCntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(latestControl.getCntrlId()).orElse(null); |
|
||||||
long diffMinute = DateUtils.diffMinute(latestHistory.getSrvrRcvDt(), new Date()); |
|
||||||
log.info("DIFF MINUTE : {}", diffMinute); |
|
||||||
|
|
||||||
if("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) { |
|
||||||
isControl = false; |
|
||||||
} |
|
||||||
if(!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) { |
|
||||||
isControl = true; |
|
||||||
} |
|
||||||
} else { |
|
||||||
isControl = false; |
|
||||||
} |
|
||||||
|
|
||||||
if(isControl) { |
|
||||||
model.setControlId(latestControl.getCntrlId()); |
|
||||||
model.setTypeCd("02"); |
|
||||||
model.setAreaTrnsYn("E"); |
|
||||||
} else { |
|
||||||
String controlID = UUID.randomUUID().toString(); |
|
||||||
|
|
||||||
model.setControlId(controlID); |
|
||||||
model.setTypeCd("01"); |
|
||||||
model.setAreaTrnsYn("N"); |
|
||||||
model.setControlStartDt(DateUtils.getCurrentTime()); |
|
||||||
} |
|
||||||
|
|
||||||
// 기체 식별번호의 관제 ID 저장
|
|
||||||
shareContext.putIdntfKey(model.getObjectId(), model.getControlId()); |
|
||||||
|
|
||||||
return model; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* TODO 비행 이력 생성 |
|
||||||
* |
|
||||||
* @param model |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
@Transactional |
|
||||||
public void insert(GPModel model) { |
|
||||||
GPDatabaseModel dbModel = new GPDatabaseModel(); |
|
||||||
BeanUtils.copyProperties(model, dbModel); |
|
||||||
|
|
||||||
if(model.getTypeCd().equals("01")) { |
|
||||||
String prodNumber = ptyDronQueryRepository.findIdntfNumByProdNumber(model.getObjectId()); |
|
||||||
dbModel.setProdNumber(prodNumber); |
|
||||||
|
|
||||||
// 비행 이력 생성
|
|
||||||
CtrCntrlBas ctrCntrlBas = ctrCntrlJpaService.insertCtrCntrlBas(dbModel); |
|
||||||
|
|
||||||
// 비행 이력, 비행 계획서 mapping
|
|
||||||
if ("PA".equals(model.getObjectId().substring(0,2))) { |
|
||||||
FltPlanCtrCntrlRel fltPlanCtrCntrlRel = new FltPlanCtrCntrlRel(); |
|
||||||
|
|
||||||
// 1. 식별 번호의 소유자 정보 저장.
|
|
||||||
ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null); |
|
||||||
|
|
||||||
// 1-1. 식별 번호의 모델 정보 조회
|
|
||||||
ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null); |
|
||||||
|
|
||||||
if (idntfBas != null && arcrftBas != null) { |
|
||||||
fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId()); |
|
||||||
fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum()); |
|
||||||
fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno()); |
|
||||||
fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId()); |
|
||||||
} |
|
||||||
|
|
||||||
// 2. 해당 되는 비행계획서 정보 저장.
|
|
||||||
List<FltPlanBas> planArcrft = |
|
||||||
fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt()); |
|
||||||
|
|
||||||
if (!planArcrft.isEmpty()) { |
|
||||||
for (FltPlanBas plan : planArcrft) { |
|
||||||
fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// 3. mapping 정보 주입.
|
|
||||||
if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) { |
|
||||||
ctrCntrlRelRepository.save(fltPlanCtrCntrlRel); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Drone인 경우에만 history 생성
|
|
||||||
CtrCntrlHstry ctrCntrlHstry = ctrCntrlJpaService.insertCtrCntrlHstry(dbModel); |
|
||||||
|
|
||||||
if(model.getTypeCd().equals("01") || model.getTypeCd().equals("99")) { |
|
||||||
ctrCntrlJpaService.insertCtrCntrlHstryArea(dbModel, ctrCntrlHstry.getHstrySno()); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void sendToMessage(GPModel model) { |
|
||||||
String json =""; |
|
||||||
|
|
||||||
try { |
|
||||||
json = objectMapper.writeValueAsString(model); |
|
||||||
} catch (JsonProcessingException e) { |
|
||||||
e.printStackTrace(); |
|
||||||
} |
|
||||||
|
|
||||||
/* Websocket 서버로 전달 할 드론 데이터 */ |
|
||||||
rabbitTemplate.convertAndSend( |
|
||||||
Objects.requireNonNull(env.getProperty("message.websocket.exchange-name")), |
|
||||||
Objects.requireNonNull(env.getProperty("message.websocket.routing-key")), |
|
||||||
json |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue