HANTE 2 hónapja
szülő
commit
ce5705b620
30 módosított fájl, 1659 hozzáadás és 263 törlés
  1. 2 2
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/UticDwdbServerApplication.java
  2. 7 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01DController.java
  3. 7 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01HController.java
  4. 31 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs30MController.java
  5. 16 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs01DMapper.java
  6. 16 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs01HMapper.java
  7. 0 9
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs05MMapper.java
  8. 16 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs15MMapper.java
  9. 15 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs30MMapper.java
  10. 13 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcsMonthMapper.java
  11. 29 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcsPatternMapper.java
  12. 20 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/PatternDto.java
  13. 19 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/PatternJobDto.java
  14. 5 8
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/StatTimeDto.java
  15. 17 6
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/scheduler/DwdbJobPrcsScheduler.java
  16. 180 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs01DService.java
  17. 268 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs01HService.java
  18. 17 16
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs04MService.java
  19. 77 70
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs05MService.java
  20. 180 41
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs15MService.java
  21. 105 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs30MService.java
  22. 2 1
      utic-dwdb-server/src/main/resources/application.yml
  23. 21 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobMapper.xml
  24. 95 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs01DMapper.xml
  25. 79 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs01HMapper.xml
  26. 15 110
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs05MMapper.xml
  27. 67 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs15MMapper.xml
  28. 56 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs30MMapper.xml
  29. 136 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcsMonthMapper.xml
  30. 148 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcsPatternMapper.xml

+ 2 - 2
utic-dwdb-server/src/main/java/com/utic/dwdb/server/UticDwdbServerApplication.java

@@ -2,7 +2,7 @@ package com.utic.dwdb.server;
 
 import com.utic.common.spring.SpringUtils;
 import com.utic.dwdb.server.config.ApplicationConfig;
-import com.utic.dwdb.server.controller.DwdbJobPrcs15MController;
+import com.utic.dwdb.server.controller.DwdbJobPrcs01DController;
 import com.utic.dwdb.server.service.ProcessStateService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
@@ -60,7 +60,7 @@ public class UticDwdbServerApplication implements CommandLineRunner, Application
         ProcessStateService processStateService = SpringUtils.getBean(ProcessStateService.class);
         processStateService.processStart();
 
-        DwdbJobPrcs15MController dwdbJobProcControl = SpringUtils.getBean(DwdbJobPrcs15MController.class);
+        DwdbJobPrcs01DController dwdbJobProcControl = SpringUtils.getBean(DwdbJobPrcs01DController.class);
         dwdbJobProcControl.run();
 
         applicationConfig.setStartSchedule(true);

