shjung 2 năm trước cách đây
mục cha
commit
e1a23f4b88

+ 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";

+ 1 - 0
src/main/java/com/its/dsrc/dao/mapper/RseStatMapper.java

@@ -9,4 +9,5 @@ public interface RseStatMapper {
 
     int CRT_TB_RSE_OBU_CLCT_STAT_HH(@Param("prcs") voStatisticsTime paramStat);
     int CRT_TB_RSE_OBU_CLCT_STAT_DD(@Param("prcs") voStatisticsTime paramStat);
+    int CRT_TB_RSE_OD_STAT_HH(@Param("prcs") voStatisticsTime paramStat);
 }

+ 13 - 12
src/main/java/com/its/dsrc/scheduler/SchedulerTask.java

@@ -36,52 +36,52 @@ public class SchedulerTask {
     }
 
     @Scheduled(cron = "5 * * * * *")  // 1분주기 작업 실행
-    public void UnitSystSchedule() {
+    public void scheduleUnitSystStts() {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
         Elapsed elapsed = new Elapsed();
-        log.info("              UnitSystSchedule: start. {}", Thread.currentThread().getName());
+        log.info("unitSystStts: start. {}", Thread.currentThread().getName());
         // 1. 프로세스 상태정보 업데이트
         this.unitSystService.updateUnitSystStts(true);
         // 1. 제어기 상태정보 업데이트(제어기/프로세스 상태정보 UDP 전송)
         this.rseCtlrService.updateCtlrStts(true);
-        log.info("              UnitSystSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("unitSystStts: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
     //@Scheduled(cron = "1 0/5 * * * ?")  // 5분주기 작업 실행(DSRC 구간 소통정보 생성)
     @Scheduled(cron = "50 4,9,14,19,24,29,34,39,44,49,54,59 * * * *")  // 5분주기 작업 실행(DSRC 구간 소통정보 생성)
-    public void MakeDsrcSectTrafficJobSchedule() {
+    public void scheduleMakeSectTraf() {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
         Elapsed elapsed = new Elapsed();
-        log.info("MakeDsrcSectTrafficJobSchedule: start. {}", Thread.currentThread().getName());
+        log.info("makeSectTraf: start. {}", Thread.currentThread().getName());
         this.rseSectService.makeDsrcSectTraffic();
-        log.info("MakeDsrcSectTrafficJobSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("makeSectTraf: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
     @Scheduled(cron = "30 0/5 * * * *")  // DSRC Multimedia 작업 실행 ==> 교통정보 가공이 완료된 후에 실행
-    public void MakeMultimediaJobSchedule() {
+    public void scheduleMultimedia() {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
 
         if (this.runningConfig.isPublicationMultimedia()) {
             Elapsed elapsed = new Elapsed();
-            log.info("     MakeMultimediaJobSchedule: start. {}", Thread.currentThread().getName());
+            log.info("multimedia..: start. {}", Thread.currentThread().getName());
             MultiMediaDataService.getInstance().makeMultimediaData();
-            log.info("     MakeMultimediaJobSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+            log.info("multimedia..: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
         }
     }
 
     @Scheduled(cron = "40 0/5 * * * *")    // 정주기 5분 40초에 스케쥴 실행
-    public void StatisticsSchedule() {
+    public void schedule5M() {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
         Elapsed elapsed = new Elapsed();
-        log.info("            StatisticsSchedule: start. {}", Thread.currentThread().getName());
+        log.info("schedule5M..: start. {}", Thread.currentThread().getName());
         if (this.applicationConfig.isStatistics()) {
             StatisticsTime its = new StatisticsTime();
             its.init();
@@ -90,6 +90,7 @@ public class SchedulerTask {
             if (its.isStatHour()) {
                 // 매시 5분 가공완료후 1시간 통계
                 this.statisticsServices.CRT_TB_RSE_OBU_CLCT_STAT_HH(its.getStatHourTime(), its.getStatHourTime(), its.getStatHourTo());
+                this.statisticsServices.CRT_TB_RSE_OD_STAT_HH(its.getStatHourTime(), its.getStatHourTime(), its.getStatHourTo());
             }
 
             if (its.isStatDay()) {
@@ -98,7 +99,7 @@ public class SchedulerTask {
             }
             its.setProcessing(false);
         }
-        log.info("            StatisticsSchedule: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("schedule5M..: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
 }

+ 40 - 0
src/main/java/com/its/dsrc/service/StatisticsServices.java

@@ -2,6 +2,7 @@ package com.its.dsrc.service;
 
 import com.its.app.AppUtils;
 import com.its.app.utils.Elapsed;
+import com.its.app.utils.TimeUtils;
 import com.its.dsrc.dao.mapper.RseStatMapper;
 import com.its.dsrc.vo.voStatisticsTime;
 import lombok.extern.slf4j.Slf4j;
@@ -12,6 +13,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import java.util.Calendar;
+import java.util.Date;
 
 @Slf4j
 @Service
@@ -54,4 +57,41 @@ public class StatisticsServices {
         MDC.clear();
     }
 
+    public static int getDayWeek(Date paramDt) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(paramDt);
+        return cal.get(Calendar.DAY_OF_WEEK);		/* DAY_OF_WEEK 리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다. */
+    }
+
+    public String getDayWeekCd(int week) {
+        String sWeek = "DTW0";
+        switch(week) {
+            case 1: sWeek = "DTW7";	break;
+            case 2: sWeek = "DTW1";	break;
+            case 3: sWeek = "DTW2";	break;
+            case 4: sWeek = "DTW3";	break;
+            case 5: sWeek = "DTW4";	break;
+            case 6: sWeek = "DTW5";	break;
+            case 7: sWeek = "DTW6"; break;
+        }
+        return sWeek;
+    }
+
+    @Async("statisticsExecutor")
+    public void CRT_TB_RSE_OD_STAT_HH(String statDt, String fromDt, String toDt) {
+        MDC.put("id", logKey);
+        Elapsed elapsed = new Elapsed();
+        Date dtStat = TimeUtils.stringToDate(statDt);
+        String weekCd = getDayWeekCd(getDayWeek(dtStat));
+        voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
+        statTime.setDAY_TYPE_CD(weekCd);
+        statTime.setB_FROM_DT(TimeUtils.getTime(dtStat, TimeUtils.TYPE_PRCS_30MIN));
+        statTime.setB_TO_DT(TimeUtils.getToTime(statTime.getB_FROM_DT(), TimeUtils.TYPE_PRCS_30MIN));
+        //log.info("{}", statTime);
+        log.info("CRT_TB_RSE_OD_STAT_HH :: start. [{}], {}", statTime.toString(), Thread.currentThread().getName());
+        this.statMapper.CRT_TB_RSE_OD_STAT_HH(statTime);
+        log.info("CRT_TB_RSE_OD_STAT_HH :: ..end. [{}], {} ms. {}", statTime.toString(), elapsed.milliSeconds(), Thread.currentThread().getName());
+        MDC.remove(logKey);
+        MDC.clear();
+    }
 }

+ 4 - 0
src/main/java/com/its/dsrc/vo/voStatisticsTime.java

@@ -12,6 +12,9 @@ public class voStatisticsTime {
 	private String STAT_DT;
 	private String FROM_DT;
 	private String TO_DT;
+	private String DAY_TYPE_CD;
+	private String B_FROM_DT;
+	private String B_TO_DT;
 
 	public voStatisticsTime(String sTAT_DT, String fROM_DT, String tO_DT) {
 		this.STAT_DT = sTAT_DT;
@@ -20,3 +23,4 @@ public class voStatisticsTime {
 	}
 
 }
+

+ 69 - 13
src/main/resources/mybatis/mapper/RseStatMapper.xml

@@ -5,23 +5,79 @@
 
     <insert id="CRT_TB_RSE_OBU_CLCT_STAT_HH" parameterType="com.its.dsrc.vo.voStatisticsTime">
     <![CDATA[
-		INSERT INTO TB_RSE_OBU_CLCT_STAT_HH (STAT_DT,
+        INSERT INTO TB_RSE_OBU_CLCT_STAT_HH (STAT_DT,
                                              RSE_CTLR_NMBR,
-		                                     DAY_TYPE_CD,
-		                                     CLCT_NUM
-		                                    )
-		SELECT  #{prcs.STAT_DT}   AS STAT_DT,
+                                             DAY_TYPE_CD,
+                                             CLCT_NUM
+        )
+        SELECT  #{prcs.STAT_DT}   AS STAT_DT,
                 RSE_CTLR_NMBR     AS RSE_CTLR_NMBR,
-		        CASE TO_CHAR(TO_DATE(#{prcs.STAT_DT}, 'YYYYMMDDHH24MISS'), 'D') WHEN '1' THEN 'DTW7'
-                ELSE 'DTW'||TO_CHAR(TO_NUMBER(TO_CHAR(TO_DATE(#{prcs.STAT_DT}, 'YYYYMMDDHH24MISS'), 'D')) - 1)
-                END               AS DAY_TYPE_CD,
-		        COUNT(1)          AS CLCT_NUM
-		  FROM TB_RSE_OBU_CLCT_HS
-		 WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}
-		 GROUP BY RSE_CTLR_NMBR
-    ]]>
+                CASE TO_CHAR(TO_DATE(#{prcs.STAT_DT}, 'YYYYMMDDHH24MISS'), 'D') WHEN '1' THEN 'DTW7'
+                                                                                ELSE 'DTW'||TO_CHAR(TO_NUMBER(TO_CHAR(TO_DATE(#{prcs.STAT_DT}, 'YYYYMMDDHH24MISS'), 'D')) - 1)
+                    END               AS DAY_TYPE_CD,
+                COUNT(1)          AS CLCT_NUM
+        FROM TB_RSE_OBU_CLCT_HS
+        WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}
+        GROUP BY RSE_CTLR_NMBR
+        ]]>
     </insert>
 
+    <update id="CRT_TB_RSE_OD_STAT_HH" parameterType="com.its.dsrc.vo.voStatisticsTime">
+    <![CDATA[
+        MERGE INTO TB_RSE_OD_STAT_HH L
+            USING (SELECT #{prcs.STAT_DT}        AS STAT_DT,
+                          F_RSE_CTLR_NMBR        AS F_RSE_CTLR_NMBR,
+                          T_RSE_CTLR_NMBR        AS T_RSE_CTLR_NMBR,
+                          #{prcs.DAY_TYPE_CD}    AS DAY_TYPE_CD,
+                          COUNT(1)               AS TFVL,
+                          ROUND(AVG(TRVL_HH), 0) AS TRVL_HH
+                   FROM (SELECT OBU_IDNT_NMBR, F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR, F_CLCT_DT, T_CLCT_DT,
+                                (TO_DATE(T_CLCT_DT, 'YYYYMMDDHH24MISS') - TO_DATE(F_CLCT_DT, 'YYYYMMDDHH24MISS')) * 86400 AS TRVL_HH
+                         FROM (SELECT OBU_IDNT_NMBR,
+                                      LAG(RSE_CTLR_NMBR) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT) AS F_RSE_CTLR_NMBR,
+                                      RSE_CTLR_NMBR                                                         AS T_RSE_CTLR_NMBR,
+                                      LAG(CLCT_DT) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT)       AS F_CLCT_DT,
+                                      CLCT_DT                                                               AS T_CLCT_DT
+                               FROM (SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
+                                     FROM TB_RSE_OBU_CLCT_HS
+                                     WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}
+                                     UNION ALL
+                                     SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
+                                     FROM TB_RSE_OBU_CLCT_HS
+                                     WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
+                                       AND (OBU_IDNT_NMBR, CLCT_DT) IN (SELECT OBU_IDNT_NMBR, MAX(CLCT_DT) AS CLCT_DT
+                                                                        FROM TB_RSE_OBU_CLCT_HS
+                                                                        WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
+                                                                        GROUP BY OBU_IDNT_NMBR)
+                                    )
+                              )
+                         WHERE F_RSE_CTLR_NMBR IS NOT NULL
+                           AND F_RSE_CTLR_NMBR <> T_RSE_CTLR_NMBR
+                        )
+                   GROUP BY F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR) M
+            ON ( L.STAT_DT         = M.STAT_DT
+             AND L.F_RSE_CTLR_NMBR = M.F_RSE_CTLR_NMBR
+             AND L.T_RSE_CTLR_NMBR = M.T_RSE_CTLR_NMBR )
+            WHEN MATCHED THEN
+                UPDATE SET L.DAY_TYPE_CD = M.DAY_TYPE_CD,
+                           L.TFVL        = M.TFVL
+            WHEN NOT MATCHED THEN
+                INSERT (
+                        L.STAT_DT,
+                        L.F_RSE_CTLR_NMBR,
+                        L.T_RSE_CTLR_NMBR,
+                        L.DAY_TYPE_CD,
+                        L.TFVL
+                    ) VALUES (
+                        M.STAT_DT,
+                        M.F_RSE_CTLR_NMBR,
+                        M.T_RSE_CTLR_NMBR,
+                        M.DAY_TYPE_CD,
+                        M.TFVL
+                    )
+        ]]>
+    </update>
+
     <insert id="CRT_TB_RSE_OBU_CLCT_STAT_DD" parameterType="com.its.dsrc.vo.voStatisticsTime">
     <![CDATA[
 		INSERT INTO TB_RSE_OBU_CLCT_STAT_DD (STAT_DT,