shjung 2 tahun lalu
induk
melakukan
0af3b73aba
40 mengubah file dengan 900 tambahan dan 321 penghapusan
  1. 7 4
      src/main/java/com/its/app/utils/TimeUtils.java
  2. 2 3
      src/main/java/com/its/traf/TrafPrcsServerApplication.java
  3. 3 3
      src/main/java/com/its/traf/controller/its/TrafPrcs05MController.java
  4. 9 9
      src/main/java/com/its/traf/controller/its/TrafPrcs05MPrepareController.java
  5. 1 3
      src/main/java/com/its/traf/controller/its/TrafPrcs15MController.java
  6. 56 0
      src/main/java/com/its/traf/controller/its/TrafPrcs30MController.java
  7. 5 5
      src/main/java/com/its/traf/controller/its/TrafPrcsDDController.java
  8. 5 5
      src/main/java/com/its/traf/controller/its/TrafPrcsHHController.java
  9. 6 6
      src/main/java/com/its/traf/controller/its/TrafPrcsMNController.java
  10. 6 3
      src/main/java/com/its/traf/controller/its/TrafPrcsReptCngsSectController.java
  11. 6 6
      src/main/java/com/its/traf/controller/its/TrafPrcsYYController.java
  12. 1 0
      src/main/java/com/its/traf/define/ITS.java
  13. 31 80
      src/main/java/com/its/traf/global/AppRepository.java
  14. 21 0
      src/main/java/com/its/traf/global/TrafJobHistVo.java
  15. 0 57
      src/main/java/com/its/traf/global/TrafJobType.java
  16. 19 2
      src/main/java/com/its/traf/global/TrafJobVo.java
  17. 53 0
      src/main/java/com/its/traf/global/eTrafPrcsJob.java
  18. 43 0
      src/main/java/com/its/traf/global/eTrafStatJob.java
  19. 11 1
      src/main/java/com/its/traf/scheduler/TrafPrcsSchedulerTask.java
  20. 7 7
      src/main/java/com/its/traf/service/its/TbIfscService.java
  21. 3 4
      src/main/java/com/its/traf/service/its/TbIncdService.java
  22. 9 8
      src/main/java/com/its/traf/service/its/TbLinkService.java
  23. 7 7
      src/main/java/com/its/traf/service/its/TbRoadService.java
  24. 3 3
      src/main/java/com/its/traf/service/its/TbVmsIfscService.java
  25. 9 9
      src/main/java/com/its/traf/service/its/collect/LinkRawDataCollectWorker.java
  26. 13 12
      src/main/java/com/its/traf/service/its/dao/IfscDaoService.java
  27. 13 12
      src/main/java/com/its/traf/service/its/dao/LinkDaoService.java
  28. 2 2
      src/main/java/com/its/traf/service/its/dao/ReptCngsSectDaoService.java
  29. 13 12
      src/main/java/com/its/traf/service/its/dao/RoadDaoService.java
  30. 3 3
      src/main/java/com/its/traf/service/its/dao/VmsIfscDaoService.java
  31. 0 33
      src/main/java/com/its/traf/ui/CtlrSttsDetlTableCellRenderer.java
  32. 53 10
      src/main/java/com/its/traf/ui/MainUI.java
  33. 78 0
      src/main/java/com/its/traf/ui/SubUI.form
  34. 168 0
      src/main/java/com/its/traf/ui/SubUI.java
  35. 44 0
      src/main/java/com/its/traf/ui/SubUIController.java
  36. 33 0
      src/main/java/com/its/traf/ui/TrafPrcsHistTableCellRenderer.java
  37. 136 0
      src/main/java/com/its/traf/ui/TrafPrcsHistTableModel.java
  38. 11 11
      src/main/java/com/its/traf/ui/TrafPrcsTableModel.java
  39. 1 1
      src/main/resources/application.yml
  40. 9 0
      src/test/java/com/its/traf/TrafPrcsServerApplicationTests.java

+ 7 - 4
src/main/java/com/its/app/utils/TimeUtils.java

@@ -10,10 +10,11 @@ public class TimeUtils {
 	public static final int TYPE_CURR_05MIN = 0;
 	public static final int TYPE_PRCS_05MIN = 1;
 	public static final int TYPE_PRCS_15MIN = 2;
-	public static final int TYPE_PRCS_HOUR  = 3;
-	public static final int TYPE_PRCS_DAY   = 4;
-	public static final int TYPE_PRCS_MONTH = 5;
-	public static final int TYPE_PRCS_YEAR  = 6;
+	public static final int TYPE_PRCS_30MIN = 3;
+	public static final int TYPE_PRCS_HOUR  = 4;
+	public static final int TYPE_PRCS_DAY   = 5;
+	public static final int TYPE_PRCS_MONTH = 6;
+	public static final int TYPE_PRCS_YEAR  = 7;
 
 	/* 현재 시각을 문자열로 리턴 */
 	public static String getCurrentTimeString() {
@@ -94,6 +95,7 @@ public class TimeUtils {
 			case TYPE_CURR_05MIN:
 			case TYPE_PRCS_05MIN: cal.add(Calendar.MINUTE, 5); break;
 			case TYPE_PRCS_15MIN: cal.add(Calendar.MINUTE, 15); break;
+			case TYPE_PRCS_30MIN: cal.add(Calendar.MINUTE, 30); break;
 			case TYPE_PRCS_HOUR:  cal.add(Calendar.HOUR_OF_DAY, 1); break;
 			case TYPE_PRCS_DAY:   cal.add(Calendar.DATE, 1); break;
 			case TYPE_PRCS_MONTH: cal.add(Calendar.MONTH, 1); break;
@@ -117,6 +119,7 @@ public class TimeUtils {
 			case TYPE_CURR_05MIN: return getItsTimeString(paramDt, 5, 0);
 			case TYPE_PRCS_05MIN: return getItsTimeString(paramDt, 5, 1);
 			case TYPE_PRCS_15MIN: return getItsTimeString(paramDt, 15, 1);
+			case TYPE_PRCS_30MIN: return getItsTimeString(paramDt, 30, 1);
 			case TYPE_PRCS_HOUR:  return getItsTimeString(paramDt, 60, 1);
 			case TYPE_PRCS_DAY:   return getItsTimeString(paramDt, 60*24, 1).substring(0, 8) + "000000";
 			case TYPE_PRCS_MONTH: return getItsTimeString(paramDt, 60*24, 1).substring(0, 6) + "01000000";

+ 2 - 3
src/main/java/com/its/traf/TrafPrcsServerApplication.java

@@ -4,7 +4,6 @@ import com.its.app.utils.OS;
 import com.its.app.utils.SysUtils;
 import com.its.traf.config.AppUtils;
 import com.its.traf.config.ProcessConfig;
-import com.its.traf.controller.its.TrafPrcs05MController;
 import com.its.traf.controller.its.TrafPrcs05MPrepareController;
 import com.its.traf.global.AppRepository;
 import com.its.traf.process.DbmsDataProcess;
@@ -135,8 +134,8 @@ public class TrafPrcsServerApplication implements CommandLineRunner, Application
 
         TrafPrcs05MPrepareController trafPrcs05MPrepareController = (TrafPrcs05MPrepareController)AppUtils.getBean(TrafPrcs05MPrepareController.class);
         trafPrcs05MPrepareController.run();
-        TrafPrcs05MController testController = (TrafPrcs05MController)AppUtils.getBean(TrafPrcs05MController.class);
-        testController.run();
+//        TrafPrcs05MController testController = (TrafPrcs05MController)AppUtils.getBean(TrafPrcs05MController.class);
+//        testController.run();
 
         UdpServerCenterComm udpServerCenterComm = (UdpServerCenterComm)AppUtils.getBean(UdpServerCenterComm.class);
         udpServerCenterComm.run();

+ 3 - 3
src/main/java/com/its/traf/controller/its/TrafPrcs05MController.java

@@ -2,8 +2,8 @@ package com.its.traf.controller.its;
 
 import com.its.app.utils.TimeUtils;
 import com.its.traf.global.AppRepository;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.service.its.*;
-import com.its.traf.global.TrafJobType;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -63,7 +63,7 @@ public class TrafPrcs05MController implements AbstractTrafPrcsController {
             log.error("Previous processing is not completed.");
         }
 
-        AppRepository.getInstance().startJob(TrafJobType.PRCS_05M_ALL);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_05M_ALL);
 
         // 가공 시작
         this.prcsTime.setProcessing(true);
@@ -99,6 +99,6 @@ public class TrafPrcs05MController implements AbstractTrafPrcsController {
         // 가공 완료
         this.prcsTime.setProcessing(false);
 
-        AppRepository.getInstance().endJob(TrafJobType.PRCS_05M_ALL, 0, true);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_05M_ALL, 0, true);
     }
 }

+ 9 - 9
src/main/java/com/its/traf/controller/its/TrafPrcs05MPrepareController.java

@@ -1,8 +1,8 @@
 package com.its.traf.controller.its;
 
 import com.its.traf.global.AppRepository;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.service.its.*;
-import com.its.traf.global.TrafJobType;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -49,42 +49,42 @@ public class TrafPrcs05MPrepareController implements AbstractTrafPrcsController
          * 파라미터 정보 로딩
          * 수집시스템정보, 휴일정보, 구간소통등급정보, VMS 정보제공구간 소틍등급, 링크 가공 파라미터정보
          */
-        AppRepository.getInstance().startJob(TrafJobType.LOAD_ALL);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.LOAD_ALL);
 
-        AppRepository.getInstance().startJob(TrafJobType.LOAD_PARAMETER);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.LOAD_PARAMETER);
         this.clctSystStupService.load();
         this.hldyInfrService.load();
         this.sectGradService.load();
         this.vmsIfscCmtrGradService.load();
         this.linkParaSetupService.load();
-        AppRepository.getInstance().endJob(TrafJobType.LOAD_PARAMETER, this.clctSystStupService.count() + this.hldyInfrService.count() + this.sectGradService.count() + this.vmsIfscCmtrGradService.count() + this.linkParaSetupService.count(), false);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.LOAD_PARAMETER, this.clctSystStupService.count() + this.hldyInfrService.count() + this.sectGradService.count() + this.vmsIfscCmtrGradService.count() + this.linkParaSetupService.count(), false);
 
         /*
          * 기초 정보 로딩
          * 링크, 정보제공구간, 도로, VMS 정보제공구간, 동질구간, 정보가공제외구간
          */
-        AppRepository.getInstance().startJob(TrafJobType.LOAD_BASEDATA);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.LOAD_BASEDATA);
         this.linkService.load();
         this.ifscService.load();
         this.roadService.load();
         this.vmsIfscService.load();
         this.eqtySectService.load();
         this.incdRstrSectService.load();    // 돌발발생 통제구간으로 소통정보 생성하지 않음.
-        AppRepository.getInstance().endJob(TrafJobType.LOAD_BASEDATA, this.linkService.count() + this.ifscService.count() + this.roadService.count() + this.vmsIfscService.count() + this.eqtySectService.count() + this.incdRstrSectService.count(), false);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.LOAD_BASEDATA, this.linkService.count() + this.ifscService.count() + this.roadService.count() + this.vmsIfscService.count() + this.eqtySectService.count() + this.incdRstrSectService.count(), false);
 
         /*
          * 패턴정보 로딩
          * LINK 5M, LINK 15M, IFSC 5M, ROAD 5M
          */
-        AppRepository.getInstance().startJob(TrafJobType.LOAD_PATTERN);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.LOAD_PATTERN);
         this.ptrnLink05MService.load();
         this.ptrnLink15MService.load();
         this.ptrnIfsc05MService.load();
         this.ptrnIfsc15MService.load();
         this.ptrnRoad05MService.load();
         this.ptrnRoad15MService.load();
