|
@@ -6,6 +6,7 @@ import com.its.app.utils.TimeUtils;
|
|
|
import com.its.bis.api.dto.AgipObeLoc;
|
|
|
import com.its.bis.config.ServerConfig;
|
|
|
import com.its.bis.dto.*;
|
|
|
+import com.its.bis.entity.TbBisLinkTrafClct;
|
|
|
import com.its.bis.entity.TbBisVehLoc;
|
|
|
import com.its.bis.process.DbmsData;
|
|
|
import com.its.bis.process.DbmsDataProcess;
|
|
@@ -121,154 +122,89 @@ public class BisAgipWorker implements Runnable {
|
|
|
NearNodeDto passNode = getNearNode(currLocation);
|
|
|
Long stNodeId = bisObe.getStNode().getNodeId();
|
|
|
Long edNodeId = bisObe.getEdNode().getNodeId();
|
|
|
+ Long runNodeId = bisObe.getRunNode().getNodeId();
|
|
|
Long passNodeId = passNode.getNodeId();
|
|
|
+ log.info("R1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 현재노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
|
|
|
if (passNodeId != 0L) {
|
|
|
- log.info("DEVICE ID: {}, 노드운행: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
- if (bisObe.getRunNode().getNodeId() == 0L) {
|
|
|
- // 운행중 노드정보 설정
|
|
|
+ // 노드 진입/운행
|
|
|
+ if (runNodeId == 0L) {
|
|
|
+ // 운행노드 정보가 없는 경우
|
|
|
bisObe.getRunNode().setNodeId(passNodeId);
|
|
|
bisObe.getRunNode().setInTime(currSysTime);
|
|
|
- bisObe.getRunNode().setOutTime(currSysTime);
|
|
|
- } else {
|
|
|
- // 운행중 노드의 진출시각을 업데이트
|
|
|
- bisObe.getRunNode().setOutTime(currSysTime);
|
|
|
+ log.info("R2.DEVICE ID: {}, 운행노드 도착: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
}
|
|
|
+ bisObe.getRunNode().setOutTime(currSysTime);
|
|
|
|
|
|
if (stNodeId == 0L) {
|
|
|
- // 시작노드가 없으면 시작노드 설정
|
|
|
+ // 운행중인 시작노드가 없는 경우 - 진입 노드정보 설정
|
|
|
bisObe.getStNode().setNodeId(passNodeId);
|
|
|
bisObe.getStNode().setInTime(currSysTime);
|
|
|
bisObe.getStNode().setOutTime(currSysTime);
|
|
|
- log.info("DEVICE ID: {}, 시작노드 도착: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
- } else {
|
|
|
+ log.info("S1.DEVICE ID: {}, 시작노드 도착: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 운행중인 노선의 시작노드가 존해하는 경우
|
|
|
if (stNodeId.equals(passNodeId)) {
|
|
|
- // 시작노드와 동일한 노드를 운행중
|
|
|
- log.info("DEVICE ID: {}, 시작노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
+ // 시작노드와 현재노드가 같은경우 - 운행중 노드의 진출시각을 업데이트
|
|
|
bisObe.getStNode().setOutTime(currSysTime);
|
|
|
+ log.info("S2.DEVICE ID: {}, 시작노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
+ } else {
|
|
|
+ if (edNodeId == 0L) {
|
|
|
+ // 운행중인 종료노드가 없는 경우 - 진입 노드정보 설정
|
|
|
+ bisObe.getEdNode().setNodeId(passNodeId);
|
|
|
+ bisObe.getEdNode().setInTime(currSysTime);
|
|
|
+ bisObe.getEdNode().setOutTime(currSysTime);
|
|
|
+ log.info("E1.DEVICE ID: {}, 종료노드 도착: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
+ // 시작노드 진출시각과 종료노드 도착시각을 이용하여 구간운행정보를 생성
|
|
|
+ calcLinkTraffic(bisObe);
|
|
|
+ } else {
|
|
|
+ if (edNodeId.equals(passNodeId)) {
|
|
|
+ // 시작노드와 동일한 노드를 운행중
|
|
|
+ bisObe.getEdNode().setOutTime(currSysTime);
|
|
|
+ log.info("E2.DEVICE ID: {}, 종료노드 운행중: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
+ } else {
|
|
|
+ log.info("X1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 현재노드: {}, 구간노드정보 불일치.....", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- // 근접한 노드를 찾을 수 없을 때...
|
|
|
- if (bisObe.getRunNode().getNodeId() != 0L) {
|
|
|
- // 노드운행을 종료(진출)
|
|
|
+ // 근접한 노드를 찾을 수 없을 때...즉 구간을 운행중일때
|
|
|
+ if (runNodeId != 0L) {
|
|
|
+ // 운행노드 정보가 존해하면 노드운행을 종료(진출)
|
|
|
bisObe.getRunNode().setOutTime(currSysTime);
|
|
|
bisObe.getRunNode().calWaitTm(); // 노드 대기시간 계산
|
|
|
- log.info("DEVICE ID: {}, 노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getRunNode().getNodeId(), bisObe.getRunNode().getWaitTm());
|
|
|
+ log.info("R3.DEVICE ID: {}, 운행노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), runNodeId, bisObe.getRunNode().getWaitTm());
|
|
|
|
|
|
- if (bisObe.getStNode().getNodeId().equals(bisObe.getRunNode().getNodeId())) {
|
|
|
+ bisObe.getRunNode().init(); // 운행중 노드 초기화
|
|
|
+
|
|
|
+ if (stNodeId.equals(runNodeId)) {
|
|
|
bisObe.getStNode().setOutTime(currSysTime);
|
|
|
bisObe.getStNode().calWaitTm(); // 노드 대기시간 계산
|
|
|
- log.info("DEVICE ID: {}, 시작노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getStNode().getNodeId(), bisObe.getStNode().getWaitTm());
|
|
|
+ log.info("S3.DEVICE ID: {}, 시작노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), stNodeId, bisObe.getStNode().getWaitTm());
|
|
|
}
|
|
|
- if (bisObe.getEdNode().getNodeId().equals(bisObe.getRunNode().getNodeId())) {
|
|
|
+ else if (edNodeId.equals(runNodeId)) {
|
|
|
bisObe.getEdNode().setOutTime(currSysTime);
|
|
|
bisObe.getEdNode().calWaitTm(); // 노드 대기시간 계산
|
|
|
- log.info("DEVICE ID: {}, 종료노드진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), bisObe.getEdNode().getNodeId(), bisObe.getStNode().getWaitTm());
|
|
|
+ log.info("E3.DEVICE ID: {}, 종료노드 진출: {}, 대기시간: {} sec.", bisObe.getDeviceId(), edNodeId, bisObe.getEdNode().getWaitTm());
|
|
|
|
|
|
+ // 종료노드를 빠져 나왔기 때문에 종료노드를 시작노드로 변경
|
|
|
bisObe.getStNode().copy(bisObe.getEdNode());
|
|
|
bisObe.getEdNode().init();
|
|
|
}
|
|
|
-
|
|
|
- bisObe.getRunNode().init(); // 운행중 노드 초기화
|
|
|
- }
|
|
|
- else {
|
|
|
- log.info("DEVICE ID: {}, 노선운행 중: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-/**
|
|
|
-
|
|
|
-
|
|
|
- if (bisObe != null) {
|
|
|
- }
|
|
|
else {
|
|
|
- if (!stNodeId.equals(passNodeId) && !edNodeId.equals(passNodeId)) {
|
|
|
- // 시작노드 값이 존재하면서 통과노드가 시작노드 및 종료노드와 같지 않으면 종료노드로 설정
|
|
|
- log.info("DEVICE ID: {}, 종료노드 통과: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
- // 종료노드와 같지 않은 경우 종료노드에 도착한 것이므로 구간 소통정보를 생성하자....
|
|
|
- bisObe.setEdNodeId(passNodeId);
|
|
|
- bisObe.setEdNodeTm(currSysTime);
|
|
|
- int travelSec = (int) ((bisObe.getEdNodeTm() - bisObe.getStNodeTm()) / 1000);
|
|
|
- if (travelSec > (this.config.getMaxTrvlMin() * 60)) {
|
|
|
- // 구간 통과 시간이 설정한 값보다 크기 때문에 통행시간을 계산하지 않는다.
|
|
|
- // 현재 통과 노드를 시작노드로 설정한다.
|
|
|
- log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 여행시간 오류: {} sec.", bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId(), travelSec);
|
|
|
- bisObe.setStNodeId(bisObe.getEdNodeId());
|
|
|
- bisObe.setStNodeTm(bisObe.getEdNodeTm());
|
|
|
- bisObe.setEdNodeId(0L);
|
|
|
- bisObe.setEdNodeTm(0);
|
|
|
- }
|
|
|
- else {
|
|
|
- TbLinkDto link = this.repoService.getSectMap(bisObe.getStNodeId(), bisObe.getEdNodeId());
|
|
|
- if (link == null) {
|
|
|
- // 구간을 찾지 못하였음... 종료노드를 시작노드로 설정
|
|
|
- log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간 맷칭 오류...", bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId());
|
|
|
- bisObe.setStNodeId(bisObe.getEdNodeId());
|
|
|
- bisObe.setStNodeTm(bisObe.getEdNodeTm());
|
|
|
- bisObe.setEdNodeId(0L);
|
|
|
- bisObe.setEdNodeTm(0);
|
|
|
- }
|
|
|
- else {
|
|
|
- // 구간을 통과하였으므로 구간교통정보를 생성한다.
|
|
|
- int speed = calcSpeed(link.getLinkLeng(), travelSec);
|
|
|
- log.warn("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간통과: {}, {} m, {} km/h, {} seconds.",
|
|
|
- bisObe.getDeviceId(), bisObe.getStNodeId(), bisObe.getEdNodeId(), link.getLinkId(), link.getLinkLeng(), speed, travelSec);
|
|
|
- TbBisLinkTrafClct bisLinkTrafClct = TbBisLinkTrafClct.builder()
|
|
|
- .CLCT_DT(SysUtils.getSysTime())
|
|
|
- .LINK_ID(link.getLinkId())
|
|
|
- .DEVICE_ID(bisObe.getDeviceId())
|
|
|
- .SPED(speed)
|
|
|
- .TRVL_HH(travelSec)
|
|
|
- .ST_NODE_ARR_DT(TimeUtils.millisToString(bisObe.getStNodeTm()))
|
|
|
- .ED_NODE_ARR_DT(TimeUtils.millisToString(bisObe.getEdNodeTm()))
|
|
|
- .build();
|
|
|
-
|
|
|
- this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CRT_BIS_LINK_TRAF_CLCT, false, bisLinkTrafClct));
|
|
|
-
|
|
|
- bisObe.setStNodeId(bisObe.getEdNodeId());
|
|
|
- bisObe.setStNodeTm(bisObe.getEdNodeTm());
|
|
|
- bisObe.setEdNodeId(0L);
|
|
|
- bisObe.setEdNodeTm(0);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
|
|
|
- }
|
|
|
+ // 시작노드 종료노드
|
|
|
+ log.info("X2.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 노선운행 노드: {}, 시작/종료/운행 노드 불일치.", bisObe.getDeviceId(), stNodeId, edNodeId, runNodeId);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- else {
|
|
|
- log.info("DEVICE ID: {}, 노선운행: {}", bisObe.getDeviceId(), passNodeId);
|
|
|
- if (bisObe.getRunNodeId() != 0L) {
|
|
|
- int nodeWaitTm = bisObe.calNodeWaitTm();
|
|
|
- log.info("DEVICE ID: {}, 운행노드: {}, 대기시간: {} sec, 통과....", bisObe.getDeviceId(), bisObe.getRunNodeId(), nodeWaitTm);
|
|
|
- bisObe.initRunNodeInfo(); // 운행중 노드 정보를 초기화 한다.
|
|
|
- }
|
|
|
-
|
|
|
- if (stNodeId != 0 && edNodeId != 0) {
|
|
|
- // 시작노드와 종료노드가 설정된 상태에서 이번에 아무런 노드정보가 없으므로 노드를 빠져 나온것이므로
|
|
|
- // 종료노드를 시작노드로 설정하고 종료노드는 0으로 설정한다.
|
|
|
- // 노드 통과 후 구간 정보를 생성하기 위해서는 여기서 처리
|
|
|
- log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
|
|
|
- bisObe.setStNodeId(edNodeId);
|
|
|
- bisObe.setStNodeTm(currSysTime);
|
|
|
- // 종료노드 초기화
|
|
|
- bisObe.setEdNodeId(0L);
|
|
|
- bisObe.setEdNodeTm(0);
|
|
|
- }
|
|
|
else {
|
|
|
- log.info("DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 통과노드: {}, 구간 운행 중...", bisObe.getDeviceId(), stNodeId, edNodeId, passNodeId);
|
|
|
+ log.info("R3.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 노선운행 중.", bisObe.getDeviceId(), stNodeId, edNodeId);
|
|
|
}
|
|
|
}
|
|
|
-**/
|
|
|
MDC.remove(bisObe.getDeviceId());
|
|
|
MDC.clear();
|
|
|
|
|
|
- /**
|
|
|
- * 버스 현재위치 정보를 업데이트 한다.
|
|
|
- */
|
|
|
TbBisVehLoc bisVehLoc = TbBisVehLoc.builder()
|
|
|
.DEVICE_ID(bisObe.getDeviceId())
|
|
|
.CLCT_DT(SysUtils.getSysTime())
|
|
@@ -280,9 +216,53 @@ public class BisAgipWorker implements Runnable {
|
|
|
.LAT(obeLoc.getGnssInfo().getLatitude())
|
|
|
.PASS_NODE_ID(passNodeId)
|
|
|
.build();
|
|
|
+
|
|
|
+ // 버스 현재위치 정보를 업데이트 한다.
|
|
|
this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_UPD_BIS_VEH_LOC, false, bisVehLoc));
|
|
|
}
|
|
|
|
|
|
+ private void calcLinkTraffic(BisObe bisObe) {
|
|
|
+ // 시작노드 진출시각과 종료노드 진입시각을 이용하여 구간 소통정보를 생성
|
|
|
+ Long stNodeId = bisObe.getStNode().getNodeId();
|
|
|
+ Long edNodeId = bisObe.getEdNode().getNodeId();
|
|
|
+ long stTime = bisObe.getStNode().getOutTime(); // 시작노드 진출시각
|
|
|
+ long edTime = bisObe.getEdNode().getInTime(); // 종료노드 도착시각
|
|
|
+
|
|
|
+ int travelSec = (int) ((edTime - stTime) / 1000); // 여행시간(초)
|
|
|
+ if (travelSec > (this.config.getMaxTrvlMin() * 60)) {
|
|
|
+ // 구간 통과 시간이 설정한 값보다 크기 때문에 통행시간을 계산하지 않는다. 지연 또는 정류장대기 등의 이유일것....
|
|
|
+ // 현재 통과 노드를 시작노드로 설정한다.
|
|
|
+ log.warn("T3.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 여행시간 오류: {} sec.", bisObe.getDeviceId(), stNodeId, edNodeId, travelSec);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ TbLinkDto link = this.repoService.getSectMap(stNodeId, edNodeId);
|
|
|
+ if (link == null) {
|
|
|
+ // 구간을 찾지 못하였음... 중간에 노드를 건너 띈 경우
|
|
|
+ log.warn("T2.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 구간 맷칭 오류...", bisObe.getDeviceId(), stNodeId, edNodeId);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // 구간을 통과하였으므로 구간교통정보를 생성한다.
|
|
|
+ int speed = calcSpeed(link.getLinkLeng(), travelSec);
|
|
|
+ int prcsSpeed = Math.min(100, speed);
|
|
|
+ log.info("T1.DEVICE ID: {}, 시작노드: {}, 종료노드: {}, 운행구간: {}, {} m, {}/{} km/h, {} seconds.",
|
|
|
+ bisObe.getDeviceId(), stNodeId, edNodeId, link.getLinkId(), link.getLinkLeng(), speed, prcsSpeed, travelSec);
|
|
|
+
|
|
|
+ TbBisLinkTrafClct bisLinkTrafClct = TbBisLinkTrafClct.builder()
|
|
|
+ .CLCT_DT(SysUtils.getSysTime())
|
|
|
+ .LINK_ID(link.getLinkId())
|
|
|
+ .DEVICE_ID(bisObe.getDeviceId())
|
|
|
+ .SPED(prcsSpeed)
|
|
|
+ .TRVL_HH(travelSec)
|
|
|
+ .ST_NODE_ARR_DT(TimeUtils.millisToString(stTime))
|
|
|
+ .ED_NODE_ARR_DT(TimeUtils.millisToString(edTime))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ // 구간 소통정보 이력으로 저장
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CRT_BIS_LINK_TRAF_CLCT, false, bisLinkTrafClct));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
public void report() {
|
|
|
long avgTime = 0;
|
|
|
log.info("Packet: Remain Q: {}, Average: {}, {}", this.DATA_QUEUE.size(), TimeUtils.elapsedTimeStr(avgTime), Thread.currentThread().getName());
|
|
@@ -293,7 +273,7 @@ public class BisAgipWorker implements Runnable {
|
|
|
if (distance <= 0 || seconds <= 0) {
|
|
|
return 2;
|
|
|
}
|
|
|
- speed = (int)(((distance * 3.6) / (float)seconds) + 0.5);
|
|
|
+ speed = (int)(((distance * 3.6) / seconds) + 0.5);
|
|
|
return speed;
|
|
|
}
|
|
|
|
|
@@ -315,7 +295,9 @@ public class BisAgipWorker implements Runnable {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- log.info("getNearNode: {} ms. {} m, {}", elapsed.milliSeconds(), maxDistance, nearNode);
|
|
|
+ if (elapsed.milliSeconds() > 200) {
|
|
|
+ log.info("getNearNode: {} ms. {} m, {}", elapsed.milliSeconds(), maxDistance, nearNode);
|
|
|
+ }
|
|
|
return nearNode;
|
|
|
}
|
|
|
|