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 |
25 changed files with 222 additions and 791 deletions
@ -1,15 +0,0 @@
|
||||
package com.palnet.biz.api.bas.flight.model; |
||||
|
||||
import java.util.List; |
||||
|
||||
import org.locationtech.jts.geom.Coordinate; |
||||
|
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class BasFlightCoordModel { |
||||
|
||||
private List<Coordinate> coordinates; |
||||
|
||||
private Double buffer; |
||||
} |
@ -1,58 +0,0 @@
|
||||
package com.palnet.biz.api.comn.controller; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.net.URLEncoder; |
||||
import java.nio.charset.StandardCharsets; |
||||
|
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.web.bind.annotation.GetMapping; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
|
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
@RestController |
||||
@Slf4j |
||||
@RequestMapping("/api/comn") |
||||
@RequiredArgsConstructor |
||||
public class ComnController { |
||||
|
||||
private final HttpServletResponse response; |
||||
|
||||
private final String BASE_URL = "/data/pdf/3-1.paldesign.pdf"; |
||||
|
||||
@GetMapping("/pdf-download") |
||||
public void pdfDownload(){ |
||||
log.error("ComnController - pdfDownload()"); |
||||
|
||||
try (InputStream inputStream = new FileInputStream(new File(BASE_URL)); |
||||
OutputStream outputStream = response.getOutputStream()) { |
||||
|
||||
String fileOriName = "3-1.paldesign.pdf"; |
||||
fileOriName = URLEncoder.encode(fileOriName, StandardCharsets.UTF_8); |
||||
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); |
||||
response.setCharacterEncoding(StandardCharsets.UTF_8.name()); |
||||
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileOriName + "\""); |
||||
|
||||
byte[] buffer = new byte[1024]; |
||||
int length; |
||||
|
||||
while ((length = inputStream.read(buffer)) != -1) { |
||||
outputStream.write(buffer, 0, length); |
||||
} |
||||
|
||||
} catch (IOException e) { |
||||
|
||||
log.error("error -> {}", e.getMessage()); |
||||
} |
||||
} |
||||
} |
@ -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 |
||||
); |
||||
} |
||||
} |
@ -1,71 +0,0 @@
|
||||
package com.palnet.comn.utils; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.StringWriter; |
||||
import java.util.List; |
||||
|
||||
import javax.xml.bind.JAXBContext; |
||||
import javax.xml.bind.JAXBException; |
||||
import javax.xml.bind.Marshaller; |
||||
|
||||
import org.springframework.context.annotation.Profile; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import de.micromata.opengis.kml.v_2_2_0.Document; |
||||
import de.micromata.opengis.kml.v_2_2_0.Kml; |
||||
import de.micromata.opengis.kml.v_2_2_0.Placemark; |
||||
import de.micromata.opengis.kml.v_2_2_0.Point; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
@Component |
||||
@Slf4j |
||||
public class KmlUtils { |
||||
|
||||
public String generateKMLFromSimpleKml(List<String> coordinates) throws IOException, JAXBException { |
||||
Kml kml = new Kml(); |
||||
Document document = kml.createAndSetDocument(); |
||||
|
||||
for (String coordinate : coordinates) { |
||||
Placemark placemark = document.createAndAddPlacemark(); |
||||
placemark.setName("Simple placemark"); |
||||
placemark.setDescription("Attached to the ground. Intelligently places itself at the height of the underlying terrain."); |
||||
|
||||
Point point = placemark.createAndSetPoint(); |
||||
point.addToCoordinates(coordinate); |
||||
} |
||||
|
||||
StringWriter writer = new StringWriter(); |
||||
JAXBContext context = JAXBContext.newInstance(Kml.class); |
||||
Marshaller marshaller = context.createMarshaller(); |
||||
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); |
||||
marshaller.marshal(kml, writer); |
||||
|
||||
String kmlString = writer.toString(); |
||||
|
||||
return kmlString; |
||||
|
||||
} |
||||
|
||||
// public String generateKMLFromCoordinates(List<String> coordinatesList) {
|
||||
// StringBuilder kmlBuilder = new StringBuilder();
|
||||
// kmlBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
||||
// kmlBuilder.append("<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
|
||||
// kmlBuilder.append("<Document>\n");
|
||||
// for (String coordinates : coordinatesList) {
|
||||
// kmlBuilder.append("<Placemark>\n");
|
||||
// kmlBuilder.append("<name>Simple placemark</name>\n");
|
||||
// kmlBuilder.append("<description>Attached to the ground. Intelligently places itself at the height of the underlying terrain.</description>\n");
|
||||
// kmlBuilder.append("<Point>\n");
|
||||
// kmlBuilder.append("<coordinates>").append(coordinates).append("</coordinates>\n");
|
||||
// kmlBuilder.append("</Point>\n");
|
||||
// kmlBuilder.append("</Placemark>\n");
|
||||
// }
|
||||
// kmlBuilder.append("</Document>\n");
|
||||
// kmlBuilder.append("</kml>");
|
||||
//
|
||||
// log.info("kml>>>>>>>>>>>{}", kmlBuilder);
|
||||
//
|
||||
// return kmlBuilder.toString();
|
||||
// }
|
||||
|
||||
} |
@ -1,142 +0,0 @@
|
||||
package com.palnet.comn.utils; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.FileNotFoundException; |
||||
import java.io.IOException; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.Vector; |
||||
|
||||
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import com.jcraft.jsch.Channel; |
||||
import com.jcraft.jsch.ChannelSftp; |
||||
import com.jcraft.jsch.JSch; |
||||
import com.jcraft.jsch.JSchException; |
||||
import com.jcraft.jsch.Session; |
||||
import com.jcraft.jsch.SftpATTRS; |
||||
import com.jcraft.jsch.SftpException; |
||||
|
||||
import lombok.extern.log4j.Log4j2; |
||||
|
||||
@Component |
||||
@Log4j2 |
||||
public class SftpUtils { |
||||
|
||||
private Session session = null; |
||||
private Channel channel = null; |
||||
private ChannelSftp channelSftp = null; |
||||
@Value("${spring.sftp.host}") |
||||
private String host; |
||||
@Value("${spring.sftp.userName}") |
||||
private String userName; |
||||
@Value("${spring.sftp.password}") |
||||
private String password; |
||||
@Value("${spring.sftp.port}") |
||||
private int port; |
||||
@Value("${spring.sftp.uploadPath}") |
||||
private String uploadPath; |
||||
|
||||
private final Date today = new Date(); |
||||
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
||||
|
||||
public void init(String kmlContent, String fileName) { |
||||
|
||||
JSch jSch = new JSch(); |
||||
|
||||
try { |
||||
session = jSch.getSession(userName, host, port); |
||||
session.setPassword(password); |
||||
|
||||
java.util.Properties config = new java.util.Properties(); |
||||
config.put("StrictHostKeyChecking", "no"); |
||||
session.setConfig(config); |
||||
|
||||
session.connect(); |
||||
|
||||
channelSftp = (ChannelSftp) session.openChannel("sftp"); |
||||
channelSftp.connect(); |
||||
|
||||
// kmlContent를 ByteArrayInputStream으로 변환
|
||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(kmlContent.getBytes("UTF-8")); |
||||
|
||||
// 파일 업로드
|
||||
channelSftp.cd(uploadPath); // 원격 디렉토리로 이동
|
||||
channelSftp.put(inputStream, fileName); // 파일 업로드
|
||||
|
||||
log.info("파일 업로드 완료"); |
||||
|
||||
} catch (JSchException | SftpException | UnsupportedEncodingException e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
if (channelSftp != null && channelSftp.isConnected()) { |
||||
channelSftp.disconnect(); |
||||
} |
||||
if (session != null && session.isConnected()) { |
||||
session.disconnect(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public boolean exists(String path) { |
||||
|
||||
Vector res = null; |
||||
try { |
||||
res = channelSftp.ls(path); |
||||
} catch (SftpException e) { |
||||
if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
return res != null && !res.isEmpty(); |
||||
} |
||||
|
||||
public boolean upload(String dir, File file) { |
||||
|
||||
boolean isUpload = false; |
||||
SftpATTRS attrs; |
||||
FileInputStream in = null; |
||||
try { |
||||
in = new FileInputStream(file); |
||||
channelSftp.cd(dir); |
||||
channelSftp.put(in, file.getName()); |
||||
|
||||
// 업로드했는지 확인
|
||||
if (this.exists(dir +"/"+file.getName())) { |
||||
isUpload = true; |
||||
} |
||||
} catch (SftpException e) { |
||||
e.printStackTrace(); |
||||
} catch (FileNotFoundException e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
try { |
||||
in.close(); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
return isUpload; |
||||
} |
||||
|
||||
// public void sftp(String kml) {
|
||||
//
|
||||
// this.init(host, userName, password, port);
|
||||
//
|
||||
// // 업로드 테스트
|
||||
// File uploadfile = new File(uploadPath + "파일명"); // 파일 객체 생성
|
||||
//
|
||||
// String mkdirPath = sdf.format(today); //현재날짜 년월일
|
||||
// boolean isUpload = this.upload(uploadPath+mkdirPath, uploadfile); //업로드
|
||||
// System.out.println("isUpload -" + isUpload); // 업로드 여부 확인
|
||||
//
|
||||
// // 업로드 다운로드 수행 후 꼭 연결을 끊어줘야 한다!!
|
||||
// channelSftp.quit();
|
||||
// session.disconnect();
|
||||
// }
|
||||
} |
Loading…
Reference in new issue