package com.its.rota.server.service; import com.its.app.common.utils.Elapsed; import com.its.rota.server.aspect.annotation.ProcessElapsed; import com.its.rota.server.dao.mapper.IncidentMapper; import com.its.rota.server.dao.mapper.TrafficMapper; import com.its.rota.server.dto.CenterDto; import com.its.rota.server.entity.TbCheckIncident; import com.its.rota.server.entity.TbCheckTraffic; import com.its.rota.server.entity.TbSndIncident; import com.its.rota.server.entity.TbTrafficCenter; import com.its.rota.server.repository.ApplicationRepository; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.ArrayList; import java.util.Collections; import java.util.List; @Slf4j @Getter @Service @RequiredArgsConstructor @Transactional(rollbackFor = {Exception.class}) public class ItsRotaServerService { private final ApplicationRepository repo; private final IncidentMapper incidentMapper; private final TrafficMapper mapper; private boolean isRunning = false; private boolean isRunningCheckIncident = false; @PostConstruct private void init() { log.info("ItsRotaServerService.init: start."); log.info("ItsRotaServerService.init: ..end."); } @PreDestroy public void destroyService() { log.error("ItsRotaServerService.destroy. system terminated......."); } public void resetCenterTrafficSend() { long baseTime = System.currentTimeMillis(); List keySet = new ArrayList<>(this.repo.getCenterMap().keySet()); Collections.sort(keySet); for (String key : keySet) { CenterDto center = this.repo.getCenterMap().get(key); if (center == null) { continue; } center.getTraffic().init(baseTime); } } public int checkSendTraffic() { String proceedName = String.format("%45s", this.getClass().getSimpleName() + ".checkSendTraffic"); if (this.isRunning) { log.warn("{}: Already running.", proceedName); return 1; } Elapsed elapsed = new Elapsed(); this.isRunning = true; log.info("{}: start.", proceedName); try { Elapsed elapsed1 = new Elapsed(); List result = this.mapper.selCheckTraffic(); if (!result.isEmpty()) { String trafficTime = result.get(0).getRegDate(); log.info("{}: checkTrafficTime: {}, currTrafficTime: {}.", proceedName, ApplicationRepository.checkTrafficTime, trafficTime); if (!ApplicationRepository.checkTrafficTime.equals(trafficTime)) { resetCenterTrafficSend(); elapsed1.reset(); List traffics = this.mapper.selTrafficCenter(); log.info("{}: {} EA. {}", proceedName, traffics.size(), Elapsed.elapsedTimeStr(elapsed1.nanoSeconds())); ApplicationRepository.checkTrafficTime = trafficTime; ApplicationRepository.traffics = traffics; List keySet = new ArrayList<>(this.repo.getCenterMap().keySet()); Collections.sort(keySet); for (String key : keySet) { CenterDto center = this.repo.getCenterMap().get(key); if (center == null) { continue; } center.executeSendTraffic(); } } } } catch (Exception e) { log.error("{}: Exception {}", proceedName, e.getMessage()); } this.isRunning = false; log.info("{}: ..end. {}", proceedName, Elapsed.elapsedTimeStr(elapsed.nanoSeconds())); return 0; } public int checkSendIncident() { String proceedName = String.format("%45s", this.getClass().getSimpleName() + ".checkSendIncident"); if (this.isRunningCheckIncident) { log.warn("{}: Already running.", proceedName); return 1; } Elapsed elapsed = new Elapsed(); this.isRunningCheckIncident = true; log.info("{}: start.", proceedName); try { Elapsed elapsed1 = new Elapsed(); int deletes = this.incidentMapper.delCheckIncident(); if (deletes > 0) { log.info("{}: delCheckIncident {} EA. {}", proceedName, deletes, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds())); } long baseTime = System.currentTimeMillis(); List keySet = new ArrayList<>(this.repo.getCenterMap().keySet()); Collections.sort(keySet); for (String key : keySet) { CenterDto center = this.repo.getCenterMap().get(key); if (center == null) { continue; } TbCheckIncident incident = TbCheckIncident.builder() .fromCenterId(ApplicationRepository.center.getCenterId()) .toCenterId(center.getCenterId()) .build(); elapsed1.reset(); int inserts = this.incidentMapper.insSndIncident(incident); if (inserts > 0) { log.info("{}: insSndIncident {}, {} EA. {}", proceedName, center.getCenterId(), inserts, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds())); } // 지역센터에 전송할 돌발정보를 메모리에 저장하고 지역센터에 전송하여야 한다. List result = this.incidentMapper.selSndIncident(incident); // if ("L99".equals(center.getCenterId())) { // TbSndIncident data = TbSndIncident.builder() // .linkId("1111111111") // .nodeId("1111111111") // .contactOrganizationNameText("1111111111") // .descriptionTypeIncidentCode(1) // .descriptionTypeIncidentOther("1111111111") // .incidentVehiclesInvolvedCode(1) // .incidentVehiclesInvolvedOther("1111111111") // .incidentStatusCode(1) // .incidentStatusOther(" 127.787941624999 37.7560849154680") // .updateTypeCode(1) // .updateTypeOther("202408081639002024080812170020240808124700") // .build(); // result.add(data); // TbSndIncident data1 = TbSndIncident.builder() // .linkId("2222222222") // .nodeId("2222222222") // .contactOrganizationNameText("2222222222") // .descriptionTypeIncidentCode(2) // .descriptionTypeIncidentOther("2222222222") // .incidentVehiclesInvolvedCode(2) // .incidentVehiclesInvolvedOther("2222222222") // .incidentStatusCode(2) // .incidentStatusOther(" 127.787941624999 37.7560849154680") // .updateTypeCode(2) // .updateTypeOther("202408081639002024080812170020240808124700") // .build(); // result.add(data1); // } center.getIncident().init(baseTime, result); if (!result.isEmpty()) { log.info("{}: selSndIncident {}, {} EA. {}", proceedName, center.getCenterId(), result.size(), Elapsed.elapsedTimeStr(elapsed1.nanoSeconds())); center.executeSendIncident(); } } } catch (Exception e) { log.error("{}: Exception {}", proceedName, e.getMessage()); } this.isRunningCheckIncident = false; log.info("{}: ..end. {}", proceedName, Elapsed.elapsedTimeStr(elapsed.nanoSeconds())); return 0; } }