shjung 2 jaren geleden
bovenliggende
commit
d56ff16f01

+ 7 - 0
src/main/java/com/its/op/controller/its/dashboard/DashboardController.java

@@ -1,6 +1,7 @@
 package com.its.op.controller.its.dashboard;
 
 import com.its.op.dto.its.dashboard.CmtrGradCountSttsDto;
+import com.its.op.dto.its.dashboard.TrafPrcnStatDto;
 import com.its.op.service.its.dashboard.DashboardService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -39,4 +40,10 @@ public class DashboardController {
         return this.service.findAllCmtrGradCountSttsRoad();
     }
 
+    @ApiOperation(value = "정보제공구간 소통등급현황 및 수집원 조회", response = TrafPrcnStatDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/traf-prcn-stat/traf-stts/all", produces = {"application/json; charset=utf8"})
+    public List<TrafPrcnStatDto> findAllTrafPrcnStatAll() {
+        return this.service.findAllTrafPrcnStatAll();
+    }
+
 }

+ 1 - 0
src/main/java/com/its/op/controller/its/scrs/TbScSgnlCtlrController.java

@@ -46,6 +46,7 @@ public class TbScSgnlCtlrController {
     public List<TbScSgnlCtlrPhaseDto> findAllPhaseList() {
         return this.service.findAllPhaseList();
     }
+
     @ApiOperation(value = "신호 제어기 현시정보 개별조회(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrPhaseDto.class)
     @GetMapping(value = "/phase/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
     public TbScSgnlCtlrPhaseDto findByIdPhase(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr) {

+ 3 - 0
src/main/java/com/its/op/dao/mapper/its/dashboard/DashboardMapper.java

@@ -1,6 +1,7 @@
 package com.its.op.dao.mapper.its.dashboard;
 
 import com.its.op.dto.its.dashboard.CmtrGradCountSttsDto;
+import com.its.op.dto.its.dashboard.TrafPrcnStatDto;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -12,4 +13,6 @@ public interface DashboardMapper {
     List<CmtrGradCountSttsDto> findAllCmtrGradCountSttsIfsc();
     List<CmtrGradCountSttsDto> findAllCmtrGradCountSttsRoad();
 
+    List<TrafPrcnStatDto.TrafPrcnStatVo> findAllTrafPrcnStatAll();
+    List<TrafPrcnStatDto.TrafClctStatVo> findAllTrafClctStatAll();
 }

+ 224 - 0
src/main/java/com/its/op/dto/its/dashboard/TrafPrcnStatDto.java

@@ -0,0 +1,224 @@
+package com.its.op.dto.its.dashboard;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *  DTO Class
+ */
+@Data
+@Builder
+//@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
+@ApiModel("TrafPrcnStatDto(소통등급갯수상태)")
+public class TrafPrcnStatDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("구분(0:현재,1:어제,2:지난주)")
+    @JsonProperty("prcn_type")
+    private Integer PRCN_TYPE;
+
+    @ApiModelProperty("현재 가공시각")
+    @JsonProperty("prcn_tm")
+    private String PRCN_TM;
+
+    @ApiModelProperty("정보제공구간전체개수")
+    @JsonProperty("total")
+    private Integer TOTAL;
+
+    @ApiModelProperty("현재 원활비율")
+    @JsonProperty("rate_ltc1")
+    private Double rateLtc1;
+
+    @ApiModelProperty("현재 지체비율")
+    @JsonProperty("rate_ltc2")
+    private Double rateLtc2;
+
+    @ApiModelProperty("현재 정체비율")
+    @JsonProperty("rate_ltc3")
+    private Double rateLtc3;
+
+    @ApiModelProperty("현재 정보없음비율")
+    @JsonProperty("rate_ltc0")
+    private Double rateLtc0;
+
+    @ApiModelProperty("가공시간대별 소통등급 개수")
+    @JsonProperty("traf")
+    private List<TrafPrcnStatVo> traf;
+
+    //@ApiModelProperty("운영자개입")
+    //@JsonProperty("oper01")
+    @JsonIgnore
+    private Integer oper01;
+
+    //@ApiModelProperty("UTIS1")
+    //@JsonProperty("utis01")
+    @JsonIgnore
+    private Integer utis01;
+
+    //@ApiModelProperty("UTIS2")
+    //@JsonProperty("utis02")
+    @JsonIgnore
+    private Integer utis02;
+
+    @ApiModelProperty("VDS")
+    @JsonProperty("vds01")
+    private Integer vds01;
+
+    @ApiModelProperty("DSRC")
+    @JsonProperty("dsrc01")
+    private Integer dsrc01;
+
+    @ApiModelProperty("경기도")
+    @JsonProperty("gits01")
+    private Integer gits01;
+
+    @ApiModelProperty("민간정보")
+    @JsonProperty("moct01")
+    private Integer moct01;
+
+    @ApiModelProperty("가공시간대별 수집원 개수")
+    @JsonProperty("clct")
+    private List<TrafClctStatVo> clct;
+
+    public void calcGradeRate(String PRCN_TM, int ltc1, int ltc2, int ltc3) {
+        this.PRCN_TM = PRCN_TM;
+        if (this.TOTAL == 0 || (ltc1+ltc2+ltc3) == 0) {
+            this.rateLtc0 = 100.;
+            this.rateLtc1 = 0.;
+            this.rateLtc2 = 0.;
+            this.rateLtc3 = 0.;
+            return;
+        }
+        int ltc0 = Math.max(0, this.TOTAL - ltc1 - ltc2 - ltc3);
+        float total = (float)this.TOTAL;
+        double tLtc0 = Double.parseDouble(String.format("%.1f", ltc0 / total * 100.0));
+        double tLtc1 = Double.parseDouble(String.format("%.1f", ltc1 / total * 100.0));
+        double tLtc2 = Double.parseDouble(String.format("%.1f", ltc2 / total * 100.0));
+        double tLtc3 = Double.parseDouble(String.format("%.1f", ltc3 / total * 100.0));
+        double fSum = tLtc0 + tLtc1 + tLtc2 + tLtc3;
+        double[] rates = { tLtc0, tLtc1, tLtc2, tLtc3 };
+        if (fSum > 100.0) {
+            for (int ii = 0; ii < 4; ii++) {
+                if (rates[ii] > 0.0) {
+                    rates[ii] -= (fSum - 100.0);
+                    break;
+                }
+            }
+        }
+        if (fSum < 100.0) {
+            for (int ii = 0; ii < 4; ii++) {
+                if (rates[ii] > 0.0) {
+                    rates[ii] += (100.0 - fSum);
+                    break;
+                }
+            }
+        }
+        this.rateLtc0 = rates[0];
+        this.rateLtc1 = rates[1];
+        this.rateLtc2 = rates[2];
+        this.rateLtc3 = rates[3];
+    }
+
+    public static TrafPrcnStatDto initBuilder(Integer PRCN_TYPE, Integer TOTAL) {
+        return TrafPrcnStatDto.builder()
+                .PRCN_TYPE(PRCN_TYPE)
+                .TOTAL(TOTAL)
+                .rateLtc0(0.)
+                .rateLtc1(0.)
+                .rateLtc2(0.)
+                .rateLtc3(0.)
+                .PRCN_TM("")
+                .traf(new ArrayList<>())
+                .oper01(0)
+                .utis01(0)
+                .utis02(0)
+                .vds01(0)
+                .dsrc01(0)
+                .gits01(0)
+                .moct01(0)
+                .clct(new ArrayList<>())
+                .build();
+    }
+
+    @Data
+    @Builder
+    public static class TrafPrcnStatVo implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        //@ApiModelProperty("구분(0:현재,1:어제,2:지난주)")
+        //@JsonProperty("prcn_type")
+        @JsonIgnore
+        private Integer PRCN_TYPE;
+
+        @ApiModelProperty("가공시각")
+        @JsonProperty("prcn_tm")
+        private String PRCN_TM;
+
+        @ApiModelProperty("정보없음갯수")
+        @JsonProperty("ltc0")
+        private Integer LTC0;
+
+        @ApiModelProperty("원활갯수")
+        @JsonProperty("ltc1")
+        private Integer LTC1;
+
+        @ApiModelProperty("지체갯수")
+        @JsonProperty("ltc2")
+        private Integer LTC2;
+
+        @ApiModelProperty("정체갯수")
+        @JsonProperty("ltc3")
+        private Integer LTC3;
+    }
+
+    @Data
+    @Builder
+    public static class TrafClctStatVo implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        @ApiModelProperty("가공시각")
+        @JsonProperty("prcn_tm")
+        private String PRCN_TM;
+
+        //@ApiModelProperty("운영자개입")
+        //@JsonProperty("oper01")
+        @JsonIgnore
+        private Integer oper01;
+
+        //@ApiModelProperty("UTIS1")
+        //@JsonProperty("utis01")
+        @JsonIgnore
+        private Integer utis01;
+
+        //@ApiModelProperty("UTIS2")
+        //@JsonProperty("utis02")
+        @JsonIgnore
+        private Integer utis02;
+
+        @ApiModelProperty("VDS")
+        @JsonProperty("vds01")
+        private Integer vds01;
+
+        @ApiModelProperty("DSRC")
+        @JsonProperty("dsrc01")
+        private Integer dsrc01;
+
+        @ApiModelProperty("경기도")
+        @JsonProperty("gits01")
+        private Integer gits01;
+
+        @ApiModelProperty("민간정보")
+        @JsonProperty("moct01")
+        private Integer moct01;
+
+    }
+
+}

+ 16 - 16
src/main/java/com/its/op/entity/its/scrs/TbScSgnlCtlr.java

@@ -269,22 +269,22 @@ public class TbScSgnlCtlr implements Serializable {
             dto.setSpclCntl(this.stts.getSpclCntl());
             dto.setCycl(this.stts.getCycl());
             dto.setOfst(this.stts.getOfst());
-//            dto.setAring1phas(this.stts.getAring1phas());
-//            dto.setAring2phas(this.stts.getAring1phas());
-//            dto.setAring3phas(this.stts.getAring2phas());
-//            dto.setAring4phas(this.stts.getAring3phas());
-//            dto.setAring5phas(this.stts.getAring4phas());
-//            dto.setAring6phas(this.stts.getAring5phas());
-//            dto.setAring7phas(this.stts.getAring6phas());
-//            dto.setAring8phas(this.stts.getAring7phas());
-//            dto.setBring1phas(this.stts.getBring1phas());
-//            dto.setBring2phas(this.stts.getBring2phas());
-//            dto.setBring3phas(this.stts.getBring3phas());
-//            dto.setBring4phas(this.stts.getBring4phas());
-//            dto.setBring5phas(this.stts.getBring5phas());
-//            dto.setBring6phas(this.stts.getBring6phas());
-//            dto.setBring7phas(this.stts.getBring7phas());
-//            dto.setBring8phas(this.stts.getBring8phas());
+            dto.setAring1phas(this.stts.getAring1phas());
+            dto.setAring2phas(this.stts.getAring1phas());
+            dto.setAring3phas(this.stts.getAring2phas());
+            dto.setAring4phas(this.stts.getAring3phas());
+            dto.setAring5phas(this.stts.getAring4phas());
+            dto.setAring6phas(this.stts.getAring5phas());
+            dto.setAring7phas(this.stts.getAring6phas());
+            dto.setAring8phas(this.stts.getAring7phas());
+            dto.setBring1phas(this.stts.getBring1phas());
+            dto.setBring2phas(this.stts.getBring2phas());
+            dto.setBring3phas(this.stts.getBring3phas());
+            dto.setBring4phas(this.stts.getBring4phas());
+            dto.setBring5phas(this.stts.getBring5phas());
+            dto.setBring6phas(this.stts.getBring6phas());
+            dto.setBring7phas(this.stts.getBring7phas());
+            dto.setBring8phas(this.stts.getBring8phas());
             dto.setPrstAringPhas(this.stts.getPrstAringPhas());
             dto.setPrstBringPhas(this.stts.getPrstBringPhas());
             dto.setCboxStts(this.stts.getCboxStts());

+ 6 - 7
src/main/java/com/its/op/scheduler/ItsApiScheduler.java

@@ -24,6 +24,7 @@ public class ItsApiScheduler {
     private final UnitSttsJobThread unitSttsJobThread;
     private final BaseDbmsJobThread baseDbmsJobThread;
     private final DbmsSttsJobThread dbmsSttsJobThread;
+    private final SigPhaseJobThread sigPhaseJobThread;
 
     @PreDestroy
     public void onShutDown() {
@@ -50,7 +51,6 @@ public class ItsApiScheduler {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
-
         if (this.jobConfig.isBaseDbms()) {
            this.baseDbmsJobThread.run();
        }
@@ -65,7 +65,6 @@ public class ItsApiScheduler {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
-
         if (this.jobConfig.isUnitStts()) {
             this.unitSttsJobThread.run();
         }
@@ -80,7 +79,6 @@ public class ItsApiScheduler {
         if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
-
         if (this.jobConfig.isFcltStts()) {
             this.fcltSttsJobThread.run();
         }
@@ -96,14 +94,15 @@ public class ItsApiScheduler {
             return;
         }
         this.dbmsSttsJobThread.run();
-//        if (this.jobConfig.isDbSvrStts()) {
-//            this.dbSvrSttsJobThread.run();
-//        }
     }
 
     @Async
-    @Scheduled(cron = "0/2 * * * * *")  // 2초 주기 작업 실행
+    @Scheduled(cron = "0/3 * * * * *")  // 2초 주기 작업 실행
     public void jobSignalPhaseCurrent() {
+        if (!this.applicationConfig.isStartSchedule()) {
+            return;
+        }
+        this.sigPhaseJobThread.run();
     }
 
 }

+ 5 - 3
src/main/java/com/its/op/scheduler/job/BaseDbmsJobThread.java

@@ -27,8 +27,7 @@ public class BaseDbmsJobThread {
 
     @Async("schJobExecutor")
     public void run() {
-
-        log.info("START: BaseDbmsJobThread.run: {}", Thread.currentThread().getName());
+        //log.info("START: BaseDbmsJobThread.run: {}", Thread.currentThread().getName());
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -40,6 +39,9 @@ public class BaseDbmsJobThread {
         vmsIfscManager.load();
 
         stopWatch.stop();
-        log.info("--END: BaseDbmsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        long totalTimeMillis = stopWatch.getTotalTimeMillis();
+        if (totalTimeMillis > 2000) {
+            log.info("--END: BaseDbmsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        }
     }
 }

+ 5 - 3
src/main/java/com/its/op/scheduler/job/DbmsSttsJobThread.java

@@ -31,8 +31,7 @@ public class DbmsSttsJobThread {
 
     @Async("schJobExecutor")
     public void run() {
-
-        log.info("START: DbmsSttsJobThread.run: {}", Thread.currentThread().getName());
+        //log.info("START: DbmsSttsJobThread.run: {}", Thread.currentThread().getName());
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -99,7 +98,10 @@ public class DbmsSttsJobThread {
         });
 
         stopWatch.stop();
-        log.info("--END: DbmsSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        long totalTimeMillis = stopWatch.getTotalTimeMillis();
+        if (totalTimeMillis > 2000) {
+            log.info("--END: DbmsSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        }
     }
 
     public void updateDbmsStts(TbDbmsSttsDto obj) {

+ 5 - 3
src/main/java/com/its/op/scheduler/job/FcltSttsJobThread.java

@@ -34,8 +34,7 @@ public class FcltSttsJobThread {
 
     @Async("schJobExecutor")
     public void run() {
-
-        log.info("START: FcltSttsJobThread.run: {}", Thread.currentThread().getName());
+        //log.info("START: FcltSttsJobThread.run: {}", Thread.currentThread().getName());
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -52,6 +51,9 @@ public class FcltSttsJobThread {
         }
 
         stopWatch.stop();
-        log.info("--END: FcltSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        long totalTimeMillis = stopWatch.getTotalTimeMillis();
+        if (totalTimeMillis > 2000) {
+            log.info("--END: FcltSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        }
     }
 }

+ 58 - 0
src/main/java/com/its/op/scheduler/job/SigPhaseJobThread.java

@@ -0,0 +1,58 @@
+package com.its.op.scheduler.job;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.op.dto.its.scrs.TbScSgnlCtlrPhaseDto;
+import com.its.op.service.its.scrs.TbScSgnlCtlrService;
+import com.its.op.websocket.ItsWebSocketMessage;
+import com.its.op.websocket.ItsWebSocketSessionManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
+import org.springframework.web.socket.TextMessage;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SigPhaseJobThread {
+
+    private final Environment environment;
+    private final TbScSgnlCtlrService service;
+    private ObjectMapper mapper;
+
+    @PostConstruct
+    private void init() {
+        this.mapper = new ObjectMapper();
+        log.info("{}", this);
+    }
+
+    @Async("schJobExecutor")
+    public void run() {
+        //log.info("START: SigPhaseJobThread.run: {}", Thread.currentThread().getName());
+
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        List<TbScSgnlCtlrPhaseDto> sigPhaseDto = this.service.findAllPhaseList();
+        ItsWebSocketMessage itsMessage = new ItsWebSocketMessage("sigPhaseStts", sigPhaseDto);
+        try {
+            String itsSttsJsonData = this.mapper.writeValueAsString(itsMessage);
+            ItsWebSocketSessionManager.getInstance().sendBroadcastSigPhaseMessage(itsMessage.getCommand(), new TextMessage(itsSttsJsonData));
+        }
+        catch(JsonProcessingException e){
+            log.error("SigPhaseJobThread TbScSgnlCtlrPhaseDto Json parsing Exception: {}", sigPhaseDto);
+        }
+
+        stopWatch.stop();
+        long totalTimeMillis = stopWatch.getTotalTimeMillis();
+        if (totalTimeMillis > 2000) {
+            log.warn("--END: SigPhaseJobThread.run: {}, {} ms.", Thread.currentThread().getName(), totalTimeMillis);
+        }
+    }
+}

+ 5 - 3
src/main/java/com/its/op/scheduler/job/UnitSttsJobThread.java

@@ -35,8 +35,7 @@ public class UnitSttsJobThread {
 
     @Async("schJobExecutor")
     public void run() {
-
-        log.info("START: UnitSttsJobThread.run: {}", Thread.currentThread().getName());
+        //log.info("START: UnitSttsJobThread.run: {}", Thread.currentThread().getName());
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
@@ -53,6 +52,9 @@ public class UnitSttsJobThread {
         }
 
         stopWatch.stop();
-        log.info("--END: UnitSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        long totalTimeMillis = stopWatch.getTotalTimeMillis();
+        if (totalTimeMillis > 1000) {
+            log.info("--END: UnitSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+        }
     }
 }

+ 374 - 0
src/main/java/com/its/op/service/its/TrafPrcsTime.java

@@ -0,0 +1,374 @@
+package com.its.op.service.its;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+@Slf4j
+@Getter
+@Setter
+@Service
+public class TrafPrcsTime {
+
+	/*
+	 * 모든 시각은 'YYYYMMDDHH24MISS' 형태로 사용한다.
+	 */
+
+	/*
+	 *  데이터베이스에 입력 또는 데어터 조회 하는 시각을 설정하기 위해 사용한다.
+	 */
+	private String currTime;			/* 20170718153504 - 현재시각 */
+	private String currFiveMin;			/* 20170718153500 - 현재시각 - 초를 00으로 초기화한 현재 정주기 5분 시각 */
+	private String prevFiveMin;			/* 20170718153000 - 이전 정주기 5분 시각 */
+	private String prcsFiveMin;			/* 20170718153500 - 현재 정주기 5분 시각 - 시스템에 따라 5분 이전시각이 될수 있고 현재 정주기 5분 시각이 될수 있다. */
+	private String prcsFiveMinFrom; 	/* 20170718153000 - 이전 정주기 5분 시각 */
+	private String prcsFiveMinTo;   	/* 20170718153459 - 이전 정주기 5분 시각 + 4분 59초 */
+	private String prcs10Min;
+
+	private String prcsDayWeekCd;
+	private int    prcsDayWeek;			/* 요일 유형 - prcsFiveMin */
+	private String prcsDayQuater;		/* 분기 - prcsFiveMin */
+
+	private String stat15MinTime;
+	private String stat15MinFrom;
+	private String stat15MinTo;
+
+	private String statHourTime;
+	private String statHourFrom;
+	private String statHourTo;
+
+	private String statDayTime;
+	private String statDayFrom;
+	private String statDayTo;
+
+	private String statMonTime;
+	private String statMonFrom;
+	private String statMonTo;
+
+	private String statYearTime;
+	private String statYearFrom;
+	private String statYearTo;
+
+	private boolean isStat15Min = false;
+	private boolean isStatHour  = false;
+	private boolean isStatDay   = false;
+	private boolean isStatMon   = false;
+	private boolean isStatYear  = false;
+
+	private boolean changePtrnMonth;
+
+	private boolean isPatternUpdate = false;
+	
+	private boolean isProcessing = false;
+	private Date    startDate;
+	private Date    endDate;
+
+	private String ptrn05M;
+	private String ptrn15M;
+
+	public TrafPrcsTime() {
+		startDate = new Date();
+		endDate   = new Date();
+	}
+
+	public void setProcessing(boolean isProcessing) {
+		this.isProcessing = isProcessing;
+		if (this.isProcessing) {
+			startDate = new Date();
+		}
+		else {
+			endDate = new Date();
+		}
+	}
+
+	public Date convertString2Date(String paramTime) {
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+		Date to = null;
+		try {
+			to = transFormat.parse(paramTime);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return to;
+	}
+
+	public String getDateToString(Date paramDt, String paramFmt) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(paramDt);
+		return new SimpleDateFormat(paramFmt).format(cal.getTime());
+	}
+	public String getCurrFiveMinString(Date paramDt) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(paramDt);
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		int min = cal.get(Calendar.MINUTE);
+		cal.add(Calendar.MINUTE, -(min % 5));
+		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+	}
+
+	public String calDate(String paramTm, int addSec/*초단위*/) {
+		String result = paramTm;
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+		try {
+			Date to = new Date();
+			addSec = addSec * 1000;	/* mili-second로 변환 */
+			to.setTime(transFormat.parse(paramTm).getTime() + addSec);
+			result = getDateToString(to, "yyyyMMddHHmmss");
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	public String calDateFormat(String paramFmt, String paramTm, int addSec) {
+		String result = paramTm;
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+		try {
+			Date to = new Date();
+			addSec = addSec * 1000;	/* mili-second로 변환 */
+			to.setTime(transFormat.parse(paramTm).getTime() + addSec);
+			result = getDateToString(to, paramFmt);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	public String calLastDayFormat(String paramFmt, String paramTm) {
+		String result = paramTm;
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+		try {
+			Date to = new Date();
+			to.setTime(transFormat.parse(paramTm).getTime());
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(to);
+			int day = cal.getActualMaximum(Calendar.DATE);
+			
+			cal.set(Calendar.DAY_OF_MONTH, day);
+			return new SimpleDateFormat(paramFmt).format(cal.getTime());
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	public String getCurrentTimeString() {
+		Calendar cal = Calendar.getInstance();
+		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+	}
+
+	public void initValue() {
+		this.currTime    = "";
+		this.currFiveMin = "";
+		this.prevFiveMin = "";
+
+		this.prcsFiveMin     = "";
+		this.prcsFiveMinFrom = "";
+		this.prcsFiveMinTo   = "";
+
+		this.prcsDayWeek   = 0;		/* 요일 유형 */
+		this.prcsDayQuater = "";		/* 분기 */
+
+		this.stat15MinTime = "";
+		this.stat15MinFrom = "";
+		this.stat15MinTo   = "";
+
+		this.statHourTime  = "";
+		this.statHourFrom  = "";
+		this.statHourTo    = "";
+
+		this.statDayTime   = "";
+		this.statDayFrom   = "";
+		this.statDayTo     = "";
+
+		this.statMonTime   = "";
+		this.statMonFrom   = "";
+		this.statMonTo     = "";
+
+		this.statYearTime   = "";
+		this.statYearFrom   = "";
+		this.statYearTo     = "";
+
+		this.isStat15Min = false;
+		this.isStatHour  = false;
+		this.isStatDay   = false;
+		this.isStatMon   = false;
+		this.isStatYear  = false;
+		
+		this.isPatternUpdate = false;
+	}
+	public void init() {
+
+		initValue();
+
+		/*
+		 * 시간대 계산은 아직 안함(추후 시간대 계산이 필요하면 여기서 하면 됨)
+		 */
+		this.currTime = getCurrentTimeString();										/* 20170718153504 - 현재시각 */
+		this.currFiveMin = getCurrFiveMinString(convertString2Date(this.currTime));	/* 20170718153500 */
+		this.prevFiveMin = calDate(this.currFiveMin, -60*5); 				/* 20170718153000 - 이전 정주기 5분 시각 */
+
+		String beforeOneWeek = calDate(this.currTime, -60*60*24*7);			/* 7일전 */
+		this.ptrn05M = getCurrFiveMinString(convertString2Date(beforeOneWeek));		/* 7일전 정주기 05분 패턴 시각 */
+		this.ptrn15M = calDate(this.ptrn05M, -60*15);						/* 7일전 정주기 15분 패턴 시각 */
+
+		this.prcsFiveMin     = this.prevFiveMin;									/* 20170718153000 - 이전 정주기 5분 시각 이용하여 입력 */
+		this.prcsFiveMinFrom = this.prevFiveMin;									/* 20170718153000 - 이전 정주기 5분 시각 */
+		this.prcsFiveMinTo   = calDate(this.currFiveMin, -1);				/* 20170718153459 - 현재 정주기 시각에서 -1초 */
+
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(convertString2Date(this.currFiveMin));							/* 년월일시분초는 현재시각 기준으로 계산 */
+		int year  = cal.get(Calendar.YEAR);
+		int month = cal.get(Calendar.MONTH) + 1;
+		int day   = cal.get(Calendar.DAY_OF_MONTH);
+		int hour  = cal.get(Calendar.HOUR_OF_DAY);	// 24시간제, HOUR: 12시간제
+		int min   = cal.get(Calendar.MINUTE);
+		int sec   = cal.get(Calendar.SECOND);
+
+		String strCurrTime = String.format("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec);
+		log.info("[PROCESSING] TrafficProcessingTime.init: {}", strCurrTime);
+
+		cal.setTime(convertString2Date(this.prcsFiveMin));		/* 요일, 사사분기는 가공시각을 기준으로 계산 */
+		this.prcsDayWeek   = cal.get(Calendar.DAY_OF_WEEK);		/* DAY_OF_WEEK 리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다. */
+		this.prcsDayQuater = String.valueOf((month/3)+1);
+
+		/*
+		 * 5분 정주기 가공이 끝나고 15분 주기일 경우(00, 15, 30, 45 분 일경우 15분 통계 정보를 생성한다)
+		 */
+		if (min % 15 == 0) {
+			this.isStat15Min = true;
+		}
+		this.prcs10Min = calDate(this.currFiveMin, -60*10);
+		this.stat15MinFrom = calDate(this.currFiveMin, -60*15);
+		this.stat15MinTo   = calDate(this.stat15MinFrom,   (60*15)-1);
+		this.stat15MinTime = this.stat15MinFrom;
+
+		/*
+		 * 매시 5분 가공이 끝나면 1시간 통계 정보를 생성한다.
+		 */
+		if (min == 5) {
+			this.isStatHour = true;
+		}
+		String statHour = calDateFormat("yyyyMMddHH", this.currFiveMin, -60*60);
+		this.statHourFrom = statHour + "0000";
+		this.statHourTo   = statHour + "5959";
+		this.statHourTime = this.statHourFrom;
+
+		/*
+		 * 00시 10분 가공이 끝나면 이전일의 통계 정보를 가공.
+		 */
+		if (hour == 0 && min == 10) {
+			this.isStatDay = true;
+		}
+		String statDay = calDateFormat("yyyyMMdd", this.currFiveMin, -60*60*24);
+		this.statDayFrom = statDay + "000000";
+		this.statDayTo   = statDay + "235959";
+		this.statDayTime = statDay + "000000";
+
+		/*
+		 * 01시 10분 가공이 끝나면 이전일의 월통계 정보를 누적 가공.
+		 */
+		if (hour == 1 && min == 10) {
+			this.isStatMon = true;
+		}
+		this.statMonFrom = calDateFormat("yyyyMM", this.currFiveMin, -60*60*24) + "01000000";
+		this.statMonTo   = calLastDayFormat("yyyyMMdd", this.statMonFrom)                +   "235959";
+		this.statMonTime = calDateFormat("yyyyMM", this.currFiveMin, -60*60*24) + "00000000";
+
+		/*
+		 * 02시 5분 가공이 끝나면 이전일의 연통계 정보를 누적 가공.
+		 */
+		if (hour == 2 && min == 10) {
+			this.isStatYear = true;
+		}
+		this.statYearTime = calDateFormat("yyyy", this.currFiveMin, -60*60*24);
+		this.statYearFrom = this.statYearTime + "0101000000";
+		this.statYearTo   = this.statYearTime + "1231235959";
+		this.statYearTime = this.statYearTime + "0000000000";
+
+		/*
+		 * 패턴업데이트 시각 체크: 매일 새벽 3시 10분
+		 */
+		if (hour == 3 && min == 10) {
+			this.isPatternUpdate = true;
+		}
+	}
+
+	public String getStat15M(String prcsDt) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(convertString2Date(prcsDt));
+		int year  = cal.get(Calendar.YEAR);
+		int month = cal.get(Calendar.MONTH) + 1;
+		int day   = cal.get(Calendar.DAY_OF_MONTH);
+		int hour  = cal.get(Calendar.HOUR_OF_DAY);	// 24시간제, HOUR: 12시간제
+		int min = cal.get(Calendar.MINUTE);
+		min = (int)(min / 15);
+		min = min * 15;
+
+		return String.format("%04d%02d%02d%02d%02d00", year, month, day, hour, min);
+	}
+
+	/* 정주기 현재 5분 시각 */
+	public String getCurrentFiveMinString() {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		int min = cal.get(Calendar.MINUTE);
+		cal.add(Calendar.MINUTE, -(min % 5));
+		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+	}
+	public String getCurrentFiveMinToString() {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		int min = cal.get(Calendar.MINUTE);
+		cal.add(Calendar.MINUTE, -(min % 5));
+		cal.add(Calendar.SECOND, -1);	/* 정주기 현재 5분 시각에서 1초를 뺀 시각 */
+		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+	}
+
+	/* 정주기 이전 5분 시각 */
+	public String getBeforeFiveMinString() {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		int min = cal.get(Calendar.MINUTE);
+		cal.add(Calendar.MINUTE, -(min % 5) - 5);	/* 정주기 현재 5분에서 5분을 뺀 시각 */
+		return new SimpleDateFormat("yyyyMMddHHmmss").format(cal.getTime());
+	}
+
+	/* 현재 시각을 문자열로 리턴 */
+	public String getCurrentTimeString(String parmaFmt) {
+		Calendar cal = Calendar.getInstance();
+		return new SimpleDateFormat(parmaFmt).format(cal.getTime());
+	}
+	
+	/* 현재 시각을 Date 형으로 리턴 */
+	public Date getCurrentDate() {
+		Calendar cal = Calendar.getInstance();
+		return cal.getTime();
+	}
+
+	/* 현재 시각을 second 로 리턴 */
+	public long getCurrentTimeSeconds() {
+		Calendar cal = Calendar.getInstance();
+		return cal.getTimeInMillis();
+		//return System.currentTimeMillis();
+	}
+
+	public int getDayWeek(String paramDt) {
+		return getDayWeek(convertString2Date(paramDt));
+	}
+	public int getDayWeek(Date paramDt) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(paramDt);
+		return cal.get(Calendar.DAY_OF_WEEK);		/* DAY_OF_WEEK 리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다. */
+	}
+}

+ 1 - 0
src/main/java/com/its/op/service/its/analysis/PtrnDataService.java

@@ -23,6 +23,7 @@ public class PtrnDataService {
     private final PtrnDataMapper mapper;
     private final TbCmmnCdService cmmnCdService;
 
+    @Transactional(readOnly = true)
     public List<PtrnDataDto> findAllByDateRange(PtrnDataParam cond) throws NoSuchElementException {
 
         if ("LINK".equalsIgnoreCase(cond.getPTRN_TYPE())) {

+ 126 - 4
src/main/java/com/its/op/service/its/dashboard/DashboardService.java

@@ -1,11 +1,16 @@
 package com.its.op.service.its.dashboard;
 
 import com.its.op.dao.mapper.its.dashboard.DashboardMapper;
+import com.its.op.dao.repository.its.ifsc.TbIfscRepository;
 import com.its.op.dto.its.dashboard.CmtrGradCountSttsDto;
+import com.its.op.dto.its.dashboard.TrafPrcnStatDto;
+import com.its.op.service.its.TrafPrcsTime;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j
@@ -13,7 +18,9 @@ import java.util.List;
 @Service
 public class DashboardService {
 
-    private final DashboardMapper repo;
+    private final DashboardMapper mapper;
+    private final TbIfscRepository repo;
+    private final TrafPrcsTime prcsTime;
 
     protected void checkGradeRate(List<CmtrGradCountSttsDto> result) {
         result.forEach(obj -> {
@@ -61,8 +68,9 @@ public class DashboardService {
      * 소틍등급상태 링크
      * @return
      */
+    @Transactional(readOnly = true)
     public List<CmtrGradCountSttsDto> findAllCmtrGradCountSttsLink() {
-        List<CmtrGradCountSttsDto> result = this.repo.findAllCmtrGradCountSttsLink();
+        List<CmtrGradCountSttsDto> result = this.mapper.findAllCmtrGradCountSttsLink();
         checkGradeRate(result);
         return result;
     }
@@ -71,8 +79,9 @@ public class DashboardService {
      * 소틍등급상태 정보제공구간
      * @return
      */
+    @Transactional(readOnly = true)
     public List<CmtrGradCountSttsDto> findAllCmtrGradCountSttsIfsc() {
-        List<CmtrGradCountSttsDto> result = this.repo.findAllCmtrGradCountSttsIfsc();
+        List<CmtrGradCountSttsDto> result = this.mapper.findAllCmtrGradCountSttsIfsc();
         checkGradeRate(result);
         return result;
     }
@@ -81,9 +90,122 @@ public class DashboardService {
      * 소틍등급상태 도로
      * @return
      */
+    @Transactional(readOnly = true)
     public List<CmtrGradCountSttsDto> findAllCmtrGradCountSttsRoad() {
-        List<CmtrGradCountSttsDto> result = this.repo.findAllCmtrGradCountSttsRoad();
+        List<CmtrGradCountSttsDto> result = this.mapper.findAllCmtrGradCountSttsRoad();
         checkGradeRate(result);
         return result;
     }
+
+    /**
+     * 정보제공구간소통등급현황조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TrafPrcnStatDto> findAllTrafPrcnStatAll() {
+        List<TrafPrcnStatDto> result = new ArrayList<>();
+        Integer total = this.repo.findAllCount();
+        TrafPrcnStatDto dto0 = TrafPrcnStatDto.initBuilder(0, total);
+        TrafPrcnStatDto dto1 = TrafPrcnStatDto.initBuilder(1, total);
+        TrafPrcnStatDto dto2 = TrafPrcnStatDto.initBuilder(2, total);
+        result.add(0, dto0);
+        result.add(1, dto1);
+        result.add(2, dto2);
+
+        this.prcsTime.init();
+        String prcs05M = this.prcsTime.getPrcsFiveMin().substring(8, 12);
+        String prcs10M = this.prcsTime.getPrcs10Min().substring(8, 12);
+        String prcnTM = prcs05M;
+        int[] ltc00 = { 0, 0, 0};
+        int[] ltc01 = { 0, 0, 0};
+        int[] ltc02 = { 0, 0, 0};
+
+        int[] ltc10 = { 0, 0, 0};
+        int[] ltc11 = { 0, 0, 0};
+        int[] ltc12 = { 0, 0, 0};
+
+        List<TrafPrcnStatDto.TrafPrcnStatVo> data = this.mapper.findAllTrafPrcnStatAll();
+        for(TrafPrcnStatDto.TrafPrcnStatVo obj : data) {
+            TrafPrcnStatDto dto = result.get(obj.getPRCN_TYPE());
+            if (dto != null) {
+                dto.getTraf().add(TrafPrcnStatDto.TrafPrcnStatVo.builder()
+                        .PRCN_TYPE(obj.getPRCN_TYPE())
+                        .PRCN_TM(obj.getPRCN_TM())
+                        .LTC1(obj.getLTC1())
+                        .LTC2(obj.getLTC2())
+                        .LTC3(obj.getLTC3())
+                        .LTC0(Math.max(0, total-obj.getLTC1()-obj.getLTC2()-obj.getLTC3()))
+                        .build());
+
+                if (prcs05M.equals(obj.getPRCN_TM())) {
+                    if (obj.getPRCN_TYPE() == 0) {
+                        ltc00[0] = obj.getLTC1();
+                        ltc00[1] = obj.getLTC2();
+                        ltc00[2] = obj.getLTC3();
+                    } else if (obj.getPRCN_TYPE() == 1) {
+                        ltc01[0] = obj.getLTC1();
+                        ltc01[1] = obj.getLTC2();
+                        ltc01[2] = obj.getLTC3();
+                    } else if (obj.getPRCN_TYPE() == 2) {
+                        ltc02[0] = obj.getLTC1();
+                        ltc02[1] = obj.getLTC2();
+                        ltc02[2] = obj.getLTC3();
+                    }
+                }
+                if (prcs10M.equals(obj.getPRCN_TM())) {
+                    if (obj.getPRCN_TYPE() == 0) {
+                        ltc10[0] = obj.getLTC1();
+                        ltc10[1] = obj.getLTC2();
+                        ltc10[2] = obj.getLTC3();
+                    } else if (obj.getPRCN_TYPE() == 1) {
+                        ltc11[0] = obj.getLTC1();
+                        ltc11[1] = obj.getLTC2();
+                        ltc11[2] = obj.getLTC3();
+                    } else if (obj.getPRCN_TYPE() == 2) {
+                        ltc12[0] = obj.getLTC1();
+                        ltc12[1] = obj.getLTC2();
+                        ltc12[2] = obj.getLTC3();
+                    }
+                }
+            }
+        }
+
+        /**
+         * 가공시각이 엇나갔을 경우 대비(쓸데 없는 짓)
+         */
+//        log.error("{}, {}, {}, {}", ltc00[0], ltc00[1], ltc00[2], prcs05M);
+//        log.error("{}, {}, {}, {}", ltc10[0], ltc10[1], ltc10[2], prcs10M);
+        if (ltc00[0] == 0 && ltc00[1] == 0 && ltc00[2] == 0) {
+            if (ltc10[0] != 0 || ltc10[1] != 0 || ltc10[2] != 0) {
+                for (int ii = 0; ii < 3; ii++) {
+                    ltc00[ii] = ltc10[ii];
+                    ltc01[ii] = ltc11[ii];
+                    ltc02[ii] = ltc12[ii];
+                }
+                prcnTM = prcs10M;
+            }
+        }
+//        log.error("{}, {}, {}, {}", ltc00[0], ltc00[1], ltc00[2], prcnTM);
+//        log.error("{}, {}, {}, {}", ltc10[0], ltc10[1], ltc10[2], prcnTM);
+
+        List<TrafPrcnStatDto.TrafClctStatVo> clct = this.mapper.findAllTrafClctStatAll();
+        for(TrafPrcnStatDto.TrafClctStatVo obj : clct) {
+            dto0.getClct().add(obj);
+            if (prcnTM.equals(obj.getPRCN_TM())) {
+                dto0.setOper01(obj.getOper01());
+                dto0.setUtis01(obj.getUtis01());
+                dto0.setUtis02(obj.getUtis02());
+                dto0.setVds01(obj.getVds01());
+                dto0.setDsrc01(obj.getDsrc01());
+                dto0.setGits01(obj.getGits01());
+                dto0.setMoct01(obj.getMoct01());
+            }
+        }
+        dto0.calcGradeRate(prcnTM, ltc00[0], ltc00[1], ltc00[2]);
+        dto1.calcGradeRate(prcnTM, ltc01[0], ltc01[1], ltc01[2]);
+        dto2.calcGradeRate(prcnTM, ltc02[0], ltc02[1], ltc02[2]);
+
+        return result;
+    }
+
 }

+ 7 - 0
src/main/java/com/its/op/websocket/ItsWebSocketSessionManager.java

@@ -65,4 +65,11 @@ public class ItsWebSocketSessionManager {
             value.sendMessage(command, message);
         });
     }
+
+    public void sendBroadcastSigPhaseMessage(String command, TextMessage message) {
+        this.sessionMap.forEach((key, value) -> {
+            log.info("{}, {}, {}", command, message, key);
+            value.sendMessage(command, message);
+        });
+    }
 }

+ 55 - 0
src/main/resources/mybatis/mapper/its/dashboard/DashboardMapper.xml

@@ -75,4 +75,59 @@
         ]]>
     </select>
 
+    <select id="findAllTrafPrcnStatAll" resultType="com.its.op.dto.its.dashboard.TrafPrcnStatDto$TrafPrcnStatVo">
+        <![CDATA[
+        SELECT 0 AS PRCN_TYPE, A.PRCN_TM, NVL(B.IFSC_LIGT_NUM, 0) AS LTC1, NVL(B.IFSC_DELY_NUM, 0) AS LTC2, NVL(B.IFSC_CNGS_NUM, 0) AS LTC3, 0 AS LTC0
+        FROM (SELECT PRCN_TM FROM TB_PRCN_TM WHERE TM_TYPE = '5M') A
+                 LEFT OUTER JOIN
+             (SELECT SUBSTR(PRCN_DT, 9, 4) AS PRCN_TM, IFSC_LIGT_NUM, IFSC_DELY_NUM, IFSC_CNGS_NUM
+              FROM TB_TRAF_PRCN_STAT
+              WHERE PRCN_DT BETWEEN TO_CHAR(SYSDATE, 'YYYYMMDD') || '000000' AND TO_CHAR(SYSDATE, 'YYYYMMDD') || '235959') B
+             ON A.PRCN_TM = B.PRCN_TM
+        UNION ALL
+        SELECT 1 AS PRCN_TYPE, A.PRCN_TM, NVL(B.IFSC_LIGT_NUM, 0) AS LTC1, NVL(B.IFSC_DELY_NUM, 0) AS LTC2, NVL(B.IFSC_CNGS_NUM, 0) AS LTC3, 0 AS LTC0
+        FROM (SELECT PRCN_TM FROM TB_PRCN_TM WHERE TM_TYPE = '5M') A
+                 LEFT OUTER JOIN
+             (SELECT SUBSTR(PRCN_DT, 9, 4) AS PRCN_TM, IFSC_LIGT_NUM, IFSC_DELY_NUM, IFSC_CNGS_NUM
+              FROM TB_TRAF_PRCN_STAT
+              WHERE PRCN_DT BETWEEN TO_CHAR(SYSDATE-1, 'YYYYMMDD') || '000000' AND TO_CHAR(SYSDATE-1, 'YYYYMMDD') || '235959') B
+             ON A.PRCN_TM = B.PRCN_TM
+        UNION ALL
+        SELECT 2 AS PRCN_TYPE, A.PRCN_TM, NVL(B.IFSC_LIGT_NUM, 0) AS LTC1, NVL(B.IFSC_DELY_NUM, 0) AS LTC2, NVL(B.IFSC_CNGS_NUM, 0) AS LTC3, 0 AS LTC0
+        FROM (SELECT PRCN_TM FROM TB_PRCN_TM WHERE TM_TYPE = '5M') A
+                 LEFT OUTER JOIN
+             (SELECT SUBSTR(PRCN_DT, 9, 4) AS PRCN_TM, IFSC_LIGT_NUM, IFSC_DELY_NUM, IFSC_CNGS_NUM
+              FROM TB_TRAF_PRCN_STAT
+              WHERE PRCN_DT BETWEEN TO_CHAR(SYSDATE-7, 'YYYYMMDD') || '000000' AND TO_CHAR(SYSDATE-7, 'YYYYMMDD') || '235959') B
+             ON A.PRCN_TM = B.PRCN_TM
+        ]]>
+    </select>
+
+    <select id="findAllTrafClctStatAll" resultType="com.its.op.dto.its.dashboard.TrafPrcnStatDto$TrafClctStatVo">
+        <![CDATA[
+        SELECT A.PRCN_TM,
+               NVL(B.oper01, 0) AS oper01,
+               NVL(B.utis01, 0) AS utis01,
+               NVL(B.utis02, 0) AS utis02,
+               NVL(B.vds01,  0) AS vds01,
+               NVL(B.dsrc01, 0) AS dsrc01,
+               NVL(B.gits01, 0) AS gits01,
+               NVL(B.moct01, 0) AS moct01
+        FROM (SELECT PRCN_TM FROM TB_PRCN_TM WHERE TM_TYPE = '5M') A
+                 LEFT OUTER JOIN
+             (SELECT SUBSTR(PRCN_DT, 9, 4) AS PRCN_TM,
+                     nvl(sum(case when CLCT_SYST_CD = 'OPER01' then CLCT_NUM end), 0) AS oper01,
+                     nvl(sum(case when CLCT_SYST_CD = 'UTIS01' then CLCT_NUM end), 0) AS utis01,
+                     nvl(sum(case when CLCT_SYST_CD = 'UTIS02' then CLCT_NUM end), 0) AS utis02,
+                     nvl(sum(case when CLCT_SYST_CD = 'VDS01'  then CLCT_NUM end), 0) AS vds01,
+                     nvl(sum(case when CLCT_SYST_CD = 'DSRC01' then CLCT_NUM end), 0) AS dsrc01,
+                     nvl(sum(case when CLCT_SYST_CD = 'GITS01' then CLCT_NUM end), 0) AS gits01,
+                     nvl(sum(case when CLCT_SYST_CD = 'MOCT01' then CLCT_NUM end), 0) AS moct01
+              FROM TB_CLCT_SYST_STTS_HS
+              WHERE PRCN_DT BETWEEN TO_CHAR(SYSDATE-1, 'YYYYMMDD') || '000000' AND TO_CHAR(SYSDATE-1, 'YYYYMMDD') || '235959'
+              GROUP BY PRCN_DT) B
+             ON A.PRCN_TM = B.PRCN_TM
+        ]]>
+    </select>
+
 </mapper>

+ 1 - 1
src/main/resources/mybatis/mapper/its/dbms/DbmsSttsMapper.xml

@@ -30,7 +30,7 @@
               FROM DBA_FREE_SPACE Y
               GROUP BY Y.TABLESPACE_NAME) B
         WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
-          AND A.TABLESPACE_NAME NOT IN ('UNDO', 'UNDO0', 'UNDO1', 'USR', 'TEMP', 'SYSTEM', 'SYSAUX', 'USERS', 'UNDOTBS1')
+          AND A.TABLESPACE_NAME NOT IN ('UNDO', 'UNDO0', 'UNDO1', 'USR', 'TEMP', 'SYSTEM', 'SYSAUX', 'USERS', 'UNDOTBS1', 'UNDOTBS2')
         ]]>
     </select>
 

+ 8 - 0
src/test/java/com/its/op/ItsOpServerApplicationTests.java

@@ -80,4 +80,12 @@ public class ItsOpServerApplicationTests {
         log.info("{}", AES256Util.encryptSHA256("yonginits"));
         log.info("{}", AES256Util.encryptSHA256("yonginits"));
     }
+
+    @Test
+    void test9() {
+        int ltc1 = 2933;
+        int TOTAL = 4361;
+        double tLtc1 = Double.parseDouble(String.format("%.1f", ltc1 / TOTAL * 100.0));
+        log.error("{}, {}, {}, {}", ltc1, TOTAL, tLtc1, (ltc1 / (float)TOTAL * 100.0));
+    }
 }