junggilpark пре 1 година
родитељ
комит
b5c3fbf496

+ 21 - 9
src/main/java/com/its/web/controller/statistics/StatisticsController.java

@@ -7,10 +7,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -24,13 +21,28 @@ public class StatisticsController {
 
     private final StatisticsService service;
 
-    @ApiOperation(value = "교통량 통계 조회(TB_ROAD_HH_STAT, TB_ROAD_DD_STAT)", response = TrafficStatisticsDto.TrafficStatisticsDtoReq.class, responseContainer = "ArrayList")
-    @PostMapping(value = "/amount", produces = {"application/json; charset=utf8"})
+    @ApiOperation(value = "01.교통량 통계 조회", response = TrafficStatisticsDto.TrafficStatisticsDtoReq.class, responseContainer = "ArrayList")
+    @PostMapping(value = "/amount/{searchType}", produces = {"application/json; charset=utf8"})
     @ResponseBody
-    public List<TrafficStatisticsDto> findAllTrafficAmountStatistics(
-            @Valid final TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo) {
+    public List<TrafficStatisticsDto> findStatisticsTrafficAmount(@Valid final TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo,
+                                                                     @PathVariable String searchType) {
+        return service.findStatisticsTrafficAmount(paramInfo, searchType);
+    }
 
-        return service.findAllTrafficAmountStatistics(paramInfo);
+    @ApiOperation(value = "02.소통 통계 조회-01.속도통계", response = TrafficStatisticsDto.TrafficStatisticsDtoReq.class, responseContainer = "ArrayList")
+    @PostMapping(value = "/speed/{searchType}", produces = {"application/json; charset=utf8"})
+    @ResponseBody
+    public List<TrafficStatisticsDto> findStatisticsCommSpeed(@Valid final TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo,
+                                                              @PathVariable String searchType) {
+        return service.findStatisticsCommSpeed(paramInfo, searchType);
+    }
+
+    @ApiOperation(value = "02.소통 통계 조회-02.지/정체통계", response = TrafficStatisticsDto.TrafficStatisticsDtoReq.class, responseContainer = "ArrayList")
+    @PostMapping(value = "/grade/{searchType}", produces = {"application/json; charset=utf8"})
+    @ResponseBody
+    public List<TrafficStatisticsDto> findStatisticsCommGrad(@Valid final TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo,
+                                                             @PathVariable String searchType) {
+        return service.findStatisticsCommGrade(paramInfo, searchType);
     }
 
 }

+ 1 - 0
src/main/java/com/its/web/controller/view/ViewController.java

@@ -91,6 +91,7 @@ public class ViewController {
     public String trafficStatisticsSpeed(Model model) {
         model.addAttribute("selected", "statistics");
         model.addAttribute("active", "traffic02");
+        model.addAttribute("road", trafficService.findAtrdNameList());
         return "statistics/tfvl-stat-speed";
     }
 

+ 149 - 18
src/main/java/com/its/web/dto/statistics/TrafficStatisticsDto.java

@@ -13,21 +13,145 @@ import javax.validation.constraints.NotNull;
 @ApiModel("TrafficStatisticsDto(교통량 분석 DTO)")
 public class TrafficStatisticsDto {
 
-    @ApiModelProperty("도로 ID")
-    @JsonProperty("road_id")
-    private Long roadId;
+    @ApiModelProperty("도로")
+    @JsonProperty("road_name")
+    private String roadName;
 
-    @ApiModelProperty("구간")
-    @JsonProperty("sect_nm")
-    private String sectNm;
+    @ApiModelProperty("시작 구간")
+    @JsonProperty("strt_name")
+    private String strtName;
 
-    @ApiModelProperty("조회 시간/일")
-    @JsonProperty("stat_dt")
-    private String statDt;
+    @ApiModelProperty("종료 구간명")
+    @JsonProperty("end_name")
+    private String endName;
 
-    @ApiModelProperty("교통량 합계")
-    @JsonProperty("tfvl_tot")
-    private String tfvlTot;
+    @ApiModelProperty("시간/일(1)")
+    @JsonProperty("t00")
+    private String t00;
+
+    @ApiModelProperty("시간/일(1)")
+    @JsonProperty("t01")
+    private String t01;
+
+    @ApiModelProperty("시간/일(2)")
+    @JsonProperty("t02")
+    private String t02;
+
+    @ApiModelProperty("시간/일(3)")
+    @JsonProperty("t03")
+    private String t03;
+
+    @ApiModelProperty("시간/일(4)")
+    @JsonProperty("t04")
+    private String t04;
+
+    @ApiModelProperty("시간/일(5)")
+    @JsonProperty("t05")
+    private String t05;
+
+    @ApiModelProperty("시간/일(6)")
+    @JsonProperty("t06")
+    private String t06;
+
+    @ApiModelProperty("시간/일(7)")
+    @JsonProperty("t07")
+    private String t07;
+
+    @ApiModelProperty("시간/일(8)")
+    @JsonProperty("t08")
+    private String t08;
+
+    @ApiModelProperty("시간/일(9)")
+    @JsonProperty("t09")
+    private String t09;
+
+    @ApiModelProperty("시간/일(10)")
+    @JsonProperty("t10")
+    private String t10;
+
+    @ApiModelProperty("시간/일(11)")
+    @JsonProperty("t11")
+    private String t11;
+
+    @ApiModelProperty("시간/일(12)")
+    @JsonProperty("t12")
+    private String t12;
+
+    @ApiModelProperty("시간/일(13)")
+    @JsonProperty("t13")
+    private String t13;
+
+    @ApiModelProperty("시간/일(14)")
+    @JsonProperty("t14")
+    private String t14;
+
+    @ApiModelProperty("시간/일(15)")
+    @JsonProperty("t15")
+    private String t15;
+
+    @ApiModelProperty("시간/일(16)")
+    @JsonProperty("t16")
+    private String t16;
+
+    @ApiModelProperty("시간/일(17)")
+    @JsonProperty("t17")
+    private String t17;
+
+    @ApiModelProperty("시간/일(18)")
+    @JsonProperty("t18")
+    private String t18;
+
+    @ApiModelProperty("시간/일(19)")
+    @JsonProperty("t19")
+    private String t19;
+
+    @ApiModelProperty("시간/일(20)")
+    @JsonProperty("t20")
+    private String t20;
+
+    @ApiModelProperty("시간/일(21)")
+    @JsonProperty("t21")
+    private String t21;
+
+    @ApiModelProperty("시간/일(22)")
+    @JsonProperty("t22")
+    private String t22;
+
+    @ApiModelProperty("시간/일(23)")
+    @JsonProperty("t23")
+    private String t23;
+
+    @ApiModelProperty("시간/일(24)")
+    @JsonProperty("t24")
+    private String t24;
+
+    @ApiModelProperty("시간/일(25)")
+    @JsonProperty("t25")
+    private String t25;
+
+    @ApiModelProperty("시간/일(26)")
+    @JsonProperty("t26")
+    private String t26;
+
+    @ApiModelProperty("시간/일(27)")
+    @JsonProperty("t27")
+    private String t27;
+
+    @ApiModelProperty("시간/일(28)")
+    @JsonProperty("t28")
+    private String t28;
+
+    @ApiModelProperty("시간/일(29)")
+    @JsonProperty("t29")
+    private String t29;
+
+    @ApiModelProperty("시간/일(30)")
+    @JsonProperty("t30")
+    private String t30;
+
+    @ApiModelProperty("시간/일(31)")
+    @JsonProperty("t31")
+    private String t31;
 
     @ApiModel("TrafficStatisticsDtoReq(교통량 파리미터)")
     @Getter
@@ -35,16 +159,23 @@ public class TrafficStatisticsDto {
     @ToString
     @NoArgsConstructor
     public static class TrafficStatisticsDtoReq {
-        @ApiModelProperty("검색일, Nullable = N")
-        @JsonProperty("stat_dt")
+        @ApiModelProperty("검색 시작일, Nullable = N")
+        @JsonProperty("FROM_DT")
         @NotNull
-        private String statDt;
+        private String fromDt;
 
-        @ApiModelProperty("검색 타입, Nullable = N")
-        @JsonProperty("search_type")
+        @ApiModelProperty("검색 종료일, Nullable = N")
+        @JsonProperty("TO_DT")
         @NotNull
-        private String searchType;
+        private String toDt;
+
+        @ApiModelProperty("도로번호, Nullable = Y")
+        @JsonProperty("ROAD_NMBR")
+        private String roadNmbr;
 
+        @ApiModelProperty("도로명, Nullable = Y")
+        @JsonProperty("ATRD_NM")
+        private String atrdNm;
     }
 
 }

+ 2 - 6
src/main/java/com/its/web/dto/traffic/VertexDto.java

@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
-import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
 
 @Data
 @NoArgsConstructor
@@ -81,27 +81,23 @@ public class VertexDto {
     public static class VertexDtoReq {
         @ApiModelProperty("도로 레벨")
         @JsonProperty("levl")
-        @NotNull
+        @Positive
         private Integer levl;
 
         @ApiModelProperty("X좌표 최대값")
         @JsonProperty("swLat")
-        @NotNull
         private Double swLat;
 
         @ApiModelProperty("X좌표 최소값")
         @JsonProperty("neLat")
-        @NotNull
         private Double neLat;
 
         @ApiModelProperty("Y좌표 최대값")
         @JsonProperty("swLng")
-        @NotNull
         private Double swLng;
 
         @ApiModelProperty("Y좌표 최소값")
         @JsonProperty("neLng")
-        @NotNull
         private Double neLng;
     }
 }

+ 6 - 0
src/main/java/com/its/web/mapper/itcs/IntersectionMapper.java

@@ -1,12 +1,14 @@
 package com.its.web.mapper.itcs;
 
 import com.its.web.dto.statistics.DaeroMngmDto;
+import com.its.web.dto.statistics.TrafficStatisticsDto;
 import com.its.web.dto.traffic.IntersectionCameraDto;
 import com.its.web.dto.traffic.IntersectionDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.springframework.context.annotation.Profile;
 
 import java.util.List;
+import java.util.Map;
 
 @Profile("itcs")
 @Mapper
@@ -16,4 +18,8 @@ public interface IntersectionMapper {
     List<IntersectionCameraDto> findAllIntersectionDetail();
 
     List<DaeroMngmDto> findIntersectionAtrdName();
+
+    List<TrafficStatisticsDto> findStatisticsTrafficAmountByMonth(Map<String, Object> paramMap);
+
+    List<TrafficStatisticsDto> findStatisticsTrafficAmountByDays(Map<String, Object> paramMap);
 }

+ 7 - 1
src/main/java/com/its/web/mapper/its/statistics/StatisticsMapper.java

@@ -8,6 +8,12 @@ import java.util.Map;
 
 @Mapper
 public interface StatisticsMapper {
-    List<TrafficStatisticsDto> findAllTrafficAmountStatistics(Map<String, String> paramMap);
+    List<TrafficStatisticsDto> findStatisticsCommSpeedMonth(Map<String, String> paramMap);
+
+    List<TrafficStatisticsDto> findStatisticsCommSpeedDay(Map<String, String> paramMap);
+
+    List<TrafficStatisticsDto> findStatisticsCommGradeMonth(Map<String, String> paramMap);
+
+    List<TrafficStatisticsDto> findStatisticsCommGradeDay(Map<String, String> paramMap);
 }
 

+ 2 - 0
src/main/java/com/its/web/mapper/its/traffic/TrafficMapper.java

@@ -30,6 +30,8 @@ public interface TrafficMapper {
 
     List<TbAtrdDto> findAllAtrd();
 
+    List<TbAtrdDto> findAtrdNameList();
+
     List<TbAtrdDto> findAtrdRoadVertexByIdAndLevel(Map<String, Object> paramMap);
 
     List<TbAtrdDto> findAtrdIfscVertexByIdAndLevel(Map<String, Object> paramMap);

+ 60 - 21
src/main/java/com/its/web/service/statistics/StatisticsService.java

@@ -8,7 +8,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.Calendar;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -21,31 +21,70 @@ public class StatisticsService {
     private final StatisticsMapper mapper;
     private final IntersectionMapper ixrMapper;
 
-    public List<TrafficStatisticsDto> findAllTrafficAmountStatistics(TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo) {
-        Map<String, String> paramMap = new HashMap<>();
-        String statDt     = paramInfo.getStatDt();
-        String searchType = paramInfo.getSearchType();
-        String fromDt     = "000000";
-        String toDt       = "235959";
-
-        if (statDt != null && searchType.equals("mn")) {
-            fromDt =  "01" + fromDt;
-            Calendar cal = Calendar.getInstance();
-            cal.set(Integer.parseInt(statDt.substring(0,4)), (Integer.parseInt(statDt.substring(4,6)) - 1), 1);
-            toDt = cal.getActualMaximum(Calendar.DAY_OF_MONTH) + toDt;
+    public List<TrafficStatisticsDto> findStatisticsTrafficAmount(TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo, String searchType) {
+        Map<String, Object> paramMap = new HashMap<>();
+        String fromDt   = paramInfo.getFromDt();
+        String toDt     = paramInfo.getToDt();
+        String roadNmbr = paramInfo.getRoadNmbr();
+        List<TrafficStatisticsDto> result = new ArrayList<>();
+        if (fromDt != null && toDt != null && roadNmbr != null && searchType != null) {
+            paramMap.put("FROM_DT", fromDt);
+            paramMap.put("TO_DT", toDt);
+            paramMap.put("ROAD_NMBR", roadNmbr);
+
+            if (searchType.equals("mn")) {
+                result = ixrMapper.findStatisticsTrafficAmountByMonth(paramMap);
+            }
+            else if (searchType.equals("dd")) {
+                result = ixrMapper.findStatisticsTrafficAmountByDays(paramMap);
+            }
         }
-        log.info("statDt : {}, fromDt : {}", statDt, fromDt);
-        log.info("TO_DT : {}, toDt : {}", statDt, toDt);
-        paramMap.put("FROM_DT", statDt + fromDt);
-        paramMap.put("TO_DT", statDt + toDt);
-        paramMap.put("SEARCH_TYPE", searchType);
-        log.info("findAllTrafficAmountStatistics - paramMap : {}",paramMap);
-
-        List<TrafficStatisticsDto> result = mapper.findAllTrafficAmountStatistics(paramMap);
         return result;
     }
 
     public List<DaeroMngmDto> findIntersectionAtrdName() {
         return ixrMapper.findIntersectionAtrdName();
     }
+
+    public List<TrafficStatisticsDto> findStatisticsCommSpeed(TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo, String searchType) {
+        Map<String, String> paramMap = new HashMap<>();
+        String fromDt   = paramInfo.getFromDt();
+        String toDt     = paramInfo.getToDt();
+        String atrdNm   = paramInfo.getAtrdNm();
+        List<TrafficStatisticsDto> result = new ArrayList<>();
+        if (fromDt != null && toDt != null && atrdNm != null && searchType != null) {
+            paramMap.put("FROM_DT", fromDt);
+            paramMap.put("TO_DT", toDt);
+            paramMap.put("ATRD_NM", atrdNm);
+
+            if (searchType.equals("mn")) {
+                result = this.mapper.findStatisticsCommSpeedMonth(paramMap);
+            }
+            else if (searchType.equals("dd")) {
+                result = this.mapper.findStatisticsCommSpeedDay(paramMap);
+            }
+        }
+        return result;
+    }
+
+    public List<TrafficStatisticsDto> findStatisticsCommGrade(TrafficStatisticsDto.TrafficStatisticsDtoReq paramInfo, String searchType) {
+        Map<String, String> paramMap = new HashMap<>();
+        String fromDt   = paramInfo.getFromDt();
+        String toDt     = paramInfo.getToDt();
+        String atrdNm   = paramInfo.getAtrdNm();
+        List<TrafficStatisticsDto> result = new ArrayList<>();
+        if (fromDt != null && toDt != null && atrdNm != null && searchType != null) {
+            paramMap.put("FROM_DT", fromDt);
+            paramMap.put("TO_DT", toDt);
+            paramMap.put("ATRD_NM", atrdNm);
+
+            if (searchType.equals("mn")) {
+                result = this.mapper.findStatisticsCommGradeMonth(paramMap);
+            }
+            else if (searchType.equals("dd")) {
+                result = this.mapper.findStatisticsCommGradeDay(paramMap);
+            }
+        }
+        return result;
+    }
 }

+ 5 - 4
src/main/java/com/its/web/service/traffic/TrafficService.java

@@ -8,10 +8,7 @@ import org.springframework.stereotype.Service;
 
 import java.sql.Blob;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Slf4j
 @RequiredArgsConstructor
@@ -142,6 +139,10 @@ public class TrafficService {
         return resultMap;
     }
 
+    public List<TbAtrdDto> findAtrdNameList() {
+        return this.mapper.findAtrdNameList();
+    }
+
     public List<TbAtrdDto> findAtrdVertexByIdAndLevel(TbAtrdDto.TbAtrdDtoReq req) {
         List<TbAtrdDto> atrdList = new ArrayList<>();
         Map<String, Object> paramMap = new HashMap<>();

+ 110 - 13
src/main/resources/mybatis/mapper/itcs/InterSectionMapper.xml

@@ -61,11 +61,41 @@
             DAERO_MNGM
     </select>
 
-    <select id="findStatisticsIntersectionAmount" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+    <select id="findStatisticsTrafficAmountByMonth" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
         SELECT
-           L.STRT_IXR AS STNODENAME,
-           L.END_IXR AS EDNODENAME,
-           T.*
+           L.STRT_IXR AS strt_name,
+           L.END_IXR AS end_name,
+           T.T01 AS t01,
+           T.T02 AS t02,
+           T.T03 AS t03,
+           T.T04 AS t04,
+           T.T05 AS t05,
+           T.T06 AS t06,
+           T.T07 AS t07,
+           T.T08 AS t08,
+           T.T09 AS t09,
+           T.T10 AS t10,
+           T.T11 AS t11,
+           T.T12 AS t12,
+           T.T13 AS t13,
+           T.T14 AS t14,
+           T.T15 AS t15,
+           T.T16 AS t16,
+           T.T17 AS t17,
+           T.T18 AS t18,
+           T.T19 AS t19,
+           T.T20 AS t20,
+           T.T21 AS t21,
+           T.T22 AS t22,
+           T.T23 AS t23,
+           T.T24 AS t24,
+           T.T25 AS t25,
+           T.T26 AS t26,
+           T.T27 AS t27,
+           T.T28 AS t28,
+           T.T29 AS t29,
+           T.T30 AS t30,
+           T.T31 AS t31
           FROM LINK_MNGM L
               INNER JOIN (
                   SELECT
@@ -102,17 +132,84 @@
                      NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 9, 2),'30',TFVL)), 0),0) AS T30,
                      NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 9, 2),'31',TFVL)), 0),0) AS T31
                     FROM IXR_LINK_TFVL
