shjung 3 lat temu
rodzic
commit
df10ed1ca3
37 zmienionych plików z 2834 dodań i 95 usunięć
  1. 6 0
      pom.xml
  2. 131 15
      src/main/java/com/its/op/controller/its/cctv/CctvControlController.java
  3. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScIxrCmraMngmController.java
  4. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScIxrGemtMngmController.java
  5. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScIxrGropMngmController.java
  6. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScIxrMngmController.java
  7. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScIxrPhasController.java
  8. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScPstnIxrMngmController.java
  9. 80 0
      src/main/java/com/its/op/controller/its/scrs/TbScSgnlCtlrController.java
  10. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScSgnlIxrMngmController.java
  11. 71 0
      src/main/java/com/its/op/controller/its/scrs/TbScSgnlIxrSttsController.java
  12. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScSpclDdHmsCntlController.java
  13. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScTodCnfgController.java
  14. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScTrfcCndtMngmController.java
  15. 1 1
      src/main/java/com/its/op/controller/its/scrs/TbScWeekHmsCntlController.java
  16. 20 0
      src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlCtlrRepository.java
  17. 20 0
      src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlIxrSttsRepository.java
  18. 49 0
      src/main/java/com/its/op/dto/its/cctv/CctvControlDto.java
  19. 144 0
      src/main/java/com/its/op/dto/its/cctv/CctvParamControlDto.java
  20. 144 0
      src/main/java/com/its/op/dto/its/cctv/CctvPresetControlDto.java
  21. 88 0
      src/main/java/com/its/op/dto/its/cctv/CctvPtzControlDto.java
  22. 76 0
      src/main/java/com/its/op/dto/its/cctv/CctvStatusDto.java
  23. 157 0
      src/main/java/com/its/op/dto/its/cctv/CctvVarCharControlDto.java
  24. 9 1
      src/main/java/com/its/op/dto/its/cctv/TbCctvCtrlHsDto.java
  25. 249 0
      src/main/java/com/its/op/dto/its/scrs/TbScSgnlCtlrDto.java
  26. 100 0
      src/main/java/com/its/op/dto/its/scrs/TbScSgnlCtlrPhaseDto.java
  27. 326 0
      src/main/java/com/its/op/dto/its/scrs/TbScSgnlIxrSttsDto.java
  28. 37 0
      src/main/java/com/its/op/entity/its/cctv/TbCctvCtrlHs.java
  29. 204 0
      src/main/java/com/its/op/entity/its/scrs/TbScSgnlCtlr.java
  30. 198 0
      src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrStts.java
  31. 381 29
      src/main/java/com/its/op/service/its/cctv/CctvControlService.java
  32. 124 0
      src/main/java/com/its/op/service/its/scrs/TbScSgnlCtlrService.java
  33. 114 0
      src/main/java/com/its/op/service/its/scrs/TbScSgnlIxrSttsService.java
  34. 1 3
      src/main/resources/application-dev.ymlx
  35. 0 23
      src/main/resources/application-prod.yml
  36. 24 0
      src/main/resources/application-prod.ymlx
  37. 70 13
      src/main/resources/application.yml

+ 6 - 0
pom.xml

@@ -44,6 +44,12 @@
             <artifactId>jansi</artifactId>
             <version>1.8</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.6</version>
+        </dependency>
+
         <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec 비번, base64 -->
         <dependency>
             <groupId>commons-codec</groupId>

+ 131 - 15
src/main/java/com/its/op/controller/its/cctv/CctvControlController.java

@@ -1,7 +1,7 @@
 package com.its.op.controller.its.cctv;
 
 import com.its.op.controller.its.LoginController;
-import com.its.op.dto.its.cctv.CctvControlDto;
+import com.its.op.dto.its.cctv.*;
 import com.its.op.service.its.cctv.CctvControlService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -25,19 +25,53 @@ public class CctvControlController {
     private final CctvControlService service;
     private final LoginController loginController;
 
-//    @GetMapping("/ex_redirect2")
-//    public ModelAndView exRedirect2() {
-//        String uri = String.format("http://115.91.94.42:8903/api/cctv/control/status/%d", );
-//        String projectUrl = "redirect:http://www.naver.com";
-//        return new ModelAndView("redirect:" + projectUrl);
-//    }
-    @ApiOperation(value = "CCTV PTZ 제어", response = CctvControlDto.CctvControlRes.class)
+    @ApiOperation(value = "CCTV 환경 파라미터 조회", response = CctvParamControlDto.CctvParamValueRes.class)
+    @GetMapping(value = "/param-qry/{id}", produces = {"application/json; charset=utf8"})
+    public CctvParamControlDto.CctvParamValueRes requestParam(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id) {
+        return this.service.requestParam(id);
+    }
+
+    @ApiOperation(value = "CCTV 상태 조회", response = CctvStatusDto.CctvStatusDtoRes.class)
+    @GetMapping(value = "/status/{id}", produces = {"application/json; charset=utf8"})
+    public CctvStatusDto.CctvStatusDtoRes requestStatus(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id) {
+        return this.service.requestStatus(id);
+    }
+
+    @ApiOperation(value = "CCTV 현재위치정보 조회", response = CctvPresetControlDto.CctvPresetValueRes.class)
+    @GetMapping(value = "/preset-value/{id}", produces = {"application/json; charset=utf8"})
+    public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id) {
+        return this.service.requestPresetValue(id);
+    }
+
+    @ApiOperation(value = "CCTV 환경 파라미터 설정", response = CctvParamControlDto.CctvParamControlRes.class)
+    @PostMapping(value = "/param-set/{id}", produces = {"application/json; charset=utf8"})
+    public CctvParamControlDto.CctvParamControlRes controlParam(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV PARAMETER 설정 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final CctvParamControlDto.CctvParamControlReq req,
+            HttpServletRequest request) {
+        String userId = this.loginController.getSessionUserId(request);
+        log.info("UUID: {}", userId);
+        if (!userId.equals("")) {
+            req.setUserId(userId);
+        }
+        return this.service.controlParam(id, req);
+    }
+
+    @ApiOperation(value = "CCTV PTZ 제어", response = CctvPtzControlDto.CctvPtzControlRes.class)
     @PostMapping(value = "/ptz/{id}", produces = {"application/json; charset=utf8"})
