shjung há 3 anos atrás
pai
commit
467933af0e
57 ficheiros alterados com 4610 adições e 46 exclusões
  1. 81 0
      src/main/java/com/its/op/controller/its/scrs/ScSrvcStatisticsController.java
  2. 50 0
      src/main/java/com/its/op/controller/its/scrs/ScStrtStatisticsController.java
  3. 179 0
      src/main/java/com/its/op/controller/its/scrs/ScTfvlStatisticsController.java
  4. 34 0
      src/main/java/com/its/op/controller/its/scrs/TbScSgnlIxrOperHsController.java
  5. 54 0
      src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrController.java
  6. 30 0
      src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrSttsController.java
  7. 54 0
      src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrSttsHsController.java
  8. 60 0
      src/main/java/com/its/op/controller/its/wcam/TbWcamMonitoringController.java
  9. 21 0
      src/main/java/com/its/op/dao/mapper/its/scrs/ScSrvcStatisticsMapper.java
  10. 15 0
      src/main/java/com/its/op/dao/mapper/its/scrs/ScStrtStatisticsMapper.java
  11. 30 0
      src/main/java/com/its/op/dao/mapper/its/scrs/ScTfvlStatisticsMapper.java
  12. 24 0
      src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlIxrOperHsRepository.java
  13. 23 0
      src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrRepository.java
  14. 38 0
      src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrSttsHsRepository.java
  15. 20 0
      src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrSttsRepository.java
  16. 42 0
      src/main/java/com/its/op/dao/repository/its/wcam/TbWcamMonitoringRepository.java
  17. 13 0
      src/main/java/com/its/op/dto/its/cctv/TbCctvMonitoringDto.java
  18. 44 0
      src/main/java/com/its/op/dto/its/scrs/ScSrvcDto.java
  19. 21 0
      src/main/java/com/its/op/dto/its/scrs/ScSrvcParam.java
  20. 60 0
      src/main/java/com/its/op/dto/its/scrs/ScSrvcPtrnDto.java
  21. 20 0
      src/main/java/com/its/op/dto/its/scrs/ScSrvcPtrnParam.java
  22. 81 0
      src/main/java/com/its/op/dto/its/scrs/ScStrtDto.java
  23. 21 0
      src/main/java/com/its/op/dto/its/scrs/ScStrtParam.java
  24. 130 0
      src/main/java/com/its/op/dto/its/scrs/ScTfvlDto.java
  25. 22 0
      src/main/java/com/its/op/dto/its/scrs/ScTfvlParam.java
  26. 4 4
      src/main/java/com/its/op/dto/its/scrs/TbScIxrCmraMngmDto.java
  27. 287 0
      src/main/java/com/its/op/dto/its/scrs/TbScSgnlIxrOperHsDto.java
  28. 401 0
      src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrDto.java
  29. 94 0
      src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrSttsDto.java
  30. 78 0
      src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrSttsHsDto.java
  31. 116 0
      src/main/java/com/its/op/dto/its/wcam/TbWcamMonitoringDto.java
  32. 9 3
      src/main/java/com/its/op/entity/its/cctv/TbCctvMonitoring.java
  33. 4 4
      src/main/java/com/its/op/entity/its/scrs/TbScIxrCmraMngm.java
  34. 161 0
      src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrOperHs.java
  35. 21 0
      src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrOperHsKey.java
  36. 288 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamCtlr.java
  37. 58 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamCtlrStts.java
  38. 63 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamCtlrSttsHs.java
  39. 21 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamCtrlSttsHsKey.java
  40. 100 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamMonitoring.java
  41. 27 0
      src/main/java/com/its/op/entity/its/wcam/TbWcamMonitoringKey.java
  42. 1 3
      src/main/java/com/its/op/service/its/cctv/TbCctvCtlrService.java
  43. 175 29
      src/main/java/com/its/op/service/its/common/CommonSttsService.java
  44. 1 1
      src/main/java/com/its/op/service/its/rse/TbRseCtlrService.java
  45. 72 0
      src/main/java/com/its/op/service/its/scrs/ScSrvcStatisticsService.java
  46. 37 0
      src/main/java/com/its/op/service/its/scrs/ScStrtStatisticsService.java
  47. 154 0
      src/main/java/com/its/op/service/its/scrs/ScTfvlStatisticsService.java
  48. 31 0
      src/main/java/com/its/op/service/its/scrs/TbScSgnlIxrOperHsService.java
  49. 1 1
      src/main/java/com/its/op/service/its/vds/TbVdsCtlrService.java
  50. 1 1
      src/main/java/com/its/op/service/its/vms/TbVmsCtlrService.java
  51. 271 0
      src/main/java/com/its/op/service/its/wcam/TbWcamCtlrService.java
  52. 84 0
      src/main/java/com/its/op/service/its/wcam/TbWcamCtlrSttsHsService.java
  53. 30 0
      src/main/java/com/its/op/service/its/wcam/TbWcamCtlrSttsService.java
  54. 153 0
      src/main/java/com/its/op/service/its/wcam/TbWcamMonitoringService.java
  55. 132 0
      src/main/resources/mybatis/mapper/its/scrs/ScSrvcStatisticsMapper.xml
  56. 51 0
      src/main/resources/mybatis/mapper/its/scrs/ScStrtStatisticsMapper.xml
  57. 517 0
      src/main/resources/mybatis/mapper/its/scrs/ScTfvlStatisticsMapper.xml

+ 81 - 0
src/main/java/com/its/op/controller/its/scrs/ScSrvcStatisticsController.java