-                   WHERE TO_CHAR(CLCT_HH, 'YYYY-MM-DD HH24:MI:SS')
-                  BETWEEN TO_DATE(${fromDate}, 'YYYY-MM-DD HH24:MI:SS')
-                      AND TO_DATE(${toDate}, 'YYYY-MM-DD HH24:MI:SS')
+                   WHERE TO_DATE(CLCT_HH, 'YYYY-MM-DD HH24:MI:SS')
+                  BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS')
+                      AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
                   GROUP BY LINK_ID
               ) T ON T.LINK_ID=L.LINK_ID
           INNER JOIN DAERO_MNGM D ON L.DAERO_DVSN=D.NMBR
-          WHERE DAERO_NM=#{roadName}
-          GROUP BY T.LINK_ID,L.STRT_IXR,L.END_IXR,
-                   T01,T02,T03,T04,T05,T06,T07,T08,
-                   T09,T10,T11,T12,T13,T14,T15,T16,
-                   T17,T18,T19,T20,T21,T22,T23,T24,
-                   T25,T26,T27,T28,T29,T30,T31
+          WHERE D.NMBR=#{ROAD_NMBR}
+          GROUP BY T.LINK_ID, L.STRT_IXR, L.END_IXR, T01, T02, T03, T04, T05, T06, T07, T08,
+                   T09, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23,
+                   T24, T25, T26, T27, T28, T29, T30, T31
+    </select>
+
+
+    <select id="findStatisticsTrafficAmountByDays" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+        SELECT
+            L.STRT_IXR AS strt_name,
+            L.END_IXR AS end_name,
+            T.T00 AS t00,
+            T.T01 AS t01,
+            T.T02 AS t02,
+            T.T03 AS t03,
+            T.T04 AS t04,
+            T.T05 AS t05,
+            T.T06 AS t06,
+            T.T07 AS t07,
+            T.T08 AS t08,
+            T.T09 AS t09,
+            T.T10 AS t10,
+            T.T11 AS t11,
+            T.T12 AS t12,
+            T.T13 AS t13,
+            T.T14 AS t14,
+            T.T15 AS t15,
+            T.T16 AS t16,
+            T.T17 AS t17,
+            T.T18 AS t18,
+            T.T19 AS t19,
+            T.T20 AS t20,
+            T.T21 AS t21,
+            T.T22 AS t22,
+            T.T23 AS t23
+        FROM LINK_MNGM L
+                 INNER JOIN (
+            SELECT
+                LINK_ID,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'00',TFVL)), 0),0) AS T00,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'01',TFVL)), 0),0) AS T01,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'02',TFVL)), 0),0) AS T02,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'03',TFVL)), 0),0) AS T03,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'04',TFVL)), 0),0) AS T04,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'05',TFVL)), 0),0) AS T05,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'06',TFVL)), 0),0) AS T06,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'07',TFVL)), 0),0) AS T07,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'08',TFVL)), 0),0) AS T08,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'09',TFVL)), 0),0) AS T09,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'10',TFVL)), 0),0) AS T10,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'11',TFVL)), 0),0) AS T11,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'12',TFVL)), 0),0) AS T12,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'13',TFVL)), 0),0) AS T13,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'14',TFVL)), 0),0) AS T14,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'15',TFVL)), 0),0) AS T15,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'16',TFVL)), 0),0) AS T16,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'17',TFVL)), 0),0) AS T17,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'18',TFVL)), 0),0) AS T18,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'19',TFVL)), 0),0) AS T19,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'20',TFVL)), 0),0) AS T20,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'21',TFVL)), 0),0) AS T21,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'22',TFVL)), 0),0) AS T22,
+                NVL(ROUND(AVG(DECODE(SUBSTR(CLCT_HH, 12, 2),'23',TFVL)), 0),0) AS T23
+            FROM IXR_LINK_TFVL
+            WHERE TO_DATE(CLCT_HH, 'YYYY-MM-DD HH24:MI:SS')
+                      BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS')
+                      AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
+            GROUP BY LINK_ID
+        ) T ON T.LINK_ID=L.LINK_ID
+                 INNER JOIN DAERO_MNGM D ON L.DAERO_DVSN=D.NMBR
+        WHERE D.NMBR=#{ROAD_NMBR}
+        GROUP BY T.LINK_ID, L.STRT_IXR, L.END_IXR, T00, T01, T02, T03, T04, T05, T06, T07, T08,
+                 T09, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23
     </select>
 </mapper>

