diff --git a/pom.xml b/pom.xml index d8cf678..68bc974 100644 --- a/pom.xml +++ b/pom.xml @@ -140,15 +140,15 @@ - - org.springframework.amqp - spring-rabbit-test - test - - - org.springframework.boot - spring-boot-starter-amqp - + + + + + + + + + diff --git a/src/main/java/com/palnet/Application.java b/src/main/java/com/palnet/PavApplication.java similarity index 71% rename from src/main/java/com/palnet/Application.java rename to src/main/java/com/palnet/PavApplication.java index 3254d1d..bc264f9 100644 --- a/src/main/java/com/palnet/Application.java +++ b/src/main/java/com/palnet/PavApplication.java @@ -1,10 +1,8 @@ package com.palnet; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -12,10 +10,10 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAsync @EnableCaching -public class Application { +public class PavApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(PavApplication.class, args); } } diff --git a/src/main/java/com/palnet/biz/config/MessageConfig.java b/src/main/java/com/palnet/biz/config/MessageConfig.java index f894ed8..8b0179c 100644 --- a/src/main/java/com/palnet/biz/config/MessageConfig.java +++ b/src/main/java/com/palnet/biz/config/MessageConfig.java @@ -1,86 +1,86 @@ -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(); +//package com.palnet.biz.config; // -// 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")); +//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; // -// return connectionFactory; -// } - - @Bean - public Jackson2JsonMessageConverter converter() { - return new Jackson2JsonMessageConverter(); - } - -// @Bean -// public DirectExchange appDroneExchange() { -// return new DirectExchange(env.getProperty("message.app.exchange-name")); -// } +//@Configuration +//@Slf4j +//public class MessageConfig { +// private final Environment env; // -// @Bean -// public DirectExchange websocketDroneExchange() { -// return new DirectExchange(env.getProperty("message.websocket.exchange-name")); +// public MessageConfig(Environment env) { +// this.env = env; // } // -// @Bean -// public Queue appDroneQueue() { -// return new Queue(env.getProperty("message.app.queue-name"), false); -// } +//// @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 Queue websocketDroneQueue() { -// return new Queue(env.getProperty("message.websocket.queue-name"), false); +// public Jackson2JsonMessageConverter converter() { +// return new Jackson2JsonMessageConverter(); // } // -// @Bean -// public Binding appDroneBinding(Queue appDroneQueue, DirectExchange appDroneExchange) { -// return BindingBuilder.bind(appDroneQueue) -// .to(appDroneExchange) -// .with(env.getProperty("message.app.routing-key")); -// } +//// @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 Binding websocketDroneBinding(Queue websocketDroneQueue, DirectExchange websocketDroneExchange) { -// return BindingBuilder.bind(websocketDroneQueue) -// .to(websocketDroneExchange) -// .with(env.getProperty("message.websocket.routing-key")); +// public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) { +// RabbitTemplate rabbitTemplate = new RabbitTemplate(); +// +// rabbitTemplate.setConnectionFactory(connectionFactory); +// rabbitTemplate.setMessageConverter(converter); +// +// return rabbitTemplate; // } - - @Bean - public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) { - RabbitTemplate rabbitTemplate = new RabbitTemplate(); - - rabbitTemplate.setConnectionFactory(connectionFactory); - rabbitTemplate.setMessageConverter(converter); - - return rabbitTemplate; - } - -} +// +//} diff --git a/src/main/java/com/palnet/biz/message/Receiver.java b/src/main/java/com/palnet/biz/message/Receiver.java index e71b37c..2fc119f 100644 --- a/src/main/java/com/palnet/biz/message/Receiver.java +++ b/src/main/java/com/palnet/biz/message/Receiver.java @@ -1,22 +1,22 @@ -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; - } -} +//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; +// } +//} diff --git a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java b/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java index aac4734..c8ce341 100644 --- a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java +++ b/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java @@ -1,53 +1,53 @@ -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); - } - } - -} +//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); +// } +// } +// +//} diff --git a/src/main/java/com/palnet/biz/message/service/MessageService.java b/src/main/java/com/palnet/biz/message/service/MessageService.java index dd44cee..a705843 100644 --- a/src/main/java/com/palnet/biz/message/service/MessageService.java +++ b/src/main/java/com/palnet/biz/message/service/MessageService.java @@ -1,13 +1,13 @@ -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); - -} +//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); +// +//} 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 e2c9aa4..f56799b 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 @@ -1,203 +1,203 @@ -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 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 - ); - } -} +//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 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 +// ); +// } +//}