+ 7 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01DController.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server.controller;
 
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs01DService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -11,6 +12,9 @@ import org.springframework.util.StopWatch;
 @Controller
 @RequiredArgsConstructor
 public class DwdbJobPrcs01DController implements AbstractProcessController {
+
+    private final DwdbJobPrcs01DService dwdbJobPrcs01DService;
+
     public void initialize() {
     }
 
@@ -18,6 +22,9 @@ public class DwdbJobPrcs01DController implements AbstractProcessController {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("DwdbJobPrcs01DController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("1일 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs01DService.processing();
+
         stopWatch.stop();
         log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("1일 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }

+ 7 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01HController.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server.controller;
 
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs01HService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -11,6 +12,9 @@ import org.springframework.util.StopWatch;
 @Controller
 @RequiredArgsConstructor
 public class DwdbJobPrcs01HController implements AbstractProcessController {
+
+    private final DwdbJobPrcs01HService dwdbJobPrcs01HService;
+
     public void initialize() {
     }
 
@@ -18,6 +22,9 @@ public class DwdbJobPrcs01HController implements AbstractProcessController {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("DwdbJobPrcs01HController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("1시간 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs01HService.processing();
+
         stopWatch.stop();
         log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("1시간 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }

+ 31 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs30MController.java

@@ -0,0 +1,31 @@
+package com.utic.dwdb.server.controller;
+
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs30MService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StopWatch;
+
+@Slf4j
+@Controller
+@RequiredArgsConstructor
+public class DwdbJobPrcs30MController implements AbstractProcessController {
+
+    private final DwdbJobPrcs30MService dwdbJobPrcs30MService;
+
+    public void initialize() {
+    }
+
+    public void run() {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("DwdbJobPrcs30MController");
+        log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("정주기 30분 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs30MService.processing();
+
+        stopWatch.stop();
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("정주기 30분 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
+    }
+}

+ 16 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs01DMapper.java

@@ -0,0 +1,16 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs01DMapper {
+
+    int insertStatDayCenter(@Param("prcsDay") String prcsDay);
+    int insertStatDay12Loc(@Param("prcsDay") String prcsDay);
+    int insertStatDayExw(@Param("prcsDay") String prcsDay);
+    int insertStatDayLoc(@Param("prcsDay") String prcsDay);
+    int insertStatDayObeLoc(@Param("prcsDay") String prcsDay);
+    int insertDmTrafficCenter(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertDmCenterFilter();
+}

+ 16 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs01HMapper.java

@@ -0,0 +1,16 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs01HMapper {
+
+    int insertStatHourCenter(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertStatHour12Loc(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertStatHourExw(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertStatHourLoc(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertStatHourObeLoc(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+    int insertDmTrafficCenter(@Param("pastStat01Hour") String pastStat01Hour, @Param("pastStat02Hour") String pastStat02Hour);
+
+}

+ 0 - 9
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs05MMapper.java

@@ -1,6 +1,5 @@
 package com.utic.dwdb.server.dao.mapper;
 
-import com.utic.dwdb.server.dto.HolidayDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,7 +13,6 @@ public interface DwdbJobPrcs05MMapper {
 
     int truncateLinkFilter();
     int insertLinkFilter(@Param("past25Min") String past25Min, @Param("codeValue0") String codeValue0, @Param("codeValue5") String codeValue5);
-    HolidayDto findHoliday(@Param("past25Min") String past25Min);
 
     int updateLinkFilterPattern(@Param("fromTable") String fromTable, @Param("past25Min") String past25Min, @Param("minValue") Integer minValue, @Param("maxValue") Integer maxValue);
 
@@ -67,11 +65,4 @@ public interface DwdbJobPrcs05MMapper {
 
     int insertStat5MinObeLoc(@Param("regDate") String regDate);
 
-    int insertPatternHist(@Param("targetTable") String targetTable, @Param("fromTable") String fromTable, @Param("regDate") String regDate);
-    int updatePattern(@Param("targetTable") String targetTable, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
-
-    int mergePatternWeekJob(@Param("columnName") String columnName, @Param("regDate") String regDate);
-    int updatePatternWeekJob(@Param("columnName") String columnName, @Param("regDate") String regDate);
-    int mergePatternWeek(@Param("regDate") String regDate, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
-
 }

+ 16 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs15MMapper.java

@@ -0,0 +1,16 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs15MMapper {
+
+    int insertStat15MinCenter(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+    int insertStat15Min12Loc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+    int insertStat15MinExw(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+    int insertStat15MinLoc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+    int insertStat15MinObeLoc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+    int insertTraffic15mHist(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat45Min") String pastStat45Min);
+
+}

+ 15 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs30MMapper.java

@@ -0,0 +1,15 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs30MMapper {
+
+    int insertStat30MinCenter(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat60Min") String pastStat60Min);
+    int insertStat30Min12Loc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat60Min") String pastStat60Min);
+    int insertStat30MinExw(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat60Min") String pastStat60Min);
+    int insertStat30MinLoc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat60Min") String pastStat60Min);
+    int insertStat30MinObeLoc(@Param("pastStat30Min") String pastStat30Min, @Param("pastStat60Min") String pastStat60Min);
+
+}

+ 13 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcsMonthMapper.java

@@ -0,0 +1,13 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DwdbJobPrcsMonthMapper {
+
+    int insertStatMonthCenter();
+    int insertStatMonth12Loc();
+    int insertStatMonthExw();
+    int insertStatMonthLoc();
+    int insertStatMonthObeLoc();
+}

+ 29 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcsPatternMapper.java

@@ -0,0 +1,29 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import com.utic.dwdb.server.dto.HolidayDto;
+import com.utic.dwdb.server.dto.PatternDto;
+import com.utic.dwdb.server.dto.PatternJobDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcsPatternMapper {
+
+    HolidayDto findHoliday(@Param("past25Min") String past25Min);
+    int insertPatternHist(@Param("targetTable") String targetTable, @Param("fromTable") String fromTable, @Param("patternTime") String patternTime);
+    int updatePattern(@Param("targetTable") String targetTable, @Param("statTable") String statTable, @Param("patternTime") String patternTime, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
+
+    int mergePatternWeekJob(@Param("targetTable") String targetTable, @Param("statTable") String statTable, @Param("columnName") String columnName, @Param("patternTime") String patternTime);
+    int updateIncidentPatternWeekJob(@Param("tableName") String tableName, @Param("columnName") String columnName, @Param("patternTime") String patternTime);
+    int mergePatternWeek(@Param("targetTable") String targetTable, @Param("jobTable") String jobTable, @Param("patternTime") String patternTime, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
+
+    PatternDto findPatternDay();
+    PatternJobDto findPatternJobLog(@Param("patternType") String patternType, @Param("exeDay") String exeDay);
+    int insertPatternJobLog(@Param("patternType") String patternType, @Param("exeDay") String exeDay);
+    int updatePatternJobLog(@Param("patternType") String patternType, @Param("exeDay") String exeDay);
+    int deletePatternWeekJob();
+    int deletePattern15MinWeekJob();
+
+    int updatePatternWeekJob(@Param("patternTime") String patternTime);
+    int updatePattern15minWeekJob(@Param("patternTime") String patternTime);
+}

+ 20 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/PatternDto.java

@@ -0,0 +1,20 @@
+package com.utic.dwdb.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class PatternDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String exeDay;
+    private Integer weekDay;
+
+}

+ 19 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/PatternJobDto.java

@@ -0,0 +1,19 @@
+package com.utic.dwdb.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class PatternJobDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer jobCount;
+
+}

+ 5 - 8
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/StatTimeDto.java

@@ -17,14 +17,11 @@ public class StatTimeDto implements Serializable {
     private String currTime;
     private String past05Min;
     private String past10Min;
-    private String past25Min;
     private String past30Min;
-    private String past45Min;
-    private String past60Min;
-    private String past90Min;
-    private String past2Hour;
-    private String next1Month;
-    private String next2Month;
-    private Integer currMin;
+    private String prcs05Min;
+    private String prcs15Min;
+    private String prcs30Min;
+    private String prcsHour;
+    private String prcsDay;
 
 }

+ 17 - 6
utic-dwdb-server/src/main/java/com/utic/dwdb/server/scheduler/DwdbJobPrcsScheduler.java

@@ -20,6 +20,7 @@ public class DwdbJobPrcsScheduler {
     private final DwdbJobPrcs04MController jobPrcs04MController;
     private final DwdbJobPrcs05MController jobPrcs05MController;
     private final DwdbJobPrcs15MController jobPrcs15MController;
+    private final DwdbJobPrcs30MController jobPrcs30MController;
     private final DwdbJobPrcs01HController jobPrcs01HController;
     private final DwdbJobPrcs01DController jobPrcs01DController;
 
@@ -34,7 +35,7 @@ public class DwdbJobPrcsScheduler {
 
     @Async("scheduleExecutor")
     @ScheduleElapsed
-    @Scheduled(cron = "4 4/5 * * * *")
+    @Scheduled(cron = "10 4/5 * * * *") // 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54
     public void schedule04MProcess() {
         if (this.applicationConfig.isStartSchedule()) {
             runJob(this.jobPrcs04MController, "DWDB Job 04 Min Processing");
@@ -43,7 +44,7 @@ public class DwdbJobPrcsScheduler {
 
     @Async("scheduleExecutor")
     @ScheduleElapsed
-    @Scheduled(cron = "5 0/5 * * * *")
+    @Scheduled(cron = "10 1/5 * * * *") // 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56
     public void schedule05MProcess() {
         if (this.applicationConfig.isStartSchedule()) {
             runJob(this.jobPrcs05MController, "DWDB Job 05 Min Processing");
@@ -52,8 +53,8 @@ public class DwdbJobPrcsScheduler {
 
     @Async("scheduleExecutor")
     @ScheduleElapsed
-    @Scheduled(cron = "15 0/15 * * * *")
-    public void schedule16MProcess() {
+    @Scheduled(cron = "10 2/15 * * * *") // 2, 17, 32, 47
+    public void schedule15MProcess() {
         if (this.applicationConfig.isStartSchedule()) {
             runJob(this.jobPrcs15MController, "DWDB Job 15 Min Processing");
         }
@@ -61,7 +62,16 @@ public class DwdbJobPrcsScheduler {
 
     @Async("scheduleExecutor")
     @ScheduleElapsed
-    @Scheduled(cron = "1 1 * * * *")
+    @Scheduled(cron = "10 3/30 * * * *") // 3, 33
+    public void schedule30MProcess() {
+        if (this.applicationConfig.isStartSchedule()) {
+            runJob(this.jobPrcs30MController, "DWDB Job 30 Min Processing");
+        }
+    }
+
+    @Async("scheduleExecutor")
+    @ScheduleElapsed
+    @Scheduled(cron = "30 3 * * * *")
     public void schedule01HProcess() {
         if (this.applicationConfig.isStartSchedule()) {
             runJob(this.jobPrcs01HController, "DWDB Job 1 Hour Processing");
@@ -70,9 +80,10 @@ public class DwdbJobPrcsScheduler {
 
     @Async("scheduleExecutor")
     @ScheduleElapsed
-    @Scheduled(cron = "2 2 2 * * *")
+    @Scheduled(cron = "10 22 3 * * *")
     public void schedule01DProcess() {
         if (this.applicationConfig.isStartSchedule()) {
+            // 1시간 통계정보를 현재시각 2시간 전 데이터로 생성하기 때문에 3시 이후에 일 데이터 생성하도록 한다.
             runJob(this.jobPrcs01DController, "DWDB Job 1 Day Processing");
         }
     }

+ 180 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs01DService.java

@@ -0,0 +1,180 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs01DMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcsMonthMapper;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs01DService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs01DMapper prcs01DMapper;
+    private final DwdbJobPrcsMonthMapper prcsMonthMapper;
+
+    private StatTimeDto initialize() {
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[01DAY...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+    }
+
+    public int processing() {
+        final String processName = "정주기 1일 작업";
+        log.info("[01DAY...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[01DAY...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // 1일 전 일자
+        String prcsDay = statTime.getPrcsDay();
+
+        log.info("[01DAY...] (TIME){}: [{}]/[{}]", LogUtils.elapsedLog("1일 통계시각"), statTime.getCurrTime(), prcsDay);
+
+        // statDwd01HEXE
+        // 1일 통계생성
+        int result;
+        try {
+            // 1일 중앙통계
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertStatDayCenter(prcsDay);
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_DAY_CENTER", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_DAY_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1일 12개지자체
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertStatDay12Loc(prcsDay);
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_DAY_12LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_DAY_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1일 통합배포시스템
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertStatDayExw(prcsDay);
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_DAY_EXW", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_DAY_EXW", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1일 수도권연계
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertStatDayLoc(prcsDay);
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_DAY_LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_DAY_LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1일 위치가공 통계
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertStatDayObeLoc(prcsDay);
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_DAY_OBELOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_DAY_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1일 DM_CENTER_FILTER 데이터 입력
+            tmpelapsed.reset();
+            result = this.prcs01DMapper.insertDmCenterFilter();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("DM_CENTER_FILTER", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("DM_CENTER_FILTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        processingMonth(statTime);
+
+        log.info("[01DAY...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+    private int processingMonth(StatTimeDto statTime) {
+        final String processName = "정주기 월 작업";
+        log.info("[01DAY...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+        Elapsed tmpelapsed = new Elapsed();
+
+        // 1일 전 일자
+        String prcsDay = statTime.getPrcsDay();
+
+        log.info("[01DAY...] (TIME){}: [{}]/[{}]", LogUtils.elapsedLog("월 통계시각"), statTime.getCurrTime(), prcsDay);
+
+        // statDwd01DEXE
+        // 월 통계생성
+        int result;
+        try {
+            // 월 중앙통계
+            tmpelapsed.reset();
+            result = this.prcsMonthMapper.insertStatMonthCenter();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_MON_CENTER", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_MON_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 월 12개지자체
+            tmpelapsed.reset();
+            result = this.prcsMonthMapper.insertStatMonth12Loc();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_MON_12LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_MON_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 월 통합배포시스템
+            tmpelapsed.reset();
+            result = this.prcsMonthMapper.insertStatMonthExw();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_MON_EXW", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_MON_EXW", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 월 수도권연계
+            tmpelapsed.reset();
+            result = this.prcsMonthMapper.insertStatMonthLoc();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_MON_LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_MON_LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 월 위치가공 통계
+            tmpelapsed.reset();
+            result = this.prcsMonthMapper.insertStatMonthObeLoc();
+            log.info("[01DAY...] (INS) {}", LogUtils.elapsedLog("STAT_MON_OBELOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[01DAY...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_MON_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        log.info("[01DAY...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+}

+ 268 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs01HService.java

@@ -0,0 +1,268 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs01HMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcsPatternMapper;
+import com.utic.dwdb.server.dto.PatternDto;
+import com.utic.dwdb.server.dto.PatternJobDto;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs01HService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs01HMapper prcs01HMapper;
+    private final DwdbJobPrcsPatternMapper prcsPatternMapper;
+
+    private StatTimeDto initialize() {
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[1HOUR...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+    }
+
+    public int processing() {
+        final String processName = "정주기 1시간 작업";
+        log.info("[1HOUR...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[1HOUR...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // 현재정주기 5분에서 1시간이전, 2시간이전 시각을 구한다.
+        String pastStat01Hour = TimeUtils.addMinutes(statTime.getPrcsHour(), -60);
+        String pastStat02Hour = TimeUtils.addMinutes(statTime.getPrcsHour(), -120);
+
+        log.info("[1HOUR...] (TIME){}: [{}]/[{}]/[{}]/[{}]", LogUtils.elapsedLog("1시간 통계시각"), statTime.getCurrTime(), statTime.getPrcsHour(), pastStat01Hour, pastStat02Hour);
+
+        // statDwd30MEXE
+        // 1시간 통계생성
+        int result;
+        try {
+            // 1시간 중앙통계
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertStatHourCenter(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("STAT_HOUR_CENTER", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_HOUR_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1시간 12개지자체
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertStatHour12Loc(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("STAT_HOUR_12LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_HOUR_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1시간 통합배포시스템
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertStatHourExw(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("STAT_HOUR_EXW", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_HOUR_EXW", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1시간 수도권연계
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertStatHourLoc(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("STAT_HOUR_LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_HOUR_LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1시간 위치가공 통계
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertStatHourObeLoc(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("STAT_HOUR_OBELOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_HOUR_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 1시간 DM_TRAFFIC_INCIDENT 데이터 입력
+            tmpelapsed.reset();
+            result = this.prcs01HMapper.insertDmTrafficCenter(pastStat01Hour, pastStat02Hour);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("DM_TRAFFIC_INCIDENT", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, Exception: {}", LogUtils.elapsedLog("DM_TRAFFIC_INCIDENT", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        initializePattern();
+
+        log.info("[1HOUR...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+    private void initializePattern() {
+        Elapsed elapsed = new Elapsed();
+        PatternDto pattern = null;
+        try {
+            pattern = this.prcsPatternMapper.findPatternDay();
+            log.info("[1HOUR...] (SEL) {}", LogUtils.elapsedLog("PATTERN DAY", 1, elapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[1HOUR...] (SEL) {}, initializePattern, Exception: {}", LogUtils.elapsedLog("PATTERN DAY", elapsed.milliSeconds()), e.getMessage());
+            return;
+        }
+
+        if (pattern.getWeekDay() != 1 && pattern.getWeekDay() != 2) {
+            /* 1:일,2:월,3:화,4:수,5:목,6:금,7:토*/
+            return;
+        }
+
+        String logPattern = "initialize05mPattern";
+        if (pattern.getWeekDay() == 1) {
+            log.info("[1HOUR...] ..... {}", LogUtils.elapsedLog(logPattern + " 시작"));
+            initializePatternData("0", pattern.getExeDay());
+            //initialize05mPattern(pattern.getExeDay());
+        }
+        else {
+            logPattern = "initialize15mPattern";
+            log.info("[1HOUR...] ..... {}", LogUtils.elapsedLog(logPattern + " 시작"));
+            initializePatternData("1", pattern.getExeDay());
+            //initialize15mPattern(pattern.getExeDay());
+        }
+        log.info("[1HOUR...] ..... {}", LogUtils.elapsedLog(logPattern + " 완료", elapsed.milliSeconds()));
+    }
+
+    private PatternJobDto findPatternJobLog(String patternType, String exeDay)  {
+        Elapsed elapsed = new Elapsed();
+        try {
+            PatternJobDto patternJobLog = this.prcsPatternMapper.findPatternJobLog(patternType, exeDay);
+            log.info("[1HOUR...] (SEL) {}", LogUtils.elapsedLog("PATN_JOB_LOG", 1, elapsed.milliSeconds()));
+            return patternJobLog;
+        }
+        catch (Exception e) {
+            log.info("[1HOUR...] (SEL) {}, findPatternJobLog, Exception: {}", LogUtils.elapsedLog("PATN_JOB_LOG", elapsed.milliSeconds()), e.getMessage());
+            return null;
+        }
+    }
+    private int insertPatternJobLog(String patternType, String exeDay)  {
+        Elapsed elapsed = new Elapsed();
+        try {
+            int result = this.prcsPatternMapper.insertPatternJobLog(patternType, exeDay);
+            log.info("[1HOUR...] (INS) {}", LogUtils.elapsedLog("PATN_JOB_LOG", result, elapsed.milliSeconds()));
+            return result;
+        }
+        catch (Exception e) {
+            log.info("[1HOUR...] (INS) {}, findPatternJobLog, Exception: {}", LogUtils.elapsedLog("PATN_JOB_LOG", elapsed.milliSeconds()), e.getMessage());
+        }
+        return 0;
+    }
+    private int updatePatternJobLog(String patternType, String exeDay)  {
+        Elapsed elapsed = new Elapsed();
+        try {
+            int result = this.prcsPatternMapper.updatePatternJobLog(patternType, exeDay);
+            log.info("[1HOUR...] (UPD) {}", LogUtils.elapsedLog("PATN_JOB_LOG", result, elapsed.milliSeconds()));
+            return result;
+        }
+        catch (Exception e) {
+            log.info("[1HOUR...] (UPD) {}, findPatternJobLog, Exception: {}", LogUtils.elapsedLog("PATN_JOB_LOG", elapsed.milliSeconds()), e.getMessage());
+        }
+        return 0;
+    }
+    private void deletePatternWeekJob(String patternType)  {
+        Elapsed elapsed = new Elapsed();
+        String tableName = "0".equals(patternType) ? "PATN_WEEK_JOB" : "PATN_15MIN_WEEK_JOB";
+        try {
+
+            if ("0".equals(patternType)) {
+                this.prcsPatternMapper.deletePatternWeekJob();
+            }
+            else {
+                this.prcsPatternMapper.deletePattern15MinWeekJob();
+            }
+            log.info("[1HOUR...] (DEL) {}", LogUtils.elapsedLog(tableName, 1, elapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[1HOUR...] (SEL) {}, deletePatternWeekJob, Exception: {}", LogUtils.elapsedLog(tableName, elapsed.milliSeconds()), e.getMessage());
+        }
+    }
+
+    private void initializePatternData(String patternType, String exeDay) {
+        PatternJobDto patternJobLog = findPatternJobLog(patternType, exeDay);
+        if (patternJobLog == null || patternJobLog.getJobCount() >= 1) {
+            return;
+        }
+
+        insertPatternJobLog(patternType, exeDay);
+        deletePatternWeekJob(patternType);
+        updatePatternJobLog(patternType, exeDay);
+    }
+
+
+    private void initialize05mPattern(String exeDay) {
+        PatternJobDto patternJobLog = findPatternJobLog("0", exeDay);
+        if (patternJobLog == null || patternJobLog.getJobCount() >= 1) {
+            return;
+        }
+
+        insertPatternJobLog("0", exeDay);
+        deletePatternWeekJob("0");
+
+        Elapsed elapsed = new Elapsed();
+        for (int hour = 0; hour < 24; hour++) {
+            for (int min = 0; min < 60; min += 5) {
+                String patternTime = String.format("%02d%02d", hour, min);
+                try {
+                    int result = this.prcsPatternMapper.updatePatternWeekJob(patternTime);
+                    log.info("[1HOUR...] (UPD) {}, [{}]", LogUtils.elapsedLog("PATN_WEEK_JOB", result, elapsed.milliSeconds()), patternTime);
+                }
+                catch (Exception e) {
+                    log.info("[1HOUR...] (UPD) {}, initialize05mPattern, Exception: {}", LogUtils.elapsedLog("PATN_WEEK_JOB", elapsed.milliSeconds()), e.getMessage());
+                }
+            }
+        }
+        updatePatternJobLog("0", exeDay);
+    }
+
+    private void initialize15mPattern(String exeDay) {
+        PatternJobDto patternJobLog = findPatternJobLog("1", exeDay);
+        if (patternJobLog == null || patternJobLog.getJobCount() >= 1) {
+            return;
+        }
+
+        insertPatternJobLog("1", exeDay);
+        deletePatternWeekJob("1");
+
+        Elapsed elapsed = new Elapsed();
+        for (int hour = 0; hour < 24; hour++) {
+            for (int min = 0; min < 60; min += 15) {
+                String patternTime = String.format("%02d%02d", hour, min);
+                try {
+                    int result = this.prcsPatternMapper.updatePattern15minWeekJob(patternTime);
+                    log.info("[1HOUR...] (UPD) {}, [{}]", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB", result, elapsed.milliSeconds()), patternTime);
+                }
+                catch (Exception e) {
+                    log.info("[1HOUR...] (UPD) {}, initialize15mPattern, Exception: {}", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB", elapsed.milliSeconds()), e.getMessage());
+                }
+            }
+        }
+        updatePatternJobLog("1", exeDay);
+    }
+
+}

+ 17 - 16
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs04MService.java

@@ -45,10 +45,11 @@ public class DwdbJobPrcs04MService implements AbstractProcessService {
         Elapsed tmpelapsed = new Elapsed();
 
         // statRcvPTDEXE
+        int result;
         try {
             tmpelapsed.reset();
-            int currLinkStMoctLog = this.prcs04MMapper.insertCurLinkStMoctLog(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", currLinkStMoctLog, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertCurLinkStMoctLog(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(국토부 LINK)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -56,8 +57,8 @@ public class DwdbJobPrcs04MService implements AbstractProcessService {
         // statRcv12LEXE
         try {
             tmpelapsed.reset();
-            int currLinkSt = this.prcs04MMapper.insertCurLinkSt(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", currLinkSt, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertCurLinkSt(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -65,8 +66,8 @@ public class DwdbJobPrcs04MService implements AbstractProcessService {
         // statRcvLOCEXE
         try {
             tmpelapsed.reset();
-            int rcvLinkTraffic = this.prcs04MMapper.insertRcvLinkTraffic(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", rcvLinkTraffic, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertRcvLinkTraffic(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -74,32 +75,32 @@ public class DwdbJobPrcs04MService implements AbstractProcessService {
         // statRcvCNTEXE
         try {
             tmpelapsed.reset();
-            int incidentCenter = this.prcs04MMapper.updateIncidentCenter(statTime.getPast10Min());
-            log.info("[04MIN...] (UPD) {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", incidentCenter, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.updateIncidentCenter(statTime.getPast10Min());
+            log.info("[04MIN...] (UPD) {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int traffic5mHist = this.prcs04MMapper.insertTraffic5mHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", traffic5mHist, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertTraffic5mHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int collInfoHist = this.prcs04MMapper.insertCollInfoHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLINFOHIST", collInfoHist, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertCollInfoHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLINFOHIST", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLINFOHIST", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int collTrafficHist = this.prcs04MMapper.insertCollTrafficHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLTRAFFICHIST", collTrafficHist, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertCollTrafficHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLTRAFFICHIST", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLTRAFFICHIST", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -109,8 +110,8 @@ public class DwdbJobPrcs04MService implements AbstractProcessService {
         // TODO: TRAFFIC_OBELOC@UTISDB 테이블 스키마 확인해야함.
         try {
             tmpelapsed.reset();
-            int trafficObeLocHist = this.prcs04MMapper.insertTrafficObeLocHist(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", trafficObeLocHist, tmpelapsed.milliSeconds()));
+            result = this.prcs04MMapper.insertTrafficObeLocHist(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", tmpelapsed.milliSeconds()), e.getMessage());
         }

+ 77 - 70
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs05MService.java

@@ -6,6 +6,7 @@ import com.utic.common.utils.StringUtils;
 import com.utic.common.utils.TimeUtils;
 import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
 import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs05MMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcsPatternMapper;
 import com.utic.dwdb.server.dto.CodeValueDto;
 import com.utic.dwdb.server.dto.HolidayDto;
 import com.utic.dwdb.server.dto.StatTimeDto;
@@ -26,6 +27,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
 
     private final DwdbJobMapper dwdbJobMapper;
     private final DwdbJobPrcs05MMapper prcs05MMapper;
+    private final DwdbJobPrcsPatternMapper prcsPatternMapper;
+
     private ConcurrentHashMap<String, CodeValueDto> mapData = new ConcurrentHashMap<>();
     private StatTimeDto initialize() {
 
@@ -63,31 +66,32 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         Elapsed tmpelapsed = new Elapsed();
 
         // statFitTRFEXE
+        int result;
         try {
             tmpelapsed.reset();
-            int truncateStatLocal = this.prcs05MMapper.truncateStatLocal();
-            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("STAT_LOCAL(TRUNCATE)", truncateStatLocal, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.truncateStatLocal();
+            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("STAT_LOCAL(TRUNCATE)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (DEL) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(TRUNCATE)", tmpelapsed.milliSeconds()), e.getMessage());
         }
         try {
             tmpelapsed.reset();
-            int local12Loc = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(12개지자체)", local12Loc, tmpelapsed.milliSeconds()));
+//            result = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
+//            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(12개지자체)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(12개지자체)", tmpelapsed.milliSeconds()), e.getMessage());
         }
         try {
             tmpelapsed.reset();
-            int localCapital = this.prcs05MMapper.insertStatLocalCapital(statTime.getPast25Min(), statTime.getPast30Min());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(수도권 지역센터)", localCapital, tmpelapsed.milliSeconds()));
+//            result = this.prcs05MMapper.insertStatLocalCapital(statTime.getPast25Min(), statTime.getPast30Min());
+//            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(수도권 지역센터)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(수도권 지역센터)", tmpelapsed.milliSeconds()), e.getMessage());
         }
         try {
             tmpelapsed.reset();
-            int localTotal = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(통합배포시스템)", localTotal, tmpelapsed.milliSeconds()));
+//            result = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
+//            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(통합배포시스템)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(통합배포시스템)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -107,8 +111,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         try {
             // LINK_FILTER 초기화
             tmpelapsed.reset();
-            int truncateLinkFilter = this.prcs05MMapper.truncateLinkFilter();
-            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("LINK_FILTER(TRUNCATE)", truncateLinkFilter, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.truncateLinkFilter();
+            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("LINK_FILTER(TRUNCATE)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (DEL) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(TRUNCATE)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -116,8 +120,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         try {
             // LINK_FILTER 표준편차 입력
             tmpelapsed.reset();
-            int linkFilter = this.prcs05MMapper.insertLinkFilter(statTime.getPast25Min(), codeValue0.getCodeValue(), codeValue5.getCodeValue());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER(표준편차값)", linkFilter, tmpelapsed.milliSeconds()));
+//            result = this.prcs05MMapper.insertLinkFilter(statTime.getPast25Min(), codeValue0.getCodeValue(), codeValue5.getCodeValue());
+//            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER(표준편차값)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(표준편차값)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -128,10 +132,10 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
             log.info("[05MIN...] (UPD) {}: LINK_FILTER 통계 최대최소 필터링 사용", LogUtils.elapsedLog("LINK_FILTER(패턴 필터링)"));
             try {
                 tmpelapsed.reset();
-                HolidayDto holiday = this.prcs05MMapper.findHoliday(statTime.getPast25Min());
-                log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpelapsed.milliSeconds()));
+//                HolidayDto holiday = this.prcs05MMapper.findHoliday(statTime.getPast25Min());
+//                log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpelapsed.milliSeconds()));
                 
-                runLinkFilterPaternUpdate(statTime, holiday, codeValue2);
+//                runLinkFilterPatternUpdate(statTime, holiday, codeValue2);
             } catch (Exception e) {
                 log.info("[05MIN...] (SEL) {}, Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpelapsed.milliSeconds()), e.getMessage());
             }
@@ -145,7 +149,7 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // 도로등급별 최대최소값 UPDATE
         try {
             tmpelapsed.reset();
-            int result = this.prcs05MMapper.updateLinkFilterRoadRank();
+            result = this.prcs05MMapper.updateLinkFilterRoadRank();
             log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("LINK_FILTER(도로등급 변경)", result, tmpelapsed.milliSeconds()));
         }
         catch (Exception e) {
@@ -157,7 +161,7 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
             log.info("[05MIN...] (UPD) {}: LINK_FILTER  도로등급 최대최소 필터링 사용", LogUtils.elapsedLog("LINK_FILTER(도로등급 필터링)"));
             try {
                 tmpelapsed.reset();
-                int result = this.prcs05MMapper.updateLinkFilterMinMax(
+                result = this.prcs05MMapper.updateLinkFilterMinMax(
                         codeValue6.getMinValue(), codeValue6.getMaxValue(),
                         codeValue7.getMinValue(), codeValue7.getMaxValue(),
                         codeValue8.getMinValue(), codeValue8.getMaxValue(),
@@ -175,8 +179,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // 전국 이력저장
         try {
             tmpelapsed.reset();
-            int statLocalLog = this.prcs05MMapper.insertStatLocalLog();
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL_LOG", statLocalLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStatLocalLog();
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -191,61 +195,61 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
             log.info("[05MIN...] (SEL) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(생성일자)", tmpelapsed.milliSeconds()), e.getMessage());
         }
         if (StringUtils.isEmpty(regDate)) {
-            regDate = statTime.getPast25Min();  // LINK_FILTER 생성일자(MAK_DATE) 없을 경우
+//            regDate = statTime.getPast25Min();  // LINK_FILTER 생성일자(MAK_DATE) 없을 경우
         }
 
         try {
             tmpelapsed.reset();
-            int centerLog = this.prcs05MMapper.insertCenterLog(regDate);
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("CENTER_LOG", centerLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertCenterLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("CENTER_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CENTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int utisLog = this.prcs05MMapper.insertUtisLog(regDate);
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("UTIS_LOG", utisLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertUtisLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("UTIS_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("UTIS_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int trafficLog = this.prcs05MMapper.insertStatTrafficLog(regDate);
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_TRAFFIC_LOG", trafficLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStatTrafficLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_TRAFFIC_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_TRAFFIC_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int trafficLog = this.prcs05MMapper.insertFilterLog(regDate, codeValue0.getCodeValue(), codeValue1.getCodeValue(), codeValue2.getCodeValue(), codeValue3.getCodeValue(), codeValue4.getCodeValue());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("FILTER_LOG", trafficLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertFilterLog(regDate, codeValue0.getCodeValue(), codeValue1.getCodeValue(), codeValue2.getCodeValue(), codeValue3.getCodeValue(), codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("FILTER_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int linkFilterLog = this.prcs05MMapper.insertLinkFilterLog(codeValue4.getCodeValue());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER_LOG", linkFilterLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertLinkFilterLog(codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int stat5MinCenter = this.prcs05MMapper.insertStat5MinCenter(regDate, codeValue4.getCodeValue());
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", stat5MinCenter, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStat5MinCenter(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
             tmpelapsed.reset();
-            int statFilterLog = this.prcs05MMapper.insertStatFilterLog(regDate);
-            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_FILTER_LOG", statFilterLog, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStatFilterLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_FILTER_LOG", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -253,8 +257,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         for (int level = 2; level <= 4; level++) {
             try {
                 tmpelapsed.reset();
-                int stat5MinCenter = this.prcs05MMapper.insertStat5MinCenterLevel(String.valueOf(level), regDate);
-                log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER(레벨" + level + ")", stat5MinCenter, tmpelapsed.milliSeconds()));
+                result = this.prcs05MMapper.insertStat5MinCenterLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER(레벨" + level + ")", result, tmpelapsed.milliSeconds()));
             } catch (Exception e) {
                 log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
             }
@@ -262,8 +266,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
 
         try {
             tmpelapsed.reset();
-            int updateStat5MinCenter = this.prcs05MMapper.updateStat5MinCenter(regDate);
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", updateStat5MinCenter, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.updateStat5MinCenter(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -273,24 +277,24 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // STAT_5MIN_12LOC 통계정보
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.insertStat5Min12Loc(regDate, codeValue4.getCodeValue());
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStat5Min12Loc(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
         for (int level = 2; level <= 4; level++) {
             try {
-                    tmpelapsed.reset();
-                    int inserted = this.prcs05MMapper.insertStat5Min12LocLevel(String.valueOf(level), regDate);
-                    log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+                tmpelapsed.reset();
+                result = this.prcs05MMapper.insertStat5Min12LocLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(레벨" + level + ")", result, tmpelapsed.milliSeconds()));
             } catch (Exception e) {
                 log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
             }
         }
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.updateStat5Min12LocTravelTime(regDate);
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.updateStat5Min12LocTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(TRAVEL_TIME)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -298,24 +302,24 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // STAT_5MIN_EXW 통계정보
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.insertStat5MinExw(regDate, codeValue4.getCodeValue());
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStat5MinExw(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW", tmpelapsed.milliSeconds()), e.getMessage());
         }
         for (int level = 2; level <= 4; level++) {
             try {
                 tmpelapsed.reset();
-                int inserted = this.prcs05MMapper.insertStat5MinExwLevel(String.valueOf(level), regDate);
-                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+                result = this.prcs05MMapper.insertStat5MinExwLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(레벨" + level + ")", result, tmpelapsed.milliSeconds()));
             } catch (Exception e) {
                 log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
             }
         }
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.updateStat5MinExwTravelTime(regDate);
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.updateStat5MinExwTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(TRAVEL_TIME)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -323,24 +327,24 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // STAT_5MIN_LOC 통계정보
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.insertStat5MinLoc(regDate, codeValue4.getCodeValue());
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStat5MinLoc(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
         for (int level = 2; level <= 4; level++) {
             try {
                 tmpelapsed.reset();
-                int inserted = this.prcs05MMapper.insertStat5MinLocLevel(String.valueOf(level), regDate);
-                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+                result = this.prcs05MMapper.insertStat5MinLocLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(레벨" + level + ")", result, tmpelapsed.milliSeconds()));
             } catch (Exception e) {
                 log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
             }
         }
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.updateStat5MinLocTravelTime(regDate);
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.updateStat5MinLocTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(TRAVEL_TIME)", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -348,8 +352,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         // STAT_5MIN_OBELOC 통계정보
         try {
             tmpelapsed.reset();
-            int inserted = this.prcs05MMapper.insertStat5MinObeLoc(regDate);
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_OBELOC", inserted, tmpelapsed.milliSeconds()));
+            result = this.prcs05MMapper.insertStat5MinObeLoc(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_OBELOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
@@ -358,7 +362,7 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         return 0;
     }
 
-    private void patternUpdate(String regDate) {
+    private void patternUpdate(String patternTime) {
         Elapsed elapsed = new Elapsed();
         Elapsed tmpElapsed = new Elapsed();
         String logTable, fromTable;
@@ -376,11 +380,11 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         boolean isWeek = false;
         HolidayDto holiday = null;
         try {
-            holiday = this.prcs05MMapper.findHoliday(regDate);
+            holiday = this.prcsPatternMapper.findHoliday(patternTime);
             log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpElapsed.milliSeconds()));
         }
         catch (Exception e) {
-            log.info("[05MIN...] (SEL) {}, patternUpdate[{}], Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpElapsed.milliSeconds()), regDate, e.getMessage());
+            log.info("[05MIN...] (SEL) {}, patternUpdate[{}], Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpElapsed.milliSeconds()), patternTime, e.getMessage());
             return;
         }
 
@@ -433,17 +437,18 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
             }
         }
 
+        int result;
         if (isWeek) {
             // 평일(3,4,5)
             try {
-                int result = this.prcs05MMapper.mergePatternWeekJob(columnName, regDate);
+                result = this.prcsPatternMapper.mergePatternWeekJob("PATN_WEEK_JOB", "STAT_5MIN_CENTER", columnName, patternTime);
                 log.info("[05MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_WEEK_JOB(MERGE)", result, elapsed.milliSeconds()));
             }
             catch (Exception e) {
                 log.info("[05MIN...] (MRG) {}, Exception: {}", LogUtils.elapsedLog("PATN_WEEK_JOB(MERGE)", elapsed.milliSeconds()), e.getMessage());
             }
             try {
-                int result = this.prcs05MMapper.updatePatternWeekJob(columnName, regDate);
+                result = this.prcsPatternMapper.updateIncidentPatternWeekJob("PATN_WEEK_JOB", columnName, patternTime);
                 log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("PATN_WEEK_JOB(UPDATE)", result, elapsed.milliSeconds()));
             }
             catch (Exception e) {
@@ -452,14 +457,14 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         }
         else {
             try {
-                int result = this.prcs05MMapper.insertPatternHist(fromTable + "_HIST", fromTable, regDate);
+                result = this.prcsPatternMapper.insertPatternHist(fromTable + "_HIST", fromTable, patternTime);
                 log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog(logTable + "_HIST", result, elapsed.milliSeconds()));
             }
             catch (Exception e) {
                 log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog(logTable + "_HIST", elapsed.milliSeconds()), e.getMessage());
             }
             try {
-                int result = this.prcs05MMapper.updatePattern(fromTable, minValue, maxValue);
+                result = this.prcsPatternMapper.updatePattern(fromTable, "STAT_5MIN_CENTER", patternTime, minValue, maxValue);
                 log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog(logTable, result, elapsed.milliSeconds()));
             }
             catch (Exception e) {
@@ -471,7 +476,9 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
             // 금요일 이면 금요일 패턴을 업데이트 하고(위에서 처리) 평일패턴을 업데이트 한다.
             // 평일패턴작업 테이블을 이용하여 작업을 수행한다.
             try {
-                int result = this.prcs05MMapper.mergePatternWeek(regDate, minValue, maxValue);
+                minValue = String.valueOf(code13.getMinValue());
+                maxValue = String.valueOf(code13.getMaxValue());
+                result = this.prcsPatternMapper.mergePatternWeek("PATN_WEEK", "PATN_WEEK_JOB", patternTime, minValue, maxValue);
                 log.info("[05MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_WEEK", result, elapsed.milliSeconds()));
             }
             catch (Exception e) {
@@ -480,7 +487,7 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         }
     }
 
-    private void runLinkFilterPaternUpdate(StatTimeDto statTime, HolidayDto holiday, CodeValueDto codeValue2) {
+    private void runLinkFilterPatternUpdate(StatTimeDto statTime, HolidayDto holiday, CodeValueDto codeValue2) {
         Elapsed elapsed = new Elapsed();
         String logTable, fromTable;
         if (holiday.getHCnt() > 0) {
@@ -513,8 +520,8 @@ public class DwdbJobPrcs05MService implements AbstractProcessService {
         }
 
         try {
-            int result = this.prcs05MMapper.updateLinkFilterPattern(fromTable, statTime.getPast25Min(), codeValue2.getMinValue(), codeValue2.getMaxValue());
-            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog(logTable+"(패턴 최대최소값 변경)", result, elapsed.milliSeconds()));
+//            int result = this.prcs05MMapper.updateLinkFilterPattern(fromTable, statTime.getPast25Min(), codeValue2.getMinValue(), codeValue2.getMaxValue());
+//            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog(logTable+"(패턴 최대최소값 변경)", result, elapsed.milliSeconds()));
         }
         catch (Exception e) {
             log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog(logTable+"(패턴 최대최소값 변경)", elapsed.milliSeconds()), e.getMessage());

+ 180 - 41
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs15MService.java

@@ -4,13 +4,20 @@ import com.utic.common.utils.Elapsed;
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
 import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
-import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs04MMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs15MMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcsPatternMapper;
+import com.utic.dwdb.server.dto.CodeValueDto;
+import com.utic.dwdb.server.dto.HolidayDto;
 import com.utic.dwdb.server.dto.StatTimeDto;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
 @Slf4j
 @Getter
 @RequiredArgsConstructor
@@ -18,105 +25,237 @@ import org.springframework.stereotype.Service;
 public class DwdbJobPrcs15MService implements AbstractProcessService {
 
     private final DwdbJobMapper dwdbJobMapper;
-    private final DwdbJobPrcs04MMapper prcs04MMapper;
+    private final DwdbJobPrcs15MMapper prcs15MMapper;
+    private final DwdbJobPrcsPatternMapper prcsPatternMapper;
+    private ConcurrentHashMap<String, CodeValueDto> mapData = new ConcurrentHashMap<>();
 
     private StatTimeDto initialize() {
+        try {
+            List<CodeValueDto> codes = this.dwdbJobMapper.findAllCodeValue();
+            for (CodeValueDto code : codes) {
+                this.mapData.put(code.getMainCode()+code.getSubCode(), code);
+            }
+        }
+        catch (Exception e) {
+            log.error("[15MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findAllCodeValue"), e.getMessage());
+        }
 
         try {
             return this.dwdbJobMapper.findStatTime();
         }
         catch (Exception e) {
-            log.error("[04MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            log.error("[15MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
             return null;
         }
     }
 
     public int processing() {
         final String processName = "정주기 15분 작업";
-        log.info("[04MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        log.info("[15MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
         Elapsed elapsed = new Elapsed();
 
         StatTimeDto statTime = initialize();
         if (statTime == null) {
-            log.error("[04MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            log.error("[15MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
             return -1;
         }
 
         Elapsed tmpelapsed = new Elapsed();
 
+        // 현재정주기 5분에서 30분이전, 45분 이전 시각을 구한다.
+        String pastStat30Min = TimeUtils.addMinutes(statTime.getPrcs15Min(), -30);
+        String pastStat45Min = TimeUtils.addMinutes(statTime.getPrcs15Min(), -45);
+
+        log.info("[15MIN...] (TIME){}: [{}]/[{}]/[{}]/[{}]", LogUtils.elapsedLog("15분 통계시각"), statTime.getCurrTime(), statTime.getPrcs15Min(), pastStat30Min, pastStat45Min);
+
         // statDwd15MEXE
+        // 15분 통계생성
+        int result;
         try {
+            // 15분 중앙통계
             tmpelapsed.reset();
-            int currLinkStMoctLog = this.prcs04MMapper.insertCurLinkStMoctLog(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", currLinkStMoctLog, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertStat15MinCenter(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("STAT_15MIN_CENTER", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_15MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
-        // statRcv12LEXE
         try {
+            // 15분 12개지자체
             tmpelapsed.reset();
-            int currLinkSt = this.prcs04MMapper.insertCurLinkSt(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", currLinkSt, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertStat15Min12Loc(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("STAT_15MIN_12LOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_15MIN_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
-        // statRcvLOCEXE
         try {
+            // 15분 통합배포시스템
             tmpelapsed.reset();
-            int rcvLinkTraffic = this.prcs04MMapper.insertRcvLinkTraffic(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", rcvLinkTraffic, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertStat15MinExw(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("STAT_15MIN_EXW", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_15MIN_EXW", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
-        // statRcvCNTEXE
         try {
+            // 15분 수도권연계
             tmpelapsed.reset();
-            int incidentCenter = this.prcs04MMapper.updateIncidentCenter(statTime.getPast10Min());
-            log.info("[04MIN...] (UPD) {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", incidentCenter, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertStat15MinLoc(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("STAT_15MIN_LOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_15MIN_LOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
         try {
+            // 15분 위치가공 통계
             tmpelapsed.reset();
-            int traffic5mHist = this.prcs04MMapper.insertTraffic5mHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", traffic5mHist, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertStat15MinObeLoc(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("STAT_15MIN_OBELOC", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_15MIN_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
+        // 15 분 이력 저장
         try {
+            // 15분 TRAFFIC5M_HIST
             tmpelapsed.reset();
-            int collInfoHist = this.prcs04MMapper.insertCollInfoHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLINFOHIST", collInfoHist, tmpelapsed.milliSeconds()));
+            result = this.prcs15MMapper.insertTraffic15mHist(pastStat30Min, pastStat45Min);
+            log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC15M_HIST", result, tmpelapsed.milliSeconds()));
         } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLINFOHIST", tmpelapsed.milliSeconds()), e.getMessage());
+            log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC15M_HIST", tmpelapsed.milliSeconds()), e.getMessage());
         }
 
+        // 15분 패턴 업데이트
+        patternUpdate(pastStat30Min);
+
+        log.info("[15MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+    private void patternUpdate(String patternTime) {
+        Elapsed elapsed = new Elapsed();
+        Elapsed tmpElapsed = new Elapsed();
+        String logTable, fromTable;
+        String minValue = "0";
+        String maxValue = "0";
+        String columnName = "SPEED3";
+
+        CodeValueDto code11 = Optional.ofNullable(this.mapData.get("C02T06")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T06").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code12 = Optional.ofNullable(this.mapData.get("C02T07")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T07").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code13 = Optional.ofNullable(this.mapData.get("C02T08")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T08").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code14 = Optional.ofNullable(this.mapData.get("C02T09")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T09").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code15 = Optional.ofNullable(this.mapData.get("C02T10")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T10").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code16 = Optional.ofNullable(this.mapData.get("C02T11")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T11").codeValue("999").minValue(80).maxValue(20).build());
+
+        boolean isWeek = false;
+        HolidayDto holiday = null;
         try {
-            tmpelapsed.reset();
-            int collTrafficHist = this.prcs04MMapper.insertCollTrafficHist(statTime.getPast05Min(), statTime.getPast30Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLTRAFFICHIST", collTrafficHist, tmpelapsed.milliSeconds()));
-        } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLTRAFFICHIST", tmpelapsed.milliSeconds()), e.getMessage());
+            holiday = this.prcsPatternMapper.findHoliday(patternTime);
+            log.info("[15MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpElapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[15MIN...] (SEL) {}, patternUpdate[{}], Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpElapsed.milliSeconds()), patternTime, e.getMessage());
+            return;
         }
 
+        if (holiday.getHCnt() > 0) {
+            logTable = "(휴일)PATN_15MIN_HOLIDAY";
+            fromTable = "PATN_15MIN_HOLIDAY";
+            minValue = String.valueOf(code16.getMinValue());
+            maxValue = String.valueOf(code16.getMaxValue());
+        }
+        else {
+            switch(holiday.getWDay()) {
+                case 1: // 일요일 패턴
+                    logTable = "(일요일)PATN_15MIN_SUN";
+                    fromTable = "PATN_15MIN_SUN";
+                    minValue = String.valueOf(code11.getMinValue());
+                    maxValue = String.valueOf(code11.getMaxValue());
+                    break;
+                case 2: // 월요일 패턴
+                    logTable = "(월요일)PATN_15MIN_MON";
+                    fromTable = "PATN_15MIN_MON";
+                    minValue = String.valueOf(code12.getMinValue());
+                    maxValue = String.valueOf(code12.getMaxValue());
+                    break;
+                case 6: // 금요일 패턴
+                    logTable = "(금요일)PATN_15MIN_FRI";
+                    fromTable = "PATN_15MIN_FRI";
+                    minValue = String.valueOf(code14.getMinValue());
+                    maxValue = String.valueOf(code14.getMaxValue());
+                    break;
+                case 7: // 토요일 패턴
+                    logTable = "(토요일)PATN_15MIN_SAT";
+                    fromTable = "PATN_15MIN_SAT";
+                    minValue = String.valueOf(code15.getMinValue());
+                    maxValue = String.valueOf(code15.getMaxValue());
+                    break;
+                default: // 평일 패턴(3,4,5)
+                    isWeek = true;
+                    logTable = "(평일)PATN_15MIN_WEEK";
+                    fromTable = "PATN_15MIN_WEEK";
+                    if (holiday.getWDay() == 3) {
+                        columnName = "SPEED3";
+                    }
+                    else if (holiday.getWDay() == 4) {
+                        columnName = "SPEED4";
+                    }
+                    else {
+                        columnName = "SPEED5";
+                    }
+                    break;
+            }
+        }
 
-        // statRcvOBEEXE
-        // TODO: TRAFFIC_OBELOC@UTISDB 테이블 스키마 확인해야함.
-        try {
-            tmpelapsed.reset();
-            int trafficObeLocHist = this.prcs04MMapper.insertTrafficObeLocHist(statTime.getPast10Min());
-            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", trafficObeLocHist, tmpelapsed.milliSeconds()));
-        } catch (Exception e) {
-            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+        int result;
+        if (isWeek) {
+            // 평일(3,4,5)
+            try {
+                result = this.prcsPatternMapper.mergePatternWeekJob("PATN_15MIN_WEEK_JOB", "STAT_15MIN_CENTER", columnName, patternTime);
+                log.info("[15MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB(MERGE)", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[15MIN...] (MRG) {}, Exception: {}", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB(MERGE)", elapsed.milliSeconds()), e.getMessage());
+            }
+            try {
+                result = this.prcsPatternMapper.updateIncidentPatternWeekJob("PATN_15MIN_WEEK_JOB", columnName, patternTime);
+                log.info("[15MIN...] (UPD) {}", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB(UPDATE)", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[15MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("PATN_15MIN_WEEK_JOB(UPDATE)", elapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        else {
+            try {
+                result = this.prcsPatternMapper.insertPatternHist(fromTable + "_HIST", fromTable, patternTime);
+                log.info("[15MIN...] (INS) {}", LogUtils.elapsedLog(logTable + "_HIST", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[15MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog(logTable + "_HIST", elapsed.milliSeconds()), e.getMessage());
+            }
+            try {
+                result = this.prcsPatternMapper.updatePattern(fromTable, "STAT_15MIN_CENTER", patternTime, minValue, maxValue);
+                log.info("[15MIN...] (UPD) {}", LogUtils.elapsedLog(logTable, result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[15MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog(logTable, elapsed.milliSeconds()), e.getMessage());
+            }
         }
 
-        log.info("[04MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
-        return 0;
+        if (holiday.getWDay() == 6) {
+            // 금요일 이면 금요일 패턴을 업데이트 하고(위에서 처리) 평일패턴을 업데이트 한다.
+            // 평일패턴작업 테이블을 이용하여 작업을 수행한다.
+            try {
+                minValue = String.valueOf(code13.getMinValue());
+                maxValue = String.valueOf(code13.getMaxValue());
+                result = this.prcsPatternMapper.mergePatternWeek("PATN_15MIN_WEEK", "PATN_15MIN_WEEK_JOB", patternTime, minValue, maxValue);
+                log.info("[15MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_15MIN_WEEK", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[15MIN...] (MRG) {}, Exception: {}", LogUtils.elapsedLog("PATN_15MIN_WEEK", elapsed.milliSeconds()), e.getMessage());
+            }
+        }
     }
 
 }

+ 105 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs30MService.java

@@ -0,0 +1,105 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs30MMapper;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs30MService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs30MMapper prcs30MMapper;
+
+    private StatTimeDto initialize() {
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[30MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+    }
+
+    public int processing() {
+        final String processName = "정주기 30분 작업";
+        log.info("[30MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[30MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // 현재정주기 5분에서 30분이전, 60분 이전 시각을 구한다.
+        String pastStat30Min = TimeUtils.addMinutes(statTime.getPrcs30Min(), -30);
+        String pastStat60Min = TimeUtils.addMinutes(statTime.getPrcs30Min(), -60);
+
+        log.info("[30MIN...] (TIME){}: [{}]/[{}]/[{}]/[{}]", LogUtils.elapsedLog("30분 통계시각"), statTime.getCurrTime(), statTime.getPrcs30Min(), pastStat30Min, pastStat60Min);
+
+        // statDwd30MEXE
+        // 30분 통계생성
+        int result;
+        try {
+            // 30분 중앙통계
+            tmpelapsed.reset();
+            result = this.prcs30MMapper.insertStat30MinCenter(pastStat30Min, pastStat60Min);
+            log.info("[30MIN...] (INS) {}", LogUtils.elapsedLog("STAT_30MIN_CENTER", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[30MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_30MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 30분 12개지자체
+            tmpelapsed.reset();
+            result = this.prcs30MMapper.insertStat30Min12Loc(pastStat30Min, pastStat60Min);
+            log.info("[30MIN...] (INS) {}", LogUtils.elapsedLog("STAT_30MIN_12LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[30MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_30MIN_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 30분 통합배포시스템
+            tmpelapsed.reset();
+            result = this.prcs30MMapper.insertStat30MinExw(pastStat30Min, pastStat60Min);
+            log.info("[30MIN...] (INS) {}", LogUtils.elapsedLog("STAT_30MIN_EXW", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[30MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_30MIN_EXW", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 30분 수도권연계
+            tmpelapsed.reset();
+            result = this.prcs30MMapper.insertStat30MinLoc(pastStat30Min, pastStat60Min);
+            log.info("[30MIN...] (INS) {}", LogUtils.elapsedLog("STAT_30MIN_LOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[30MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_30MIN_LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // 30분 위치가공 통계
+            tmpelapsed.reset();
+            result = this.prcs30MMapper.insertStat30MinObeLoc(pastStat30Min, pastStat60Min);
+            log.info("[30MIN...] (INS) {}", LogUtils.elapsedLog("STAT_30MIN_OBELOC", result, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[30MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_30MIN_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        log.info("[30MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+}

+ 2 - 1
utic-dwdb-server/src/main/resources/application.yml

@@ -15,7 +15,6 @@ spring:
       enabled: always
   datasource:
     hikari:
-      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
       connection-test-query: SELECT 1 FROM DUAL
       minimumIdle: 5
       maximumPoolSize: 20
@@ -54,6 +53,8 @@ spring:
     hikari:
       driver-class-name: oracle.jdbc.OracleDriver
       jdbc-url: jdbc:oracle:thin:@115.91.94.42:1521:HANTE
+#      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
+#      jdbc-url: jdbc:log4jdbc:oracle:thin:@115.91.94.42:1521:HANTE
       username: DWUSER
       password: DWUSER
 

+ 21 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobMapper.xml

@@ -4,6 +4,27 @@
 <mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobMapper">
 
     <select id="findStatTime" resultType="com.utic.dwdb.server.dto.StatTimeDto">
+        SELECT TO_CHAR(currTime,  'YYYYMMDDHH24MISS') AS currTime,
+               TO_CHAR(past05Min, 'YYYYMMDDHH24MISS') AS past05Min,
+               TO_CHAR(past10Min, 'YYYYMMDDHH24MISS') AS past10Min,
+               TO_CHAR(past30Min, 'YYYYMMDDHH24MISS') AS past30Min,
+               TO_CHAR(prcs05Min, 'YYYYMMDDHH24MISS') AS prcs05Min,
+               TO_CHAR(prcs15Min, 'YYYYMMDDHH24MISS') AS prcs15Min,
+               TO_CHAR(prcs30Min, 'YYYYMMDDHH24MISS') AS prcs30Min,
+               TO_CHAR(prcsHour,  'YYYYMMDDHH24MISS') AS prcsHour,
+               TO_CHAR(prcsDay,   'YYYYMMDDHH24MISS') AS prcsDay
+        FROM (SELECT SYSDATE                                                                 AS currTime,
+                     SYSDATE -  5/1440                                                       AS past05Min,
+                     SYSDATE - 10/1440                                                       AS past10Min,
+                     SYSDATE - 30/1440                                                       AS past30Min,
+                     TRUNC(SYSDATE, 'HH24') + FLOOR(TO_CHAR(SYSDATE, 'MI') /  5) *  5 / 1440 AS prcs05Min,
+                     TRUNC(SYSDATE, 'HH24') + FLOOR(TO_CHAR(SYSDATE, 'MI') / 15) * 15 / 1440 AS prcs15Min,
+                     TRUNC(SYSDATE, 'HH24') + FLOOR(TO_CHAR(SYSDATE, 'MI') / 30) * 30 / 1440 AS prcs30Min,
+                     TRUNC(SYSDATE, 'HH24')                                                  AS prcsHour,
+                     TRUNC(SYSDATE - 1, 'DD')                                                AS prcsDay
+              FROM DUAL)
+    </select>
+    <select id="findStatTime_OLD" resultType="com.utic.dwdb.server.dto.StatTimeDto">
         SELECT TO_CHAR(SYSDATE,            'YYYYMMDDHH24MI') ||'00' AS currTime,
                TO_CHAR(SYSDATE -   5/1440, 'YYYYMMDDHH24MI') ||'00' AS past05Min,
                TO_CHAR(SYSDATE -  10/1440, 'YYYYMMDDHH24MI') ||'00' AS past10Min,

+ 95 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs01DMapper.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcs01DMapper">
+
+    <insert id="insertStatDayCenter" parameterType="java.lang.String">
+        INSERT INTO STAT_DAY_CENTER(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{prcsDay}, 1, 8), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_HOUR_CENTER
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{prcsDay}, 1, 10)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{prcsDay}, 1, 10)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatDay12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_DAY_12LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{prcsDay}, 1, 8), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_HOUR_12LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{prcsDay}, 1, 10)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{prcsDay}, 1, 10)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatDayExw" parameterType="java.lang.String">
+        INSERT INTO STAT_DAY_EXW(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{prcsDay}, 1, 8), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_HOUR_EXW
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{prcsDay}, 1, 10)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{prcsDay}, 1, 10)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatDayLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_DAY_LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{prcsDay}, 1, 8), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_HOUR_LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{prcsDay}, 1, 10)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{prcsDay}, 1, 10)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatDayObeLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_DAY_OBELOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{prcsDay}, 1, 8), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_HOUR_OBELOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{prcsDay}, 1, 10)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{prcsDay}, 1, 10)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertDmTrafficCenter" parameterType="java.lang.String">
+        INSERT INTO DM_TRAFFIC_INCIDENT(ANAL_TIME, ACCIDENT_ID, BLOCAL_ID, SLOCAL_ID, LINK_ID, SPEED, INCIDENT_CNT)
+        SELECT a1.ANAL_DAY, a1.ACCIDENT_CODE, b1.BLOCAL_ID, b1.SLOCAL_ID, a1.LINKID, c1.SPEED, a1.DATA_CNT
+        FROM (
+                 SELECT SUBSTR(LINKID, 1, 3) SLOCAL_ID, SUBSTR(#{pastStat01Hour}, 1, 10) ANAL_DAY,
+                        LTRIM(TO_CHAR(INCIDENTCODE, '000'))||LTRIM(TO_CHAR(INCIDENTSUBCODE, '000')) ACCIDENT_CODE,
+                        LINKID, COUNT(*) DATA_CNT
+                 FROM INCIDENT_CENTER
+                 WHERE STARTDATE <![CDATA[ <  ]]> TO_DATE(SUBSTR(#{pastStat01Hour}, 1, 12), 'YYYYMMDDHH24MI')
+                   AND ENDDATE   <![CDATA[ >= ]]> TO_DATE(SUBSTR(#{pastStat02Hour}, 1, 12), 'YYYYMMDDHH24MI')
+                 GROUP BY LTRIM(TO_CHAR(INCIDENTCODE, '000'))||LTRIM(TO_CHAR(INCIDENTSUBCODE, '000')), LINKID
+             ) a1,
+             (
+                 SELECT a.BLOCAL_ID, a.LOCAL_NAME,
+                        b.SLOCAL_ID, b.LOCAL_NAME
+                 FROM LOCAL_BIG a, LOCAL_AREA b
+                 WHERE A.BLOCAL_ID = B.BLOCAL_ID
+             ) b1, STAT_HOUR_CENTER c1
+        WHERE a1.SLOCAL_ID = b1.SLOCAL_ID
+          AND a1.ANAL_DAY = c1.STAT_DATE
+          AND a1.LINKID = c1.LINKID
+    </insert>
+
+    <insert id="insertDmCenterFilter" parameterType="java.lang.String">
+        INSERT INTO DM_CENTER_FILTER(ANAL_ID, CENTER_ID, LINK_FILTER_CNT,
+                                     LINKLEVEL_FILTER_CNT, ZERO_CNT, STD_CNT, STA_CNT, RGF_CNT)
+        SELECT TO_CHAR(TRUNC(SYSDATE-2), 'YYYYMMDD') AS ANAL_ID, CENTER_ID,
+               SUM(DECODE(LINK_FILTER_YN, 'Y', 1)) LINK_FILTER,
+               SUM(DECODE(LINKLEVEL_FILTER_YN, 'Y', 1)) LINKLEVEL_FILTER,
+               SUM(DECODE(ZERO_YN, 'Y', 1)) ZERO,
+               SUM(DECODE(STD_YN, 'Y', 1)) STD,
+               SUM(DECODE(STA_YN, 'Y', 1)) STA,
+               SUM(DECODE(RGF_YN, 'Y', 1)) RGF
+        FROM LINK_FILTER_LOG
+        WHERE LOCAL_DATE <![CDATA[ >= ]]> TO_CHAR(TRUNC(SYSDATE-2), 'YYYYMMDD') || '000000'
+          AND LOCAL_DATE <![CDATA[  < ]]> TO_CHAR(TRUNC(SYSDATE-1), 'YYYYMMDD') || '235959'
+        GROUP BY CENTER_ID
+    </insert>
+
+</mapper>

+ 79 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs01HMapper.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcs01HMapper">
+
+    <insert id="insertStatHourCenter" parameterType="java.lang.String">
+        INSERT INTO STAT_HOUR_CENTER(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat01Hour}, 1, 10), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_CENTER
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat01Hour}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat02Hour}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatHour12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_HOUR_12LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat01Hour}, 1, 10), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_12LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat01Hour}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat02Hour}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatHourExw" parameterType="java.lang.String">
+        INSERT INTO STAT_HOUR_EXW(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat01Hour}, 1, 10), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_EXW
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat01Hour}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat02Hour}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatHourLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_HOUR_LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat01Hour}, 1, 10), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat01Hour}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat02Hour}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStatHourObeLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_HOUR_OBELOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat01Hour}, 1, 10), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_OBELOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat01Hour}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat02Hour}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertDmTrafficCenter" parameterType="java.lang.String">
+        INSERT INTO DM_TRAFFIC_INCIDENT(ANAL_TIME, ACCIDENT_ID, BLOCAL_ID, SLOCAL_ID, LINK_ID, SPEED, INCIDENT_CNT)
+        SELECT a1.ANAL_DAY, a1.ACCIDENT_CODE, b1.BLOCAL_ID, b1.SLOCAL_ID, a1.LINKID, c1.SPEED, a1.DATA_CNT
+        FROM (
+                 SELECT SUBSTR(LINKID, 1, 3) SLOCAL_ID, SUBSTR(#{pastStat01Hour}, 1, 10) ANAL_DAY,
+                        LTRIM(TO_CHAR(INCIDENTCODE, '000'))||LTRIM(TO_CHAR(INCIDENTSUBCODE, '000')) ACCIDENT_CODE,
+                        LINKID, COUNT(*) DATA_CNT
+                 FROM INCIDENT_CENTER
+                 WHERE STARTDATE <![CDATA[ <  ]]> TO_DATE(SUBSTR(#{pastStat01Hour}, 1, 12), 'YYYYMMDDHH24MI')
+                   AND ENDDATE   <![CDATA[ >= ]]> TO_DATE(SUBSTR(#{pastStat02Hour}, 1, 12), 'YYYYMMDDHH24MI')
+                 GROUP BY LTRIM(TO_CHAR(INCIDENTCODE, '000'))||LTRIM(TO_CHAR(INCIDENTSUBCODE, '000')), LINKID
+             ) a1,
+             (
+                 SELECT a.BLOCAL_ID, a.LOCAL_NAME,
+                        b.SLOCAL_ID, b.LOCAL_NAME
+                 FROM LOCAL_BIG a, LOCAL_AREA b
+                 WHERE A.BLOCAL_ID = B.BLOCAL_ID
+             ) b1, STAT_HOUR_CENTER c1
+        WHERE a1.SLOCAL_ID = b1.SLOCAL_ID
+          AND a1.ANAL_DAY = c1.STAT_DATE
+          AND a1.LINKID = c1.LINKID
+    </insert>
+
+</mapper>

+ 15 - 110
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs05MMapper.xml

@@ -9,12 +9,12 @@
 
     <insert id="insertStatLocal12Loc" parameterType="java.lang.String">
         INSERT INTO STAT_LOCAL(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED)
-        SELECT REG_DATE, b.Center_ID, LINK_ID, 'L', AVG(SPEED)
+        SELECT a.REG_DATE, b.CENTER_ID, a.LINK_ID, 'L', AVG(a.SPEED)
         FROM CURLINKST a, CENTER b
-        WHERE REG_DATE <![CDATA[  > ]]> #{past30Min}
-          AND REG_DATE <![CDATA[ <= ]]> #{past25Min}
-        AND a.CenterId = B.ASN_CENTER_ID
-        GROUP BY b.Center_ID, REG_DATE, LINK_ID
+        WHERE a.REG_DATE <![CDATA[  > ]]> #{past30Min}
+          AND a.REG_DATE <![CDATA[ <= ]]> #{past25Min}
+        AND a.CENTERID = b.ASN_CENTER_ID
+        GROUP BY b.CENTER_ID, a.REG_DATE, a.LINK_ID
     </insert>
 
     <insert id="insertStatLocalCapital" parameterType="java.lang.String">
@@ -41,7 +41,7 @@
     <insert id="insertLinkFilter" parameterType="java.lang.String">
         INSERT INTO LINK_FILTER(LINKID, MAK_DATE, AVG_SPEED, DATA_CNT,
                                 STDV, STDV_HSPEED, STDV_LSPEED)
-        SELECT LINKID, #{past25Min}, AVGSPEED, DATACNT, STDSPEED,
+        SELECT LINKID, SUBSTR(#{past25Min}, 1, 14), AVGSPEED, DATACNT, STDSPEED,
                DECODE(#{codeValue0}, 'Y', AVGSPEED + STDSPEED * TO_NUMBER(#{codeValue5}), 200),
                DECODE(#{codeValue0}, 'Y', AVGSPEED - STDSPEED * TO_NUMBER(#{codeValue5}), 0)
         FROM (
@@ -55,25 +55,11 @@
              ) a
     </insert>
 
-    <select id="findHoliday" parameterType="java.lang.String" resultType="com.utic.dwdb.server.dto.HolidayDto">
-        SELECT SUM(WDAY) AS wDay, SUM(HCNT) AS hCnt
-        FROM (
-                 SELECT TO_NUMBER(TO_CHAR(TO_DATE(#{past25Min}, 'YYYYMMDDHH24MISS'), 'D')) AS WDAY,
-                        0 AS HCNT
-                 FROM DUAL
-                 UNION ALL
-                 SELECT 0 AS WDAY,
-                        COUNT(1) AS HCNT
-                 FROM HOLIDAY
-                 WHERE HOLIDAY = SUBSTR(#{past25Min}, 1, 8)
-             )
-    </select>
-
     <update id="updateLinkFilterPattern" parameterType="java.lang.String">
         UPDATE LINK_FILTER a
         SET (STAT_HSPEED, STAT_LSPEED) =
                 (
-                    SELECT SPEED + ${maxValue}, SPEED - ${minValue}
+                    SELECT SPEED + TO_NUMBER(${maxValue}), SPEED - TO_NUMBER(${minValue})
                     FROM ${fromTable}
                     WHERE PATN_TIME = SUBSTR(#{past25Min}, 9, 4)
                       AND a.LINKID = LINKID
@@ -127,7 +113,7 @@
 
     <insert id="insertCenterLog" parameterType="java.lang.String">
         INSERT INTO CENTER_LOG(EXE_DATE, CENTER_ID, LOG_DATE, DATA_CNT)
-        SELECT #{regDate}, CENTER_ID, SYSDATE, COUNT(1)
+        SELECT SUBSTR(#{regDate}, 1, 14), CENTER_ID, SYSDATE, COUNT(1)
         FROM (SELECT A.LINKID, C.CENTER_ID
               FROM (SELECT DISTINCT LINKID AS LINKID
                     FROM STAT_LOCAL) A,
@@ -144,7 +130,7 @@
     <insert id="insertUtisLog" parameterType="java.lang.String">
         INSERT INTO UTIS_LOG(EXE_DATE, CENTER_ID, LOG_DATE, DATA_CNT)
         SELECT /*+ INDEX(A PK_TRAFF5M_HIST) */
-            #{regDate},
+            SUBSTR(#{regDate}, 1, 14),
             A.CENTERID, SYSDATE, COUNT(1)
         FROM TRAFFIC5M_HIST A, LINK B
         WHERE A.REGDT BETWEEN TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS') - 299/86400
@@ -159,7 +145,7 @@
         SELECT SUBSTR(#{regDate}, 1, 12), C.CENTER_ID, A.MISSVALUEYN, DECODE(B.LANES, 1, 1, 2), COUNT(1)
         FROM TRAFFIC_CENTER_HIST A, LINK B, LOCAL_AREA C
         WHERE B.LINKLEVEL = '1'
-          AND A.REGDATE = TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS')
+          AND A.REGDATE = TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS')
           AND A.LINKID = B.LINKID
           AND SUBSTR(A.LINKID, 1, 3) = C.SLOCAL_ID
           AND C.CENTER_ID IS NOT NULL
@@ -169,7 +155,7 @@
     <insert id="insertFilterLog" parameterType="java.lang.String">
         INSERT INTO FILTER_LOG(EXE_DATE, CENTER_ID, LOG_DATE, LINK_FILTER_CNT, LINKLEVEL_FILTER_CNT, ZERO_CNT,
                                STD_YN, STD_CNT, STA_YN, STA_CNT, RGF_YN, RGF_CNT, RGF_USE_YN)
-        SELECT #{regDate}, CENTER_ID, SYSDATE,
+        SELECT SUBSTR(#{regDate}, 1, 14), CENTER_ID, SYSDATE,
                SUM(CNT_LINK), SUM(LEVEL_CNT), SUM(ZERO_CNT),
                #{codeValue0}, DECODE(#{codeValue0}, 'Y', SUM(CNT_STD), 0),
                #{codeValue1}, DECODE(#{codeValue1}, 'Y', SUM(CNT_STAT),0),
@@ -268,7 +254,7 @@
                a1.DAY_TYPE, a1.Speed, DataCnt,
                ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
         FROM (
-                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                 SELECT SUBSTR(#{regDate}, 1, 12) AS S_DATE,
                         a.LINKID,
                         TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
                         AVG(SPEED) Speed,
@@ -293,7 +279,7 @@
                a1.DAY_TYPE, a1.Speed, DataCnt,
                ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
         FROM (
-                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                 SELECT SUBSTR(#{regDate}, 1, 12) AS S_DATE,
                         a.LINKID,
                         TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
                         AVG(SPEED) Speed,
@@ -587,7 +573,7 @@
                a1.DAY_TYPE, a1.Speed, DataCnt,
                ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
         FROM (
-                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                 SELECT SUBSTR(#{regDate}, 1, 12) AS S_DATE,
                         a.LINKID,
                         TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
                         AVG(SPEED) Speed,
@@ -613,7 +599,7 @@
                a1.DAY_TYPE, a1.Speed, DataCnt,
                ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
         FROM (
-                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                 SELECT SUBSTR(#{regDate}, 1, 12) AS S_DATE,
                         a.LINKID,
                         TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
                         AVG(SPEED) Speed,
@@ -694,85 +680,4 @@
         GROUP BY A.LINKID
     </insert>
 
-
-
-    <insert id="insertPatternHist" parameterType="java.lang.String">
-        INSERT INTO ${targetTable}(PATN_DATE, PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL)
-        SELECT SUBSTR(#{regDate}, 1, 8), PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL
-        FROM ${fromTable}
-        WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)
-    </insert>
-
-    <update id="updatePattern" parameterType="java.lang.String">
-        UPDATE ${targetTable} a
-        SET (SPEED, LOG_DATE) =
-                (
-                    SELECT DECODE(a.SPEED, NULL, SPEED,
-                                  ( (a.SPEED * TO_NUMBER(#{minValue})) + ( SPEED * TO_NUMBER(#{maxValue}) ) ) / ( TO_NUMBER(#{minValue}) + TO_NUMBER(#{maxValue}) ) ),
-                           SYSDATE
-                    FROM STAT_5MIN_CENTER
-                    WHERE LINKID = a.LINKID
-                      AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
-                )
-        WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)
-          AND LINKID IN (SELECT LINKID
-                         FROM STAT_5MIN_CENTER
-                         WHERE STAT_DATE = SUBSTR(#{regDate}, 1, 12)
-                           AND LINKLEVEL IN ('1', '4')
-                           AND LINKID NOT IN
-                               (SELECT A.LINKID
-                                FROM INCIDENT_CENTER A
-                                WHERE TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >= ]]> A.STARTDATE
-                                  AND TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
-                                GROUP BY A.LINKID)
-        )
-    </update>
-
-    <update id="mergePatternWeekJob" parameterType="java.lang.String">
-        MERGE INTO PATN_WEEK_JOB NP
-            USING (SELECT B.LINKID, NVL(A.SPEED, 0) AS SPEED, SYSDATE AS LOG_DATE, A.LINKLEVEL
-                   FROM STAT_5MIN_CENTER A, LINK B
-                   WHERE A.STAT_DATE = SUBSTR(#{regDate}, 1, 12)
-                     AND B.LINKLEVEL IN ('1', '4')
-                     AND A.SPEED > 0 AND A.SPEED <![CDATA[ < ]]> 150
-                     AND A.LINKID(+) = B.LINKID
-                     AND A.LINKLEVEL = B.LINKLEVEL) MG
-            ON (NP.PATN_TIME = SUBSTR(#{regDate}, 9, 4) AND NP.LINKID = MG.LINKID)
-            WHEN MATCHED THEN
-                UPDATE SET NP.${columnName} = MG.SPEED
-            WHEN NOT MATCHED THEN
-                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED3, NP.SPEED4, NP.SPEED5, NP.LINKLEVEL)
-                VALUES (SUBSTR(#{regDate}, 9, 4), MG.LINKID, 0, 0, MG.SPEED, MG.LINKLEVEL)
-    </update>
-
-    <update id="updatePatternWeekJob" parameterType="java.lang.String">
-        UPDATE PATN_WEEK_JOB A
-        SET A.${columnName} = 0
-        WHERE A.PATN_TIME = SUBSTR(#{regDate}, 9, 4)
-          AND A.LINKID IN (
-            SELECT A.LINKID
-            FROM INCIDENT_CENTER A
-            WHERE TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >=]]>  A.STARTDATE
-              AND TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
-            GROUP BY A.LINKID)
-    </update>
-
-    <update id="mergePatternWeek" parameterType="java.lang.String">
-        MERGE INTO PATN_WEEK NP
-            USING (SELECT LINKID, LINKLEVEL,
-                          (SPEED3+SPEED4+SPEED5)/(DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) AS AVGSPEED
-                   FROM PATN_WEEK_JOB
-                   WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)SUBSTR(#{regDate}, 9, 4)
-                     AND (DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) > 0
-                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ > ]]> 0
-                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ < ]]> 450) MG
-            ON (NP.PATN_TIME = SUBSTR(#{regDate}, 9, 4) AND NP.LINKID = MG.LINKID)
-            WHEN MATCHED THEN
-                UPDATE SET NP.SPEED    = DECODE(NP.SPEED, NULL, MG.AVGSPEED, ((NP.SPEED*TO_NUMBER(#{minValue})+MG.AVGSPEED*TO_NUMBER(#{maxValue}))/(TO_NUMBER(#{minValue})+TO_NUMBER(#{maxValue})))),
-                    NP.LOG_DATE = SYSDATE
-            WHEN NOT MATCHED THEN
-                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED,    NP.LOG_DATE, NP.LINKLEVEL)
-                VALUES (SUBSTR(#{regDate}, 9, 4), MG.LINKID, MG.AVGSPEED, SYSDATE, MG.LINKLEVEL)
-    </update>
-
 </mapper>

+ 67 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs15MMapper.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcs15MMapper">
+
+    <insert id="insertStat15MinCenter" parameterType="java.lang.String">
+        INSERT INTO STAT_15MIN_CENTER(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_CENTER
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat45Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat15Min12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_15MIN_12LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_12LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat45Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat15MinExw" parameterType="java.lang.String">
+        INSERT INTO STAT_15MIN_EXW(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_EXW
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat45Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat15MinLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_15MIN_LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat45Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat15MinObeLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_15MIN_OBELOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_OBELOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat45Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+
+    <insert id="insertTraffic15mHist" parameterType="java.lang.String">
+        INSERT INTO TRAFFIC15M_HIST(REGDT, LINKID, LINKLEVEL, TRVTM, SPD, DATACNT, CENTERID)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MAX(LINKLEVEL),
+        ROUND(AVG(TRVTM)), ROUND(AVG(SPD)), SUM(DATACNT), CENTERID
+        FROM TRAFFIC5M_HIST
+        WHERE REGDT <![CDATA[ <= ]]> TO_DATE(SUBSTR(#{pastStat30Min}, 1, 12), 'YYYYMMDDHH24MI')
+          AND REGDT <![CDATA[  > ]]> TO_DATE(SUBSTR(#{pastStat45Min}, 1, 12), 'YYYYMMDDHH24MI')
+        GROUP BY LINKID, CENTERID
+    </insert>
+
+</mapper>

+ 56 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs30MMapper.xml

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcs30MMapper">
+
+    <insert id="insertStat30MinCenter" parameterType="java.lang.String">
+        INSERT INTO STAT_30MIN_CENTER(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+               ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_CENTER
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat60Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat30Min12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_30MIN_12LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_12LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat60Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat30MinExw" parameterType="java.lang.String">
+        INSERT INTO STAT_30MIN_EXW(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_EXW
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat60Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat30MinLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_30MIN_LOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_LOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat60Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+    <insert id="insertStat30MinObeLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_30MIN_OBELOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{pastStat30Min}, 1, 12), LINKID, MIN(LINKLEVEL), MIN(DAY_TYPE),
+        ROUND(AVG(SPEED)), ROUND(AVG(TRAVEL_TIME)), SUM(DATA_CNT)
+        FROM STAT_5MIN_OBELOC
+        WHERE STAT_DATE <![CDATA[ <= ]]> SUBSTR(#{pastStat30Min}, 1, 12)
+          AND STAT_DATE <![CDATA[  > ]]> SUBSTR(#{pastStat60Min}, 1, 12)
+        GROUP BY LINKID
+    </insert>
+
+</mapper>

+ 136 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcsMonthMapper.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcsMonthMapper">
+
+    <insert id="insertStatDayCenter" parameterType="java.lang.String">
+        MERGE INTO STAT_MON_CENTER NP
+            USING (SELECT SUBSTR(STAT_DATE, 1, 6) AS STAT_DATE,
+                          LINKID                  AS LINKID,
+                          MIN(LINKLEVEL)          AS LINKLEVEL,
+                          MIN(DAY_TYPE)           AS DAY_TYPE,
+                          ROUND(AVG(SPEED))       AS SPEED,
+                          ROUND(AVG(TRAVEL_TIME)) AS TRAVEL_TIME,
+                          SUM(DATA_CNT)           AS DATA_CNT
+                   FROM STAT_HOUR_CENTER
+                   WHERE STAT_DATE BETWEEN TO_CHAR(TRUNC(SYSDATE - 1, 'MM'), 'YYYYMMDD') || '00'
+                             AND TO_CHAR(TRUNC(LAST_DAY(SYSDATE - 1)),'YYYYMMDD') || '23'
+                   GROUP BY SUBSTR(STAT_DATE, 1, 6), LINKID) MG
+            ON (NP.STAT_DATE = MG.STAT_DATE AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LINKLEVEL   = MG.LINKLEVEL,
+                    NP.DAY_TYPE    = MG.DAY_TYPE,
+                    NP.SPEED       = MG.SPEED,
+                    NP.TRAVEL_TIME = MG.TRAVEL_TIME,
+                    NP.DATA_CNT    = MG.DATA_CNT
+            WHEN NOT MATCHED THEN
+                INSERT (   STAT_DATE,    LINKID,    LINKLEVEL,    DAY_TYPE,    SPEED,    TRAVEL_TIME,    DATA_CNT)
+                VALUES (MG.STAT_DATE, MG.LINKID, MG.LINKLEVEL, MG.DAY_TYPE, MG.SPEED, MG.TRAVEL_TIME, MG.DATA_CNT)
+    </insert>
+
+    <insert id="insertStatDay12Loc" parameterType="java.lang.String">
+        MERGE INTO STAT_MON_12LOC NP
+            USING (SELECT SUBSTR(STAT_DATE, 1, 6) AS STAT_DATE,
+                          LINKID                  AS LINKID,
+                          MIN(LINKLEVEL)          AS LINKLEVEL,
+                          MIN(DAY_TYPE)           AS DAY_TYPE,
+                          ROUND(AVG(SPEED))       AS SPEED,
+                          ROUND(AVG(TRAVEL_TIME)) AS TRAVEL_TIME,
+                          SUM(DATA_CNT)           AS DATA_CNT
+                   FROM STAT_HOUR_12LOC
+                   WHERE STAT_DATE BETWEEN TO_CHAR(TRUNC(SYSDATE - 1, 'MM'), 'YYYYMMDD') || '00'
+                             AND TO_CHAR(TRUNC(LAST_DAY(SYSDATE - 1)),'YYYYMMDD') || '23'
+                   GROUP BY SUBSTR(STAT_DATE, 1, 6), LINKID) MG
+            ON (NP.STAT_DATE = MG.STAT_DATE AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LINKLEVEL   = MG.LINKLEVEL,
+                    NP.DAY_TYPE    = MG.DAY_TYPE,
+                    NP.SPEED       = MG.SPEED,
+                    NP.TRAVEL_TIME = MG.TRAVEL_TIME,
+                    NP.DATA_CNT    = MG.DATA_CNT
+            WHEN NOT MATCHED THEN
+                INSERT (   STAT_DATE,    LINKID,    LINKLEVEL,    DAY_TYPE,    SPEED,    TRAVEL_TIME,    DATA_CNT)
+                VALUES (MG.STAT_DATE, MG.LINKID, MG.LINKLEVEL, MG.DAY_TYPE, MG.SPEED, MG.TRAVEL_TIME, MG.DATA_CNT)
+    </insert>
+
+    <insert id="insertStatDayExw" parameterType="java.lang.String">
+        MERGE INTO STAT_MON_EXW NP
+            USING (SELECT SUBSTR(STAT_DATE, 1, 6) AS STAT_DATE,
+                          LINKID                  AS LINKID,
+                          MIN(LINKLEVEL)          AS LINKLEVEL,
+                          MIN(DAY_TYPE)           AS DAY_TYPE,
+                          ROUND(AVG(SPEED))       AS SPEED,
+                          ROUND(AVG(TRAVEL_TIME)) AS TRAVEL_TIME,
+                          SUM(DATA_CNT)           AS DATA_CNT
+                   FROM STAT_HOUR_EXW
+                   WHERE STAT_DATE BETWEEN TO_CHAR(TRUNC(SYSDATE - 1, 'MM'), 'YYYYMMDD') || '00'
+                             AND TO_CHAR(TRUNC(LAST_DAY(SYSDATE - 1)),'YYYYMMDD') || '23'
+                   GROUP BY SUBSTR(STAT_DATE, 1, 6), LINKID) MG
+            ON (NP.STAT_DATE = MG.STAT_DATE AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LINKLEVEL   = MG.LINKLEVEL,
+                    NP.DAY_TYPE    = MG.DAY_TYPE,
+                    NP.SPEED       = MG.SPEED,
+                    NP.TRAVEL_TIME = MG.TRAVEL_TIME,
+                    NP.DATA_CNT    = MG.DATA_CNT
+            WHEN NOT MATCHED THEN
+                INSERT (   STAT_DATE,    LINKID,    LINKLEVEL,    DAY_TYPE,    SPEED,    TRAVEL_TIME,    DATA_CNT)
+                VALUES (MG.STAT_DATE, MG.LINKID, MG.LINKLEVEL, MG.DAY_TYPE, MG.SPEED, MG.TRAVEL_TIME, MG.DATA_CNT)
+    </insert>
+
+    <insert id="insertStatDayLoc" parameterType="java.lang.String">
+        MERGE INTO STAT_MON_LOC NP
+            USING (SELECT SUBSTR(STAT_DATE, 1, 6) AS STAT_DATE,
+                          LINKID                  AS LINKID,
+                          MIN(LINKLEVEL)          AS LINKLEVEL,
+                          MIN(DAY_TYPE)           AS DAY_TYPE,
+                          ROUND(AVG(SPEED))       AS SPEED,
+                          ROUND(AVG(TRAVEL_TIME)) AS TRAVEL_TIME,
+                          SUM(DATA_CNT)           AS DATA_CNT
+                   FROM STAT_HOUR_LOC
+                   WHERE STAT_DATE BETWEEN TO_CHAR(TRUNC(SYSDATE - 1, 'MM'), 'YYYYMMDD') || '00'
+                             AND TO_CHAR(TRUNC(LAST_DAY(SYSDATE - 1)),'YYYYMMDD') || '23'
+                   GROUP BY SUBSTR(STAT_DATE, 1, 6), LINKID) MG
+            ON (NP.STAT_DATE = MG.STAT_DATE AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LINKLEVEL   = MG.LINKLEVEL,
+                    NP.DAY_TYPE    = MG.DAY_TYPE,
+                    NP.SPEED       = MG.SPEED,
+                    NP.TRAVEL_TIME = MG.TRAVEL_TIME,
+                    NP.DATA_CNT    = MG.DATA_CNT
+            WHEN NOT MATCHED THEN
+                INSERT (   STAT_DATE,    LINKID,    LINKLEVEL,    DAY_TYPE,    SPEED,    TRAVEL_TIME,    DATA_CNT)
+                VALUES (MG.STAT_DATE, MG.LINKID, MG.LINKLEVEL, MG.DAY_TYPE, MG.SPEED, MG.TRAVEL_TIME, MG.DATA_CNT)
+    </insert>
+
+    <insert id="insertStatDayObeLoc" parameterType="java.lang.String">
+        MERGE INTO STAT_MON_OBELOC NP
+            USING (SELECT SUBSTR(STAT_DATE, 1, 6) AS STAT_DATE,
+                          LINKID                  AS LINKID,
+                          MIN(LINKLEVEL)          AS LINKLEVEL,
+                          MIN(DAY_TYPE)           AS DAY_TYPE,
+                          ROUND(AVG(SPEED))       AS SPEED,
+                          ROUND(AVG(TRAVEL_TIME)) AS TRAVEL_TIME,
+                          SUM(DATA_CNT)           AS DATA_CNT
+                   FROM STAT_HOUR_OBELOC
+                   WHERE STAT_DATE BETWEEN TO_CHAR(TRUNC(SYSDATE - 1, 'MM'), 'YYYYMMDD') || '00'
+                             AND TO_CHAR(TRUNC(LAST_DAY(SYSDATE - 1)),'YYYYMMDD') || '23'
+                   GROUP BY SUBSTR(STAT_DATE, 1, 6), LINKID) MG
+            ON (NP.STAT_DATE = MG.STAT_DATE AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LINKLEVEL   = MG.LINKLEVEL,
+                    NP.DAY_TYPE    = MG.DAY_TYPE,
+                    NP.SPEED       = MG.SPEED,
+                    NP.TRAVEL_TIME = MG.TRAVEL_TIME,
+                    NP.DATA_CNT    = MG.DATA_CNT
+            WHEN NOT MATCHED THEN
+                INSERT (   STAT_DATE,    LINKID,    LINKLEVEL,    DAY_TYPE,    SPEED,    TRAVEL_TIME,    DATA_CNT)
+                VALUES (MG.STAT_DATE, MG.LINKID, MG.LINKLEVEL, MG.DAY_TYPE, MG.SPEED, MG.TRAVEL_TIME, MG.DATA_CNT)
+    </insert>
+
+</mapper>

+ 148 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcsPatternMapper.xml

@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.utic.dwdb.server.dao.mapper.DwdbJobPrcsPatternMapper">
+
+    <select id="findHoliday" parameterType="java.lang.String" resultType="com.utic.dwdb.server.dto.HolidayDto">
+        SELECT SUM(WDAY) AS wDay, SUM(HCNT) AS hCnt
+        FROM (
+                 SELECT TO_NUMBER(TO_CHAR(TO_DATE(#{past25Min}, 'YYYYMMDDHH24MISS'), 'D')) AS WDAY,
+                        0 AS HCNT
+                 FROM DUAL
+                 UNION ALL
+                 SELECT 0 AS WDAY,
+                        COUNT(1) AS HCNT
+                 FROM HOLIDAY
+                 WHERE HOLIDAY = SUBSTR(#{past25Min}, 1, 8)
+             )
+    </select>
+
+    <insert id="insertPatternHist" parameterType="java.lang.String">
+        INSERT INTO ${targetTable}(PATN_DATE, PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL)
+        SELECT SUBSTR(#{patternTime}, 1, 8), PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL
+        FROM ${fromTable}
+        WHERE PATN_TIME = SUBSTR(#{patternTime}, 9, 4)
+    </insert>
+
+    <update id="updatePattern" parameterType="java.lang.String">
+        MERGE INTO ${targetTable} NP
+            USING (SELECT A.LINKID, A.SPEED, SYSDATE AS LOG_DATE, A.LINKLEVEL
+                   FROM ${statTable} A, LINK B
+                   WHERE A.STAT_DATE = SUBSTR(#{patternTime}, 1, 12)
+                     AND A.LINKLEVEL IN ('1', '4')
+                     AND A.SPEED > 0 AND A.SPEED <![CDATA[ < ]]> 150
+                     AND A.LINKID = B.LINKID
+                     AND A.LINKLEVEL = B.LINKLEVEL
+                     AND A.LINKID NOT IN
+                         (SELECT A.LINKID
+                          FROM INCIDENT_CENTER A
+                          WHERE TO_DATE(SUBSTR(#{patternTime}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >= ]]> A.STARTDATE
+                            AND TO_DATE(SUBSTR(#{patternTime}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
+                          GROUP BY A.LINKID) ) MG
+            ON (NP.PATN_TIME =  SUBSTR(#{patternTime}, 9, 4) AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.SPEED = DECODE(NP.SPEED, NULL, MG.SPEED, ((NP.SPEED * TO_NUMBER(#{minValue}) + MG.SPEED * TO_NUMBER(#{maxValue}) )/( TO_NUMBER(#{minValue}) + TO_NUMBER(#{maxValue}) ))),
+                    NP.LOG_DATE = MG.LOG_DATE
+            WHEN NOT MATCHED THEN
+                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED, NP.LOG_DATE, NP.LINKLEVEL)
+                    VALUES (SUBSTR(#{patternTime}, 9, 4), MG.LINKID, MG.SPEED, MG.LOG_DATE, MG.LINKLEVEL)
+    </update>
+
+    <update id="mergePatternWeekJob" parameterType="java.lang.String">
+        MERGE INTO ${targetTable} NP
+            USING (SELECT B.LINKID, NVL(A.SPEED, 0) AS SPEED, SYSDATE AS LOG_DATE, A.LINKLEVEL
+                   FROM ${statTable} A, LINK B
+                   WHERE A.STAT_DATE = SUBSTR(#{patternTime}, 1, 12)
+                     AND B.LINKLEVEL IN ('1', '4')
+                     AND A.SPEED > 0 AND A.SPEED <![CDATA[ < ]]> 150
+                     AND A.LINKID(+) = B.LINKID
+                     AND A.LINKLEVEL = B.LINKLEVEL) MG
+            ON (NP.PATN_TIME = SUBSTR(#{patternTime}, 9, 4) AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET NP.${columnName} = MG.SPEED
+            WHEN NOT MATCHED THEN
+                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED3, NP.SPEED4, NP.SPEED5, NP.LINKLEVEL)
+                    VALUES (SUBSTR(#{patternTime}, 9, 4), MG.LINKID, 0, 0, MG.SPEED, MG.LINKLEVEL)
+    </update>
+
+    <update id="updateIncidentPatternWeekJob" parameterType="java.lang.String">
+        UPDATE ${tableName} A
+        SET A.${columnName} = 0
+        WHERE A.PATN_TIME = SUBSTR(#{patternTime}, 9, 4)
+          AND A.LINKID IN (
+            SELECT A.LINKID
+            FROM INCIDENT_CENTER A
+            WHERE TO_DATE(SUBSTR(#{patternTime}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >=]]>  A.STARTDATE
+              AND TO_DATE(SUBSTR(#{patternTime}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
+            GROUP BY A.LINKID)
+    </update>
+
+    <update id="mergePatternWeek" parameterType="java.lang.String">
+        MERGE INTO ${targetTable} NP
+            USING (SELECT LINKID, LINKLEVEL,
+                          (SPEED3+SPEED4+SPEED5)/(DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) AS AVGSPEED
+                   FROM ${jobTable}
+                   WHERE PATN_TIME = SUBSTR(#{patternTime}, 9, 4)SUBSTR(#{patternTime}, 9, 4)
+                     AND (DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) > 0
+                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ > ]]> 0
+                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ < ]]> 450) MG
+            ON (NP.PATN_TIME = SUBSTR(#{patternTime}, 9, 4) AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.SPEED = DECODE(NP.SPEED, NULL, MG.AVGSPEED, ((NP.SPEED*TO_NUMBER(#{minValue})+MG.AVGSPEED*TO_NUMBER(#{maxValue}))/(TO_NUMBER(#{minValue})+TO_NUMBER(#{maxValue})))),
+                    NP.LOG_DATE = SYSDATE
+            WHEN NOT MATCHED THEN
+                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED,    NP.LOG_DATE, NP.LINKLEVEL)
+                VALUES (SUBSTR(#{patternTime}, 9, 4), MG.LINKID, MG.AVGSPEED, SYSDATE, MG.LINKLEVEL)
+    </update>
+
+    <select id="findPatternDay" parameterType="java.lang.String" resultType="com.utic.dwdb.server.dto.PatternDto">
+        SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') AS exeDay,
+               TO_NUMBER(TO_CHAR(SYSDATE, 'D')) AS weekDay
+        FROM DUAL
+    </select>
+
+    <select id="findPatternJobLog" parameterType="java.lang.String" resultType="com.utic.dwdb.server.dto.PatternJobDto">
+        SELECT COUNT(1) AS jobCount
+        FROM PATN_JOB_LOG
+        WHERE PATN_TYPE = #{patternType}
+          AND EXE_DAY   = #{exeDay}
+    </select>
+
+    <insert id="insertPatternJobLog" parameterType="java.lang.String">
+        INSERT INTO PATN_JOB_LOG (PATN_TYPE, EXE_DAY, START_DATE, END_DATE)
+        VALUES (#{patternType}, #{exeDay}, SYSDATE, NULL)
+    </insert>
+
+    <update id="updatePatternJobLog" parameterType="java.lang.String">
+        UPDATE PATN_JOB_LOG SET END_DATE = SYSDATE
+        WHERE PATN_TYPE = #{patternType}
+          AND EXE_DAY   = #{exeDay}
+    </update>
+
+    <delete id="deletePatternWeekJob">
+        TRUNCATE TABLE PATN_WEEK_JOB
+    </delete>
+
+    <delete id="deletePattern15MinWeekJob">
+        TRUNCATE TABLE PATN_15MIN_WEEK_JOB
+    </delete>
+
+    <update id="updatePatternWeekJob" parameterType="java.lang.String">
+        UPDATE PATN_WEEK_JOB
+        SET SPEED3 = 0,
+            SPEED4 = 0,
+            SPEED5 = 0
+        WHERE PATN_TIME = #{patternTime}
+    </update>
+
+    <update id="updatePattern15minWeekJob" parameterType="java.lang.String">
+        UPDATE PATN_15MIN_WEEK_JOB
+        SET SPEED3 = 0,
+            SPEED4 = 0,
+            SPEED5 = 0
+        WHERE PATN_TIME = #{patternTime}
+    </update>
+
+</mapper>