+ 527 - 1
src/main/resources/mybatis/mapper/its/statistics/StatisticsMapper.xml

@@ -2,6 +2,532 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.its.web.mapper.its.statistics.StatisticsMapper">
-    <select id="findAllTrafficAmountStatistics" parameterType="hashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+    <select id="findStatisticsCommSpeedMonth" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+        SELECT
+            IFSC_NM AS road_name,
+            STNODENAME AS strt_name,
+            EDNODENAME AS end_name,
+            t01,
+            t02,
+            t03,
+            t04,
+            t05,
+            t06,
+            t07,
+            t08,
+            t09,
+            t10,
+            t11,
+            t12,
+            t13,
+            t15,
+            t14,
+            t16,
+            t17,
+            t18,
+            t19,
+            t20,
+            t21,
+            t22,
+            t23,
+            t24,
+            t25,
+            t26,
+            t27,
+            t28,
+            t29,
+            t30,
+            t31,
+            DIRECTION,
+            ORD1,
+            ORD2
+        FROM (
+                 SELECT
+                     F.DRCT_CD AS DIRECTION,
+                     B.IFSC_ID AS LINKID,
+                     C.IFSC_NM,
+                     C.STRT_NM AS STNODENAME,
+                     C.END_NM AS EDNODENAME,
+                     A.ORD AS ORD1,
+                     B.ORD AS ORD2
+                 FROM TB_ATRD_ROAD_RLTN A,
+                      TB_ROAD_IFSC_RLTN B,
+                      TB_IFSC C,
+                      TB_NODE D,
+                      TB_NODE E,
+                      TB_ATRD F,
+                      TB_IFSC_TRAF G
+                 WHERE F.ATRD_NM = #{ATRD_NM}
+                   AND A.ROAD_ID = B.ROAD_ID
+                   AND B.IFSC_ID = C.IFSC_ID
+                   AND C.F_NODE_ID = D.NODE_ID
+                   AND C.T_NODE_ID = E.NODE_ID
+                   AND A.ATRD_ID = F.ATRD_ID
+                   AND B.IFSC_ID = G.IFSC_ID
+                 ORDER BY A.ATRD_ID,A.ORD, B.ORD,F.DRCT_CD
+             ) A,
+             (
+                 SELECT
+                     IFSC_ID,
+                     t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13, t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31
+                 FROM
+                     (
+                         SELECT
+                             B.IFSC_ID,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'01', TO_NUMBER(NVL(SPED, 0)))), 0) AS t01,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'02', TO_NUMBER(NVL(SPED, 0)))), 0) AS t02,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'03', TO_NUMBER(NVL(SPED, 0)))), 0) AS t03,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'04', TO_NUMBER(NVL(SPED, 0)))), 0) AS t04,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'05', TO_NUMBER(NVL(SPED, 0)))), 0) AS t05,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'06', TO_NUMBER(NVL(SPED, 0)))), 0) AS t06,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'07', TO_NUMBER(NVL(SPED, 0)))), 0) AS t07,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'08', TO_NUMBER(NVL(SPED, 0)))), 0) AS t08,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'09', TO_NUMBER(NVL(SPED, 0)))), 0) AS t09,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'10', TO_NUMBER(NVL(SPED, 0)))), 0) AS t10,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'11', TO_NUMBER(NVL(SPED, 0)))), 0) AS t11,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'12', TO_NUMBER(NVL(SPED, 0)))), 0) AS t12,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'13', TO_NUMBER(NVL(SPED, 0)))), 0) AS t13,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'14', TO_NUMBER(NVL(SPED, 0)))), 0) AS t14,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'15', TO_NUMBER(NVL(SPED, 0)))), 0) AS t15,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'16', TO_NUMBER(NVL(SPED, 0)))), 0) AS t16,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'17', TO_NUMBER(NVL(SPED, 0)))), 0) AS t17,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'18', TO_NUMBER(NVL(SPED, 0)))), 0) AS t18,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'19', TO_NUMBER(NVL(SPED, 0)))), 0) AS t19,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'20', TO_NUMBER(NVL(SPED, 0)))), 0) AS t20,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'21', TO_NUMBER(NVL(SPED, 0)))), 0) AS t21,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'22', TO_NUMBER(NVL(SPED, 0)))), 0) AS t22,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'23', TO_NUMBER(NVL(SPED, 0)))), 0) AS t23,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'24', TO_NUMBER(NVL(SPED, 0)))), 0) AS t24,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'25', TO_NUMBER(NVL(SPED, 0)))), 0) AS t25,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'26', TO_NUMBER(NVL(SPED, 0)))), 0) AS t26,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'27', TO_NUMBER(NVL(SPED, 0)))), 0) AS t27,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'28', TO_NUMBER(NVL(SPED, 0)))), 0) AS t28,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'29', TO_NUMBER(NVL(SPED, 0)))), 0) AS t29,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'30', TO_NUMBER(NVL(SPED, 0)))), 0) AS t30,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2),'31', TO_NUMBER(NVL(SPED, 0)))), 0) AS t31
+                         FROM (
+                                  SELECT * FROM TB_IFSC_HH_STAT
+                              ) A,
+                              (
+                                  SELECT
+                                      B.IFSC_ID,
+                                      G.CMTR_GRAD_CD AS TRFGRADE
+                                  FROM TB_ATRD_ROAD_RLTN A,
+                                       TB_ROAD_IFSC_RLTN B,
+                                       TB_IFSC C,
+                                       TB_NODE D,
+                                       TB_NODE E,
+                                       TB_ATRD F,
+                                       TB_IFSC_TRAF G
+                                  WHERE F.ATRD_NM = #{ATRD_NM}
+                                    AND A.ROAD_ID = B.ROAD_ID
+                                    AND B.IFSC_ID = C.IFSC_ID
+                                    AND C.F_NODE_ID = D.NODE_ID
+                                    AND C.T_NODE_ID = E.NODE_ID
+                                    AND A.ATRD_ID = F.ATRD_ID
+                                    AND B.IFSC_ID = G.IFSC_ID
+                              ) B
+                         WHERE A.IFSC_ID = B.IFSC_ID
+                           AND TO_DATE(A.STAT_DT, 'YYYY-MM-DD HH24:MI:SS')
+                       BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
+                         GROUP BY B.IFSC_ID
+                         ORDER BY B.IFSC_ID
+                     ) Z
+                 GROUP BY
+                     IFSC_ID,
+                     t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31
+             ) B
+        WHERE A.LINKID = B.IFSC_ID
+        ORDER BY DIRECTION,ORD1,ORD2
     </select>