-    public CctvControlDto.CctvControlRes controlPtz(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+    public CctvPtzControlDto.CctvPtzControlRes controlPtz(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "CCTV PTZ 제어 정보", example = "[tilt-up, start, 20, ADMIN]", required = true)
-            @RequestBody @Valid final CctvControlDto.CctvControlPtzReq req,
+            @RequestBody @Valid final CctvPtzControlDto.CctvControlPtzReq req,
             HttpServletRequest request) {
         String userId = this.loginController.getSessionUserId(request);
         log.info("UUID: {}", userId);
@@ -47,13 +81,13 @@ public class CctvControlController {
         return this.service.controlPtz(id, req);
     }
 
-    @ApiOperation(value = "CCTV Preset 제어", response = CctvControlDto.CctvControlRes.class)
+    @ApiOperation(value = "CCTV Preset 제어", response = CctvPresetControlDto.CctvPresetControlRes.class)
     @PostMapping(value = "/preset/{id}", produces = {"application/json; charset=utf8"})
-    public CctvControlDto.CctvControlRes controlPreset(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+    public CctvPresetControlDto.CctvPresetControlRes controlPreset(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "CCTV Preset 제어 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
-            @RequestBody @Valid final CctvControlDto.CctvControlPresetReq req,
+            @RequestBody @Valid final CctvPresetControlDto.CctvPresetControlReq req,
             HttpServletRequest request) {
         String userId = this.loginController.getSessionUserId(request);
         log.info("UUID: {}", userId);
@@ -63,4 +97,86 @@ public class CctvControlController {
         return this.service.controlPreset(id, req);
     }
 
+    @ApiOperation(value = "CCTV 가변 문자 설정", response = CctvVarCharControlDto.CctvVarCharControlRes.class)
+    @PostMapping(value = "/var-char-set/{id}", produces = {"application/json; charset=utf8"})
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharSet(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV 가변문자 설정 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
+            @RequestBody @Valid final CctvVarCharControlDto.CctvVarCharControlSetReq req,
+            HttpServletRequest request) {
+        String userId = this.loginController.getSessionUserId(request);
+        log.info("UUID: {}", userId);
+        if (!userId.equals("")) {
+            req.setUserId(userId);
+        }
+        return this.service.controlVarCharSet(id, req);
+    }
+
+    @ApiOperation(value = "CCTV 가변 문자 삭제", response = CctvVarCharControlDto.CctvVarCharControlRes.class)
+    @PostMapping(value = "/var-char-del/{id}", produces = {"application/json; charset=utf8"})
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharDel(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV 가변문자 삭제 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
+            @RequestBody @Valid final CctvVarCharControlDto.CctvVarCharControlDelReq req,
+            HttpServletRequest request) {
+        String userId = this.loginController.getSessionUserId(request);
+        log.info("UUID: {}", userId);
+        if (!userId.equals("")) {
+            req.setUserId(userId);
+        }
+        return this.service.controlVarCharDel(id, req);
+    }
+
+    @ApiOperation(value = "CCTV RESET", response = CctvControlDto.CctvControlResetRes.class)
+    @PostMapping(value = "/reset/{id}", produces = {"application/json; charset=utf8"})
+    public CctvControlDto.CctvControlResetRes controlReset(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV 제어기 리셋", example = "[0/1, ADMIN]", required = true)
+            @RequestBody @Valid final CctvControlDto.CctvControlResetReq req,
+            HttpServletRequest request) {
+        String userId = this.loginController.getSessionUserId(request);
+        log.info("UUID: {}", userId);
+        if (!userId.equals("")) {
+            req.setUserId(userId);
+        }
+        return this.service.controlReset(id, req);
+    }
+
+    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//    @ApiOperation(value = "CCTV PTZ 제어", response = CctvControlDto.CctvControlRes.class)
+//    @PostMapping(value = "/ptz/{id}", produces = {"application/json; charset=utf8"})
+//    public CctvControlDto.CctvControlRes controlPtz(
+//            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+//            @PathVariable("id") Long id,
+//            @ApiParam(name = "req", value = "CCTV PTZ 제어 정보", example = "[tilt-up, start, 20, ADMIN]", required = true)
+//            @RequestBody @Valid final CctvControlDto.CctvControlPtzReq req,
+//            HttpServletRequest request) {
+//        String userId = this.loginController.getSessionUserId(request);
+//        log.info("UUID: {}", userId);
+//        if (!userId.equals("")) {
+//            req.setUserId(userId);
+//        }
+//        return this.service.controlPtz(id, req);
+//    }
+//
+//    @ApiOperation(value = "CCTV Preset 제어", response = CctvControlDto.CctvControlRes.class)
+//    @PostMapping(value = "/preset/{id}", produces = {"application/json; charset=utf8"})
+//    public CctvControlDto.CctvControlRes controlPreset(
+//            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+//            @PathVariable("id") Long id,
+//            @ApiParam(name = "req", value = "CCTV Preset 제어 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
+//            @RequestBody @Valid final CctvControlDto.CctvControlPresetReq req,
+//            HttpServletRequest request) {
+//        String userId = this.loginController.getSessionUserId(request);
+//        log.info("UUID: {}", userId);
+//        if (!userId.equals("")) {
+//            req.setUserId(userId);
+//        }
+//        return this.service.controlPreset(id, req);
+//    }
+    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
 }

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

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-1.스마트교차로카메라 관리")
+@Api(tags = "14.스마트교차로-1.관리-1.스마트교차로카메라 관리")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-2.교차로 기하구조 관리-2.교차로 기하구조 설정")
+@Api(tags = "14.스마트교차로-1.관리-2.교차로 기하구조 관리-2.교차로 기하구조 설정")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-4.신호교차로 그룹-0.그룹")
+@Api(tags = "14.스마트교차로-1.관리-4.신호교차로 그룹-0.그룹")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-0.교차로 관리")
+@Api(tags = "14.스마트교차로-1.관리-0.교차로 관리")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-3.신호교차로-1.현시구성정보")
+@Api(tags = "14.스마트교차로-1.관리-3.신호교차로-1.현시구성정보")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-4.신호교차로 그룹-1.그룹소속교차료")
+@Api(tags = "14.스마트교차로-1.관리-4.신호교차로 그룹-1.그룹소속교차료")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -0,0 +1,80 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlCtlrDto;
+import com.its.op.dto.its.scrs.TbScSgnlCtlrPhaseDto;
+import com.its.op.service.its.scrs.TbScSgnlCtlrService;
+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.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "14.스마트교차로-0.공통-1.신호제어기")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/scrs/tb_sc_sgnl_ctlr")
+public class TbScSgnlCtlrController {
+
+    private final TbScSgnlCtlrService service;
+
+    @ApiOperation(value = "신호 제어기 전체조회(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlCtlrDto> findAll() {
+        return this.service.findAll();
+    }
+
+    @ApiOperation(value = "신호 제어기 전체조회(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlCtlrDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "신호 제어기 개별조회(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class)
+    @GetMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbScSgnlCtlrDto findById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr) {
+        return this.service.findById(sgnlIxrNmbr);
+    }
+
+    @ApiOperation(value = "신호 제어기 전체조회(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrPhaseDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlCtlrPhaseDto> findAllPhaseList() {
+        return this.service.findAllPhaseList();
+    }
+
+//    @ApiOperation(value = "신호 제어기 정보변경(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class)
+//    @PutMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+//    public TbScSgnlCtlrDto updateById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr, @RequestBody @Valid final TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req) {
+//        return this.service.updateById(sgnlIxrNmbr, req);
+//    }
+//
+//    @ApiOperation(value = "신호 제어기 정보변경/생성-목록(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class, responseContainer = "ArrayList")
+//    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+//    public List<TbScSgnlCtlrDto> mergeInfoList(@RequestBody @Valid final List<TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq> listReq) {
+//        return this.service.mergeInfoList(listReq);
+//    }
+//
+//    @ApiOperation(value = "신호 제어기 정보변경/생성-개별(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class)
+//    @PostMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+//    public TbScSgnlCtlrDto mergeInfo(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr, @RequestBody @Valid final TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req) {
+//        return this.service.mergeInfo(req);
+//    }
+//
+//    @ApiOperation(value = "신호 제어기 정보삭제-개별(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class)
+//    @DeleteMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+//    public TbScSgnlCtlrDto deleteDataById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr) {
+//        return this.service.deleteById(sgnlIxrNmbr);
+//    }
+//
+//    @ApiOperation(value = "신호 제어기 정보삭제-목록(TB_SC_SGNL_CTLR)", response = TbScSgnlCtlrDto.class, responseContainer = "ArrayList")
+//    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+//    public List<TbScSgnlCtlrDto> deleteDataByIds(@RequestBody @Valid final List<Integer> ids) {
+//        return this.service.deleteByIds(ids);
+//    }
+
+}

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

@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-3.신호교차로-0.신호교차로")
+@Api(tags = "14.스마트교차로-1.관리-3.신호교차로-0.신호교차로")
 @Validated
 @RestController
 @RequiredArgsConstructor

+ 71 - 0
src/main/java/com/its/op/controller/its/scrs/TbScSgnlIxrSttsController.java

@@ -0,0 +1,71 @@
+package com.its.op.controller.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlIxrSttsDto;
+import com.its.op.service.its.scrs.TbScSgnlIxrSttsService;
+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 = "14.스마트교차로-0.공통-1.신호제어기-상태")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/scrs/tb_sc_sgnl_ixr_stts")
+public class TbScSgnlIxrSttsController {
+
+    private final TbScSgnlIxrSttsService service;
+
+    @ApiOperation(value = "신호 교차로 상태 전체조회(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlIxrSttsDto> findAll() {
+        return this.service.findAll();
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 전체조회(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlIxrSttsDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 개별조회(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class)
+    @GetMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbScSgnlIxrSttsDto findById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr) {
+        return this.service.findById(sgnlIxrNmbr);
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 정보변경(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class)
+    @PutMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbScSgnlIxrSttsDto updateById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr, @RequestBody @Valid final TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req) {
+        return this.service.updateById(sgnlIxrNmbr, req);
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 정보변경/생성-목록(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlIxrSttsDto> mergeInfoList(@RequestBody @Valid final List<TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 정보변경/생성-개별(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class)
+    @PostMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbScSgnlIxrSttsDto mergeInfo(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr, @RequestBody @Valid final TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 정보삭제-개별(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class)
+    @DeleteMapping(value = "/{sgnlIxrNmbr}", produces = {"application/json; charset=utf8"})
+    public TbScSgnlIxrSttsDto deleteDataById(@PathVariable("sgnlIxrNmbr") final Integer sgnlIxrNmbr) {
+        return this.service.deleteById(sgnlIxrNmbr);
+    }
+
+    @ApiOperation(value = "신호 교차로 상태 정보삭제-목록(TB_SC_SGNL_IXR_STTS)", response = TbScSgnlIxrSttsDto.class, responseContainer = "ArrayList")
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbScSgnlIxrSttsDto> deleteDataByIds(@RequestBody @Valid final List<Integer> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

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

@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-4.신호교차로 그룹-3.특수일 시각 제어")
+@Api(tags = "14.스마트교차로-1.관리-4.신호교차로 그룹-3.특수일 시각 제어")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-3.신호교차로-2.일일 시각 제어")
+@Api(tags = "14.스마트교차로-1.관리-3.신호교차로-2.일일 시각 제어")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-2.교차로 기하구조 관리-1.교통 조건 관리")
+@Api(tags = "14.스마트교차로-1.관리-2.교차로 기하구조 관리-1.교통 조건 관리")
 @Validated
 @RestController
 @RequiredArgsConstructor

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

@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "14.스마트교차로-0.관리-4.신호교차로 그룹-2.주간 시각 제어")
+@Api(tags = "14.스마트교차로-1.관리-4.신호교차로 그룹-2.주간 시각 제어")
 @Validated
 @RestController
 @RequiredArgsConstructor

+ 20 - 0
src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlCtlrRepository.java

@@ -0,0 +1,20 @@
+package com.its.op.dao.repository.its.scrs;
+
+import com.its.op.entity.its.scrs.TbScSgnlCtlr;
+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 TbScSgnlCtlrRepository extends JpaRepository<TbScSgnlCtlr, Integer>, JpaSpecificationExecutor<TbScSgnlCtlr> {
+
+    @Query("select p from TbScSgnlCtlr p")
+    List<TbScSgnlCtlr> findAll();
+
+    @Query("select p from TbScSgnlCtlr p")
+    List<TbScSgnlCtlr> findAllList();
+
+}

+ 20 - 0
src/main/java/com/its/op/dao/repository/its/scrs/TbScSgnlIxrSttsRepository.java

@@ -0,0 +1,20 @@
+package com.its.op.dao.repository.its.scrs;
+
+import com.its.op.entity.its.scrs.TbScSgnlIxrStts;
+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 TbScSgnlIxrSttsRepository extends JpaRepository<TbScSgnlIxrStts, Integer>, JpaSpecificationExecutor<TbScSgnlIxrStts> {
+
+    @Query("select p from TbScSgnlIxrStts p")
+    List<TbScSgnlIxrStts> findAll();
+
+    @Query("select p from TbScSgnlIxrStts p")
+    List<TbScSgnlIxrStts> findAllList();
+
+}

+ 49 - 0
src/main/java/com/its/op/dto/its/cctv/CctvControlDto.java

@@ -98,6 +98,55 @@ public class CctvControlDto implements Serializable {
             this.userId = userId;
         }
     }
+
+    @ApiModel("CctvControlResetReq(CCTV 제어기 리셋)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvControlResetReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @ApiModelProperty("RESET 유형(0: SW, 1: HW")
+        @JsonProperty("reset_type")
+        private Integer resetType;
+
+        @Builder
+        public CctvControlResetReq(String user_id, Integer reset_type) {
+            this.userId = user_id;
+            this.resetType = reset_type;
+        }
+    }
+
+    @ApiModel("CctvControlResetRes(CCTV 제어기 리셋 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvControlResetRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+        @Builder
+        public CctvControlResetRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+
     @ApiModel("CctvControlRes(CCTV Control 응답)")
     @Getter
     @Setter

+ 144 - 0
src/main/java/com/its/op/dto/its/cctv/CctvParamControlDto.java

@@ -0,0 +1,144 @@
+package com.its.op.dto.its.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * CCTV 제어기 프리셋제어 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("CctvParamControlDto(CCTV 파라미터설정 정보")
+public class CctvParamControlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("CctvParamControlReq(CCTV 파라미터설정 정보)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvParamControlReq {
+
+        @ApiModelProperty("FAN ON 설정 온도")
+        @JsonProperty("fan_on_tmpr")
+        @PositiveOrZero
+        private Integer fanOnTmpr;
+
+        @ApiModelProperty("FAN OFF 설정 온도")
+        @JsonProperty("fan_off_tmpr")
+        @PositiveOrZero
+        private Integer fanOffTmpr;
+
+        @ApiModelProperty("Heater ON 설정 온도")
+        @JsonProperty("hetr_on_tmpr")
+        @PositiveOrZero
+        private Integer hetrOnTmpr;
+
+        @ApiModelProperty("Heater OFF 설정 온도")
+        @JsonProperty("hetr_off_tmpr")
+        @PositiveOrZero
+        private Integer hetrOffTmpr;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvParamControlReq(Integer fan_on_tmpr, Integer fan_off_tmpr, Integer hetr_on_tmpr, Integer hetr_off_tmpr, String user_id) {
+            this.fanOnTmpr = fan_on_tmpr;
+            this.fanOffTmpr = fan_off_tmpr;
+            this.hetrOnTmpr = hetr_on_tmpr;
+            this.hetrOffTmpr = hetr_off_tmpr;
+            this.userId = user_id;
+        }
+    }
+
+    @ApiModel("CctvParamControlRes(CCTV 파라미터설정 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvParamControlRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+        @Builder
+        public CctvParamControlRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+
+    @ApiModel("CctvParamValueRes(CCTV 파라미터설정 정보)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvParamValueRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        @ApiModelProperty("FAN ON 설정 온도")
+        @JsonProperty("fan_on_tmpr")
+        @PositiveOrZero
+        private Integer fanOnTmpr;
+
+        @ApiModelProperty("FAN OFF 설정 온도")
+        @JsonProperty("fan_off_tmpr")
+        @PositiveOrZero
+        private Integer fanOffTmpr;
+
+        @ApiModelProperty("Heater ON 설정 온도")
+        @JsonProperty("hetr_on_tmpr")
+        @PositiveOrZero
+        private Integer hetrOnTmpr;
+
+        @ApiModelProperty("Heater OFF 설정 온도")
+        @JsonProperty("hetr_off_tmpr")
+        @PositiveOrZero
+        private Integer hetrOffTmpr;
+
+        public CctvParamValueRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+            this.fanOnTmpr = 0;
+            this.fanOffTmpr = 0;
+            this.hetrOnTmpr = 0;
+            this.hetrOffTmpr = 0;
+        }
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+
+        public void setValue(Integer fanOnTmpr, Integer fanOffTmpr, Integer hetrOnTmpr, Integer hetrOffTmpr) {
+            this.fanOnTmpr = fanOnTmpr;
+            this.fanOffTmpr = fanOffTmpr;
+            this.hetrOnTmpr = hetrOnTmpr;
+            this.hetrOffTmpr = hetrOffTmpr;
+        }
+    }
+
+}

+ 144 - 0
src/main/java/com/its/op/dto/its/cctv/CctvPresetControlDto.java

@@ -0,0 +1,144 @@
+package com.its.op.dto.its.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * CCTV 제어기 프리셋제어 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("CctvPresetControlDto(CCTV 프리셋제어 정보")
+public class CctvPresetControlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("CctvPresetControlReq(CCTV 프리셋제어 정보)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvPresetControlReq {
+
+        @ApiModelProperty("Pan Preset Value")
+        @JsonProperty("pan")
+        @PositiveOrZero
+        private Integer pan;
+
+        @ApiModelProperty("Tilt Preset Value")
+        @JsonProperty("tilt")
+        @PositiveOrZero
+        private Integer tilt;
+
+        @ApiModelProperty("Zoom Preset Value")
+        @JsonProperty("zoom")
+        @PositiveOrZero
+        private Integer zoom;
+
+        @ApiModelProperty("Focus Preset Value")
+        @JsonProperty("focus")
+        @PositiveOrZero
+        private Integer focus;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvPresetControlReq(Integer pan, Integer tilt, Integer zoom, Integer focus, String user_id) {
+            this.pan = pan;
+            this.tilt = tilt;
+            this.zoom = zoom;
+            this.focus = focus;
+            this.userId = user_id;
+        }
+    }
+
+    @ApiModel("CctvPresetControlRes(CCTV 프리셋제어 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvPresetControlRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+        @Builder
+        public CctvPresetControlRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+
+    @ApiModel("CctvPresetValueRes(CCTV 프리셋 상태 정보)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvPresetValueRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        @ApiModelProperty("Pan Preset Value")
+        @JsonProperty("pan")
+        @PositiveOrZero
+        private Short pan;
+
+        @ApiModelProperty("Tilt Preset Value")
+        @JsonProperty("tilt")
+        @PositiveOrZero
+        private Short tilt;
+
+        @ApiModelProperty("Zoom Preset Value")
+        @JsonProperty("zoom")
+        @PositiveOrZero
+        private Short zoom;
+
+        @ApiModelProperty("Focus Preset Value")
+        @JsonProperty("focus")
+        @PositiveOrZero
+        private Short focus;
+
+        public CctvPresetValueRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+            this.pan = 0;
+            this.tilt = 0;
+            this.zoom = 0;
+            this.focus = 0;
+        }
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+
+        public void setValue(Short pan, Short tilt, Short zoom, Short focus) {
+            this.pan = pan;
+            this.tilt = tilt;
+            this.zoom = zoom;
+            this.focus = focus;
+        }
+    }
+
+}

+ 88 - 0
src/main/java/com/its/op/dto/its/cctv/CctvPtzControlDto.java

@@ -0,0 +1,88 @@
+package com.its.op.dto.its.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * CCTV 제어기 제어정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("CctvControlDto(CCTV 제어 정보")
+public class CctvPtzControlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("CctvControlPtzReq(CCTV PTZ 제어 정보)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvControlPtzReq {
+
+        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right)")
+        @JsonProperty("command")
+        private String command;
+
+        @ApiModelProperty("제어 명령 제어(start, stop)")
+        @JsonProperty("action")
+        private String action;
+
+        @ApiModelProperty("제어속도(0~63)")
+        @JsonProperty("speed")
+        @PositiveOrZero
+        private Integer speed;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvControlPtzReq(String command, String action, Integer speed, String user_id) {
+            this.command = command;
+            this.action = action;
+            this.speed = speed;
+            this.userId = user_id;
+        }
+    }
+
+    @ApiModel("CctvControlRes(CCTV Control 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvPtzControlRes {
+
+        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right), 프리셋제어(call, save, delete)")
+        @JsonProperty("command")
+        private String command;
+
+        @ApiModelProperty("제어 명령 제어(start, stop), 프리셋제어(call, save, delete)")
+        @JsonProperty("action")
+        private String action;
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+        @Builder
+        public CctvPtzControlRes(String command, String action, Integer error, String message) {
+            this.command = command;
+            this.action = action;
+            this.error = error;
+            this.message = message;
+        }
+    }
+}

+ 76 - 0
src/main/java/com/its/op/dto/its/cctv/CctvStatusDto.java

@@ -0,0 +1,76 @@
+package com.its.op.dto.its.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ * CCTV 제어기 상태 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("CctvStatusDto(CCTV 상태 정보")
+public class CctvStatusDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("CctvStatusDtoRes(CCTV 상태 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvStatusDtoRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        private TbCctvCtlrSttsDto stts;
+
+        public void setResult(Integer error, String message, TbCctvCtlrSttsDto stts) {
+            this.error = error;
+            this.message = message;
+            this.stts = stts;
+        }
+
+        @Builder
+        public CctvStatusDtoRes(Integer error, String message, TbCctvCtlrSttsDto stts) {
+            this.error = error;
+            this.message = message;
+            this.stts = stts;
+        }
+    }
+
+    @ApiModel("CctvStatusNotifyDtoRes(CCTV 상태 Notify 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvStatusNotifyDtoRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+
+        @Builder
+        public CctvStatusNotifyDtoRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+}

+ 157 - 0
src/main/java/com/its/op/dto/its/cctv/CctvVarCharControlDto.java

@@ -0,0 +1,157 @@
+package com.its.op.dto.its.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+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;
+
+/**
+ * CCTV 가변 문자 설정 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("CctvVarCharControlDto(CCTV 가변 문자 설정 정보")
+public class CctvVarCharControlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("CctvVarCharControlSetReq(CCTV 가변 문자 설정)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvVarCharControlSetReq {
+
+        @ApiModelProperty("Sector No. 0~6")
+        @JsonProperty("sector_no")
+        @PositiveOrZero
+        private Integer sectorNo;
+
+        @ApiModelProperty("Start Pan Value 0~1024")
+        @JsonProperty("start_pan")
+        @PositiveOrZero
+        private Short startPan;
+
+        @ApiModelProperty("End Pan Value 0~1024")
+        @JsonProperty("end_pan")
+        @PositiveOrZero
+        private Short endPan;
+
+        @ApiModelProperty("CH1 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
+        @JsonProperty("ch1_char_size")
+        @PositiveOrZero
+        private Short ch1CharSize;
+
+        @ApiModelProperty("CH1 Character X Position Value 0~1280")
+        @JsonProperty("ch1_pos_x")
+        @PositiveOrZero
+        private Short ch1PosX;
+
+        @ApiModelProperty("CH1 Character Y Position Value 0~720")
+        @JsonProperty("ch1_pos_y")
+        @PositiveOrZero
+        private Short ch1PosY;
+
+        @ApiModelProperty("CH2 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
+        @JsonProperty("ch2_char_size")
+        @PositiveOrZero
+        private Short ch2CharSize;
+
+        @ApiModelProperty("CH2 Character X Position Value 0~1280")
+        @JsonProperty("ch2_pos_x")
+        @PositiveOrZero
+        private Short ch2PosX;
+
+        @ApiModelProperty("CH2 Character Y Position Value 0~720")
+        @JsonProperty("ch2_pos_y")
+        @PositiveOrZero
+        private Short ch2PosY;
+
+        @ApiModelProperty("CH1 Character, Max: 16char(kor),32char(eng)")
+        @JsonProperty("ch1_char")
+        @Size(min=1, max=32)
+        private String ch1Char;
+
+        @ApiModelProperty("CH2 Character, Max: 16char(kor),32char(eng)")
+        @JsonProperty("ch2_char")
+        @Size(min=1, max=32)
+        private String ch2Char;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvVarCharControlSetReq(Integer sector_no, Short start_pan, Short end_pan,
+                                        Short ch1_char_size, Short ch1_pos_x, Short ch1_pos_y,
+                                        Short ch2_char_size, Short ch2_pos_x, Short ch2_pos_y,
+                                        String ch1_char, String ch2_char,
+                                        String user_id) {
+            this.sectorNo = sector_no;
+            this.startPan = start_pan;
+            this.endPan = end_pan;
+            this.ch1CharSize = ch1_char_size;
+            this.ch1PosX = ch1_pos_x;
+            this.ch1PosY = ch1_pos_y;
+            this.ch2CharSize = ch2_char_size;
+            this.ch2PosX = ch2_pos_x;
+            this.ch2PosY = ch2_pos_y;
+            this.ch1Char = ch1_char;
+            this.ch2Char = ch2_char;
+            this.userId = user_id;
+        }
+    }
+
+    @ApiModel("CctvVarCharControlDelReq(CCTV 가변 문자 지우기)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvVarCharControlDelReq {
+
+        @ApiModelProperty("Sector No. 0~6")
+        @JsonProperty("sector_no")
+        @PositiveOrZero
+        private Integer sectorNo;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvVarCharControlDelReq(Integer sector_no, String user_id) {
+            this.sectorNo = sector_no;
+            this.userId = user_id;
+        }
+    }
+
+    @ApiModel("CctvVarCharControlRes(CCTV 가변 문자 설정 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvVarCharControlRes {
+
+        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
+        @JsonProperty("error")
+        private Integer error;
+
+        @ApiModelProperty("제어결과메시지")
+        @JsonProperty("message")
+        private String message;
+
+        public void setResult(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+        @Builder
+        public CctvVarCharControlRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+
+}

+ 9 - 1
src/main/java/com/its/op/dto/its/cctv/TbCctvCtrlHsDto.java

@@ -34,7 +34,7 @@ public class TbCctvCtrlHsDto implements Serializable {
     @JsonProperty("ctrl_val")
     private String ctrlVal;
 
-    @ApiModelProperty("제어결과(0:실패,1:성공)")  // Y NUMBER(1)
+    @ApiModelProperty("제어결과(0:성공,기타:실패)")  // Y NUMBER(1)
     @JsonProperty("ctrl_result")
     private Integer ctrlResult;
 
@@ -51,6 +51,14 @@ public class TbCctvCtrlHsDto implements Serializable {
     @JsonProperty("cctv_nm")
     private String cctvNm;
 
+    @ApiModelProperty("제어유형")  // Y VARCHAR(40)
+    @JsonProperty("ctrl_type_desc")
+    private String ctrlTypeDesc;
+
+    @ApiModelProperty("제어결과설명")  // Y VARCHAR(40)
+    @JsonProperty("ctrl_result_desc")
+    private String ctrlResultDesc;
+
     public TbCctvCtrlHs toEntity() {
         return TbCctvCtrlHs.builder()
                 .ctrlDt(this.ctrlDt)

+ 249 - 0
src/main/java/com/its/op/dto/its/scrs/TbScSgnlCtlrDto.java

@@ -0,0 +1,249 @@
+package com.its.op.dto.its.scrs;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.scrs.TbScSgnlCtlr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * 신호 제어기 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbScSgnlCtlrDto(신호 제어기)")
+public class TbScSgnlCtlrDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @JsonProperty("sgnl_ixr_nmbr")
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(10)
+    @JsonProperty("x_crdn")
+    private Double xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10)
+    @JsonProperty("y_crdn")
+    private Double yCrdn;
+
+    @ApiModelProperty("A링 1현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_1phas_cd")
+    private Integer aring1phasCd;
+
+    @ApiModelProperty("A링 2현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_2phas_cd")
+    private Integer aring2phasCd;
+
+    @ApiModelProperty("A링 3현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_3phas_cd")
+    private Integer aring3phasCd;
+
+    @ApiModelProperty("A링 4현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_4phas_cd")
+    private Integer aring4phasCd;
+
+    @ApiModelProperty("A링 5현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_5phas_cd")
+    private Integer aring5phasCd;
+
+    @ApiModelProperty("A링 6현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_6phas_cd")
+    private Integer aring6phasCd;
+
+    @ApiModelProperty("A링 7현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_7phas_cd")
+    private Integer aring7phasCd;
+
+    @ApiModelProperty("A링 8현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_8phas_cd")
+    private Integer aring8phasCd;
+
+    @ApiModelProperty("B링 1현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_1phas_cd")
+    private Integer bring1phasCd;
+
+    @ApiModelProperty("B링 2현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_2phas_cd")
+    private Integer bring2phasCd;
+
+    @ApiModelProperty("B링 3현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_3phas_cd")
+    private Integer bring3phasCd;
+
+    @ApiModelProperty("B링 4현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_4phas_cd")
+    private Integer bring4phasCd;
+
+    @ApiModelProperty("B링 5현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_5phas_cd")
+    private Integer bring5phasCd;
+
+    @ApiModelProperty("B링 6현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_6phas_cd")
+    private Integer bring6phasCd;
+
+    @ApiModelProperty("B링 7현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_7phas_cd")
+    private Integer bring7phasCd;
+
+    @ApiModelProperty("B링 8현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_8phas_cd")
+    private Integer bring8phasCd;
+
+    @ApiModel("TbScSgnlCtlrUpdReq(신호 제어기 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbScSgnlCtlrUpdReq {
+
+        @ApiModelProperty("신호 교차로 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("sgnl_ixr_nmbr")
+        @PositiveOrZero
+        private Integer sgnlIxrNmbr;
+
+        @ApiModelProperty("X 좌표, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("x_crdn")
+        @Positive
+        private Double xCrdn;
+
+        @ApiModelProperty("Y 좌표, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("y_crdn")
+        @Positive
+        private Double yCrdn;
+
+        @ApiModelProperty("A링 1현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_1phas_cd")
+        @PositiveOrZero
+        private Integer aring1phasCd;
+
+        @ApiModelProperty("A링 2현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_2phas_cd")
+        @PositiveOrZero
+        private Integer aring2phasCd;
+
+        @ApiModelProperty("A링 3현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_3phas_cd")
+        @PositiveOrZero
+        private Integer aring3phasCd;
+
+        @ApiModelProperty("A링 4현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_4phas_cd")
+        @PositiveOrZero
+        private Integer aring4phasCd;
+
+        @ApiModelProperty("A링 5현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_5phas_cd")
+        @PositiveOrZero
+        private Integer aring5phasCd;
+
+        @ApiModelProperty("A링 6현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_6phas_cd")
+        @PositiveOrZero
+        private Integer aring6phasCd;
+
+        @ApiModelProperty("A링 7현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_7phas_cd")
+        @PositiveOrZero
+        private Integer aring7phasCd;
+
+        @ApiModelProperty("A링 8현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("aring_8phas_cd")
+        @PositiveOrZero
+        private Integer aring8phasCd;
+
+        @ApiModelProperty("B링 1현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_1phas_cd")
+        @PositiveOrZero
+        private Integer bring1phasCd;
+
+        @ApiModelProperty("B링 2현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_2phas_cd")
+        @PositiveOrZero
+        private Integer bring2phasCd;
+
+        @ApiModelProperty("B링 3현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_3phas_cd")
+        @PositiveOrZero
+        private Integer bring3phasCd;
+
+        @ApiModelProperty("B링 4현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_4phas_cd")
+        @PositiveOrZero
+        private Integer bring4phasCd;
+
+        @ApiModelProperty("B링 5현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_5phas_cd")
+        @PositiveOrZero
+        private Integer bring5phasCd;
+
+        @ApiModelProperty("B링 6현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_6phas_cd")
+        @PositiveOrZero
+        private Integer bring6phasCd;
+
+        @ApiModelProperty("B링 7현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_7phas_cd")
+        @PositiveOrZero
+        private Integer bring7phasCd;
+
+        @ApiModelProperty("B링 8현시 코드, Nullable = Y, NUMBER(7)")  // Y NUMBER(7)
+        @JsonProperty("bring_8phas_cd")
+        @PositiveOrZero
+        private Integer bring8phasCd;
+
+        @Builder
+        public TbScSgnlCtlrUpdReq(Integer sgnl_ixr_nmbr, Double x_crdn, Double y_crdn, Integer aring_1phas_cd, Integer aring_2phas_cd, Integer aring_3phas_cd, Integer aring_4phas_cd, Integer aring_5phas_cd, Integer aring_6phas_cd, Integer aring_7phas_cd, Integer aring_8phas_cd, Integer bring_1phas_cd, Integer bring_2phas_cd, Integer bring_3phas_cd, Integer bring_4phas_cd, Integer bring_5phas_cd, Integer bring_6phas_cd, Integer bring_7phas_cd, Integer bring_8phas_cd) {
+            this.sgnlIxrNmbr = sgnl_ixr_nmbr;
+            this.xCrdn = x_crdn;
+            this.yCrdn = y_crdn;
+            this.aring1phasCd = aring_1phas_cd;
+            this.aring2phasCd = aring_2phas_cd;
+            this.aring3phasCd = aring_3phas_cd;
+            this.aring4phasCd = aring_4phas_cd;
+            this.aring5phasCd = aring_5phas_cd;
+            this.aring6phasCd = aring_6phas_cd;
+            this.aring7phasCd = aring_7phas_cd;
+            this.aring8phasCd = aring_8phas_cd;
+            this.bring1phasCd = bring_1phas_cd;
+            this.bring2phasCd = bring_2phas_cd;
+            this.bring3phasCd = bring_3phas_cd;
+            this.bring4phasCd = bring_4phas_cd;
+            this.bring5phasCd = bring_5phas_cd;
+            this.bring6phasCd = bring_6phas_cd;
+            this.bring7phasCd = bring_7phas_cd;
+            this.bring8phasCd = bring_8phas_cd;
+        }
+
+        public TbScSgnlCtlr toEntity() {
+            return TbScSgnlCtlr.builder()
+                    .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                    .xCrdn((long) (this.xCrdn * 1000000))
+                    .yCrdn((long) (this.yCrdn * 1000000))
+                    .aring1phasCd(this.aring1phasCd)
+                    .aring2phasCd(this.aring2phasCd)
+                    .aring3phasCd(this.aring3phasCd)
+                    .aring4phasCd(this.aring4phasCd)
+                    .aring5phasCd(this.aring5phasCd)
+                    .aring6phasCd(this.aring6phasCd)
+                    .aring7phasCd(this.aring7phasCd)
+                    .aring8phasCd(this.aring8phasCd)
+                    .bring1phasCd(this.bring1phasCd)
+                    .bring2phasCd(this.bring2phasCd)
+                    .bring3phasCd(this.bring3phasCd)
+                    .bring4phasCd(this.bring4phasCd)
+                    .bring5phasCd(this.bring5phasCd)
+                    .bring6phasCd(this.bring6phasCd)
+                    .bring7phasCd(this.bring7phasCd)
+                    .bring8phasCd(this.bring8phasCd)
+                    .build();
+        }
+
+    }
+
+}

+ 100 - 0
src/main/java/com/its/op/dto/its/scrs/TbScSgnlCtlrPhaseDto.java

@@ -0,0 +1,100 @@
+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("TbScSgnlCtlrPhaseDto(신호 제어기 현시 정보)")
+public class TbScSgnlCtlrPhaseDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @JsonProperty("sgnl_ixr_nmbr")
+    private Integer sgnlIxrNmbr;
+
+    @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("특수제어(0: 없음, 1: 점멸, 2: 소등, 3: 수동, 4: 감응)")  // Y NUMBER(2)
+    @JsonProperty("spcl_cntl")
+    private Integer spclCntl;
+
+    @ApiModelProperty("A링 1현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_1phas_cd")
+    private Integer aring1phasCd;
+
+    @ApiModelProperty("A링 2현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_2phas_cd")
+    private Integer aring2phasCd;
+
+    @ApiModelProperty("A링 3현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_3phas_cd")
+    private Integer aring3phasCd;
+
+    @ApiModelProperty("A링 4현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_4phas_cd")
+    private Integer aring4phasCd;
+
+    @ApiModelProperty("A링 5현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_5phas_cd")
+    private Integer aring5phasCd;
+
+    @ApiModelProperty("A링 6현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_6phas_cd")
+    private Integer aring6phasCd;
+
+    @ApiModelProperty("A링 7현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_7phas_cd")
+    private Integer aring7phasCd;
+
+    @ApiModelProperty("A링 8현시 코드")  // Y NUMBER(7)
+    @JsonProperty("aring_8phas_cd")
+    private Integer aring8phasCd;
+
+    @ApiModelProperty("B링 1현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_1phas_cd")
+    private Integer bring1phasCd;
+
+    @ApiModelProperty("B링 2현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_2phas_cd")
+    private Integer bring2phasCd;
+
+    @ApiModelProperty("B링 3현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_3phas_cd")
+    private Integer bring3phasCd;
+
+    @ApiModelProperty("B링 4현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_4phas_cd")
+    private Integer bring4phasCd;
+
+    @ApiModelProperty("B링 5현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_5phas_cd")
+    private Integer bring5phasCd;
+
+    @ApiModelProperty("B링 6현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_6phas_cd")
+    private Integer bring6phasCd;
+
+    @ApiModelProperty("B링 7현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_7phas_cd")
+    private Integer bring7phasCd;
+
+    @ApiModelProperty("B링 8현시 코드")  // Y NUMBER(7)
+    @JsonProperty("bring_8phas_cd")
+    private Integer bring8phasCd;
+
+}

+ 326 - 0
src/main/java/com/its/op/dto/its/scrs/TbScSgnlIxrSttsDto.java

@@ -0,0 +1,326 @@
+package com.its.op.dto.its.scrs;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.scrs.TbScSgnlIxrStts;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * 신호 교차로 상태 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbScSgnlIxrSttsDto(신호 교차로 상태)")
+public class TbScSgnlIxrSttsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @JsonProperty("sgnl_ixr_nmbr")
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("LC 카운트")  // Y NUMBER(3)
+    @JsonProperty("lc_cnt")
+    private Integer lcCnt;
+
+    @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("특수제어(0: 없음, 1: 점멸, 2: 소등, 3: 수동, 4: 감응)")  // Y NUMBER(2)
+    @JsonProperty("spcl_cntl")
+    private Integer spclCntl;
+
+    @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;
+
+    @ApiModelProperty("현재 A링 현시")  // Y NUMBER(1)
+    @JsonProperty("prst_aring_phas")
+    private Integer prstAringPhas;
+
+    @ApiModelProperty("현재 B링 현시")  // Y NUMBER(1)
+    @JsonProperty("prst_bring_phas")
+    private Integer prstBringPhas;
+
+    @ApiModelProperty("함체 상태")  // Y NUMBER(1)
+    @JsonProperty("cbox_stts")
+    private Integer cboxStts;
+
+    // Code Description Field
+    @ApiModel("TbScSgnlIxrSttsUpdReq(신호 교차로 상태 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbScSgnlIxrSttsUpdReq {
+
+        @ApiModelProperty("신호 교차로 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("sgnl_ixr_nmbr")
+        @PositiveOrZero
+        private Integer sgnlIxrNmbr;
+
+        @ApiModelProperty("LC 카운트, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("lc_cnt")
+        @PositiveOrZero
+        private Integer lcCnt;
+
+        @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("특수제어(0: 없음, 1: 점멸, 2: 소등, 3: 수동, 4: 감응), Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
+        @JsonProperty("spcl_cntl")
+        @PositiveOrZero
+        private Integer spclCntl;
+
+        @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;
+
+        @ApiModelProperty("현재 A링 현시, Nullable = Y, NUMBER(1)")  // Y NUMBER(1)
+        @JsonProperty("prst_aring_phas")
+        @PositiveOrZero
+        private Integer prstAringPhas;
+
+        @ApiModelProperty("현재 B링 현시, Nullable = Y, NUMBER(1)")  // Y NUMBER(1)
+        @JsonProperty("prst_bring_phas")
+        @PositiveOrZero
+        private Integer prstBringPhas;
+
+        @ApiModelProperty("함체 상태, Nullable = Y, NUMBER(1)")  // Y NUMBER(1)
+        @JsonProperty("cbox_stts")
+        @PositiveOrZero
+        private Integer cboxStts;
+
+        @Builder
+        public TbScSgnlIxrSttsUpdReq(Integer sgnl_ixr_nmbr, Integer lc_cnt, Integer cntl_mode, Integer cntl_stts, Integer spcl_cntl, 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, Integer prst_aring_phas, Integer prst_bring_phas, Integer cbox_stts) {
+            this.sgnlIxrNmbr = sgnl_ixr_nmbr;
+            this.lcCnt = lc_cnt;
+            this.cntlMode = cntl_mode;
+            this.cntlStts = cntl_stts;
+            this.spclCntl = spcl_cntl;
+            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;
+            this.prstAringPhas = prst_aring_phas;
+            this.prstBringPhas = prst_bring_phas;
+            this.cboxStts = cbox_stts;
+        }
+
+        public TbScSgnlIxrStts toEntity() {
+            return TbScSgnlIxrStts.builder()
+                    .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                    .lcCnt(this.lcCnt)
+                    .cntlMode(this.cntlMode)
+                    .cntlStts(this.cntlStts)
+                    .spclCntl(this.spclCntl)
+                    .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)
+                    .prstAringPhas(this.prstAringPhas)
+                    .prstBringPhas(this.prstBringPhas)
+                    .cboxStts(this.cboxStts)
+                    .build();
+        }
+
+    }
+
+}

+ 37 - 0
src/main/java/com/its/op/entity/its/cctv/TbCctvCtrlHs.java

@@ -78,6 +78,43 @@ public class TbCctvCtrlHs implements Serializable {
             dto.setCctvNm("?");
         }
 
+        // 제어유형(0: SW 리셋, 1: HW 리셋, 2: 가변문자삭제, 3: 가변문자설정, 4: 파리미터설정, 5: 프리셋제어)
+        if ("0".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("SW 리셋");
+        }
+        else if ("1".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("HW 리셋");
+        }
+        else if ("2".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("가변문자삭제");
+        }
+        else if ("3".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("가변문자설정");
+        }
+        else if ("4".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("파리미터설정");
+        }
+        else if ("5".equals(this.ctrlType)) {
+            dto.setCtrlTypeDesc("프리셋제어");
+        }
+        else {
+            dto.setCtrlTypeDesc(this.ctrlType);
+        }
+
+        switch(this.ctrlResult) {
+            case 0: dto.setCtrlResultDesc("성공"); break;
+            case 1: dto.setCtrlResultDesc("실패-알수없는 CCTV 제어기"); break;
+            case 2: dto.setCtrlResultDesc("실패-CCTV 통신 OffLine"); break;
+            case 3: dto.setCtrlResultDesc("실패-명령값 오류"); break;
+            case 4: dto.setCtrlResultDesc("실패-명령 전송 통신 오류"); break;
+            case 5: dto.setCtrlResultDesc("실패-통신 타임아웃"); break;
+            case 6: dto.setCtrlResultDesc("실패-명령 전송 기타 오류"); break;
+            case 9: dto.setCtrlResultDesc("실패-명령결과 수신 오류"); break;
+            case 10: dto.setCtrlResultDesc("실패-명령 전송 요청 오류"); break;
+            case 11: dto.setCtrlResultDesc("실패-명령결과 파싱 오류"); break;
+            default:dto.setCtrlResultDesc(String.valueOf(this.ctrlResult)); break;
+        }
+
         return dto;
     }
 

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

@@ -0,0 +1,204 @@
+package com.its.op.entity.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlCtlrDto;
+import com.its.op.dto.its.scrs.TbScSgnlCtlrPhaseDto;
+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_SC_SGNL_CTLR")
+public class TbScSgnlCtlr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @Id
+    @Column(name = "SGNL_IXR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 4)
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(10)
+    @Column(name = "X_CRDN", columnDefinition = "NUMBER", length = 10)
+    private Long xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10)
+    @Column(name = "Y_CRDN", columnDefinition = "NUMBER", length = 10)
+    private Long yCrdn;
+
+    @ApiModelProperty("A링 1현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_1PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring1phasCd;
+
+    @ApiModelProperty("A링 2현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_2PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring2phasCd;
+
+    @ApiModelProperty("A링 3현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_3PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring3phasCd;
+
+    @ApiModelProperty("A링 4현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_4PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring4phasCd;
+
+    @ApiModelProperty("A링 5현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_5PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring5phasCd;
+
+    @ApiModelProperty("A링 6현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_6PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring6phasCd;
+
+    @ApiModelProperty("A링 7현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_7PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring7phasCd;
+
+    @ApiModelProperty("A링 8현시 코드")  // Y NUMBER(7)
+    @Column(name = "ARING_8PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer aring8phasCd;
+
+    @ApiModelProperty("B링 1현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_1PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring1phasCd;
+
+    @ApiModelProperty("B링 2현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_2PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring2phasCd;
+
+    @ApiModelProperty("B링 3현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_3PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring3phasCd;
+
+    @ApiModelProperty("B링 4현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_4PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring4phasCd;
+
+    @ApiModelProperty("B링 5현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_5PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring5phasCd;
+
+    @ApiModelProperty("B링 6현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_6PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring6phasCd;
+
+    @ApiModelProperty("B링 7현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_7PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring7phasCd;
+
+    @ApiModelProperty("B링 8현시 코드")  // Y NUMBER(7)
+    @Column(name = "BRING_8PHAS_CD", columnDefinition = "NUMBER", length = 7)
+    private Integer bring8phasCd;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="SGNL_IXR_NMBR", referencedColumnName = "SGNL_IXR_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbScSgnlIxrStts stts;
+
+    public TbScSgnlCtlrDto toDto() {
+        String xCrdn = String.format("%09d", this.xCrdn);
+        String yCrdn = String.format("%09d", this.yCrdn);
+        Double x_crdn = (Integer.parseInt(xCrdn) / 1000000.);
+        Double y_crdn = (Integer.parseInt(yCrdn) / 1000000.);
+        return TbScSgnlCtlrDto.builder()
+                .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                .xCrdn(x_crdn)
+                .yCrdn(y_crdn)
+                .aring1phasCd(this.aring1phasCd)
+                .aring2phasCd(this.aring2phasCd)
+                .aring3phasCd(this.aring3phasCd)
+                .aring4phasCd(this.aring4phasCd)
+                .aring5phasCd(this.aring5phasCd)
+                .aring6phasCd(this.aring6phasCd)
+                .aring7phasCd(this.aring7phasCd)
+                .aring8phasCd(this.aring8phasCd)
+                .bring1phasCd(this.bring1phasCd)
+                .bring2phasCd(this.bring2phasCd)
+                .bring3phasCd(this.bring3phasCd)
+                .bring4phasCd(this.bring4phasCd)
+                .bring5phasCd(this.bring5phasCd)
+                .bring6phasCd(this.bring6phasCd)
+                .bring7phasCd(this.bring7phasCd)
+                .bring8phasCd(this.bring8phasCd)
+                .build();
+    }
+
+    public TbScSgnlCtlr(Integer sgnlIxrNmbr) {
+        this.sgnlIxrNmbr = sgnlIxrNmbr;
+    }
+
+    public void updateInfo(TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req) {
+        this.xCrdn = (long)(req.getXCrdn() * 1000000L);
+        this.yCrdn = (long)(req.getYCrdn() * 1000000L);
+        this.aring1phasCd = req.getAring1phasCd();
+        this.aring2phasCd = req.getAring2phasCd();
+        this.aring3phasCd = req.getAring3phasCd();
+        this.aring4phasCd = req.getAring4phasCd();
+        this.aring5phasCd = req.getAring5phasCd();
+        this.aring6phasCd = req.getAring6phasCd();
+        this.aring7phasCd = req.getAring7phasCd();
+        this.aring8phasCd = req.getAring8phasCd();
+        this.bring1phasCd = req.getBring1phasCd();
+        this.bring2phasCd = req.getBring2phasCd();
+        this.bring3phasCd = req.getBring3phasCd();
+        this.bring4phasCd = req.getBring4phasCd();
+        this.bring5phasCd = req.getBring5phasCd();
+        this.bring6phasCd = req.getBring6phasCd();
+        this.bring7phasCd = req.getBring7phasCd();
+        this.bring8phasCd = req.getBring8phasCd();
+    }
+
+    public TbScSgnlCtlrPhaseDto toPhaseDto() {
+        TbScSgnlCtlrPhaseDto dto = TbScSgnlCtlrPhaseDto.builder()
+                .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                .build();
+
+        if (this.stts == null) {
+            dto.setCntlStts(3); // 통신장애
+            return dto;
+        }
+
+        dto.setCntlMode(this.stts.getCntlMode());   // 제어모드(0: TRC, 1: TOD, 2: MAN)
+        dto.setCntlStts(this.stts.getCntlStts());   // 제어상태(0: 온라인, 1: 오프라인, 2: 트랜스, 3: 통신장애)
+        dto.setSpclCntl(this.stts.getSpclCntl());   // 특수제어(0: 없음, 1: 점멸, 2: 소등, 3: 수동, 4: 감응)
+
+        int aRingPhase = -1;
+        int bRingPhase = -1;
+        switch(this.stts.getPrstAringPhas()) {
+            case 1: aRingPhase = this.aring1phasCd; break;
+            case 2: aRingPhase = this.aring2phasCd; break;
+            case 3: aRingPhase = this.aring3phasCd; break;
+            case 4: aRingPhase = this.aring4phasCd; break;
+            case 5: aRingPhase = this.aring5phasCd; break;
+            case 6: aRingPhase = this.aring6phasCd; break;
+            case 7: aRingPhase = this.aring7phasCd; break;
+            case 8: aRingPhase = this.aring8phasCd; break;
+        }
+        switch(this.stts.getPrstBringPhas()) {
+            case 1: bRingPhase = this.bring1phasCd; break;
+            case 2: bRingPhase = this.bring2phasCd; break;
+            case 3: bRingPhase = this.bring3phasCd; break;
+            case 4: bRingPhase = this.bring4phasCd; break;
+            case 5: bRingPhase = this.bring5phasCd; break;
+            case 6: bRingPhase = this.bring6phasCd; break;
+            case 7: bRingPhase = this.bring7phasCd; break;
+            case 8: bRingPhase = this.bring8phasCd; break;
+        }
+
+        return dto;
+    }
+}

+ 198 - 0
src/main/java/com/its/op/entity/its/scrs/TbScSgnlIxrStts.java

@@ -0,0 +1,198 @@
+package com.its.op.entity.its.scrs;
+
+import com.its.op.dto.its.scrs.TbScSgnlIxrSttsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 신호 교차로 상태 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("신호 교차로 상태")
+@Entity
+@Table(name = "TB_SC_SGNL_IXR_STTS")
+public class TbScSgnlIxrStts implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신호 교차로 번호")  // N NUMBER(4)
+    @Id
+    @Column(name = "SGNL_IXR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 4)
+    private Integer sgnlIxrNmbr;
+
+    @ApiModelProperty("LC 카운트")  // Y NUMBER(3)
+    @Column(name = "LC_CNT", columnDefinition = "NUMBER", length = 3)
+    private Integer lcCnt;
+
+    @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("특수제어(0: 없음, 1: 점멸, 2: 소등, 3: 수동, 4: 감응)")  // Y NUMBER(2)
+    @Column(name = "SPCL_CNTL", columnDefinition = "NUMBER", length = 2)
+    private Integer spclCntl;
+
+    @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;
+
+    @ApiModelProperty("현재 A링 현시")  // Y NUMBER(1)
+    @Column(name = "PRST_ARING_PHAS", columnDefinition = "NUMBER", length = 1)
+    private Integer prstAringPhas;
+
+    @ApiModelProperty("현재 B링 현시")  // Y NUMBER(1)
+    @Column(name = "PRST_BRING_PHAS", columnDefinition = "NUMBER", length = 1)
+    private Integer prstBringPhas;
+
+    @ApiModelProperty("함체 상태")  // Y NUMBER(1)
+    @Column(name = "CBOX_STTS", columnDefinition = "NUMBER", length = 1)
+    private Integer cboxStts;
+
+    public TbScSgnlIxrSttsDto toDto() {
+        return TbScSgnlIxrSttsDto.builder()
+                .sgnlIxrNmbr(this.sgnlIxrNmbr)
+                .lcCnt(this.lcCnt)
+                .cntlMode(this.cntlMode)
+                .cntlStts(this.cntlStts)
+                .spclCntl(this.spclCntl)
+                .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)
+                .prstAringPhas(this.prstAringPhas)
+                .prstBringPhas(this.prstBringPhas)
+                .cboxStts(this.cboxStts)
+                .build();
+    }
+
+    public TbScSgnlIxrStts(Integer sgnlIxrNmbr) {
+        this.sgnlIxrNmbr = sgnlIxrNmbr;
+    }
+
+    public void updateInfo(TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req) {
+        this.lcCnt = req.getLcCnt();
+        this.cntlMode = req.getCntlMode();
+        this.cntlStts = req.getCntlStts();
+        this.spclCntl = req.getSpclCntl();
+        this.cycl = req.getCycl();
+        this.ofst = req.getOfst();
+        this.aring1phas = req.getAring1phas();
+        this.aring2phas = req.getAring2phas();
+        this.aring3phas = req.getAring3phas();
+        this.aring4phas = req.getAring4phas();
+        this.aring5phas = req.getAring5phas();
+        this.aring6phas = req.getAring6phas();
+        this.aring7phas = req.getAring7phas();
+        this.aring8phas = req.getAring8phas();
+        this.bring1phas = req.getBring1phas();
+        this.bring2phas = req.getBring2phas();
+        this.bring3phas = req.getBring3phas();
+        this.bring4phas = req.getBring4phas();
+        this.bring5phas = req.getBring5phas();
+        this.bring6phas = req.getBring6phas();
+        this.bring7phas = req.getBring7phas();
+        this.bring8phas = req.getBring8phas();
+        this.prstAringPhas = req.getPrstAringPhas();
+        this.prstBringPhas = req.getPrstBringPhas();
+        this.cboxStts = req.getCboxStts();
+    }
+
+}

+ 381 - 29
src/main/java/com/its/op/service/its/cctv/CctvControlService.java

@@ -1,18 +1,18 @@
 package com.its.op.service.its.cctv;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.op.config.CctvServerConfig;
 import com.its.op.dao.repository.its.cctv.TbCctvCtlrRepository;
-import com.its.op.dto.its.cctv.CctvControlDto;
+import com.its.op.dao.repository.its.cctv.TbCctvCtrlHsRepository;
+import com.its.op.dto.its.cctv.*;
 import com.its.op.entity.its.cctv.TbCctvCtlr;
 import com.its.utils.SysUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
+import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
@@ -26,8 +26,10 @@ import java.util.Optional;
 public class CctvControlService {
 
     private final TbCctvCtlrRepository repo;
+    private final TbCctvCtrlHsRepository hsRepo;
     private final CctvControlZenoService zenoControl;
     private final CctvControlProbeService probeControl;
+    private final CctvServerConfig cctvServerConfig;
 
     // 데이터 1건 조회, 없으면 exception
     private TbCctvCtlr requireOne(Long id) throws NoSuchElementException {
@@ -351,19 +353,19 @@ public class CctvControlService {
      * @param req
      * @return
      */
-    public CctvControlDto.CctvControlRes controlPtz(Long id, CctvControlDto.CctvControlPtzReq req) {
-        log.info("{}", req);
-        TbCctvCtlr cctv = this.requireOne(id);
-        if (StringUtils.equals("1", cctv.getCctvTypeCd())) {
-            // 제노 CCTV
-            return this.controlPtzZeno(cctv.getCctvCtlrIp(), "root", "pass", req);
-        }
-        else if (StringUtils.equals("2", cctv.getCctvTypeCd())) {
-            // 프로브디지털
-            return this.controlPtzProbe(cctv.getCctvCtlrIp(), "admin", "12345", req);
-        }
-        return new CctvControlDto.CctvControlRes(req.getCommand(), req.getAction(), 1, "unknown cctv type");
-    }
+//    public CctvControlDto.CctvControlRes controlPtz(Long id, CctvControlDto.CctvControlPtzReq req) {
+//        log.info("{}", req);
+//        TbCctvCtlr cctv = this.requireOne(id);
+//        if (StringUtils.equals("1", cctv.getCctvTypeCd())) {
+//            // 제노 CCTV
+//            return this.controlPtzZeno(cctv.getCctvCtlrIp(), "root", "pass", req);
+//        }
+//        else if (StringUtils.equals("2", cctv.getCctvTypeCd())) {
+//            // 프로브디지털
+//            return this.controlPtzProbe(cctv.getCctvCtlrIp(), "admin", "12345", req);
+//        }
+//        return new CctvControlDto.CctvControlRes(req.getCommand(), req.getAction(), 1, "unknown cctv type");
+//    }
 
     /**
      * CCTV Preset 컨트롤
@@ -371,18 +373,368 @@ public class CctvControlService {
      * @param req
      * @return
      */
-    public CctvControlDto.CctvControlRes controlPreset(Long id, CctvControlDto.CctvControlPresetReq req) {
-        log.info("{}", req);
-        TbCctvCtlr cctv = this.requireOne(id);
-        if (StringUtils.equals("1", cctv.getCctvTypeCd())) {
-            // 제노 CCTV
-            return this.controlPresetZeno(cctv.getCctvCtlrIp(), "root", "pass", req);
+//    public CctvControlDto.CctvControlRes controlPreset(Long id, CctvControlDto.CctvControlPresetReq req) {
+//        log.info("{}", req);
+//        TbCctvCtlr cctv = this.requireOne(id);
+//        if (StringUtils.equals("1", cctv.getCctvTypeCd())) {
+//            // 제노 CCTV
+//            return this.controlPresetZeno(cctv.getCctvCtlrIp(), "root", "pass", req);
+//        }
+//        else if (StringUtils.equals("2", cctv.getCctvTypeCd())) {
+//            // 프로브디지털
+//            return this.controlPresetProbe(cctv.getCctvCtlrIp(), "admin", "12345", req);
+//        }
+//        return new CctvControlDto.CctvControlRes(req.getCommand(), req.getAction(), 1, "unknown cctv type");
+//    }
+
+    /**
+     * Http Get Request
+     * @param apiUri
+     * @return
+     */
+    public String get(String apiUri) {
+        String ipAddr = this.cctvServerConfig.getIpAddress();
+        int port = this.cctvServerConfig.getPort();
+        String apiUrl = String.format("http://%s:%d%s", ipAddr, port, apiUri);
+        //JSONObject responseJson = null;
+        String result = null;
+        HttpURLConnection conn = null;
+        try {
+            URL url = new URL(apiUrl);
+            conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(5000); //서버에 연결되는 Timeout 시간 설정
+            conn.setReadTimeout(5000); // InputStream 읽어 오는 Timeout 시간 설정
+            //TODO con.addRequestProperty("x-api-key", RestTestCommon.API_KEY); //key 값 설정
+
+            conn.setRequestMethod("GET");
+
+            // URLConnection 에 대한 doOutput 필드값을 지정된 값으로 설정한다.
+            // URL 연결은 입출력에 사용될 수 있다.
+            // URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true 로 설정하고, 그렇지 않은 경우는 false 로 설정해야 한다. 기본값은 false 이다.
+            conn.setDoOutput(false);
+
+            StringBuilder sb = new StringBuilder();
+            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
+                //Stream 을 처리해줘야 하는 귀찮음이 있음.
+                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+                String line;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line).append("\n");
+                }
+                br.close();
+                result = sb.toString();
+                //responseJson = new JSONObject(sb.toString());
+            }
+            else {
+                log.error("get: {}: {}", apiUrl, conn.getResponseMessage());
+            }
+        }
+        catch (IOException e) {
+            log.error("get: IOException error: {}", apiUrl);
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+        return result;
+    }
+
+    public CctvParamControlDto.CctvParamValueRes requestParam(Long id) {
+        log.info("requestParam: {}", id);
+        String apiUri = String.format("/api/cctv/control/param-qry/%d", id);
+        CctvParamControlDto.CctvParamValueRes result = new CctvParamControlDto.CctvParamValueRes(10, "CCTV 파라미터 요청 중 오류가 발생했습니다.");
+        String resultString = get(apiUri);
+        if (resultString != null) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                log.info("requestParam: {}", resultString);
+                result = objectMapper.readValue(resultString, CctvParamControlDto.CctvParamValueRes.class);
+            } catch (JsonProcessingException e) {
+                log.error("requestParam: result json parsing error: {}", resultString);
+                return new CctvParamControlDto.CctvParamValueRes(9, "CCTV 파라미터 요청 결과 수신 중 오류가 발생했습니다.");
+            }
+        }
+        return result;
+    }
+
+    public CctvStatusDto.CctvStatusDtoRes requestStatus(Long id) {
+        log.info("requestStatus: {}", id);
+        String apiUri = String.format("/api/cctv/control/status/%d", id);
+        CctvStatusDto.CctvStatusDtoRes result = new CctvStatusDto.CctvStatusDtoRes(10, "CCTV 상태정보 요청 중 오류가 발생했습니다.", null);
+        String resultString = get(apiUri);
+        if (resultString != null) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                log.info("requestStatus: {}", resultString);
+                result = objectMapper.readValue(resultString, CctvStatusDto.CctvStatusDtoRes.class);
+            } catch (JsonProcessingException e) {
+                log.error("requestStatus: result json parsing error: {}", resultString);
+                return new CctvStatusDto.CctvStatusDtoRes(9, "CCTV 상태정보 요청 결과 수신 중 오류가 발생했습니다.", null);
+            }
         }
