| 
					
				 | 
			
			
				@@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |