Browse Source

ibatis update

shjung 3 years ago
parent
commit
93efa77e94
37 changed files with 774 additions and 289 deletions
  1. 0 1
      conf/vds-comm-server.pid
  2. 3 2
      src/main/java/com/its/vds/config/ProcessConfig.java
  3. 14 8
      src/main/java/com/its/vds/dao/mapper/BatchDaoService.java
  4. 90 0
      src/main/java/com/its/vds/dao/mapper/batch/VdsCtlrDao.java
  5. 90 0
      src/main/java/com/its/vds/dao/mapper/batch/VdsDtctDao.java
  6. 11 2
      src/main/java/com/its/vds/entity/TbVdsCtlr.java
  7. 1 1
      src/main/java/com/its/vds/entity/voVdsDtctClct.java
  8. 2 0
      src/main/java/com/its/vds/global/AppRepository.java
  9. 0 6
      src/main/java/com/its/vds/process/AbstractDbmsJobProcess.java
  10. 30 38
      src/main/java/com/its/vds/process/DbmsJobProcess.java
  11. 47 32
      src/main/java/com/its/vds/scheduler/SchedulerTask.java
  12. 33 23
      src/main/java/com/its/vds/service/VdsCtlrService.java
  13. 2 6
      src/main/java/com/its/vds/webapp/controller/WebAppController.java
  14. 31 5
      src/main/java/com/its/vds/xnettcp/center/handler/CenterTcpServerInboundHandler.java
  15. 13 0
      src/main/java/com/its/vds/xnettcp/center/protocol/CenterResProtocol.java
  16. 8 16
      src/main/java/com/its/vds/xnettcp/vds/VdsTcpClient.java
  17. 2 1
      src/main/java/com/its/vds/xnettcp/vds/VdsTcpClientCommService.java
  18. 15 9
      src/main/java/com/its/vds/xnettcp/vds/codec/VdsTcpClientDecoder.java
  19. 4 4
      src/main/java/com/its/vds/xnettcp/vds/codec/VdsTcpClientEncoder.java
  20. 21 9
      src/main/java/com/its/vds/xnettcp/vds/handler/VdsTcpClientIdleHandler.java
  21. 9 1
      src/main/java/com/its/vds/xnettcp/vds/process/Job_ACK.java
  22. 66 12
      src/main/java/com/its/vds/xnettcp/vds/process/Job_Data.java
  23. 17 17
      src/main/java/com/its/vds/xnettcp/vds/process/Job_Image.java
  24. 9 1
      src/main/java/com/its/vds/xnettcp/vds/process/Job_NAK.java
  25. 6 4
      src/main/java/com/its/vds/xnettcp/vds/process/Job_Temperature.java
  26. 6 2
      src/main/java/com/its/vds/xnettcp/vds/process/VdsDataProcess.java
  27. 2 1
      src/main/java/com/its/vds/xnettcp/vds/protocol/VdsReqRTC.java
  28. 2 2
      src/main/java/com/its/vds/xnettcp/vds/protocol/VdsResFramePacket.java
  29. 2 2
      src/main/resources/application.yml
  30. 4 6
      src/main/resources/logback-spring.xml
  31. 88 0
      src/main/resources/mybatis/mapper/VdsCtlrMapper.xml
  32. 112 41
      src/main/resources/mybatis/mapper/VdsDtctMapper.xml
  33. 27 27
      src/main/resources/mybatis/mapper/VdsStatMapper.xml
  34. 3 0
      src/main/webapp/WEB-INF/jsp/controller.jsp
  35. 1 1
      src/main/webapp/WEB-INF/jsp/head.jsp
  36. 1 1
      src/main/webapp/WEB-INF/jsp/header.jsp
  37. 2 8
      src/main/webapp/WEB-INF/jsp/system.jsp

+ 0 - 1
conf/vds-comm-server.pid

@@ -1 +0,0 @@
-10764

+ 3 - 2
src/main/java/com/its/vds/config/ProcessConfig.java

@@ -22,9 +22,10 @@ public class ProcessConfig {
     private String bootingDateTime;
     private boolean startSchedule;
 
-    private String id = "VDS01x";
-    private String name = "VDS Communication Serverx";
+    private String id = "VDS01";
+    private String name = "VDS Communication Server";
     private boolean history = true;
+    private boolean statistics = true;
 
     private String userId = "admin";
     private String userPswd = "1234";

+ 14 - 8
src/main/java/com/its/vds/dao/mapper/BatchDaoService.java

@@ -63,12 +63,15 @@ public abstract class BatchDaoService {
     }
 
     public int insertBatch(String mapper, List<HashMap<String, Object>> lists) {
-        log.info("{}.insertBatch: {}: START.", this.serviceName, mapper);
-
+        //log.info("{}.insertBatch: {}: START.", this.serviceName, mapper);
         this.mapper = mapper;
         String mapperName = this.mapperName + this.mapper;
-        Elapsed elapsed = new Elapsed();
+        //Elapsed elapsed = new Elapsed();
         int total = lists.size();
+        if (total == 0) {
+            log.info("{}.insertBatch: {}: Data size zero.", this.serviceName, mapper);
+            return 0;
+        }
         int jobCnt = 0;
         SqlSession sqlSession = null;
         try {
@@ -89,17 +92,20 @@ public abstract class BatchDaoService {
             }
         }
         this.count = total;
-        log.info("{}.insertBatch: {}: ..END. {} EA. {} ms.", this.serviceName, mapper, total, elapsed.milliSeconds());
+        //log.info("{}.insertBatch: {}: ..END. {} EA. {} ms.", this.serviceName, mapper, total, elapsed.milliSeconds());
         return this.count;
     }
 
     public int updateBatch(String mapper, List<HashMap<String, Object>> lists) {
-        log.info("{}.updateBatch: {}: START.", this.serviceName, mapper);
-
+        //log.info("{}.updateBatch: {}: START.", this.serviceName, mapper);
         this.mapper = mapper;
         String mapperName = this.mapperName + this.mapper;
-        Elapsed elapsed = new Elapsed();
+        //Elapsed elapsed = new Elapsed();
         int total = lists.size();
+        if (total == 0) {
+            log.info("{}.updateBatch: {}: Data size zero.", this.serviceName, mapper);
+            return 0;
+        }
         int jobCnt = 0;
         SqlSession sqlSession = null;
         try {
@@ -120,7 +126,7 @@ public abstract class BatchDaoService {
             }
         }
         this.count = total;
-        log.info("{}.updateBatch: {}: ..END. {} EA. {} ms.", this.serviceName, mapper, total, elapsed.milliSeconds());
+        //log.info("{}.updateBatch: {}: ..END. {} EA. {} ms.", this.serviceName, mapper, total, elapsed.milliSeconds());
         return this.count;
     }
 

+ 90 - 0
src/main/java/com/its/vds/dao/mapper/batch/VdsCtlrDao.java

@@ -0,0 +1,90 @@
+package com.its.vds.dao.mapper.batch;
+
+import com.its.app.utils.Elapsed;
+import com.its.vds.dao.mapper.BatchDaoService;
+import com.its.vds.entity.TbVdsCtlrStts;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@Slf4j
+@Repository
+public class VdsCtlrDao extends BatchDaoService {
+
+    public VdsCtlrDao(SqlSessionFactory sqlSessionFactory) {
+        super(sqlSessionFactory);
+        this.serviceName = "VdsCtlrDao";
+        this.mapperName  = "";//com.its.vds.dao.mapper.VdsCtlrMapper.";
+    }
+
+    public List<HashMap<String, Object>> getSttsList(List<TbVdsCtlrStts> req) {
+        List<HashMap<String, Object>> lists = new ArrayList<>();
+        req.forEach(obj -> {
+            HashMap<String, Object> param = new HashMap<>();
+            param.put("VDS_CTLR_NMBR",     obj.getVDS_CTLR_NMBR());
+            param.put("UPDT_DT",           obj.getUPDT_DT());
+            param.put("CMNC_STTS_CD",      obj.getCMNC_STTS_CD());
+            param.put("PRNT_PWER_STTS_CD", obj.getPRNT_PWER_STTS_CD());
+            param.put("CBOX_DOOR_STTS_CD", obj.getCBOX_DOOR_STTS_CD());
+            param.put("FAN_STTS_CD",       obj.getFAN_STTS_CD());
+            param.put("HETR_STTS_CD",      obj.getHETR_STTS_CD());
+            param.put("SUB_CTLR_VAL",      obj.getSUB_CTLR_VAL());
+            param.put("CBOX_TMPR",         obj.getCBOX_TMPR());
+            param.put("INPT_VOLT",         obj.getINPT_VOLT());
+            param.put("PRNT_VOLT",         obj.getPRNT_VOLT());
+            lists.add(param);
+        });
+        return lists;
+    }
+
+    public int updateStts(List<TbVdsCtlrStts> req, boolean isHistory) {
+        log.info("{}.updateStts: START. {} EA. History {}", this.serviceName, req.size(), isHistory);
+        Elapsed elapsed = new Elapsed();
+        int total = 0;
+        SqlSession sqlSession = null;
+        try {
+            sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH, false);
+
+            this.mapper = this.mapperName + "batchUpdateVdsCtlrStts";
+            total += updateBatch(this.mapper, getSttsList(req));
+
+            sqlSession.commit();
+        }
+        finally {
+            if (sqlSession != null) {
+                sqlSession.close();
+            }
+        }
+        log.info("{}.updateStts: ..END. {} EA. {} ms.", this.serviceName, total, elapsed.milliSeconds());
+        return total;
+    }
+
+    public int insertStts(List<TbVdsCtlrStts> req) {
+        log.info("{}.insertStts: START. {} EA.", this.serviceName, req.size());
+        Elapsed elapsed = new Elapsed();
+        int total = 0;
+        SqlSession sqlSession = null;
+        try {
+            sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH, false);
+
+            this.mapper = this.mapperName + "batchInsertVdsCtlrSttsHs";
+            total += insertBatch(this.mapper, getSttsList(req));
+
+            sqlSession.commit();
+        }
+        finally {
+            if (sqlSession != null) {
+                sqlSession.close();
+            }
+        }
+        log.info("{}.insertStts: ..END. {} EA. {} ms.", this.serviceName, total, elapsed.milliSeconds());
+        return total;
+    }
+
+}

+ 90 - 0
src/main/java/com/its/vds/dao/mapper/batch/VdsDtctDao.java

@@ -0,0 +1,90 @@
+package com.its.vds.dao.mapper.batch;
+
+import com.its.app.utils.Elapsed;
+import com.its.vds.dao.mapper.BatchDaoService;
+import com.its.vds.entity.voVdsDtctClct;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+@Slf4j
+@Repository
+public class VdsDtctDao extends BatchDaoService {
+
+    public VdsDtctDao(SqlSessionFactory sqlSessionFactory) {
+        super(sqlSessionFactory);
+        this.serviceName = "VdsDtctDao";
+        this.mapperName  = "";//com.its.vds.dao.mapper.VdsDtctMapper.";
+    }
+
+    public List<HashMap<String, Object>> getClctList(List<voVdsDtctClct> req) {
+        List<HashMap<String, Object>> lists = new ArrayList<>();
+        req.forEach(obj -> {
+            HashMap<String, Object> param = new HashMap<>();
+            param.put("VDS_DTCT_NMBR",  obj.getVDS_DTCT_NMBR());
+            param.put("CLCT_DT",        obj.getCLCT_DT());
+            param.put("SYST_KIND_DVSN", obj.getSYST_KIND_DVSN());
+            param.put("TFVL",           obj.getTFVL());
+            param.put("SPED",           obj.getSPED());
+            param.put("AVRG_OCPY_RATE", obj.getAVRG_OCPY_RATE());
+            param.put("AVRG_LNGT",      obj.getAVRG_LNGT());
+            param.put("HDWY",           obj.getHDWY());
+            param.put("SPCE_OCPY_RATE", obj.getSPCE_OCPY_RATE());
+            param.put("SPCE_AVRG_SPED", obj.getSPCE_AVRG_SPED());
+
+            lists.add(param);
+        });
+        return lists;
+    }
+
+    public int updateClct(List<voVdsDtctClct> req, boolean isHistory) {
+        log.info("{}.updateStts: START. {} EA. History {}", this.serviceName, req.size(), isHistory);
+        Elapsed elapsed = new Elapsed();
+        int total = 0;
+        SqlSession sqlSession = null;
+        try {
+            sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH, false);
+
+            this.mapper = this.mapperName + "batchUpdateVdsDtctClctPnst";
+            total += updateBatch(this.mapper, getClctList(req));
+
+            sqlSession.commit();
+        }
+        finally {
+            if (sqlSession != null) {
+                sqlSession.close();
+            }
+        }
+        log.info("{}.updateStts: ..END. {} EA. {} ms.", this.serviceName, total, elapsed.milliSeconds());
+        return total;
+    }
+
+    public int insertClct(List<voVdsDtctClct> req) {
+        log.info("{}.insertStts: START. {} EA.", this.serviceName, req.size());
+        Elapsed elapsed = new Elapsed();
+        int total = 0;
+        SqlSession sqlSession = null;
+        try {
+            sqlSession = this.sqlSessionFactory.openSession(ExecutorType.BATCH, false);
+
+            this.mapper = this.mapperName + "batchInsertVdsDtctClct";
+            total += insertBatch(this.mapper, getClctList(req));
+
+            sqlSession.commit();
+        }
+        finally {
+            if (sqlSession != null) {
+                sqlSession.close();
+            }
+        }
+        log.info("{}.insertStts: ..END. {} EA. {} ms.", this.serviceName, total, elapsed.milliSeconds());
+        return total;
+    }
+
+}

+ 11 - 2
src/main/java/com/its/vds/entity/TbVdsCtlr.java

@@ -68,6 +68,13 @@ public class TbVdsCtlr {
 	private int imageSize;
 	private ByteBuffer imageBuffer;
 
+	public void initDtctClct() {
+		for (Map.Entry<String, TbVdsDtct> e : this.vdsDtctMap.entrySet()) {
+			TbVdsDtct tmp = e.getValue();
+			tmp.getClct().initVal();
+		}
+	}
+
 	public void addImageData(byte[] imageData) {
 		if (imageData == null) {
 			return;
@@ -230,13 +237,15 @@ public class TbVdsCtlr {
 			f.awaitUninterruptibly();
 			if (f.isDone() || f.isSuccess()) {
 				result = true;
-				log.info("SEND_0: [{}], {}: {} sendBytes. [{}]", this.VDS_CTLR_IP, packetDesc, sendBuffer.array().length, this.VDS_CTLR_ID);
+				log.info("[{}]. sendData: OK. {}, {} Bytes.", this.VDS_CTLR_ID, packetDesc, sendBuffer.array().length);
 				if (delayMilliSeconds > 0) {
 					VdsProtocol.sleep(delayMilliSeconds);
 				}
 			} else {
-				log.error("SEND_0: [{}], {}: {} sendBytes, Failed. [{}]", this.VDS_CTLR_IP, packetDesc, sendBuffer.array().length, this.VDS_CTLR_ID);
+				log.error("[{}]. sendData: Failed. {}, {} Bytes.", this.VDS_CTLR_ID, packetDesc, sendBuffer.array().length);
 			}
+		} else {
+			log.error("[{}]. sendData: Failed. Not Connected. {}, {} Bytes.", this.VDS_CTLR_ID, packetDesc, sendBuffer.array().length);
 		}
 		return result;
 	}

+ 1 - 1
src/main/java/com/its/vds/entity/voVdsDtctClct.java

@@ -26,7 +26,7 @@ public class voVdsDtctClct {
 	public voVdsDtctClct() {
 		this.VDS_DTCT_NMBR  = "";
 		this.CLCT_DT        = "";
-		this.SYST_KIND_DVSN = "";
+		this.SYST_KIND_DVSN = "0";
 
 		initVal();
 	}

+ 2 - 0
src/main/java/com/its/vds/global/AppRepository.java

@@ -16,6 +16,7 @@ public class AppRepository {
 
     public ConcurrentHashMap<String, TbVdsCtlr> ctlrMap = null;
     public ConcurrentHashMap<String, TbVdsCtlr> ctlrIpMap = null;
+    public ConcurrentHashMap<String, TbVdsCtlr> ctlrKeyMap = null;
     public ConcurrentHashMap<Channel, TbVdsCtlr> ctlrChannelMap = null;
 
     public static AppRepository getInstance() {
@@ -31,6 +32,7 @@ public class AppRepository {
     public AppRepository() {
         this.ctlrMap = new ConcurrentHashMap<>();
         this.ctlrIpMap = new ConcurrentHashMap<>();
+        this.ctlrKeyMap = new ConcurrentHashMap<>();
         this.ctlrChannelMap = new ConcurrentHashMap<>();
     }
 

+ 0 - 6
src/main/java/com/its/vds/process/AbstractDbmsJobProcess.java

@@ -97,18 +97,12 @@ public abstract class AbstractDbmsJobProcess {
     }
 
     public void runJob(DbmsJobData dbmsJobData) {
-
-        //log.info("AbstractDbmsJobProcess.runJob: type: {}, {}", dbmsJobData.getType(), Thread.currentThread().getName());
-
         if (dbmsJobData.getType() == DbmsJobType.DATA_TYPE_UNIT_SYST_STTS) {
-
-            // UNIT 상태정보 관리는 라이브러리에서 수행한다.
             TbUnitSystStts stts = (TbUnitSystStts)dbmsJobData.getData();
             this.unitSystMapper.updateUnitSystStts(stts);       // 상태정보 업데이트
             if (dbmsJobData.isHistory()) {
                 this.unitSystMapper.insertUnitSystSttsHs(stts); // 상태정보 이력저장
             }
-
         }
         else {
             process(dbmsJobData);

+ 30 - 38
src/main/java/com/its/vds/process/DbmsJobProcess.java

@@ -1,34 +1,38 @@
 package com.its.vds.process;
 
-import com.its.app.AppUtils;
 import com.its.vds.dao.mapper.UnitSystMapper;
 import com.its.vds.dao.mapper.VdsCtlrMapper;
 import com.its.vds.dao.mapper.VdsDtctMapper;
 import com.its.vds.dao.mapper.VdsStatMapper;
+import com.its.vds.dao.mapper.batch.VdsCtlrDao;
+import com.its.vds.dao.mapper.batch.VdsDtctDao;
 import com.its.vds.entity.TbVdsCtlrStts;
 import com.its.vds.entity.voVdsDtctClct;
-import com.its.vds.entity.voVdsDtctStts;
-import com.its.vds.entity.voVdsDtctVehClct;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 
 @Slf4j
+@RequiredArgsConstructor
 @Service
 public class DbmsJobProcess extends AbstractDbmsJobProcess {
 
-    private UnitSystMapper unitSystMapper;
-    private VdsCtlrMapper vdsCtlrMapper;
-    private VdsDtctMapper vdsDtctMapper;
-    private VdsStatMapper vdsStatMapper;
+    private final VdsCtlrDao vdsCtlrDao;
+    private final VdsDtctDao vdsDtctDao;
+
+    private final UnitSystMapper unitSystMapper;
+    private final VdsCtlrMapper vdsCtlrMapper;
+    private final VdsDtctMapper vdsDtctMapper;
+    private final VdsStatMapper vdsStatMapper;
 
     @Override
     protected void postConstruct() {
-        this.unitSystMapper = (UnitSystMapper) AppUtils.getBean(UnitSystMapper.class);
-        this.vdsCtlrMapper = (VdsCtlrMapper) AppUtils.getBean(VdsCtlrMapper.class);
-        this.vdsDtctMapper = (VdsDtctMapper) AppUtils.getBean(VdsDtctMapper.class);
-        this.vdsStatMapper = (VdsStatMapper) AppUtils.getBean(VdsStatMapper.class);
+//        this.unitSystMapper = (UnitSystMapper) AppUtils.getBean(UnitSystMapper.class);
+//        this.vdsCtlrMapper = (VdsCtlrMapper) AppUtils.getBean(VdsCtlrMapper.class);
+//        this.vdsDtctMapper = (VdsDtctMapper) AppUtils.getBean(VdsDtctMapper.class);
+//        this.vdsStatMapper = (VdsStatMapper) AppUtils.getBean(VdsStatMapper.class);
     }
 
     @Override
@@ -38,40 +42,28 @@ public class DbmsJobProcess extends AbstractDbmsJobProcess {
             switch(type) {
                 case DbmsJobType.DATA_TYPE_CTLR_STTS:
                     List<TbVdsCtlrStts> ctlrSttsList = (List<TbVdsCtlrStts>)data.getData();
-                    for (TbVdsCtlrStts vo : ctlrSttsList) {
-                        log.debug("CTLR_STTS: {}", vo.toString());
-                        this.vdsCtlrMapper.updateVdsCtlrStts(vo);   // 상태정보 업데이트
-                        if (data.isHistory()) {
-                            this.vdsCtlrMapper.insertVdsCtlrSttsHs(vo); // 상태정보 이력저장
-                        }
+                    this.vdsCtlrDao.updateStts(ctlrSttsList, data.isHistory());
+                    if (data.isHistory()) {
+                        this.vdsCtlrDao.insertStts(ctlrSttsList);
                     }
+//                    for (TbVdsCtlrStts vo : ctlrSttsList) {
+//                        this.vdsCtlrMapper.updateVdsCtlrStts(vo);   // 상태정보 업데이트
+//                        if (data.isHistory()) {
+//                            this.vdsCtlrMapper.insertVdsCtlrSttsHs(vo); // 상태정보 이력저장
+//                        }
+//                    }
                     ctlrSttsList.clear();
                     break;
                 case DbmsJobType.DATA_TYPE_DTCT_CLCT:
                     List<voVdsDtctClct> dtctClctList = (List<voVdsDtctClct>)data.getData();
-                    for (voVdsDtctClct vo : dtctClctList) {
-                        log.debug("DTCT_CLCT: {}", vo.toString());
-                        this.vdsDtctMapper.updateVdsDtctClctPnst(vo);   // 수집정보 업데이트
-                        this.vdsDtctMapper.insertVdsDtctClct(vo);       // 수집정보 이력저장
-                    }
+                    this.vdsDtctDao.updateClct(dtctClctList, data.isHistory());
+                    this.vdsDtctDao.insertClct(dtctClctList);
+//                    for (voVdsDtctClct vo : dtctClctList) {
+//                        this.vdsDtctMapper.updateVdsDtctClctPnst(vo);   // 수집정보 업데이트
+//                        this.vdsDtctMapper.insertVdsDtctClct(vo);       // 수집정보 이력저장
+//                    }
                     dtctClctList.clear();
                     break;
-                case DbmsJobType.DATA_TYPE_DTCT_STTS:
-                    List<voVdsDtctStts> dtctSttsList = (List<voVdsDtctStts>)data.getData();
-                    for (voVdsDtctStts vo : dtctSttsList) {
-                        log.debug("DTCT_STTS: {}", vo.toString());
-                        //this.vdsDtctMapper.updateVdsDtctStts(vo);       // 검지기 상태정보 업데이트
-                    }
-                    dtctSttsList.clear();
-                    break;
-                case DbmsJobType.DATA_TYPE_VEH_CLCT:
-                    List<voVdsDtctVehClct> vehClctList = (List<voVdsDtctVehClct>)data.getData();
-                    for (voVdsDtctVehClct vo : vehClctList) {
-                        log.debug("VEH_CLCT: {}", vo.toString());
-                        //this.vdsDtctMapper.insertVdsDtctVehClct(vo);     // 차량 수집정보 이력저장
-                    }
-                    vehClctList.clear();
-                    break;
             }
         } catch (Exception e) {
             log.error("DbmsJobProcess.process: Exception: {}", e.toString());

+ 47 - 32
src/main/java/com/its/vds/scheduler/SchedulerTask.java

@@ -2,6 +2,7 @@ package com.its.vds.scheduler;
 
 import com.its.app.AppUtils;
 import com.its.app.utils.Elapsed;
+import com.its.app.utils.StatisticsTime;
 import com.its.vds.config.ProcessConfig;
 import com.its.vds.service.StatisticsServices;
 import com.its.vds.service.UnitSystService;
@@ -25,7 +26,7 @@ public class SchedulerTask {
     private final VdsCtlrService vdsCtlrService;
     private final StatisticsServices statisticsServices;
 
-    @Scheduled(cron = "4 * * * * *")  // 1분주기 작업 실행
+    @Scheduled(cron = "6 * * * * *")  // 1분주기 작업 실행(매분 6초)
     public void UnitSystSchedule() {
         if (!this.processConfig.isStartSchedule()) {
             return;
@@ -39,20 +40,33 @@ public class SchedulerTask {
         log.info("         UnitSystSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
-    @Scheduled(cron = "10/30 * * * * *")    // 30초마다 요청(10초, 40초)
+    @Scheduled(cron = "15 1 0/1 * * *")    // 매시 1분 15초
+    public void VdsRTCSchedule() {
+        if (!this.processConfig.isStartSchedule()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("VdsRTCSchedule: start. {}", Thread.currentThread().getName());
+        // 온도정보(온도/입력전압/출력전압) 요청
+        // 제어기 동기화 요청
+        this.vdsCtlrService.requestRTC();
+        log.info("VdsRTCSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
+    @Scheduled(cron = "4/30 * * * * *")    // 30초마다 요청(4초, 34초)
     public void VdsSynchronizationSchedule() {
         if (!this.processConfig.isStartSchedule()) {
             return;
         }
         Elapsed elapsed = new Elapsed();
         log.info("VdsSynchronizationSchedule: start. {}", Thread.currentThread().getName());
+        // 온도정보(온도/입력전압/출력전압) 요청
         // 제어기 동기화 요청
-        // 교통데이터 요청
         this.vdsCtlrService.requestSynchronization();
         log.info("VdsSynchronizationSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
-    @Scheduled(cron = "15/30 * * * * *")    // 30초마다 요청(15초, 45초)
+    @Scheduled(cron = "9/30 * * * * *")    // 30초마다 요청(9초, 39초)
     public void VdsDataRequestSchedule() {
         if (!this.processConfig.isStartSchedule()) {
             return;
@@ -73,43 +87,44 @@ public class SchedulerTask {
         Elapsed elapsed = new Elapsed();
         log.info("       StatisticsSchedule: start. {}", Thread.currentThread().getName());
         ProcessConfig processConfig = (ProcessConfig) AppUtils.getBean(ProcessConfig.class);
-//        if (applicationConfig.getTaskStatistics().equals("true")) {
-//            StatisticsTime its = new StatisticsTime();
-//            its.init();
-//            its.setProcessing(true);
-//
+        if (processConfig.isStatistics()) {
+            StatisticsTime its = new StatisticsTime();
+            its.init();
+            its.setProcessing(true);
+
 //            if (true) {
 //                // VDS 검지기 5분 가공
 //                this.statisticsServices.CRT_TB_VDS_DTCT_HS(its.getPrcsFiveMin(), its.getPrcsFiveMinFrom(), its.getPrcsFiveMinTo());
 //            }
-//
-//            if (its.isStat15Min()) {
-//                // 5분 정주기 가공이 끝나고 15분 주기일 경우(00, 15, 30, 45 분 일경우 15분 통계 정보를 생성한다)
-//                this.statisticsServices.CRT_TB_VDS_DTCT_15M_STAT(its.getStat15MinFrom(), its.getStat15MinFrom(), its.getStat15MinTo());
-//            }
-//
-//            if (its.isStatHour()) {
-//                // 매시 5분 가공완료후 1시간 통계
-//                this.statisticsServices.CRT_TB_VDS_DTCT_HH_STAT(its.getStatHourTime(), its.getStatHourTime(), its.getStatHourTo());
-//            }
-//
-//            if (its.isStatDay()) {
-//                // 00시 10분 가공이 끝나면 이전일의 통계 정보를 가공.
-//                this.statisticsServices.CRT_TB_VDS_DTCT_DD_STAT(its.getStatDayFrom(), its.getStatDayFrom(), its.getStatDayTo());
-//            }
-//
-//            if (its.isStatMon()) {
-//                //  02시 10분 가공이 끝나면 이전일의 월통계 정보를 누적 가공.
-//                String STAT_DT = its.getStatMonFrom().substring(0, 6) + "00000000";
-//                this.statisticsServices.CRT_TB_VDS_DTCT_MN_STAT(STAT_DT, its.getStatMonFrom(), its.getStatMonTo());
-//            }
+
+            if (its.isStat15Min()) {
+                // 5분 정주기 가공이 끝나고 15분 주기일 경우(00, 15, 30, 45 분 일경우 15분 통계 정보를 생성한다)
+                this.statisticsServices.CRT_TB_VDS_DTCT_15M_STAT(its.getStat15MinFrom(), its.getStat15MinFrom(), its.getStat15MinTo());
+            }
+
+            if (its.isStatHour()) {
+                // 매시 5분 가공완료후 1시간 통계
+                this.statisticsServices.CRT_TB_VDS_DTCT_HH_STAT(its.getStatHourTime(), its.getStatHourTime(), its.getStatHourTo());
+            }
+
+            if (its.isStatDay()) {
+                // 00시 10분 가공이 끝나면 이전일의 통계 정보를 가공.
+                this.statisticsServices.CRT_TB_VDS_DTCT_DD_STAT(its.getStatDayFrom(), its.getStatDayFrom(), its.getStatDayTo());
+            }
+
+            if (its.isStatMon()) {
+                //  02시 10분 가공이 끝나면 이전일의 월통계 정보를 누적 가공.
+                String STAT_DT = its.getStatMonFrom().substring(0, 6) + "00000000";
+                this.statisticsServices.CRT_TB_VDS_DTCT_MN_STAT(STAT_DT, its.getStatMonFrom(), its.getStatMonTo());
+            }
+
 //            if (its.isStatYear()) {
 //                // 02시 35분 가공이 끝나면 이전일의 연통계 정보를 누적 가공.
 //                String STAT_DT = its.getStatYearFrom().substring(0, 4) + "0000000000";
 //                this.statisticsServices.CRT_TB_VDS_DTCT_YY_STAT(STAT_DT, its.getStatYearFrom(), its.getStatYearTo());
 //            }
-//            its.setProcessing(false);
-//        }
+            its.setProcessing(false);
+        }
         log.info("       StatisticsSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 

+ 33 - 23
src/main/java/com/its/vds/service/VdsCtlrService.java

@@ -12,6 +12,7 @@ import com.its.vds.global.AppRepository;
 import com.its.vds.process.DbmsJobData;
 import com.its.vds.process.DbmsJobProcess;
 import com.its.vds.process.DbmsJobType;
+import com.its.vds.xnettcp.vds.protocol.VdsReqRTC;
 import com.its.vds.xnetudp.protocol.CENTER_VDS_RES_STATE;
 import com.its.vds.xnetudp.protocol.voVdsState;
 import lombok.extern.slf4j.Slf4j;
@@ -84,6 +85,9 @@ public class VdsCtlrService {
 
                     AppRepository.getInstance().getCtlrMap().put(obj.getVDS_CTLR_NMBR(), obj);
                     AppRepository.getInstance().getCtlrIpMap().put(obj.getVDS_CTLR_IP(), obj);
+
+                    // TODO
+                    AppRepository.getInstance().getCtlrKeyMap().put(obj.getVDS_CTLR_IP() + ":" + obj.getVDS_CTLR_PORT(), obj);
                 }
             }
         }
@@ -248,23 +252,18 @@ public class VdsCtlrService {
                 obj.setSyncTime(curTime);
                 //frameNo = (byte)((min*60 + sec) / obj.getTRAF_CLCT_CYCL() + 1);
                 ByteBuffer sendBuffer = obj.getReqTemperature().getByteBuffer();
-                boolean result = obj.sendData(sendBuffer, 0, "vds_Temperature");
-                if (result) {
-                    log.info("[{}] [{}], vds_Temperature: Request OK.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                } else {
-                    log.info("[{}] [{}], vds_Temperature: Request Failed.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                }
+                obj.sendData(sendBuffer, 0, "vds_Temperature");
             } else {
-                log.info("[{}] [{}], vds_Temperature: Request Failed-Not Connected.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
+                log.info("[{}]. vds_Temperature: Request Failed. Not Connected. {}", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
             }
             MDC.remove(obj.getLogKey());
             MDC.clear();
         }
 
         try {
-            Thread.sleep(800);
+            Thread.sleep(500);
         } catch (InterruptedException e1) {
-            e1.printStackTrace();
+            log.error("requestSynchronization: InterruptedException");
         }
 
         /*
@@ -276,14 +275,9 @@ public class VdsCtlrService {
             if (obj.getChannel() != null) {
                 obj.setSyncTime(curTime);
                 ByteBuffer sendBuffer = obj.getReqSynchronize().getByteBuffer();
-                boolean result = obj.sendData(sendBuffer, 0, "vds_Synchronization");
-                if (result) {
-                    log.info("[{}] [{}], vds_Synchronization: Request OK.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                } else {
-                    log.info("[{}] [{}], vds_Synchronization: Request Failed.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                }
+                obj.sendData(sendBuffer, 0, "vds_Synchronization");
             } else {
-                log.info("[{}] [{}], vds_Synchronization: Request Failed-Not Connected.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
+                log.info("[{}]. vds_Synchronization: Request Failed. Not Connected. {}", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
             }
             MDC.remove(obj.getLogKey());
             MDC.clear();
@@ -301,14 +295,30 @@ public class VdsCtlrService {
             MDC.put("id", obj.getLogKey());
             if (obj.getChannel() != null) {
                 ByteBuffer sendBuffer = obj.getReqData().getByteBuffer();
-                boolean result = obj.sendData(sendBuffer, 0, "vds_Data");
-                if (result) {
-                    log.info("[{}] [{}], vds_Data: Request OK.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                } else {
-                    log.info("[{}] [{}], vds_Data: Request Failed.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
-                }
+                obj.sendData(sendBuffer, 0, "vds_Data");
+            } else {
+                log.info("[{}]. vds_Data: Request Failed. Not Connected. {}", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
+            }
+            MDC.remove(obj.getLogKey());
+            MDC.clear();
+        }
+    }
+
+    /**
+     * VDS 제어기 RTC 전송
+     */
+    public void requestRTC() {
+        TbVdsCtlr obj;
+        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
+            obj = e.getValue();
+            MDC.put("id", obj.getLogKey());
+            if (obj.getChannel() != null) {
+                VdsReqRTC reqRTC = new VdsReqRTC((short)obj.getGROUP_NO(), (short)obj.getVDS_CTLR_LOCAL_NO());
+                reqRTC.makeCRC();
+                ByteBuffer sendBuffer = reqRTC.getByteBuffer();
+                obj.sendData(sendBuffer, 0, "vds_RTC");
             } else {
-                log.info("[{}] [{}], vds_Data: Request Failed-Not Connected.", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
+                log.info("[{}]. vds_RTC: Request Failed. Not Connected. {}", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP());
             }
             MDC.remove(obj.getLogKey());
             MDC.clear();

+ 2 - 6
src/main/java/com/its/vds/webapp/controller/WebAppController.java

@@ -6,6 +6,7 @@ import com.its.vds.entity.TbVdsCtlr;
 import com.its.vds.global.AppRepository;
 import com.its.vds.webapp.service.FileService;
 import com.its.vds.xnettcp.vds.handler.VdsTcpClientIdleHandler;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Controller;
@@ -22,6 +23,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 
+@RequiredArgsConstructor
 @Slf4j
 @Controller
 public class WebAppController {
@@ -30,12 +32,6 @@ public class WebAppController {
     private final ProcessConfig processConfig;
     private final FileService fileService;
 
-    public WebAppController(ResourceLoader resourceLoader, ProcessConfig processConfig, FileService fileService) {
-        this.resourceLoader = resourceLoader;
-        this.processConfig = processConfig;
-        this.fileService = fileService;
-    }
-
     @RequestMapping(value = {"/controller"})
     public String controller(Model model, HttpServletRequest request) {
         String result = "controller";

+ 31 - 5
src/main/java/com/its/vds/xnettcp/center/handler/CenterTcpServerInboundHandler.java

@@ -5,10 +5,12 @@ import com.its.vds.domain.NET;
 import com.its.vds.entity.TbVdsCtlr;
 import com.its.vds.global.AppRepository;
 import com.its.vds.xnettcp.center.protocol.CenterReqFramePacket;
+import com.its.vds.xnettcp.center.protocol.CenterResProtocol;
 import com.its.vds.xnettcp.vds.protocol.VdsProtocol;
 import com.its.vds.xnettcp.vds.protocol.VdsReqFrameHead;
 import com.its.vds.xnettcp.vds.protocol.VdsReqImage;
 import com.its.vds.xnettcp.vds.protocol.VdsReqReset;
+import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
@@ -46,27 +48,51 @@ public class CenterTcpServerInboundHandler extends ChannelInboundHandlerAdapter
         }
         if (obj == null) {
             log.error("CenterTcpServerInboundHandler: Center Request Unknown VDS: [{}]", ctlrNo);
+            ByteBuffer sendBuffer = CenterResProtocol.getResponse(opCode, (byte)(0xFF));
+            ChannelFuture f = ctx.channel().writeAndFlush(sendBuffer);
+            f.awaitUninterruptibly();
+            if (f.isDone() || f.isSuccess()) {
+                log.info("CenterTcpServerInboundHandler: Response OK. Center Request Unknown VDS: [{}]", ctlrNo);
+            } else {
+                log.error("CenterTcpServerInboundHandler: Response Failed. Center Request Unknown VDS: [{}]", ctlrNo);
+            }
             return;
         }
         if (obj.getChannel() == null || obj.getNetState() == NET.CLOSED) {
             log.error("CenterTcpServerInboundHandler: Center Request VDS Not Connect: [{}]", obj);
-            //return;
+            ByteBuffer sendBuffer = CenterResProtocol.getResponse(opCode, (byte)(0xFE));
+            ChannelFuture f = ctx.channel().writeAndFlush(sendBuffer);
+            f.awaitUninterruptibly();
+            if (f.isDone() || f.isSuccess()) {
+                log.info("CenterTcpServerInboundHandler: Response OK. Center Not Connect VDS: [{}]", ctlrNo);
+            } else {
+                log.error("CenterTcpServerInboundHandler: Response Failed. Center Not Connect VDS: [{}]", ctlrNo);
+            }
+            return;
         }
 
         if (opCode == VdsProtocol.vds_Reset) {
+            ByteBuffer resultBuffer;
             VdsReqReset reqReset = new VdsReqReset((short)obj.getGROUP_NO(), (short)obj.getVDS_CTLR_LOCAL_NO());
             reqReset.makeCRC();
             ByteBuffer sendBuffer = reqReset.getByteBuffer();
             if (!obj.sendData(sendBuffer, 0, "vds_Reset")) {
                 log.error("CenterTcpServerInboundHandler: Center Request VDS Reset Data Send Failed: [{}]", obj);
+                resultBuffer = CenterResProtocol.getResponse(opCode, (byte)(0xFD));
+            } else {
+                resultBuffer = CenterResProtocol.getResponse(opCode, (byte)(0x00));
+            }
+            ChannelFuture f = ctx.channel().writeAndFlush(resultBuffer);
+            f.awaitUninterruptibly();
+            if (f.isDone() || f.isSuccess()) {
+                log.info("CenterTcpServerInboundHandler: Response OK. VDS Reset: [{}]", ctlrNo);
+            } else {
+                log.error("CenterTcpServerInboundHandler: Response Failed. VDS Reset: [{}]", ctlrNo);
             }
         }
         else if (opCode == VdsProtocol.vds_Image) {
             int frameNo = 0;    // first image request
-            byte cameraNo = centerReqHead.getBody()[9];
-            if (cameraNo == 0x00) {
-                cameraNo = 0x01;
-            }
+            byte cameraNo = (centerReqHead.getBody()[9] == (byte)0x00) ? (byte)0x01 : centerReqHead.getBody()[9];
             obj.setStopImageRequest(ctx.channel(), cameraNo, frameNo);
             VdsReqImage reqImage = new VdsReqImage((short)obj.getGROUP_NO(), (short)obj.getVDS_CTLR_LOCAL_NO());
             reqImage.setCameraNo(cameraNo);

+ 13 - 0
src/main/java/com/its/vds/xnettcp/center/protocol/CenterResProtocol.java

@@ -20,6 +20,19 @@ public class CenterResProtocol {
 
         return byteBuffer;
     }
+    public static ByteBuffer getResponse(byte opCode, byte result) {
+        ByteBuffer byteBuffer = ByteBuffer.allocate(10);
+        byteBuffer.order(ByteOrder.BIG_ENDIAN);
+        byteBuffer.put((byte)0x24); // 송신시스템-운영단말
+        byteBuffer.put((byte)0x04); // 수신시스템-VDS 서버
+        byteBuffer.put((byte)0x01); // 전체프레임개수
+        byteBuffer.put((byte)0x01); // 현재프레임번호
+        byteBuffer.put(result); // Reserved
+        byteBuffer.put(opCode);     // OP Code
+        byteBuffer.putInt(0);  // 데이터 길이
+
+        return byteBuffer;
+    }
 
     public static ByteBuffer getImageHeader2(int length) {
         ByteBuffer byteBuffer = ByteBuffer.allocate(172);

+ 8 - 16
src/main/java/com/its/vds/xnettcp/vds/VdsTcpClient.java

@@ -46,7 +46,7 @@ public class VdsTcpClient implements Callable<Object> {
         this.ipAddress = this.controller.getVDS_CTLR_IP();
         this.port = this.controller.getVDS_CTLR_PORT();
 
-        log.info("VdsTcpClient start: {}, {}", this.ipAddress, this.port);
+        log.info("[{}]. VdsTcpClient start: {}, {}", this.controller.getVDS_CTLR_ID(), this.ipAddress, this.port);
         if (this.bootstrap == null) {
             this.bootstrap = this.bootstrapFactory.createBootstrap();
             this.bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, this.commConfig.getConnectTimeout() * 1000);
@@ -70,7 +70,7 @@ public class VdsTcpClient implements Callable<Object> {
             });
         }
 
-        log.info("VDS Controller try connect: {}, {}", this.ipAddress, this.port);
+        log.info("[{}]. VDS Controller try connect: {}, {}", this.controller.getVDS_CTLR_ID(), this.ipAddress, this.port);
         if (this.channelFuture != null && this.channelFuture.channel() != null) {
             this.channelFuture.channel().close();
             this.channelFuture = null;
@@ -81,10 +81,10 @@ public class VdsTcpClient implements Callable<Object> {
         this.channelFuture.addListener(new ChannelFutureListener() {
             @Override public void operationComplete(ChannelFuture future) {
                 if (future.isSuccess()) {
-                    log.info("VDS Controller Channel open");
+                    //log.info("[{}]. VDS Controller Channel open");
                     channelOpen(future.channel());
                 } else {
-                    log.error("VDS Controller connectFailed: {}", future.cause().toString());
+                    log.error("[{}]. VDS Controller connectFailed: {}", controller.getVDS_CTLR_ID(), future.cause().toString());
                 }
             }
         });
@@ -104,22 +104,14 @@ public class VdsTcpClient implements Callable<Object> {
      * @param channel
      */
     protected void channelOpen(Channel channel) {
-        log.info("VDS Controller connected: channel {}", channel);
+        log.info("[{}]. VDS Controller connected: channel {}", this.controller.getVDS_CTLR_ID(), channel);
         TbVdsCtlr obj = this.controller;
         obj.channelOpen(channel);
 
         // 온도정보 요청
         ByteBuffer sendBuff;
-        sendBuff = obj.getReqSynchronize().getByteBuffer();
-        boolean result = obj.sendData(sendBuff, 500, "vds_Synchronization");
-        if (result) {
-            ByteBuffer sendBuff_ = obj.getReqData().getByteBuffer();
-            result = obj.sendData(sendBuff_, 500, "vds_Data");
-            if (result) {
-                ByteBuffer sendBuff__ = obj.getReqTemperature().getByteBuffer();
-                result = obj.sendData(sendBuff__, 500, "vds_Temperature");
-            }
-        }
+        sendBuff = obj.getReqTemperature().getByteBuffer();
+        obj.sendData(sendBuff, 0, "vds_Temperature");
     }
 
     /**
@@ -127,7 +119,7 @@ public class VdsTcpClient implements Callable<Object> {
      * @param channel
      */
     protected synchronized void channelClosed(Channel channel) {
-        log.error("VDS Controller closed: channel {}", channel);
+        log.error("[{}]. VDS Controller closed: channel {}", this.controller.getVDS_CTLR_ID(), channel);
         TbVdsCtlr obj = this.controller;
         if (obj.getChannel() != null) {
             // 연결 되어 있다가 종료 된 경우임....

+ 2 - 1
src/main/java/com/its/vds/xnettcp/vds/VdsTcpClientCommService.java

@@ -7,6 +7,7 @@ import com.its.vds.xnettcp.vds.process.VdsDataProcess;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
@@ -44,7 +45,7 @@ public class VdsTcpClientCommService {
          */
         for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
             TbVdsCtlr obj = e.getValue();
-            if ((obj.getDEL_YN() != null && obj.getDEL_YN().equals("N")) && (obj.getVALD_YN() != null && obj.getVALD_YN().equals("Y"))) {
+            if (StringUtils.equals("N", obj.getDEL_YN()) && StringUtils.equals("Y", obj.getVALD_YN())) {
                 VdsTcpClient vdsClient = new VdsTcpClient(obj, this.commConfig, this.vdsDataProcess, this.bootstrapFactory);
                 this.clientTasks.add(vdsClient);
             }

+ 15 - 9
src/main/java/com/its/vds/xnettcp/vds/codec/VdsTcpClientDecoder.java

@@ -26,7 +26,13 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
 
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
         Channel channel = ctx.channel();
-        TbVdsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
+
+        // TODO
+        int port = NettyUtils.getRemotePort(ctx.channel());
+        log.error("decode...........................................: {}, {}", ipAddress, port);
+        String objKey = ipAddress + ":" + Integer.toString(port);
+        TbVdsCtlr obj = AppRepository.getInstance().getCtlrKeyMap().get(objKey);
+        //TbVdsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         if (obj == null) {
             log.error("VdsTcpClientDecoder.decode: Unknown Controller IP: {}. will be close.", ipAddress);
             VdsTcpClientIdleHandler.disconnectChannel(channel);
@@ -34,7 +40,7 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
         }
 
         if (!channel.isOpen() || !channel.isActive()) {
-            log.error("VdsTcpClientDecoder.decode: {}, isOpen: {}, isActive: {}. [{}]", ipAddress, channel.isOpen(), channel.isActive(), obj.getLogKey());
+            log.error("[{}]. RECV: VdsTcpClientDecoder.decode: isOpen: {}, isActive: {}. [{}]", obj.getVDS_CTLR_ID(), channel.isOpen(), channel.isActive(), obj.getLogKey());
             VdsTcpClientIdleHandler.disconnectChannel(channel);
             return;
         }
@@ -42,12 +48,12 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
         MDC.put("id", obj.getLogKey());
         try {
             int readableBytes = byteBuf.readableBytes();
-            log.info("RECV_0: [{}]. ReadableBytes: {} Bytes, ReaderIndex: {}", ipAddress, readableBytes, byteBuf.readerIndex());
+            log.info("[{}]. RECV: ReadableBytes: {} Bytes, ReaderIndex: {}", obj.getVDS_CTLR_ID(), readableBytes, byteBuf.readerIndex());
 
             if (obj.isDump()) {
                 byte[] debugBytes = new byte[byteBuf.readableBytes()];
                 byteBuf.getBytes(byteBuf.readerIndex(), debugBytes);
-                log.info("RECV_0: [{}], {} Bytes. {}", ipAddress, debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
+                log.info("[{}]. RECV: {} Bytes. {}", obj.getVDS_CTLR_ID(), debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
             }
 
             byteBuf.markReaderIndex();
@@ -62,7 +68,7 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
             for (int readIdx = 0; readIdx < readableBytes; readIdx++) {
                 if (readIdx == 2) {
                     if (recvBytes[0] != VdsProtocol.vds_DLE || recvBytes[1] != VdsProtocol.vds_STX) {
-                        log.error("RECV_0: [{}]. DLE/STX Data Error. {}/{}", ipAddress, recvBytes[0], recvBytes[1]);
+                        log.error("[{}]. RECV: DLE/STX Data Error. {}/{}", obj.getVDS_CTLR_ID(), recvBytes[0], recvBytes[1]);
                         VdsTcpClientIdleHandler.disconnectChannel(channel);
                         return;
                     }
@@ -86,7 +92,7 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
                         // 하나의 패킷을 완전히 수신하지 못한 것임
                         if ((readIdx + 2) > (readableBytes)) {
                             // 하나의 패킷을 읽지 못함
-                            log.warn("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Data Remain.", ipAddress, readableBytes, readIdx);
+                            log.warn("[{}]. RECV: ReadableBytes: {} Bytes, ReadIndex: {}, DLE Data Remain.", obj.getVDS_CTLR_ID(), readableBytes, readIdx);
                             break;
                         }
                         packets[msgSize++] = recvBytes[readIdx+1];  // CRC1
@@ -99,16 +105,16 @@ public class VdsTcpClientDecoder extends ByteToMessageDecoder {
 
                         VdsResFramePacket frame = new VdsResFramePacket(obj, packets, msgSize);
                         if (frame.getHead().getOpCode() == VdsProtocol.vds_Image) {
-                            log.info("OneFramePacket: {} Bytes, vds_Image, stuffing {}", frame.getByteBuffer().array().length, stuffing);
+                            log.info("[{}]. RECV: OneFramePacket: {} Bytes, vds_Image, stuffing {}", obj.getVDS_CTLR_ID(), frame.getByteBuffer().array().length, stuffing);
                         } else {
-                            log.info("OneFramePacket: {} Bytes, stuffing {} {}", frame.getByteBuffer().array().length, stuffing, SysUtils.byteArrayToHex(frame.getByteBuffer().array()));
+                            log.info("[{}]. RECV: OneFramePacket: {} Bytes, stuffing {} {}", obj.getVDS_CTLR_ID(), frame.getByteBuffer().array().length, stuffing, SysUtils.byteArrayToHex(frame.getByteBuffer().array()));
                         }
 
                         list.add(frame);
                         break;
                     } else {
                         // DLE 다음에 와야할 데이터가 들어오지 않았다. 패킷에 오류가 발생함.
-                        log.error("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Next Data Recv Error.", ipAddress, readableBytes, readIdx);
+                        log.error("[{}]. RECV: ReadableBytes: {} Bytes, ReadIndex: {}, DLE Next Data Recv Error.", obj.getVDS_CTLR_ID(), readableBytes, readIdx);
                         VdsTcpClientIdleHandler.disconnectChannel(channel);
                         return;
                     }

+ 4 - 4
src/main/java/com/its/vds/xnettcp/vds/codec/VdsTcpClientEncoder.java

@@ -34,13 +34,13 @@ public class VdsTcpClientEncoder extends MessageToByteEncoder<Object> {
         }
 
         if (!channel.isOpen() || !channel.isActive()) {
-            log.error("VdsTcpClientEncoder.encode: {}, isOpen: {}, isActive: {}. [{}]", ipAddress, channel.isOpen(), channel.isActive(), obj.getLogKey());
+            log.error("[{}]. SEND: VdsTcpClientEncoder.encode: isOpen: {}, isActive: {}. [{}]", obj.getVDS_CTLR_ID(), channel.isOpen(), channel.isActive(), obj.getLogKey());
             VdsTcpClientIdleHandler.disconnectChannel(channel);
             return;
         }
 
         if (!(msg instanceof ByteBuffer)) {
-            log.error("VdsTcpClientEncoder.encode: {}, msg is not ByteBuffer. [{}]", ipAddress, obj.getLogKey());
+            log.error("[{}]. SEND: VdsTcpClientEncoder.encode: msg is not ByteBuffer. [{}]", obj.getVDS_CTLR_ID(), obj.getLogKey());
             VdsTcpClientIdleHandler.disconnectChannel(channel);
             return;
         }
@@ -50,9 +50,9 @@ public class VdsTcpClientEncoder extends MessageToByteEncoder<Object> {
         ByteBuffer buffer = (ByteBuffer)msg;
         byte[] sendBytes = buffer.array();
         outByteBuf.writeBytes(sendBytes);
-        log.info("SEND_P: [{}], SEND.{}, {} Bytes. [{}]", obj.getVDS_CTLR_IP(), VdsProtocol.getOpCodeName(sendBytes[VdsReqFrameHead.OPCODE_POS]), sendBytes.length, obj.getLogKey());
+        log.info("[{}]. SEND: {}, {} Bytes.", obj.getVDS_CTLR_ID(), VdsProtocol.getOpCodeName(sendBytes[VdsReqFrameHead.OPCODE_POS]), sendBytes.length);
         if (obj.isDump()) {
-            log.info("SEND: [{}], {} Bytes. {}", ipAddress, sendBytes.length, SysUtils.byteArrayToHex(sendBytes));
+            log.info("[{}]. SEND: {}, {} Bytes. {}", obj.getVDS_CTLR_ID(), VdsProtocol.getOpCodeName(sendBytes[VdsReqFrameHead.OPCODE_POS]), sendBytes.length, SysUtils.byteArrayToHex(sendBytes));
         }
 
         MDC.remove(obj.getLogKey());

+ 21 - 9
src/main/java/com/its/vds/xnettcp/vds/handler/VdsTcpClientIdleHandler.java

@@ -25,23 +25,23 @@ public class VdsTcpClientIdleHandler extends IdleStateHandler {
 
     @Override
     protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) {
+        String ID = "???";
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        log.warn("channelIdle: {}", ipAddress);
-
         TbVdsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         if (obj != null) {
             MDC.put("id", obj.getLogKey());
+            ID = obj.getVDS_CTLR_ID();
         }
         if (evt.state() == IdleState.ALL_IDLE) {
-            log.error("VdsTcpClientIdleHandler.------channelIdle: [{}], ALL_IDLE", ipAddress);
+            log.error("[{}]. IDLE: VdsTcpClientIdleHandler.------channelIdle: ALL_IDLE", ID);
             VdsTcpClientIdleHandler.disconnectChannel(ctx.channel());
         }
         else if (evt.state() == IdleState.READER_IDLE) {
-            log.warn("VdsTcpClientIdleHandler.------channelIdle: READER_IDLE, [{}]", ipAddress);
+            log.warn("[{}]. IDLE: VdsTcpClientIdleHandler.------channelIdle: READER_IDLE", ID);
             VdsTcpClientIdleHandler.disconnectChannel(ctx.channel());
         }
         else if (evt.state() == IdleState.WRITER_IDLE) {
-            log.warn("VdsTcpClientIdleHandler.------channelIdle: WRITER_IDLE, [{}]", ipAddress);
+            log.warn("[{}]. IDLE: VdsTcpClientIdleHandler.------channelIdle: WRITER_IDLE", ID);
         }
 
         if (obj != null) {
@@ -55,15 +55,17 @@ public class VdsTcpClientIdleHandler extends IdleStateHandler {
      */
     public static void disconnectChannel(Channel channel) {
         // 로그인 하지 않은 또는 비정상 접속 네트워크 세션 종료(로그인 처리를 수행하지 않은 세션에 대한 종료)
+        String ID = "???";
         String ipAddress = NettyUtils.getRemoteIpAddress(channel);
         TbVdsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         if (obj != null) {
             MDC.put("id", obj.getLogKey());
+            ID = obj.getVDS_CTLR_ID();
         }
 
-        log.error("VdsTcpClientIdleHandler.disconnectChannel: [{}]", ipAddress);
+        log.error("[{}]. DISC: VdsTcpClientIdleHandler.disconnectChannel", ID);
         if (!channel.isActive()) {
-            log.error("VdsTcpClientIdleHandler.disconnectChannel: [{}], channel already closed.", ipAddress);
+            log.error("[{}]. DISC: VdsTcpClientIdleHandler.disconnectChannel: channel already closed.", ID);
         }
 
         //////////////////////////////////
@@ -72,7 +74,7 @@ public class VdsTcpClientIdleHandler extends IdleStateHandler {
         channel.flush();
         ChannelFuture f = channel.disconnect().awaitUninterruptibly();
         if (!f.isDone() || !f.isSuccess()) {
-            log.error("VdsTcpClientIdleHandler.disconnectChannel: [{}], isDone: {}, isSuccess: {}", ipAddress, f.isDone(), f.isSuccess());
+            log.error("[{}]. DISC: VdsTcpClientIdleHandler.disconnectChannel: isDone {}, isSuccess {}", ID, f.isDone(), f.isSuccess());
         }
 
         if (obj != null) {
@@ -83,8 +85,18 @@ public class VdsTcpClientIdleHandler extends IdleStateHandler {
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
+        String ID = "???";
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        log.error("exceptionCaught: {}, {}", ipAddress, cause.getMessage());
+        TbVdsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
+        if (obj != null) {
+            MDC.put("id", obj.getLogKey());
+            ID = obj.getVDS_CTLR_ID();
+        }
+        log.error("[{}]. EXCE: exceptionCaught: {}", ID, cause.getMessage());
+        if (obj != null) {
+            MDC.remove(obj.getLogKey());
+            MDC.clear();
+        }
 
         ctx.channel().close();
     }

+ 9 - 1
src/main/java/com/its/vds/xnettcp/vds/process/Job_ACK.java

@@ -1,5 +1,6 @@
 package com.its.vds.xnettcp.vds.process;
 
+import com.its.vds.entity.TbVdsCtlr;
 import com.its.vds.xnettcp.vds.protocol.VdsResFramePacket;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -12,7 +13,14 @@ public class Job_ACK implements JobProtocol {
 
 	@Override
 	public int parse() {
-		return 0;
+		if (this.packet == null || this.packet.getVdsObj() == null) {
+			log.error("Job_ACK, packet or object data null");
+			return 0;
+		}
+
+		TbVdsCtlr obj = this.packet.getVdsObj();
+		log.error("[{}]. Job_ACK: Received.", obj.getVDS_CTLR_ID());
+		return 1;
 	}
 
 }

+ 66 - 12
src/main/java/com/its/vds/xnettcp/vds/process/Job_Data.java

@@ -1,9 +1,22 @@
 package com.its.vds.xnettcp.vds.process;
 
+import com.its.app.AppUtils;
+import com.its.app.utils.SysUtils;
+import com.its.vds.entity.TbVdsCtlr;
+import com.its.vds.entity.TbVdsDtct;
+import com.its.vds.entity.voVdsDtctClct;
+import com.its.vds.process.DbmsJobData;
+import com.its.vds.process.DbmsJobProcess;
+import com.its.vds.process.DbmsJobType;
 import com.its.vds.xnettcp.vds.protocol.VdsResFramePacket;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 @Slf4j
 @RequiredArgsConstructor
 public class Job_Data implements JobProtocol {
@@ -18,12 +31,22 @@ public class Job_Data implements JobProtocol {
 			return 0;
 		}
 
+		TbVdsCtlr obj = this.packet.getVdsObj();
 		byte[] body = this.packet.getBody();
 		if (body == null || body.length < 5) {
-			log.error("Job_Data, [{}]: Data Length Error, {}", this.packet.getObjectInfo(), (body == null) ? 0 : body.length);
+			log.error("[{}]. Job_Data: Data Length Error, {}", obj.getVDS_CTLR_ID(), (body == null) ? 0 : body.length);
 			return 0;
 		}
 
+		String CLCT_DT = SysUtils.getSysTime();
+		for (Map.Entry<String, TbVdsDtct> e : obj.getVdsDtctMap().entrySet()) {
+			TbVdsDtct dtct = e.getValue();
+			dtct.getClct().initVal();
+			dtct.getClct().setVDS_DTCT_NMBR(dtct.getVDS_DTCT_NMBR());
+			dtct.getClct().setTRAF_CLCT_CYCL(obj.getTRAF_CLCT_CYCL());
+			dtct.getClct().setCLCT_DT(CLCT_DT);
+		}
+
 		int FrameNo = body[0];
 		byte stts1  = body[1];
 		byte stts2  = body[2];
@@ -42,28 +65,59 @@ public class Job_Data implements JobProtocol {
 //		Byte 14		Lane 1 공간 점유율 소수부분 (Space   Occupancy)
 //		Byte 15		Lane 1 공간 평균속도 (1byte 정수)
 
-		int idx;
+		int pktLen = body.length;
 		int laneCnt = (body.length - 5) / 9;
-		int   tfvl, spd, occ1, occ2, len, hdr, spc_occ1, spc_occ2, spc_spd;
+
+		log.info("[{}]. Job_Data: pktLen {}, laneCnt {}", obj.getVDS_CTLR_ID(), pktLen, laneCnt);
+
+		int   idx, tfvl, spd, occ1, occ2, lngt, hdwy, spc_occ1, spc_occ2, spc_spd;
 		float occ, spc_occ;
 		for (int ii = 0; ii < laneCnt; ii++) {
 			idx = (ii * 9) + 5;
-			tfvl = body[idx+0];
-			spd = body[idx+1];
-			occ1 = body[idx+2];
-			occ2 = body[idx+3];
-			len = body[idx+4];
-			hdr = body[idx+5];
+
+			tfvl     = body[idx];
+			spd      = body[idx+1];
+			occ1     = body[idx+2];
+			occ2     = body[idx+3];
+			lngt     = body[idx+4];
+			hdwy     = body[idx+5];
 			spc_occ1 = body[idx+6];
 			spc_occ2 = body[idx+7];
-			spc_spd = body[idx+8];
+			spc_spd  = body[idx+8];
 
 			occ  = (float)(occ1 + (occ2 * 0.01));
 			spc_occ  = (float)(spc_occ1 + (spc_occ2 * 0.01));
 
-			log.info("Job_Data, [{}]: Lane:{}, TFVL:{}, SPD:{}, OCC:{}, LEN:{}, HDR:{}, SOCC:{}, SSPD:{}",
-					this.packet.getObjectInfo(), ii+1, tfvl, spd, occ, len, hdr, spc_occ, spc_spd);
+			String DETECT_LANE = Integer.toString(ii+1);
+
+			log.info("[{}]. Job_Data: Lane:{}, TFVL:{}, SPD:{}, OCC:{}, LEN:{}, HDR:{}, SOCC:{}, SSPD:{}",
+					obj.getVDS_CTLR_ID(), DETECT_LANE, tfvl, spd, occ, lngt, hdwy, spc_occ, spc_spd);
+
+			TbVdsDtct dtct = obj.getVdsDtctMap().get(DETECT_LANE);
+			if (dtct == null) {
+				log.info("[{}]. Job_Data: Unknown Lane No {}.", obj.getVDS_CTLR_ID(), DETECT_LANE);
+			} else {
+				dtct.getClct().setTFVL(tfvl);
+				dtct.getClct().setSPED(spd);
+				dtct.getClct().setAVRG_OCPY_RATE(occ);
+				dtct.getClct().setHDWY(hdwy);
+				dtct.getClct().setAVRG_LNGT(lngt);
+				dtct.getClct().setSPCE_OCPY_RATE(spc_occ);
+				dtct.getClct().setSPCE_AVRG_SPED(spc_spd);
+			}
+		}
+		//수집한 교통정보를 데이터베이스에 저장
+		List<voVdsDtctClct> dtctClctList = Collections.synchronizedList(new ArrayList<>());
+		for (Map.Entry<String, TbVdsDtct> e : obj.getVdsDtctMap().entrySet()) {
+			TbVdsDtct dtct = e.getValue();
+			dtctClctList.add(dtct.getClct());
 		}
+
+		DbmsJobProcess dbmsJobProcess = (DbmsJobProcess) AppUtils.getBean(DbmsJobProcess.class);
+		if (dtctClctList.size() > 0) {
+			dbmsJobProcess.add(new DbmsJobData(DbmsJobType.DATA_TYPE_DTCT_CLCT, false, dtctClctList));
+		}
+
 		return 1;
 	}
 

+ 17 - 17
src/main/java/com/its/vds/xnettcp/vds/process/Job_Image.java

@@ -28,13 +28,13 @@ public class Job_Image implements JobProtocol {
 			return 0;
 		}
 
+		TbVdsCtlr obj = this.packet.getVdsObj();
 		byte[] body = this.packet.getBody();
 		if (body == null || body.length < 6) {
-			log.error("Job_Image, [{}]: Data Body Length Error, {}", this.packet.getObjectInfo(), (body == null) ? 0 : body.length);
+			log.error("[{}]. Job_Image: Data Body Length Error, {}", this.packet.getObjectInfo(), (body == null) ? 0 : body.length);
 			return 0;
 		}
 
-		TbVdsCtlr obj = this.packet.getVdsObj();
 		ByteBuffer byteBuffer = ByteBuffer.wrap(body);
 		byteBuffer.order(VdsProtocol.byteOrder);
 
@@ -43,7 +43,7 @@ public class Job_Image implements JobProtocol {
 		int current = byteBuffer.getShort();
 		int dataLen = byteBuffer.getShort();
 
-		log.info("Job_Image: image data receive: total {}, current {}, dataLen {}, pktSize {}", total, current, dataLen, pktSize);
+		log.info("[{}]. Job_Image: image data receive: total {}, current {}, dataLen {}, pktSize {}", obj.getVDS_CTLR_ID(), total, current, dataLen, pktSize);
 
 		if (dataLen > 6) {
 			int imageSize = dataLen - 6;
@@ -51,34 +51,34 @@ public class Job_Image implements JobProtocol {
 			byteBuffer.get(imageData);
 			obj.addImageSize(imageSize);
 			obj.addImageData(imageData);
-			log.info("Job_Image: image data save: currentSize {}, totalSize {}", imageSize, obj.getImageData().array().length);
+			log.info("[{}]. Job_Image: image data save: currentSize {}, totalSize {}", obj.getVDS_CTLR_ID(), imageSize, obj.getImageData().array().length);
 		}
 		else {
-			log.error("Job_Image: image data receive size error: total {}, current {}, dataLen {}", total, current, dataLen);
+			log.error("[{}]. Job_Image: image data receive size error: total {}, current {}, dataLen {}", obj.getVDS_CTLR_ID(), total, current, dataLen);
 			obj.setStopImageResponse();
 			return 0;
 		}
 
 		int nextFrame = current+1;
 		if (total == nextFrame) {
-			log.info("Job_Image, completed image data receive: {}", obj.getImageSize());
+			log.info("[{}]. Job_Image: completed image data receive: {}", obj.getVDS_CTLR_ID(), obj.getImageSize());
 			List<Channel> channels = obj.getRequestImageList();
 			ByteBuffer buffer1 = CenterResProtocol.getImageHeader1();
 			ByteBuffer buffer2 = CenterResProtocol.getImageHeader2(obj.getImageSize());
 			ByteBuffer buffer3 = obj.getImageData();
 			channels.forEach(channel -> {
-				if (sendCenterResponse(channel, buffer1)) {
-					log.info("Job_Image, send image data to center[HEAD1]: {} Bytes. {}", buffer1.array().length, NettyUtils.getRemoteAddress(channel));
+				if (sendCenterResponse(channel, buffer1, obj)) {
+					log.info("[{}]. Job_Image: send image data to center[HEAD1]: {} Bytes. {}", obj.getVDS_CTLR_ID(), buffer1.array().length, NettyUtils.getRemoteAddress(channel));
 				}
 			});
 			channels.forEach(channel -> {
-				if (sendCenterResponse(channel, buffer2)) {
-					log.info("Job_Image, send image data to center[HEAD2]: {} Bytes. {}", buffer2.array().length, NettyUtils.getRemoteAddress(channel));
+				if (sendCenterResponse(channel, buffer2, obj)) {
+					log.info("[{}]. Job_Image: send image data to center[HEAD2]: {} Bytes. {}", obj.getVDS_CTLR_ID(), buffer2.array().length, NettyUtils.getRemoteAddress(channel));
 				}
 			});
 			channels.forEach(channel -> {
-				if (sendCenterResponse(channel, buffer3)) {
-					log.info("Job_Image, send image data to center[DATA]: {} Bytes. {}", buffer3.array().length, NettyUtils.getRemoteAddress(channel));
+				if (sendCenterResponse(channel, buffer3, obj)) {
+					log.info("[{}]. Job_Image: send image data to center[DATA]: {} Bytes. {}", obj.getVDS_CTLR_ID(), buffer3.array().length, NettyUtils.getRemoteAddress(channel));
 				}
 			});
 		}
@@ -89,25 +89,25 @@ public class Job_Image implements JobProtocol {
 			reqImage.makeCRC();
 			ByteBuffer sendBuffer = reqImage.getByteBuffer();
 			if (!obj.sendData(sendBuffer, 0, "vds_Image")) {
-				log.error("Job_Image, request data failed: total {}, frameNo {}", total, nextFrame);
+				log.error("[{}]. Job_Image: request data failed: total {}, frameNo {}", obj.getVDS_CTLR_ID(), total, nextFrame);
 				obj.setStopImageResponse();
 			} else {
-				log.info("Job_Image: next image request, total {}, current {}, next {}", total, current, nextFrame);
+				log.info("[{}]. Job_Image: next image request, total {}, current {}, next {}", obj.getVDS_CTLR_ID(), total, current, nextFrame);
 			}
 		}
 		return 0;
 	}
 
-	public boolean sendCenterResponse(Channel channel, ByteBuffer sendBuff) {
+	public boolean sendCenterResponse(Channel channel, ByteBuffer sendBuff, TbVdsCtlr obj) {
 		boolean result = false;
-		log.error("Job_Image, sendCenterResponse {} Bytes", sendBuff.array().length);
+		log.error("[{}]. Job_Image: sendCenterResponse {} Bytes", obj.getVDS_CTLR_ID(), sendBuff.array().length);
 		if (channel != null) {
 			ChannelFuture f = channel.writeAndFlush(sendBuff);
 			f.awaitUninterruptibly();
 			if (f.isDone() || f.isSuccess()) {
 				result = true;
 			} else {
-				log.error("Job_Image, sendResponse: {} sendBytes, Failed. {}", sendBuff.array().length, NettyUtils.getRemoteAddress(channel));
+				log.error("[{}]. Job_Image: sendResponse: {} sendBytes, Failed. {}", obj.getVDS_CTLR_ID(), sendBuff.array().length, NettyUtils.getRemoteAddress(channel));
 			}
 		}
 		return result;

+ 9 - 1
src/main/java/com/its/vds/xnettcp/vds/process/Job_NAK.java

@@ -1,5 +1,6 @@
 package com.its.vds.xnettcp.vds.process;
 
+import com.its.vds.entity.TbVdsCtlr;
 import com.its.vds.xnettcp.vds.protocol.VdsResFramePacket;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -12,7 +13,14 @@ public class Job_NAK implements JobProtocol {
 
 	@Override
 	public int parse() {
-		return 0;
+		if (this.packet == null || this.packet.getVdsObj() == null) {
+			log.error("Job_NAK, packet or object data null");
+			return 0;
+		}
+
+		TbVdsCtlr obj = this.packet.getVdsObj();
+		log.error("[{}]. Job_NAK: Received.", obj.getVDS_CTLR_ID());
+		return 1;
 	}
 
 }

+ 6 - 4
src/main/java/com/its/vds/xnettcp/vds/process/Job_Temperature.java

@@ -23,23 +23,25 @@ public class Job_Temperature implements JobProtocol {
 			return 0;
 		}
 
+		TbVdsCtlr obj = this.packet.getVdsObj();
 		byte[] body = this.packet.getBody();
 		if (body == null || body.length != 3) {
-			log.error("Job_Temperature, [{}]: Data Length Error, {}", this.packet.getObjectInfo(), (body == null) ? 0 : body.length);
+			log.error("[{}]. Job_Temperature: Data Length Error, {}", obj.getVDS_CTLR_ID(), (body == null) ? 0 : body.length);
 			return 0;
 		}
 
 		int CBOX_TMPR = body[0];
 		int InputVoltage = (int)(body[1] & 0xFF);
 		int OutputVoltage = (int)(body[2] & 0xFF);
-		log.info("Job_Temperature, [{}]: {}, {}, {}", this.packet.getObjectInfo(), CBOX_TMPR, InputVoltage, OutputVoltage);
+		log.info("[{}]. Job_Temperature: 온도 {}, 입력전압 {}, 출력전압 {}", obj.getVDS_CTLR_ID(), CBOX_TMPR, InputVoltage, OutputVoltage);
 
-		TbVdsCtlr obj = this.packet.getVdsObj();
 		obj.getStts().setCBOX_TMPR(CBOX_TMPR);
+		obj.getStts().setINPT_VOLT(InputVoltage);
+		obj.getStts().setPRNT_VOLT(OutputVoltage);
 
 		if (obj.getNetState() != NET.LOGINED) {
 			String UPDT_DT = SysUtils.getSysTime();
-			log.info("[{}] [{}], vds_Temperature: First Received. Login Flag OK. {}", obj.getVDS_CTLR_ID(), obj.getVDS_CTLR_IP(), UPDT_DT);
+			log.info("[{}]. Job_Temperature: First Received. Login Flag OK. {}", obj.getVDS_CTLR_ID(), UPDT_DT);
 			obj.setNetState(NET.LOGINED);
 			obj.getStts().setUPDT_DT(UPDT_DT);
 			obj.getStts().setCMNC_STTS_CD("CMS0");

+ 6 - 2
src/main/java/com/its/vds/xnettcp/vds/process/VdsDataProcess.java

@@ -173,7 +173,6 @@ public class VdsDataProcess {
 
     protected boolean checkStatus(TbVdsCtlr obj, VdsResFramePacket packet) {
         String opCodeName = VdsProtocol.getOpCodeName(packet.getHead().getOpCode());
-        log.info("RECV_P: [{}], RECV.{}, [{}] checkStatus.", obj.getVDS_CTLR_IP(), opCodeName, obj.getVDS_CTLR_NMBR());
 
         /*
          * VDS Status Update
@@ -203,6 +202,8 @@ public class VdsDataProcess {
 
         int Invalid         = SysUtils.getBitValue(stts1, 0);
         int Ready           = SysUtils.getBitValue(stts1, 1);
+        int longPower       = SysUtils.getBitValue(stts1, 3);
+        int shortPower      = SysUtils.getBitValue(stts1, 4);
 
         int FrontDoorOpen   = SysUtils.getBitValue(stts2, 1);
         int BackDoorOpen    = SysUtils.getBitValue(stts2, 2);
@@ -210,8 +211,10 @@ public class VdsDataProcess {
         int Heater          = SysUtils.getBitValue(stts2, 4);
         int VideoInput      = SysUtils.getBitValue(stts2, 7);
 
-        log.info("checkStatus, I:{}, R:{}, FD:{}, BD:{}, F:{}, H:{}, V:{}", Invalid, Ready, FrontDoorOpen, BackDoorOpen, Fan, Heater, VideoInput);
+        log.info("[{}]. RECV: checkStatus. Invalid:{}, Ready:{}, FrontDoor:{}, BackDoor:{}, Fan:{}, Heater:{}, Video:{}",
+                obj.getVDS_CTLR_ID(), Invalid, Ready, FrontDoorOpen, BackDoorOpen, Fan, Heater, VideoInput);
 
+        String PRNT_PWER_STTS_CD  = (longPower == 0 && shortPower == 0) ? "PWS0" : "PWS1";
         String CBOX_DOOR_STTS_CD  = (FrontDoorOpen == 0 && BackDoorOpen == 0) ? "CDS0" : "CDS1";
         String FRONT_DOOR_STTS_CD = FrontDoorOpen == 1 ? "CDS1" : "CDS0";
         String BACK_DOOR_STTS_CD  = BackDoorOpen  == 1 ? "CDS1" : "CDS0";
@@ -223,6 +226,7 @@ public class VdsDataProcess {
         obj.getStts().setUPDT_DT(SysUtils.getSysTime());
         obj.getStts().setCMNC_STTS_CD("CMS0");
 
+        obj.getStts().setPRNT_PWER_STTS_CD(PRNT_PWER_STTS_CD);
         obj.getStts().setCBOX_DOOR_STTS_CD(CBOX_DOOR_STTS_CD);
         obj.getStts().setFAN_STTS_CD(FAN_STTS_CD);
         obj.getStts().setHETR_STTS_CD(HETR_STTS_CD);

+ 2 - 1
src/main/java/com/its/vds/xnettcp/vds/protocol/VdsReqRTC.java

@@ -1,6 +1,7 @@
 package com.its.vds.xnettcp.vds.protocol;
 
 import com.its.app.utils.BcdConverter;
+import com.its.app.utils.SysUtils;
 
 /**
  * 개별차량 데이터 Request, 제어기에게 동기화 명령을 보낸 직후 개별차량 데이터 Request 명령 전송
@@ -13,6 +14,6 @@ public class VdsReqRTC extends VdsReqFramePacket {
     }
 
     public void setRealTimeClock() {
-        this.body = BcdConverter.stringToBcd("20220712100015");//SysUtils.getSysTime());
+        this.body = BcdConverter.stringToBcd(SysUtils.getSysTime());
     }
 }

+ 2 - 2
src/main/java/com/its/vds/xnettcp/vds/protocol/VdsResFramePacket.java

@@ -42,9 +42,9 @@ public class VdsResFramePacket {
 
     public String getObjectInfo() {
         if (this.vdsObj != null) {
-            return this.vdsObj.getVDS_CTLR_ID() + ":" + this.vdsObj.getVDS_CTLR_IP();
+            return this.vdsObj.getVDS_CTLR_ID();
         }
-        return "???:???";
+        return "???";
     }
     public byte getOpCode() {
         if (this.head != null) {

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

@@ -2,7 +2,7 @@ application:
   process:
     id: VDS01
     name: VDS Communication Server
-    history: false
+    history: true
     user-id: admin
     user-pswd: 1234
 
@@ -16,7 +16,7 @@ application:
 
   controller-comm:
     comm-logging: true
-    retry-seconds: 10
+    retry-seconds: 20
     connect-timeout: 5
 
   center-comm:

+ 4 - 6
src/main/resources/logback-spring.xmlx → src/main/resources/logback-spring.xml

@@ -107,8 +107,7 @@
         <appender-ref ref="FILE_ERROR"/>
     </root>
 
-    <logger name="com.its.app.xnettcp" level="DEBUG" additivity="false">
-        <appender-ref ref="CONSOLE"/>
+    <logger name="com.its.vds.xnettcp" level="DEBUG" additivity="false">
         <appender-ref ref="FILE_PACKET"/>
         <appender-ref ref="FILE_ERROR"/>
     </logger>
@@ -126,7 +125,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="com.its.app.xnetudp" level="DEBUG" additivity="false">
+    <logger name="com.its.vds.xnetudp" level="DEBUG" additivity="false">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="CENTER_COMM"/>
         <appender-ref ref="FILE_ERROR"/>
@@ -145,8 +144,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="com.its.app.xnettcp.handler" level="DEBUG" additivity="true">
-        <appender-ref ref="CONSOLE"/>
+    <logger name="com.its.vds.xnettcp" level="DEBUG" additivity="true">
         <appender-ref ref="FILE_SESSION"/>
         <appender-ref ref="FILE_ERROR"/>
     </logger>
@@ -183,7 +181,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="com.its.app.scheduler" level="DEBUG" additivity="false">
+    <logger name="com.its.vds.scheduler" level="DEBUG" additivity="false">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="FILE_SCHEDULE"/>
         <appender-ref ref="FILE_ERROR"/>

+ 88 - 0
src/main/resources/mybatis/mapper/VdsCtlrMapper.xml

@@ -138,4 +138,92 @@
     ]]>
     </insert>
 
+    <update id="batchUpdateVdsCtlrStts" parameterType="java.util.Map">
+    <![CDATA[
+        MERGE INTO TB_VDS_CTLR_STTS L
+            USING (SELECT #{VDS_CTLR_NMBR} 	    AS CTLR_MNGM_NMBR,
+                          #{UPDT_DT} 			AS UPDT_DT,
+                          #{CMNC_STTS_CD} 		AS CMNC_STTS_CD,
+                          #{PRNT_PWER_STTS_CD}  AS PRNT_PWER_STTS_CD,
+                          #{CBOX_DOOR_STTS_CD}  AS CBOX_DOOR_STTS_CD,
+                          #{FAN_STTS_CD} 		AS FAN_STTS_CD,
+                          #{HETR_STTS_CD} 		AS HETR_STTS_CD,
+                          #{SUB_CTLR_VAL} 		AS SUB_CTLR_VAL,
+                          #{CBOX_TMPR} 		    AS CBOX_TMPR,
+                          #{INPT_VOLT}          AS INPT_VOLT,
+                          #{PRNT_VOLT}          AS PRNT_VOLT
+                   FROM DUAL) M
+            ON (L.CTLR_MNGM_NMBR = M.CTLR_MNGM_NMBR)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    L.UPDT_DT            = M.UPDT_DT,
+                    L.CMNC_STTS_CD       = M.CMNC_STTS_CD,
+                    L.PRNT_PWER_STTS_CD  = M.PRNT_PWER_STTS_CD,
+                    L.CBOX_DOOR_STTS_CD  = M.CBOX_DOOR_STTS_CD,
+                    L.FAN_STTS_CD        = M.FAN_STTS_CD,
+                    L.HETR_STTS_CD       = M.HETR_STTS_CD,
+                    L.SUB_CTLR_VAL       = M.SUB_CTLR_VAL,
+                    L.CBOX_TMPR          = M.CBOX_TMPR,
+                    L.INPT_VOLT          = M.INPT_VOLT,
+                    L.PRNT_VOLT          = M.PRNT_VOLT
+            WHEN NOT MATCHED THEN
+                INSERT (
+                        CTLR_MNGM_NMBR,
+                        UPDT_DT,
+                        CMNC_STTS_CD,
+                        PRNT_PWER_STTS_CD,
+                        CBOX_DOOR_STTS_CD,
+                        FAN_STTS_CD,
+                        HETR_STTS_CD,
+                        SUB_CTLR_VAL,
+                        CBOX_TMPR,
+                        INPT_VOLT,
+                        PRNT_VOLT
+                    )
+                    VALUES (
+                               M.CTLR_MNGM_NMBR,
+                               M.UPDT_DT,
+                               M.CMNC_STTS_CD,
+                               M.PRNT_PWER_STTS_CD,
+                               M.CBOX_DOOR_STTS_CD,
+                               M.FAN_STTS_CD,
+                               M.HETR_STTS_CD,
+                               M.SUB_CTLR_VAL,
+                               M.CBOX_TMPR,
+                               M.INPT_VOLT,
+                               M.PRNT_VOLT
+                           )
+        ]]>
+    </update>
+
+    <insert id="batchInsertVdsCtlrSttsHs" parameterType="java.util.Map">
+    <![CDATA[
+        INSERT INTO TB_VDS_CTLR_STTS_RAW (
+            OCRR_DT,
+            CTLR_MNGM_NMBR,
+            CMNC_STTS_CD,
+            PRNT_PWER_STTS_CD,
+            CBOX_DOOR_STTS_CD,
+            FAN_STTS_CD,
+            HETR_STTS_CD,
+            SUB_CTLR_VAL,
+            CBOX_TMPR,
+            INPT_VOLT,
+            PRNT_VOLT
+        )
+        VALUES (
+                   #{UPDT_DT},
+                   #{VDS_CTLR_NMBR},
+                   #{CMNC_STTS_CD},
+                   #{PRNT_PWER_STTS_CD},
+                   #{CBOX_DOOR_STTS_CD},
+                   #{FAN_STTS_CD},
+                   #{HETR_STTS_CD},
+                   #{SUB_CTLR_VAL},
+                   #{CBOX_TMPR},
+                   #{INPT_VOLT},
+                   #{PRNT_VOLT}
+               )
+        ]]>
+    </insert>
 </mapper>

+ 112 - 41
src/main/resources/mybatis/mapper/VdsDtctMapper.xml

@@ -99,49 +99,120 @@
 
     <update id="updateVdsDtctClctPnst" parameterType="com.its.vds.entity.voVdsDtctClct">
     <![CDATA[
-		MERGE INTO TB_VDS_DTCT_RAW_PNST L
-		USING (SELECT #{clct.VDS_DTCT_NMBR}  AS DTCT_NMBR,
-		              #{clct.CLCT_DT} 	     AS OCRR_DT,
-		              #{clct.SYST_KIND_DVSN} AS SYST_KIND_DVSN,
-		              #{clct.TFVL}           AS TFVL,                        
-		              #{clct.SPED}           AS SPED,                        
-		              #{clct.AVRG_OCPY_RATE} AS AVRG_OCPY_RATE,              
-		              #{clct.AVRG_LNGT}      AS AVRG_LNGT,                   
-		              #{clct.HDWY}         	 AS HDWY,                        
-		              #{clct.SPCE_OCPY_RATE} AS SPCE_OCPY_RATE,              
-		              #{clct.SPCE_AVRG_SPED} AS SPCE_AVRG_SPED               
-		         FROM DUAL) M                              
-		        ON (L.DTCT_NMBR = M.DTCT_NMBR)
-		WHEN MATCHED THEN                                  
-		   UPDATE SET L.OCRR_DT        = M.OCRR_DT,
-		              L.TFVL           = M.TFVL,           
-		              L.SPED           = M.SPED,           
-		              L.AVRG_OCPY_RATE = M.AVRG_OCPY_RATE, 
-		              L.AVRG_LNGT      = M.AVRG_LNGT,      
-		              L.HDWY           = M.HDWY
-		WHEN NOT MATCHED THEN                              
-		   INSERT (
-                   DTCT_NMBR,
-                   OCRR_DT,
-                   SYST_KIND_DVSN,
-		           TFVL,                                   
-		           SPED,                                   
-		           AVRG_OCPY_RATE,                         
-		           AVRG_LNGT,                              
-		           HDWY
-		          )                        
-		   VALUES (M.DTCT_NMBR,
-		           M.OCRR_DT,
-		           M.SYST_KIND_DVSN,
-		           M.TFVL,                                 
-		           M.SPED,                                 
-		           M.AVRG_OCPY_RATE,                       
-		           M.AVRG_LNGT,                            
-		           M.HDWY
-		          )                      
-    ]]>
+        MERGE INTO TB_VDS_DTCT_RAW_PNST L
+            USING (SELECT #{clct.VDS_DTCT_NMBR}  AS DTCT_NMBR,
+                          #{clct.CLCT_DT} 	     AS OCRR_DT,
+                          #{clct.SYST_KIND_DVSN} AS SYST_KIND_DVSN,
+                          #{clct.TFVL}           AS TFVL,
+                          #{clct.SPED}           AS SPED,
+                          #{clct.AVRG_OCPY_RATE} AS AVRG_OCPY_RATE,
+                          #{clct.AVRG_LNGT}      AS AVRG_LNGT,
+                          #{clct.HDWY}         	 AS HDWY,
+                          #{clct.SPCE_OCPY_RATE} AS SPCE_OCPY_RATE,
+                          #{clct.SPCE_AVRG_SPED} AS SPCE_AVRG_SPED
+                   FROM DUAL) M
+            ON (L.DTCT_NMBR = M.DTCT_NMBR)
+            WHEN MATCHED THEN
+                UPDATE SET L.OCRR_DT        = M.OCRR_DT,
+                    L.TFVL           = M.TFVL,
+                    L.SPED           = M.SPED,
+                    L.AVRG_OCPY_RATE = M.AVRG_OCPY_RATE,
+                    L.AVRG_LNGT      = M.AVRG_LNGT,
+                    L.HDWY           = M.HDWY
+            WHEN NOT MATCHED THEN
+                INSERT (
+                        DTCT_NMBR,
+                        OCRR_DT,
+                        SYST_KIND_DVSN,
+                        TFVL,
+                        SPED,
+                        AVRG_OCPY_RATE,
+                        AVRG_LNGT,
+                        HDWY
+                    )
+                    VALUES (M.DTCT_NMBR,
+                            M.OCRR_DT,
+                            M.SYST_KIND_DVSN,
+                            M.TFVL,
+                            M.SPED,
+                            M.AVRG_OCPY_RATE,
+                            M.AVRG_LNGT,
+                            M.HDWY
+                           )
+        ]]>
+    </update>
+
+    <update id="batchUpdateVdsDtctClctPnst" parameterType="java.util.Map">
+    <![CDATA[
+        MERGE INTO TB_VDS_DTCT_RAW_PNST L
+            USING (SELECT #{VDS_DTCT_NMBR}  AS DTCT_NMBR,
+                          #{CLCT_DT} 	    AS OCRR_DT,
+                          #{SYST_KIND_DVSN} AS SYST_KIND_DVSN,
+                          #{TFVL}           AS TFVL,
+                          #{SPED}           AS SPED,
+                          #{AVRG_OCPY_RATE} AS AVRG_OCPY_RATE,
+                          #{AVRG_LNGT}      AS AVRG_LNGT,
+                          #{HDWY}          AS HDWY,
+                          #{SPCE_OCPY_RATE} AS SPCE_OCPY_RATE,
+                          #{SPCE_AVRG_SPED} AS SPCE_AVRG_SPED
+                   FROM DUAL) M
+            ON (L.DTCT_NMBR = M.DTCT_NMBR)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    L.OCRR_DT        = M.OCRR_DT,
+                    L.TFVL           = M.TFVL,
+                    L.SPED           = M.SPED,
+                    L.AVRG_OCPY_RATE = M.AVRG_OCPY_RATE,
+                    L.AVRG_LNGT      = M.AVRG_LNGT,
+                    L.HDWY           = M.HDWY
+            WHEN NOT MATCHED THEN
+                INSERT (
+                        DTCT_NMBR,
+                        OCRR_DT,
+                        SYST_KIND_DVSN,
+                        TFVL,
+                        SPED,
+                        AVRG_OCPY_RATE,
+                        AVRG_LNGT,
+                        HDWY
+                    )
+                    VALUES (M.DTCT_NMBR,
+                            M.OCRR_DT,
+                            M.SYST_KIND_DVSN,
+                            M.TFVL,
+                            M.SPED,
+                            M.AVRG_OCPY_RATE,
+                            M.AVRG_LNGT,
+                            M.HDWY
+                           )
+        ]]>
     </update>
 
+    <insert id="batchInsertVdsDtctClct" parameterType="java.util.Map">
+    <![CDATA[
+        INSERT INTO TB_VDS_DTCT_RAW_CLCT (
+            DTCT_NMBR,
+            OCRR_DT,
+            SYST_KIND_DVSN,
+            TFVL,
+            SPED,
+            AVRG_OCPY_RATE,
+            AVRG_LNGT,
+            HDWY
+        )
+        VALUES (
+                   #{VDS_DTCT_NMBR},
+                   #{CLCT_DT},
+                   #{SYST_KIND_DVSN},
+                   #{TFVL},
+                   #{SPED},
+                   #{AVRG_OCPY_RATE},
+                   #{AVRG_LNGT},
+                   #{HDWY}
+               )
+        ]]>
+    </insert>
+
     <!-- 용인시는 차량통과정보 생성하지 않음  -->
 <!--    <insert id="insertVdsDtctVehClct" parameterType="com.its.vds.entity.voVdsDtctVehClct">-->
 <!--    <![CDATA[-->

+ 27 - 27
src/main/resources/mybatis/mapper/VdsStatMapper.xml

@@ -2,33 +2,33 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.its.vds.dao.mapper.VdsStatMapper">
-
-    <insert id="CRT_TB_VDS_DTCT_HS" parameterType="com.its.vds.vo.voStatisticsTime">
-    <![CDATA[
-		INSERT INTO TB_VDS_DTCT_HS (      PRCN_DT,                 
-		                                  VDS_DTCT_NMBR,           
-		                                  TFVL,                    
-		                                  SPED,                    
-		                                  AVRG_OCPY_RATE,          
-		                                  AVRG_LNGT,               
-		                                  HDWY,                    
-		                                  SPCE_OCPY_RATE,          
-		                                  SPCE_AVRG_SPED           
-		                                 )                         
-		SELECT  #{prcs.STAT_DT}               AS PRCN_DT,          
-		        VDS_DTCT_NMBR                 AS VDS_DTCT_NMBR,    
-		        SUM(TFVL)                     AS TFVL,             
-		        ROUND(AVG(SPED), 0)           AS SPED,             
-		        AVG(AVRG_OCPY_RATE)           AS AVRG_OCPY_RATE,   
-		        AVG(AVRG_LNGT)                AS AVRG_LNGT,        
-		        ROUND(AVG(HDWY), 0)           AS HDWY,             
-		        AVG(SPCE_OCPY_RATE)           AS SPCE_OCPY_RATE,   
-		        ROUND(AVG(SPCE_AVRG_SPED), 0) AS SPCE_AVRG_SPED    
-		  FROM TB_VDS_DTCT_CLCT
-		 WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}                      
-		 GROUP BY VDS_DTCT_NMBR                                    
-    ]]>
-    </insert>
+    <!-- 용인시는 5분 통계정보 생성하지 않음  -->
+<!--    <insert id="CRT_TB_VDS_DTCT_HS" parameterType="com.its.vds.vo.voStatisticsTime">-->
+<!--    <![CDATA[-->
+<!--		INSERT INTO TB_VDS_DTCT_HS (      PRCN_DT,                 -->
+<!--		                                  VDS_DTCT_NMBR,           -->
+<!--		                                  TFVL,                    -->
+<!--		                                  SPED,                    -->
+<!--		                                  AVRG_OCPY_RATE,          -->
+<!--		                                  AVRG_LNGT,               -->
+<!--		                                  HDWY,                    -->
+<!--		                                  SPCE_OCPY_RATE,          -->
+<!--		                                  SPCE_AVRG_SPED           -->
+<!--		                                 )                         -->
+<!--		SELECT  #{prcs.STAT_DT}               AS PRCN_DT,          -->
+<!--		        VDS_DTCT_NMBR                 AS VDS_DTCT_NMBR,    -->
+<!--		        SUM(TFVL)                     AS TFVL,             -->
+<!--		        ROUND(AVG(SPED), 0)           AS SPED,             -->
+<!--		        AVG(AVRG_OCPY_RATE)           AS AVRG_OCPY_RATE,   -->
+<!--		        AVG(AVRG_LNGT)                AS AVRG_LNGT,        -->
+<!--		        ROUND(AVG(HDWY), 0)           AS HDWY,             -->
+<!--		        AVG(SPCE_OCPY_RATE)           AS SPCE_OCPY_RATE,   -->
+<!--		        ROUND(AVG(SPCE_AVRG_SPED), 0) AS SPCE_AVRG_SPED    -->
+<!--		  FROM TB_VDS_DTCT_CLCT-->
+<!--		 WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}                      -->
+<!--		 GROUP BY VDS_DTCT_NMBR                                    -->
+<!--    ]]>-->
+<!--    </insert>-->
 
     <insert id="CRT_TB_VDS_DTCT_15M_STAT" parameterType="com.its.vds.vo.voStatisticsTime">
     <![CDATA[

+ 3 - 0
src/main/webapp/WEB-INF/jsp/controller.jsp

@@ -39,6 +39,9 @@
                                         <c:when test="${entry.value.netState eq '0'}">
                                             -
                                         </c:when>
+                                        <c:when test="${entry.value.netState eq '1'}">
+                                            연결중
+                                        </c:when>
                                         <c:otherwise>
                                             &nbsp;연결&nbsp;
                                         </c:otherwise>

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

@@ -1,6 +1,6 @@
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <title>${ServerConfig.processName}</title>
+    <title>${ServerConfig.name}</title>
 </head>
 
 <script type="text/javascript" src="/js/moment.min.js"></script>

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

@@ -1,6 +1,6 @@
 
 <table width="100%" style="font-family:tahoma;font-size:12pt;color:#808080;border-color:#6a5acd;margin-top: 5px;" border="0" cellpadding="10" cellspacing="0">
-    <tr align="center"><td style="font-size: 24px; font-weight: bold; color: black;">${ServerConfig.processName}</td></tr>
+    <tr align="center"><td style="font-size: 24px; font-weight: bold; color: black;">${ServerConfig.name}</td></tr>
 </table>
 <hr>
 <table width="100%" style="font-family:tahoma;font-size:12pt;color:#808080;border-color:#6a5acd;margin-top: -10px;" border="0" cellpadding="10" cellspacing="0" >

+ 2 - 8
src/main/webapp/WEB-INF/jsp/system.jsp

@@ -14,14 +14,8 @@
             <tr><td>
                 <fieldset><legend> System Information </legend>
                     <table border="0" cellpadding="1" cellspacing="0" style="font-weight: normal;font-family:tahoma;font-size:12pt;">
-                        <tr><td align="right" width="200">          system id : </td> <td><input type="text" value="${ServerConfig.processId}"         disabled /></td></tr>
-                        <tr><td align="right" width="200">tcp binding address : </td> <td><input type="text" value="${ServerConfig.tcpBindAddress}"    disabled /></td></tr>
-                        <tr><td align="right" width="200">   tcp binding port : </td> <td><input type="text" value="${ServerConfig.tcpBindPort}"       disabled /></td></tr>
-                        <tr><td align="right" width="200">   udp binding port : </td> <td><input type="text" value="${ServerConfig.centerBindPort}"    disabled /></td></tr>
-                        <!--
-                        <tr><td align="right" width="200">   data job threads : </td> <td><input type="text" value="${ServerConfig.serverDataThreads}" disabled /></td></tr>
-                        <tr><td align="right" width="200">   dbms job threads : </td> <td><input type="text" value="${ServerConfig.serverDbThreads}"   disabled /></td></tr>
-                        -->
+                        <tr><td align="right" width="200">          system id : </td> <td><input type="text" value="${ServerConfig.id}" disabled /></td></tr>
+                        <tr><td align="right" width="200">center binding port : </td> <td><input type="text" value="${ServerConfig.centerBindPort}" disabled /></td></tr>
                         <tr><td align="right" width="200">       booting time : </td> <td><input type="text" value="${ServerConfig.bootingDateTime}"   disabled /></td></tr>
                     </table>
                 </fieldset>