shjung 2 年之前
父节点
当前提交
cefcdf3b7c

+ 15 - 6
src/main/java/com/its/op/controller/its/common/CommonSttsController.java

@@ -4,8 +4,10 @@ import com.its.op.dto.its.common.FcltSttsListDto;
 import com.its.op.dto.its.common.SttsCommErrDto;
 import com.its.op.dto.its.dbms.TbDbmsSttsDto;
 import com.its.op.dto.its.unit.TbUnitSystSttsDto;
+import com.its.op.service.its.cctv.TbCctvCtlrService;
 import com.its.op.service.its.common.CommonSttsService;
 import com.its.op.service.its.dbms.TbDbmsSttsService;
+import com.its.op.service.its.rse.TbRseCtlrService;
 import com.its.op.service.its.unit.TbUnitSystService;
 import com.its.op.service.its.vds.TbVdsCtlrService;
 import com.its.op.service.its.vms.TbVmsCtlrService;
@@ -28,9 +30,10 @@ public class CommonSttsController {
 
     private final CommonSttsService service;
     private final TbDbmsSttsService dbmsSttsService;
-    //private final TbCctvCtlrService cctvService;
+    private final TbCctvCtlrService cctvService;
     private final TbVmsCtlrService vmsService;
     private final TbVdsCtlrService vdsService;
+    private final TbRseCtlrService rseService;
     private final TbUnitSystService unitSystService;
 
     @ApiOperation(value = "ITS 프로세스 상태", response = TbUnitSystSttsDto.class, responseContainer = "ArrayList")
@@ -51,11 +54,11 @@ public class CommonSttsController {
         return this.service.findAllFcltSttsTotal();
     }
 
-//    @ApiOperation(value = "CCTV 통신상태(장애)", response = SttsCommErrDto.class, responseContainer = "ArrayList")
-//    @GetMapping(value = "/cctv/error", produces = {"application/json; charset=utf8"})
-//    public List<SttsCommErrDto> findAllCctvCommError() {
-//        return this.cctvService.findAllListCommError();
-//    }
+    @ApiOperation(value = "CCTV 통신상태(장애)", response = SttsCommErrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/cctv/error", produces = {"application/json; charset=utf8"})
+    public List<SttsCommErrDto> findAllCctvCommError() {
+        return this.cctvService.findAllListCommError();
+    }
 
     @ApiOperation(value = "VMS 통신상태(장애)", response = SttsCommErrDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/vms/error", produces = {"application/json; charset=utf8"})
@@ -69,6 +72,12 @@ public class CommonSttsController {
         return this.vdsService.findAllListCommError();
     }
 
+    @ApiOperation(value = "RSE 통신상태(장애)", response = SttsCommErrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/rse/error", produces = {"application/json; charset=utf8"})
+    public List<SttsCommErrDto> findAllRseCommError() {
+        return this.rseService.findAllListCommError();
+    }
+
     // TODO
     @ApiOperation(value = "DBMS STTS", response = TbDbmsSttsDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/dbms", produces = {"application/json; charset=utf8"})

+ 44 - 0
src/main/java/com/its/op/controller/its/facility/TbFcltSttsAlrmStupController.java

@@ -0,0 +1,44 @@
+package com.its.op.controller.its.facility;
+
+import com.its.op.dto.its.facility.TbFcltSttsAlrmStupDto;
+import com.its.op.service.its.facility.TbFcltSttsAlrmStupService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "01.시설물관리-4.시설물-9.시설물 상태 알람 설정")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/facility/tb_fclt_stts_alrm_stup")
+public class TbFcltSttsAlrmStupController {
+
+    private final TbFcltSttsAlrmStupService service;
+
+    @ApiOperation(value = "시설물 상태 알람 설정 전체조회(TB_FCLT_STTS_ALRM_STUP)", response = TbFcltSttsAlrmStupDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbFcltSttsAlrmStupDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "시설물 상태 알람 설정 개별조회(TB_FCLT_STTS_ALRM_STUP)", response = TbFcltSttsAlrmStupDto.class)
+    @GetMapping(value = "/{fcltType}", produces = {"application/json; charset=utf8"})
+    public List<TbFcltSttsAlrmStupDto> findById(
+            @ApiParam(name = "fcltType", value = "VMS/VDS/CCTV/DSRC/WCAM 선택", example = "VMS", required = true)
+            @PathVariable("fcltType") final String fcltType) {
+        return this.service.findListById(fcltType);
+    }
+
+    @ApiOperation(value = "시설물 상태 알람 설정 정보변경/생성-목록(TB_FCLT_STTS_ALRM_STUP)", response = TbFcltSttsAlrmStupDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbFcltSttsAlrmStupDto> mergeInfoList(@RequestBody @Valid final List<TbFcltSttsAlrmStupDto.TbFcltSttsAlrmStupUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+}

+ 13 - 13
src/main/java/com/its/op/dao/repository/its/cctv/TbCctvCtlrSttsHsRepository.java

@@ -40,7 +40,7 @@ public interface TbCctvCtlrSttsHsRepository extends JpaRepository<TbCctvCtlrStts
             "SELECT NVL(SUM(CMS0CNT), 0) AS cms0Cnt, NVL(SUM(CMS1CNT), 0) AS cms1Cnt " +
                     "  FROM (SELECT DECODE(CMNC_STTS_CD, 'CMS0', 1, 0) AS CMS0CNT, " +
                     "               DECODE(CMNC_STTS_CD, 'CMS0', 0, 1) AS CMS1CNT  " +
-                    "          FROM TB_CCTV_STTS_HS " +
+                    "          FROM TB_CCTV_CTLR_STTS_HS " +
                     "         WHERE CRTN_DT BETWEEN :fromDt AND :toDt" +
                     "       )", nativeQuery = true)
     ReportFcltSummaryInf findAllReportSummary(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
@@ -52,17 +52,17 @@ public interface TbCctvCtlrSttsHsRepository extends JpaRepository<TbCctvCtlrStts
 
     @Query(value =
             "SELECT A.CCTV_CTLR_NMBR AS fcltNmbr, A.CCTV_CTLR_ID AS fcltId, A.ISTL_LCTN_NM AS fcltNm, " +
-                    "               NVL(B.CNT_CMS1, 0) + NVL(B.CNT_CMS2, 0) AS totCnt, " +
-                    "               NVL(B.CNT_CMS1, 0) AS cms1Cnt, NVL(B.CNT_CMS2, 0) AS cms2Cnt " +
-                    "        FROM TB_CCTV_CTLR A, " +
-                    "             (SELECT CCTV_CTLR_NMBR, " +
-                    "                     SUM(DECODE(CMNC_STTS_CD, 'CMS1', 1, 0)) AS CNT_CMS1, " +
-                    "                     SUM(DECODE(CMNC_STTS_CD, 'CMS2', 1, 0)) AS CNT_CMS2 " +
-                    "              FROM TB_CCTV_STTS_HS " +
-                    "              WHERE CRTN_DT BETWEEN :fromDt AND :toDt " +
-                    "                AND CMNC_STTS_CD IN ('CMS1', 'CMS2') " +
-                    "              GROUP BY CCTV_CTLR_NMBR) B " +
-                    "        WHERE A.CCTV_CTLR_NMBR = B.CCTV_CTLR_NMBR(+)"
+            "               NVL(B.CNT_CMS1, 0) + NVL(B.CNT_CMS2, 0) AS totCnt, " +
+            "               NVL(B.CNT_CMS1, 0) AS cms1Cnt, NVL(B.CNT_CMS2, 0) AS cms2Cnt " +
+            "        FROM TB_CCTV_CTLR A, " +
+            "             (SELECT CCTV_CTLR_NMBR, " +
+            "                     SUM(DECODE(CMNC_STTS_CD, 'CMS1', 1, 0)) AS CNT_CMS1, " +
+            "                     SUM(DECODE(CMNC_STTS_CD, 'CMS2', 1, 0)) AS CNT_CMS2 " +
+            "              FROM TB_CCTV_CTLR_STTS_HS " +
+            "              WHERE CRTN_DT BETWEEN :fromDt AND :toDt " +
+            "                AND CMNC_STTS_CD IN ('CMS1', 'CMS2') " +
+            "              GROUP BY CCTV_CTLR_NMBR) B " +
+            "        WHERE A.CCTV_CTLR_NMBR = B.CCTV_CTLR_NMBR(+)"
             , nativeQuery = true)
     List<FcltSttsStatErrorInf> findAllStatisticsCommErrByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
 
@@ -72,7 +72,7 @@ public interface TbCctvCtlrSttsHsRepository extends JpaRepository<TbCctvCtlrStts
             "  FROM TB_CCTV_CTLR A,                                                                                          " +
             "       (SELECT CCTV_CTLR_NMBR, CMNC_STTS_CD AS CONN_STTS_CD,                                                    " +
             "               CBOX_DOOR_STTS_CD AS DOOR_STTS_CD, CBOX_TMPR, CRTN_DT                                            " +
-            "          FROM TB_CCTV_STTS_HS                                                                                  " +
+            "          FROM TB_CCTV_CTLR_STTS_HS                                                                                  " +
             "         WHERE CRTN_DT BETWEEN :fromDt AND :toDt                                                                " +
             "           AND (CMNC_STTS_CD      <> 'CMS0' OR                                                                  " +
             "                CBOX_DOOR_STTS_CD <> 'CDS0' OR                                                                  " +

+ 2 - 0
src/main/java/com/its/op/dao/repository/its/cctv/TbCctvCtlrSttsRepository.java

@@ -13,4 +13,6 @@ public interface TbCctvCtlrSttsRepository extends JpaRepository<TbCctvCtlrStts,
 
     @Query("select p from TbCctvCtlrStts p")
     List<TbCctvCtlrStts> findAll();
+
+
 }

+ 24 - 0
src/main/java/com/its/op/dao/repository/its/facility/TbFcltSttsAlrmStupRepository.java

@@ -0,0 +1,24 @@
+package com.its.op.dao.repository.its.facility;
+
+import com.its.op.entity.its.facility.TbFcltSttsAlrmStup;
+import com.its.op.entity.its.facility.TbFcltSttsAlrmStupKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbFcltSttsAlrmStupRepository extends JpaRepository<TbFcltSttsAlrmStup, TbFcltSttsAlrmStupKey>, JpaSpecificationExecutor<TbFcltSttsAlrmStup> {
+
+    @Query("select p from TbFcltSttsAlrmStup p")
+    List<TbFcltSttsAlrmStup> findAll();
+
+    @Query("select p from TbFcltSttsAlrmStup p")
+    List<TbFcltSttsAlrmStup> findAllList();
+
+    @Query("select p from TbFcltSttsAlrmStup p where p.fcltType = :fcltType")
+    List<TbFcltSttsAlrmStup> findListById(@Param("fcltType") String fcltType);
+}

+ 57 - 0
src/main/java/com/its/op/dao/repository/its/rse/TbRseCtlrSttsHsRepository.java

@@ -1,5 +1,9 @@
 package com.its.op.dao.repository.its.rse;
 
+import com.its.op.dto.its.common.SttsHsErrCntInf;
+import com.its.op.dto.its.facility.FcltSttsErrorInf;
+import com.its.op.dto.its.report.ReportFcltSummaryInf;
+import com.its.op.dto.its.statistics.FcltSttsStatErrorInf;
 import com.its.op.entity.its.rse.TbRseCtlrSttsHs;
 import com.its.op.entity.its.rse.TbRseCtlrSttsHsKey;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -22,10 +26,63 @@ public interface TbRseCtlrSttsHsRepository extends JpaRepository<TbRseCtlrSttsHs
     @Query("select p from TbRseCtlrSttsHs p inner join fetch p.rse where p.crtnDt between :fromDt and :toDt and p.rseCtlrNmbr in :ids")
     List<TbRseCtlrSttsHs> findAllByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt, @Param("ids") List<Long> ids);
 
+    @Query("select p.rseCtlrNmbr as nmbr, count(p.rseCtlrNmbr) as errCnt " +
+            "  from TbRseCtlrSttsHs p " +
+            " where p.crtnDt     >= :fromDt " +
+            "   and p.cmncSttsCd <> 'CMS0' " +
+            " group by p.rseCtlrNmbr")
+    List<SttsHsErrCntInf> findAllCommErrorCount(@Param("fromDt") String fromDt);
+
     @Query("select p from TbRseCtlrSttsHs p inner join fetch p.rse " +
             " where p.crtnDt between :fromDt and :toDt " +
             "   and (p.cmncSttsCd <> 'CMS0' or p.cboxDoorSttsCd <> 'CDS0' or p.cboxTmpr > 40)" +
             "   and p.rseCtlrNmbr in :ids")
     List<TbRseCtlrSttsHs> findAllFailByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt, @Param("ids") List<Long> ids);
 
+    @Query(value =
+            "SELECT NVL(SUM(CMS0CNT), 0) AS cms0Cnt, NVL(SUM(CMS1CNT), 0) AS cms1Cnt " +
+            "  FROM (SELECT DECODE(CMNC_STTS_CD, 'CMS0', 1, 0) AS CMS0CNT, " +
+            "               DECODE(CMNC_STTS_CD, 'CMS0', 0, 1) AS CMS1CNT  " +
+            "          FROM TB_RSE_CTLR_STTS_HS " +
+            "         WHERE CRTN_DT BETWEEN :fromDt AND :toDt" +
+            "       )", nativeQuery = true)
+    ReportFcltSummaryInf findAllReportSummary(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
+
+    @Query("select p from TbRseCtlrSttsHs p inner join fetch p.rse rse " +
+            " where p.crtnDt between :fromDt and :toDt " +
+            "   and p.cmncSttsCd = 'CMS1' ")
+    List<TbRseCtlrSttsHs> findAllReportError(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
+
+    @Query(value =
+            "SELECT A.RSE_CTLR_NMBR AS fcltNmbr, A.RSE_CTLR_ID AS fcltId, A.ISTL_LCTN_NM AS fcltNm, " +
+            "               NVL(B.CNT_CMS1, 0) + NVL(B.CNT_CMS2, 0) AS totCnt, " +
+            "               NVL(B.CNT_CMS1, 0) AS cms1Cnt, NVL(B.CNT_CMS2, 0) AS cms2Cnt " +
+            "        FROM TB_RSE_CTLR A, " +
+            "             (SELECT RSE_CTLR_NMBR, " +
+            "                     SUM(DECODE(CMNC_STTS_CD, 'CMS1', 1, 0)) AS CNT_CMS1, " +
+            "                     SUM(DECODE(CMNC_STTS_CD, 'CMS2', 1, 0)) AS CNT_CMS2 " +
+            "              FROM TB_RSE_CTLR_STTS_HS " +
+            "              WHERE CRTN_DT BETWEEN :fromDt AND :toDt " +
+            "                AND CMNC_STTS_CD IN ('CMS1', 'CMS2') " +
+            "              GROUP BY RSE_CTLR_NMBR) B " +
+            "        WHERE A.RSE_CTLR_NMBR = B.RSE_CTLR_NMBR(+)"
+            , nativeQuery = true)
+    List<FcltSttsStatErrorInf> findAllStatisticsCommErrByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
+
+    @Query(value =
+            "SELECT 'DSRC' AS fcltType, A.RSE_CTLR_NMBR AS fcltNmbr, A.RSE_CTLR_ID AS fcltId, A.ISTL_LCTN_NM AS fcltNm,    " +
+            "       B.CONN_STTS_CD AS commSttsCd, B.DOOR_STTS_CD AS doorSttsCd, NVL(B.CBOX_TMPR, 0) AS cboxTmpr, B.CRTN_DT AS crtnDt " +
+            "  FROM TB_RSE_CTLR A,                                                                                          " +
+            "       (SELECT RSE_CTLR_NMBR, CMNC_STTS_CD AS CONN_STTS_CD,                                                    " +
+            "               CBOX_DOOR_STTS_CD AS DOOR_STTS_CD, CBOX_TMPR, CRTN_DT                                            " +
+            "          FROM TB_RSE_CTLR_STTS_HS                                                                                  " +
+            "         WHERE CRTN_DT BETWEEN :fromDt AND :toDt                                                                " +
+            "           AND (CMNC_STTS_CD      <> 'CMS0' OR                                                                  " +
+            "                CBOX_DOOR_STTS_CD <> 'CDS0' OR                                                                  " +
+            "                CBOX_TMPR > 40)                                                                                 " +
+            "       ) B                                                                                                      " +
+            " WHERE A.RSE_CTLR_NMBR = B.RSE_CTLR_NMBR  "
+            , nativeQuery = true)
+    List<FcltSttsErrorInf> findAllSttsErrorByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
+
 }

+ 233 - 0
src/main/java/com/its/op/dto/its/facility/TbFcltSttsAlrmStupDto.java

@@ -0,0 +1,233 @@
+package com.its.op.dto.its.facility;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.facility.TbFcltSttsAlrmStup;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 시설물 상태 알람 설정 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbFcltSttsAlrmStupDto(시설물 상태 알람 설정)")
+public class TbFcltSttsAlrmStupDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("시설물 유형")  // N VARCHAR2(7)
+    @JsonProperty("fclt_type")
+    private String fcltType;
+
+    @ApiModelProperty("시설물 ID")  // N VARCHAR2(30)
+    @JsonProperty("fclt_id")
+    private String fcltId;
+
+    @ApiModelProperty("등록일시")  // N VARCHAR2(14)
+    @JsonProperty("reg_dt")
+    private String regDt;
+
+    @ApiModelProperty("통신 상태 ")  // Y CHAR(1)
+    @JsonProperty("cmnc_stts")
+    private String cmncStts;
+
+    @ApiModelProperty("전원 상태")  // Y CHAR(1)
+    @JsonProperty("pwer_stts")
+    private String pwerStts;
+
+    @ApiModelProperty("모듈 상태")  // Y CHAR(1)
+    @JsonProperty("modl_stts")
+    private String modlStts;
+
+    @ApiModelProperty("도어 상태")  // Y CHAR(1)
+    @JsonProperty("door_stts")
+    private String doorStts;
+
+    @ApiModelProperty("앞문 상태")  // Y CHAR(1)
+    @JsonProperty("front_door_stts")
+    private String frontDoorStts;
+
+    @ApiModelProperty("뒷문 상태")  // Y CHAR(1)
+    @JsonProperty("back_door_stts")
+    private String backDoorStts;
+
+    @ApiModelProperty("비디오 입력")  // Y CHAR(1)
+    @JsonProperty("video_input")
+    private String videoInput;
+
+    @ApiModelProperty("제어기 장치 상태")  // Y CHAR(1)
+    @JsonProperty("cntl_devc_stts")
+    private String cntlDevcStts;
+
+    @ApiModelProperty("안테나 상태")  // Y CHAR(1)
+    @JsonProperty("atn_stts")
+    private String atnStts;
+
+    @ApiModelProperty("안테나 동작")  // Y CHAR(1)
+    @JsonProperty("atn_mtns")
+    private String atnMtns;
+
+    @ApiModelProperty("제어기 통신 상태")  // Y CHAR(1)
+    @JsonProperty("comm_stts")
+    private String commStts;
+
+    @ApiModelProperty("사용자ID(사원번호)")  // Y VARCHAR2(20)
+    @JsonProperty("user_id")
+    private String userId;
+
+    @ApiModelProperty("사용 여부")  // Y CHAR(1)
+    @JsonProperty("use_yn")
+    private String useYn;
+
+    // Code Description Field
+    @ApiModelProperty("사용 여부 설명")
+    @JsonProperty("use_desc")    // USE_YN
+    private String useDesc;
+
+    @ApiModel("TbFcltSttsAlrmStupUpdReq(시설물 상태 알람 설정 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbFcltSttsAlrmStupUpdReq {
+
+        @ApiModelProperty("시설물 유형, Nullable = N, VARCHAR2(7)")  // N VARCHAR2(7)
+        @JsonProperty("fclt_type")
+        @Size(min=1, max=7)
+        private String fcltType;
+
+        @ApiModelProperty("시설물 ID, Nullable = N, VARCHAR2(30)")  // N VARCHAR2(30)
+        @JsonProperty("fclt_id")
+        @Size(min=1, max=30)
+        private String fcltId;
+
+        @ApiModelProperty("등록일시, Nullable = N, VARCHAR2(14)")  // N VARCHAR2(14)
+        @JsonProperty("reg_dt")
+        @Size(min=1, max=14)
+        private String regDt;
+
+        @ApiModelProperty("통신 상태 , Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("cmnc_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String cmncStts;
+
+        @ApiModelProperty("전원 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("pwer_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String pwerStts;
+
+        @ApiModelProperty("모듈 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("modl_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String modlStts;
+
+        @ApiModelProperty("도어 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("door_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String doorStts;
+
+        @ApiModelProperty("앞문 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("front_door_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String frontDoorStts;
+
+        @ApiModelProperty("뒷문 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("back_door_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String backDoorStts;
+
+        @ApiModelProperty("비디오 입력, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("video_input")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String videoInput;
+
+        @ApiModelProperty("제어기 장치 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("cntl_devc_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String cntlDevcStts;
+
+        @ApiModelProperty("안테나 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("atn_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String atnStts;
+
+        @ApiModelProperty("안테나 동작, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("atn_mtns")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String atnMtns;
+
+        @ApiModelProperty("제어기 통신 상태, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("comm_stts")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String commStts;
+
+        @ApiModelProperty("사용자ID(사원번호), Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("user_id")
+        @Size(min=1, max=20)
+        private String userId;
+
+        @ApiModelProperty("사용 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("use_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String useYn;
+
+        @Builder
+        public TbFcltSttsAlrmStupUpdReq(String fclt_type, String fclt_id, String reg_dt, String cmnc_stts, String pwer_stts, String modl_stts, String door_stts, String front_door_stts, String back_door_stts, String video_input, String cntl_devc_stts, String atn_stts, String atn_mtns, String comm_stts, String user_id, String use_yn) {
+            this.fcltType = fclt_type;
+            this.fcltId = fclt_id;
+            this.regDt = reg_dt;
+            this.cmncStts = cmnc_stts;
+            this.pwerStts = pwer_stts;
+            this.modlStts = modl_stts;
+            this.doorStts = door_stts;
+            this.frontDoorStts = front_door_stts;
+            this.backDoorStts = back_door_stts;
+            this.videoInput = video_input;
+            this.cntlDevcStts = cntl_devc_stts;
+            this.atnStts = atn_stts;
+            this.atnMtns = atn_mtns;
+            this.commStts = comm_stts;
+            this.userId = user_id;
+            this.useYn = use_yn;
+        }
+
+        public TbFcltSttsAlrmStup toEntity() {
+            return TbFcltSttsAlrmStup.builder()
+                    .fcltType(this.fcltType)
+                    .fcltId(this.fcltId)
+                    .regDt(this.regDt)
+                    .cmncStts(this.cmncStts)
+                    .pwerStts(this.pwerStts)
+                    .modlStts(this.modlStts)
+                    .doorStts(this.doorStts)
+                    .frontDoorStts(this.frontDoorStts)
+                    .backDoorStts(this.backDoorStts)
+                    .videoInput(this.videoInput)
+                    .cntlDevcStts(this.cntlDevcStts)
+                    .atnStts(this.atnStts)
+                    .atnMtns(this.atnMtns)
+                    .commStts(this.commStts)
+                    .userId(this.userId)
+                    .useYn(this.useYn)
+                    .build();
+        }
+
+    }
+
+}

+ 137 - 0
src/main/java/com/its/op/entity/its/facility/TbFcltSttsAlrmStup.java

@@ -0,0 +1,137 @@
+package com.its.op.entity.its.facility;
+
+import com.its.op.dto.its.facility.TbFcltSttsAlrmStupDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 시설물 상태 알람 설정 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("시설물 상태 알람 설정")
+@Entity
+@Table(name = "TB_FCLT_STTS_ALRM_STUP")
+@IdClass(TbFcltSttsAlrmStupKey.class)
+public class TbFcltSttsAlrmStup implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("시설물 유형")  // N VARCHAR2(7)
+    @Id
+    @Column(name = "FCLT_TYPE", nullable = false, length = 7)
+    private String fcltType;
+
+    @ApiModelProperty("시설물 ID")  // N VARCHAR2(30)
+    @Id
+    @Column(name = "FCLT_ID", nullable = false, length = 30)
+    private String fcltId;
+
+    @ApiModelProperty("등록일시")  // N VARCHAR2(14)
+    @Column(name = "REG_DT", nullable = false, length = 14)
+    private String regDt;
+
+    @ApiModelProperty("통신 상태 ")  // Y CHAR(1)
+    @Column(name = "CMNC_STTS", columnDefinition = "CHAR", length = 1)
+    private String cmncStts;
+
+    @ApiModelProperty("전원 상태")  // Y CHAR(1)
+    @Column(name = "PWER_STTS", columnDefinition = "CHAR", length = 1)
+    private String pwerStts;
+
+    @ApiModelProperty("모듈 상태")  // Y CHAR(1)
+    @Column(name = "MODL_STTS", columnDefinition = "CHAR", length = 1)
+    private String modlStts;
+
+    @ApiModelProperty("도어 상태")  // Y CHAR(1)
+    @Column(name = "DOOR_STTS", columnDefinition = "CHAR", length = 1)
+    private String doorStts;
+
+    @ApiModelProperty("앞문 상태")  // Y CHAR(1)
+    @Column(name = "FRONT_DOOR_STTS", columnDefinition = "CHAR", length = 1)
+    private String frontDoorStts;
+
+    @ApiModelProperty("뒷문 상태")  // Y CHAR(1)
+    @Column(name = "BACK_DOOR_STTS", columnDefinition = "CHAR", length = 1)
+    private String backDoorStts;
+
+    @ApiModelProperty("비디오 입력")  // Y CHAR(1)
+    @Column(name = "VIDEO_INPUT", columnDefinition = "CHAR", length = 1)
+    private String videoInput;
+
+    @ApiModelProperty("제어기 장치 상태")  // Y CHAR(1)
+    @Column(name = "CNTL_DEVC_STTS", columnDefinition = "CHAR", length = 1)
+    private String cntlDevcStts;
+
+    @ApiModelProperty("안테나 상태")  // Y CHAR(1)
+    @Column(name = "ATN_STTS", columnDefinition = "CHAR", length = 1)
+    private String atnStts;
+
+    @ApiModelProperty("안테나 동작")  // Y CHAR(1)
+    @Column(name = "ATN_MTNS", columnDefinition = "CHAR", length = 1)
+    private String atnMtns;
+
+    @ApiModelProperty("제어기 통신 상태")  // Y CHAR(1)
+    @Column(name = "COMM_STTS", columnDefinition = "CHAR", length = 1)
+    private String commStts;
+
+    @ApiModelProperty("사용자ID(사원번호)")  // Y VARCHAR2(20)
+    @Column(name = "USER_ID", length = 20)
+    private String userId;
+
+    @ApiModelProperty("사용 여부")  // Y CHAR(1)
+    @Column(name = "USE_YN", columnDefinition = "CHAR", length = 1)
+    private String useYn;
+
+    public TbFcltSttsAlrmStupDto toDto() {
+        return TbFcltSttsAlrmStupDto.builder()
+                .fcltType(this.fcltType)
+                .fcltId(this.fcltId)
+                .regDt(this.regDt)
+                .cmncStts(this.cmncStts)
+                .pwerStts(this.pwerStts)
+                .modlStts(this.modlStts)
+                .doorStts(this.doorStts)
+                .frontDoorStts(this.frontDoorStts)
+                .backDoorStts(this.backDoorStts)
+                .videoInput(this.videoInput)
+                .cntlDevcStts(this.cntlDevcStts)
+                .atnStts(this.atnStts)
+                .atnMtns(this.atnMtns)
+                .commStts(this.commStts)
+                .userId(this.userId)
+                .useYn(this.useYn)
+                .build();
+    }
+
+    public TbFcltSttsAlrmStup(String fcltType, String fcltId) {
+        this.fcltType = fcltType;
+        this.fcltId = fcltId;
+    }
+
+    public void updateInfo(TbFcltSttsAlrmStupDto.TbFcltSttsAlrmStupUpdReq req) {
+        this.regDt = req.getRegDt();
+        this.cmncStts = req.getCmncStts();
+        this.pwerStts = req.getPwerStts();
+        this.modlStts = req.getModlStts();
+        this.doorStts = req.getDoorStts();
+        this.frontDoorStts = req.getFrontDoorStts();
+        this.backDoorStts = req.getBackDoorStts();
+        this.videoInput = req.getVideoInput();
+        this.cntlDevcStts = req.getCntlDevcStts();
+        this.atnStts = req.getAtnStts();
+        this.atnMtns = req.getAtnMtns();
+        this.commStts = req.getCommStts();
+        this.userId = req.getUserId();
+        this.useYn = req.getUseYn();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/op/entity/its/facility/TbFcltSttsAlrmStupKey.java

@@ -0,0 +1,25 @@
+package com.its.op.entity.its.facility;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 시설물 상태 알람 설정 Key Class
+ */
+@Data
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbFcltSttsAlrmStupKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // FCLT_TYPE, 시설물 유형  // N VARCHAR2(7)
+    private String fcltType;
+
+    // FCLT_ID, 시설물 ID  // N VARCHAR2(30)
+    private String fcltId;
+
+}

+ 98 - 0
src/main/java/com/its/op/service/its/facility/TbFcltSttsAlrmStupService.java

@@ -0,0 +1,98 @@
+package com.its.op.service.its.facility;
+
+import com.its.op.dao.repository.its.facility.TbFcltSttsAlrmStupRepository;
+import com.its.op.dto.its.facility.TbFcltSttsAlrmStupDto;
+import com.its.op.entity.its.facility.TbFcltSttsAlrmStup;
+import com.its.op.entity.its.facility.TbFcltSttsAlrmStupKey;
+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;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbFcltSttsAlrmStupService {
+
+    private final TbFcltSttsAlrmStupRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbFcltSttsAlrmStup requireOne(TbFcltSttsAlrmStupKey fcltType) throws NoSuchElementException {
+        Optional<TbFcltSttsAlrmStup> info = this.repo.findById(fcltType);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + fcltType);
+        }
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbFcltSttsAlrmStupDto> findAll() {
+        List<TbFcltSttsAlrmStupDto> result = new ArrayList<>();
+        List<TbFcltSttsAlrmStup> data = this.repo.findAll();
+        for (TbFcltSttsAlrmStup entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbFcltSttsAlrmStupDto> findAllList() {
+        List<TbFcltSttsAlrmStupDto> result = new ArrayList<>();
+        List<TbFcltSttsAlrmStup> data = this.repo.findAllList();
+        for (TbFcltSttsAlrmStup entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbFcltSttsAlrmStupDto findById(TbFcltSttsAlrmStupKey fcltType) {
+        TbFcltSttsAlrmStup entity = requireOne(fcltType);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbFcltSttsAlrmStupDto> mergeInfoList(List<TbFcltSttsAlrmStupDto.TbFcltSttsAlrmStupUpdReq> reqList) {
+        List<TbFcltSttsAlrmStupDto> result = new ArrayList<>();
+        for (TbFcltSttsAlrmStupDto.TbFcltSttsAlrmStupUpdReq req : reqList) {
+            TbFcltSttsAlrmStup obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbFcltSttsAlrmStupDto mergeInfo(TbFcltSttsAlrmStupDto.TbFcltSttsAlrmStupUpdReq req) {
+        TbFcltSttsAlrmStup obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    /**
+     * 시설물 유형별 알람 설정 정보 조회
+     * @param fcltType
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbFcltSttsAlrmStupDto> findListById(String fcltType) {
+        List<TbFcltSttsAlrmStupDto> result = new ArrayList<>();
+        List<TbFcltSttsAlrmStup> data = this.repo.findListById(fcltType);
+        for (TbFcltSttsAlrmStup entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+}

+ 16 - 7
src/main/java/com/its/op/service/its/facility/TbFcltSttsErrorHsService.java

@@ -1,5 +1,7 @@
 package com.its.op.service.its.facility;
 
+import com.its.op.dao.repository.its.cctv.TbCctvCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.rse.TbRseCtlrSttsHsRepository;
 import com.its.op.dao.repository.its.vds.TbVdsCtlrSttsHsRepository;
 import com.its.op.dao.repository.its.vms.TbVmsCtlrSttsHsRepository;
 import com.its.op.dto.its.facility.FcltSttsErrorDto;
@@ -18,9 +20,10 @@ import java.util.NoSuchElementException;
 @Service
 public class TbFcltSttsErrorHsService {
 
-    //private final TbCctvSttsHsRepository cctvSttsHsRepo;
+    private final TbCctvCtlrSttsHsRepository cctvSttsHsRepo;
     private final TbVmsCtlrSttsHsRepository vmsSttsHsRepo;
     private final TbVdsCtlrSttsHsRepository vdsSttsHsRepo;
+    private final TbRseCtlrSttsHsRepository rseSttsHsRepo;
 
     /**
      * 시설물 장애내역 조회
@@ -31,10 +34,10 @@ public class TbFcltSttsErrorHsService {
      */
     @Transactional(readOnly = true)
     public List<FcltSttsErrorDto> findAllFcltSttsErrorList(String type, String fromDt, String toDt) throws NoSuchElementException {
-//        if (("CCTV").equalsIgnoreCase(type)) {
-//            return findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), type);
-//        }
-//        else
+        if (("CCTV").equalsIgnoreCase(type)) {
+            return findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), type);
+        }
+        else
         if (("VMS").equalsIgnoreCase(type)) {
             return findAllStatisticsCommErrByDateRangeResult(this.vmsSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), type);
         }
@@ -43,15 +46,21 @@ public class TbFcltSttsErrorHsService {
             return findAllStatisticsCommErrByDateRangeResult(this.vdsSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), type);
         }
         else
+        if (("DSRC").equalsIgnoreCase(type)) {
+            return findAllStatisticsCommErrByDateRangeResult(this.rseSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), type);
+        }
+        else
         if (("ALL").equalsIgnoreCase(type)) {
-            //List<FcltSttsErrorDto> cctvList = findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), "CCTV");
+            List<FcltSttsErrorDto> cctvList = findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), "CCTV");
             List<FcltSttsErrorDto> vmsList = findAllStatisticsCommErrByDateRangeResult(this.vmsSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), "VMS");
             List<FcltSttsErrorDto> vdsList = findAllStatisticsCommErrByDateRangeResult(this.vdsSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), "VDS");
+            List<FcltSttsErrorDto> rseList = findAllStatisticsCommErrByDateRangeResult(this.rseSttsHsRepo.findAllSttsErrorByDateRange(fromDt, toDt), "DSRC");
 
             final List<FcltSttsErrorDto> result = new ArrayList<>();
-            //result.addAll(cctvList);
+            result.addAll(cctvList);
             result.addAll(vmsList);
             result.addAll(vdsList);
+            result.addAll(rseList);
             return result;
         }
         else {

+ 47 - 23
src/main/java/com/its/op/service/its/report/ReportService.java

@@ -1,15 +1,19 @@
 package com.its.op.service.its.report;
 
-import com.its.op.global.CodeManager;
+import com.its.op.dao.repository.its.cctv.TbCctvCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.incident.TbIncdOcrrRepository;
+import com.its.op.dao.repository.its.link.TbLinkTrafHsRepository;
+import com.its.op.dao.repository.its.rse.TbRseCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.vds.TbVdsCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.vms.TbVmsCtlrSttsHsRepository;
 import com.its.op.dto.its.report.*;
+import com.its.op.entity.its.cctv.TbCctvCtlrSttsHs;
 import com.its.op.entity.its.incident.TbIncdOcrr;
 import com.its.op.entity.its.link.TbLinkTrafHs;
+import com.its.op.entity.its.rse.TbRseCtlrSttsHs;
 import com.its.op.entity.its.vds.TbVdsCtlrSttsHs;
 import com.its.op.entity.its.vms.TbVmsCtlrSttsHs;
-import com.its.op.dao.repository.its.incident.TbIncdOcrrRepository;
-import com.its.op.dao.repository.its.link.TbLinkTrafHsRepository;
-import com.its.op.dao.repository.its.vds.TbVdsCtlrSttsHsRepository;
-import com.its.op.dao.repository.its.vms.TbVmsCtlrSttsHsRepository;
+import com.its.op.global.CodeManager;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -23,9 +27,10 @@ import java.util.List;
 @Service
 public class ReportService {
 
-//    private final TbCctvSttsHsRepository cctvSttsHsRepo;
+    private final TbCctvCtlrSttsHsRepository cctvSttsHsRepo;
     private final TbVmsCtlrSttsHsRepository vmsSttsHsRepo;
     private final TbVdsCtlrSttsHsRepository vdsSttsHsRepo;
+    private final TbRseCtlrSttsHsRepository rseSttsHsRepo;
     private final TbIncdOcrrRepository incdOcrrRepo;
     private final TbLinkTrafHsRepository linkTrafHsRepo;
 
@@ -40,13 +45,13 @@ public class ReportService {
 
         List<ReportFacilitySummaryDto> result = new ArrayList<>();
 
-//        ReportFcltSummaryInf cctvSummary = this.cctvSttsHsRepo.findAllReportSummary(fromDt, toDt);
-//        result.add(ReportFacilitySummaryDto.builder()
-//                .fcltSeq(1)
-//                .fcltType("CCTV")
-//                .cms0Cnt(cctvSummary.getCms0Cnt().intValue())
-//                .cms1Cnt(cctvSummary.getCms1Cnt().intValue())
-//                .build());
+        ReportFcltSummaryInf cctvSummary = this.cctvSttsHsRepo.findAllReportSummary(fromDt, toDt);
+        result.add(ReportFacilitySummaryDto.builder()
+                .fcltSeq(1)
+                .fcltType("CCTV")
+                .cms0Cnt(cctvSummary.getCms0Cnt().intValue())
+                .cms1Cnt(cctvSummary.getCms1Cnt().intValue())
+                .build());
 
         ReportFcltSummaryInf vmsSummary = this.vmsSttsHsRepo.findAllReportSummary(fromDt, toDt);
         result.add(ReportFacilitySummaryDto.builder()
@@ -64,6 +69,14 @@ public class ReportService {
                 .cms1Cnt(vdsSummary.getCms1Cnt().intValue())
                 .build());
 
+        ReportFcltSummaryInf rseSummary = this.rseSttsHsRepo.findAllReportSummary(fromDt, toDt);
+        result.add(ReportFacilitySummaryDto.builder()
+                .fcltSeq(4)
+                .fcltType("DSRC")
+                .cms0Cnt(rseSummary.getCms0Cnt().intValue())
+                .cms1Cnt(rseSummary.getCms1Cnt().intValue())
+                .build());
+
         return result;
     }
 
@@ -78,16 +91,16 @@ public class ReportService {
 
         List<ReportFacilityErrorDto> result = new ArrayList<>();
 
-//        List<TbCctvSttsHs> cctvError = this.cctvSttsHsRepo.findAllReportError(fromDt, toDt);
-//        cctvError.forEach(obj -> {
-//            result.add(ReportFacilityErrorDto.builder()
-//                    .fcltSeq(1)
-//                    .fcltType("CCTV")
-//                    .fcltId(obj.getCctv() != null ? obj.getCctv().getCctvCtlrId() : String.valueOf(obj.getCctvCtlrNmbr()))
-//                    .fcltNm(obj.getCctv() != null ? obj.getCctv().getIstlLctnNm() : String.valueOf(obj.getCctvCtlrNmbr()))
-//                    .rgstDt(obj.getCrtnDt())
-//                    .build());
-//        });
+        List<TbCctvCtlrSttsHs> cctvError = this.cctvSttsHsRepo.findAllReportError(fromDt, toDt);
+        cctvError.forEach(obj -> {
+            result.add(ReportFacilityErrorDto.builder()
+                    .fcltSeq(1)
+                    .fcltType("CCTV")
+                    .fcltId(obj.getCctv() != null ? obj.getCctv().getCctvCtlrId() : String.valueOf(obj.getCctvCtlrNmbr()))
+                    .fcltNm(obj.getCctv() != null ? obj.getCctv().getIstlLctnNm() : String.valueOf(obj.getCctvCtlrNmbr()))
+                    .rgstDt(obj.getCrtnDt())
+                    .build());
+        });
 
 
         List<TbVmsCtlrSttsHs>  vmsError = this.vmsSttsHsRepo.findAllReportError(fromDt, toDt);
@@ -111,6 +124,17 @@ public class ReportService {
                     .build());
         });
 
+        List<TbRseCtlrSttsHs>  rseError = this.rseSttsHsRepo.findAllReportError(fromDt, toDt);
+        rseError.forEach(obj -> {
+            result.add(ReportFacilityErrorDto.builder()
+                    .fcltSeq(4)
+                    .fcltType("DSRC")
+                    .fcltId(obj.getRse() != null ? obj.getRse().getRseCtlrId() : String.valueOf(obj.getRseCtlrNmbr()))
+                    .fcltNm(obj.getRse() != null ? obj.getRse().getRseNm() : String.valueOf(obj.getRseCtlrNmbr()))
+                    .rgstDt(obj.getCrtnDt())
+                    .build());
+        });
+
         return result;
     }
 

+ 74 - 22
src/main/java/com/its/op/service/its/rse/TbRseCtlrService.java

@@ -1,23 +1,19 @@
 package com.its.op.service.its.rse;
 
+import com.its.op.dao.repository.its.cctv.TbCctvCtlrSttsHsRepository;
 import com.its.op.dao.repository.its.rse.TbRseCtlrRepository;
-import com.its.op.dto.its.common.FcltSttsDto;
-import com.its.op.dto.its.common.FcltSttsListDto;
-import com.its.op.dto.its.common.FcltSttsSummaryDto;
-import com.its.op.dto.its.common.NewIdLongDto;
+import com.its.op.dto.its.common.*;
 import com.its.op.dto.its.rse.TbRseCtlrDto;
 import com.its.op.dto.its.rse.TbRseCtlrSttsDto;
 import com.its.op.entity.its.rse.TbRseCtlr;
 import com.its.op.global.CodeManager;
+import com.its.utils.ItsUtils;
 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;
-import java.util.NoSuchElementException;
-import java.util.Optional;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 @Slf4j
@@ -26,6 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 public class TbRseCtlrService {
 
     private final TbRseCtlrRepository repo;
+    private final TbCctvCtlrSttsHsRepository sttsHsRepo;
 
     // 데이터 1건 조회, 없으면 exception
     private TbRseCtlr requireOne(Long id) throws NoSuchElementException {
@@ -51,6 +48,36 @@ public class TbRseCtlrService {
         return result;
     }
 
+    /**
+     * 삭제 되지 않은 제어기 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbRseCtlrDto> findAllList() {
+        List<TbRseCtlrDto> result = new ArrayList<>();
+        List<TbRseCtlr> data = this.repo.findAllList();
+        data.forEach(obj -> {
+            //if (("N").equals(entity.getDelYn())) {
+            result.add(obj.toDto());
+            //}
+        });
+        return result;
+    }
+
+    /**
+     * 삭제 되지 않은 제어기 상태 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbRseCtlrSttsDto> findAllStts() {
+        List<TbRseCtlrSttsDto> result = new ArrayList<>();
+        List<TbRseCtlr> data = this.repo.findAllList();
+        data.forEach(obj -> {
+            result.add(obj.toSttsDto());
+        });
+        return result;
+    }
+
     // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
     @Transactional(readOnly = true)
     public TbRseCtlrDto findById(Long id) {
@@ -124,6 +151,45 @@ public class TbRseCtlrService {
         return this.repo.updateClctAbnrBasi(clctAbnrBasi);
     }
 
+    /**
+     * 통신이상 시설물 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<SttsCommErrDto> findAllListCommError() {
+
+        Map<String, SttsCommErrDto> result = new HashMap<>();
+        List<TbRseCtlr> data = this.repo.findAllList();
+        List<SttsHsErrCntInf> errList = this.sttsHsRepo.findAllCommErrorCount(ItsUtils.getFromToday());
+
+        // 통신 상태가 오류 인 제어기 정보만 조회한다.
+        data.forEach(obj -> {
+            TbRseCtlrSttsDto dto = obj.toSttsDto();
+            if (!CodeManager.CMNC_STTS_NORMAL.equals(dto.getCmncSttsCd())) {
+                SttsCommErrDto commErrorDto = new SttsCommErrDto();
+                commErrorDto.setCtlrNmbr(String.valueOf(dto.getRseCtlrNmbr()));
+                commErrorDto.setCtlrId(dto.getRseCtlrId());
+                commErrorDto.setCtlrNm(dto.getIstlLctnNm());
+                commErrorDto.setUpdtDt(dto.getUpdtDt());
+                commErrorDto.setCommCd(dto.getCmncSttsCd());
+                commErrorDto.setCommDesc(CodeManager.getCodeDescShort(CodeManager.CMNC_STTS_CD, commErrorDto.getCommCd()));
+                commErrorDto.setCommErrCnt(0);
+                commErrorDto.setColCnt(0);
+                result.put(commErrorDto.getCtlrNmbr(), commErrorDto);
+            }
+        });
+
+        // 오늘 00:00:00 이후 발생한 오류 건수를 업데이트
+        errList.forEach(obj -> {
+            SttsCommErrDto dto = result.get(obj.getNmbr());
+            if (dto != null) {
+                dto.setCommErrCnt(obj.getErrCnt().intValue());
+            }
+        });
+
+        return new ArrayList<>(result.values());
+    }
+
     /**
      * 상태 목록
      * @param
@@ -183,18 +249,4 @@ public class TbRseCtlrService {
         return result;
     }
 
-    /**
-     * 삭제 되지 않은 제어기 상태 정보 조회
-     * @return
-     */
-    @Transactional(readOnly = true)
-    public List<TbRseCtlrSttsDto> findAllStts() {
-        List<TbRseCtlrSttsDto> result = new ArrayList<>();
-        List<TbRseCtlr> data = this.repo.findAllList();
-        data.forEach(obj -> {
-            result.add(obj.toSttsDto());
-        });
-        return result;
-    }
-
 }

+ 15 - 7
src/main/java/com/its/op/service/its/statistics/FcltSttsStatisticsService.java

@@ -1,10 +1,12 @@
 package com.its.op.service.its.statistics;
 
+import com.its.op.dao.repository.its.cctv.TbCctvCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.rse.TbRseCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.vds.TbVdsCtlrSttsHsRepository;
+import com.its.op.dao.repository.its.vms.TbVmsCtlrSttsHsRepository;
 import com.its.op.dto.its.statistics.FcltSttsStatErrorDto;
 import com.its.op.dto.its.statistics.FcltSttsStatErrorInf;
 import com.its.op.dto.its.statistics.FcltSttsStatTypeDto;
-import com.its.op.dao.repository.its.vds.TbVdsCtlrSttsHsRepository;
-import com.its.op.dao.repository.its.vms.TbVmsCtlrSttsHsRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -19,9 +21,10 @@ import java.util.NoSuchElementException;
 @Service
 public class FcltSttsStatisticsService {
 
-//    private final TbCctvSttsHsRepository cctvSttsHsRepo;
+    private final TbCctvCtlrSttsHsRepository cctvSttsHsRepo;
     private final TbVmsCtlrSttsHsRepository vmsSttsHsRepo;
     private final TbVdsCtlrSttsHsRepository vdsSttsHsRepo;
+    private final TbRseCtlrSttsHsRepository rseSttsHsRepo;
 
     /**
      * 통계 - 시설물 통신단절 통계 - 시설물 구분 목록
@@ -37,6 +40,7 @@ public class FcltSttsStatisticsService {
         result.add(FcltSttsStatTypeDto.builder().fcltSeq(1).fcltCd("CCTV").fcltNm("CCTV").build());
         result.add(FcltSttsStatTypeDto.builder().fcltSeq(2).fcltCd("VMS").fcltNm("VMS").build());
         result.add(FcltSttsStatTypeDto.builder().fcltSeq(3).fcltCd("VDS").fcltNm("VDS").build());
+        result.add(FcltSttsStatTypeDto.builder().fcltSeq(4).fcltCd("DSRC").fcltNm("DSRC").build());
 
         return result;
     }
@@ -60,10 +64,10 @@ public class FcltSttsStatisticsService {
     @Transactional(readOnly = true)
     public List<FcltSttsStatErrorDto> findAllFcltStts(String fcltTypeCd, String fromDt, String toDt) {
 
-//        if (("CCTV").equalsIgnoreCase(fcltTypeCd)) {
-//            return findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllStatisticsCommErrByDateRange(fromDt, toDt));
-//        }
-//        else
+        if (("CCTV").equalsIgnoreCase(fcltTypeCd)) {
+            return findAllStatisticsCommErrByDateRangeResult(this.cctvSttsHsRepo.findAllStatisticsCommErrByDateRange(fromDt, toDt));
+        }
+        else
         if (("VMS").equalsIgnoreCase(fcltTypeCd)) {
             return findAllStatisticsCommErrByDateRangeResult(this.vmsSttsHsRepo.findAllStatisticsCommErrByDateRange(fromDt, toDt));
         }
@@ -71,6 +75,10 @@ public class FcltSttsStatisticsService {
         if (("VDS").equalsIgnoreCase(fcltTypeCd)) {
             return findAllStatisticsCommErrByDateRangeResult(this.vdsSttsHsRepo.findAllStatisticsCommErrByDateRange(fromDt, toDt));
         }
+        else
+        if (("DSRC").equalsIgnoreCase(fcltTypeCd)) {
+            return findAllStatisticsCommErrByDateRangeResult(this.rseSttsHsRepo.findAllStatisticsCommErrByDateRange(fromDt, toDt));
+        }
         else {
             throw new NoSuchElementException("요청 파라미터가 잘못 됐습니다: " + fcltTypeCd);
         }

+ 6 - 6
src/main/resources/mybatis/mapper/its/statistics/IncidentStatisticsMapper.xml

@@ -20,7 +20,7 @@
                         SUM(FTLT_PNUM)     AS FTLT_PNUM,
                         SUM(INJR_PNUM)     AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_TYPE_DD_STAT
+                 FROM TB_INCD_TYPE_STAT_DD
                  WHERE STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 8), INCD_TYPE_CD)
                  ORDER BY STAT_DT
@@ -44,7 +44,7 @@
                         SUM(FTLT_PNUM)     AS FTLT_PNUM,
                         SUM(INJR_PNUM)     AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_TYPE_MN_STAT
+                 FROM TB_INCD_TYPE_STAT_MN
                  WHERE STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 6), INCD_TYPE_CD)
                  ORDER BY STAT_DT
@@ -68,7 +68,7 @@
                         SUM(FTLT_PNUM) AS FTLT_PNUM,
                         SUM(INJR_PNUM) AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_TYPE_MN_STAT
+                 FROM TB_INCD_TYPE_STAT_MN
                  WHERE STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 4), INCD_TYPE_CD)
                  ORDER BY STAT_DT
@@ -95,7 +95,7 @@
                         SUM(FTLT_PNUM)     AS FTLT_PNUM,
                         SUM(INJR_PNUM)     AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_SECT_DD_STAT
+                 FROM TB_INCD_SECT_STAT_DD
                  WHERE STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 8), LINK_ID)
              ) A, TB_LINK B, TB_NODE C, TB_NODE D
@@ -124,7 +124,7 @@
                         SUM(FTLT_PNUM)     AS FTLT_PNUM,
                         SUM(INJR_PNUM)     AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_SECT_MN_STAT
+                 FROM TB_INCD_SECT_STAT_MN
                  WHERE STAT_DT BETWEEN '20201201000000' AND '20211201000000'
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 6), LINK_ID)
              ) A, TB_LINK B, TB_NODE C, TB_NODE D
@@ -153,7 +153,7 @@
                         SUM(FTLT_PNUM) AS FTLT_PNUM,
                         SUM(INJR_PNUM) AS INJR_PNUM,
                         SUM(PRPR_DMGE_AMT) AS PRPR_DMGE_AMT
-                 FROM TB_INCD_SECT_MN_STAT
+                 FROM TB_INCD_SECT_STAT_MN
                  WHERE STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
                  GROUP BY ROLLUP(SUBSTR(STAT_DT, 1, 4), LINK_ID)
              ) A, TB_LINK B, TB_NODE C, TB_NODE D