-        AppRepository.getInstance().endJob(TrafJobType.LOAD_PATTERN, this.ptrnLink05MService.count() + this.ptrnLink15MService.count() + this.ptrnIfsc05MService.count() + this.ptrnIfsc15MService.count() + this.ptrnRoad05MService.count() + this.ptrnRoad15MService.count(), false);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.LOAD_PATTERN, this.ptrnLink05MService.count() + this.ptrnLink15MService.count() + this.ptrnIfsc05MService.count() + this.ptrnIfsc15MService.count() + this.ptrnRoad05MService.count() + this.ptrnRoad15MService.count(), false);
 
-        AppRepository.getInstance().endJob(TrafJobType.LOAD_ALL, 0, true);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.LOAD_ALL, 0, true);
     }
 }

+ 1 - 3
src/main/java/com/its/traf/controller/its/TrafPrcs15MController.java

@@ -37,7 +37,7 @@ public class TrafPrcs15MController implements AbstractTrafPrcsController {
     @Override
     public void run() {
         /**
-         * 기타 통계 정보 생성
+         * 15분 통계 정보 생성
          */
         initialize();
 
@@ -47,8 +47,6 @@ public class TrafPrcs15MController implements AbstractTrafPrcsController {
         //String hourMin = new SimpleDateFormat("HHmm").format(statDt);
         String weekCd = ITS.getDayWeekCd(ITS.getDayWeek(statDt));
 
-        // pattern:     5M-201606, 0000,  15M-201606, 0115,   HH-201606, 0700
-        // statistics:                    15M-20200601001500, HH-20200601010000, DD-20200602000000, MN-20160601000000, YY-20190101000000
         voStatistics voStat = new voStatistics();
         voStat.setSTAT_DT(this.statTime);
         voStat.setSTAT_FROM(this.fromTime);

+ 56 - 0
src/main/java/com/its/traf/controller/its/TrafPrcs30MController.java

@@ -0,0 +1,56 @@
+package com.its.traf.controller.its;
+
+import com.its.app.utils.TimeUtils;
+import com.its.traf.define.ITS;
+import com.its.traf.process.DbmsDataProcess;
+import com.its.traf.service.its.TbHldyInfrService;
+import com.its.traf.vo.statistics.voStatistics;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+
+import java.util.Date;
+
+@Slf4j
+@Controller
+@RequiredArgsConstructor
+public class TrafPrcs30MController implements AbstractTrafPrcsController {
+
+    private final TbHldyInfrService hldyInfrService;
+    private final DbmsDataProcess dbmsDataProcess;
+
+    private String statTime;
+    private String fromTime;
+    private String toTime;
+
+    @Override
+    public void initialize() {
+        String currTime = TimeUtils.getCurrentTimeString();
+        this.statTime = TimeUtils.getTime(TimeUtils.TYPE_PRCS_30MIN);
+        this.fromTime = this.statTime;
+        this.toTime = TimeUtils.getToTime(this.fromTime, TimeUtils.TYPE_PRCS_30MIN);
+
+        String funcName = String.format("%45s", "TrafPrcs30MController.initialize");
+        log.info("[SCHEDULING] {}: ..30M, {}, {}, {}, {}", funcName, currTime, this.statTime, this.fromTime, this.toTime);
+    }
+
+    @Override
+    public void run() {
+        /**
+         * 30분 통계 정보 생성
+         */
+        initialize();
+
+        boolean isHoliday = this.hldyInfrService.isHoliday(this.statTime);
+        Date statDt = TimeUtils.stringToDate(this.statTime);
+        //String yearMonth = new SimpleDateFormat("yyyyMM").format(statDt);
+        //String hourMin = new SimpleDateFormat("HHmm").format(statDt);
+        String weekCd = ITS.getDayWeekCd(ITS.getDayWeek(statDt));
+
+        voStatistics voStat = new voStatistics();
+        voStat.setSTAT_DT(this.statTime);
+        voStat.setSTAT_FROM(this.fromTime);
+        voStat.setSTAT_TO(this.toTime);
+        voStat.setDAY_TYPE_CD(weekCd);
+    }
+}

+ 5 - 5
src/main/java/com/its/traf/controller/its/TrafPrcsDDController.java

@@ -3,7 +3,7 @@ package com.its.traf.controller.its;
 import com.its.app.utils.TimeUtils;
 import com.its.traf.define.ITS;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -41,7 +41,7 @@ public class TrafPrcsDDController implements AbstractTrafPrcsController {
     @Override
     public void run() {
         /**
-         * 기타 통계 정보 생성
+         *  통계 정보 생성
          */
         initialize();
 
@@ -55,13 +55,13 @@ public class TrafPrcsDDController implements AbstractTrafPrcsController {
         voStat.setSTAT_TO(this.toTime);
         voStat.setDAY_TYPE_CD(weekCd);
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_LINK_DD);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_LINK_DD);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_STAT_DD_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_IFSC_DD);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_IFSC_DD);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_STAT_DD_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_ROAD_DD);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_ROAD_DD);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_STAT_DD_CREATE, false, voStat, 1));
 
         // 돌발 구간별 일 통계

+ 5 - 5
src/main/java/com/its/traf/controller/its/TrafPrcsHHController.java

@@ -3,7 +3,7 @@ package com.its.traf.controller.its;
 import com.its.app.utils.TimeUtils;
 import com.its.traf.define.ITS;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -41,7 +41,7 @@ public class TrafPrcsHHController implements AbstractTrafPrcsController {
     @Override
     public void run() {
         /**
-         * 기타 통계 정보 생성
+         * 시간 통계 정보 생성
          */
         initialize();
 
@@ -54,13 +54,13 @@ public class TrafPrcsHHController implements AbstractTrafPrcsController {
         voStat.setSTAT_TO(this.toTime);
         voStat.setDAY_TYPE_CD(weekCd);
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_LINK_HH);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_LINK_HH);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_STAT_HH_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_IFSC_HH);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_IFSC_HH);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_STAT_HH_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_ROAD_HH);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_ROAD_HH);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_STAT_HH_CREATE, false, voStat, 1));
     }
 }

+ 6 - 6
src/main/java/com/its/traf/controller/its/TrafPrcsMNController.java

@@ -3,7 +3,7 @@ package com.its.traf.controller.its;
 import com.its.app.utils.TimeUtils;
 import com.its.traf.define.ITS;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -41,12 +41,12 @@ public class TrafPrcsMNController implements AbstractTrafPrcsController {
     @Override
     public void run() {
         /**
-         * 기타 통계 정보 생성
+         *  통계 정보 생성
          */
         initialize();
 
         Date statDt = TimeUtils.stringToDate(this.statTime);
-         String weekCd = ITS.getDayWeekCd(ITS.getDayWeek(statDt));
+        String weekCd = ITS.getDayWeekCd(ITS.getDayWeek(statDt));
 
         voStatistics voStat = new voStatistics();
         voStat.setSTAT_DT(this.statTime);
@@ -54,13 +54,13 @@ public class TrafPrcsMNController implements AbstractTrafPrcsController {
         voStat.setSTAT_TO(this.toTime);
         voStat.setDAY_TYPE_CD(weekCd);
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_LINK_MN);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_LINK_MN);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_STAT_MN_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_IFSC_MN);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_IFSC_MN);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_STAT_MN_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_ROAD_MN);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_ROAD_MN);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_STAT_MN_CREATE, false, voStat, 1));
 
         // 돌발 구간별 일 통계

+ 6 - 3
src/main/java/com/its/traf/controller/its/TrafPrcsReptCngsSectController.java

@@ -9,7 +9,7 @@ import com.its.traf.dto.its.IfscCngsDto;
 import com.its.traf.dto.its.IfscReptCngsDto;
 import com.its.traf.dto.its.TbIfscDto;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -326,18 +326,21 @@ public class TrafPrcsReptCngsSectController implements AbstractTrafPrcsControlle
         if (insLists.size() > 0) {
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_REPT_CNGS_SECT_UPDATE, false, insLists, insLists.size()));
         } else {
-            AppRepository.getInstance().endJob(TrafJobType.PRCN_REPT_CNGS_SECT, 0, true);
+            AppRepository.getInstance().endStatJob(eTrafStatJob.PRCN_REPT_CNGS_SECT, 0, true);
         }
     }
 
     @Override
     public void run() {
+        /**
+         * 반복 정체구간 생성
+         */
         if (!this.config.isRepeatCongestEnabled()) {
             log.info("TrafPrcsReptCngsSectController: Not Set Enabled.");
             return;
         }
 
-        AppRepository.getInstance().startJob(TrafJobType.PRCN_REPT_CNGS_SECT);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.PRCN_REPT_CNGS_SECT);
         initialize();
         loadCngsLists();
         calcCngsCounts();

+ 6 - 6
src/main/java/com/its/traf/controller/its/TrafPrcsYYController.java

@@ -3,11 +3,11 @@ package com.its.traf.controller.its;
 import com.its.app.utils.TimeUtils;
 import com.its.traf.define.ITS;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
-import com.its.traf.service.its.*;
+import com.its.traf.service.its.TbHldyInfrService;
 import com.its.traf.vo.statistics.voStatistics;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -41,7 +41,7 @@ public class TrafPrcsYYController implements AbstractTrafPrcsController {
     @Override
     public void run() {
         /**
-         * 기타 통계 정보 생성
+         *  통계 정보 생성
          */
         initialize();
 
@@ -54,13 +54,13 @@ public class TrafPrcsYYController implements AbstractTrafPrcsController {
         voStat.setSTAT_TO(this.toTime);
         voStat.setDAY_TYPE_CD(weekCd);
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_LINK_YY);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_LINK_YY);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_STAT_YY_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_IFSC_YY);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_IFSC_YY);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_STAT_YY_CREATE, false, voStat, 1));
 
-        AppRepository.getInstance().startJob(TrafJobType.STAT_ROAD_YY);
+        AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_ROAD_YY);
         this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_STAT_YY_CREATE, false, voStat, 1));
     }
 }

+ 1 - 0
src/main/java/com/its/traf/define/ITS.java