+
+    <select id="findStatisticsCommSpeedDay" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+        SELECT
+            IFSC_NM AS road_name,
+            STNODENAME AS strt_name,
+            EDNODENAME AS end_name,
+            t00,
+            t01,
+            t02,
+            t03,
+            t04,
+            t05,
+            t06,
+            t07,
+            t08,
+            t09,
+            t10,
+            t11,
+            t12,
+            t13,
+            t14,
+            t15,
+            t16,
+            t17,
+            t18,
+            t19,
+            t20,
+            t21,
+            t22,
+            t23,
+            ORD1,
+            ORD2,
+            DIRECTION
+        FROM (
+            SELECT
+                F.DRCT_CD AS DIRECTION,
+                B.IFSC_ID AS LINKID,
+                C.IFSC_NM,
+                C.STRT_NM AS STNODENAME,
+                C.END_NM AS EDNODENAME,
+                A.ORD AS ORD1,
+                B.ORD AS ORD2
+            FROM TB_ATRD_ROAD_RLTN A,
+                   TB_ROAD_IFSC_RLTN B,
+                   TB_IFSC C,
+                   TB_NODE D,
+                   TB_NODE E,
+                   TB_ATRD F,
+                   TB_IFSC_TRAF G
+            WHERE F.ATRD_NM = #{ATRD_NM}
+                AND A.ROAD_ID = B.ROAD_ID
+                AND B.IFSC_ID = C.IFSC_ID
+                AND C.F_NODE_ID = D.NODE_ID
+                AND C.T_NODE_ID = E.NODE_ID
+                AND A.ATRD_ID = F.ATRD_ID
+                AND B.IFSC_ID = G.IFSC_ID
+            ORDER BY A.ATRD_ID,A.ORD, B.ORD,F.DRCT_CD
+        ) A,
+        (
+            SELECT
+                IFSC_ID,
+                t00,t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23
+            FROM
+            (
+                SELECT
+                    B.IFSC_ID,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'00', TO_NUMBER(NVL(SPED, 0)))), 0) AS t00,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'01', TO_NUMBER(NVL(SPED, 0)))), 0) AS t01,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'02', TO_NUMBER(NVL(SPED, 0)))), 0) AS t02,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'03', TO_NUMBER(NVL(SPED, 0)))), 0) AS t03,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'04', TO_NUMBER(NVL(SPED, 0)))), 0) AS t04,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'05', TO_NUMBER(NVL(SPED, 0)))), 0) AS t05,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'06', TO_NUMBER(NVL(SPED, 0)))), 0) AS t06,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'07', TO_NUMBER(NVL(SPED, 0)))), 0) AS t07,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'08', TO_NUMBER(NVL(SPED, 0)))), 0) AS t08,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'09', TO_NUMBER(NVL(SPED, 0)))), 0) AS t09,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'10', TO_NUMBER(NVL(SPED, 0)))), 0) AS t10,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'11', TO_NUMBER(NVL(SPED, 0)))), 0) AS t11,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'12', TO_NUMBER(NVL(SPED, 0)))), 0) AS t12,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'13', TO_NUMBER(NVL(SPED, 0)))), 0) AS t13,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'14', TO_NUMBER(NVL(SPED, 0)))), 0) AS t14,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'15', TO_NUMBER(NVL(SPED, 0)))), 0) AS t15,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'16', TO_NUMBER(NVL(SPED, 0)))), 0) AS t16,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'17', TO_NUMBER(NVL(SPED, 0)))), 0) AS t17,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'18', TO_NUMBER(NVL(SPED, 0)))), 0) AS t18,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'19', TO_NUMBER(NVL(SPED, 0)))), 0) AS t19,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'20', TO_NUMBER(NVL(SPED, 0)))), 0) AS t20,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'21', TO_NUMBER(NVL(SPED, 0)))), 0) AS t21,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'22', TO_NUMBER(NVL(SPED, 0)))), 0) AS t22,
+                    ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2),'23', TO_NUMBER(NVL(SPED, 0)))), 0) AS t23
+                FROM (
+                    SELECT * FROM TB_IFSC_HH_STAT
+                ) A,
+                (
+                    SELECT
+                        B.IFSC_ID,
+                        G.CMTR_GRAD_CD AS TRFGRADE
+                    FROM TB_ATRD_ROAD_RLTN A,
+                       TB_ROAD_IFSC_RLTN B,
+                       TB_IFSC C,
+                       TB_NODE D,
+                       TB_NODE E,
+                       TB_ATRD F,
+                       TB_IFSC_TRAF G
+                    WHERE F.ATRD_NM = #{ATRD_NM}
+                    AND A.ROAD_ID = B.ROAD_ID
+                    AND B.IFSC_ID = C.IFSC_ID
+                    AND C.F_NODE_ID = D.NODE_ID
+                    AND C.T_NODE_ID = E.NODE_ID
+                    AND A.ATRD_ID = F.ATRD_ID
+                    AND B.IFSC_ID = G.IFSC_ID
+                ) B
+                WHERE A.IFSC_ID = B.IFSC_ID
+                  AND TO_DATE(A.STAT_DT, 'YYYY-MM-DD HH24:MI:SS')
+              BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
+                GROUP BY B.IFSC_ID
+                ORDER BY B.IFSC_ID
+            ) Z
+            GROUP BY
+            Z.IFSC_ID,
+            t00,t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23
+        ) B
+        WHERE A.LINKID = B.IFSC_ID
+        ORDER BY DIRECTION,ORD1,ORD2
+    </select>
+    <select id="findStatisticsCommGradeMonth" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+        SELECT
+            IFSC_NM AS road_name,
+            STNODENAME AS strt_name,
+            EDNODENAME AS end_name,
+            t01,
+            t02,
+            t03,
+            t04,
+            t05,
+            t06,
+            t07,
+            t08,
+            t09,
+            t10,
+            t11,
+            t12,
+            t13,
+            t15,
+            t16,
+            t17,
+            t18,
+            t19,
+            t20,
+            t21,
+            t22,
+            t23,
+            t24,
+            t25,
+            t26,
+            t27,
+            t28,
+            t29,
+            t30,
+            t31,
+            ORD1,
+            ORD2,
+            DIRECTION
+       FROM (
+           SELECT
+               F.DRCT_CD AS DIRECTION,
+               B.IFSC_ID AS LINKID,
+               C.IFSC_NM,
+               C.STRT_NM AS STNODENAME,
+               C.END_NM AS EDNODENAME,
+               A.ORD AS ORD1,
+               B.ORD AS ORD2
+           FROM TB_ATRD_ROAD_RLTN A,
+             TB_ROAD_IFSC_RLTN B,
+             TB_IFSC C,
+             TB_NODE D,
+             TB_NODE E,
+             TB_ATRD F,
+             TB_IFSC_TRAF G
+           WHERE F.ATRD_NM = #{ATRD_NM}
+               AND A.ROAD_ID = B.ROAD_ID
+               AND B.IFSC_ID = C.IFSC_ID
+               AND C.F_NODE_ID = D.NODE_ID
+               AND C.T_NODE_ID = E.NODE_ID
+               AND A.ATRD_ID = F.ATRD_ID
+               AND B.IFSC_ID = G.IFSC_ID
+           ORDER BY A.ATRD_ID,A.ORD, B.ORD,F.DRCT_CD
+       ) A,
+       (
+           SELECT
+               IFSC_ID,
+               t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15,
+               t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31
+           FROM
+           (
+               SELECT
+                   B.IFSC_ID,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 01, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t01,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 02, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t02,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 03, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t03,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 04, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t04,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 05, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t05,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 06, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t06,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 07, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t07,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 08, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t08,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 09, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t09,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 10, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t10,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 11, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t11,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 12, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t12,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 13, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t13,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 14, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t14,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 15, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t15,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 16, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t16,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 17, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t17,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 18, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t18,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 19, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t19,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 20, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t20,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 21, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t21,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 22, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t22,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 23, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t23,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 24, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t24,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 25, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t25,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 26, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t26,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 27, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t27,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 28, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t28,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 29, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t29,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 30, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t30,
+                   ROUND(AVG(DECODE(SUBSTR(STAT_DT,7,2), 31, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t31
+               FROM (
+                   SELECT * FROM TB_IFSC_HH_STAT
+               ) A,
+               (
+                   SELECT
+                       B.IFSC_ID,
+                       G.CMTR_GRAD_CD AS TRFGRADE
+                   FROM TB_ATRD_ROAD_RLTN A,
+                     TB_ROAD_IFSC_RLTN B,
+                     TB_IFSC C,
+                     TB_NODE D,
+                     TB_NODE E,
+                     TB_ATRD F,
+                     TB_IFSC_TRAF G
+                   WHERE F.ATRD_NM = #{ATRD_NM}
+                   AND A.ROAD_ID = B.ROAD_ID
+                   AND B.IFSC_ID = C.IFSC_ID
+                   AND C.F_NODE_ID = D.NODE_ID
+                   AND C.T_NODE_ID = E.NODE_ID
+                   AND A.ATRD_ID = F.ATRD_ID
+                   AND B.IFSC_ID = G.IFSC_ID
+               ) B
+               WHERE A.IFSC_ID = B.IFSC_ID
+                 AND TO_DATE(A.STAT_DT, 'YYYY-MM-DD HH24:MI:SS')
+             BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
+               GROUP BY B.IFSC_ID
+               ORDER BY B.IFSC_ID
+           ) Z
+           GROUP BY
+           IFSC_ID,
+           t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31
+       ) B
+       WHERE A.LINKID = B.IFSC_ID
+       ORDER BY DIRECTION,ORD1,ORD2
+    </select>
+
+    <select id="findStatisticsCommGradeDay" parameterType="java.util.HashMap" resultType="com.its.web.dto.statistics.TrafficStatisticsDto">
+        SELECT
+            IFSC_NM AS road_name,
+            STNODENAME AS strt_name,
+            EDNODENAME AS end_name,
+            t00,
+            t01,
+            t02,
+            t03,
+            t04,
+            t05,
+            t06,
+            t07,
+            t08,
+            t09,
+            t10,
+            t11,
+            t12,
+            t13,
+            t15,
+            t16,
+            t17,
+            t18,
+            t19,
+            t20,
+            t21,
+            t22,
+            t23,
+            ORD1,
+            ORD2,
+            DIRECTION
+        FROM (
+                 SELECT
+                     F.DRCT_CD AS DIRECTION,
+                     B.IFSC_ID AS LINKID,
+                     C.IFSC_NM,
+                     C.STRT_NM AS STNODENAME,
+                     C.END_NM AS EDNODENAME,
+                     A.ORD AS ORD1,
+                     B.ORD AS ORD2
+                 FROM TB_ATRD_ROAD_RLTN A,
+                      TB_ROAD_IFSC_RLTN B,
+                      TB_IFSC C,
+                      TB_NODE D,
+                      TB_NODE E,
+                      TB_ATRD F,
+                      TB_IFSC_TRAF G
+                 WHERE F.ATRD_NM = #{ATRD_NM}
+                   AND A.ROAD_ID = B.ROAD_ID
+                   AND B.IFSC_ID = C.IFSC_ID
+                   AND C.F_NODE_ID = D.NODE_ID
+                   AND C.T_NODE_ID = E.NODE_ID
+                   AND A.ATRD_ID = F.ATRD_ID
+                   AND B.IFSC_ID = G.IFSC_ID
+                 ORDER BY A.ATRD_ID,A.ORD, B.ORD,F.DRCT_CD
+             ) A,
+             (
+                 SELECT
+                     IFSC_ID,
+                     t00, t01, t02, t03, t04, t05, t06, t07,
+                     t08, t09, t10, t11, t12, t13, t14, t15,
+                     t16, t17, t18, t19, t20, t21, t22, t23
+                 FROM
+                     (
+                         SELECT
+                             B.IFSC_ID,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 01, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t00,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 01, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t01,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 02, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t02,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 03, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t03,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 04, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t04,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 05, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t05,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 06, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t06,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 07, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t07,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 08, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t08,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 09, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t09,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 10, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t10,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 11, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t11,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 12, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t12,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 13, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t13,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 14, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t14,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 15, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t15,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 16, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t16,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 17, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t17,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 18, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t18,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 19, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t19,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 20, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t20,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 21, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t21,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 22, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t22,
+                             ROUND(AVG(DECODE(SUBSTR(STAT_DT,9,2), 23, TO_NUMBER(NVL(SUBSTR(TRFGRADE, 4,1), 0)))), 0) AS t23
+                         FROM (
+                                  SELECT * FROM TB_IFSC_HH_STAT
+                              ) A,
+                              (
+                                  SELECT
+                                      B.IFSC_ID,
+                                      G.CMTR_GRAD_CD AS TRFGRADE
+                                  FROM TB_ATRD_ROAD_RLTN A,
+                                       TB_ROAD_IFSC_RLTN B,
+                                       TB_IFSC C,
+                                       TB_NODE D,
+                                       TB_NODE E,
+                                       TB_ATRD F,
+                                       TB_IFSC_TRAF G
+                                  WHERE F.ATRD_NM = #{ATRD_NM}
+                                    AND A.ROAD_ID = B.ROAD_ID
+                                    AND B.IFSC_ID = C.IFSC_ID
+                                    AND C.F_NODE_ID = D.NODE_ID
+                                    AND C.T_NODE_ID = E.NODE_ID
+                                    AND A.ATRD_ID = F.ATRD_ID
+                                    AND B.IFSC_ID = G.IFSC_ID
+                              ) B
+                         WHERE A.IFSC_ID = B.IFSC_ID
+                           AND TO_DATE(A.STAT_DT, 'YYYY-MM-DD HH24:MI:SS')
+                       BETWEEN TO_DATE(#{FROM_DT}, 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE(#{TO_DT}, 'YYYY-MM-DD HH24:MI:SS')
+                         GROUP BY B.IFSC_ID
+                         ORDER BY B.IFSC_ID
+                     ) Z
+                 GROUP BY
+                     IFSC_ID,
+                     t00,t01,t02,t03,t04,t05,t06,t07,t08,t09,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23
+             ) B
+        WHERE A.LINKID = B.IFSC_ID
+        ORDER BY DIRECTION,ORD1,ORD2
+    </select>
+
 </mapper>

+ 8 - 0
src/main/resources/mybatis/mapper/its/traffic/TrafficMapper.xml

@@ -385,6 +385,14 @@
         WHERE A.del_yn = 'N'
     </select>
 
+    <select id="findAtrdNameList" resultType="com.its.web.dto.traffic.TbAtrdDto">
+        SELECT
+            DISTINCT(atrd_nm)
+        FROM TB_ATRD A
+        WHERE A.del_yn = 'N'
+        ORDER BY atrd_nm
+    </select>
+
     <select id="findAtrdRoadVertexByIdAndLevel" parameterType="java.util.HashMap" resultType="com.its.web.dto.traffic.TbAtrdDto">
         SELECT
             A.atrd_id,

+ 49 - 1
src/main/resources/static/css/statistics.css

@@ -132,6 +132,29 @@
     border-spacing: 0px;
     caption-side: bottom;
 }
+.table-toggle {
+    display: flex;
+}
+
+.table-toggle > div {
+    cursor: pointer;
+    padding: 0.5rem;
+    margin-right: 3px;
+    margin-bottom: 3px;
+    background-color: rgb(234, 234, 234);
+}
+.table-toggle > div.active {
+    color: rgb(255, 255, 255);
+    background-color: rgb(51, 102, 171);
+}
+
+.table-box.comm {
+    height: calc(-428px + 100vh);
+}
+
+.table-box table.comm{
+    height: calc(-443px + 100vh);
+}
 
 .table-box table th:first-child {
     left: 0px;
@@ -171,4 +194,29 @@
     position: fixed;
     left: 50%;
     transform: translate(-50%, -50%);
-}
+}
+
+.table-box table td span img {
+    width: 50px;
+    height: 50px;
+}
+
+.table-box td:first-child:not(:last-child){
+    border-right: 2px solid rgb(234, 234, 234);
+}
+
+.table-box td {
+    background: rgb(255, 255, 255);
+    border-bottom: 2px solid rgb(234, 234, 234);
+}
+
+.comm td.LTC1 {
+    color: rgb(21, 179, 55);
+}
+.comm td.LTC2 {
+    color: rgb(255, 170, 0);
+}
+.comm td.LTC3 {
+    color: rgb(235, 38, 12);
+}
+

BIN
src/main/resources/static/images/icon/loading.gif


+ 183 - 17
src/main/resources/static/js/statistics/statistics.js

@@ -8,14 +8,17 @@ function init () {
     const $month  = $('.month');
     const $date   = $('.date');
     const $type   = $('.type');
-    const $button = $('.button');
+    const $amBtn  = $('.button.amount');
+    const $comBtn = $('.button.comm');
+    const $toggle = $('.table-toggle');
+
     const now      = new Date();
     const nowYear  = now.getFullYear();
     const nowMonth = now.getMonth() + 1;
     const nowDate  = now.getDate();
 
-    $button.on('click', () => searchStatisticsAmount());
-
+    $amBtn.on('click', () => searchStatisticsAmount());
+    $comBtn.on('click', ()=> searchStatisticsComm());
     $type.on('change', function(){
         const isDisabled = !($(this).val() === 'dd');
         $date.attr('disabled', isDisabled);
@@ -37,8 +40,6 @@ function init () {
                 const monthVal = $month.val();
                 $month.html(monthOptions);
 
-                console.log('라스트',lastMonth, '월',Number(monthVal));
-                console.log(Number(monthVal) > lastMonth);
                 if (Number(monthVal) > lastMonth) {
                     $month.val(1);
                     if ($date[0]) {
@@ -94,6 +95,15 @@ function init () {
         $date.html(options);
         $date.val(nowMonth);
     }
+
+    if ($toggle[0]) {
+        $toggle.children().on('click', function() {
+            const isActive = $(this).hasClass("active");
+            if (isActive) return;
+            $('.table-toggle .active').removeClass("active");
+            $(this).addClass("active");
+        })
+    }
 }
 
 /**
@@ -118,38 +128,194 @@ function getDateOptions(start, limit, word) {
     return options;
 }
 
+/**
+ * 교통량 통계 조회
+ */
 function searchStatisticsAmount() {
-    const $roadName = $('.road_name');
+    const $roadNmbr = $('.road_nmbr');
     const $type     = $('.type');
     const $year     = $('.year');
     const $month    = $('.month');
     const $date     = $('.date');
+    const $thead    = $('.thead');
+    const $tbody    = $('.table-content');
+    const $table    = $('.table-box table')
     const type      = $type.val();
-    const roadName  = $roadName.val();
+    const roadNmbr  = $roadNmbr.val();
     const year      = Number($year.val());
     const month     = Number($month.val());
     const date      = Number($date.val());
+
     let fromDt = "";
     let toDt   = "";
-    if (type === 'dd') {
-        const dateValue = getSearchDateValue(year, month, date);
-        fromDt = dateValue + '000000';
-        toDt   = dateValue + '235959';
-    }
-    else {
+    let limit  = 23;
+    let start  = 0;
+    const dateValue = getSearchDateValue(year, month, date);
+    fromDt = dateValue + '000000';
+    toDt   = dateValue + '235959';
+
+    if (type === 'mn') {
         fromDt = getSearchDateValue(year, month, 1) + '000000';
         toDt = getSearchDateValue(year, month, new Date(year, month, 0).getDate()) + '235959';
+        limit = new Date(year, month, 0).getDate();
+        start = 1;
     }
+
     const param = {
-        road_name : roadName,
-        from_dt   : fromDt,
-        to_dt     : toDt,
+        roadNmbr : roadNmbr,
+        fromDt   : fromDt,
+        toDt     : toDt,
     }
+
+    let height = 'calc(-400px + 100vh)';
+    $table.css('height', height);
+    $tbody.html('<tr><td><span><img src="/images/icon/loading.gif"></span></td></tr>');
     getDataAsync('/api/statistics/amount/' + type, "POST", param, null, (jsonData)=>{
-        console.log(jsonData);
+        let emptyStr = `<tr>
+                            <td><span>조회 된 항목이 없습니다.</span></td>
+                        </tr>`;
+        let str = emptyStr;
+        let thead = "";
+
+        if (jsonData && jsonData.length > 0) {
+            str = "";
+            jsonData.forEach((obj)=>{
+                const { strt_name, end_name } = obj;
+
+                str +=`<tr>
+                        <td>${strt_name} -> ${end_name}</td>`
+                for (let ii = start; ii <= limit; ii++) {
+                    let value = ii;
+                    if (value < 10) value = "0" + ii;
+                    value = obj['t' + value];
+                    if (value === '0' || !value) value = '-';
+                    str += `<td>${value}</td>`
+                }
+                str += `</tr>`
+            });
+            height = 'auto';
+            $table.css('height', height);
+        }
+        if (limit) {
+            thead = '<th>구간</th>';
+            for (let ii = start; ii <= limit; ii++) {
+                thead += '<th>'+ii+'</th>';
+            }
+        }
+
+        $thead.html(thead);
+        $tbody.html(str);
+
     }, null);
 }
 
+/**
+ * 소통 통계 조회
+ */
+function searchStatisticsComm() {
+    const $atrdNm   = $('.atrd_nm');
+    const $type     = $('.type');
+    const $year     = $('.year');
+    const $month    = $('.month');
+    const $date     = $('.date');
+    const $thead    = $('.thead');
+    const $tbody    = $('.table-content');
+    const $table    = $('.table-box table');
+    const $active   = $('.table-toggle .active');
+    const active    = $active.text();
+    const type      = $type.val();
+    const atrdNm    = $atrdNm.val();
+    const year      = Number($year.val());
+    const month     = Number($month.val());
+    const date      = Number($date.val());
+
+
+    let fromDt = "";
+    let toDt   = "";
+    let limit  = 23;
+    let start  = 0;
+    const dateValue = getSearchDateValue(year, month, date);
+    fromDt = dateValue + '000000';
+    toDt   = dateValue + '235959';
+
+    if (type === 'mn') {
+        fromDt = getSearchDateValue(year, month, 1) + '000000';
+        toDt = getSearchDateValue(year, month, new Date(year, month, 0).getDate()) + '235959';
+        limit = new Date(year, month, 0).getDate();
+        start = 1;
+    }
+
+    const param = {
+        atrdNm   : atrdNm,
+        fromDt   : fromDt,
+        toDt     : toDt,
+    }
+
+    let height = 'calc(-443px + 100vh)';
+    let url = "/speed";
+    $table.css('height', height);
+    $tbody.html('<tr><td><span><img src="/images/icon/loading.gif"></span></td></tr>');
+    console.log(active);
+    if (active === '지/정체통계') url = '/grade';
+
+    let emptyStr = `<tr>
+                        <td><span>조회 된 항목이 없습니다.</span></td>
+                    </tr>`;
+    let thead = "";
+    if (limit) {
+        thead = '<th>구간</th>';
+        for (let ii = start; ii <= limit; ii++) {
+            thead += '<th>'+ii+'</th>';
+        }
+    }
+    getDataAsync('/api/statistics' + url + '/' + type, "POST", param, null, (jsonData)=>{
+        let str = emptyStr;
+
+        if (jsonData && jsonData.length > 0) {
+            str = "";
+            jsonData.forEach((obj)=>{
+                const { strt_name, end_name } = obj;
+
+                str +=`<tr>
+                        <td>${strt_name} -> ${end_name}</td>`
+                for (let ii = start; ii <= limit; ii++) {
+                    let value = ii;
+                    if (value < 10) value = "0" + ii;
+                    value = obj['t' + value];
+                    if (url === '/grade') {
+                        let text = "●";
+                        if (!value) {
+                            text = "○";
+                        }
+                        str += '<td class="LTC'+ value+'">' + text + '</td>'
+                    }
+                    else {
+                        if (value === '0' || !value) value = '-';
+                        str += `<td>${value}</td>`
+                    }
+                }
+                str += `</tr>`
+            });
+            height = 'auto';
+            $table.css('height', height);
+        }
+
+        $thead.html(thead);
+        $tbody.html(str);
+
+    }, ()=>{
+        $thead.html(thead);
+        $tbody.html(emptyStr);
+    });
+}
+
+/**
+ * 조회 날짜 값 포맷
+ * @param year 년도
+ * @param month 월
+ * @param date 일
+ * @returns {*} 포맷 문자
+ */
 function getSearchDateValue(year, month, date) {
     if (!year || !month || !date) {
         return;

+ 1 - 3
src/main/resources/templates/main/main.html

@@ -23,7 +23,7 @@
                 <div title="포항시 실시간 도로 소통 정보를 확인할 수 있습니다." class="other-bg road-bg" th:onclick="movePath('/trafficMap/realtimetraffic')">
                     <div>실시간소통정보</div>
                 </div>
-                <div title="포항시 교통 통계를 제공합니다." class="other-bg stat-bg" th:onclick="movePath('/traffic/cctv')">
+                <div title="포항시 교통 통계를 제공합니다." class="other-bg stat-bg" th:onclick="movePath('/statistics/traffic01')">
                     <div>교통통계</div>
                 </div>
                 <div title="포항시 버스정보시스템 홈페이지로 이동합니다.(새 창 열기)" class="other-bg bus-bg" th:onclick="openBusSite(0)">
@@ -70,8 +70,6 @@
 </div>
 <th:block th:include="/include/footer.html"></th:block>
 
-<!-- <script src="/static/js/2.dedc29bc.chunk.js"></script> -->
-<!-- <script src="/static/js/main.3b4aee58.chunk.js"></script> -->
 </body>
 
 <script th:inline="javascript">

+ 4 - 4
src/main/resources/templates/statistics/tfvl-stat-amount.html

@@ -19,7 +19,7 @@
             <div>
                 <div>
                     <div class="label">도로명</div>
-                    <select class="road_name" name="road_nm">
+                    <select class="road_nmbr" name="road_nmbr">
                         <option th:each="item : ${road}" th:value="${item.getNmbr()}" th:text="${item.getDaeroNm()}"></option>
                     </select>
                     <div class="label">구분</div>
@@ -35,7 +35,7 @@
                     <select class="date" name="date"></select>
                 </div>
             </div>
-            <div class="button">
+            <div class="button amount">
                 조회
                 <img width="20" height="20" src="/images/icon/search.png">
             </div>
@@ -46,11 +46,11 @@
                     <colgroup>
                         <col width="25%">
                     </colgroup>
-                    <thead>
+                    <thead class="thead">
                         <th>구간</th>
                         <th th:each="m : ${#numbers.sequence(0, 23)}" th:text="${m}"></th>
                     </thead>
-                    <tbody>
+                    <tbody class="table-content">
                         <tr>
                             <td><span>조회 된 항목이 없습니다.</span></td>
                         </tr>

+ 49 - 0
src/main/resources/templates/statistics/tfvl-stat-speed.html

@@ -14,6 +14,55 @@
 <th:block th:include="/include/header.html"></th:block>
 <th:block th:include="/include/statistics-menu"></th:block>
 <div class="statisticWrap">
+    <div class="container">
+        <div class="search-bar">
+            <div>
+                <div>
+                    <div class="label">도로명</div>
+                    <select class="atrd_nm" name="atrd_nm">
+                        <option th:each="item : ${road}" th:value="${item.getAtrdNm()}" th:text="${item.getAtrdNm()}"></option>
+                    </select>
+                    <div class="label">구분</div>
+                    <select class="type" name="type">
+                        <option value="dd">일간</option>
+                        <option value="mn">월간</option>
+                    </select>
+                </div>
+                <div>
+                    <div class="label">검색일</div>
+                    <select class="year" name="year"></select>
+                    <select class="month" name="month"></select>
+                    <select class="date" name="date"></select>
+                </div>
+            </div>
+            <div class="button comm">
+                조회
+                <img width="20" height="20" src="/images/icon/search.png">
+            </div>
+        </div>
+        <div class="search-content">
+            <div class="table-toggle">
+                <div class="active">속도통계</div>
+                <div>지/정체통계</div>
+            </div>
+            <div class="table-box comm">
+                <table class="comm">
+                    <colgroup>
+                        <col width="25%">
+                    </colgroup>
+                    <thead class="thead">
+                    <th>구간</th>
+                    <th th:each="m : ${#numbers.sequence(0, 23)}" th:text="${m}"></th>
+                    </thead>
+                    <tbody class="table-content">
+                    <tr>
+                        <td><span>조회 된 항목이 없습니다.</span></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
 </div>
 <th:block th:include="/include/footer.html"></th:block>
 </body>