-        else if (StringUtils.equals("2", cctv.getCctvTypeCd())) {
-            // 프로브디지털
-            return this.controlPresetProbe(cctv.getCctvCtlrIp(), "admin", "12345", req);
+        return result;
+    }
+
+    public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(Long id) {
+        log.info("requestPresetValue: {}", id);
+        String apiUri = String.format("/api/cctv/control/preset-value/%d", id);
+        CctvPresetControlDto.CctvPresetValueRes result = new CctvPresetControlDto.CctvPresetValueRes(10, "CCTV 카메라 현재위치 요청 중 오류가 발생했습니다.");
+        String resultString = get(apiUri);
+        if (resultString != null) {
+            ObjectMapper objectMapper = new ObjectMapper();
+            try {
+                log.info("requestPresetValue: {}", resultString);
+                result = objectMapper.readValue(resultString, CctvPresetControlDto.CctvPresetValueRes.class);
+            } catch (JsonProcessingException e) {
+                log.error("requestPresetValue: result json parsing error: {}", resultString);
+                return new CctvPresetControlDto.CctvPresetValueRes(9, "CCTV 카메라 현재위치 요청 결과 수신 중 오류가 발생했습니다.");
+            }
         }
-        return new CctvControlDto.CctvControlRes(req.getCommand(), req.getAction(), 1, "unknown cctv type");
+        return result;
     }
 