@@ -11,6 +11,7 @@ public class ITS {
 	 * 이력정보 저장할 목록 갯수
 	 */
 	public final static int MAX_HIST_CNT = 5;
+	public final static int MAX_TRAF_JOB_HIST_CNT = 20;
 
 	/*
 	 * 수집원 코드명칭

+ 31 - 80
src/main/java/com/its/traf/global/AppRepository.java

@@ -13,8 +13,8 @@ import java.util.concurrent.ConcurrentHashMap;
 public class AppRepository {
     private static AppRepository _instance = null;
 
-    public ConcurrentHashMap<Integer, TrafPrcsVo> prcsMap = null;
-    public ConcurrentHashMap<Integer, TrafPrcsVo> statMap = null;
+    public ConcurrentHashMap<Integer, TrafJobVo> prcsMap = null;
+    public ConcurrentHashMap<Integer, TrafJobVo> statMap = null;
 
     public static AppRepository getInstance() {
         if (_instance == null) {
@@ -32,103 +32,54 @@ public class AppRepository {
     }
 
     public void initMap() {
-        initPrcsMap();
-        initStatMap();
 
-//        TrafJobType arr[] = TrafJobType.values();
-//        for (TrafJobType col : arr) {
-//            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX: " + col + " at index " + col.ordinal());
-//        }
-    }
-
-    private void initPrcsMap() {
-        int idx = 0;
-        this.prcsMap.put(TrafJobType.PRCS_05M_ALL.ordinal(), new TrafPrcsVo(idx++, "교통정보가공", "ALL"));
-
-        this.prcsMap.put(TrafJobType.LOAD_PARAMETER.ordinal(), new TrafPrcsVo(idx++, "기초정보로딩-파리미터", "CLCT_SYST_STUP,HLDY_INFR,SECT_GRAD,VMS_IFSC_CMTR_GRAD,LINK_PARA_STUP"));
-        this.prcsMap.put(TrafJobType.LOAD_BASEDATA.ordinal(), new TrafPrcsVo(idx++, "기초정보로딩-기본정보", "LINK,IFSC,ROAD,VMS_IFSC,EQTY_SECT,INCD_RSTR_SECT"));
-        this.prcsMap.put(TrafJobType.LOAD_PATTERN.ordinal(), new TrafPrcsVo(idx++, "기초정보로딩-패턴정보", "LINK05,IFSC05,ROAD05,LINK15,IFSC15,ROAD15"));
-        this.prcsMap.put(TrafJobType.LOAD_ALL.ordinal(), new TrafPrcsVo(idx++, "기초정보로딩", "ALL"));
-
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_INCD.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-돌발", "INCD_OCRR,INCD_RSTR_SECT"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_OPER.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-운영자", "LINK_SYOP_TRAF,IFSC_RLTN_LINK"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_VDS.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-VDS", "VDS_DTCT_CLCT,VDS_DTCT_RLTN_LINK,VDS_DTCT"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_DSRC.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-DSRC", "RSE_SECT_RLTN_LINK,RSE_SECT_TRAF"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_MOCT.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-민간정보연계", "TRAFFIC_MOCT,LINK"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_GITS.ordinal(), new TrafPrcsVo(idx++, "소통정보수집-경기도연계", "EI_LINK_CUR,LINK"));
-        this.prcsMap.put(TrafJobType.PRCS_LOAD_RAW_ALL.ordinal(), new TrafPrcsVo(idx++, "소통정보수집", "ALL"));
-
-        this.prcsMap.put(TrafJobType.PRCS_LINK_TRAF.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-LINK-TRAF", "LINK_TRAF"));
-        this.prcsMap.put(TrafJobType.PRCS_LINK_TRAF_HS.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-LINK-TRAF-HS", "LINK_TRAF_HS"));
-        this.prcsMap.put(TrafJobType.PRCS_IFSC_TRAF.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-IFSC-TRAF", "IFSC_TRAF"));
-        this.prcsMap.put(TrafJobType.PRCS_IFSC_TRAF_HS.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-IFSC-TRAF-HS", "IFSC_TRAF_HS"));
-        this.prcsMap.put(TrafJobType.PRCS_ROAD_TRAF.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-ROAD-TRAF", "ROAD_TRAF"));
-        this.prcsMap.put(TrafJobType.PRCS_ROAD_TRAF_HS.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-ROAD-TRAF-HS", "ROAD_TRAF_HS"));
-        this.prcsMap.put(TrafJobType.PRCS_VMS_TRAF.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-VMS-TRAF", "VMS_TRAF"));
-        this.prcsMap.put(TrafJobType.PRCS_VMS_TRAF_HS.ordinal(), new TrafPrcsVo(idx++, "소통정보가공-VMS-TRAF-HS", "VMS_TRAF_HS"));
-
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_LINK_05M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-LINK-05M", "LINK_PTRN_5M"));
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_IFSC_05M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-IFSC-05M", "IFSC_PTRN_5M"));
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_ROAD_05M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-ROAD-05M", "ROAD_PTRN_5M"));
+        for (eTrafPrcsJob prcsJob : eTrafPrcsJob.values()) {
+            this.prcsMap.put(prcsJob.getValue(), new TrafJobVo(prcsJob.getValue(), prcsJob.getName(), prcsJob.getDesc()));
+        }
 
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_LINK_15M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-LINK-15M", "LINK_PTRN_15M"));
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_IFSC_15M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-IFSC-15M", "IFSC_PTRN_15M"));
-        this.prcsMap.put(TrafJobType.PRCS_PTRN_ROAD_15M.ordinal(), new TrafPrcsVo(idx++, "패턴정보생성-ROAD-15M", "ROAD_PTRN_15M"));
+        for (eTrafStatJob statJob : eTrafStatJob.values()) {
+            this.statMap.put(statJob.getValue(), new TrafJobVo(statJob.getValue(), statJob.getName(), statJob.getDesc()));
+        }
     }
-    private void initStatMap() {
-        int idx = 0;
-        this.statMap.put(TrafJobType.STAT_LINK_15M.ordinal(), new TrafPrcsVo(idx++, "15분통계-LINK-15M", "LINK_STAT_15M"));
-        this.statMap.put(TrafJobType.STAT_IFSC_15M.ordinal(), new TrafPrcsVo(idx++, "15분통계-IFSC-15M", "IFSC_STAT_15M"));
-        this.statMap.put(TrafJobType.STAT_ROAD_15M.ordinal(), new TrafPrcsVo(idx++, "15분통계-ROAD-15M", "ROAD_STAT_15M"));
-
-        this.statMap.put(TrafJobType.STAT_LINK_HH.ordinal(), new TrafPrcsVo(idx++, "시간통계-LINK-HH", "LINK_STAT_HH"));
-        this.statMap.put(TrafJobType.STAT_IFSC_HH.ordinal(), new TrafPrcsVo(idx++, "시간통계-IFSC-HH", "IFSC_STAT_HH"));
-        this.statMap.put(TrafJobType.STAT_ROAD_HH.ordinal(), new TrafPrcsVo(idx++, "시간통계-ROAD-HH", "ROAD_STAT_HH"));
-
-        this.statMap.put(TrafJobType.STAT_LINK_DD.ordinal(), new TrafPrcsVo(idx++, "일 통계-LINK-DD", "LINK_STAT_DD"));
-        this.statMap.put(TrafJobType.STAT_IFSC_DD.ordinal(), new TrafPrcsVo(idx++, "일 통계-IFSC-DD", "IFSC_STAT_DD"));
-        this.statMap.put(TrafJobType.STAT_ROAD_DD.ordinal(), new TrafPrcsVo(idx++, "일 통계-ROAD-DD", "ROAD_STAT_DD"));
 
-        this.statMap.put(TrafJobType.STAT_LINK_MN.ordinal(), new TrafPrcsVo(idx++, "월 통계-LINK-MN", "LINK_STAT_MN"));
-        this.statMap.put(TrafJobType.STAT_IFSC_MN.ordinal(), new TrafPrcsVo(idx++, "월 통계-IFSC-MN", "IFSC_STAT_MN"));
-        this.statMap.put(TrafJobType.STAT_ROAD_MN.ordinal(), new TrafPrcsVo(idx++, "월 통계-ROAD-MN", "ROAD_STAT_MN"));
-
-        this.statMap.put(TrafJobType.STAT_LINK_YY.ordinal(), new TrafPrcsVo(idx++, "년 통계-LINK-YY", "LINK_STAT_YY"));
-        this.statMap.put(TrafJobType.STAT_IFSC_YY.ordinal(), new TrafPrcsVo(idx++, "년 통계-IFSC-YY", "IFSC_STAT_YY"));
-        this.statMap.put(TrafJobType.STAT_ROAD_YY.ordinal(), new TrafPrcsVo(idx++, "년 통계-ROAD-YY", "ROAD_STAT_YY"));
-
-        this.statMap.put(TrafJobType.PRCN_REPT_CNGS_SECT.ordinal(), new TrafPrcsVo(idx++, "반복정체판정", "REPT_CNGS_SECT"));
+    public void startPrcsJob(eTrafPrcsJob jobType) {
+        TrafJobVo prcsVo = AppRepository.getInstance().getPrcsMap().get(jobType.ordinal());
+        if (prcsVo != null) {
+            prcsVo.startTime();
+        }
     }
 
-    public void startJob(TrafJobType jobType) {
-        TrafPrcsVo prcsVo = AppRepository.getInstance().getPrcsMap().get(jobType.ordinal());
-        if (prcsVo == null) {
-            prcsVo = AppRepository.getInstance().getStatMap().get(jobType.ordinal());
+    public void endPrcsJob(eTrafPrcsJob jobType, int jobCount, boolean isUIUpdate) {
+        TrafJobVo prcsVo = AppRepository.getInstance().getPrcsMap().get(jobType.ordinal());
+        if (prcsVo != null) {
+            prcsVo.endTime(jobCount);
         }
+        if (isUIUpdate) {
+            MainUI UI = MainUI.getInstance();
+            if (UI != null) {
+                UI.updateTrafPrcs();
+            }
+        }
+    }
+
+    public void startStatJob(eTrafStatJob jobType) {
+        TrafJobVo prcsVo = AppRepository.getInstance().getStatMap().get(jobType.ordinal());
         if (prcsVo != null) {
             prcsVo.startTime();
         }
     }
 
-    public void endJob(TrafJobType jobType, int jobCount, boolean isUIUpdate) {
-        boolean isStat = false;
-        TrafPrcsVo prcsVo = AppRepository.getInstance().getPrcsMap().get(jobType.ordinal());
-        if (prcsVo == null) {
-            isStat = true;
-            prcsVo = AppRepository.getInstance().getStatMap().get(jobType.ordinal());
-        }
+    public void endStatJob(eTrafStatJob jobType, int jobCount, boolean isUIUpdate) {
+        TrafJobVo prcsVo = AppRepository.getInstance().getStatMap().get(jobType.ordinal());
         if (prcsVo != null) {
             prcsVo.endTime(jobCount);
         }
         if (isUIUpdate) {
             MainUI UI = MainUI.getInstance();
             if (UI != null) {
-                if (isStat) {
-                    UI.updateTrafStat();
-                } else {
-                    UI.updateTrafPrcs();
-                }
+                UI.updateTrafStat();
             }
         }
     }
+
 }

+ 21 - 0
src/main/java/com/its/traf/global/TrafJobHistVo.java

@@ -0,0 +1,21 @@
+package com.its.traf.global;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class TrafJobHistVo {
+    int index;
+    private long startTm;
+    private long endTm;
+    private long jobCount;
+    private long jobTm;
+
+    public TrafJobHistVo(long startTm, long endTm, long jobCount, long jobTm) {
+        this.startTm = startTm;
+        this.endTm = endTm;
+        this.jobCount = jobCount;
+        this.jobTm = jobTm;
+    }
+}

+ 0 - 57
src/main/java/com/its/traf/global/TrafJobType.java

@@ -1,57 +0,0 @@
-package com.its.traf.global;
-
-public enum TrafJobType {
-
-    PRCS_05M_ALL,
-    LOAD_PARAMETER,
-    LOAD_BASEDATA,
-    LOAD_PATTERN,
-    LOAD_ALL,
-
-    PRCS_LOAD_INCD,
-    PRCS_LOAD_RAW_OPER,
-    PRCS_LOAD_RAW_VDS,
-    PRCS_LOAD_RAW_DSRC,
-    PRCS_LOAD_RAW_MOCT,
-    PRCS_LOAD_RAW_GITS,
-    PRCS_LOAD_RAW_ALL,
-
-    PRCS_LINK_TRAF,
-    PRCS_LINK_TRAF_HS,
-    PRCS_IFSC_TRAF,
-    PRCS_IFSC_TRAF_HS,
-    PRCS_ROAD_TRAF,
-    PRCS_ROAD_TRAF_HS,
-    PRCS_VMS_TRAF,
-    PRCS_VMS_TRAF_HS,
-
-    PRCS_PTRN_LINK_05M,
-    PRCS_PTRN_IFSC_05M,
-    PRCS_PTRN_ROAD_05M,
-    PRCS_PTRN_LINK_15M,
-    PRCS_PTRN_IFSC_15M,
-    PRCS_PTRN_ROAD_15M,
-
-    /////////////////////////////////////////////////////////////////////////////////////////
-    STAT_LINK_15M,
-    STAT_IFSC_15M,
-    STAT_ROAD_15M,
-
-    STAT_LINK_HH,
-    STAT_IFSC_HH,
-    STAT_ROAD_HH,
-
-    STAT_LINK_DD,
-    STAT_IFSC_DD,
-    STAT_ROAD_DD,
-
-    STAT_LINK_MN,
-    STAT_IFSC_MN,
-    STAT_ROAD_MN,
-
-    STAT_LINK_YY,
-    STAT_IFSC_YY,
-    STAT_ROAD_YY,
-
-    PRCN_REPT_CNGS_SECT,
-}

+ 19 - 2
src/main/java/com/its/traf/global/TrafPrcsVo.java → src/main/java/com/its/traf/global/TrafJobVo.java

@@ -1,13 +1,17 @@
 package com.its.traf.global;
 
+import com.its.traf.define.ITS;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Getter
 @Setter
 @ToString
-public class TrafPrcsVo {
+public class TrafJobVo {
     private int    index;
     private int    jobSeq;
     private String jobName;
@@ -17,17 +21,22 @@ public class TrafPrcsVo {
     private long endTm;
     private long jobCount;
     private long jobTm;
+    private long maxJobTm;
     private long avgJobTm;
     private long totalJobRuns;
+    private List<TrafJobHistVo> listHist;
+
 
-    public TrafPrcsVo(int jobSeq, String jobName, String target) {
+    public TrafJobVo(int jobSeq, String jobName, String target) {
         this.index = 0;
         this.jobSeq = jobSeq;
         this.jobName = jobName;
         this.target = target;
         this.jobTm = 0;
+        this.maxJobTm = 0;
         this.avgJobTm = 0;
         this.totalJobRuns = 0;
+        this.listHist = new ArrayList<>();
     }
 
     public void startTime() {
@@ -40,6 +49,14 @@ public class TrafPrcsVo {
         this.jobCount += jobCount;
         this.endTm = System.currentTimeMillis();
         this.jobTm = this.endTm - this.startTm;
+        if (this.jobTm > this.maxJobTm) {
+            this.maxJobTm = this.jobTm;
+            TrafJobHistVo histVo = new TrafJobHistVo(this.startTm, this.endTm, this.jobCount, this.maxJobTm);
+            this.listHist.add(histVo);
+            if (this.listHist.size() > ITS.MAX_TRAF_JOB_HIST_CNT) {
+                this.listHist.remove(0);
+            }
+        }
         if (this.avgJobTm > 0) {
             this.avgJobTm = (this.jobTm + this.avgJobTm) / 2;
         } else {

+ 53 - 0
src/main/java/com/its/traf/global/eTrafPrcsJob.java

@@ -0,0 +1,53 @@
+package com.its.traf.global;
+
+public enum eTrafPrcsJob {
+    PRCS_05M_ALL("교통정보가공", "ALL"),
+
+    LOAD_PARAMETER("기초정보로딩-파리미터", "CLCT_SYST_STUP,HLDY_INFR,SECT_GRAD,VMS_IFSC_CMTR_GRAD,LINK_PARA_STUP"),
+    LOAD_BASEDATA("기초정보로딩-기본정보", "LINK,IFSC,ROAD,VMS_IFSC,EQTY_SECT,INCD_RSTR_SECT"),
+    LOAD_PATTERN("기초정보로딩-패턴정보", "LINK05,IFSC05,ROAD05,LINK15,IFSC15,ROAD15"),
+    LOAD_ALL("기초정보로딩", "ALL"),
+
+    PRCS_LOAD_INCD("소통정보수집-돌발", "INCD_OCRR,INCD_RSTR_SECT"),
+    PRCS_LOAD_RAW_OPER("소통정보수집-운영자", "LINK_SYOP_TRAF,IFSC_RLTN_LINK"),
+    PRCS_LOAD_RAW_VDS("소통정보수집-VDS", "VDS_DTCT_CLCT,VDS_DTCT_RLTN_LINK,VDS_DTCT"),
+    PRCS_LOAD_RAW_DSRC("소통정보수집-DSRC", "RSE_SECT_RLTN_LINK,RSE_SECT_TRAF"),
+    PRCS_LOAD_RAW_MOCT("소통정보수집-민간정보연계", "TRAFFIC_MOCT,LINK"),
+    PRCS_LOAD_RAW_GITS("소통정보수집-경기도연계", "EI_LINK_CUR,LINK"),
+    PRCS_LOAD_RAW_ALL("소통정보수집", "ALL"),
+
+    PRCS_LINK_TRAF("소통정보가공-LINK-TRAF", "LINK_TRAF"),
+    PRCS_LINK_TRAF_HS("소통정보가공-LINK-TRAF-HS", "LINK_TRAF_HS"),
+    PRCS_IFSC_TRAF("소통정보가공-IFSC-TRAF", "IFSC_TRAF"),
+    PRCS_IFSC_TRAF_HS("소통정보가공-IFSC-TRAF-HS", "IFSC_TRAF_HS"),
+    PRCS_ROAD_TRAF("소통정보가공-ROAD-TRAF", "ROAD_TRAF"),
+    PRCS_ROAD_TRAF_HS("소통정보가공-ROAD-TRAF-HS", "ROAD_TRAF_HS"),
+    PRCS_VMS_TRAF("소통정보가공-VMS-TRAF", "VMS_TRAF"),
+    PRCS_VMS_TRAF_HS("소통정보가공-VMS-TRAF-HS", "VMS_TRAF_HS"),
+
+    PRCS_PTRN_LINK_05M("패턴정보생성-LINK-05M", "LINK_PTRN_5M"),
+    PRCS_PTRN_IFSC_05M("패턴정보생성-IFSC-05M", "IFSC_PTRN_5M"),
+    PRCS_PTRN_ROAD_05M("패턴정보생성-ROAD-05M", "ROAD_PTRN_5M"),
+
+    PRCS_PTRN_LINK_15M("패턴정보생성-LINK-15M", "LINK_PTRN_15M"),
+    PRCS_PTRN_IFSC_15M("패턴정보생성-IFSC-15M", "IFSC_PTRN_15M"),
+    PRCS_PTRN_ROAD_15M("패턴정보생성-ROAD-15M", "ROAD_PTRN_15M");
+
+    private String name;
+    private String desc;
+
+    eTrafPrcsJob(String name, String desc) {
+        this.name = name;
+        this.desc = desc;
+    }
+
+    public Integer getValue() {
+        return this.ordinal();
+    }
+    public String getName() {
+        return this.name;
+    }
+    public String getDesc() {
+        return this.desc;
+    }
+}

+ 43 - 0
src/main/java/com/its/traf/global/eTrafStatJob.java

@@ -0,0 +1,43 @@
+package com.its.traf.global;
+
+public enum eTrafStatJob {
+    STAT_LINK_15M("15분통계-LINK-15M", "LINK_STAT_15M"),
+    STAT_IFSC_15M("15분통계-IFSC-15M", "IFSC_STAT_15M"),
+    STAT_ROAD_15M("15분통계-ROAD-15M", "ROAD_STAT_15M"),
+
+    STAT_LINK_HH("시간통계-LINK-HH", "LINK_STAT_HH"),
+    STAT_IFSC_HH("시간통계-IFSC-HH", "IFSC_STAT_HH"),
+    STAT_ROAD_HH("시간통계-ROAD-HH", "ROAD_STAT_HH"),
+
+    STAT_LINK_DD("일 통계-LINK-DD", "LINK_STAT_DD"),
+    STAT_IFSC_DD("일 통계-IFSC-DD", "IFSC_STAT_DD"),
+    STAT_ROAD_DD("일 통계-ROAD-DD", "ROAD_STAT_DD"),
+
+    STAT_LINK_MN("월 통계-LINK-MN", "LINK_STAT_MN"),
+    STAT_IFSC_MN("월 통계-IFSC-MN", "IFSC_STAT_MN"),
+    STAT_ROAD_MN("월 통계-ROAD-MN", "ROAD_STAT_MN"),
+
+    STAT_LINK_YY("년 통계-LINK-YY", "LINK_STAT_YY"),
+    STAT_IFSC_YY("년 통계-IFSC-YY", "IFSC_STAT_YY"),
+    STAT_ROAD_YY("년 통계-ROAD-YY", "ROAD_STAT_YY"),
+
+    PRCN_REPT_CNGS_SECT("반복정체판정", "REPT_CNGS_SECT");
+
+    private String name;
+    private String desc;
+
+    eTrafStatJob(String name, String desc) {
+        this.name = name;
+        this.desc = desc;
+    }
+
+    public Integer getValue() {
+        return this.ordinal();
+    }
+    public String getName() {
+        return this.name;
+    }
+    public String getDesc() {
+        return this.desc;
+    }
+}

+ 11 - 1
src/main/java/com/its/traf/scheduler/TrafPrcsSchedulerTask.java

@@ -19,6 +19,7 @@ public class TrafPrcsSchedulerTask {
     private final TrafPrcs05MPrepareController trafPrcs05MPrepareController;
     private final TrafPrcs05MController trafPrcs05MController;
     private final TrafPrcs15MController trafPrcs15MController;
+    private final TrafPrcs15MController trafPrcs30MController;
     private final TrafPrcsHHController trafPrcsHHController;
     private final TrafPrcsDDController trafPrcsDDController;
     private final TrafPrcsMNController trafPrcsMNController;
@@ -66,7 +67,16 @@ public class TrafPrcsSchedulerTask {
     }
 
     @SchedulerElapsed
-    @Scheduled(cron = "30 6 * * * *")  // 1시간주기 작업 실행(매시 6분 30초)
+    @Scheduled(cron = "15 3/30 * * * *")  // 30분주기 작업 실행(3, 33 분 15초)
+    public void scheduleTrafPrcs30M() {
+        if (!this.processConfig.isStartSchedule()) {
+            return;
+        }
+        runJob(this.trafPrcs30MController, "Statistics 30M");
+    }
+
+    @SchedulerElapsed
+    @Scheduled(cron = "30 8 * * * *")  // 1시간주기 작업 실행(매시 8분 30초)
     public void scheduleTrafPrcsHH() {
         if (!this.processConfig.isStartSchedule()) {
             return;

+ 7 - 7
src/main/java/com/its/traf/service/its/TbIfscService.java

@@ -4,7 +4,8 @@ import com.its.traf.config.ProcessingConfig;
 import com.its.traf.dao.mapper.its.IfscMapper;
 import com.its.traf.dto.its.*;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -15,7 +16,6 @@ import com.its.traf.vo.traffic.voLinkTraf;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -224,11 +224,11 @@ public class TbIfscService extends AbstractDataService<Long, TbIfscDto> implemen
         }
 
         //if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_IFSC_TRAF);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_IFSC_TRAF);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_TRAF_UPDATE, false, updLists, updLists.size()));
         //}
         //if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_IFSC_TRAF_HS);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_IFSC_TRAF_HS);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_TRAF_HS_INSERT, false, insLists, insLists.size()));
         //}
     }
@@ -306,7 +306,7 @@ public class TbIfscService extends AbstractDataService<Long, TbIfscDto> implemen
         }
 
         if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.STAT_IFSC_15M);
+            AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_IFSC_15M);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_STAT_15M_INSERT, false, insLists, insLists.size()));
         }
     }
@@ -387,7 +387,7 @@ public class TbIfscService extends AbstractDataService<Long, TbIfscDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_IFSC_05M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_05M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_PTRN_HLDY_05M_UPDATE, false, updLists, updLists.size()));
             } else {
@@ -491,7 +491,7 @@ public class TbIfscService extends AbstractDataService<Long, TbIfscDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_IFSC_15M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_15M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_IFSC_PTRN_HLDY_15M_UPDATE, false, updLists, updLists.size()));
             } else {

+ 3 - 4
src/main/java/com/its/traf/service/its/TbIncdService.java

@@ -4,13 +4,12 @@ import com.its.traf.dao.mapper.its.IncdMapper;
 import com.its.traf.dto.its.TbIncdOcrrDto;
 import com.its.traf.dto.its.TbLinkDto;
 import com.its.traf.global.AppRepository;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.service.AbstractDataService;
-import com.its.traf.global.TrafJobType;
-import com.its.traf.global.TrafPrcsVo;
+import com.its.traf.global.TrafJobVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -41,7 +40,7 @@ public class TbIncdService extends AbstractDataService<Long, TbIncdOcrrDto> {
 
         init();
 
-        TrafPrcsVo prcsVo = AppRepository.getInstance().getPrcsMap().get(TrafJobType.PRCS_LOAD_INCD.ordinal());
+        TrafJobVo prcsVo = AppRepository.getInstance().getPrcsMap().get(eTrafPrcsJob.PRCS_LOAD_INCD.ordinal());
         if (prcsVo != null) {
             prcsVo.startTime();
         }

+ 9 - 8
src/main/java/com/its/traf/service/its/TbLinkService.java

@@ -5,7 +5,8 @@ import com.its.traf.dao.mapper.its.LinkMapper;
 import com.its.traf.define.ITS;
 import com.its.traf.dto.its.*;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -168,9 +169,9 @@ public class TbLinkService extends AbstractDataService<Long, TbLinkDto> implemen
     @SchedulerElapsed
     public void collect() {
         // 원시 수집 교통정보 로딩
-        AppRepository.getInstance().startJob(TrafJobType.PRCS_LOAD_RAW_ALL);
+        AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_LOAD_RAW_ALL);
         this.linkRawDataCollectService.collect();
-        AppRepository.getInstance().endJob(TrafJobType.PRCS_LOAD_RAW_ALL, 0, true);
+        AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_LOAD_RAW_ALL, 0, true);
     }
 
     /*
@@ -547,11 +548,11 @@ public class TbLinkService extends AbstractDataService<Long, TbLinkDto> implemen
         }
 
         //if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_LINK_TRAF);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_LINK_TRAF);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_TRAF_UPDATE, false, updLists, updLists.size()));
         //}
         //if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_LINK_TRAF_HS);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_LINK_TRAF_HS);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_TRAF_HS_INSERT, false, insLists, insLists.size()));
         //}
     }
@@ -675,7 +676,7 @@ public class TbLinkService extends AbstractDataService<Long, TbLinkDto> implemen
         }
 
         if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.STAT_LINK_15M);
+            AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_LINK_15M);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_STAT_15M_INSERT, false, insLists, insLists.size()));
         }
     }
@@ -773,7 +774,7 @@ public class TbLinkService extends AbstractDataService<Long, TbLinkDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_LINK_05M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_05M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_PTRN_HLDY_05M_UPDATE, false, updLists, updLists.size()));
             } else {
@@ -877,7 +878,7 @@ public class TbLinkService extends AbstractDataService<Long, TbLinkDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_LINK_15M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_15M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_LINK_PTRN_HLDY_15M_UPDATE, false, updLists, updLists.size()));
             } else {

+ 7 - 7
src/main/java/com/its/traf/service/its/TbRoadService.java

@@ -4,7 +4,8 @@ import com.its.traf.config.ProcessingConfig;
 import com.its.traf.dao.mapper.its.RoadMapper;
 import com.its.traf.dto.its.*;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -15,7 +16,6 @@ import com.its.traf.vo.traffic.voRoadTraf;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -225,11 +225,11 @@ public class TbRoadService extends AbstractDataService<Long, TbRoadDto> implemen
         }
 
         //if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_ROAD_TRAF);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_ROAD_TRAF);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_TRAF_UPDATE, false, updLists, updLists.size()));
         //}
         //if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_ROAD_TRAF_HS);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_ROAD_TRAF_HS);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_TRAF_HS_INSERT, false, insLists, insLists.size()));
         //}
     }
@@ -307,7 +307,7 @@ public class TbRoadService extends AbstractDataService<Long, TbRoadDto> implemen
         }
 
         if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.STAT_ROAD_15M);
+            AppRepository.getInstance().startStatJob(eTrafStatJob.STAT_ROAD_15M);
             this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_STAT_15M_INSERT, false, insLists, insLists.size()));
         }
     }
@@ -388,7 +388,7 @@ public class TbRoadService extends AbstractDataService<Long, TbRoadDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_ROAD_05M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_05M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_PTRN_HLDY_05M_UPDATE, false, updLists, updLists.size()));
             } else {
@@ -492,7 +492,7 @@ public class TbRoadService extends AbstractDataService<Long, TbRoadDto> implemen
         }
 
         if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_PTRN_ROAD_15M);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_15M);
             if (this.hldyService.isHoliday()) {
                 this.dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_ROAD_PTRN_HLDY_15M_UPDATE, false, updLists, updLists.size()));
             } else {

+ 3 - 3
src/main/java/com/its/traf/service/its/TbVmsIfscService.java

@@ -4,7 +4,7 @@ import com.its.traf.config.AppUtils;
 import com.its.traf.dao.mapper.its.VmsIfscMapper;
 import com.its.traf.dto.its.*;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.process.DbmsData;
 import com.its.traf.process.DbmsDataProcess;
 import com.its.traf.process.DbmsDataType;
@@ -192,11 +192,11 @@ public class TbVmsIfscService extends AbstractDataService<Long, TbVmsIfscDto> im
 
         DbmsDataProcess dbmsDataProcess = (DbmsDataProcess) AppUtils.getBean(DbmsDataProcess.class);
         //if (updLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_VMS_TRAF);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_VMS_TRAF);
             dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_VMS_IFSC_TRAF_UPDATE, false, updLists, updLists.size()));
         //}
         //if (insLists.size() > 0) {
-            AppRepository.getInstance().startJob(TrafJobType.PRCS_VMS_TRAF_HS);
+            AppRepository.getInstance().startPrcsJob(eTrafPrcsJob.PRCS_VMS_TRAF_HS);
             dbmsDataProcess.add(new DbmsData(DbmsDataType.TB_VMS_IFSC_TRAF_HS_INSERT, false, insLists, insLists.size()));
         //}
     }

+ 9 - 9
src/main/java/com/its/traf/service/its/collect/LinkRawDataCollectWorker.java

@@ -4,8 +4,8 @@ import com.its.traf.config.AppUtils;
 import com.its.traf.dto.its.LinkRawDataDto;
 import com.its.traf.dto.its.LinkRawDataResultDto;
 import com.its.traf.global.AppRepository;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.service.its.dao.LinkRawDataDaoService;
-import com.its.traf.global.TrafJobType;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -29,20 +29,20 @@ public class LinkRawDataCollectWorker implements Runnable {
         SqlSessionFactory sqlSessionFactory = null;
         String beanName = this.CLCT_SYST_CD.toLowerCase();
 
-        TrafJobType jobType = null;
+        eTrafPrcsJob jobType = null;
         if ("oper01".equals(beanName)) {
-            jobType = TrafJobType.PRCS_LOAD_RAW_OPER;
+            jobType = eTrafPrcsJob.PRCS_LOAD_RAW_OPER;
         } else if ("vds01".equals(beanName)) {
-            jobType = TrafJobType.PRCS_LOAD_RAW_VDS;
+            jobType = eTrafPrcsJob.PRCS_LOAD_RAW_VDS;
         } else if ("dsrc01".equals(beanName)) {
-            jobType = TrafJobType.PRCS_LOAD_RAW_DSRC;
+            jobType = eTrafPrcsJob.PRCS_LOAD_RAW_DSRC;
         } else if ("moct01".equals(beanName)) {
-            jobType = TrafJobType.PRCS_LOAD_RAW_MOCT;
+            jobType = eTrafPrcsJob.PRCS_LOAD_RAW_MOCT;
         } else if ("gits01".equals(beanName)) {
-            jobType = TrafJobType.PRCS_LOAD_RAW_GITS;
+            jobType = eTrafPrcsJob.PRCS_LOAD_RAW_GITS;
         }
         if (jobType != null) {
-            AppRepository.getInstance().startJob(jobType);
+            AppRepository.getInstance().startPrcsJob(jobType);
         }
 
         try {
@@ -66,7 +66,7 @@ public class LinkRawDataCollectWorker implements Runnable {
             this.mapData.put(this.CLCT_SYST_CD, LinkRawDataResultDto.builder().CLCT_SYST_CD(this.CLCT_SYST_CD).lists(new ArrayList<>()).build());
         }
         if (jobType != null) {
-            AppRepository.getInstance().endJob(jobType, this.mapData.get(this.CLCT_SYST_CD).getLists().size(), false);
+            AppRepository.getInstance().endPrcsJob(jobType, this.mapData.get(this.CLCT_SYST_CD).getLists().size(), false);
         }
     }
 

+ 13 - 12
src/main/java/com/its/traf/service/its/dao/IfscDaoService.java

@@ -2,7 +2,8 @@ package com.its.traf.service.its.dao;
 
 import com.its.traf.dao.mapper.its.IfscMapper;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsDataType;
 import com.its.traf.vo.statistics.voStatistics;
 import lombok.extern.slf4j.Slf4j;
@@ -41,19 +42,19 @@ public class IfscDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_IFSC_STAT_HH_CREATE:
                 result = this.mapper.createIfscTrafStatHh((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_IFSC_HH, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_IFSC_HH, result, true);
                 break;
             case TB_IFSC_STAT_DD_CREATE:
                 result = this.mapper.createIfscTrafStatDd((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_IFSC_DD, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_IFSC_DD, result, true);
                 break;
             case TB_IFSC_STAT_MN_CREATE:
                 result = this.mapper.createIfscTrafStatMn((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_IFSC_MN, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_IFSC_MN, result, true);
                 break;
             case TB_IFSC_STAT_YY_CREATE:
                 result = this.mapper.createIfscTrafStatYy((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_IFSC_YY, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_IFSC_YY, result, true);
                 break;
             default:
                 log.error("[DIRECT-SQL] {}: ..END. [{}], Unknown SQL Type.", proceedName, type.name());
@@ -76,11 +77,11 @@ public class IfscDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_IFSC_TRAF_HS_INSERT:
                 result = insertBatch("insertIfscTrafHs", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_IFSC_TRAF_HS, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_IFSC_TRAF_HS, result, true);
                 break;
             case TB_IFSC_STAT_15M_INSERT:
                 result = insertBatch("insertIfscTrafStat15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_IFSC_15M, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_IFSC_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-INST] {}: ..END. [{}], Unknown BATCH INSERT Type.", proceedName, type.name());
@@ -104,23 +105,23 @@ public class IfscDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_IFSC_TRAF_UPDATE:
                 result = updateBatch("updateIfscTraf", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_IFSC_TRAF, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_IFSC_TRAF, result, true);
                 break;
             case TB_IFSC_PTRN_05M_UPDATE:
                 result = updateBatch("updateIfscPtrn05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_IFSC_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_05M, result, true);
                 break;
             case TB_IFSC_PTRN_HLDY_05M_UPDATE:
                 result = updateBatch("updateIfscPtrnHldy05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_IFSC_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_05M, result, true);
                 break;
             case TB_IFSC_PTRN_15M_UPDATE:
                 result = updateBatch("updateIfscPtrn15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_IFSC_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_15M, result, true);
                 break;
             case TB_IFSC_PTRN_HLDY_15M_UPDATE:
                 result = updateBatch("updateIfscPtrnHldy15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_IFSC_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_IFSC_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-UPDT] {}: ..END. [{}], Unknown BATCH UPDATE Type.", proceedName, type.name());

+ 13 - 12
src/main/java/com/its/traf/service/its/dao/LinkDaoService.java

@@ -3,7 +3,8 @@ package com.its.traf.service.its.dao;
 import com.its.traf.dao.mapper.its.LinkMapper;
 import com.its.traf.dto.its.TbTrafPrcnStatDto;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsDataType;
 import com.its.traf.vo.statistics.voStatistics;
 import lombok.extern.slf4j.Slf4j;
@@ -45,19 +46,19 @@ public class LinkDaoService extends BatchDaoService implements AbstractDaoServic
                 break;
             case TB_LINK_STAT_HH_CREATE:
                 result = this.mapper.createLinkTrafStatHh((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_LINK_HH, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_LINK_HH, result, true);
                 break;
             case TB_LINK_STAT_DD_CREATE:
                 result = this.mapper.createLinkTrafStatDd((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_LINK_DD, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_LINK_DD, result, true);
                 break;
             case TB_LINK_STAT_MN_CREATE:
                 result = this.mapper.createLinkTrafStatMn((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_LINK_MN, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_LINK_MN, result, true);
                 break;
             case TB_LINK_STAT_YY_CREATE:
                 result = this.mapper.createLinkTrafStatYy((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_LINK_YY, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_LINK_YY, result, true);
                 break;
             default:
                 log.error("[DIRECT-SQL] {}: ..END. [{}], Unknown SQL Type.", proceedName, type.name());
@@ -80,7 +81,7 @@ public class LinkDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_LINK_TRAF_HS_INSERT:
                 result = insertBatch("insertLinkTrafHs", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_LINK_TRAF_HS, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_LINK_TRAF_HS, result, true);
                 break;
             case TB_LINK_TRAF_CLCT_HS_INSERT:
                 result = insertBatch("insertLinkTrafClctHs", lists);
@@ -93,7 +94,7 @@ public class LinkDaoService extends BatchDaoService implements AbstractDaoServic
                 break;
             case TB_LINK_STAT_15M_INSERT:
                 result = insertBatch("insertLinkTrafStat15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_LINK_15M, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_LINK_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-INST] {}: ..END. [{}], Unknown BATCH INSERT Type.", proceedName, type.name());
@@ -117,23 +118,23 @@ public class LinkDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_LINK_TRAF_UPDATE:
                 result = updateBatch("updateLinkTraf", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_LINK_TRAF, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_LINK_TRAF, result, true);
                 break;
             case TB_LINK_PTRN_05M_UPDATE:
                 result = updateBatch("updateLinkPtrn05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_LINK_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_05M, result, true);
                 break;
             case TB_LINK_PTRN_HLDY_05M_UPDATE:
                 result = updateBatch("updateLinkPtrnHldy05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_LINK_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_05M, result, true);
                 break;
             case TB_LINK_PTRN_15M_UPDATE:
                 result = updateBatch("updateLinkPtrn15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_LINK_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_15M, result, true);
                 break;
             case TB_LINK_PTRN_HLDY_15M_UPDATE:
                 result = updateBatch("updateLinkPtrnHldy15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_LINK_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_LINK_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-UPDT] {}: ..END. [{}], Unknown BATCH UPDATE Type.", proceedName, type.name());

+ 2 - 2
src/main/java/com/its/traf/service/its/dao/ReptCngsSectDaoService.java

@@ -2,7 +2,7 @@ package com.its.traf.service.its.dao;
 
 import com.its.traf.dao.mapper.its.ReptCngsSectMapper;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsDataType;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -50,7 +50,7 @@ public class ReptCngsSectDaoService extends BatchDaoService implements AbstractD
         int result = 0;
         if (type == DbmsDataType.TB_REPT_CNGS_SECT_UPDATE) {
             result = updateBatch("updateReptCngsSect", lists);
-            AppRepository.getInstance().endJob(TrafJobType.PRCN_REPT_CNGS_SECT, result, true);
+            AppRepository.getInstance().endStatJob(eTrafStatJob.PRCN_REPT_CNGS_SECT, result, true);
         }
         else {
             log.error("[BATCH-UPDT] {}: ..END. [{}], Unknown BATCH UPDATE Type.", proceedName, type.name());

+ 13 - 12
src/main/java/com/its/traf/service/its/dao/RoadDaoService.java

@@ -2,7 +2,8 @@ package com.its.traf.service.its.dao;
 
 import com.its.traf.dao.mapper.its.RoadMapper;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
+import com.its.traf.global.eTrafStatJob;
 import com.its.traf.process.DbmsDataType;
 import com.its.traf.vo.statistics.voStatistics;
 import lombok.extern.slf4j.Slf4j;
@@ -41,19 +42,19 @@ public class RoadDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_ROAD_STAT_HH_CREATE:
                 result = this.mapper.createRoadTrafStatHh((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_ROAD_HH, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_ROAD_HH, result, true);
                 break;
             case TB_ROAD_STAT_DD_CREATE:
                 result = this.mapper.createRoadTrafStatDd((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_ROAD_DD, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_ROAD_DD, result, true);
                 break;
             case TB_ROAD_STAT_MN_CREATE:
                 result = this.mapper.createRoadTrafStatMn((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_ROAD_MN, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_ROAD_MN, result, true);
                 break;
             case TB_ROAD_STAT_YY_CREATE:
                 result = this.mapper.createRoadTrafStatYy((voStatistics)obj);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_ROAD_YY, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_ROAD_YY, result, true);
                 break;
             default:
                 log.error("[DIRECT-SQL] {}: ..END. [{}], Unknown SQL Type.", proceedName, type.name());
@@ -76,11 +77,11 @@ public class RoadDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_ROAD_TRAF_HS_INSERT:
                 result = insertBatch("insertRoadTrafHs", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_ROAD_TRAF_HS, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_ROAD_TRAF_HS, result, true);
                 break;
             case TB_ROAD_STAT_15M_INSERT:
                 result = insertBatch("insertRoadTrafStat15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.STAT_ROAD_15M, result, true);
+                AppRepository.getInstance().endStatJob(eTrafStatJob.STAT_ROAD_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-INST] {}: ..END. [{}], Unknown BATCH INSERT Type.", proceedName, type.name());
@@ -104,23 +105,23 @@ public class RoadDaoService extends BatchDaoService implements AbstractDaoServic
         switch(type) {
             case TB_ROAD_TRAF_UPDATE:
                 result = updateBatch("updateRoadTraf", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_ROAD_TRAF, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_ROAD_TRAF, result, true);
                 break;
             case TB_ROAD_PTRN_05M_UPDATE:
                 result = updateBatch("updateRoadPtrn05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_ROAD_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_05M, result, true);
                 break;
             case TB_ROAD_PTRN_HLDY_05M_UPDATE:
                 result = updateBatch("updateRoadPtrnHldy05M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_ROAD_05M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_05M, result, true);
                 break;
             case TB_ROAD_PTRN_15M_UPDATE:
                 result = updateBatch("updateRoadPtrn15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_ROAD_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_15M, result, true);
                 break;
             case TB_ROAD_PTRN_HLDY_15M_UPDATE:
                 result = updateBatch("updateRoadPtrnHldy15M", lists);
-                AppRepository.getInstance().endJob(TrafJobType.PRCS_PTRN_ROAD_15M, result, true);
+                AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_PTRN_ROAD_15M, result, true);
                 break;
             default:
                 log.error("[BATCH-UPDT] {}: ..END. [{}], Unknown BATCH UPDATE Type.", proceedName, type.name());

+ 3 - 3
src/main/java/com/its/traf/service/its/dao/VmsIfscDaoService.java

@@ -2,7 +2,7 @@ package com.its.traf.service.its.dao;
 
 import com.its.traf.dao.mapper.its.LinkMapper;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafJobType;
+import com.its.traf.global.eTrafPrcsJob;
 import com.its.traf.process.DbmsDataType;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -45,7 +45,7 @@ public class VmsIfscDaoService extends BatchDaoService implements AbstractDaoSer
         int result = 0;
         if (type == DbmsDataType.TB_VMS_IFSC_TRAF_HS_INSERT) {
             result = updateBatch("insertVmsIfscTrafHs", lists);
-            AppRepository.getInstance().endJob(TrafJobType.PRCS_VMS_TRAF_HS, result, true);
+            AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_VMS_TRAF_HS, result, true);
             lists.clear();
         }
         else {
@@ -67,7 +67,7 @@ public class VmsIfscDaoService extends BatchDaoService implements AbstractDaoSer
         int result = 0;
         if (type == DbmsDataType.TB_VMS_IFSC_TRAF_UPDATE) {
             result = updateBatch("updateVmsIfscTraf", lists);
-            AppRepository.getInstance().endJob(TrafJobType.PRCS_VMS_TRAF, result, true);
+            AppRepository.getInstance().endPrcsJob(eTrafPrcsJob.PRCS_VMS_TRAF, result, true);
         }
         else {
             log.error("[BATCH-UPDT] {}: ..END. [{}], Unknown BATCH UPDATE Type.", proceedName, type.name());

+ 0 - 33
src/main/java/com/its/traf/ui/CtlrSttsDetlTableCellRenderer.java

@@ -1,33 +0,0 @@
-package com.its.traf.ui;
-
-import javax.swing.*;
-import javax.swing.table.DefaultTableCellRenderer;
-import java.awt.*;
-
-public class CtlrSttsDetlTableCellRenderer extends DefaultTableCellRenderer {
-
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
-
-        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
-        String commStts = table.getModel().getValueAt(row, 6).toString();
-        if (commStts.equals("Connect")) {
-            cell.setBackground(new Color(255, 255, 255, 255));
-            String door = table.getModel().getValueAt(row, 7).toString();
-            String fan = table.getModel().getValueAt(row, 8).toString();
-            String heater = table.getModel().getValueAt(row, 9).toString();
-            String video = table.getModel().getValueAt(row, 11).toString();
-        } else if (commStts.equals("Login")) {
-            cell.setBackground(new Color(182, 175, 97, 176));
-        } else {
-            cell.setBackground(new Color(182, 97, 97, 176));
-        }
-
-        if (column != 3 && column != 4) {
-            setHorizontalAlignment(SwingConstants.CENTER);
-        } else {
-            setHorizontalAlignment(SwingConstants.LEFT);
-        }
-
-        return cell;
-    }
-}

+ 53 - 10
src/main/java/com/its/traf/ui/MainUI.java

@@ -5,7 +5,7 @@ import com.intellij.uiDesigner.core.GridLayoutManager;
 import com.intellij.uiDesigner.core.Spacer;
 import com.its.app.utils.SysUtils;
 import com.its.traf.global.AppRepository;
-import com.its.traf.global.TrafPrcsVo;
+import com.its.traf.global.TrafJobVo;
 import com.sun.management.OperatingSystemMXBean;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
@@ -22,6 +22,8 @@ import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.StringSelection;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
@@ -33,10 +35,12 @@ import java.util.*;
 public class MainUI {
     private static MainUI _instance = null;
 
+    private SubUIController subUIController = null;
     private JFrame jFrame = null;
     private final OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
     private Timer timer;
     private Long tick = Long.valueOf(0);
+    private TrafJobVo selObj = null;
 
     private TrafPrcsTableModel trafPrcsTableModel = null;
     private TrafPrcsTableModel trafStatTableModel = null;
@@ -91,6 +95,8 @@ public class MainUI {
         this.jFrame = jFrame;
         if (_instance == null) {
             _instance = this;
+            subUIController = new SubUIController(jFrame);
+            subUIController.setVisible(false);
         }
 
         try {
@@ -156,12 +162,49 @@ public class MainUI {
             }
         });
 
+        listPrcs.addMouseListener(new MouseAdapter() {
+            public void mouseClicked(MouseEvent me) {
+                if (me.getClickCount() == 2) {
+                    updateControllerInfo(listPrcs);
+                }
+            }
+        });
+        listStat.addMouseListener(new MouseAdapter() {
+            public void mouseClicked(MouseEvent me) {
+                if (me.getClickCount() == 2) {
+                    updateControllerInfo(listStat);
+                }
+            }
+        });
+
     }
 
+    private boolean updateControllerInfo(JTable listInfo) {
+        if (subUIController.isVisible()) {
+            subUIController.setVisible(false);
+        }
+        if (!this.isUpdatable) {
+            return false;
+        }
+        int row = listInfo.getSelectedRow();
+        if (row < 0) {
+            return false;
+        }
+        TrafPrcsTableModel tableModel = (TrafPrcsTableModel) listInfo.getModel();
+        selObj = tableModel.getControllerInfo(row);
+        if (selObj != null) {
+            subUIController.updateInfo(selObj);
+            if (!subUIController.isVisible()) {
+                subUIController.setVisible(true);
+            }
+            return true;
+        }
+        return true;
+    }
     /**
      * 목록 헤더 생성
      */
-    private void initTblListUI(List<TrafPrcsVo> prcsList, List<TrafPrcsVo> statList) {
+    private void initTblListUI(List<TrafJobVo> prcsList, List<TrafJobVo> statList) {
         this.trafPrcsTableModel = new TrafPrcsTableModel(prcsList);
         this.trafStatTableModel = new TrafPrcsTableModel(statList);
         listPrcs.setModel(this.trafPrcsTableModel);
@@ -226,22 +269,22 @@ public class MainUI {
     }
 
     public void LoadControllerInfo() {
-        SortedMap<Integer, TrafPrcsVo> prcsMap = new TreeMap<>();
-        for (Map.Entry<Integer, TrafPrcsVo> e : AppRepository.getInstance().getPrcsMap().entrySet()) {
-            TrafPrcsVo obj = e.getValue();
+        SortedMap<Integer, TrafJobVo> prcsMap = new TreeMap<>();
+        for (Map.Entry<Integer, TrafJobVo> e : AppRepository.getInstance().getPrcsMap().entrySet()) {
+            TrafJobVo obj = e.getValue();
             prcsMap.put(obj.getJobSeq(), obj);
         }
 
-        SortedMap<Integer, TrafPrcsVo> statMap = new TreeMap<>();
-        for (Map.Entry<Integer, TrafPrcsVo> e : AppRepository.getInstance().getStatMap().entrySet()) {
-            TrafPrcsVo obj = e.getValue();
+        SortedMap<Integer, TrafJobVo> statMap = new TreeMap<>();
+        for (Map.Entry<Integer, TrafJobVo> e : AppRepository.getInstance().getStatMap().entrySet()) {
+            TrafJobVo obj = e.getValue();
             statMap.put(obj.getJobSeq(), obj);
         }
 
 //        List<TrafPrcsVo> prcsList = new ArrayList<TrafPrcsVo>(AppRepository.getInstance().getPrcsMap().values());
 //        List<TrafPrcsVo> statList = new ArrayList<TrafPrcsVo>(AppRepository.getInstance().getStatMap().values());
-        List<TrafPrcsVo> prcsList = new ArrayList<TrafPrcsVo>(prcsMap.values());
-        List<TrafPrcsVo> statList = new ArrayList<TrafPrcsVo>(statMap.values());
+        List<TrafJobVo> prcsList = new ArrayList<TrafJobVo>(prcsMap.values());
+        List<TrafJobVo> statList = new ArrayList<TrafJobVo>(statMap.values());
 
         initTblListUI(prcsList, statList);
     }

+ 78 - 0
src/main/java/com/its/traf/ui/SubUI.form

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.its.traf.ui.SubUI">
+  <grid id="27dc6" binding="rootPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+    <margin top="0" left="0" bottom="0" right="0"/>
+    <constraints>
+      <xy x="20" y="20" width="979" height="620"/>
+    </constraints>
+    <properties/>
+    <border type="none"/>
+    <children>
+      <grid id="d0095" binding="pnlCtlr" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+        <margin top="10" left="4" bottom="0" right="4"/>
+        <constraints>
+          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+        </constraints>
+        <properties/>
+        <border type="none"/>
+        <children>
+          <grid id="d1b2f" binding="pnlCtlrTitle" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+            <margin top="0" left="0" bottom="0" right="2"/>
+            <constraints>
+              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="0" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+            <border type="none"/>
+            <children>
+              <component id="25222" class="javax.swing.JLabel">
+                <constraints>
+                  <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+                </constraints>
+                <properties>
+                  <font name="Malgun Gothic" size="12" style="0"/>
+                  <horizontalAlignment value="2"/>
+                  <horizontalTextPosition value="11"/>
+                  <icon value="static/image/controller.png"/>
+                  <text value="작업"/>
+                </properties>
+              </component>
+              <component id="a6a03" class="javax.swing.JTextField" binding="txtName">
+                <constraints>
+                  <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
+                    <preferred-size width="200" height="-1"/>
+                  </grid>
+                </constraints>
+                <properties>
+                  <editable value="false"/>
+                  <font name="Malgun Gothic" size="12" style="0"/>
+                  <horizontalAlignment value="2"/>
+                  <text value="제어기 명칭"/>
+                </properties>
+              </component>
+            </children>
+          </grid>
+          <scrollpane id="2fd56">
+            <constraints>
+              <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+            <border type="none"/>
+            <children>
+              <scrollpane id="3eda4">
+                <constraints/>
+                <properties/>
+                <border type="none"/>
+                <children>
+                  <component id="49ded" class="javax.swing.JTable" binding="listHist">
+                    <constraints/>
+                    <properties/>
+                  </component>
+                </children>
+              </scrollpane>
+            </children>
+          </scrollpane>
+        </children>
+      </grid>
+    </children>
+  </grid>
+</form>

+ 168 - 0
src/main/java/com/its/traf/ui/SubUI.java

@@ -0,0 +1,168 @@
+package com.its.traf.ui;
+
+import com.intellij.uiDesigner.core.GridConstraints;
+import com.intellij.uiDesigner.core.GridLayoutManager;
+import com.its.traf.global.TrafJobVo;
+import com.sun.management.OperatingSystemMXBean;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.swing.*;
+import javax.swing.border.MatteBorder;
+import javax.swing.plaf.FontUIResource;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+import javax.swing.text.StyleContext;
+import java.awt.*;
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.Locale;
+
+@Slf4j
+@Getter
+public abstract class SubUI {
+    OperatingSystemMXBean osBean = null;
+    private TrafJobVo selObj = null;
+
+    private JPanel rootPanel;
+    private JPanel pnlCtlr;
+    private JPanel pnlCtlrTitle;
+    private JTextField txtName;
+    private JTable listHist;
+    private JTextField txtId;
+    private TrafPrcsHistTableModel trafPrcsHistTableModel = null;
+    private TableCellRenderer trafPrcsHistTableCellRender = new TrafPrcsHistTableCellRenderer();
+
+    protected abstract void actionButtonClicked();
+
+    public SubUI() {
+        System.setProperty("awt.useSystemAAFontSettings", "false"); // AntiAliasing false
+
+        osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
+        try {
+            Font font = Font.createFont(Font.TRUETYPE_FONT, new File("fonts/D2Coding.ttc"));
+            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+            ge.registerFont(font);
+        } catch (FontFormatException e) {
+        } catch (IOException e) {
+        }
+        listHist.getTableHeader().setOpaque(false);
+        listHist.getTableHeader().setBackground(Color.LIGHT_GRAY);
+        listHist.setRowMargin(1);
+        listHist.setRowHeight(listHist.getRowHeight() + 5);
+
+        listHist.setBackground(Color.WHITE);
+        listHist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+        Color color = UIManager.getColor("Table.gridColor");
+        MatteBorder border = new MatteBorder(1, 1, 0, 0, color);
+        listHist.setBorder(border);
+    }
+
+    public void initHistList() {
+
+        TableColumnModel getColumnModel = listHist.getColumnModel();
+        getColumnModel.getColumn(0).setPreferredWidth(30);      //  "S",
+        getColumnModel.getColumn(1).setPreferredWidth(150);     //  "시작시각",
+        getColumnModel.getColumn(2).setPreferredWidth(150);     //  "종료시각",
+        getColumnModel.getColumn(3).setPreferredWidth(60);      //  "건수(EA)",
+        getColumnModel.getColumn(4).setPreferredWidth(60);      //  "작업시간(ms)",
+
+        getColumnModel.getColumn(0).setMaxWidth(30);
+        getColumnModel.getColumn(0).setMinWidth(30);
+        getColumnModel.getColumn(0).setResizable(false);
+        for (int ii = 0; ii < getColumnModel.getColumnCount(); ii++) {
+            getColumnModel.getColumn(ii).setCellRenderer(this.trafPrcsHistTableCellRender);
+        }
+    }
+    public void updateInfo(TrafJobVo selObj) {
+        this.selObj = selObj;
+
+        this.trafPrcsHistTableModel = new TrafPrcsHistTableModel(selObj.getListHist());
+        listHist.setModel(this.trafPrcsHistTableModel);
+
+        txtName.setText("");
+        if (selObj != null) {
+            txtName.setText(selObj.getJobName());
+        }
+
+        initHistList();
+    }
+
+    {
+// GUI initializer generated by IntelliJ IDEA GUI Designer
+// >>> IMPORTANT!! <<<
+// DO NOT EDIT OR ADD ANY CODE HERE!
+        $$$setupUI$$$();
+    }
+
+    /**
+     * Method generated by IntelliJ IDEA GUI Designer
+     * >>> IMPORTANT!! <<<
+     * DO NOT edit this method OR call it in your code!
+     *
+     * @noinspection ALL
+     */
+    private void $$$setupUI$$$() {
+        rootPanel = new JPanel();
+        rootPanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
+        pnlCtlr = new JPanel();
+        pnlCtlr.setLayout(new GridLayoutManager(2, 1, new Insets(10, 4, 0, 4), -1, -1));
+        rootPanel.add(pnlCtlr, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        pnlCtlrTitle = new JPanel();
+        pnlCtlrTitle.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 2), -1, -1));
+        pnlCtlr.add(pnlCtlrTitle, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_FIXED, 1, null, null, null, 0, false));
+        final JLabel label1 = new JLabel();
+        Font label1Font = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, label1.getFont());
+        if (label1Font != null) label1.setFont(label1Font);
+        label1.setHorizontalAlignment(2);
+        label1.setHorizontalTextPosition(11);
+        label1.setIcon(new ImageIcon(getClass().getResource("/static/image/controller.png")));
+        label1.setText("작업");
+        pnlCtlrTitle.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+        txtName = new JTextField();
+        txtName.setEditable(false);
+        Font txtNameFont = this.$$$getFont$$$("Malgun Gothic", Font.PLAIN, 12, txtName.getFont());
+        if (txtNameFont != null) txtName.setFont(txtNameFont);
+        txtName.setHorizontalAlignment(2);
+        txtName.setText("제어기 명칭");
+        pnlCtlrTitle.add(txtName, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(200, -1), null, 0, false));
+        final JScrollPane scrollPane1 = new JScrollPane();
+        pnlCtlr.add(scrollPane1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
+        final JScrollPane scrollPane2 = new JScrollPane();
+        scrollPane1.setViewportView(scrollPane2);
+        listHist = new JTable();
+        scrollPane2.setViewportView(listHist);
+    }
+
+    /**
+     * @noinspection ALL
+     */
+    private Font $$$getFont$$$(String fontName, int style, int size, Font currentFont) {
+        if (currentFont == null) return null;
+        String resultName;
+        if (fontName == null) {
+            resultName = currentFont.getName();
+        } else {
+            Font testFont = new Font(fontName, Font.PLAIN, 10);
+            if (testFont.canDisplay('a') && testFont.canDisplay('1')) {
+                resultName = fontName;
+            } else {
+                resultName = currentFont.getName();
+            }
+        }
+        Font font = new Font(resultName, style >= 0 ? style : currentFont.getStyle(), size >= 0 ? size : currentFont.getSize());
+        boolean isMac = System.getProperty("os.name", "").toLowerCase(Locale.ENGLISH).startsWith("mac");
+        Font fontWithFallback = isMac ? new Font(font.getFamily(), font.getStyle(), font.getSize()) : new StyleContext().getFont(font.getFamily(), font.getStyle(), font.getSize());
+        return fontWithFallback instanceof FontUIResource ? fontWithFallback : new FontUIResource(fontWithFallback);
+    }
+
+    /**
+     * @noinspection ALL
+     */
+    public JComponent $$$getRootComponent$$$() {
+        return rootPanel;
+    }
+
+}

+ 44 - 0
src/main/java/com/its/traf/ui/SubUIController.java

@@ -0,0 +1,44 @@
+package com.its.traf.ui;
+
+import com.its.traf.global.TrafJobVo;
+import org.springframework.core.io.ClassPathResource;
+
+import javax.swing.*;
+import java.io.IOException;
+import java.net.URL;
+
+public class SubUIController extends JFrame {
+    private SubUI view;
+    private JFrame caller;
+
+    public SubUIController(JFrame jFrame) {
+        super("작업 이력 정보(최대작업시간기준)");
+        try {
+            ClassPathResource file = new ClassPathResource("static/image/application.png");
+            URL imgURL = file.getURL();
+            setIconImage(new ImageIcon(imgURL).getImage());
+        } catch (IOException e) {
+        }
+
+        this.caller = jFrame;
+        this.view = new SubUI() {
+            @Override
+            protected void actionButtonClicked() {
+                doAction();
+            }
+        };
+        this.setContentPane(view.$$$getRootComponent$$$());
+        this.setDefaultCloseOperation(HIDE_ON_CLOSE);
+        this.pack();
+    }
+
+    private void doAction() {
+        this.view.updateInfo(null);
+        this.setVisible(false);
+        caller.validate();
+    }
+
+    public void updateInfo(TrafJobVo selObj) {
+        this.view.updateInfo(selObj);
+    }
+}

+ 33 - 0
src/main/java/com/its/traf/ui/TrafPrcsHistTableCellRenderer.java

@@ -0,0 +1,33 @@
+package com.its.traf.ui;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.*;
+
+public class TrafPrcsHistTableCellRenderer extends DefaultTableCellRenderer {
+
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+
+        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+        String target = table.getModel().getValueAt(row, 2).toString();
+        if ("ALL".contains(target)) {
+            cell.setBackground(new Color(255, 255, 0, 255));
+        } else {
+            cell.setBackground(new Color(255, 255, 255, 255));
+        }
+        switch(column) {
+            case 0: case 1: case 2:
+                setHorizontalAlignment(SwingConstants.CENTER);
+                break;
+            default:
+                setHorizontalAlignment(SwingConstants.RIGHT);
+                break;
+        }
+
+        if (column == 0) {
+            cell.setBackground(Color.LIGHT_GRAY);
+        }
+
+        return cell;
+    }
+}

