Ver código fonte

update 2025-11-24

junggilpark 3 semanas atrás
pai
commit
842942a610

+ 1 - 10
conf/tsi-sig-server.yml

@@ -2,14 +2,5 @@ spring:
   profiles:
     active: prod
 
----
-spring:
-  config:
-    activate:
-      on-profile: prod
-
-server:
-  port: 8445
-
 kakao:
-  key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+  key: 00c3f7d32c1f1822dc98ad72e35e0223

+ 1 - 4
src/main/java/com/tsi/sig/server/config/MybatisConfig.java

@@ -1,6 +1,5 @@
 package com.tsi.sig.server.config;
 
-import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionException;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionFactoryBean;
@@ -20,7 +19,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 import javax.annotation.PostConstruct;
 import javax.sql.DataSource;
 
-@Slf4j
 @Configuration
 @EnableTransactionManagement
 public class MybatisConfig {
@@ -29,8 +27,7 @@ public class MybatisConfig {
     String mapperLocations;
 
     @PostConstruct
-    private void init() {
-    }
+    private void init() {}
 
     @Primary
     @Bean(name="dataSource")

+ 86 - 35
src/main/java/com/tsi/sig/server/service/MainService.java

@@ -208,55 +208,106 @@ public class MainService {
 //    }
 
     public List<EvpServiceVo> getEvpServiceList() {
-        Map<String, EvpsData> evpDataMap = null;
-        List<EvpsData> list = null;
-        List<String> keys = null;
-        List<EvpServiceVo> result = new ArrayList<>();;
-        Map<String, String> regionMap = new HashMap<>();
-        if (repo.getEvpDataMap() != null) {
-            evpDataMap = repo.getEvpDataMap();
-            list = new ArrayList<>(evpDataMap.values());
-            keys = new ArrayList<>(evpDataMap.keySet());
-        }
-        else {
-
-        }
-
-        if (list != null && list.size() > 0) {
+        Map<String, EvpsData> evpDataMap = repo.getEvpDataMap();
+        List<EvpServiceVo> result = new ArrayList<>();
+        if (!evpDataMap.isEmpty()) {
+            Map<String, String> regionMap = new HashMap<>();
             List<EvpRegionVo> regions = this.mainMapper.getEvpRegion();
-
             for (EvpRegionVo vo : regions) {
                 regionMap.put(vo.getRegionId(), vo.getRegionName());
             }
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime now = LocalDateTime.now();
 
-
-            int idx = 0;
-            for (EvpsData data : list) {
+            Iterator<Map.Entry<String, EvpsData>> it = evpDataMap.entrySet().iterator();
+            while(it.hasNext()) {
+                Map.Entry<String, EvpsData> entry = it.next();
+                EvpsData data = entry.getValue();
                 EvpServiceVo vo = data.getEvpServiceVo();
-                String clctDt = vo.getClctDt();
-                if (clctDt == null || clctDt.equals("")) {
-                    repo.getEvpDataMap().remove(keys.get(idx));
+                if (vo == null) {
+                    it.remove();
                     continue;
                 }
-                String serviceId = vo.getServiceId().substring(0, 3);
-                if (regionMap.size() > 0) {
-                    vo.setRegionName(regionMap.get(serviceId));
+
+                // clctDt null/empty 체크
+                String clctDt = vo.getClctDt();
+                if (clctDt == null || clctDt.isEmpty()) {
+                    it.remove();
+                    continue;
                 }
-                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-                LocalDateTime targetTime = LocalDateTime.parse(clctDt, formatter);
-                LocalDateTime now = LocalDateTime.now();
-                long minutesDiff = ChronoUnit.MINUTES.between(targetTime, now);
-                if (minutesDiff >= 10) {
-                    repo.getEvpDataMap().remove(keys.get(idx));
+
+                // 날짜 파싱 오류 대비
+                LocalDateTime targetTime;
+                try {
+                    targetTime = LocalDateTime.parse(clctDt, formatter);
+                    // 시간 차이 계산
+                    long minutesDiff = ChronoUnit.MINUTES.between(targetTime, now);
+                    if (minutesDiff >= 10) {
+                        it.remove();
+                        continue;
+                    }
+                } catch (Exception e) {
+                    it.remove();
+                    continue;
                 }
-                else {
-                    result.add(vo);
+
+                result.add(vo);
+                // ServiceId 체크
+                String sid = vo.getServiceId();
+                if (sid == null || sid.length() < 3) {
+                    continue;
                 }
-                idx++;
+                String regionKey = sid.substring(0, 3);
+                vo.setRegionName(regionMap.get(regionKey));
             }
         }
-
         return result;
+
+//        List<EvpsData> list = new ArrayList<>(evpDataMap.values());
+//        List<String> keys = new ArrayList<>(evpDataMap.keySet());
+//        Map<String, String> regionMap = new HashMap<>();
+//
+//        if (list.size() > 0) {
+//            List<EvpRegionVo> regions = this.mainMapper.getEvpRegion();
+//
+//            for (EvpRegionVo vo : regions) {
+//                regionMap.put(vo.getRegionId(), vo.getRegionName());
+//            }
+//
+//
+//            int idx = 0;
+//            for (EvpsData data : list) {
+//                EvpServiceVo vo = data.getEvpServiceVo();
+//                String clctDt = vo.getClctDt();
+//                if (clctDt == null || clctDt.equals("")) {
+//                    repo.getEvpDataMap().remove(keys.get(idx));
+//                    continue;
+//                }
+//                String sid = vo.getServiceId();
+//
+//                if (sid != null && sid.length() > 3) {
+//                    String serviceId = sid.substring(0, 3);
+//                    if (regionMap.size() > 0 && regionMap.get(serviceId) != null) {
+//                        vo.setRegionName(regionMap.get(serviceId));
+//                    }
+//                }
+//
+//
+//                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//                LocalDateTime targetTime = LocalDateTime.parse(clctDt, formatter);
+//                LocalDateTime now = LocalDateTime.now();
+//                long minutesDiff = ChronoUnit.MINUTES.between(targetTime, now);
+//                if (minutesDiff >= 10) {
+//                    repo.getEvpDataMap().remove(keys.get(idx));
+//                }
+//                else {
+//                    result.add(vo);
+//                }
+//                idx++;
+//            }
+//        }
+//
+//        return result;
     }
 
     public List<EvpRouteVo> getEvpRouteList(Map<String, Object> paramMap) {

+ 52 - 52
src/main/resources/application.yml

@@ -1,9 +1,61 @@
+spring:
+  config:
+    activate:
+      on-profile: prod
+  datasource:
+    mybatis:
+      jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
+#      jdbc-url: jdbc:mariadb:replication://10.4.4.20:3306,10.4.4.21:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&useServerPrepStmts=true&failoverEnable=true
+
+
+application:
+  kafka:
+    consumer:
+      #bootstrap-server 변경
+      bootstrap-servers: 172.24.0.30:9092,172.24.0.31:9093,172.24.0.32:9094
+      #bootstrap-servers: 61.82.138.91:19091,61.82.138.91:19092,61.82.138.91:19093
+    evp:
+      consumer:
+        bootstrap-servers: 172.24.0.30:9092,172.24.0.31:9093,172.24.0.32:9094
+        groupId: tsi-evp-was
+        topic: utic-evps
+#        topic: utic-evps-test
+kakao:
+  key: 8d9fdadc20c00319444ac31b9a2b9a3b
+#  key: 00c3f7d32c1f1822dc98ad72e35e0223
+
+---
+spring:
+  config:
+    activate:
+      on-profile: dev
+  datasource:
+    mybatis:
+      #jdbc-url: jdbc:mariadb://59.29.208.150:23307/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
+      #jdbc-url: jdbc:mariadb://61.108.209.105:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
+      #jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
+      jdbc-url: jdbc:mariadb://115.91.94.42:13306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
+
+application:
+  kafka:
+    consumer:
+      bootstrap-servers: 61.82.138.91:19091,61.82.138.91:19092,61.82.138.91:19093
+      #bootstrap-servers: 123.142.27.53:9092,123.142.27.53:9093,123.142.27.53:9094
+    evp:
+      consumer:
+        bootstrap-servers: tsihub-broker.koroad.or.kr:19092
+        groupId: tsi-evp-was
+        topic: utic-evps-sim
+kakao:
+  key: 00c3f7d32c1f1822dc98ad72e35e0223
+---
 spring:
   profiles:
     active: prod
   config:
     import:
       - optional:file:${user.dir}/conf/tsi-sig-server.yml
+    use-legacy-processing: false
   application:
     name: tsi-sig-server
   datasource:
@@ -77,55 +129,3 @@ application:
       #  - acks: 0
       #  - retries: 0
       #  - linger.ms: 1
-
----
-spring:
-  config:
-    activate:
-      on-profile: prod
-  datasource:
-    mybatis:
-      jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
-#      jdbc-url: jdbc:mariadb:replication://10.4.4.20:3306,10.4.4.21:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&useServerPrepStmts=true&failoverEnable=true
-
-
-application:
-  kafka:
-    consumer:
-      #bootstrap-server 변경
-      bootstrap-servers: 172.24.0.30:9092,172.24.0.31:9093,172.24.0.32:9094
-      #bootstrap-servers: 61.82.138.91:19091,61.82.138.91:19092,61.82.138.91:19093
-    evp:
-      consumer:
-        bootstrap-servers: 172.24.0.30:9092,172.24.0.31:9093,172.24.0.32:9094
-        groupId: tsi-evp-was
-        topic: utic-evps
-#        topic: utic-evps-test
-kakao:
-  key: 8d9fdadc20c00319444ac31b9a2b9a3b
-#kakaokey: 00c3f7d32c1f1822dc98ad72e35e0223
-
----
-spring:
-  config:
-    activate:
-      on-profile: dev
-  datasource:
-    mybatis:
-      #jdbc-url: jdbc:mariadb://59.29.208.150:23307/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
-      #jdbc-url: jdbc:mariadb://61.108.209.105:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
-      #jdbc-url: jdbc:mariadb://10.4.4.20:3306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
-      jdbc-url: jdbc:mariadb://115.91.94.42:13306/cvim_db?characterEncoding=UTF-8&serverTimezone=UTC
-
-application:
-  kafka:
-    consumer:
-      bootstrap-servers: 61.82.138.91:19091,61.82.138.91:19092,61.82.138.91:19093
-      #bootstrap-servers: 123.142.27.53:9092,123.142.27.53:9093,123.142.27.53:9094
-    evp:
-      consumer:
-        bootstrap-servers: tsihub-broker.koroad.or.kr:19092
-        groupId: tsi-evp-was
-        topic: utic-evps-sim
-kakao:
-  key: 00c3f7d32c1f1822dc98ad72e35e0223

+ 11 - 0
src/main/resources/static/css/style.css

@@ -2477,6 +2477,7 @@ a.ui-button:active,
   text-align: center;
   cursor: default;
   user-select: none;
+  font-size: 14px;
 }
 
 .empty-history {
@@ -2485,6 +2486,7 @@ a.ui-button:active,
   align-items: center;
   justify-content: center;
   user-select: none;
+  font-size: 14px;
 }
 
 
@@ -2985,3 +2987,12 @@ a.ui-button:active,
 .gridArea .tableBody thead th:not(.gridArea .tableBody thead th:last-child) {
   border-right: 1px solid var(--line);
 }
+.int-name > div:nth-child(1) {
+  width: 78px;
+}
+.int-name > div:nth-child(2) {
+  width: 160px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}

+ 0 - 1
src/main/resources/static/js/common/cvibDetail_new.js

@@ -17,7 +17,6 @@ $(()=>{
 function getCvibList(paramId) {
     let start = new Date().getTime();
     clearTimeout(_DetailInterval);
-    console.log('getCvibList');
     $.ajax({
         method: 'POST',
         url : '/getCvibDetail.do',

+ 0 - 1
src/main/resources/static/js/common/oneTopicDetailSocket.js

@@ -41,7 +41,6 @@ function wsOnMessage(message) {
     var recv = JSON.parse(message.data);
 
     recv.sort(dirCodeSort);
-    console.log(recv);
 
     var nodeId;
     var date;

+ 6 - 6
src/main/resources/static/js/map_new.js

@@ -130,7 +130,7 @@ function init() {
     });*/
 
     getSignalInfo();
-    const worker = new Worker('/js/worker.js');
+    const worker = new Worker('/js/worker.js?v=2');
     worker.postMessage({message:"worker START"});
 
     worker.onmessage = (ev)=>{
@@ -205,9 +205,6 @@ function init() {
         const bottom = $('#evpBottomInfo');
         bottom.empty();
         if (serviceId) {
-           // const $iframe = $('#iframeTreeList');
-           // const iframe = $iframe.contents();
-           // const iframeContent = $iframe.get(0).contentWindow;
            if (_historyMap && _historyMap.size) {
                _historyMap.forEach((obj)=>{
                    if (obj.get('draw')) {
@@ -226,8 +223,11 @@ function init() {
                $('#evpBottomInfo .tr_'+ serviceId).addClass('on');
            }
            let idx = _evpData.findIndex((obj)=> obj.service_id === serviceId);
-           const bottomEl = getBottomListEl(_evpData[idx], _evpData[idx].event_list[0], 0);
-            bottom.html(bottomEl);
+           let bottomEl = "";
+           if (idx > -1) {
+               bottomEl = getBottomListEl(_evpData[idx], _evpData[idx].event_list[0], 0);
+           }
+           bottom.html(bottomEl);
            drawEmergencyRoad(_evpData[idx]);
         }
     }

+ 10 - 17
src/main/resources/static/js/tree.js

@@ -1,31 +1,21 @@
 
 var treeJson = null;
-var groupTreeJson = null;
-var treeCtrl;
 var onlineCenterStatusCheckId;
 var offlineCenterStatusCheckId;
 var onlineIntStatusCheckId;
 var offlineIntStatusCheckId;
 var _RegionCdArr = [];
-var _GroupNoArr = [];
-var intGroupLineArr = [];
-var intGroupCircleArr = [];
-var _groupTreeListCallBackData;
 
 var onlineCenterStatusData;
 var offlineCenterStatusData;
 var onlineIntStatusData;
 var offlineIntStatusData;
 let _regionMap = new Map();
-var _searchText = "";
 let timeout = null;
 var _historyMap = new Map();
-let _TreeList;
 var interval = null;
 var cnt = 0;
 let isSearch = false;
-const regionMap = new Map();
-
 
 let _timeIdx;
 function nodeClick(nodeId, regionId, name, lat, lng){
@@ -579,6 +569,10 @@ function evpHistoryCallBack(rec) {
 
 function drawHistoryList(serviceId) {
     unsetEvpCurr();
+    $('.history-table tr.on').removeClass('on');
+    $('.hs_' + serviceId).addClass('on');
+    const bottomInfo = $('#evpBottomInfo');
+    bottomInfo.empty();
     requestService('getEvpHistoryDetail.do', {serviceId}, (data)=>{
 
         if (_historyMap.size && data) {
@@ -606,14 +600,13 @@ function drawHistoryList(serviceId) {
         }
 
         const obj = _historyMap.get(serviceId).get('obj');
-        $('.history-table tr.on').removeClass('on');
-        $('.hs_' + serviceId).addClass('on');
+
         const drawObj = {...obj};
         const { event_list, phase_list } = obj;
 
         if (event_list && event_list.length) drawObj.event_list = [drawObj.event_list[0]];
         if (phase_list && phase_list.length) drawObj.phase_list = phase_list[0];
-        const bottomInfo = $('#evpBottomInfo');
+
         let str = '';
 
         event_list.forEach((event, idx)=>{
@@ -657,17 +650,17 @@ function getBottomListEl(obj, event, idx) {
         className = 'on';
     }
     let curSpd = '-';
-    if (event.cur_spd) { // 현재 스피드가 있을경우 천단위 콤마
+    if (event && event.cur_spd) { // 현재 스피드가 있을경우 천단위 콤마
         curSpd = event.cur_spd.toLocaleString();
     }
 
     let remDist = '-';
-    if (event.rem_dist) {// 남은 거리가 있을경우 천단위 콤마
+    if (event && event.rem_dist) {// 남은 거리가 있을경우 천단위 콤마
         remDist = event.rem_dist.toLocaleString();
     }
 
 
-    let clctDt = event.clct_dt.replace(/\:|\-|\.| /gi, '') //시간 기호(':', '-', ' ') 제거 후 값만 추출 하여 table 로우 ID 부여
+    let clctDt = event && event.clct_dt ? event.clct_dt.replace(/\:|\-|\.| /gi, '') : '-'; //시간 기호(':', '-', ' ') 제거 후 값만 추출 하여 table 로우 ID 부여
     let str = `<tr onclick="moveLocation('${obj.service_id}', this)" class="${className}" id="${obj.service_id}_${clctDt}">`
         +'<td>'+event.clct_dt+'</td>'
         +'<td>'+obj.region_name+'</td>'
@@ -915,7 +908,7 @@ function getIntTreeData(data) {
             let text = `<div style="display: flex; gap: 5px; align-items: center; font-size: 12px;">
                             <div id="int-status-${nodeid}" class="comm${intStatus}"></div>
                             <div class="int-name" title="${nodeid} ${name}" style="display: flex; gap: 5px;">
-                                <div style="width: 78px;">${nodeid}</div> 
+                                <div>${nodeid}</div> 
                                 <div>${name}</div>
                             </div>
                         </div>`;

+ 2 - 3
src/main/resources/static/js/worker.js

@@ -1,5 +1,4 @@
 "use strict"
-
 self.onmessage = (e)=> {
 
     console.log(e.data.message);
@@ -32,8 +31,8 @@ self.onmessage = (e)=> {
 
                 timer = setTimeout(()=>{
                     callEvpServiceList();
-                }, time - between)
-                postMessage(res);
+                }, time - between);
+                // postMessage(res);
             } else {
                 //에러발생
                 console.error(xhr.status, xhr.statusText); //응답상태와 응답 메시지 출력

+ 1 - 1
src/main/webapp/WEB-INF/jsp/common.jsp

@@ -1 +1 @@
-<%@ page import="org.springframework.core.env.Environment" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ page session="false" %>
<spring:eval var="kakaokey" expression="@environment.getProperty('kakaokey')" />
<script>
    var BTN_IMAGE_PATH = "/images/";
    var _signalInfoArr = [];
</script>
<base href="/">
<script src="//dapi.kakao.com/v2/maps/sdk.js?appkey=${kakaokey}&libraries=services,clusterer,drawing"></script>
+<%@ page import="org.springframework.core.env.Environment" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ page session="false" %>
<spring:eval var="kakaokey" expression="@environment.getProperty('kakao.key')" />
<script>
    var BTN_IMAGE_PATH = "/images/";
    var _signalInfoArr = [];
</script>
<base href="/">
<script src="//dapi.kakao.com/v2/maps/sdk.js?appkey=${kakaokey}&libraries=services,clusterer,drawing"></script>

+ 5 - 5
src/main/webapp/WEB-INF/jsp/main_new.jsp

@@ -104,7 +104,7 @@
                 <div id="tabCont02" class="tabContainer" style="display: none;">
                     <section class="section_01">
                         <h2 style="display: flex; justify-content: space-between;">긴급차량우선신호 서비스 현황 <span class="evp_tot_cnt" style="color: var(--red30); font-size: 12px;"></span></h2>
-                        <div class="gridArea" style="max-height: 175px">
+                        <div class="gridArea" style="height: calc(100% - 38px);">
                             <table class="tableBody">
                                 <caption>테이블 내용 요약</caption>
                                 <colgroup>
@@ -128,7 +128,7 @@
                         <!--//gridArea end -->
                     </section>
 
-                    <section class="section_02" style="overflow: hidden">
+                    <section class="section_02" style="overflow: hidden; border-top: 1px solid var(--gray40);">
                         <h2>긴급차량우선신호 서비스 이력</h2>
 
                         <div class="formArea">
@@ -264,15 +264,15 @@
                         <table id="evpBottomBodyTable" class="tableBody" style="display: none;">
                             <thead>
                             <tr>
-                                <th style="width:10%">수집시각</th>
+                                <th style="width:12%">수집시각</th>
                                 <th style="width:10%">지역명</th>
                                 <th style="width:15%">서비스 ID</th>
                                 <th style="width:15%">서비스명</th>
                                 <th style="width:10%">긴급차량번호</th>
                                 <th style="width:10%">X 좌표</th>
                                 <th style="width:10%">Y 좌표</th>
-                                <th style="width:10%">속도(km/h)</th>
-                                <th style="width:10%">남은거리(m)</th>
+                                <th style="width:9%">속도(km/h)</th>
+                                <th style="width:9%">남은거리(m)</th>
                             </tr>
                             </thead>
                             <tbody id="evpBottomInfo"></tbody>