+    /**
+     * Http Post Request
+     * @param apiUri
+     * @param params
+     * @return
+     */
+    public String post(String apiUri, String params) {
+        String ipAddr = this.cctvServerConfig.getIpAddress();
+        int port = this.cctvServerConfig.getPort();
+        String apiUrl = String.format("http://%s:%d%s", ipAddr, port, apiUri);
+
+        log.info("post: {}, {}", apiUrl, params);
+        HttpURLConnection conn = null;
+        String result = null;
+        try {
+            URL url = new URL(apiUrl);
+            conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(5000); //서버에 연결되는 Timeout 시간 설정
+            conn.setReadTimeout(5000); // InputStream 읽어 오는 Timeout 시간 설정
+
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Content-Type", "application/json;utf-8");
+            conn.setRequestProperty("Accept", "application/json");
+            //conn.setRequestProperty("Connection", "keep-alive");
+            conn.setDoOutput(true);
+
+
+            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
+            // JSON 형식의 데이터 셋팅
+//            JSONObject commands = new JSONObject();
+//            JSONArray jsonArray = new JSONArray();
+
+            // JSON 형식의 데이터 셋팅 끝
+
+            // 데이터를 STRING 으로 변경
+//            Gson gson = new GsonBuilder().setPrettyPrinting().create();
+//            String jsonOutput = gson.toJson(params);
+
+            //bw.write(params.toString());
+            bw.write(params);
+            bw.flush();
+            bw.close();
+
+            // 보내고 결과값 받기
+            int responseCode = conn.getResponseCode();
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+                StringBuilder sb = new StringBuilder();
+                String line = "";
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+                result = sb.toString();
+            }
+            else {
+                log.error("post: {}: {}", apiUrl, conn.getResponseMessage());
+            }
+        }
+        catch (IOException e) {
+            log.error("post: IOException error: {}", apiUrl);
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+
+        return result;
+    }
+
+    public CctvParamControlDto.CctvParamControlRes controlParam(Long id, CctvParamControlDto.CctvParamControlReq req) {
+        log.info("controlParam: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/param-set/%d", id);
+        CctvParamControlDto.CctvParamControlRes result = new CctvParamControlDto.CctvParamControlRes(10, "CCTV 파라미터 설정 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlParam: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvParamControlDto.CctvParamControlRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlParam: result json parsing error: {}", resultString);
+                    return new CctvParamControlDto.CctvParamControlRes(9, "CCTV 파라미터 설정 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvParamControlDto.CctvParamControlRes(11, "CCTV 파라미터 설정 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+
+        String CTRL_TYPE = "4"; // 파라미터 설정
+        String CTRL_VAL = req.getFanOffTmpr() + ", " + req.getFanOffTmpr() + ", " + req.getHetrOnTmpr() + ", " + req.getHetrOffTmpr();
+        Integer CTRL_RESULT = result.getError() % 100;
+        String USER_ID = req.getUserId();
+        this.hsRepo.insertHs(SysUtils.getSysTime(), id, CTRL_TYPE, CTRL_VAL, CTRL_RESULT, USER_ID);
+
+        return result;
+    }
+
+    public CctvPtzControlDto.CctvPtzControlRes controlPtz(Long id, CctvPtzControlDto.CctvControlPtzReq req) {
+        log.info("controlPtz: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/ptz/%d", id);
+        CctvPtzControlDto.CctvPtzControlRes result = new CctvPtzControlDto.CctvPtzControlRes(req.getCommand(), req.getAction(), 10, "CCTV PTZ 제어 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlPtz: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvPtzControlDto.CctvPtzControlRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlPtz: result json parsing error: {}", resultString);
+                    return new CctvPtzControlDto.CctvPtzControlRes(req.getCommand(), req.getAction(), 9, "CCTV PTZ 제어 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvPtzControlDto.CctvPtzControlRes(req.getCommand(), req.getAction(), 11, "CCTV CCTV PTZ 제어 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+        return result;
+    }
+
+    public CctvPresetControlDto.CctvPresetControlRes controlPreset(Long id, CctvPresetControlDto.CctvPresetControlReq req) {
+        log.info("controlPreset: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/preset/%d", id);
+        CctvPresetControlDto.CctvPresetControlRes result = new CctvPresetControlDto.CctvPresetControlRes(10, "CCTV 프리셋 제어 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlPreset: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvPresetControlDto.CctvPresetControlRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlPreset: result json parsing error: {}", resultString);
+                    return new CctvPresetControlDto.CctvPresetControlRes(9, "CCTV 프리셋 제어 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvPresetControlDto.CctvPresetControlRes(11, "CCTV 프리셋 제어 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+
+        String CTRL_TYPE = "5"; // 프리셋제어
+        String CTRL_VAL = req.getPan() + ", " + req.getTilt() + ", " + req.getZoom() + ", " + req.getFocus();
+        Integer CTRL_RESULT = result.getError() % 100;
+        String USER_ID = req.getUserId();
+        this.hsRepo.insertHs(SysUtils.getSysTime(), id, CTRL_TYPE, CTRL_VAL, CTRL_RESULT, USER_ID);
+
+        return result;
+    }
+
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharSet(Long id, CctvVarCharControlDto.CctvVarCharControlSetReq req) {
+        log.info("controlVarCharSet: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/var-char-set/%d", id);
+        CctvVarCharControlDto.CctvVarCharControlRes result = new CctvVarCharControlDto.CctvVarCharControlRes(10, "CCTV 가변문자설정 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlVarCharSet: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvVarCharControlDto.CctvVarCharControlRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlVarCharSet: result json parsing error: {}", resultString);
+                    return new CctvVarCharControlDto.CctvVarCharControlRes(9, "CCTV 가변문자설정 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(11, "CCTV 가변문자설정 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+
+        String CTRL_TYPE = "3"; // 가변문자설정
+        String CTRL_VAL = String.valueOf(req.getSectorNo()) + ", " + req.getCh1Char() + ", " + req.getCh2Char();
+        Integer CTRL_RESULT = result.getError() % 100;
+        String USER_ID = req.getUserId();
+        this.hsRepo.insertHs(SysUtils.getSysTime(), id, CTRL_TYPE, CTRL_VAL, CTRL_RESULT, USER_ID);
+
+        return result;
+    }
+
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharDel(Long id, CctvVarCharControlDto.CctvVarCharControlDelReq req) {
+        log.info("controlVarCharDel: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/var-char-del/%d", id);
+        CctvVarCharControlDto.CctvVarCharControlRes result = new CctvVarCharControlDto.CctvVarCharControlRes(10, "CCTV 가변문자삭제 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlVarCharDel: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvVarCharControlDto.CctvVarCharControlRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlVarCharDel: result json parsing error: {}", resultString);
+                    return new CctvVarCharControlDto.CctvVarCharControlRes(9, "CCTV 가변문자삭제 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(11, "CCTV 가변문자삭제 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+
+        String CTRL_TYPE = "2"; // 가변문자삭제
+        String CTRL_VAL = String.valueOf(req.getSectorNo());
+        Integer CTRL_RESULT = result.getError() % 100;
+        String USER_ID = req.getUserId();
+        this.hsRepo.insertHs(SysUtils.getSysTime(), id, CTRL_TYPE, CTRL_VAL, CTRL_RESULT, USER_ID);
+
+        return result;
+    }
+
+    public CctvControlDto.CctvControlResetRes controlReset(Long id, CctvControlDto.CctvControlResetReq req) {
+        log.info("controlReset: {}, {}", id, req);
+        String apiUri = String.format("/api/cctv/control/reset/%d", id);
+        CctvControlDto.CctvControlResetRes result = new CctvControlDto.CctvControlResetRes(10, "CCTV 가변문자삭제 요청 중 오류가 발생했습니다.");
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            String params = objectMapper.writeValueAsString(req);
+            String resultString = post(apiUri, params);
+            if (resultString != null) {
+                try {
+                    log.info("controlReset: {}", resultString);
+                    result = objectMapper.readValue(resultString, CctvControlDto.CctvControlResetRes.class);
+                } catch (JsonProcessingException e) {
+                    log.error("controlReset: result json parsing error: {}", resultString);
+                    return new CctvControlDto.CctvControlResetRes(9, "CCTV RESET 요청 결과 수신 중 오류가 발생했습니다.");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            return new CctvControlDto.CctvControlResetRes(11, "CCTV RESET 요청 메시지 생성에 실패하였습니다[설정값 확인].");
+        }
+
+        String CTRL_TYPE = "0"; // SW 리셋
+        String CTRL_VAL = String.valueOf(req.getResetType());
+        Integer CTRL_RESULT = result.getError() % 100;
+        String USER_ID = req.getUserId();
+        if (1 == req.getResetType()) {
+            CTRL_TYPE = "1";    // HW 리셋
+        }
+        this.hsRepo.insertHs(SysUtils.getSysTime(), id, CTRL_TYPE, CTRL_VAL, CTRL_RESULT, USER_ID);
+
+        return result;
+    }
 }

+ 124 - 0
src/main/java/com/its/op/service/its/scrs/TbScSgnlCtlrService.java

@@ -0,0 +1,124 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.repository.its.scrs.TbScSgnlCtlrRepository;
+import com.its.op.dto.its.scrs.TbScSgnlCtlrDto;
+import com.its.op.dto.its.scrs.TbScSgnlCtlrPhaseDto;
+import com.its.op.entity.its.scrs.TbScSgnlCtlr;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbScSgnlCtlrService {
+
+    private final TbScSgnlCtlrRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbScSgnlCtlr requireOne(Integer sgnlIxrNmbr) throws NoSuchElementException {
+        Optional<TbScSgnlCtlr> info = this.repo.findById(sgnlIxrNmbr);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + sgnlIxrNmbr);
+        }
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbScSgnlCtlrDto> findAll() {
+        List<TbScSgnlCtlrDto> result = new ArrayList<>();
+        List<TbScSgnlCtlr> data = this.repo.findAll();
+        for (TbScSgnlCtlr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbScSgnlCtlrDto> findAllList() {
+        List<TbScSgnlCtlrDto> result = new ArrayList<>();
+        List<TbScSgnlCtlr> data = this.repo.findAllList();
+        for (TbScSgnlCtlr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbScSgnlCtlrDto findById(Integer sgnlIxrNmbr) {
+        TbScSgnlCtlr entity = requireOne(sgnlIxrNmbr);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbScSgnlCtlrDto updateById(Integer sgnlIxrNmbr, TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req) {
+        TbScSgnlCtlr entity = requireOne(sgnlIxrNmbr);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbScSgnlCtlrDto> mergeInfoList(List<TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq> reqList) {
+        List<TbScSgnlCtlrDto> result = new ArrayList<>();
+        for (TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req : reqList) {
+            TbScSgnlCtlr obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbScSgnlCtlrDto mergeInfo(TbScSgnlCtlrDto.TbScSgnlCtlrUpdReq req) {
+        TbScSgnlCtlr obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbScSgnlCtlrDto deleteById(Integer sgnlIxrNmbr) {
+        TbScSgnlCtlr entity = requireOne(sgnlIxrNmbr);
+        this.repo.deleteById(sgnlIxrNmbr);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbScSgnlCtlrDto> deleteByIds(List<Integer> ids) {
+        List<TbScSgnlCtlrDto> result = new ArrayList<>();
+        for (Integer id : ids) {
+            Optional<TbScSgnlCtlr> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+    @Transactional(readOnly = true)
+    public List<TbScSgnlCtlrPhaseDto> findAllPhaseList() {
+        List<TbScSgnlCtlrPhaseDto> result = new ArrayList<>();
+        List<TbScSgnlCtlr> data = this.repo.findAllList();
+        for (TbScSgnlCtlr entity : data) {
+            result.add(entity.toPhaseDto());
+        }
+        return result;
+    }
+}

+ 114 - 0
src/main/java/com/its/op/service/its/scrs/TbScSgnlIxrSttsService.java

@@ -0,0 +1,114 @@
+package com.its.op.service.its.scrs;
+
+import com.its.op.dao.repository.its.scrs.TbScSgnlIxrSttsRepository;
+import com.its.op.dto.its.scrs.TbScSgnlIxrSttsDto;
+import com.its.op.entity.its.scrs.TbScSgnlIxrStts;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbScSgnlIxrSttsService {
+
+    private final TbScSgnlIxrSttsRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbScSgnlIxrStts requireOne(Integer sgnlIxrNmbr) throws NoSuchElementException {
+        Optional<TbScSgnlIxrStts> info = this.repo.findById(sgnlIxrNmbr);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + sgnlIxrNmbr);
+        }
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbScSgnlIxrSttsDto> findAll() {
+        List<TbScSgnlIxrSttsDto> result = new ArrayList<>();
+        List<TbScSgnlIxrStts> data = this.repo.findAll();
+        for (TbScSgnlIxrStts entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbScSgnlIxrSttsDto> findAllList() {
+        List<TbScSgnlIxrSttsDto> result = new ArrayList<>();
+        List<TbScSgnlIxrStts> data = this.repo.findAllList();
+        for (TbScSgnlIxrStts entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbScSgnlIxrSttsDto findById(Integer sgnlIxrNmbr) {
+        TbScSgnlIxrStts entity = requireOne(sgnlIxrNmbr);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbScSgnlIxrSttsDto updateById(Integer sgnlIxrNmbr, TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req) {
+        TbScSgnlIxrStts entity = requireOne(sgnlIxrNmbr);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbScSgnlIxrSttsDto> mergeInfoList(List<TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq> reqList) {
+        List<TbScSgnlIxrSttsDto> result = new ArrayList<>();
+        for (TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req : reqList) {
+            TbScSgnlIxrStts obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbScSgnlIxrSttsDto mergeInfo(TbScSgnlIxrSttsDto.TbScSgnlIxrSttsUpdReq req) {
+        TbScSgnlIxrStts obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbScSgnlIxrSttsDto deleteById(Integer sgnlIxrNmbr) {
+        TbScSgnlIxrStts entity = requireOne(sgnlIxrNmbr);
+        this.repo.deleteById(sgnlIxrNmbr);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbScSgnlIxrSttsDto> deleteByIds(List<Integer> ids) {
+        List<TbScSgnlIxrSttsDto> result = new ArrayList<>();
+        for (Integer id : ids) {
+            Optional<TbScSgnlIxrStts> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+}

+ 1 - 3
src/main/resources/application-dev.yml → src/main/resources/application-dev.ymlx

@@ -1,7 +1,7 @@
 spring:
   devtools:
     livereload:
-      enabled: false
+      enabled: true
   freemarker:
     cache: false
   datasource:
@@ -10,8 +10,6 @@ spring:
       jdbc-url: jdbc:oracle:thin:@115.91.94.42:1522:HANTE19C
       username: ptatms
       password: ptatms
-#      username: ENC(JMlDMLqAr4U=)
-#      password: ENC(JMlDMLqAr4U=)
       connection-test-query: SELECT 1 FROM DUAL
       minimumIdle: 5
       maximumIdle: 10

+ 0 - 23
src/main/resources/application-prod.yml

@@ -1,23 +0,0 @@
-spring:
-  devtools:
-    livereload:
-      enabled: true
-  freemarker:
-    cache: false
-  datasource:
-    hikari:
-      driver-class-name: oracle.jdbc.OracleDriver
-      jdbc-url: jdbc:oracle:thin:@172.19.10.11:1521:ptatms
-      username: ENC(JMlDMLqAr4U=)
-      password: ENC(JMlDMLqAr4U=)
-      connection-test-query: SELECT 1 FROM DUAL
-      minimumIdle: 5
-      maximumIdle: 10
-      #maximumPoolSize: 20
-      idleTimeout: 30000
-      connectTimeout: 10000
-  jpa:
-    database-platform: org.hibernate.dialect.Oracle10gDialect
-    properties:
-      hibernate:
-        dialect: org.hibernate.dialect.Oracle10gDialect

+ 24 - 0
src/main/resources/application-prod.ymlx

@@ -0,0 +1,24 @@
+spring:
+  devtools:
+    livereload:
+      enabled: true
+  freemarker:
+    cache: false
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      #jdbc-url: jdbc:oracle:thin:@172.19.10.25:1521:ptatms
+      jdbc-url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.25)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.26)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ptatms)))
+      username: ptatms
+      password: ptatms
+      connection-test-query: SELECT 1 FROM DUAL
+      minimumIdle: 5
+      maximumIdle: 10
+      #maximumPoolSize: 20
+      idleTimeout: 30000
+      connectTimeout: 10000
+  jpa:
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.Oracle12cDialect

+ 70 - 13
src/main/resources/application.yml

@@ -36,10 +36,16 @@ server:
     static-locations: file:src/main/resources/static/
 
 spring:
+  profiles:
+    active: prod
+  main:
+    banner-mode: off
+  application:
+    name: its-op-server
+
   output:
     ansi:
       enabled: always
-
   servlet:
     context-path: /
     session:
@@ -51,12 +57,6 @@ spring:
 #      max-file-size: 200MB
 #      max-request-size: 215MB
 
-  profiles:
-    active: prod
-  main:
-    banner-mode: off
-  application:
-    name: its-op-server
   jackson:
     property-naming-strategy: LOWER_CASE
   datasource:
@@ -101,9 +101,66 @@ logging:
             sql:
               BasicBinder: ERROR
 
-#jasypt:
-#  encryptor:
-#    bean: jasyptStringEncryptor
-#    property:
-#      prefix: ENC(
-#      suffix: )
+---
+spring:
+  config:
+    activate:
+      on-profile: dev
+  devtools:
+    livereload:
+      enabled: true
+  freemarker:
+    cache: false
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      jdbc-url: jdbc:oracle:thin:@115.91.94.42:1522:HANTE19C
+      username: ptatms
+      password: ptatms
+      connection-test-query: SELECT 1 FROM DUAL
+      minimumIdle: 5
+      maximumIdle: 10
+      maximumPoolSize: 20
+      idleTimeout: 30000
+      connectTimeout: 10000
+  jpa:
+    database: oracle
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+    #org.hibernate.dialect.Oracle10gDialect
+    #org.hibernate.dialect.Oracle12cDialect
+    hibernate:
+      ddl-auto: none
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.Oracle12cDialect
+
+
+---
+spring:
+  config:
+    activate:
+      on-profile: prod
+  devtools:
+    livereload:
+      enabled: true
+  freemarker:
+    cache: false
+  datasource:
+    hikari:
+      driver-class-name: oracle.jdbc.OracleDriver
+      #jdbc-url: jdbc:oracle:thin:@172.19.10.25:1521:ptatms
+      jdbc-url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.25)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=172.19.10.26)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ptatms)))
+      username: ptatms
+      password: ptatms
+      connection-test-query: SELECT 1 FROM DUAL
+      minimumIdle: 5
+      maximumIdle: 10
+      #maximumPoolSize: 20
+      idleTimeout: 30000
+      connectTimeout: 10000
+  jpa:
+    database-platform: org.hibernate.dialect.Oracle12cDialect
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.Oracle12cDialect
+