+ 136 - 0
src/main/java/com/its/traf/ui/TrafPrcsHistTableModel.java

@@ -0,0 +1,136 @@
+package com.its.traf.ui;
+
+import com.its.traf.global.TrafJobHistVo;
+import com.its.traf.global.TrafJobVo;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.swing.table.AbstractTableModel;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+public class TrafPrcsHistTableModel extends AbstractTableModel {
+    private static final long serialVersionUID = 1331132425472559704L;
+
+    private List<TrafJobHistVo> ctlrList = Collections.synchronizedList(new ArrayList<TrafJobHistVo>());
+    private final String[] columnNames = {
+            "#",
+            "시작시각",
+            "종료시각",
+            "건수(EA)",
+            "작업시간(ms)"
+    };
+    public static final String[] netStateStr = {
+            "Close", "Login", "Connect",
+    };
+
+    public TrafPrcsHistTableModel(List<TrafJobHistVo> ctlrList) {
+        this.ctlrList = ctlrList;
+
+        int indexCount = 1;
+        for (TrafJobHistVo obj : ctlrList) {
+            obj.setIndex(indexCount++);
+        }
+    }
+
+    @Override
+    public int getColumnCount() {
+        return columnNames.length;
+    }
+
+    @Override
+    public int getRowCount() {
+        int size = 0;
+        synchronized (this.ctlrList) {
+            size = this.ctlrList.size();
+        }
+        return size;
+    }
+
+    @Override
+    public String getColumnName(int columnIndex) {
+        if (columnIndex < columnNames.length) {
+            return columnNames[columnIndex];
+        }
+        return super.getColumnName(columnIndex);
+    }
+
+    @Override
+    public Class<?> getColumnClass(int columnIndex) {
+        if (ctlrList.isEmpty()) {
+            return Object.class;
+        }
+        return getValueAt(0, columnIndex).getClass();
+    }
+
+    public TrafJobHistVo getControllerInfo(int row) {
+        TrafJobHistVo info = this.ctlrList.get(row);
+        return info;
+    }
+
+    @Override
+    public Object getValueAt(int rowIndex, int columnIndex) {
+        Object returnValue = null;
+        synchronized (this.ctlrList) {
+            TrafJobHistVo info = this.ctlrList.get(rowIndex);
+            if (info == null) {
+                return "";
+            }
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+            switch (columnIndex) {
+                case 0:
+                    returnValue = info.getIndex();
+                    break;
+                case 1:
+                    returnValue = sdf.format(new Date(info.getStartTm()));
+                    break;
+                case 2:
+                    returnValue = sdf.format(new Date(info.getEndTm()));
+                    break;
+                case 3:
+                    returnValue = info.getJobCount();
+                    break;
+                case 4:
+                    returnValue = info.getJobTm();
+                    break;
+                default:
+                    break;
+            }
+        }
+        return returnValue;
+    }
+
+    @Override
+    public void setValueAt(Object value, int rowIndex, int columnIndex) {
+        synchronized (this.ctlrList) {
+            TrafJobHistVo obj = ctlrList.get(rowIndex);
+            if (columnIndex == 0) {
+                obj.setIndex((int) value);
+            }
+        }
+    }
+    public void setValueAt(TrafJobVo obj, int rowIdx, int colIdx) {
+        synchronized (this.ctlrList) {
+        }
+        fireTableCellUpdated(rowIdx, colIdx);
+        fireTableDataChanged();
+    }
+
+    public void Add(TrafJobHistVo info) {
+        int index = 0;
+        synchronized (this.ctlrList) {
+            index = this.ctlrList.size();
+            this.ctlrList.add(info);
+        }
+        fireTableRowsInserted(index, index);
+    }
+
+    public void setValue(TrafJobHistVo obj, int viewRow, int modelRow) {
+        fireTableDataChanged();
+    }
+
+}