@@ -0,0 +1,81 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.ScSrvcDto;
+import com.its.op.dto.its.scrs.ScSrvcPtrnDto;
+import com.its.op.service.its.scrs.ScSrvcStatisticsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/scrs/statistics/srvc")
+@Api(tags = "14.스마트교차로-2.통계-2.교차로 서비스수준 통계")
+public class ScSrvcStatisticsController {
+
+    private final ScSrvcStatisticsService service;
+
+    @ApiOperation(value = "서비스수준 15분 통계", response = ScSrvcDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/15m", produces = {"application/json; charset=utf8"})
+    public List<ScSrvcDto> findSrvc15M(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findSrvc15M(ixrIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "서비스수준 시간 통계", response = ScSrvcDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/hh", produces = {"application/json; charset=utf8"})
+    public List<ScSrvcDto> findSrvcHH(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findSrvcHH(ixrIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "서비스수준 일 통계", response = ScSrvcDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/dd", produces = {"application/json; charset=utf8"})
+    public List<ScSrvcDto> findSrvcDD(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findSrvcDD(ixrIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "서비스수준 월 통계", response = ScSrvcDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/mn", produces = {"application/json; charset=utf8"})
+    public List<ScSrvcDto> findSrvcMN(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findSrvcMN(ixrIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "서비스수준 패턴 비교", response = ScSrvcPtrnDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/ptrn/{ixrId}/{baseDay}/{compDay}", produces = {"application/json; charset=utf8"})
+    public List<ScSrvcPtrnDto> findSrvcPtrnCompare(
+            @PathVariable("ixrId") final String ixrId,
+            @PathVariable("baseDay") final String baseDay,
+            @PathVariable("compDay") final String compDay) {
+        return this.service.findSrvcPtrnCompare(ixrId, baseDay, compDay);
+    }
+
+}

+ 50 - 0
src/main/java/com/its/op/controller/its/scrs/ScStrtStatisticsController.java

@@ -0,0 +1,50 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.ScStrtDto;
+import com.its.op.service.its.scrs.ScStrtStatisticsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/scrs/statistics/strt")
+@Api(tags = "14.스마트교차로-2.통계-3.교차로 주기수집 이력(포화도)")
+public class ScStrtStatisticsController {
+
+    private final ScStrtStatisticsService service;
+
+    @ApiOperation(value = "포화도 수집 이력", response = ScStrtDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/clct-hs", produces = {"application/json; charset=utf8"})
+    public List<ScStrtDto> findStrtClctHs(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findStrtClctHs(ixrIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "포화도 수집 이력-차로별", response = ScStrtDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/clct-lane-hs", produces = {"application/json; charset=utf8"})
+    public List<ScStrtDto> findStrtClctLaneHs(
+            @ApiParam(name = "ixrIds", value = "교차로 목록", example = "[11,12]", required = true)
+            @RequestParam List<String> ixrIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findStrtClctLaneHs(ixrIds, FROM_DT, TO_DT);
+    }
+
+}

+ 179 - 0
src/main/java/com/its/op/controller/its/scrs/ScTfvlStatisticsController.java

@@ -0,0 +1,179 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.ScTfvlDto;
+import com.its.op.service.its.scrs.ScTfvlStatisticsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/scrs/statistics/tfvl")
+@Api(tags = "14.스마트교차로-2.통계-1.교차로 교통량 통계")
+public class ScTfvlStatisticsController {
+
+    private final ScTfvlStatisticsService service;
+
+    @ApiOperation(value = "통계이력 05분", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/05m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl05M(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl05M(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 05분-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/05m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl05MLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl05MLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 15분", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/15m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl15M(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl15M(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 15분-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/15m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl15MLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl15MLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 30분", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/30m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl30M(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl30M(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 30분-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/30m/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvl30MLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvl30MLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 시간", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/hh/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlHH(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlHH(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 시간-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/hh/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlHHLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlHHLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 일", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/dd/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlDD(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlDD(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 일-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/dd/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlDDLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlDDLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+
+    @ApiOperation(value = "통계이력 월", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/mn/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlMN(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlMN(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+
+    @ApiOperation(value = "통계이력 월-차선별", response = ScTfvlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/lane/mn/{ixrId}", produces = {"application/json; charset=utf8"})
+    public List<ScTfvlDto> findTfvlMNLane(
+            @PathVariable("ixrId") final String ixrId,
+            @ApiParam(name = "cmraIds", value = "카메라 목록", example = "[1,2]", required = true)
+            @RequestParam List<String> cmraIds,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findTfvlMNLane(ixrId, cmraIds, FROM_DT, TO_DT);
+    }
+}

+ 34 - 0
src/main/java/com/its/op/controller/its/scrs/TbScSgnlIxrOperHsController.java

@@ -0,0 +1,34 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlIxrOperHsDto;
+import com.its.op.service.its.scrs.TbScSgnlIxrOperHsService;
+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 java.util.List;
+
+@Api(tags = "14.스마트교차로-3.이력-1.신호교차로운영이력")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/scrs/history/sgnl/history")
+public class TbScSgnlIxrOperHsController {
+
+    private final TbScSgnlIxrOperHsService service;
+
+    @ApiOperation(value = "신호교차로운영이력조회", response = TbScSgnlIxrOperHsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlIxrOperHsDto> findAllByDateRange(
+            @PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH240000)", example = "20210112150000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH245959)", example = "20221112155959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findAllByDateRange(sgnlIxrNmbr, FROM_DT, TO_DT);
+    }
+
+}

+ 54 - 0
src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrController.java

@@ -0,0 +1,54 @@
+package com.its.op.controller.its.wcam;
+
+import com.its.op.dto.its.common.NewIdLongDto;
+import com.its.op.dto.its.wcam.TbWcamCtlrDto;
+import com.its.op.service.its.wcam.TbWcamCtlrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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 = "10.웹카메라-1.웹카메라 관리-01.기본정보관리")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/wcam/manager/info")
+public class TbWcamCtlrController {
+
+    private final TbWcamCtlrService service;
+
+    @ApiOperation(value = "웹 카메라 전체조회(TB_WCAM_CTLR)", response = TbWcamCtlrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWcamCtlrDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "웹 카메라 개별조회(TB_WCAM_CTLR)", response = TbWcamCtlrDto.class)
+    @GetMapping(value = "/{wcamCtlrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbWcamCtlrDto findById(@PathVariable("wcamCtlrNmbr") final Long wcamCtlrNmbr) {
+        return this.service.findById(wcamCtlrNmbr);
+    }
+
+    @ApiOperation(value = "웹 카메라 정보변경/생성-개별(TB_WCAM_CTLR)", response = TbWcamCtlrDto.class)
+    @PostMapping(value = "/{wcamCtlrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbWcamCtlrDto mergeInfo(@PathVariable("wcamCtlrNmbr") final Long wcamCtlrNmbr, @RequestBody @Valid final TbWcamCtlrDto.TbWcamCtlrUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "웹 카메라 정보삭제-개별(TB_WCAM_CTLR)", response = TbWcamCtlrDto.class)
+    @DeleteMapping(value = "/{wcamCtlrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbWcamCtlrDto deleteDataById(@PathVariable("wcamCtlrNmbr") final Long wcamCtlrNmbr) {
+        return this.service.deleteById(wcamCtlrNmbr);
+    }
+
+    @ApiOperation(value = "신규 CCTV 제어기 ID 조회(TB_CCTV_CTLR)", response = NewIdLongDto.class)
+    @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})
+    public NewIdLongDto getNewNmbr() {
+        return this.service.getNewNmbr();
+    }
+
+}

+ 30 - 0
src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrSttsController.java

@@ -0,0 +1,30 @@
+package com.its.op.controller.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsDto;
+import com.its.op.service.its.wcam.TbWcamCtlrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "10.웹카메라-2.웹카메라 상태 모니터링")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/wcam/monitoring/stts")
+public class TbWcamCtlrSttsController {
+
+    private final TbWcamCtlrService service;
+
+    @ApiOperation(value = "웹 카메라 상태 전체조회(TB_WCAM_CTLR_STTS)", response = TbWcamCtlrSttsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWcamCtlrSttsDto> findAllStts() {
+        return this.service.findAllStts();
+    }
+
+}

+ 54 - 0
src/main/java/com/its/op/controller/its/wcam/TbWcamCtlrSttsHsController.java

@@ -0,0 +1,54 @@
+package com.its.op.controller.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsHsDto;
+import com.its.op.service.its.wcam.TbWcamCtlrSttsHsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Slf4j
+@Api(tags = "10.웹카메라-3.웹카메라 상태이력")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/wcam/history")
+public class TbWcamCtlrSttsHsController {
+
+    private final TbWcamCtlrSttsHsService service;
+
+    @ApiOperation(value = "웹 카메라 상태 이력조회(TB_VDS_CTLR_STTS_RAW)", response = TbWcamCtlrSttsHsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbWcamCtlrSttsHsDto> findAllByDateRange(
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH24MI00)", example = "20210112152000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH24MI59)", example = "20221112152000", required = true)
+            @RequestParam String TO_DT,
+            @ApiParam(name = "id", value = "VDS 관리번호 목록", example = "[00000001,00000002]", required = true)
+            @RequestParam List<Long> id
+    ) {
+        return this.service.findAllByDateRange(FROM_DT, TO_DT, id);
+    }
+
+    @ApiOperation(value = "웹 카메라 장애 이력조회(TB_VDS_CTLR_STTS_RAW)", response = TbWcamCtlrSttsHsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/fail", produces = {"application/json; charset=utf8"})
+    public List<TbWcamCtlrSttsHsDto> findAllFailByDateRange(
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH24MI00)", example = "20210112152000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH24MI59)", example = "20221112152000", required = true)
+            @RequestParam String TO_DT,
+            @ApiParam(name = "id", value = "VDS 관리번호 목록", example = "[00000001,00000002]", required = true)
+            @RequestParam List<Long> id
+    ) {
+        return this.service.findAllFailByDateRange(FROM_DT, TO_DT, id);
+    }
+
+}

+ 60 - 0
src/main/java/com/its/op/controller/its/wcam/TbWcamMonitoringController.java

@@ -0,0 +1,60 @@
+package com.its.op.controller.its.wcam;
+
+import com.its.op.dto.its.common.MonitoringListDto;
+import com.its.op.dto.its.wcam.TbWcamMonitoringDto;
+import com.its.op.service.its.wcam.TbWcamMonitoringService;
+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 = "10.웹카메라-4.웹카메라 영상 모니터링")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/wcam/monitoring")
+public class TbWcamMonitoringController {
+
+    private final TbWcamMonitoringService service;
+
+    @ApiOperation(value = "웹카메라 모니터링 화면 목록 조회(TB_CCTV_MONITORING)", response = MonitoringListDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/camera/list", produces = {"application/json; charset=utf8"})
+    public List<MonitoringListDto> findAllMonitoringList() {
+        return service.findAllMonitoringList(3);
+    }
+
+    @ApiOperation(value = "웹카메라 모니터링 화면 전체조회(TB_CCTV_MONITORING)", response = TbWcamMonitoringDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/camera", produces = {"application/json; charset=utf8"})
+    public List<TbWcamMonitoringDto> findAll() {
+        return service.findAllMonitoring(3);
+    }
+
+    @ApiOperation(value = "CCTV 카메라 모니터링 화면 개별조회-모니터링 명칭(TB_CCTV_MONITORING)", response = TbWcamMonitoringDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/camera/{name}", produces = {"application/json; charset=utf8"})
+    public List<TbWcamMonitoringDto> findByName(
+            @ApiParam(name = "name", value = "모니터링이름", example = "Default", required = true)
+            @PathVariable final String name) {
+        //	모니터링유형(1:예비,2,예비,3,영상,4:예비)
+        return service.findByName(3, name);
+    }
+
+    @ApiOperation(value = "웹카메라 모니터링 화면 정보변경/생성(TB_CCTV_MONITORING)", response = TbWcamMonitoringDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "/camera", produces = {"application/json; charset=utf8"})
+    public List<TbWcamMonitoringDto> mergeInfo(
+            @ApiParam(name = "req", value = "모니터링 목록", example = "Default", required = true)
+            @RequestBody @Valid final TbWcamMonitoringDto.TbWcamMonitoringUpdReq req) {
+        return this.service.mergeInfo(3, req.getMonitoringNm(), req);
+    }
+
+    @ApiOperation(value = "웹카메라 모니터링 화면 정보삭제-모니터링 명칭(TB_CCTV_MONITORING)", response = TbWcamMonitoringDto.class, responseContainer = "ArrayList")
+    @DeleteMapping(value = "/camera/{name}", produces = {"application/json; charset=utf8"})
+    public List<TbWcamMonitoringDto> deleteByName(@PathVariable("name") String name) {
+        return this.service.deleteByName(3, name);
+    }
+
+}

+ 21 - 0
src/main/java/com/its/op/dao/mapper/its/scrs/ScSrvcStatisticsMapper.java

@@ -0,0 +1,21 @@
+package com.its.op.dao.mapper.its.scrs;
+
+import com.its.op.dto.its.scrs.ScSrvcDto;
+import com.its.op.dto.its.scrs.ScSrvcParam;
+import com.its.op.dto.its.scrs.ScSrvcPtrnDto;
+import com.its.op.dto.its.scrs.ScSrvcPtrnParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ScSrvcStatisticsMapper {
+
+    List<ScSrvcDto> findSrvc15M(@Param("cond") ScSrvcParam cond);
+    List<ScSrvcDto> findSrvcHH(@Param("cond") ScSrvcParam cond);
+    List<ScSrvcDto> findSrvcDD(@Param("cond") ScSrvcParam cond);
+    List<ScSrvcDto> findSrvcMN(@Param("cond") ScSrvcParam cond);
+
+    List<ScSrvcPtrnDto> findSrvcPtrnCompare(@Param("cond") ScSrvcPtrnParam cond);
+}

+ 15 - 0
src/main/java/com/its/op/dao/mapper/its/scrs/ScStrtStatisticsMapper.java

@@ -0,0 +1,15 @@
+package com.its.op.dao.mapper.its.scrs;
+
+import com.its.op.dto.its.scrs.ScStrtDto;
+import com.its.op.dto.its.scrs.ScStrtParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ScStrtStatisticsMapper {
+
+    List<ScStrtDto> findStrtClctHs(@Param("cond") ScStrtParam cond);
+    List<ScStrtDto> findStrtClctLaneHs(@Param("cond") ScStrtParam cond);
+}

+ 30 - 0
src/main/java/com/its/op/dao/mapper/its/scrs/ScTfvlStatisticsMapper.java

@@ -0,0 +1,30 @@
+package com.its.op.dao.mapper.its.scrs;
+
+import com.its.op.dto.its.scrs.ScTfvlDto;
+import com.its.op.dto.its.scrs.ScTfvlParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ScTfvlStatisticsMapper {
+
+    List<ScTfvlDto> findTfvl05M(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvl05MLane(@Param("cond") ScTfvlParam cond);
+
+    List<ScTfvlDto> findTfvl15M(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvl15MLane(@Param("cond") ScTfvlParam cond);
+
+    List<ScTfvlDto> findTfvl30M(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvl30MLane(@Param("cond") ScTfvlParam cond);
+
+    List<ScTfvlDto> findTfvlHH(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvlHHLane(@Param("cond") ScTfvlParam cond);
+
+    List<ScTfvlDto> findTfvlDD(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvlDDLane(@Param("cond") ScTfvlParam cond);
+
+    List<ScTfvlDto> findTfvlMN(@Param("cond") ScTfvlParam cond);
+    List<ScTfvlDto> findTfvlMNLane(@Param("cond") ScTfvlParam cond);
+}

+ 24 - 0
src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlIxrOperHsRepository.java

@@ -0,0 +1,24 @@
+package com.its.op.dao.repository.its.scrs;
+
+import com.its.op.entity.its.scrs.TbScSgnlIxrOperHs;
+import com.its.op.entity.its.scrs.TbScSgnlIxrOperHsKey;
+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 TbScSgnlIxrOperHsRepository extends JpaRepository<TbScSgnlIxrOperHs, TbScSgnlIxrOperHsKey>, JpaSpecificationExecutor<TbScSgnlIxrOperHs> {
+
+    @Query("select p from TbScSgnlIxrOperHs p")
+    List<TbScSgnlIxrOperHs> findAll();
+
+    @Query("select p from TbScSgnlIxrOperHs p")
+    List<TbScSgnlIxrOperHs> findAllList();
+
+    @Query("select p from TbScSgnlIxrOperHs p inner join fetch p.sgnl where p.clctDt between :fromDt and :toDt and p.sgnlIxrNmbr in :sgnlIxrNmbr")
+    List<TbScSgnlIxrOperHs> findAllByDateRange(@Param("sgnlIxrNmbr") Integer sgnlIxrNmbr, @Param("fromDt") String fromDt, @Param("toDt") String toDt);
+}

+ 23 - 0
src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrRepository.java

@@ -0,0 +1,23 @@
+package com.its.op.dao.repository.its.wcam;
+
+import com.its.op.entity.its.wcam.TbWcamCtlr;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbWcamCtlrRepository extends JpaRepository<TbWcamCtlr, Long>, JpaSpecificationExecutor<TbWcamCtlr> {
+
+    @Query("select p from TbWcamCtlr p left outer join fetch p.state state")
+    List<TbWcamCtlr> findAll();
+
+    @Query("select p from TbWcamCtlr p left outer join fetch p.state state where p.delYn = 'N'")
+    List<TbWcamCtlr> findAllList();
+
+    @Query(value = "SELECT NVL(MAX(WCAM_CTLR_NMBR), 0) + 1 AS NEWID FROM TB_WCAM_CTLR", nativeQuery = true)
+    Long getNewNmbr();
+
+}

+ 38 - 0
src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrSttsHsRepository.java

@@ -0,0 +1,38 @@
+package com.its.op.dao.repository.its.wcam;
+
+import com.its.op.dto.its.common.SttsHsErrCntInf;
+import com.its.op.entity.its.wcam.TbWcamCtlrSttsHs;
+import com.its.op.entity.its.wcam.TbWcamCtrlSttsHsKey;
+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 TbWcamCtlrSttsHsRepository extends JpaRepository<TbWcamCtlrSttsHs, TbWcamCtrlSttsHsKey>, JpaSpecificationExecutor<TbWcamCtlrSttsHs> {
+
+    @Query("select p from TbWcamCtlrSttsHs p")
+    List<TbWcamCtlrSttsHs> findAll();
+
+    @Query("select p from TbWcamCtlrSttsHs p")
+    List<TbWcamCtlrSttsHs> findAllList();
+
+    @Query("select p.wcamCtlrNmbr as nmbr, count(p.wcamCtlrNmbr) as errCnt " +
+            "  from TbWcamCtlrSttsHs p " +
+            " where p.crtnDt     >= :fromDt " +
+            "   and p.cmncSttsCd <> 'CMS0' " +
+            " group by p.wcamCtlrNmbr")
+    List<SttsHsErrCntInf> findAllCommErrorCount(@Param("fromDt") String fromDt);
+
+    @Query("select p from TbWcamCtlrSttsHs p inner join fetch p.wcam where p.crtnDt between :fromDt and :toDt and p.wcamCtlrNmbr in :ids")
+    List<TbWcamCtlrSttsHs> findAllByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt, @Param("fromDt") List<Long> ids);
+
+    @Query("select p from TbWcamCtlrSttsHs p inner join fetch p.wcam " +
+            " where p.crtnDt between :fromDt and :toDt " +
+            "   and (p.cmncSttsCd <> 'CMS0')" +
+            "   and p.wcamCtlrNmbr in :ids")
+    List<TbWcamCtlrSttsHs> findAllFailByDateRange(@Param("fromDt") String fromDt, @Param("toDt") String toDt, @Param("ids") List<Long> ids);
+}

+ 20 - 0
src/main/java/com/its/op/dao/repository/its/wcam/TbWcamCtlrSttsRepository.java

@@ -0,0 +1,20 @@
+package com.its.op.dao.repository.its.wcam;
+
+import com.its.op.entity.its.wcam.TbWcamCtlrStts;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbWcamCtlrSttsRepository extends JpaRepository<TbWcamCtlrStts, Long>, JpaSpecificationExecutor<TbWcamCtlrStts> {
+
+    @Query("select p from TbWcamCtlrStts p")
+    List<TbWcamCtlrStts> findAll();
+
+    @Query("select p from TbWcamCtlrStts p")
+    List<TbWcamCtlrStts> findAllList();
+
+}

+ 42 - 0
src/main/java/com/its/op/dao/repository/its/wcam/TbWcamMonitoringRepository.java

@@ -0,0 +1,42 @@
+package com.its.op.dao.repository.its.wcam;
+
+import com.its.op.dto.its.common.MonitoringListInf;
+import com.its.op.entity.its.wcam.TbWcamMonitoring;
+import com.its.op.entity.its.wcam.TbWcamMonitoringKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Repository
+public interface TbWcamMonitoringRepository extends JpaRepository<TbWcamMonitoring, TbWcamMonitoringKey>, JpaSpecificationExecutor<TbWcamMonitoring> {
+
+    @Query("select p from TbWcamMonitoring p")
+    List<TbWcamMonitoring> findAll();
+
+    @Query("select p.monitoringNm as name, count(p.monitoringNm) as count " +
+            "  from TbWcamMonitoring p " +
+            " where p.monitoringType = :monitoringType " +
+            " group by p.monitoringNm")
+    List<MonitoringListInf> findAllMonitoringList(@Param("monitoringType") Integer monitoringType);
+
+    @Query("select p from TbWcamMonitoring p")
+    List<TbWcamMonitoring> findAllList();
+
+    @Query("select p from TbWcamMonitoring p inner join fetch p.wcam wcam where p.monitoringType = :monitoringType")
+    List<TbWcamMonitoring> findAllMonitoring(@Param("monitoringType") Integer monitoringType);
+
+    @Query("select p from TbWcamMonitoring p inner join fetch p.wcam wcam where p.monitoringType = :monitoringType and p.monitoringNm = :monitoringNm")
+    List<TbWcamMonitoring> findByName(@Param("monitoringType") Integer monitoringType, @Param("monitoringNm") String monitoringNm);
+
+    @Transactional
+    @Modifying
+    @Query("delete from TbWcamMonitoring p where p.monitoringType = :monitoringType and p.monitoringNm = :monitoringNm")
+    void deleteByName(@Param("monitoringType") Integer monitoringType, @Param("monitoringNm") String monitoringNm);
+
+}

+ 13 - 0
src/main/java/com/its/op/dto/its/cctv/TbCctvMonitoringDto.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
+import javax.persistence.Column;
 import javax.validation.constraints.PositiveOrZero;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
@@ -72,6 +73,18 @@ public class TbCctvMonitoringDto implements Serializable {
     @JsonProperty("web_rtc_id")
     private String webRtcId;
 
+    @ApiModelProperty("RTC 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "RTC_SVR_IP", length = 20)
+    private String rtcSvrIp;
+
+    @ApiModelProperty("RTC 서버 포트")  // Y NUMBER(5)
+    @Column(name = "RTC_SVR_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer rtcSvrPort;
+
+    @ApiModelProperty("RTC ID")  // Y VARCHAR2(56)
+    @Column(name = "RTC_ID", length = 56)
+    private String rtcId;
+
     @ApiModel("TbCctvMonitoringUpdReq(웹카메라 모니터링 화면 정보변경)")
     @Getter
     @Setter

+ 44 - 0
src/main/java/com/its/op/dto/its/scrs/ScSrvcDto.java

@@ -0,0 +1,44 @@
+package com.its.op.dto.its.scrs;
+
+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;
+
+/**
+ * 교차로 서비스수준 통계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("ScSrvcDto(교차로 서비스수준 통계)")
+public class ScSrvcDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("교차로 ID")
+    @JsonProperty("ixr_id")
+    private String ixrId;
+
+    @ApiModelProperty("교차로 명")
+    @JsonProperty("ixr_nm")
+    private String ixrNm;
+
+    @ApiModelProperty("통계 일시")
+    @JsonProperty("stat_dt")
+    private String statDt;
+
+    @ApiModelProperty("서비스 수준")
+    @JsonProperty("srvc_lvl")
+    private Integer srvcLvl;
+
+    @ApiModelProperty("지체 시간")
+    @JsonProperty("dely_hh")
+    private Double delyHh;
+
+    @ApiModelProperty("교통량")
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+}

+ 21 - 0
src/main/java/com/its/op/dto/its/scrs/ScSrvcParam.java

@@ -0,0 +1,21 @@
+package com.its.op.dto.its.scrs;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 영상 검지기 원시 수집 파라미터 Class
+ */
+@Data
+@Builder
+public class ScSrvcParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private List<String> ixrIds;
+
+    private String fromDt;     // HH+0000
+    private String toDt;       // HH+5959
+
+}

+ 60 - 0
src/main/java/com/its/op/dto/its/scrs/ScSrvcPtrnDto.java

@@ -0,0 +1,60 @@
+package com.its.op.dto.its.scrs;
+
+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;
+
+/**
+ * 교차로 서비스수준 통계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("ScSrvcPtrnDto(교차로 서비스수준 패턴 통계)")
+public class ScSrvcPtrnDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("교차로 ID")
+    @JsonProperty("ixr_id")
+    private String ixrId;
+
+    @ApiModelProperty("교차로 명")
+    @JsonProperty("ixr_nm")
+    private String ixrNm;
+//
+//    @ApiModelProperty("통계 일시")
+//    @JsonProperty("stat_dt")
+//    private String statDt;
+
+    @ApiModelProperty("통계 시각")
+    @JsonProperty("stat_hh")
+    private String statHh;
+
+    @ApiModelProperty("서비스 수준-기준일")
+    @JsonProperty("srvc_lvl")
+    private Integer srvcLvl;
+
+    @ApiModelProperty("지체 시간-기준일")
+    @JsonProperty("dely_hh")
+    private Double delyHh;
+
+    @ApiModelProperty("교통량-기준일")
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+    @ApiModelProperty("서비스 수준-비교일")
+    @JsonProperty("comp_srvc_lvl")
+    private Integer compSrvcLvl;
+
+    @ApiModelProperty("지체 시간-비교일")
+    @JsonProperty("comp_dely_hh")
+    private Double compDelyHh;
+
+    @ApiModelProperty("교통량-비교일")
+    @JsonProperty("comp_tfvl")
+    private Integer compTfvl;
+
+}

+ 20 - 0
src/main/java/com/its/op/dto/its/scrs/ScSrvcPtrnParam.java

@@ -0,0 +1,20 @@
+package com.its.op.dto.its.scrs;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 영상 검지기 원시 수집 파라미터 Class
+ */
+@Data
+@Builder
+public class ScSrvcPtrnParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String ixrId;
+
+    private String baseDay;
+    private String compDay;
+
+}

+ 81 - 0
src/main/java/com/its/op/dto/its/scrs/ScStrtDto.java

@@ -0,0 +1,81 @@
+package com.its.op.dto.its.scrs;
+
+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;
+
+/**
+ * 교차로 주기 수집 이력 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("ScStrtDto(교차로 주기 수집 이력)")
+public class ScStrtDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("교차로 ID")
+    @JsonProperty("ixr_id")
+    private String ixrId;
+
+    @ApiModelProperty("교차로 명")
+    @JsonProperty("ixr_nm")
+    private String ixrNm;
+
+//    @ApiModelProperty("카메라 ID")
+//    @JsonProperty("cmra_id")
+//    private String cmraId;
+//
+//    @ApiModelProperty("설치 위치")
+//    @JsonProperty("istl_lctn")
+//    private String istlLctn;
+//
+//    @ApiModelProperty("방향 구분 코드")
+//    @JsonProperty("drct_dvsn_cd")
+//    private Integer drctDvsnCd;
+//
+//    @ApiModelProperty("방향 구분 코드 설명")
+//    @JsonProperty("drct_dvsn_nm")
+//    private String drctDvsnNm;
+
+
+    @ApiModelProperty("수집 일시")
+    @JsonProperty("clct_dt")
+    private String clctDt;
+
+    @ApiModelProperty("교통량")
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+    @ApiModelProperty("포화도")
+    @JsonProperty("strt")
+    private Integer strt;
+
+    @ApiModelProperty("차로")
+    @JsonProperty("lane")
+    private Integer lane;
+
+//    @ApiModelProperty("차량 방향")
+//    @JsonProperty("vhcl_drct")
+//    private Integer vhclDrct;
+
+    @ApiModelProperty("포화 교통 유율")
+    @JsonProperty("stdg_trfc_rate")
+    private Integer stdgTrfcRate;
+
+    @ApiModelProperty("점유 시간")
+    @JsonProperty("ocpy_hh")
+    private Integer ocpyHh;
+
+    @ApiModelProperty("비점유 시간")
+    @JsonProperty("nocp_hh")
+    private Integer nocpHh;
+
+//    @ApiModelProperty("현시 번호")
+//    @JsonProperty("phas_nmbr")
+//    private Integer phasNmbr;
+
+}

+ 21 - 0
src/main/java/com/its/op/dto/its/scrs/ScStrtParam.java

@@ -0,0 +1,21 @@
+package com.its.op.dto.its.scrs;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 영상 검지기 원시 수집 파라미터 Class
+ */
+@Data
+@Builder
+public class ScStrtParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private List<String> ixrIds;
+
+    private String fromDt;     // HH+0000
+    private String toDt;       // HH+5959
+
+}

+ 130 - 0
src/main/java/com/its/op/dto/its/scrs/ScTfvlDto.java

@@ -0,0 +1,130 @@
+package com.its.op.dto.its.scrs;
+
+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;
+
+/**
+ * 영상 검지기 원시 수집 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("ScTfvlDto(교차로 교통량 DTO)")
+public class ScTfvlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("교차로 ID")
+    @JsonProperty("ixr_id")
+    private String ixrId;
+
+    @ApiModelProperty("교차로 명")
+    @JsonProperty("ixr_nm")
+    private String ixrNm;
+
+    @ApiModelProperty("카메라 ID")
+    @JsonProperty("cmra_id")
+    private String cmraId;
+
+    @ApiModelProperty("설치 위치")
+    @JsonProperty("istl_lctn")
+    private String istlLctn;
+
+    @ApiModelProperty("방향 구분 코드")
+    @JsonProperty("drct_dvsn_cd")
+    private Integer drctDvsnCd;
+
+    @ApiModelProperty("방향 구분 코드 설명")
+    @JsonProperty("drct_dvsn_nm")
+    private String drctDvsnNm;
+
+
+    @ApiModelProperty("통계 일시")
+    @JsonProperty("stat_dt")
+    private String statDt;
+
+    @ApiModelProperty("차로")
+    @JsonProperty("lane")
+    private Integer lane;
+
+    @ApiModelProperty("초기 대기 열 길이")
+    @JsonProperty("intl_atmp_heat_lngt")
+    private Integer intlAtmpHeatLngt;
+
+    @ApiModelProperty("점유 율")
+    @JsonProperty("ocpy_rate")
+    private Double ocpyRate;
+
+    @ApiModelProperty("보행 수")
+    @JsonProperty("walk_cnt")
+    private Integer walkCnt;
+
+    @ApiModelProperty("대 직진 교통량")
+    @JsonProperty("lrg_go_tfvl")
+    private Integer lrgGoTfvl;
+
+    @ApiModelProperty("중 직진 교통량")
+    @JsonProperty("mddl_go_tfvl")
+    private Integer mddlGoTfvl;
+
+    @ApiModelProperty("소 직진 교통량")
+    @JsonProperty("smal_go_tfvl")
+    private Integer smalGoTfvl;
+
+    @ApiModelProperty("대 좌회전 교통량")
+    @JsonProperty("lrg_left_tfvl")
+    private Integer lrgLeftTfvl;
+
+    @ApiModelProperty("중 좌회전 교통량")
+    @JsonProperty("mddl_left_tfvl")
+    private Integer mddlLeftTfvl;
+
+    @ApiModelProperty("소 좌회전 교통량")
+    @JsonProperty("smal_left_tfvl")
+    private Integer smalLeftTfvl;
+
+    @ApiModelProperty("대 우회전 교통량")
+    @JsonProperty("lrg_rght_tfvl")
+    private Integer lrgRghtTfvl;
+
+    @ApiModelProperty("중 우회전 교통량")
+    @JsonProperty("mddl_rght_tfvl")
+    private Integer mddlRghtTfvl;
+
+    @ApiModelProperty("소 우회전 교통량")
+    @JsonProperty("smal_rght_tfvl")
+    private Integer smalRghtTfvl;
+
+    @ApiModelProperty("U턴 교통량")
+    @JsonProperty("uturn_tfvl")
+    private Integer uturnTfvl;
+
+    @ApiModelProperty("속도")
+    @JsonProperty("sped")
+    private Integer sped;
+
+    @ApiModelProperty("버스 전용 차로 직진 교통량")
+    @JsonProperty("bus_dvrs_lane_go_tfvl")
+    private Integer busDvrsLaneGoTfvl;
+
+    @ApiModelProperty("버스 전용 차로 좌회전 교통량")
+    @JsonProperty("bus_dvrs_lane_left_tfvl")
+    private Integer busDvrsLaneLeftTfvl;
+
+    @ApiModelProperty("오토바이 직진 교통량")
+    @JsonProperty("bike_go_tfvl")
+    private Integer bikeGoTfvl;
+
+    @ApiModelProperty("오토바이 좌회전 교통량")
+    @JsonProperty("bike_left_tfvl")
+    private Integer bikeLeftTfvl;
+
+    @ApiModelProperty("오토바이 우회전 교통량")
+    @JsonProperty("bike_rght_tfvl")
+    private Integer bikeRghtTfvl;
+
+
+}

+ 22 - 0
src/main/java/com/its/op/dto/its/scrs/ScTfvlParam.java

@@ -0,0 +1,22 @@
+package com.its.op.dto.its.scrs;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 영상 검지기 원시 수집 파라미터 Class
+ */
+@Data
+@Builder
+public class ScTfvlParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String ixrId;
+
+    private String fromDt;     // HH+0000
+    private String toDt;       // HH+5959
+    private List<String> cmraIds;
+
+}

+ 4 - 4
src/main/java/com/its/op/dto/its/scrs/TbScIxrCmraMngmDto.java

@@ -250,10 +250,10 @@ public class TbScIxrCmraMngmDto implements Serializable {
                     .streUrl(this.streUrl)
                     .cmraUrl(this.cmraUrl)
                     .cmraType(this.cmraType)
-                    .cmraXCrdn(this.cmraYCrdn)
-                    .cmraYCrdn(this.cmraXCrdn)
-//                    .cmraXCrdn(this.cmraXCrdn)
-//                    .cmraYCrdn(this.cmraYCrdn)
+//                    .cmraXCrdn(this.cmraYCrdn)
+//                    .cmraYCrdn(this.cmraXCrdn)
+                    .cmraXCrdn(this.cmraXCrdn)
+                    .cmraYCrdn(this.cmraYCrdn)
                     .cmraAngl(this.cmraAngl)
                     .hmpgDsplEn(this.hmpgDsplEn)
                     .busDvrsLaneEn(this.busDvrsLaneEn)

+ 287 - 0
src/main/java/com/its/op/dto/its/scrs/TbScSgnlIxrOperHsDto.java

@@ -0,0 +1,287 @@
+package com.its.op.dto.its.scrs;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.scrs.TbScSgnlIxrOperHs;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 신호 교차로 운영 이력 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbScSgnlIxrOperHsDto(신호 교차로 운영 이력)")
+public class TbScSgnlIxrOperHsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @JsonProperty("sgnl_ixr_nmbr")
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("교차로 명")  // Y VARCHAR2(50)
+    @JsonProperty("ixr_nm")
+    private String ixrNm;
+
+    @ApiModelProperty("수집 일시")  // N VARCHAR2(14)
+    @JsonProperty("clct_dt")
+    private String clctDt;
+
+    @ApiModelProperty("제어모드(0: TRC, 1: TOD, 2: MAN)")  // Y NUMBER(1)
+    @JsonProperty("cntl_mode")
+    private Integer cntlMode;
+
+    @ApiModelProperty("제어상태(0: 온라인, 1: 오프라인, 2: 트랜스, 3: 통신장애)")  // Y NUMBER(1)
+    @JsonProperty("cntl_stts")
+    private Integer cntlStts;
+
+    @ApiModelProperty("주기")  // Y NUMBER(3)
+    @JsonProperty("cycl")
+    private Integer cycl;
+
+    @ApiModelProperty("옵셋")  // Y NUMBER(3)
+    @JsonProperty("ofst")
+    private Integer ofst;
+
+    @ApiModelProperty("A링 1현시")  // Y NUMBER(3)
+    @JsonProperty("aring_1phas")
+    private Integer aring1phas;
+
+    @ApiModelProperty("A링 2현시")  // Y NUMBER(3)
+    @JsonProperty("aring_2phas")
+    private Integer aring2phas;
+
+    @ApiModelProperty("A링 3현시")  // Y NUMBER(3)
+    @JsonProperty("aring_3phas")
+    private Integer aring3phas;
+
+    @ApiModelProperty("A링 4현시")  // Y NUMBER(3)
+    @JsonProperty("aring_4phas")
+    private Integer aring4phas;
+
+    @ApiModelProperty("A링 5현시")  // Y NUMBER(3)
+    @JsonProperty("aring_5phas")
+    private Integer aring5phas;
+
+    @ApiModelProperty("A링 6현시")  // Y NUMBER(3)
+    @JsonProperty("aring_6phas")
+    private Integer aring6phas;
+
+    @ApiModelProperty("A링 7현시")  // Y NUMBER(3)
+    @JsonProperty("aring_7phas")
+    private Integer aring7phas;
+
+    @ApiModelProperty("A링 8현시")  // Y NUMBER(3)
+    @JsonProperty("aring_8phas")
+    private Integer aring8phas;
+
+    @ApiModelProperty("B링 1현시")  // Y NUMBER(3)
+    @JsonProperty("bring_1phas")
+    private Integer bring1phas;
+
+    @ApiModelProperty("B링 2현시")  // Y NUMBER(3)
+    @JsonProperty("bring_2phas")
+    private Integer bring2phas;
+
+    @ApiModelProperty("B링 3현시")  // Y NUMBER(3)
+    @JsonProperty("bring_3phas")
+    private Integer bring3phas;
+
+    @ApiModelProperty("B링 4현시")  // Y NUMBER(3)
+    @JsonProperty("bring_4phas")
+    private Integer bring4phas;
+
+    @ApiModelProperty("B링 5현시")  // Y NUMBER(3)
+    @JsonProperty("bring_5phas")
+    private Integer bring5phas;
+
+    @ApiModelProperty("B링 6현시")  // Y NUMBER(3)
+    @JsonProperty("bring_6phas")
+    private Integer bring6phas;
+
+    @ApiModelProperty("B링 7현시")  // Y NUMBER(3)
+    @JsonProperty("bring_7phas")
+    private Integer bring7phas;
+
+    @ApiModelProperty("B링 8현시")  // Y NUMBER(3)
+    @JsonProperty("bring_8phas")
+    private Integer bring8phas;
+
+    // Code Description Field
+    @ApiModel("TbScSgnlIxrOperHsUpdReq(신호 교차로 운영 이력 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbScSgnlIxrOperHsUpdReq {
+
+        @ApiModelProperty("수집 일시, Nullable = N, VARCHAR2(14)")  // N VARCHAR2(14)
+        @JsonProperty("clct_dt")
+        @Size(min=1, max=14)
+        private String clctDt;
+
+        @ApiModelProperty("신호 교차로 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("sgnl_ixr_nmbr")
+        @PositiveOrZero
+        private Integer sgnlIxrNmbr;
+
+        @ApiModelProperty("제어모드(0: TRC, 1: TOD, 2: MAN), Nullable = Y, NUMBER(1)")  // Y NUMBER(1)
+        @JsonProperty("cntl_mode")
+        @PositiveOrZero
+        private Integer cntlMode;
+
+        @ApiModelProperty("제어상태(0: 온라인, 1: 오프라인, 2: 트랜스, 3: 통신장애), Nullable = Y, NUMBER(1)")  // Y NUMBER(1)
+        @JsonProperty("cntl_stts")
+        @PositiveOrZero
+        private Integer cntlStts;
+
+        @ApiModelProperty("주기, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("cycl")
+        @PositiveOrZero
+        private Integer cycl;
+
+        @ApiModelProperty("옵셋, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("ofst")
+        @PositiveOrZero
+        private Integer ofst;
+
+        @ApiModelProperty("A링 1현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_1phas")
+        @PositiveOrZero
+        private Integer aring1phas;
+
+        @ApiModelProperty("A링 2현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_2phas")
+        @PositiveOrZero
+        private Integer aring2phas;
+
+        @ApiModelProperty("A링 3현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_3phas")
+        @PositiveOrZero
+        private Integer aring3phas;
+
+        @ApiModelProperty("A링 4현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_4phas")
+        @PositiveOrZero
+        private Integer aring4phas;
+
+        @ApiModelProperty("A링 5현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_5phas")
+        @PositiveOrZero
+        private Integer aring5phas;
+
+        @ApiModelProperty("A링 6현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_6phas")
+        @PositiveOrZero
+        private Integer aring6phas;
+
+        @ApiModelProperty("A링 7현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_7phas")
+        @PositiveOrZero
+        private Integer aring7phas;
+
+        @ApiModelProperty("A링 8현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("aring_8phas")
+        @PositiveOrZero
+        private Integer aring8phas;
+
+        @ApiModelProperty("B링 1현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_1phas")
+        @PositiveOrZero
+        private Integer bring1phas;
+
+        @ApiModelProperty("B링 2현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_2phas")
+        @PositiveOrZero
+        private Integer bring2phas;
+
+        @ApiModelProperty("B링 3현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_3phas")
+        @PositiveOrZero
+        private Integer bring3phas;
+
+        @ApiModelProperty("B링 4현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_4phas")
+        @PositiveOrZero
+        private Integer bring4phas;
+
+        @ApiModelProperty("B링 5현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_5phas")
+        @PositiveOrZero
+        private Integer bring5phas;
+
+        @ApiModelProperty("B링 6현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_6phas")
+        @PositiveOrZero
+        private Integer bring6phas;
+
+        @ApiModelProperty("B링 7현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_7phas")
+        @PositiveOrZero
+        private Integer bring7phas;
+
+        @ApiModelProperty("B링 8현시, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("bring_8phas")
+        @PositiveOrZero
+        private Integer bring8phas;
+
+        @Builder
+        public TbScSgnlIxrOperHsUpdReq(String clct_dt, Integer sgnl_ixr_nmbr, Integer cntl_mode, Integer cntl_stts, Integer cycl, Integer ofst, Integer aring_1phas, Integer aring_2phas, Integer aring_3phas, Integer aring_4phas, Integer aring_5phas, Integer aring_6phas, Integer aring_7phas, Integer aring_8phas, Integer bring_1phas, Integer bring_2phas, Integer bring_3phas, Integer bring_4phas, Integer bring_5phas, Integer bring_6phas, Integer bring_7phas, Integer bring_8phas) {
+            this.clctDt = clct_dt;
+            this.sgnlIxrNmbr = sgnl_ixr_nmbr;
+            this.cntlMode = cntl_mode;
+            this.cntlStts = cntl_stts;
+            this.cycl = cycl;
+            this.ofst = ofst;
+            this.aring1phas = aring_1phas;
+            this.aring2phas = aring_2phas;
+            this.aring3phas = aring_3phas;
+            this.aring4phas = aring_4phas;
+            this.aring5phas = aring_5phas;
+            this.aring6phas = aring_6phas;
+            this.aring7phas = aring_7phas;
+            this.aring8phas = aring_8phas;
+            this.bring1phas = bring_1phas;
+            this.bring2phas = bring_2phas;
+            this.bring3phas = bring_3phas;
+            this.bring4phas = bring_4phas;
+            this.bring5phas = bring_5phas;
+            this.bring6phas = bring_6phas;
+            this.bring7phas = bring_7phas;
+            this.bring8phas = bring_8phas;
+        }
+
+        public TbScSgnlIxrOperHs toEntity() {
+            return TbScSgnlIxrOperHs.builder()
+                    .clctDt(this.clctDt)
+                    .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                    .cntlMode(this.cntlMode)
+                    .cntlStts(this.cntlStts)
+                    .cycl(this.cycl)
+                    .ofst(this.ofst)
+                    .aring1phas(this.aring1phas)
+                    .aring2phas(this.aring2phas)
+                    .aring3phas(this.aring3phas)
+                    .aring4phas(this.aring4phas)
+                    .aring5phas(this.aring5phas)
+                    .aring6phas(this.aring6phas)
+                    .aring7phas(this.aring7phas)
+                    .aring8phas(this.aring8phas)
+                    .bring1phas(this.bring1phas)
+                    .bring2phas(this.bring2phas)
+                    .bring3phas(this.bring3phas)
+                    .bring4phas(this.bring4phas)
+                    .bring5phas(this.bring5phas)
+                    .bring6phas(this.bring6phas)
+                    .bring7phas(this.bring7phas)
+                    .bring8phas(this.bring8phas)
+                    .build();
+        }
+
+    }
+
+}

+ 401 - 0
src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrDto.java

@@ -0,0 +1,401 @@
+package com.its.op.dto.its.wcam;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.wcam.TbWcamCtlr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbWcamCtlrDto(웹 카메라)")
+public class TbWcamCtlrDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @JsonProperty("wcam_ctlr_nmbr")
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("웹카메라 제어기 ID")  // Y VARCHAR2(30)
+    @JsonProperty("wcam_ctlr_id")
+    private String wcamCtlrId;
+
+    @ApiModelProperty("웹카메라 명칭")  // Y VARCHAR2(40)
+    @JsonProperty("wcam_nm")
+    private String wcamNm;
+
+    @ApiModelProperty("웹카메라 제어기 아이피")  // Y VARCHAR2(20)
+    @JsonProperty("wcam_ctlr_ip")
+    private String wcamCtlrIp;
+
+    @ApiModelProperty("웹카메라제어기 포트")  // Y VARCHAR2(5)
+    @JsonProperty("wcam_ctlr_port")
+    private String wcamCtlrPort;
+
+    @ApiModelProperty("웹카메라 제어기 지역번호")  // Y NUMBER(5)
+    @JsonProperty("wcam_ctlr_local_no")
+    private Integer wcamCtlrLocalNo;
+
+    @ApiModelProperty("웹카메라 유형")  // Y VARCHAR2(7)
+    @JsonProperty("wcam_type_cd")
+    private String wcamTypeCd;
+
+    @ApiModelProperty("설치 위치 명")  // Y VARCHAR2(40)
+    @JsonProperty("istl_lctn_nm")
+    private String istlLctnNm;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @JsonProperty("x_crdn")
+    private Double xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @JsonProperty("y_crdn")
+    private Double yCrdn;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @JsonProperty("del_yn")
+    private String delYn;
+
+    @ApiModelProperty("스트리밍 서버 아이피")  // Y VARCHAR2(20)
+    @JsonProperty("strm_svr_ip")
+    private String strmSvrIp;
+
+    @ApiModelProperty("스트리밍 서버 포트")  // Y VARCHAR2(5)
+    @JsonProperty("strm_svr_port")
+    private String strmSvrPort;
+
+    @ApiModelProperty("스트리밍 세션 명")  // Y VARCHAR2(200)
+    @JsonProperty("strm_sesn_nm")
+    private String strmSesnNm;
+
+    @ApiModelProperty("스트리밍 RTSP 주소")  // Y VARCHAR2(200)
+    @JsonProperty("strm_rtsp_addr")
+    private String strmRtspAddr;
+
+    @ApiModelProperty("스트리밍 RTMP 주소")  // Y VARCHAR2(200)
+    @JsonProperty("strm_rtmp_addr")
+    private String strmRtmpAddr;
+
+    @ApiModelProperty("스트리밍 HTTP 주소")  // Y VARCHAR2(200)
+    @JsonProperty("strm_http_addr")
+    private String strmHttpAddr;
+
+    @ApiModelProperty("스트리밍 저장 주소")  // Y VARCHAR2(200)
+    @JsonProperty("strm_stor_addr")
+    private String strmStorAddr;
+
+    @ApiModelProperty("웹카메라 제어 포트")  // Y NUMBER(5)
+    @JsonProperty("cmra_port")
+    private Integer cmraPort;
+
+    @ApiModelProperty("웹카메라 제어 ID")  // Y VARCHAR2(20)
+    @JsonProperty("cmra_id")
+    private String cmraId;
+
+    @ApiModelProperty("웹카메라 제어 PSWD")  // Y VARCHAR2(64)
+    @JsonProperty("cmra_pswd")
+    private String cmraPswd;
+
+    @ApiModelProperty("웹카메라제어 CHANNEL")  // Y NUMBER(5)
+    @JsonProperty("cmra_chnl")
+    private Integer cmraChnl;
+
+    @ApiModelProperty("링크ID")  // Y NUMBER(10)
+    @JsonProperty("link_id")
+    private Long linkId;
+
+    @ApiModelProperty("웹카메라 모델")  // Y VARCHAR2(20)
+    @JsonProperty("wcam_modl")
+    private String wcamModl;
+
+    @ApiModelProperty("설치 위치 주소")  // Y VARCHAR2(200)
+    @JsonProperty("istl_lctn_addr")
+    private String istlLctnAddr;
+
+    @ApiModelProperty("HD 스트리밍 세션 명")  // Y VARCHAR2(200)
+    @JsonProperty("full_strm_sesn_nm")
+    private String fullStrmSesnNm;
+
+    @ApiModelProperty("WEB RTC 서버 아이피")  // Y VARCHAR2(20)
+    @JsonProperty("web_rtc_svr_ip")
+    private String webRtcSvrIp;
+
+    @ApiModelProperty("WEB RTC 서버 포트")  // Y NUMBER(5)
+    @JsonProperty("web_rtc_svr_port")
+    private Integer webRtcSvrPort;
+
+    @ApiModelProperty("WEB RTC ID")  // Y VARCHAR2(56)
+    @JsonProperty("web_rtc_id")
+    private String webRtcId;
+
+    @ApiModelProperty("RTC 서버 아이피")  // Y VARCHAR2(20)
+    @JsonProperty("rtc_svr_ip")
+    private String rtcSvrIp;
+
+    @ApiModelProperty("RTC 서버 포트")  // Y NUMBER(5)
+    @JsonProperty("rtc_svr_port")
+    private Integer rtcSvrPort;
+
+    @ApiModelProperty("RTC ID")  // Y VARCHAR2(56)
+    @JsonProperty("rtc_id")
+    private String rtcId;
+
+    // Code Description Field
+    @ApiModelProperty("웹카메라 유형 설명")
+    @JsonProperty("wcam_type_desc")    // WCAM_TYPE_CD
+    private String wcamTypeDesc;
+
+    @ApiModelProperty("삭제 여부 설명")
+    @JsonProperty("del_desc")    // DEL_YN
+    private String delDesc;
+
+    @ApiModel("TbWcamCtlrUpdReq(웹 카메라 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbWcamCtlrUpdReq {
+
+        @ApiModelProperty("웹카메라 제어기번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("wcam_ctlr_nmbr")
+        @PositiveOrZero
+        private Long wcamCtlrNmbr;
+
+        @ApiModelProperty("웹카메라 제어기 ID, Nullable = Y, VARCHAR2(30)")  // Y VARCHAR2(30)
+        @JsonProperty("wcam_ctlr_id")
+        @Size(min=1, max=30)
+        private String wcamCtlrId;
+
+        @ApiModelProperty("웹카메라 명칭, Nullable = Y, VARCHAR2(40)")  // Y VARCHAR2(40)
+        @JsonProperty("wcam_nm")
+        @Size(min=1, max=40)
+        private String wcamNm;
+
+        @ApiModelProperty("웹카메라 제어기 아이피, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("wcam_ctlr_ip")
+        @Size(min=1, max=20)
+        private String wcamCtlrIp;
+
+        @ApiModelProperty("웹카메라제어기 포트, Nullable = Y, VARCHAR2(5)")  // Y VARCHAR2(5)
+        @JsonProperty("wcam_ctlr_port")
+        @Size(min=1, max=5)
+        private String wcamCtlrPort;
+
+        @ApiModelProperty("웹카메라 제어기 지역번호, Nullable = Y, NUMBER(5)")  // Y NUMBER(5)
+        @JsonProperty("wcam_ctlr_local_no")
+        @PositiveOrZero
+        private Integer wcamCtlrLocalNo;
+
+        @ApiModelProperty("웹카메라 유형, Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
+        @JsonProperty("wcam_type_cd")
+        @Size(min=1, max=7)
+        private String wcamTypeCd;
+
+        @ApiModelProperty("설치 위치 명, Nullable = Y, VARCHAR2(40)")  // Y VARCHAR2(40)
+        @JsonProperty("istl_lctn_nm")
+        @Size(min=1, max=40)
+        private String istlLctnNm;
+
+        @ApiModelProperty("X 좌표, , NUMBER(11,8)")  // Y NUMBER(11,8)
+        @JsonProperty("x_crdn")
+        private Double xCrdn;
+
+        @ApiModelProperty("Y 좌표, , NUMBER(10,8)")  // Y NUMBER(10,8)
+        @JsonProperty("y_crdn")
+        private Double yCrdn;
+
+        @ApiModelProperty("삭제 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("del_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String delYn;
+
+        @ApiModelProperty("스트리밍 서버 아이피, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("strm_svr_ip")
+        @Size(min=1, max=20)
+        private String strmSvrIp;
+
+        @ApiModelProperty("스트리밍 서버 포트, Nullable = Y, VARCHAR2(5)")  // Y VARCHAR2(5)
+        @JsonProperty("strm_svr_port")
+        @Size(min=1, max=5)
+        private String strmSvrPort;
+
+        @ApiModelProperty("스트리밍 세션 명, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("strm_sesn_nm")
+        @Size(min=1, max=200)
+        private String strmSesnNm;
+
+        @ApiModelProperty("스트리밍 RTSP 주소, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("strm_rtsp_addr")
+        @Size(min=1, max=200)
+        private String strmRtspAddr;
+
+        @ApiModelProperty("스트리밍 RTMP 주소, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("strm_rtmp_addr")
+        @Size(min=1, max=200)
+        private String strmRtmpAddr;
+
+        @ApiModelProperty("스트리밍 HTTP 주소, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("strm_http_addr")
+        @Size(min=1, max=200)
+        private String strmHttpAddr;
+
+        @ApiModelProperty("스트리밍 저장 주소, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("strm_stor_addr")
+        @Size(min=1, max=200)
+        private String strmStorAddr;
+
+        @ApiModelProperty("웹카메라 제어 포트, Nullable = Y, NUMBER(5)")  // Y NUMBER(5)
+        @JsonProperty("cmra_port")
+        @PositiveOrZero
+        private Integer cmraPort;
+
+        @ApiModelProperty("웹카메라 제어 ID, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("cmra_id")
+        @Size(min=1, max=20)
+        private String cmraId;
+
+        @ApiModelProperty("웹카메라 제어 PSWD, Nullable = Y, VARCHAR2(64)")  // Y VARCHAR2(64)
+        @JsonProperty("cmra_pswd")
+        @Size(min=1, max=64)
+        private String cmraPswd;
+
+        @ApiModelProperty("웹카메라제어 CHANNEL, Nullable = Y, NUMBER(5)")  // Y NUMBER(5)
+        @JsonProperty("cmra_chnl")
+        @PositiveOrZero
+        private Integer cmraChnl;
+
+        @ApiModelProperty("링크ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("link_id")
+        @PositiveOrZero
+        private Long linkId;
+
+        @ApiModelProperty("웹카메라 모델, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("wcam_modl")
+        @Size(min=1, max=20)
+        private String wcamModl;
+
+        @ApiModelProperty("설치 위치 주소, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("istl_lctn_addr")
+        @Size(min=1, max=200)
+        private String istlLctnAddr;
+
+        @ApiModelProperty("HD 스트리밍 세션 명, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
+        @JsonProperty("full_strm_sesn_nm")
+        @Size(min=1, max=200)
+        private String fullStrmSesnNm;
+
+        @ApiModelProperty("WEB RTC 서버 아이피, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("web_rtc_svr_ip")
+        @Size(min=1, max=20)
+        private String webRtcSvrIp;
+
+        @ApiModelProperty("WEB RTC 서버 포트, Nullable = Y, NUMBER(5)")  // Y NUMBER(5)
+        @JsonProperty("web_rtc_svr_port")
+        @PositiveOrZero
+        private Integer webRtcSvrPort;
+
+        @ApiModelProperty("WEB RTC ID, Nullable = Y, VARCHAR2(56)")  // Y VARCHAR2(56)
+        @JsonProperty("web_rtc_id")
+        @Size(min=1, max=56)
+        private String webRtcId;
+
+        @ApiModelProperty("RTC 서버 아이피, Nullable = Y, VARCHAR2(20)")  // Y VARCHAR2(20)
+        @JsonProperty("rtc_svr_ip")
+        @Size(min=1, max=20)
+        private String rtcSvrIp;
+
+        @ApiModelProperty("RTC 서버 포트, Nullable = Y, NUMBER(5)")  // Y NUMBER(5)
+        @JsonProperty("rtc_svr_port")
+        @PositiveOrZero
+        private Integer rtcSvrPort;
+
+        @ApiModelProperty("RTC ID, Nullable = Y, VARCHAR2(56)")  // Y VARCHAR2(56)
+        @JsonProperty("rtc_id")
+        @Size(min=1, max=56)
+        private String rtcId;
+
+        @Builder
+        public TbWcamCtlrUpdReq(Long wcam_ctlr_nmbr, String wcam_ctlr_id, String wcam_nm, String wcam_ctlr_ip, String wcam_ctlr_port, Integer wcam_ctlr_local_no, String wcam_type_cd, String istl_lctn_nm, Double x_crdn, Double y_crdn, String del_yn, String strm_svr_ip, String strm_svr_port, String strm_sesn_nm, String strm_rtsp_addr, String strm_rtmp_addr, String strm_http_addr, String strm_stor_addr, Integer cmra_port, String cmra_id, String cmra_pswd, Integer cmra_chnl, Long link_id, String wcam_modl, String istl_lctn_addr, String full_strm_sesn_nm, String web_rtc_svr_ip, Integer web_rtc_svr_port, String web_rtc_id, String rtc_svr_ip, Integer rtc_svr_port, String rtc_id) {
+            this.wcamCtlrNmbr = wcam_ctlr_nmbr;
+            this.wcamCtlrId = wcam_ctlr_id;
+            this.wcamNm = wcam_nm;
+            this.wcamCtlrIp = wcam_ctlr_ip;
+            this.wcamCtlrPort = wcam_ctlr_port;
+            this.wcamCtlrLocalNo = wcam_ctlr_local_no;
+            this.wcamTypeCd = wcam_type_cd;
+            this.istlLctnNm = istl_lctn_nm;
+            this.xCrdn = x_crdn;
+            this.yCrdn = y_crdn;
+            this.delYn = del_yn;
+            this.strmSvrIp = strm_svr_ip;
+            this.strmSvrPort = strm_svr_port;
+            this.strmSesnNm = strm_sesn_nm;
+            this.strmRtspAddr = strm_rtsp_addr;
+            this.strmRtmpAddr = strm_rtmp_addr;
+            this.strmHttpAddr = strm_http_addr;
+            this.strmStorAddr = strm_stor_addr;
+            this.cmraPort = cmra_port;
+            this.cmraId = cmra_id;
+            this.cmraPswd = cmra_pswd;
+            this.cmraChnl = cmra_chnl;
+            this.linkId = link_id;
+            this.wcamModl = wcam_modl;
+            this.istlLctnAddr = istl_lctn_addr;
+            this.fullStrmSesnNm = full_strm_sesn_nm;
+            this.webRtcSvrIp = web_rtc_svr_ip;
+            this.webRtcSvrPort = web_rtc_svr_port;
+            this.webRtcId = web_rtc_id;
+            this.rtcSvrIp = rtc_svr_ip;
+            this.rtcSvrPort = rtc_svr_port;
+            this.rtcId = rtc_id;
+        }
+
+        public TbWcamCtlr toEntity() {
+            return TbWcamCtlr.builder()
+                    .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                    .wcamCtlrId(this.wcamCtlrId)
+                    .wcamNm(this.wcamNm)
+                    .wcamCtlrIp(this.wcamCtlrIp)
+                    .wcamCtlrPort(this.wcamCtlrPort)
+                    .wcamCtlrLocalNo(this.wcamCtlrLocalNo)
+                    .wcamTypeCd(this.wcamTypeCd)
+                    .istlLctnNm(this.istlLctnNm)
+                    .xCrdn(this.xCrdn)
+                    .yCrdn(this.yCrdn)
+                    .delYn(this.delYn)
+                    .strmSvrIp(this.strmSvrIp)
+                    .strmSvrPort(this.strmSvrPort)
+                    .strmSesnNm(this.strmSesnNm)
+                    .strmRtspAddr(this.strmRtspAddr)
+                    .strmRtmpAddr(this.strmRtmpAddr)
+                    .strmHttpAddr(this.strmHttpAddr)
+                    .strmStorAddr(this.strmStorAddr)
+                    .cmraPort(this.cmraPort)
+                    .cmraId(this.cmraId)
+                    .cmraPswd(this.cmraPswd)
+                    .cmraChnl(this.cmraChnl)
+                    .linkId(this.linkId)
+                    .wcamModl(this.wcamModl)
+                    .istlLctnAddr(this.istlLctnAddr)
+                    .fullStrmSesnNm(this.fullStrmSesnNm)
+                    .webRtcSvrIp(this.webRtcSvrIp)
+                    .webRtcSvrPort(this.webRtcSvrPort)
+                    .webRtcId(this.webRtcId)
+                    .rtcSvrIp(this.rtcSvrIp)
+                    .rtcSvrPort(this.rtcSvrPort)
+                    .rtcId(this.rtcId)
+                    .build();
+        }
+
+    }
+
+}

+ 94 - 0
src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrSttsDto.java

@@ -0,0 +1,94 @@
+package com.its.op.dto.its.wcam;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.wcam.TbWcamCtlrStts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 상태 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbWcamCtlrSttsDto(웹 카메라 상태)")
+public class TbWcamCtlrSttsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @JsonProperty("wcam_ctlr_nmbr")
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("갱신 일시")  // Y VARCHAR2(14)
+    @JsonProperty("updt_dt")
+    private String updtDt;
+
+    @ApiModelProperty("통신 상태(네트워크) 코드('CMS')")  // Y VARCHAR2(7)
+    @JsonProperty("cmnc_stts_cd")
+    private String cmncSttsCd;
+
+    // Code Description Field
+    @ApiModelProperty("통신 상태(네트워크) 코드('CMS') 설명")
+    @JsonProperty("cmnc_stts_desc")    // CMNC_STTS_CD
+    private String cmncSttsDesc;
+
+    @ApiModelProperty("웹카메라 제어기 ID")  // Y VARCHAR2(30)
+    @JsonProperty("wcam_ctlr_id")
+    private String wcamCtlrId;
+
+    @ApiModelProperty("웹카메라 명칭")  // Y VARCHAR2(40)
+    @JsonProperty("wcam_nm")
+    private String wcamNm;
+
+    @ApiModelProperty("상태정보 결측 여부")
+    @JsonProperty("miss_stts_yn")
+    private String missSttsYn;
+
+    @ApiModelProperty("수집건수")
+    @JsonProperty("coll_cnt")
+    private Integer collCnt;
+
+    @ApiModel("TbWcamCtlrSttsUpdReq(웹 카메라 상태 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbWcamCtlrSttsUpdReq {
+
+        @ApiModelProperty("웹카메라 제어기번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("wcam_ctlr_nmbr")
+        @PositiveOrZero
+        private Long wcamCtlrNmbr;
+
+        @ApiModelProperty("갱신 일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("updt_dt")
+        @Size(min=1, max=14)
+        private String updtDt;
+
+        @ApiModelProperty("통신 상태(네트워크) 코드('CMS'), Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
+        @JsonProperty("cmnc_stts_cd")
+        @Size(min=1, max=7)
+        private String cmncSttsCd;
+
+        @Builder
+        public TbWcamCtlrSttsUpdReq(Long wcam_ctlr_nmbr, String updt_dt, String cmnc_stts_cd) {
+            this.wcamCtlrNmbr = wcam_ctlr_nmbr;
+            this.updtDt = updt_dt;
+            this.cmncSttsCd = cmnc_stts_cd;
+        }
+
+        public TbWcamCtlrStts toEntity() {
+            return TbWcamCtlrStts.builder()
+                    .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                    .updtDt(this.updtDt)
+                    .cmncSttsCd(this.cmncSttsCd)
+                    .build();
+        }
+
+    }
+
+}

+ 78 - 0
src/main/java/com/its/op/dto/its/wcam/TbWcamCtlrSttsHsDto.java

@@ -0,0 +1,78 @@
+package com.its.op.dto.its.wcam;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.wcam.TbWcamCtlrSttsHs;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 상태 이력 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbWcamCtlrSttsHsDto(웹 카메라 상태 이력)")
+public class TbWcamCtlrSttsHsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("생성 일시")  // N VARCHAR2(14)
+    @JsonProperty("crtn_dt")
+    private String crtnDt;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @JsonProperty("wcam_ctlr_nmbr")
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("통신 상태 코드('CMS')")  // Y VARCHAR2(7)
+    @JsonProperty("cmnc_stts_cd")
+    private String cmncSttsCd;
+
+    // Code Description Field
+    @ApiModelProperty("통신 상태 코드('CMS') 설명")
+    @JsonProperty("cmnc_stts_desc")    // CMNC_STTS_CD
+    private String cmncSttsDesc;
+
+    @ApiModel("TbWcamCtlrSttsHsUpdReq(웹 카메라 상태 이력 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbWcamCtlrSttsHsUpdReq {
+
+        @ApiModelProperty("생성 일시, Nullable = N, VARCHAR2(14)")  // N VARCHAR2(14)
+        @JsonProperty("crtn_dt")
+        @Size(min=1, max=14)
+        private String crtnDt;
+
+        @ApiModelProperty("웹카메라 제어기번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("wcam_ctlr_nmbr")
+        @PositiveOrZero
+        private Long wcamCtlrNmbr;
+
+        @ApiModelProperty("통신 상태 코드('CMS'), Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
+        @JsonProperty("cmnc_stts_cd")
+        @Size(min=1, max=7)
+        private String cmncSttsCd;
+
+        @Builder
+        public TbWcamCtlrSttsHsUpdReq(String crtn_dt, Long wcam_ctlr_nmbr, String cmnc_stts_cd) {
+            this.crtnDt = crtn_dt;
+            this.wcamCtlrNmbr = wcam_ctlr_nmbr;
+            this.cmncSttsCd = cmnc_stts_cd;
+        }
+
+        public TbWcamCtlrSttsHs toEntity() {
+            return TbWcamCtlrSttsHs.builder()
+                    .crtnDt(this.crtnDt)
+                    .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                    .cmncSttsCd(this.cmncSttsCd)
+                    .build();
+        }
+
+    }
+
+}

+ 116 - 0
src/main/java/com/its/op/dto/its/wcam/TbWcamMonitoringDto.java

@@ -0,0 +1,116 @@
+package com.its.op.dto.its.wcam;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.dto.its.common.MonitoringInfoDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 웹카메라 모니터링 화면 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbWcamMonitoringDto(웹카메라 모니터링 화면)")
+public class TbWcamMonitoringDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("모니터링유형(1:예비,2,예비,3,영상,4:예비)")  // N NUMBER(3)
+    @JsonProperty("monitoring_type")
+    private Integer monitoringType;
+
+    @ApiModelProperty("모니터링명칭")  // N VARCHAR2(40)
+    @JsonProperty("monitoring_nm")
+    private String monitoringNm;
+
+    @ApiModelProperty("모니터링순서")  // N NUMBER(3)
+    @JsonProperty("monitoring_seq")
+    private Integer monitoringSeq;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @JsonProperty("wcam_ctlr_nmbr")
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("화면에 보여지는 방식(0:기본,1:화면맞춤))")  // Y NUMBER(1)
+    @JsonProperty("view_mode")
+    private Integer viewMode;
+
+
+    @ApiModelProperty("웹카메라 제어기 ID")  // Y VARCHAR2(30)
+    @Column(name = "WCAM_CTLR_ID", length = 30)
+    private String wcamCtlrId;
+
+    @ApiModelProperty("웹카메라 명칭")  // Y VARCHAR2(40)
+    @Column(name = "WCAM_NM", length = 40)
+    private String wcamNm;
+
+    @ApiModelProperty("WEB RTC 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "WEB_RTC_SVR_IP", length = 20)
+    private String webRtcSvrIp;
+
+    @ApiModelProperty("WEB RTC 서버 포트")  // Y NUMBER(5)
+    @Column(name = "WEB_RTC_SVR_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer webRtcSvrPort;
+
+    @ApiModelProperty("WEB RTC ID")  // Y VARCHAR2(56)
+    @Column(name = "WEB_RTC_ID", length = 56)
+    private String webRtcId;
+
+    @ApiModelProperty("RTC 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "RTC_SVR_IP", length = 20)
+    private String rtcSvrIp;
+
+    @ApiModelProperty("RTC 서버 포트")  // Y NUMBER(5)
+    @Column(name = "RTC_SVR_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer rtcSvrPort;
+
+    @ApiModelProperty("RTC ID")  // Y VARCHAR2(56)
+    @Column(name = "RTC_ID", length = 56)
+    private String rtcId;
+
+    // Code Description Field
+    @ApiModel("TbWcamMonitoringUpdReq(웹카메라 모니터링 화면 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbWcamMonitoringUpdReq {
+
+        @ApiModelProperty("모니터링유형(1:예비,2,예비,3,영상,4:예비), Nullable = N, NUMBER(3)")  // N NUMBER(3)
+        @JsonProperty("monitoring_type")
+        @PositiveOrZero
+        private Integer monitoringType;
+
+        @ApiModelProperty("모니터링명칭-원천, Nullable = N, VARCHAR(40)")  // N VARCHAR(40)
+        @JsonProperty("org_monitoring_nm")
+        @Size(min=1, max=40)
+        private String orgMonitoringNm;
+
+        @ApiModelProperty("모니터링명칭, Nullable = N, VARCHAR(40)")  // N VARCHAR(40)
+        @JsonProperty("monitoring_nm")
+        @Size(min=1, max=40)
+        private String monitoringNm;
+
+        private List<MonitoringInfoDto> infos;
+
+        @Builder
+        public TbWcamMonitoringUpdReq(Integer monitoring_type, String org_monitoring_nm, String monitoring_nm, List<MonitoringInfoDto> infos) {
+            this.monitoringType = monitoring_type;
+            this.orgMonitoringNm = org_monitoring_nm;
+            this.monitoringNm = monitoring_nm;
+
+            // FOR KISA Secure Coding pass
+            //this.infos = infos;
+            List<MonitoringInfoDto> temp = infos;
+            this.infos = temp;
+        }
+
+    }
+
+}

+ 9 - 3
src/main/java/com/its/op/entity/its/cctv/TbCctvMonitoring.java

@@ -71,9 +71,12 @@ public class TbCctvMonitoring implements Serializable {
             dto.setIstlLctnNm(this.cctv.getIstlLctnNm());
             dto.setStrmRtmpAddr(this.cctv.getStrmSesnNm());
             dto.setStrmHttpAddr(this.cctv.getStrmHttpAddr());
-            dto.setWebRtcSvrIp(this.cctv.getRtcSvrIp());
-            dto.setWebRtcSvrPort(this.cctv.getRtcSvrPort());
-            dto.setWebRtcId(this.cctv.getRtcId());
+            dto.setWebRtcSvrIp(this.cctv.getWebRtcSvrIp());
+            dto.setWebRtcSvrPort(this.cctv.getWebRtcSvrPort());
+            dto.setWebRtcId(this.cctv.getWebRtcId());
+            dto.setRtcSvrIp(this.cctv.getRtcSvrIp());
+            dto.setRtcSvrPort(this.cctv.getRtcSvrPort());
+            dto.setRtcId(this.cctv.getRtcId());
         }
         else {
             dto.setCctvCtlrId("-");
@@ -82,6 +85,9 @@ public class TbCctvMonitoring implements Serializable {
             dto.setWebRtcSvrIp("");
             dto.setWebRtcSvrPort(0);
             dto.setWebRtcId("");
+            dto.setRtcSvrIp("");
+            dto.setRtcSvrPort(0);
+            dto.setRtcId("");
         }
         return dto;
     }

+ 4 - 4
src/main/java/com/its/op/entity/its/scrs/TbScIxrCmraMngm.java

@@ -137,10 +137,10 @@ public class TbScIxrCmraMngm implements Serializable {
                 .streUrl(this.streUrl)
                 .cmraUrl(this.cmraUrl)
                 .cmraType(this.cmraType)
-                .cmraXCrdn(this.cmraYCrdn)
-                .cmraYCrdn(this.cmraXCrdn)
-//                .cmraXCrdn(this.cmraXCrdn)
-//                .cmraYCrdn(this.cmraYCrdn)
+//                .cmraXCrdn(this.cmraYCrdn)
+//                .cmraYCrdn(this.cmraXCrdn)
+                .cmraXCrdn(this.cmraXCrdn)
+                .cmraYCrdn(this.cmraYCrdn)
                 .cmraAngl(this.cmraAngl)
                 .hmpgDsplEn(this.hmpgDsplEn)
                 .busDvrsLaneEn(this.busDvrsLaneEn)

+ 161 - 0
src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrOperHs.java

@@ -0,0 +1,161 @@
+package com.its.op.entity.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlIxrOperHsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 신호 교차로 운영 이력 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("신호 교차로 운영 이력")
+@Entity
+@IdClass(TbScSgnlIxrOperHsKey.class)
+@Table(name = "TB_SC_SGNL_IXR_OPER_HS")
+public class TbScSgnlIxrOperHs implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("수집 일시")  // N VARCHAR2(14)
+    @Id
+    @Column(name = "CLCT_DT", nullable = false, length = 14)
+    private String clctDt;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @Id
+    @Column(name = "SGNL_IXR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 4)
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("제어모드(0: TRC, 1: TOD, 2: MAN)")  // Y NUMBER(1)
+    @Column(name = "CNTL_MODE", columnDefinition = "NUMBER", length = 1)
+    private Integer cntlMode;
+
+    @ApiModelProperty("제어상태(0: 온라인, 1: 오프라인, 2: 트랜스, 3: 통신장애)")  // Y NUMBER(1)
+    @Column(name = "CNTL_STTS", columnDefinition = "NUMBER", length = 1)
+    private Integer cntlStts;
+
+    @ApiModelProperty("주기")  // Y NUMBER(3)
+    @Column(name = "CYCL", columnDefinition = "NUMBER", length = 3)
+    private Integer cycl;
+
+    @ApiModelProperty("옵셋")  // Y NUMBER(3)
+    @Column(name = "OFST", columnDefinition = "NUMBER", length = 3)
+    private Integer ofst;
+
+    @ApiModelProperty("A링 1현시")  // Y NUMBER(3)
+    @Column(name = "ARING_1PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring1phas;
+
+    @ApiModelProperty("A링 2현시")  // Y NUMBER(3)
+    @Column(name = "ARING_2PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring2phas;
+
+    @ApiModelProperty("A링 3현시")  // Y NUMBER(3)
+    @Column(name = "ARING_3PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring3phas;
+
+    @ApiModelProperty("A링 4현시")  // Y NUMBER(3)
+    @Column(name = "ARING_4PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring4phas;
+
+    @ApiModelProperty("A링 5현시")  // Y NUMBER(3)
+    @Column(name = "ARING_5PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring5phas;
+
+    @ApiModelProperty("A링 6현시")  // Y NUMBER(3)
+    @Column(name = "ARING_6PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring6phas;
+
+    @ApiModelProperty("A링 7현시")  // Y NUMBER(3)
+    @Column(name = "ARING_7PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring7phas;
+
+    @ApiModelProperty("A링 8현시")  // Y NUMBER(3)
+    @Column(name = "ARING_8PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer aring8phas;
+
+    @ApiModelProperty("B링 1현시")  // Y NUMBER(3)
+    @Column(name = "BRING_1PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring1phas;
+
+    @ApiModelProperty("B링 2현시")  // Y NUMBER(3)
+    @Column(name = "BRING_2PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring2phas;
+
+    @ApiModelProperty("B링 3현시")  // Y NUMBER(3)
+    @Column(name = "BRING_3PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring3phas;
+
+    @ApiModelProperty("B링 4현시")  // Y NUMBER(3)
+    @Column(name = "BRING_4PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring4phas;
+
+    @ApiModelProperty("B링 5현시")  // Y NUMBER(3)
+    @Column(name = "BRING_5PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring5phas;
+
+    @ApiModelProperty("B링 6현시")  // Y NUMBER(3)
+    @Column(name = "BRING_6PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring6phas;
+
+    @ApiModelProperty("B링 7현시")  // Y NUMBER(3)
+    @Column(name = "BRING_7PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring7phas;
+
+    @ApiModelProperty("B링 8현시")  // Y NUMBER(3)
+    @Column(name = "BRING_8PHAS", columnDefinition = "NUMBER", length = 3)
+    private Integer bring8phas;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="SGNL_IXR_NMBR", referencedColumnName = "SGNL_IXR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbScSgnlIxrMngm sgnl;
+
+    public TbScSgnlIxrOperHsDto toDto() {
+        TbScSgnlIxrOperHsDto dto = TbScSgnlIxrOperHsDto.builder()
+                .clctDt(this.clctDt)
+                .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                .cntlMode(this.cntlMode)
+                .cntlStts(this.cntlStts)
+                .cycl(this.cycl)
+                .ofst(this.ofst)
+                .aring1phas(this.aring1phas)
+                .aring2phas(this.aring2phas)
+                .aring3phas(this.aring3phas)
+                .aring4phas(this.aring4phas)
+                .aring5phas(this.aring5phas)
+                .aring6phas(this.aring6phas)
+                .aring7phas(this.aring7phas)
+                .aring8phas(this.aring8phas)
+                .bring1phas(this.bring1phas)
+                .bring2phas(this.bring2phas)
+                .bring3phas(this.bring3phas)
+                .bring4phas(this.bring4phas)
+                .bring5phas(this.bring5phas)
+                .bring6phas(this.bring6phas)
+                .bring7phas(this.bring7phas)
+                .bring8phas(this.bring8phas)
+                .build();
+
+        if (this.sgnl != null) {
+            dto.setIxrNm(this.sgnl.getIxrNm());
+        }
+        else {
+            dto.setIxrNm("-");
+        }
+        return dto;
+    }
+
+
+}

+ 21 - 0
src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrOperHsKey.java

@@ -0,0 +1,21 @@
+package com.its.op.entity.its.scrs;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 특수 일 시각 제어 Key Class
+ */
+@Data
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbScSgnlIxrOperHsKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String clctDt;
+    private Integer sgnlIxrNmbr;
+
+}

+ 288 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamCtlr.java

@@ -0,0 +1,288 @@
+package com.its.op.entity.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamCtlrDto;
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsDto;
+import com.its.op.global.CodeManager;
+import com.its.utils.ItsUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("웹 카메라")
+@Entity
+@Table(name = "TB_WCAM_CTLR")
+public class TbWcamCtlr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "WCAM_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("웹카메라 제어기 ID")  // Y VARCHAR2(30)
+    @Column(name = "WCAM_CTLR_ID", length = 30)
+    private String wcamCtlrId;
+
+    @ApiModelProperty("웹카메라 명칭")  // Y VARCHAR2(40)
+    @Column(name = "WCAM_NM", length = 40)
+    private String wcamNm;
+
+    @ApiModelProperty("웹카메라 제어기 아이피")  // Y VARCHAR2(20)
+    @Column(name = "WCAM_CTLR_IP", length = 20)
+    private String wcamCtlrIp;
+
+    @ApiModelProperty("웹카메라제어기 포트")  // Y VARCHAR2(5)
+    @Column(name = "WCAM_CTLR_PORT", length = 5)
+    private String wcamCtlrPort;
+
+    @ApiModelProperty("웹카메라 제어기 지역번호")  // Y NUMBER(5)
+    @Column(name = "WCAM_CTLR_LOCAL_NO", columnDefinition = "NUMBER", length = 5)
+    private Integer wcamCtlrLocalNo;
+
+    @ApiModelProperty("웹카메라 유형")  // Y VARCHAR2(7)
+    @Column(name = "WCAM_TYPE_CD", length = 7)
+    private String wcamTypeCd;
+
+    @ApiModelProperty("설치 위치 명")  // Y VARCHAR2(40)
+    @Column(name = "ISTL_LCTN_NM", length = 40)
+    private String istlLctnNm;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @Column(name = "X_CRDN", columnDefinition = "NUMBER", length = 11, precision = 8)
+    private Double xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @Column(name = "Y_CRDN", columnDefinition = "NUMBER", length = 10, precision = 8)
+    private Double yCrdn;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @Column(name = "DEL_YN", columnDefinition = "CHAR", length = 1)
+    private String delYn;
+
+    @ApiModelProperty("스트리밍 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "STRM_SVR_IP", length = 20)
+    private String strmSvrIp;
+
+    @ApiModelProperty("스트리밍 서버 포트")  // Y VARCHAR2(5)
+    @Column(name = "STRM_SVR_PORT", length = 5)
+    private String strmSvrPort;
+
+    @ApiModelProperty("스트리밍 세션 명")  // Y VARCHAR2(200)
+    @Column(name = "STRM_SESN_NM", length = 200)
+    private String strmSesnNm;
+
+    @ApiModelProperty("스트리밍 RTSP 주소")  // Y VARCHAR2(200)
+    @Column(name = "STRM_RTSP_ADDR", length = 200)
+    private String strmRtspAddr;
+
+    @ApiModelProperty("스트리밍 RTMP 주소")  // Y VARCHAR2(200)
+    @Column(name = "STRM_RTMP_ADDR", length = 200)
+    private String strmRtmpAddr;
+
+    @ApiModelProperty("스트리밍 HTTP 주소")  // Y VARCHAR2(200)
+    @Column(name = "STRM_HTTP_ADDR", length = 200)
+    private String strmHttpAddr;
+
+    @ApiModelProperty("스트리밍 저장 주소")  // Y VARCHAR2(200)
+    @Column(name = "STRM_STOR_ADDR", length = 200)
+    private String strmStorAddr;
+
+    @ApiModelProperty("웹카메라 제어 포트")  // Y NUMBER(5)
+    @Column(name = "CMRA_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer cmraPort;
+
+    @ApiModelProperty("웹카메라 제어 ID")  // Y VARCHAR2(20)
+    @Column(name = "CMRA_ID", length = 20)
+    private String cmraId;
+
+    @ApiModelProperty("웹카메라 제어 PSWD")  // Y VARCHAR2(64)
+    @Column(name = "CMRA_PSWD", length = 64)
+    private String cmraPswd;
+
+    @ApiModelProperty("웹카메라제어 CHANNEL")  // Y NUMBER(5)
+    @Column(name = "CMRA_CHNL", columnDefinition = "NUMBER", length = 5)
+    private Integer cmraChnl;
+
+    @ApiModelProperty("링크ID")  // Y NUMBER(10)
+    @Column(name = "LINK_ID", columnDefinition = "NUMBER", length = 10)
+    private Long linkId;
+
+    @ApiModelProperty("웹카메라 모델")  // Y VARCHAR2(20)
+    @Column(name = "WCAM_MODL", length = 20)
+    private String wcamModl;
+
+    @ApiModelProperty("설치 위치 주소")  // Y VARCHAR2(200)
+    @Column(name = "ISTL_LCTN_ADDR", length = 200)
+    private String istlLctnAddr;
+
+    @ApiModelProperty("HD 스트리밍 세션 명")  // Y VARCHAR2(200)
+    @Column(name = "FULL_STRM_SESN_NM", length = 200)
+    private String fullStrmSesnNm;
+
+    @ApiModelProperty("WEB RTC 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "WEB_RTC_SVR_IP", length = 20)
+    private String webRtcSvrIp;
+
+    @ApiModelProperty("WEB RTC 서버 포트")  // Y NUMBER(5)
+    @Column(name = "WEB_RTC_SVR_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer webRtcSvrPort;
+
+    @ApiModelProperty("WEB RTC ID")  // Y VARCHAR2(56)
+    @Column(name = "WEB_RTC_ID", length = 56)
+    private String webRtcId;
+
+    @ApiModelProperty("RTC 서버 아이피")  // Y VARCHAR2(20)
+    @Column(name = "RTC_SVR_IP", length = 20)
+    private String rtcSvrIp;
+
+    @ApiModelProperty("RTC 서버 포트")  // Y NUMBER(5)
+    @Column(name = "RTC_SVR_PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer rtcSvrPort;
+
+    @ApiModelProperty("RTC ID")  // Y VARCHAR2(56)
+    @Column(name = "RTC_ID", length = 56)
+    private String rtcId;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="WCAM_CTLR_NMBR", referencedColumnName = "WCAM_CTLR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbWcamCtlrStts state;
+
+    public void setDelete() {
+        this.delYn = "Y";
+    }
+
+    public TbWcamCtlrDto toDto() {
+        return TbWcamCtlrDto.builder()
+                .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                .wcamCtlrId(this.wcamCtlrId)
+                .wcamNm(this.wcamNm)
+                .wcamCtlrIp(this.wcamCtlrIp)
+                .wcamCtlrPort(this.wcamCtlrPort)
+                .wcamCtlrLocalNo(this.wcamCtlrLocalNo)
+                .wcamTypeCd(this.wcamTypeCd)
+                .istlLctnNm(this.istlLctnNm)
+                .xCrdn(this.xCrdn)
+                .yCrdn(this.yCrdn)
+                .delYn(this.delYn)
+                .strmSvrIp(this.strmSvrIp)
+                .strmSvrPort(this.strmSvrPort)
+                .strmSesnNm(this.strmSesnNm)
+                .strmRtspAddr(this.strmRtspAddr)
+                .strmRtmpAddr(this.strmRtmpAddr)
+                .strmHttpAddr(this.strmHttpAddr)
+                .strmStorAddr(this.strmStorAddr)
+                .cmraPort(this.cmraPort)
+                .cmraId(this.cmraId)
+                .cmraPswd(this.cmraPswd)
+                .cmraChnl(this.cmraChnl)
+                .linkId(this.linkId)
+                .wcamModl(this.wcamModl)
+                .istlLctnAddr(this.istlLctnAddr)
+                .fullStrmSesnNm(this.fullStrmSesnNm)
+                .webRtcSvrIp(this.webRtcSvrIp)
+                .webRtcSvrPort(this.webRtcSvrPort)
+                .webRtcId(this.webRtcId)
+                .rtcSvrIp(this.rtcSvrIp)
+                .rtcSvrPort(this.rtcSvrPort)
+                .rtcId(this.rtcId)
+                .build();
+    }
+
+    public TbWcamCtlrSttsDto toSttsDto() {
+        TbWcamCtlrSttsDto dto = TbWcamCtlrSttsDto.builder()
+                .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                .wcamCtlrId(this.wcamCtlrId)
+                .wcamNm(this.wcamNm)
+                .updtDt(CodeManager.CMNC_STTS_ERROR_DT)
+                .cmncSttsCd(CodeManager.CMNC_STTS_ERROR)
+                .build();
+
+        if (this.state != null) {
+            dto.setUpdtDt(this.state.getUpdtDt());
+
+            dto.setCmncSttsCd(this.state.getCmncSttsCd());
+        }
+        dto.setMissSttsYn(ItsUtils.getMissSttsYn(dto.getUpdtDt()));
+        if (("Y").equals(dto.getMissSttsYn())) {
+            // 기준시각 보다 크기 때문에 상태정보를 통신두절로 설정
+            dto.setCmncSttsCd(CodeManager.CMNC_STTS_ERROR);
+        }
+        dto.setCmncSttsDesc(CodeManager.getCodeDescShort(CodeManager.CMNC_STTS_CD, dto.getCmncSttsCd()));
+
+        return dto;
+    }
+
+    public TbWcamCtlr(Long wcamCtlrNmbr) {
+        this.wcamCtlrNmbr = wcamCtlrNmbr;
+    }
+
+    public void updateInfo(TbWcamCtlrDto.TbWcamCtlrUpdReq req) {
+        this.wcamCtlrId = req.getWcamCtlrId();
+        this.wcamNm = req.getWcamNm();
+        this.wcamCtlrIp = req.getWcamCtlrIp();
+        this.wcamCtlrPort = req.getWcamCtlrPort();
+        this.wcamCtlrLocalNo = req.getWcamCtlrLocalNo();
+        this.wcamTypeCd = req.getWcamTypeCd();
+        this.istlLctnNm = req.getIstlLctnNm();
+        this.xCrdn = req.getXCrdn();
+        this.yCrdn = req.getYCrdn();
+        this.delYn = req.getDelYn();
+        this.strmSvrIp = req.getStrmSvrIp();
+        this.strmSvrPort = req.getStrmSvrPort();
+        this.strmSesnNm = req.getStrmSesnNm();
+        this.strmRtspAddr = req.getStrmRtspAddr();
+        this.strmRtmpAddr = req.getStrmRtmpAddr();
+        this.strmHttpAddr = req.getStrmHttpAddr();
+        this.strmStorAddr = req.getStrmStorAddr();
+        this.cmraPort = req.getCmraPort();
+        this.cmraId = req.getCmraId();
+        this.cmraPswd = req.getCmraPswd();
+        this.cmraChnl = req.getCmraChnl();
+        this.linkId = req.getLinkId();
+        this.wcamModl = req.getWcamModl();
+        this.istlLctnAddr = req.getIstlLctnAddr();
+        this.fullStrmSesnNm = req.getFullStrmSesnNm();
+        this.webRtcSvrIp = req.getWebRtcSvrIp();
+        this.webRtcSvrPort = req.getWebRtcSvrPort();
+        this.webRtcId = req.getWebRtcId();
+        this.rtcSvrIp = req.getRtcSvrIp();
+        this.rtcSvrPort = req.getRtcSvrPort();
+        this.rtcId = req.getRtcId();
+    }
+
+    public String getCmncSttsCd() {
+        String result = "CMS1";
+        if (this.state != null) {
+            result = this.state.getCmncSttsCd();
+        }
+        return result;
+    }
+
+    public TbWcamCtlrStts getState() {
+        if (this.state == null) {
+            TbWcamCtlrStts state = TbWcamCtlrStts.builder()
+                    .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                    .updtDt("19700101000000")
+                    .cmncSttsCd(CodeManager.CMNC_STTS_ERROR)
+                    .build();
+            this.state = state;
+        }
+        return this.state;
+    }
+}

+ 58 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamCtlrStts.java

@@ -0,0 +1,58 @@
+package com.its.op.entity.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 상태 Entity Class
+ */
+@Getter
+@Setter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("웹 카메라 상태")
+@Entity
+@Table(name = "TB_WCAM_CTLR_STTS")
+public class TbWcamCtlrStts implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "WCAM_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("갱신 일시")  // Y VARCHAR2(14)
+    @Column(name = "UPDT_DT", length = 14)
+    private String updtDt;
+
+    @ApiModelProperty("통신 상태(네트워크) 코드('CMS')")  // Y VARCHAR2(7)
+    @Column(name = "CMNC_STTS_CD", length = 7)
+    private String cmncSttsCd;
+
+    public TbWcamCtlrSttsDto toDto() {
+        return TbWcamCtlrSttsDto.builder()
+                .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                .updtDt(this.updtDt)
+                .cmncSttsCd(this.cmncSttsCd)
+                .build();
+    }
+
+    public TbWcamCtlrStts(Long wcamCtlrNmbr) {
+        this.wcamCtlrNmbr = wcamCtlrNmbr;
+    }
+
+    public void updateInfo(TbWcamCtlrSttsDto.TbWcamCtlrSttsUpdReq req) {
+        this.updtDt = req.getUpdtDt();
+        this.cmncSttsCd = req.getCmncSttsCd();
+    }
+
+}

+ 63 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamCtlrSttsHs.java

@@ -0,0 +1,63 @@
+package com.its.op.entity.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsHsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 웹 카메라 상태 이력 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("웹 카메라 상태 이력")
+@Entity
+@IdClass(TbWcamCtrlSttsHsKey.class)
+@Table(name = "TB_WCAM_CTLR_STTS_HS")
+public class TbWcamCtlrSttsHs implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("생성 일시")  // N VARCHAR2(14)
+    @Id
+    @Column(name = "CRTN_DT", nullable = false, length = 14)
+    private String crtnDt;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "WCAM_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("통신 상태 코드('CMS')")  // Y VARCHAR2(7)
+    @Column(name = "CMNC_STTS_CD", length = 7)
+    private String cmncSttsCd;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="WCAM_CTLR_NMBR", referencedColumnName = "WCAM_CTLR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbWcamCtlr wcam;
+
+    public TbWcamCtlrSttsHsDto toDto() {
+        return TbWcamCtlrSttsHsDto.builder()
+                .crtnDt(this.crtnDt)
+                .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                .cmncSttsCd(this.cmncSttsCd)
+                .build();
+    }
+
+    public void updateInfo(TbWcamCtlrSttsHsDto.TbWcamCtlrSttsHsUpdReq req) {
+        this.crtnDt = req.getCrtnDt();
+        this.wcamCtlrNmbr = req.getWcamCtlrNmbr();
+        this.cmncSttsCd = req.getCmncSttsCd();
+    }
+
+}

+ 21 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamCtrlSttsHsKey.java

@@ -0,0 +1,21 @@
+package com.its.op.entity.its.wcam;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 웹카메라 모니터링 화면 Key Class
+ */
+@Data
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbWcamCtrlSttsHsKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String crtnDt;
+    private Long wcamCtlrNmbr;
+
+}

+ 100 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamMonitoring.java

@@ -0,0 +1,100 @@
+package com.its.op.entity.its.wcam;
+
+import com.its.op.dto.its.wcam.TbWcamMonitoringDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 웹카메라 모니터링 화면 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("웹카메라 모니터링 화면")
+@Entity
+@Table(name = "TB_WCAM_MONITORING")
+@IdClass(TbWcamMonitoringKey.class)
+public class TbWcamMonitoring implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("모니터링유형(1:예비,2,예비,3,영상,4:예비)")  // N NUMBER(3)
+    @Id
+    @Column(name = "MONITORING_TYPE", nullable = false, columnDefinition = "NUMBER", length = 3)
+    private Integer monitoringType;
+
+    @ApiModelProperty("모니터링명칭")  // N VARCHAR2(40)
+    @Id
+    @Column(name = "MONITORING_NM", nullable = false, length = 40)
+    private String monitoringNm;
+
+    @ApiModelProperty("모니터링순서")  // N NUMBER(3)
+    @Id
+    @Column(name = "MONITORING_SEQ", nullable = false, columnDefinition = "NUMBER", length = 3)
+    private Integer monitoringSeq;
+
+    @ApiModelProperty("웹카메라 제어기번호")  // N NUMBER(10)
+    @Column(name = "WCAM_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long wcamCtlrNmbr;
+
+    @ApiModelProperty("화면에 보여지는 방식(0:기본,1:화면맞춤))")  // Y NUMBER(1)
+    @Column(name = "VIEW_MODE", columnDefinition = "NUMBER", length = 1)
+    private Integer viewMode;
+
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(insertable=false, updatable=false, name="WCAM_CTLR_NMBR", referencedColumnName="WCAM_CTLR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbWcamCtlr wcam;
+
+    public void setType(Integer monitoringType) {
+        this.monitoringType = monitoringType;
+    }
+
+    public TbWcamMonitoringDto toDto() {
+        TbWcamMonitoringDto dto = TbWcamMonitoringDto.builder()
+                .monitoringType(this.monitoringType)
+                .monitoringNm(this.monitoringNm)
+                .monitoringSeq(this.monitoringSeq)
+                .wcamCtlrNmbr(this.wcamCtlrNmbr)
+                .viewMode(this.viewMode)
+                .build();
+
+        if (this.wcam != null) {
+            dto.setWcamCtlrId(this.wcam.getWcamCtlrId());
+            dto.setWcamNm(this.wcam.getWcamNm());
+            dto.setWebRtcSvrIp(this.wcam.getWebRtcSvrIp());
+            dto.setWebRtcSvrPort(this.wcam.getWebRtcSvrPort());
+            dto.setWebRtcId(this.wcam.getWebRtcId());
+            dto.setRtcSvrIp(this.wcam.getRtcSvrIp());
+            dto.setRtcSvrPort(this.wcam.getRtcSvrPort());
+            dto.setRtcId(this.wcam.getRtcId());
+        }
+        else {
+            dto.setWcamCtlrId("-");
+            dto.setWcamNm("?");
+            dto.setWebRtcSvrIp("");
+            dto.setWebRtcSvrPort(0);
+            dto.setWebRtcId("");
+            dto.setRtcSvrIp("");
+            dto.setRtcSvrPort(0);
+            dto.setRtcId("");
+        }
+        return dto;
+    }
+
+    public TbWcamMonitoring(Integer monitoringType, String monitoringNm, Integer monitoringSeq) {
+        this.monitoringType = monitoringType;
+        this.monitoringNm = monitoringNm;
+        this.monitoringSeq = monitoringSeq;
+    }
+
+}

+ 27 - 0
src/main/java/com/its/op/entity/its/wcam/TbWcamMonitoringKey.java

@@ -0,0 +1,27 @@
+package com.its.op.entity.its.wcam;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 웹카메라 모니터링 화면 Key Class
+ */
+@Data
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbWcamMonitoringKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // MONITORING_TYPE, 모니터링유형(1:예비,2,예비,3,영상,4:예비)  // N NUMBER(3)
+    private Integer monitoringType;
+
+    // MONITORING_NM, 모니터링명칭  // N VARCHAR2(40)
+    private String monitoringNm;
+
+    // MONITORING_SEQ, 모니터링순서  // N NUMBER(3)
+    private Integer monitoringSeq;
+
+}

+ 1 - 3
src/main/java/com/its/op/service/its/cctv/TbCctvCtlrService.java

@@ -37,8 +37,6 @@ public class TbCctvCtlrService {
         else {
             throw new NoSuchElementException("데이터가 존재하지 않습니다: " + id);
         }
-//        return repo.findById(id)
-//                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
     }
 
     // 전체 데이터 조회
@@ -75,7 +73,7 @@ public class TbCctvCtlrService {
      */
     @Transactional(readOnly = true)
     public List<TbCctvCtlrSttsDto> findAllStts() {
-        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup("CCTV");
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
         List<TbCctvCtlrSttsDto> result = new ArrayList<>();
         List<TbCctvCtlr> data = this.repo.findAllList();
         data.forEach(obj -> {

+ 175 - 29
src/main/java/com/its/op/service/its/common/CommonSttsService.java

@@ -10,6 +10,7 @@ import com.its.op.service.its.scrs.TbScIxrCmraMngmService;
 import com.its.op.service.its.scrs.TbScSgnlCtlrService;
 import com.its.op.service.its.vds.TbVdsCtlrService;
 import com.its.op.service.its.vms.TbVmsCtlrService;
+import com.its.op.service.its.wcam.TbWcamCtlrService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.env.Environment;
@@ -26,6 +27,7 @@ import java.util.List;
 @Service
 public class CommonSttsService {
 
+    private final TbWcamCtlrService wcamService;
     private final TbCctvCtlrService cctvService;
     private final TbVmsCtlrService vmsService;
     private final TbVdsCtlrService vdsService;
@@ -53,6 +55,10 @@ public class CommonSttsService {
 
         FcltSttsListDto result = new FcltSttsListDto();
 
+        // WCAM
+        FcltSttsListDto wcam = this.wcamService.findAllSttsListTotal(true);
+        result.getFcltList().add(wcam.getFcltList().get(0));
+
         // CCTV
         FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(true);
         result.getFcltList().add(cctv.getFcltList().get(0));
@@ -88,9 +94,13 @@ public class CommonSttsService {
     public FcltSttsListDto findAllFcltSttsSummary() {
         FcltSttsListDto result = new FcltSttsListDto();
 
+        // WCAM
+        FcltSttsListDto wcam = this.wcamService.findAllSttsListTotal(false);
+        result.getFcltList().add(wcam.getFcltList().get(0));
+
         // CCTV
-//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
-//        result.getFcltList().add(cctv.getFcltList().get(0));
+        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
+        result.getFcltList().add(cctv.getFcltList().get(0));
 
         // VMS
         FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(false);
@@ -100,6 +110,18 @@ public class CommonSttsService {
         FcltSttsListDto vds = this.vdsService.findAllSttsListTotal(false);
         result.getFcltList().add(vds.getFcltList().get(0));
 
+        // RSE(DSRC)
+        FcltSttsListDto rse = this.rseService.findAllSttsListTotal(false);
+        result.getFcltList().add(rse.getFcltList().get(0));
+
+        // 신호제어기(SIG)
+        FcltSttsListDto sgnl = this.sgnlService.findAllSttsListTotal(false);
+        result.getFcltList().add(sgnl.getFcltList().get(0));
+
+        // 스마트교차로 카메라
+        FcltSttsListDto ccam = this.ccamService.findAllSttsListTotal(false);
+        result.getFcltList().add(ccam.getFcltList().get(0));
+
         // RSE
 //        if (this.isRunUtis && this.rseService != null) {
 //            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(false);
@@ -118,25 +140,45 @@ public class CommonSttsService {
     public List<FcltSttsDto> findFcltSttsAll() {
         List<FcltSttsDto> result = new ArrayList<>();
 
+        // WCAM
+        FcltSttsListDto wcam = this.wcamService.findAllSttsListTotal(true);
+        FcltSttsSummaryDto wcamSummary = wcam.getFcltList().get(0);
+        wcamSummary.getFcltObjs().forEach(obj -> {
+            result.add(FcltSttsDto.builder()
+                    .fcltType(obj.getFcltType())
+                    .fcltId(obj.getFcltId())
+                    .fcltNm(obj.getFcltNm())
+                    .fcltNmbr(obj.getFcltNmbr())
+                    .fcltKind(obj.getFcltKind())
+                    .xCrdn(obj.getXCrdn())
+                    .yCrdn(obj.getYCrdn())
+                    .sttsCd(obj.getSttsCd())
+                    .sttsDesc(obj.getSttsDesc())
+                    .strmUrl(obj.getStrmUrl())
+                    .fcltInfo1(obj.getFcltInfo1())
+                    .fcltInfo2(obj.getFcltInfo2())
+                    .build());
+        });
+
         // CCTV
-//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(true);
-//        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
-//        cctvSummary.getFcltObjs().forEach(obj -> {
-//            result.add(FcltSttsDto.builder()
-//                    .fcltType(obj.getFcltType())
-//                    .fcltId(obj.getFcltId())
-//                    .fcltNm(obj.getFcltNm())
-//                    .fcltNmbr(obj.getFcltNmbr())
-//                    .fcltKind(obj.getFcltKind())
-//                    .xCrdn(obj.getXCrdn())
-//                    .yCrdn(obj.getYCrdn())
-//                    .sttsCd(obj.getSttsCd())
-//                    .sttsDesc(obj.getSttsDesc())
-//                    .strmUrl(obj.getStrmUrl())
-//                    .fcltInfo1(obj.getFcltInfo1())
-//                    .fcltInfo2(obj.getFcltInfo2())
-//                    .build());
-//        });
+        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(true);
+        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
+        cctvSummary.getFcltObjs().forEach(obj -> {
+            result.add(FcltSttsDto.builder()
+                    .fcltType(obj.getFcltType())
+                    .fcltId(obj.getFcltId())
+                    .fcltNm(obj.getFcltNm())
+                    .fcltNmbr(obj.getFcltNmbr())
+                    .fcltKind(obj.getFcltKind())
+                    .xCrdn(obj.getXCrdn())
+                    .yCrdn(obj.getYCrdn())
+                    .sttsCd(obj.getSttsCd())
+                    .sttsDesc(obj.getSttsDesc())
+                    .strmUrl(obj.getStrmUrl())
+                    .fcltInfo1(obj.getFcltInfo1())
+                    .fcltInfo2(obj.getFcltInfo2())
+                    .build());
+        });
 
         // VMS
         FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(true);
@@ -178,6 +220,66 @@ public class CommonSttsService {
                     .build());
         });
 
+        // RSE(DSRC)
+        FcltSttsListDto rse = this.rseService.findAllSttsListTotal(true);
+        FcltSttsSummaryDto rseSummary = rse.getFcltList().get(0);
+        rseSummary.getFcltObjs().forEach(obj -> {
+            result.add(FcltSttsDto.builder()
+                    .fcltType(obj.getFcltType())
+                    .fcltId(obj.getFcltId())
+                    .fcltNm(obj.getFcltNm())
+                    .fcltNmbr(obj.getFcltNmbr())
+                    .fcltKind(obj.getFcltKind())
+                    .xCrdn(obj.getXCrdn())
+                    .yCrdn(obj.getYCrdn())
+                    .sttsCd(obj.getSttsCd())
+                    .sttsDesc(obj.getSttsDesc())
+                    .strmUrl(obj.getStrmUrl())
+                    .fcltInfo1(obj.getFcltInfo1())
+                    .fcltInfo2(obj.getFcltInfo2())
+                    .build());
+        });
+
+        // 신호제어기(SIG)
+        FcltSttsListDto sgnl = this.sgnlService.findAllSttsListTotal(true);
+        FcltSttsSummaryDto sgnlSummary = sgnl.getFcltList().get(0);
+        sgnlSummary.getFcltObjs().forEach(obj -> {
+            result.add(FcltSttsDto.builder()
+                    .fcltType(obj.getFcltType())
+                    .fcltId(obj.getFcltId())
+                    .fcltNm(obj.getFcltNm())
+                    .fcltNmbr(obj.getFcltNmbr())
+                    .fcltKind(obj.getFcltKind())
+                    .xCrdn(obj.getXCrdn())
+                    .yCrdn(obj.getYCrdn())
+                    .sttsCd(obj.getSttsCd())
+                    .sttsDesc(obj.getSttsDesc())
+                    .strmUrl(obj.getStrmUrl())
+                    .fcltInfo1(obj.getFcltInfo1())
+                    .fcltInfo2(obj.getFcltInfo2())
+                    .build());
+        });
+
+        // 스마트교차로 카메라
+        FcltSttsListDto ccam = this.ccamService.findAllSttsListTotal(true);
+        FcltSttsSummaryDto ccamSummary = ccam.getFcltList().get(0);
+        ccamSummary.getFcltObjs().forEach(obj -> {
+            result.add(FcltSttsDto.builder()
+                    .fcltType(obj.getFcltType())
+                    .fcltId(obj.getFcltId())
+                    .fcltNm(obj.getFcltNm())
+                    .fcltNmbr(obj.getFcltNmbr())
+                    .fcltKind(obj.getFcltKind())
+                    .xCrdn(obj.getXCrdn())
+                    .yCrdn(obj.getYCrdn())
+                    .sttsCd(obj.getSttsCd())
+                    .sttsDesc(obj.getSttsDesc())
+                    .strmUrl(obj.getStrmUrl())
+                    .fcltInfo1(obj.getFcltInfo1())
+                    .fcltInfo2(obj.getFcltInfo2())
+                    .build());
+        });
+
         // RSE
 //        if (this.isRunUtis && this.rseService != null) {
 //            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(true);
@@ -212,16 +314,27 @@ public class CommonSttsService {
     public List<FcltSttsCntDto> findFcltSttsCntAll() {
         List<FcltSttsCntDto> result = new ArrayList<>();
 
+        // WCAM
+        FcltSttsListDto wcam = this.wcamService.findAllSttsListTotal(false);
+        FcltSttsSummaryDto wcamSummary = wcam.getFcltList().get(0);
+        result.add(FcltSttsCntDto.builder()
+                .fcltType(wcamSummary.getFcltType())
+                .fcltNm(wcamSummary.getFcltNm())
+                .totalCnt(wcamSummary.getTotalCnt())
+                .normalCnt(wcamSummary.getNormalCnt())
+                .errorCnt(wcamSummary.getErrorCnt())
+                .build());
+
         // CCTV
-//        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
-//        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
-//        result.add(FcltSttsCntDto.builder()
-//                .fcltType(cctvSummary.getFcltType())
-//                .fcltNm(cctvSummary.getFcltNm())
-//                .totalCnt(cctvSummary.getTotalCnt())
-//                .normalCnt(cctvSummary.getNormalCnt())
-//                .errorCnt(cctvSummary.getErrorCnt())
-//                .build());
+        FcltSttsListDto cctv = this.cctvService.findAllSttsListTotal(false);
+        FcltSttsSummaryDto cctvSummary = cctv.getFcltList().get(0);
+        result.add(FcltSttsCntDto.builder()
+                .fcltType(cctvSummary.getFcltType())
+                .fcltNm(cctvSummary.getFcltNm())
+                .totalCnt(cctvSummary.getTotalCnt())
+                .normalCnt(cctvSummary.getNormalCnt())
+                .errorCnt(cctvSummary.getErrorCnt())
+                .build());
 
         // VMS
         FcltSttsListDto vms = this.vmsService.findAllSttsListTotal(false);
@@ -245,6 +358,39 @@ public class CommonSttsService {
                 .errorCnt(vdsSummary.getErrorCnt())
                 .build());
 
+        // RSE(DSRC)
+        FcltSttsListDto rse = this.rseService.findAllSttsListTotal(false);
+        FcltSttsSummaryDto rseSummary = rse.getFcltList().get(0);
+        result.add(FcltSttsCntDto.builder()
+                .fcltType(rseSummary.getFcltType())
+                .fcltNm(rseSummary.getFcltNm())
+                .totalCnt(rseSummary.getTotalCnt())
+                .normalCnt(rseSummary.getNormalCnt())
+                .errorCnt(rseSummary.getErrorCnt())
+                .build());
+
+        // 신호제어기(SIG)
+        FcltSttsListDto sgnl = this.sgnlService.findAllSttsListTotal(false);
+        FcltSttsSummaryDto sgnlSummary = sgnl.getFcltList().get(0);
+        result.add(FcltSttsCntDto.builder()
+                .fcltType(sgnlSummary.getFcltType())
+                .fcltNm(sgnlSummary.getFcltNm())
+                .totalCnt(sgnlSummary.getTotalCnt())
+                .normalCnt(sgnlSummary.getNormalCnt())
+                .errorCnt(sgnlSummary.getErrorCnt())
+                .build());
+
+        // 스마트교차로 카메라
+        FcltSttsListDto ccam = this.ccamService.findAllSttsListTotal(false);
+        FcltSttsSummaryDto ccamSummary = ccam.getFcltList().get(0);
+        result.add(FcltSttsCntDto.builder()
+                .fcltType(ccamSummary.getFcltType())
+                .fcltNm(ccamSummary.getFcltNm())
+                .totalCnt(ccamSummary.getTotalCnt())
+                .normalCnt(ccamSummary.getNormalCnt())
+                .errorCnt(ccamSummary.getErrorCnt())
+                .build());
+
         // RSE
 //        if (this.isRunUtis && this.rseService != null) {
 //            FcltSttsListDto rse = this.rseService.findAllListSttsTotal(false);

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

@@ -74,7 +74,7 @@ public class TbRseCtlrService {
      */
     @Transactional(readOnly = true)
     public List<TbRseCtlrSttsDto> findAllStts() {
-        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup("RSE");
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
         List<TbRseCtlrSttsDto> result = new ArrayList<>();
         List<TbRseCtlr> data = this.repo.findAllList();
         data.forEach(obj -> {

+ 72 - 0
src/main/java/com/its/op/service/its/scrs/ScSrvcStatisticsService.java

@@ -0,0 +1,72 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.mapper.its.scrs.ScSrvcStatisticsMapper;
+import com.its.op.dto.its.scrs.ScSrvcDto;
+import com.its.op.dto.its.scrs.ScSrvcParam;
+import com.its.op.dto.its.scrs.ScSrvcPtrnDto;
+import com.its.op.dto.its.scrs.ScSrvcPtrnParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ScSrvcStatisticsService {
+
+    private final ScSrvcStatisticsMapper mapper;
+
+    public List<ScSrvcDto> findSrvc15M(List<String> ixrIds, String fromDt, String toDt) {
+        ScSrvcParam param = ScSrvcParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findSrvc15M(param);
+    }
+
+    public List<ScSrvcDto> findSrvcHH(List<String> ixrIds, String fromDt, String toDt) {
+        ScSrvcParam param = ScSrvcParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findSrvcHH(param);
+    }
+
+    public List<ScSrvcDto> findSrvcDD(List<String> ixrIds, String fromDt, String toDt) {
+        ScSrvcParam param = ScSrvcParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findSrvcDD(param);
+    }
+
+    public List<ScSrvcDto> findSrvcMN(List<String> ixrIds, String fromDt, String toDt) {
+        ScSrvcParam param = ScSrvcParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findSrvcMN(param);
+    }
+
+    /**
+     * 패턴 서비스 수준 데이터 비교
+     * @param ixrId
+     * @param baseDay
+     * @param compDay
+     * @return
+     */
+    public List<ScSrvcPtrnDto> findSrvcPtrnCompare(String ixrId, String baseDay, String compDay) {
+        ScSrvcPtrnParam param = ScSrvcPtrnParam.builder()
+                .ixrId(ixrId)
+                .baseDay(baseDay)
+                .compDay(compDay)
+                .build();
+        return this.mapper.findSrvcPtrnCompare(param);
+    }
+}

+ 37 - 0
src/main/java/com/its/op/service/its/scrs/ScStrtStatisticsService.java

@@ -0,0 +1,37 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.mapper.its.scrs.ScStrtStatisticsMapper;
+import com.its.op.dto.its.scrs.ScSrvcParam;
+import com.its.op.dto.its.scrs.ScStrtDto;
+import com.its.op.dto.its.scrs.ScStrtParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ScStrtStatisticsService {
+
+    private final ScStrtStatisticsMapper mapper;
+
+    public List<ScStrtDto> findStrtClctHs(List<String> ixrIds, String fromDt, String toDt) {
+        ScStrtParam param = ScStrtParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findStrtClctHs(param);
+    }
+
+    public List<ScStrtDto> findStrtClctLaneHs(List<String> ixrIds, String fromDt, String toDt) {
+        ScStrtParam param = ScStrtParam.builder()
+                .ixrIds(ixrIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findStrtClctLaneHs(param);
+    }
+}

+ 154 - 0
src/main/java/com/its/op/service/its/scrs/ScTfvlStatisticsService.java

@@ -0,0 +1,154 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.mapper.its.scrs.ScTfvlStatisticsMapper;
+import com.its.op.dto.its.scrs.ScTfvlDto;
+import com.its.op.dto.its.scrs.ScTfvlParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ScTfvlStatisticsService {
+
+    private final ScTfvlStatisticsMapper mapper;
+
+    /**
+     * 교차로 교통량 원시 수집 이력(5분)
+     * @param ixrId
+     * @param cmraIds
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    public List<ScTfvlDto> findTfvl05M(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl05M(param);
+    }
+
+    /**
+     * 교차로 교통량 원시 수집 이력(5분 - 차선별)
+     * @param ixrId
+     * @param cmraIds
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    public List<ScTfvlDto> findTfvl05MLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl05MLane(param);
+    }
+
+    public List<ScTfvlDto> findTfvl15M(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl15M(param);
+    }
+
+    public List<ScTfvlDto> findTfvl15MLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl15MLane(param);
+    }
+
+    public List<ScTfvlDto> findTfvl30M(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl30M(param);
+    }
+
+    public List<ScTfvlDto> findTfvl30MLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvl30MLane(param);
+    }
+
+    public List<ScTfvlDto> findTfvlHH(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlHH(param);
+    }
+
+    public List<ScTfvlDto> findTfvlHHLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlHHLane(param);
+    }
+
+    public List<ScTfvlDto> findTfvlDD(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlDD(param);
+    }
+
+    public List<ScTfvlDto> findTfvlDDLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlDDLane(param);
+    }
+
+    public List<ScTfvlDto> findTfvlMN(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlMN(param);
+    }
+
+    public List<ScTfvlDto> findTfvlMNLane(String ixrId, List<String> cmraIds, String fromDt, String toDt) {
+        ScTfvlParam param = ScTfvlParam.builder()
+                .ixrId(ixrId)
+                .cmraIds(cmraIds)
+                .fromDt(fromDt)
+                .toDt(toDt)
+                .build();
+        return this.mapper.findTfvlMNLane(param);
+    }
+}

+ 31 - 0
src/main/java/com/its/op/service/its/scrs/TbScSgnlIxrOperHsService.java

@@ -0,0 +1,31 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.repository.its.scrs.TbScSgnlIxrOperHsRepository;
+import com.its.op.dto.its.scrs.TbScSgnlIxrOperHsDto;
+import com.its.op.entity.its.scrs.TbScSgnlIxrOperHs;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbScSgnlIxrOperHsService {
+
+    private final TbScSgnlIxrOperHsRepository repo;
+
+    public List<TbScSgnlIxrOperHsDto> findAllByDateRange(Integer sgnlIxrNmbr, String fromDt, String toDt) {
+        List<TbScSgnlIxrOperHsDto> result = new ArrayList<>();
+        List<TbScSgnlIxrOperHs> data = this.repo.findAllByDateRange(sgnlIxrNmbr, fromDt, toDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(obj.toDto());
+            });
+        }
+        return result;
+    }
+
+}

+ 1 - 1
src/main/java/com/its/op/service/its/vds/TbVdsCtlrService.java

@@ -76,7 +76,7 @@ public class TbVdsCtlrService {
      */
     @Transactional(readOnly = true)
     public List<TbVdsCtlrSttsDto> findAllStts() {
-        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup("VDS");
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
         List<TbVdsCtlrSttsDto> result = new ArrayList<>();
         Map<String, TbVdsCtlrSttsDto> tmp = new HashMap<>();
         List<TbVdsCtlr> data = this.repo.findAllList();

+ 1 - 1
src/main/java/com/its/op/service/its/vms/TbVmsCtlrService.java

@@ -84,7 +84,7 @@ public class TbVmsCtlrService {
      */
     @Transactional(readOnly = true)
     public List<TbVmsCtlrSttsDto> findAllStts() {
-        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup("VMS");
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
         Map<Long, TbVmsCtlrSttsDto> result = new HashMap<>();
         List<TbVmsCtlr> data = this.repo.findAllList();
         data.forEach(obj -> {

+ 271 - 0
src/main/java/com/its/op/service/its/wcam/TbWcamCtlrService.java

@@ -0,0 +1,271 @@
+package com.its.op.service.its.wcam;
+
+import com.its.op.dao.repository.its.wcam.TbWcamCtlrRepository;
+import com.its.op.dao.repository.its.wcam.TbWcamCtlrSttsHsRepository;
+import com.its.op.dto.its.common.*;
+import com.its.op.dto.its.facility.TbFcltSttsAlrmStupDto;
+import com.its.op.dto.its.wcam.TbWcamCtlrDto;
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsDto;
+import com.its.op.entity.its.wcam.TbWcamCtlr;
+import com.its.op.global.CodeManager;
+import com.its.op.service.its.facility.TbFcltSttsAlrmStupService;
+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.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbWcamCtlrService {
+
+    private final TbFcltSttsAlrmStupService alarmService;
+    private final TbWcamCtlrRepository repo;
+    private final TbWcamCtlrSttsHsRepository sttsHsRepo;
+    private String fcltType = "WCAM";
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbWcamCtlr requireOne(Long wcamCtlrNmbr) throws NoSuchElementException {
+        Optional<TbWcamCtlr> info = this.repo.findById(wcamCtlrNmbr);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + wcamCtlrNmbr);
+        }
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrDto> findAll() {
+        List<TbWcamCtlrDto> result = new ArrayList<>();
+        List<TbWcamCtlr> data = this.repo.findAll();
+        for (TbWcamCtlr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrDto> findAllList() {
+        List<TbWcamCtlrDto> result = new ArrayList<>();
+        List<TbWcamCtlr> data = this.repo.findAllList();
+        for (TbWcamCtlr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 삭제 되지 않은 제어기 상태 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrSttsDto> findAllStts() {
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
+        List<TbWcamCtlrSttsDto> result = new ArrayList<>();
+        List<TbWcamCtlr> data = this.repo.findAllList();
+        data.forEach(obj -> {
+            if (!CodeManager.CMNC_STTS_NORMAL.equals(obj.getCmncSttsCd())) {
+                TbFcltSttsAlrmStupDto alarm = alarmMap.get(obj.getWcamCtlrId());
+                if (alarm != null && "Y".equals(alarm.getUseYn())) {
+                    if ("N".equals(alarm.getCmncStts())) {
+                        obj.getState().setCmncSttsCd(CodeManager.CMNC_STTS_NORMAL);
+                        if ("N".equals(alarm.getDoorStts())) {
+                        }
+                        if ("N".equals(alarm.getVideoInput())) {
+                            //obj.getState().setVideoInput("VDI0");
+                        }
+                    }
+                }
+            }
+            result.add(obj.toSttsDto());
+        });
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbWcamCtlrDto findById(Long wcamCtlrNmbr) {
+        TbWcamCtlr entity = requireOne(wcamCtlrNmbr);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbWcamCtlrDto updateById(Long wcamCtlrNmbr, TbWcamCtlrDto.TbWcamCtlrUpdReq req) {
+        TbWcamCtlr entity = requireOne(wcamCtlrNmbr);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbWcamCtlrDto> mergeInfoList(List<TbWcamCtlrDto.TbWcamCtlrUpdReq> reqList) {
+        List<TbWcamCtlrDto> result = new ArrayList<>();
+        for (TbWcamCtlrDto.TbWcamCtlrUpdReq req : reqList) {
+            TbWcamCtlr obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbWcamCtlrDto mergeInfo(TbWcamCtlrDto.TbWcamCtlrUpdReq req) {
+        TbWcamCtlr obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbWcamCtlrDto deleteById(Long wcamCtlrNmbr) {
+        TbWcamCtlr entity = requireOne(wcamCtlrNmbr);
+        this.repo.deleteById(wcamCtlrNmbr);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbWcamCtlrDto> deleteByIds(List<Long> ids) {
+        List<TbWcamCtlrDto> result = new ArrayList<>();
+        for (Long id : ids) {
+            Optional<TbWcamCtlr> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 통신이상 시설물 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<SttsCommErrDto> findAllListCommError() {
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
+        Map<String, SttsCommErrDto> result = new HashMap<>();
+        List<TbWcamCtlr> data = this.repo.findAllList();
+        List<SttsHsErrCntInf> errList = this.sttsHsRepo.findAllCommErrorCount(ItsUtils.getFromToday());
+
+        // 통신 상태가 오류 인 제어기 정보만 조회한다.
+        data.forEach(obj -> {
+            TbWcamCtlrSttsDto dto = obj.toSttsDto();
+            if (!CodeManager.CMNC_STTS_NORMAL.equals(dto.getCmncSttsCd())) {
+                TbFcltSttsAlrmStupDto alarm = alarmMap.get(obj.getWcamCtlrId());
+                if (alarm != null && "Y".equals(alarm.getUseYn()) && "N".equals(alarm.getCmncStts())) {
+                    return;
+                }
+                SttsCommErrDto commErrorDto = new SttsCommErrDto();
+                commErrorDto.setCtlrNmbr(String.valueOf(dto.getWcamCtlrNmbr()));
+                commErrorDto.setCtlrId(dto.getWcamCtlrId());
+                commErrorDto.setCtlrNm(dto.getWcamNm());
+                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
+     */
+    @Transactional(readOnly = true)
+    public FcltSttsListDto findAllSttsListTotal(boolean total) {
+        Map<String, TbFcltSttsAlrmStupDto> alarmMap = this.alarmService.loadAlarmSetup(this.fcltType);
+        FcltSttsListDto result = new FcltSttsListDto();
+
+        AtomicInteger error = new AtomicInteger(0);
+        AtomicInteger normal = new AtomicInteger(0);
+
+        List<FcltSttsDto> sttsDtoList = new ArrayList<>();
+        List<TbWcamCtlr> ctlrList = this.repo.findAllList();
+        ctlrList.forEach(obj -> {
+            TbFcltSttsAlrmStupDto alarm = alarmMap.get(obj.getWcamCtlrId());
+            if (alarm != null && "Y".equals(alarm.getUseYn()) && "N".equals(alarm.getCmncStts())) {
+                obj.getState().setCmncSttsCd(CodeManager.CMNC_STTS_NORMAL);
+                if ("N".equals(alarm.getDoorStts())) {
+                }
+                if ("N".equals(alarm.getVideoInput())) {
+                    //obj.getState().setVideoInput("VDI0");
+                }
+            }
+
+            TbWcamCtlrSttsDto dto = obj.toSttsDto();
+            if (total) {
+                FcltSttsDto stts = FcltSttsDto.builder()
+                        .fcltType(this.fcltType)
+                        .fcltNmbr(String.valueOf(obj.getWcamCtlrNmbr()))
+                        .fcltId(obj.getWcamCtlrId())
+                        .fcltNm(obj.getIstlLctnNm())
+                        .fcltKind(obj.getWcamTypeCd())
+                        .xCrdn(obj.getXCrdn())
+                        .yCrdn(obj.getYCrdn())
+                        .strmUrl(obj.getStrmSesnNm())
+                        .sttsCd(dto.getCmncSttsCd())
+                        .sttsDesc(dto.getCmncSttsDesc())
+                        .build();
+
+                sttsDtoList.add(stts);
+            }
+
+            if (CodeManager.CMNC_STTS_NORMAL.equals(dto.getCmncSttsCd())) {
+                normal.getAndIncrement();
+            }
+            else {
+                error.getAndIncrement();
+            }
+        });
+
+        FcltSttsSummaryDto summaryDto = FcltSttsSummaryDto.builder()
+                .fcltType(this.fcltType)
+                .fcltNm(this.fcltType)
+                .totalCnt(ctlrList.size())
+                .normalCnt(normal.get())
+                .errorCnt(error.get())
+                .colErrCnt(0)
+                .build();
+
+        summaryDto.init();
+        if (total) {
+            summaryDto.setFcltObjs(sttsDtoList);
+        }
+        result.getFcltList().add(summaryDto);
+
+        return result;
+    }
+
+    /**
+     * 신규 제어기 번호 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public NewIdLongDto getNewNmbr() {
+        Long newId = this.repo.getNewNmbr();
+        return NewIdLongDto.builder().newId(newId).build();
+    }
+}

+ 84 - 0
src/main/java/com/its/op/service/its/wcam/TbWcamCtlrSttsHsService.java

@@ -0,0 +1,84 @@
+package com.its.op.service.its.wcam;
+
+import com.its.op.dao.repository.its.wcam.TbWcamCtlrSttsHsRepository;
+import com.its.op.dto.its.wcam.TbWcamCtlrSttsHsDto;
+import com.its.op.entity.its.wcam.TbWcamCtlrSttsHs;
+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
+@RequiredArgsConstructor
+@Service
+public class TbWcamCtlrSttsHsService {
+
+    private final TbWcamCtlrSttsHsRepository repo;
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrSttsHsDto> findAll() {
+        List<TbWcamCtlrSttsHsDto> result = new ArrayList<>();
+        List<TbWcamCtlrSttsHs> data = this.repo.findAll();
+        for (TbWcamCtlrSttsHs entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrSttsHsDto> findAllList() {
+        List<TbWcamCtlrSttsHsDto> result = new ArrayList<>();
+        List<TbWcamCtlrSttsHs> data = this.repo.findAllList();
+        for (TbWcamCtlrSttsHs entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 상태 이력 조회
+     * @param fromDt
+     * @param toDt
+     * @param ids
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrSttsHsDto> findAllByDateRange(String fromDt, String toDt, List<Long> ids) {
+        List<TbWcamCtlrSttsHsDto> result = new ArrayList<>();
+        List<TbWcamCtlrSttsHs> data = this.repo.findAllByDateRange(fromDt, toDt, ids);
+        if (data != null) {
+            data.forEach(obj -> {
+                if (obj.getWcam() != null && ("N").equals(obj.getWcam().getDelYn())) {
+                    result.add(obj.toDto());
+                }
+            });
+        }
+        return result;
+    }
+
+    /**
+     * 장애 이력 조회
+     * @param fromDt
+     * @param toDt
+     * @param ids
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbWcamCtlrSttsHsDto> findAllFailByDateRange(String fromDt, String toDt, List<Long> ids) {
+        List<TbWcamCtlrSttsHsDto> result = new ArrayList<>();
+        List<TbWcamCtlrSttsHs> data = this.repo.findAllFailByDateRange(fromDt, toDt, ids);
+        if (data != null) {
+            data.forEach(obj -> {
+                if (obj.getWcam() != null && ("N").equals(obj.getWcam().getDelYn())) {
+                    result.add(obj.toDto());
+                }
+            });
+        }
+        return result;
+    }
+}

+ 30 - 0
src/main/java/com/its/op/service/its/wcam/TbWcamCtlrSttsService.java

@@ -0,0 +1,30 @@
+package com.its.op.service.its.wcam;
+
+import com.its.op.dao.repository.its.wcam.TbWcamCtlrSttsRepository;
+import com.its.op.entity.its.wcam.TbWcamCtlrStts;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbWcamCtlrSttsService {
+
+    private final TbWcamCtlrSttsRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbWcamCtlrStts requireOne(Long wcamCtlrNmbr) throws NoSuchElementException {
+        Optional<TbWcamCtlrStts> info = this.repo.findById(wcamCtlrNmbr);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + wcamCtlrNmbr);
+        }
+    }
+
+}

+ 153 - 0
src/main/java/com/its/op/service/its/wcam/TbWcamMonitoringService.java

@@ -0,0 +1,153 @@
+package com.its.op.service.its.wcam;
+
+import com.its.op.dao.repository.its.wcam.TbWcamMonitoringRepository;
+import com.its.op.dto.its.common.MonitoringInfoDto;
+import com.its.op.dto.its.common.MonitoringListDto;
+import com.its.op.dto.its.common.MonitoringListInf;
+import com.its.op.dto.its.wcam.TbWcamCtlrDto;
+import com.its.op.dto.its.wcam.TbWcamMonitoringDto;
+import com.its.op.entity.its.wcam.TbWcamMonitoring;
+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
+@RequiredArgsConstructor
+@Service
+public class TbWcamMonitoringService {
+
+    private final TbWcamMonitoringRepository repo;
+    private final TbWcamCtlrService ctlrService;
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamMonitoringDto> findAll() {
+        List<TbWcamMonitoringDto> result = new ArrayList<>();
+        List<TbWcamMonitoring> data = this.repo.findAll();
+        for (TbWcamMonitoring entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamMonitoringDto> findAllList() {
+        List<TbWcamMonitoringDto> result = new ArrayList<>();
+        List<TbWcamMonitoring> data = this.repo.findAllList();
+        for (TbWcamMonitoring entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+    // 모니터링 유형에 속한 모든 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamMonitoringDto> findAllMonitoring(Integer monitoringType) {
+        List<TbWcamMonitoringDto> result = new ArrayList<>();
+        List<TbWcamMonitoring> data = this.repo.findAllMonitoring(monitoringType);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(obj.toDto());
+            });
+        }
+        return result;
+    }
+
+    // 모니터링 이름으로 모니터링목록 조회
+    @Transactional(readOnly = true)
+    public List<TbWcamMonitoringDto> findByName(Integer monitoringType, String name) {
+
+        //	모니터링유형(1:예비,2,예비,3,영상,4:예비)
+        List<TbWcamMonitoringDto> result = new ArrayList<>();
+        List<TbWcamMonitoring> data = this.repo.findByName(monitoringType, name.trim());
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(obj.toDto());
+            });
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    public List<TbWcamMonitoringDto> mergeInfo(Integer monitoringType, String name, TbWcamMonitoringDto.TbWcamMonitoringUpdReq req) {
+
+        // Repository 에서 Transaction 처리를 수행
+
+        // 이름에 해당하는 데이터 삭제
+        this.repo.deleteByName(monitoringType, req.getOrgMonitoringNm().trim());
+
+        // 이름에 해당하는 모든 데이터 저장
+        for (MonitoringInfoDto reqObj : req.getInfos()) {
+            TbWcamMonitoring obj = TbWcamMonitoring.builder()
+                    .monitoringType(monitoringType)
+                    .monitoringNm(name.trim())
+                    .monitoringSeq(reqObj.getMonitoringSeq())
+                    .wcamCtlrNmbr(reqObj.getCtlrNmbr())
+                    .viewMode(reqObj.getViewMode())
+                    .build();
+            obj.setType(monitoringType);
+            this.repo.save(obj);
+        }
+
+        // 저장된 데이터 리턴
+        return findByName(monitoringType, name);
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public List<TbWcamMonitoringDto> deleteByName(Integer monitoringType, String name) {
+
+        List<TbWcamMonitoringDto> result = findByName(monitoringType, name.trim());
+        if (result != null) {
+            this.repo.deleteByName(monitoringType, name.trim());
+        }
+        return result;
+    }
+
+    /**
+     * 모니터링 화면 리스트 소회
+     * @param monitoringType
+     * @return
+     */
+    public List<MonitoringListDto> findAllMonitoringList(Integer monitoringType) {
+        List<MonitoringListDto> result = new ArrayList<>();
+        List<MonitoringListInf> data = this.repo.findAllMonitoringList(monitoringType);
+        data.forEach(obj -> {
+            result.add(MonitoringListDto.builder()
+                    .monitoringType(monitoringType)
+                    .monitoringNm(obj.getName().trim())
+                    .count(obj.getCount().intValue())
+                    .build());
+        });
+
+        if (result.size() == 0) {
+            // 모니터링 화면이 없으면 Default 화면 목록을 만든다
+            List<TbWcamCtlrDto> ctlrList = this.ctlrService.findAllList();
+            int seq = 1;
+            for (int ii = 0; ii < ctlrList.size(); ii++) {
+                TbWcamCtlrDto obj = ctlrList.get(ii);
+                TbWcamMonitoring entity = TbWcamMonitoring.builder()
+                        .monitoringType(monitoringType)
+                        .monitoringNm("Default")
+                        .monitoringSeq(seq++)
+                        .wcamCtlrNmbr(obj.getWcamCtlrNmbr())
+                        .viewMode(1)
+                        .build();
+                this.repo.save(entity);
+                if (seq == 17) {
+                    break;
+                }
+            }
+            result.add(MonitoringListDto.builder()
+                    .monitoringType(monitoringType)
+                    .monitoringNm("Default")
+                    .count(seq-1)
+                    .build());
+        }
+        return result;
+    }
+}

+ 132 - 0
src/main/resources/mybatis/mapper/its/scrs/ScSrvcStatisticsMapper.xml

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.op.dao.mapper.its.scrs.ScSrvcStatisticsMapper">
+
+    <select id="findSrvc15M" parameterType="com.its.op.dto.its.scrs.ScSrvcParam" resultType="com.its.op.dto.its.scrs.ScSrvcDto">
+        SELECT B.IXR_ID AS ixrId,
+        B.IXR_NM AS ixrNm,
+        A.CLCT_DT AS statDt,
+        A.SRVC_LVL AS srvcLvl,
+        A.DELY_HH AS delyHh,
+        A.TFVL AS tfvl
+        FROM TB_SC_IXR_STAT_15M A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="findSrvcHH" parameterType="com.its.op.dto.its.scrs.ScSrvcParam" resultType="com.its.op.dto.its.scrs.ScSrvcDto">
+        SELECT B.IXR_ID AS ixrId,
+        B.IXR_NM AS ixrNm,
+        A.CLCT_DT AS statDt,
+        A.SRVC_LVL AS srvcLvl,
+        A.DELY_HH AS delyHh,
+        A.TFVL AS tfvl
+        FROM TB_SC_IXR_STAT_HH A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="findSrvcDD" parameterType="com.its.op.dto.its.scrs.ScSrvcParam" resultType="com.its.op.dto.its.scrs.ScSrvcDto">
+        SELECT B.IXR_ID AS ixrId,
+        B.IXR_NM AS ixrNm,
+        A.CLCT_DT AS statDt,
+        A.SRVC_LVL AS srvcLvl,
+        A.DELY_HH AS delyHh,
+        A.TFVL AS tfvl
+        FROM TB_SC_IXR_STAT_DD A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="findSrvcMN" parameterType="com.its.op.dto.its.scrs.ScSrvcParam" resultType="com.its.op.dto.its.scrs.ScSrvcDto">
+        SELECT B.IXR_ID AS ixrId,
+        B.IXR_NM AS ixrNm,
+        A.CLCT_DT AS statDt,
+        A.SRVC_LVL AS srvcLvl,
+        A.DELY_HH AS delyHh,
+        A.TFVL AS tfvl
+        FROM TB_SC_IXR_STAT_MN A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="findSrvcPtrnCompare" parameterType="com.its.op.dto.its.scrs.ScSrvcPtrnParam" resultType="com.its.op.dto.its.scrs.ScSrvcPtrnDto">
+        <![CDATA[
+        SELECT IXR_ID AS ixrId, IXR_NM as ixrNm, STATHH AS statHh,
+               SUM(SRVC_LVL) AS srvcLvl, SUM(DELY_HH) AS delyHh, SUM(TFVL) AS tfvl,
+               SUM(COMP_SRVC_LVL) AS compSrvcLvl, SUM(COMP_DELY_HH) AS compDelyHh, SUM(COMP_TFVL) AS compTfvl
+        FROM (
+                 SELECT Y.IXR_ID, Y.IXR_NM, Y.STATHH, X.SRVC_LVL, X.DELY_HH, X.TFVL, 0 AS COMP_SRVC_LVL, 0 AS COMP_DELY_HH, 0 AS COMP_TFVL
+                 FROM
+                     (SELECT IXR_ID, SUBSTR(CLCT_DT, 9, 2) AS STATHH,
+                             SRVC_LVL, DELY_HH, TFVL
+                      FROM TB_SC_IXR_STAT_DD
+                      WHERE CLCT_DT BETWEEN #{cond.baseDay} || '000000' AND #{cond.baseDay} || '235959'
+                     ) X,
+                     (SELECT A.IXR_ID, A.IXR_NM, B.STATHH
+                      FROM TB_SC_IXR_MNGM A,
+                           (SELECT HHMM AS statHh
+                            FROM (SELECT TO_CHAR(TRUNC(SYSDATE)+((LEVEL-1)*60)/1440, 'HH24') AS HHMM, LEVEL AS MINIDX
+                                  FROM DUAL
+                                  CONNECT BY LEVEL <= 24)
+                            WHERE HHMM >= '00'
+                           ) B
+                      WHERE A.IXR_ID = #{cond.ixrId}
+                     ) Y
+                 WHERE Y.IXR_ID = X.IXR_ID(+)
+                   AND Y.STATHH = X.STATHH(+)
+                 UNION ALL
+                 SELECT Y.IXR_ID, Y.IXR_NM, Y.STATHH, 0 AS SRVC_LVL, 0 AS DELY_HH, 0 AS TFVL, X.SRVC_LVL AS COMP_SRVC_LVL, X.DELY_HH AS COMP_DELY_HH, X.TFVL AS COMP_TFVL
+                 FROM
+                     (SELECT IXR_ID, SUBSTR(CLCT_DT, 9, 2) AS STATHH,
+                             SRVC_LVL, DELY_HH, TFVL
+                      FROM TB_SC_IXR_STAT_DD
+                      WHERE CLCT_DT BETWEEN #{cond.compDay} || '000000' AND #{cond.compDay} || '235959'
+                     ) X,
+                     (SELECT A.IXR_ID, A.IXR_NM, B.STATHH
+                      FROM TB_SC_IXR_MNGM A,
+                           (SELECT HHMM AS statHh
+                            FROM (SELECT TO_CHAR(TRUNC(SYSDATE)+((LEVEL-1)*60)/1440, 'HH24') AS HHMM, LEVEL AS MINIDX
+                                  FROM DUAL
+                                  CONNECT BY LEVEL <= 24)
+                            WHERE HHMM >= '00'
+                           ) B
+                      WHERE A.IXR_ID = #{cond.ixrId}
+                     ) Y
+                 WHERE Y.IXR_ID = X.IXR_ID(+)
+                   AND Y.STATHH = X.STATHH(+)
+             )
+        GROUP BY IXR_ID, IXR_NM, STATHH
+        ]]>
+    </select>
+
+</mapper>

+ 51 - 0
src/main/resources/mybatis/mapper/its/scrs/ScStrtStatisticsMapper.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.op.dao.mapper.its.scrs.ScStrtStatisticsMapper">
+
+    <select id="findStrtClctHs" parameterType="com.its.op.dto.its.scrs.ScStrtParam" resultType="com.its.op.dto.its.scrs.ScStrtDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               A.CLCT_DT AS clctDt,
+               ROUND(AVG(A.STRT), 0) AS strt,
+               SUM(A.TFVL) AS tfvl,
+               ROUND(AVG(A.STDG_TRFC_RATE), 0) AS stdgTrfcRate,
+               ROUND(AVG(A.OCPY_HH), 0) AS ocpyHh,
+               ROUND(AVG(A.NOCP_HH), 0) AS nocpHh
+        FROM TB_SC_CYCL_CLCT_HS A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+        GROUP BY B.IXR_ID, A.CLCT_DT
+    </select>
+
+    <select id="findStrtClctLaneHs" parameterType="com.its.op.dto.its.scrs.ScStrtParam" resultType="com.its.op.dto.its.scrs.ScStrtDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               A.CLCT_DT AS clctDt,
+               A.LANE AS lane,
+               ROUND(AVG(A.STRT), 0) AS strt,
+               SUM(A.TFVL) AS tfvl,
+               ROUND(AVG(A.STDG_TRFC_RATE), 0) AS stdgTrfcRate,
+               ROUND(AVG(A.OCPY_HH), 0) AS ocpyHh,
+               ROUND(AVG(A.NOCP_HH), 0) AS nocpHh
+        FROM TB_SC_CYCL_CLCT_LANE_HS A
+        INNER JOIN TB_SC_IXR_MNGM B
+        ON A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        AND A.IXR_ID = B.IXR_ID
+        <if test="cond.ixrIds != null and cond.ixrIds.size > 0">
+            AND B.IXR_ID IN
+            <foreach collection="cond.ixrIds" item="ixrId" open="(" close=")" separator=" , ">
+                #{ixrId}
+            </foreach>
+        </if>
+        GROUP BY B.IXR_ID, A.CLCT_DT, A.LANE
+    </select>
+
+</mapper>

+ 517 - 0
src/main/resources/mybatis/mapper/its/scrs/ScTfvlStatisticsMapper.xml

@@ -0,0 +1,517 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.op.dao.mapper.its.scrs.ScTfvlStatisticsMapper">
+
+    <select id="findTfvl05M" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.LANE), 0) AS lane,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.UTURN_TFVL) AS uturnTfvl,
+               NVL(ROUND(AVG(A.SPED), 0), 0) AS sped,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl,
+               SUM(A.BIKE_GO_TFVL) AS bikeGoTfvl,
+               SUM(A.BIKE_LEFT_TFVL) AS bikeLeftTfvl,
+               SUM(A.BIKE_RGHT_TFVL) AS bikeRghtTfvl
+        FROM TB_SC_IMGN_DTCT_RAW_CLCT A,
+             (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                     B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+              FROM TB_SC_IXR_MNGM A
+              INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                   ON A.IXR_ID = #{cond.ixrId}
+                  AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                  AND B.CMRA_ID IN
+                  <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                      #{cmraId}
+                  </foreach>
+                </if>
+              ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CMRA_ID = B.CMRA_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+    <select id="findTfvl15M" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl
+          FROM TB_SC_ACRD_STAT_15M A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                       B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                  FROM TB_SC_IXR_MNGM A
+                 INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                    ON A.IXR_ID = #{cond.ixrId}
+                   AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+
+    <select id="findTfvl30M" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl
+        FROM TB_SC_ACRD_STAT_30M A,
+             (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                     B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+              FROM TB_SC_IXR_MNGM A
+             INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                    ON A.IXR_ID = #{cond.ixrId}
+                   AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+             ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+    <select id="findTfvlHH" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl
+        FROM TB_SC_ACRD_STAT_HH A,
+             (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                     B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+              FROM TB_SC_IXR_MNGM A
+             INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                     ON A.IXR_ID = #{cond.ixrId}
+                    AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+             ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+    <select id="findTfvlDD" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl
+        FROM TB_SC_ACRD_STAT_DD A,
+             (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                     B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+              FROM TB_SC_IXR_MNGM A
+             INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                     ON A.IXR_ID = #{cond.ixrId}
+                    AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+              ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+    <select id="findTfvlMN" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               MIN(B.IXR_NM) AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               MIN(B.ISTL_LCTN) AS istlLctn,
+               MIN(B.DRCT_DVSN_CD) AS drctDvsnCd,
+               MIN(B.DRCT_DVSN_NM) AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               NVL(MIN(A.INTL_ATMP_HEAT_LNGT), 0) AS intlAtmpHeatLngt,
+               NVL(ROUND(AVG(A.OCPY_RATE), 2), 0) AS ocpyRate,
+               SUM(A.WALK_CNT) AS walkCnt,
+               SUM(A.LRG_GO_TFVL) AS lrgGoTfvl,
+               SUM(A.MDDL_GO_TFVL) AS mddlGoTfvl,
+               SUM(A.SMAL_GO_TFVL) AS smalGoTfvl,
+               SUM(A.LRG_LEFT_TFVL) AS lrgLeftTfvl,
+               SUM(A.MDDL_LEFT_TFVL) AS mddlLeftTfvl,
+               SUM(A.SMAL_LEFT_TFVL) AS smalLeftTfvl,
+               SUM(A.LRG_RGHT_TFVL) AS lrgRghtTfvl,
+               SUM(A.MDDL_RGHT_TFVL) AS mddlRghtTfvl,
+               SUM(A.SMAL_RGHT_TFVL) AS smalRghtTfvl,
+               SUM(A.BUS_DVRS_LANE_GO_TFVL) AS busDvrsLaneGoTfvl,
+               SUM(A.BUS_DVRS_LANE_LEFT_TFVL) AS busDvrsLaneLeftTfvl
+        FROM TB_SC_ACRD_STAT_MN A,
+             (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                     B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+              FROM TB_SC_IXR_MNGM A
+              INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                      ON A.IXR_ID = #{cond.ixrId}
+                     AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+              ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+        GROUP BY B.IXR_ID, B.CMRA_ID, A.CLCT_DT
+    </select>
+
+    <select id="findTfvl05MLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.UTURN_TFVL AS uturnTfvl,
+               A.SPED AS sped,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl,
+               A.BIKE_GO_TFVL AS bikeGoTfvl,
+               A.BIKE_LEFT_TFVL AS bikeLeftTfvl,
+               A.BIKE_RGHT_TFVL AS bikeRghtTfvl
+          FROM TB_SC_IMGN_DTCT_RAW_CLCT A,
+                (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+          AND A.CMRA_ID = B.CMRA_ID
+          AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+    <select id="findTfvl15MLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl
+          FROM TB_SC_LANE_STAT_15M A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CMRA_ID = B.CMRA_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+    <select id="findTfvl30MLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl
+          FROM TB_SC_LANE_STAT_30M A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CMRA_ID = B.CMRA_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+    <select id="findTfvlHHLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl
+          FROM TB_SC_LANE_STAT_HH A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CMRA_ID = B.CMRA_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+    <select id="findTfvlDDLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl
+          FROM TB_SC_LANE_STAT_DD A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CMRA_ID = B.CMRA_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+    <select id="findTfvlMNLane" parameterType="com.its.op.dto.its.scrs.ScTfvlParam" resultType="com.its.op.dto.its.scrs.ScTfvlDto">
+        SELECT B.IXR_ID AS ixrId,
+               B.IXR_NM AS ixrNm,
+               B.CMRA_ID AS cmraId,
+               B.ISTL_LCTN AS istlLctn,
+               B.DRCT_DVSN_CD AS drctDvsnCd,
+               B.DRCT_DVSN_NM AS drctDvsnNm,
+               A.CLCT_DT AS statDt,
+               A.LANE AS lane,
+               A.INTL_ATMP_HEAT_LNGT AS intlAtmpHeatLngt,
+               A.OCPY_RATE AS ocpyRate,
+               A.WALK_CNT AS walkCnt,
+               A.LRG_GO_TFVL AS lrgGoTfvl,
+               A.MDDL_GO_TFVL AS mddlGoTfvl,
+               A.SMAL_GO_TFVL AS smalGoTfvl,
+               A.LRG_LEFT_TFVL AS lrgLeftTfvl,
+               A.MDDL_LEFT_TFVL AS mddlLeftTfvl,
+               A.SMAL_LEFT_TFVL AS smalLeftTfvl,
+               A.LRG_RGHT_TFVL AS lrgRghtTfvl,
+               A.MDDL_RGHT_TFVL AS mddlRghtTfvl,
+               A.SMAL_RGHT_TFVL AS smalRghtTfvl,
+               A.BUS_DVRS_LANE_GO_TFVL AS busDvrsLaneGoTfvl,
+               A.BUS_DVRS_LANE_LEFT_TFVL AS busDvrsLaneLeftTfvl
+          FROM TB_SC_LANE_STAT_MN A,
+               (SELECT A.IXR_ID, A.IXR_NM, B.CMRA_ID, B.ISTL_LCTN,
+                B.DRCT_DVSN_CD, fn_codeName('DRCT', B.DRCT_DVSN_CD) AS DRCT_DVSN_NM
+                FROM TB_SC_IXR_MNGM A
+                INNER JOIN TB_SC_IXR_CMRA_MNGM B
+                ON A.IXR_ID = #{cond.ixrId}
+                AND A.IXR_ID = B.IXR_ID
+                <if test="cond.cmraIds != null and cond.cmraIds.size > 0">
+                    AND B.CMRA_ID IN
+                    <foreach collection="cond.cmraIds" item="cmraId" open="(" close=")" separator=" , ">
+                        #{cmraId}
+                    </foreach>
+                </if>
+                ) B
+        WHERE A.IXR_ID  = B.IXR_ID
+        AND A.CMRA_ID = B.CMRA_ID
+        AND A.CLCT_DT BETWEEN #{cond.fromDt} AND #{cond.toDt}
+    </select>
+
+</mapper>