+ 11 - 11
src/main/java/com/its/traf/ui/TrafPrcsTableModel.java

@@ -1,6 +1,6 @@
 package com.its.traf.ui;
 
-import com.its.traf.global.TrafPrcsVo;
+import com.its.traf.global.TrafJobVo;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.swing.table.AbstractTableModel;
@@ -14,7 +14,7 @@ import java.util.List;
 public class TrafPrcsTableModel extends AbstractTableModel {
     private static final long serialVersionUID = 1331132425472559704L;
 
-    private List<TrafPrcsVo> ctlrList = Collections.synchronizedList(new ArrayList<TrafPrcsVo>());
+    private List<TrafJobVo> ctlrList = Collections.synchronizedList(new ArrayList<TrafJobVo>());
     private final String[] columnNames = {
             "#",
             "작업명",
@@ -29,11 +29,11 @@ public class TrafPrcsTableModel extends AbstractTableModel {
             "Close", "Login", "Connect",
     };
 
-    public TrafPrcsTableModel(List<TrafPrcsVo> ctlrList) {
+    public TrafPrcsTableModel(List<TrafJobVo> ctlrList) {
         this.ctlrList = ctlrList;
 
         int indexCount = 1;
-        for (TrafPrcsVo obj : ctlrList) {
+        for (TrafJobVo obj : ctlrList) {
             obj.setIndex(indexCount++);
         }
     }
@@ -68,8 +68,8 @@ public class TrafPrcsTableModel extends AbstractTableModel {
         return getValueAt(0, columnIndex).getClass();
     }
 
-    public TrafPrcsVo getControllerInfo(int row) {
-        TrafPrcsVo info = this.ctlrList.get(row);
+    public TrafJobVo getControllerInfo(int row) {
+        TrafJobVo info = this.ctlrList.get(row);
         return info;
     }
 
@@ -77,7 +77,7 @@ public class TrafPrcsTableModel extends AbstractTableModel {
     public Object getValueAt(int rowIndex, int columnIndex) {
         Object returnValue = null;
         synchronized (this.ctlrList) {
-            TrafPrcsVo info = this.ctlrList.get(rowIndex);
+            TrafJobVo info = this.ctlrList.get(rowIndex);
             if (info == null) {
                 return "";
             }
@@ -118,20 +118,20 @@ public class TrafPrcsTableModel extends AbstractTableModel {
     @Override
     public void setValueAt(Object value, int rowIndex, int columnIndex) {
         synchronized (this.ctlrList) {
-            TrafPrcsVo obj = ctlrList.get(rowIndex);
+            TrafJobVo obj = ctlrList.get(rowIndex);
             if (columnIndex == 0) {
                 obj.setIndex((int) value);
             }
         }
     }
-    public void setValueAt(TrafPrcsVo obj, int rowIdx, int colIdx) {
+    public void setValueAt(TrafJobVo obj, int rowIdx, int colIdx) {
         synchronized (this.ctlrList) {
         }
         fireTableCellUpdated(rowIdx, colIdx);
         fireTableDataChanged();
     }
 
-    public void Add(TrafPrcsVo info) {
+    public void Add(TrafJobVo info) {
         int index = 0;
         synchronized (this.ctlrList) {
             index = this.ctlrList.size();
@@ -140,7 +140,7 @@ public class TrafPrcsTableModel extends AbstractTableModel {
         fireTableRowsInserted(index, index);
     }
 
-    public void setValue(TrafPrcsVo obj, int viewRow, int modelRow) {
+    public void setValue(TrafJobVo obj, int viewRow, int modelRow) {
         fireTableDataChanged();
     }
 

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

@@ -87,7 +87,7 @@ spring:
   utis-datasource:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver
-      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1522:HANTE19C
       username: rota
       password: rota
       connection-test-query: SELECT 1 FROM DUAL

+ 9 - 0
src/test/java/com/its/traf/TrafPrcsServerApplicationTests.java

@@ -1,6 +1,7 @@
 package com.its.traf;
 
 import com.its.traf.dto.its.IfscCngsDto;
+import com.its.traf.global.eTrafPrcsJob;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -119,4 +120,12 @@ public class TrafPrcsServerApplicationTests {
 
         log.error("{}", treeMap);
     }
+
+    @Test
+    void test5() {
+        eTrafPrcsJob arr[] = eTrafPrcsJob.values();
+        for (eTrafPrcsJob col : arr) {
+            log.info("{}, {}, {}, {}", col.ordinal(), col.getValue(), col.getName(), col.getDesc());
+        }
+    }
 }