Bladeren bron

vms form edit and cctv pset schedule modify

shjung 3 jaren geleden
bovenliggende
commit
c9a6c0ffa3
19 gewijzigde bestanden met toevoegingen van 797 en 112 verwijderingen
  1. 47 0
      src/main/java/com/its/api/its/controller/cctv/TbCctvPsetCtrlScnrController.java
  2. 4 6
      src/main/java/com/its/api/its/controller/cctv/TbCctvScnrController.java
  3. 27 11
      src/main/java/com/its/api/its/controller/vms/TbVmsFormController.java
  4. 4 2
      src/main/java/com/its/api/its/model/dto/cctv/CctvControlDto.java
  5. 150 0
      src/main/java/com/its/api/its/model/dto/cctv/TbCctvPsetCtrlScnrDto.java
  6. 28 0
      src/main/java/com/its/api/its/model/dto/vms/TbVmsFormDetlDto.java
  7. 89 0
      src/main/java/com/its/api/its/model/entity/cctv/TbCctvPsetCtrlScnr.java
  8. 28 0
      src/main/java/com/its/api/its/model/entity/cctv/TbCctvPsetCtrlScnrKey.java
  9. 14 1
      src/main/java/com/its/api/its/model/entity/vms/TbVmsForm.java
  10. 88 0
      src/main/java/com/its/api/its/model/entity/vms/TbVmsFormSimple.java
  11. 41 0
      src/main/java/com/its/api/its/repository/cctv/TbCctvPsetCtrlScnrRepository.java
  12. 1 0
      src/main/java/com/its/api/its/repository/vms/TbVmsFormRepository.java
  13. 3 2
      src/main/java/com/its/api/its/service/cctv/CctvControlService.java
  14. 142 0
      src/main/java/com/its/api/its/service/cctv/TbCctvPsetCtrlScnrService.java
  15. 1 2
      src/main/java/com/its/api/its/service/cctv/TbCctvScnrService.java
  16. 33 6
      src/main/java/com/its/api/its/service/vms/TbVmsFormService.java
  17. 2 2
      src/main/java/com/its/api/scheduler/ItsApiScheduler.java
  18. 95 0
      src/main/java/com/its/api/scheduler/job/CctvPsetCtrlScnrJobThread.java
  19. 0 80
      src/main/java/com/its/api/scheduler/job/CctvPsetScnrJobThread.java

+ 47 - 0
src/main/java/com/its/api/its/controller/cctv/TbCctvPsetCtrlScnrController.java

@@ -0,0 +1,47 @@
+package com.its.api.its.controller.cctv;
+
+import com.its.api.its.model.dto.cctv.TbCctvPsetCtrlScnrDto;
+import com.its.api.its.service.cctv.TbCctvPsetCtrlScnrService;
+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 = "11.CCTV-6.CCTV 프리셋 제어 스케줄 관리")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/cctv/pset_ctrl_scnr")
+public class TbCctvPsetCtrlScnrController {
+
+    private final TbCctvPsetCtrlScnrService service;
+
+    @ApiOperation(value = "CCTV 프리셋 제어 시나리오 전체조회(TB_CCTV_PSET_CTRL_SCNR)", response = TbCctvPsetCtrlScnrDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbCctvPsetCtrlScnrDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "CCTV 프리셋 제어 시나리오 CCTV 개별조회(TB_CCTV_PSET_CTRL_SCNR)", response = TbCctvPsetCtrlScnrDto.class)
+    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public List<TbCctvPsetCtrlScnrDto> findById(@PathVariable final Long id) {
+        return this.service.findByIdList(id);
+    }
+
+    @ApiOperation(value = "CCTV 프리셋 제어 시나리오 정보변경/생성-목록(TB_CCTV_PSET_CTRL_SCNR)", response = TbCctvPsetCtrlScnrDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbCctvPsetCtrlScnrDto> mergeInfoList(@RequestBody @Valid final List<TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "CCTV 프리셋 제어 시나리오 정보삭제-목록(TB_CCTV_PSET_CTRL_SCNR)", response = TbCctvPsetCtrlScnrDto.class, responseContainer = "ArrayList")
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbCctvPsetCtrlScnrDto> deleteDataByIds(@RequestBody @Valid final List<TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrDelReq> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 4 - 6
src/main/java/com/its/api/its/controller/cctv/TbCctvScnrController.java

@@ -3,20 +3,18 @@ package com.its.api.its.controller.cctv;
 import com.its.api.its.model.dto.cctv.TbCctvScnrDto;
 import com.its.api.its.model.entity.cctv.TbCctvScnrKey;
 import com.its.api.its.service.cctv.TbCctvScnrService;
-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 = "11.CCTV-6.CCTV 프리셋 제어 스케줄 관리")
-@Validated
-@RestController
+//@Api(tags = "11.CCTV-6.CCTV 프리셋 제어 스케줄 관리")
+//@Validated
+//@RestController
 @RequiredArgsConstructor
-@RequestMapping("/api/cctv/pset-scnr")
+//@RequestMapping("/api/cctv/pset-scnr")
 public class TbCctvScnrController {
 
     private final TbCctvScnrService service;

+ 27 - 11
src/main/java/com/its/api/its/controller/vms/TbVmsFormController.java

@@ -1,11 +1,13 @@
 package com.its.api.its.controller.vms;
 
+import com.its.api.its.model.dto.common.NewIdIntegerDto;
+import com.its.api.its.model.dto.vms.TbVmsFormDetlDto;
 import com.its.api.its.model.dto.vms.TbVmsFormDto;
 import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
-import com.its.api.its.model.dto.common.NewIdIntegerDto;
 import com.its.api.its.service.vms.TbVmsFormService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -28,6 +30,15 @@ public class TbVmsFormController {
         return service.findAll();
     }
 
+    @ApiOperation(value = "VMS FORM 유형별 조회(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/form/{type}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsFormDto> findAllByType(
+            @ApiParam(name = "type", value = "VMS 크기유형", example = "VMP2", required = true)
+            @PathVariable final String type
+    ) {
+        return service.findAllByType(type);
+    }
+
     @ApiOperation(value = "VMS FORM 개별조회(TB_VMS_FORM)", response = TbVmsFormDto.class)
     @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsFormDto findById(@PathVariable final Integer id) {
@@ -39,6 +50,11 @@ public class TbVmsFormController {
     public List<TbVmsFormObjectDetlDto> findByVmsFormObject(@PathVariable final Integer id) {
         return this.service.findByVmsFormObject(id);
     }
+    @ApiOperation(value = "VMS FORM 객체 목록 상세 조회(TB_VMS_FORM)", response = TbVmsFormDetlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/form/detail/{id}", produces = {"application/json; charset=utf8"})
+    public TbVmsFormDetlDto findByVmsFormObjectDetail(@PathVariable final Integer id) {
+        return this.service.findByVmsFormObjectDetail(id);
+    }
 
     @ApiOperation(value = "VMS FORM 정보변경(TB_VMS_FORM)", response = TbVmsFormDto.class)
     @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
@@ -46,11 +62,11 @@ public class TbVmsFormController {
         return this.service.updateById(id, req);
     }
 
-    @ApiOperation(value = "VMS FORM 정보변경/생성-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
-    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-    public List<TbVmsFormDto> mergeInfoList(@RequestBody @Valid final List<TbVmsFormDto.TbVmsFormUpdReq> listReq) {
-        return this.service.mergeInfoList(listReq);
-    }
+//    @ApiOperation(value = "VMS FORM 정보변경/생성-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
+//    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+//    public List<TbVmsFormDto> mergeInfoList(@RequestBody @Valid final List<TbVmsFormDto.TbVmsFormUpdReq> listReq) {
+//        return this.service.mergeInfoList(listReq);
+//    }
 
     @ApiOperation(value = "VMS FORM 정보변경/생성-개별(TB_VMS_FORM)", response = TbVmsFormDto.class)
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
@@ -64,11 +80,11 @@ public class TbVmsFormController {
         return this.service.deleteById(id);
     }
 
-    @ApiOperation(value = "VMS FORM 정보삭제-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
-    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
-    public List<TbVmsFormDto> deleteDataByIds(@RequestBody @Valid final List<Integer> ids) {
-        return this.service.deleteByIds(ids);
-    }
+//    @ApiOperation(value = "VMS FORM 정보삭제-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
+//    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+//    public List<TbVmsFormDto> deleteDataByIds(@RequestBody @Valid final List<Integer> ids) {
+//        return this.service.deleteByIds(ids);
+//    }
 
     @ApiOperation(value = "신규 VMS FORM ID 조회(TB_VMS_FORM)", response = NewIdIntegerDto.class)
     @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})

+ 4 - 2
src/main/java/com/its/api/its/model/dto/cctv/CctvControlDto.java

@@ -89,11 +89,13 @@ public class CctvControlDto implements Serializable {
         private String userId;
 
         @Builder
-        public CctvControlPresetReq(String command, String action, Integer speed, String user_id) {
+        public CctvControlPresetReq(String command, String action, Integer no, Integer speed, Integer time, String userId) {
             this.command = command;
             this.action = action;
+            this.no = no;
             this.speed = speed;
-            this.userId = user_id;
+            this.time = time;
+            this.userId = userId;
         }
     }
     @ApiModel("CctvControlRes(CCTV Control 응답)")

+ 150 - 0
src/main/java/com/its/api/its/model/dto/cctv/TbCctvPsetCtrlScnrDto.java

@@ -0,0 +1,150 @@
+package com.its.api.its.model.dto.cctv;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnr;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnrKey;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * CCTV 프리셋 제어 시나리오 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbCctvPsetCtrlScnrDto(CCTV 프리셋 제어 시나리오)")
+public class TbCctvPsetCtrlScnrDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("CCTV 관리 번호")  // N NUMBER(10)
+    @JsonProperty("cctv_mngm_nmbr")
+    private Long cctvMngmNmbr;
+
+    @ApiModelProperty("프리셋 번호")  // N VARCHAR(3)
+    @JsonProperty("pset_nmbr")
+    private String psetNmbr;
+
+    @ApiModelProperty("제어 스케쥴 시각(HH24MI)")  // N VARCHAR(4)
+    @JsonProperty("schd_hm")
+    private String schdHm;
+
+    @ApiModelProperty("사용여부(Y:시용,N:사용안함)")  // N CHAR(1)
+    @JsonProperty("use_yn")
+    private String useYn;
+
+    @ApiModelProperty("시나리오수행시각")  // Y VARCHAR(14)
+    @JsonProperty("ctrl_dt")
+    private String ctrlDt;
+
+    @ApiModelProperty("시나리오수행결과(Y:성공, N:실패)")  // Y CHAR(1)
+    @JsonProperty("ctrl_res_yn")
+    private String ctrlResYn;
+
+    // Code Description Field
+//    @ApiModelProperty("사용여부(Y:시용,N:사용안함) 설명")
+//    @JsonProperty("use_desc")    // USE_YN
+//    private String useDesc;
+//
+//    @ApiModelProperty("시나리오수행결과(Y:성공, N:실패) 설명")
+//    @JsonProperty("ctrl_res_desc")    // CTRL_RES_YN
+//    private String ctrlResDesc;
+
+    @ApiModel("TbCctvPsetCtrlScnrUpdReq(CCTV 프리셋 제어 시나리오 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbCctvPsetCtrlScnrUpdReq {
+
+        @ApiModelProperty("CCTV 관리 번호")
+        @JsonProperty("cctv_mngm_nmbr")
+        @Positive
+        private Long cctvMngmNmbr;
+
+        @ApiModelProperty("이전 프리셋 번호, 업데이트시 이전데이터")
+        @JsonProperty("old_pset_nmbr")
+        @Size(min=1, max=3)
+        private String oldPsetNmbr;
+
+        @ApiModelProperty("이전 제어 스케쥴 시각(HH24MI), 업데이트시 이전데이터")
+        @JsonProperty("old_schd_hm")
+        @Size(min=1, max=4)
+        private String oldSchdHm;
+
+        @ApiModelProperty("프리셋 번호, Nullable = N, VARCHAR(3)")
+        @JsonProperty("pset_nmbr")
+        @Size(min=1, max=3)
+        private String psetNmbr;
+
+        @ApiModelProperty("제어 스케쥴 시각(HH24MI)")
+        @JsonProperty("schd_hm")
+        @Size(min=1, max=4)
+        private String schdHm;
+
+        @ApiModelProperty("사용여부(Y:시용,N:사용안함), Nullable = N, CHAR(1)")  // N CHAR(1)
+        @JsonProperty("use_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String useYn;
+
+        @Builder
+        public TbCctvPsetCtrlScnrUpdReq(Long cctv_mngm_nmbr, String old_pset_nmbr, String old_schd_hm, String pset_nmbr, String schd_hm, String use_yn) {
+            this.cctvMngmNmbr = cctv_mngm_nmbr;
+            this.oldPsetNmbr = old_pset_nmbr;
+            this.oldSchdHm = old_schd_hm;
+            this.psetNmbr = pset_nmbr;
+            this.schdHm = schd_hm;
+            this.useYn = use_yn;
+        }
+
+        public TbCctvPsetCtrlScnr toEntity() {
+            return TbCctvPsetCtrlScnr.builder()
+                    .cctvMngmNmbr(this.cctvMngmNmbr)
+                    .psetNmbr(this.psetNmbr)
+                    .schdHm(this.schdHm)
+                    .useYn(this.useYn)
+                    .build();
+        }
+
+    }
+
+    @ApiModel("TbCctvPsetCtrlScnrDelReq(CCTV 프리셋 제어 시나리오 정보삭제)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbCctvPsetCtrlScnrDelReq {
+
+        @ApiModelProperty("CCTV 관리 번호")
+        @JsonProperty("cctv_mngm_nmbr")
+        @Positive
+        private Long cctvMngmNmbr;
+
+        @ApiModelProperty("프리셋 번호, Nullable = N, VARCHAR(3)")
+        @JsonProperty("pset_nmbr")
+        @Size(min=1, max=3)
+        private String psetNmbr;
+
+        @ApiModelProperty("제어 스케쥴 시각(HH24MI)")
+        @JsonProperty("schd_hm")
+        @Size(min=1, max=4)
+        private String schdHm;
+
+        @Builder
+        public TbCctvPsetCtrlScnrDelReq(Long cctv_mngm_nmbr, String pset_nmbr, String schd_hm) {
+            this.cctvMngmNmbr = cctv_mngm_nmbr;
+            this.psetNmbr = pset_nmbr;
+            this.schdHm = schd_hm;
+        }
+
+        public TbCctvPsetCtrlScnrKey toEntityKey() {
+            return new TbCctvPsetCtrlScnrKey(this.cctvMngmNmbr, this.psetNmbr, this.schdHm);
+        }
+
+    }
+}

+ 28 - 0
src/main/java/com/its/api/its/model/dto/vms/TbVmsFormDetlDto.java

@@ -0,0 +1,28 @@
+package com.its.api.its.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * VMS FORM DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsFormDetlDto(VMS FORM 상세 정보)")
+public class TbVmsFormDetlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("FORM 정보")
+    @JsonProperty("form")
+    private TbVmsFormDto form;
+
+    @ApiModelProperty("FORM 객체 목록")
+    @JsonProperty("objects")
+    private List<TbVmsFormObjectDetlDto> objects;
+}

+ 89 - 0
src/main/java/com/its/api/its/model/entity/cctv/TbCctvPsetCtrlScnr.java

@@ -0,0 +1,89 @@
+package com.its.api.its.model.entity.cctv;
+
+import com.its.api.its.model.dto.cctv.TbCctvPsetCtrlScnrDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * CCTV 프리셋 제어 시나리오 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("CCTV 프리셋 제어 시나리오")
+@Entity
+@Table(name = "TB_CCTV_PSET_CTRL_SCNR")
+@IdClass(TbCctvPsetCtrlScnrKey.class)
+public class TbCctvPsetCtrlScnr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("CCTV 관리 번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "CCTV_MNGM_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long cctvMngmNmbr;
+
+    @ApiModelProperty("프리셋 번호")  // N VARCHAR(3)
+    @Id
+    @Column(name = "PSET_NMBR", nullable = false, length = 3)
+    private String psetNmbr;
+
+    @ApiModelProperty("제어 스케쥴 시각(HH24MI)")  // N VARCHAR(4)
+    @Id
+    @Column(name = "SCHD_HM", nullable = false, length = 4)
+    private String schdHm;
+
+    @ApiModelProperty("사용여부(Y:시용,N:사용안함)")  // N CHAR(1)
+    @Column(name = "USE_YN", nullable = false, columnDefinition = "CHAR", length = 1)
+    private String useYn;
+
+    @ApiModelProperty("시나리오수행시각")  // Y VARCHAR(14)
+    @Column(name = "CTRL_DT", length = 14)
+    private String ctrlDt;
+
+    @ApiModelProperty("시나리오수행결과(Y:성공, N:실패)")  // Y CHAR(1)
+    @Column(name = "CTRL_RES_YN", columnDefinition = "CHAR", length = 1)
+    private String ctrlResYn;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="CCTV_MNGM_NMBR", referencedColumnName = "CCTV_MNGM_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbCctvCtlr cctv = new TbCctvCtlr();
+
+    @OneToOne
+    @JoinColumns( {
+            @JoinColumn(updatable=false, insertable=false, name="CCTV_MNGM_NMBR", referencedColumnName="CCTV_MNGM_NMBR"),
+            @JoinColumn(updatable=false, insertable=false, name="PSET_NMBR", referencedColumnName="PSET_NMBR")
+    })
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbCctvPset pset = new TbCctvPset();
+
+    public TbCctvPsetCtrlScnrDto toDto() {
+        return TbCctvPsetCtrlScnrDto.builder()
+                .cctvMngmNmbr(this.cctvMngmNmbr)
+                .psetNmbr(this.psetNmbr)
+                .schdHm(this.schdHm)
+                .useYn(this.useYn)
+                .ctrlDt(this.ctrlDt)
+                .ctrlResYn(this.ctrlResYn)
+                .build();
+    }
+
+    public TbCctvPsetCtrlScnr(Long cctvMngmNmbr, String psetNmbr, String schdHm) {
+        this.cctvMngmNmbr = cctvMngmNmbr;
+        this.psetNmbr = psetNmbr;
+        this.schdHm = schdHm;
+    }
+
+    public void updateInfo(TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq req) {
+        this.schdHm = req.getSchdHm();
+        this.useYn = req.getUseYn();
+    }
+
+}

+ 28 - 0
src/main/java/com/its/api/its/model/entity/cctv/TbCctvPsetCtrlScnrKey.java

@@ -0,0 +1,28 @@
+package com.its.api.its.model.entity.cctv;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * CCTV 프리셋 제어 시나리오 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbCctvPsetCtrlScnrKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // CCTV_MNGM_NMBR, CCTV 관리 번호  // N NUMBER(10)
+    private Long cctvMngmNmbr;
+
+    // PSET_NMBR, 프리셋 번호  // N VARCHAR(3)
+    private String psetNmbr;
+
+    // SCHD_HM, 제어 스케쥴 시각(HH24MI)  // N VARCHAR(4)
+    private String schdHm;
+
+}

+ 14 - 1
src/main/java/com/its/api/its/model/entity/vms/TbVmsForm.java

@@ -85,7 +85,20 @@ public class TbVmsForm implements Serializable {
                 .cctvMngmNmbr(this.cctvMngmNmbr)
                 .build();
     }
-
+    public TbVmsFormDto toDtoSimple() {
+        return TbVmsFormDto.builder()
+                .vmsFormId(this.vmsFormId)
+                .vmsTypeCd(this.vmsTypeCd)
+                .vmsFormTypeCd(this.vmsFormTypeCd)
+                .vmsFormBckgHueCd(this.vmsFormBckgHueCd)
+                .vmsFormNm(this.vmsFormNm)
+                .vmsFormExpl(this.vmsFormExpl)
+                .vmsMsgDsplDrctCd(this.vmsMsgDsplDrctCd)
+                .symbLibNmbr(this.symbLibNmbr)
+                .vmsMsgDsplMthdCd(this.vmsMsgDsplMthdCd)
+                .cctvMngmNmbr(this.cctvMngmNmbr)
+                .build();
+    }
     public TbVmsForm(Integer vmsFormId) {
         this.vmsFormId = vmsFormId;
     }

+ 88 - 0
src/main/java/com/its/api/its/model/entity/vms/TbVmsFormSimple.java

@@ -0,0 +1,88 @@
+package com.its.api.its.model.entity.vms;
+
+import com.its.api.its.model.dto.vms.TbVmsFormDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * VMS FORM Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("VMS FORM")
+@Entity
+@Table(name = "TB_VMS_FORM")
+public class TbVmsFormSimple implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS FORM ID")  // N NUMBER(5)
+    @Id
+    @Column(name = "VMS_FORM_ID", nullable = false, columnDefinition = "NUMBER", length = 5)
+    private Integer vmsFormId;
+
+    @ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_TYPE_CD", length = 7)
+    private String vmsTypeCd;
+
+    @ApiModelProperty("VMS FORM 유형 코드")  // N NUMBER(3)
+    @Column(name = "VMS_FORM_TYPE_CD", nullable = false, columnDefinition = "NUMBER", length = 3)
+    private Integer vmsFormTypeCd;
+
+    @ApiModelProperty("VMS FORM 배경 색상 코드")  // N NUMBER(10)
+    @Column(name = "VMS_FORM_BCKG_HUE_CD", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsFormBckgHueCd;
+
+    @ApiModelProperty("VMS FORM 명")  // Y VARCHAR(60)
+    @Column(name = "VMS_FORM_NM", length = 60)
+    private String vmsFormNm;
+
+    @ApiModelProperty("VMS FORM 설명")  // Y VARCHAR(200)
+    @Column(name = "VMS_FORM_EXPL", length = 200)
+    private String vmsFormExpl;
+
+    @ApiModelProperty("VMS 메시지 표출 방향 코드")  // Y NUMBER(3)
+    @Column(name = "VMS_MSG_DSPL_DRCT_CD", columnDefinition = "NUMBER", length = 3)
+    private Integer vmsMsgDsplDrctCd;
+
+    @ApiModelProperty("심벌라이브러리 번호")  // Y NUMBER(4)
+    @Column(name = "SYMBLIB_NMBR", columnDefinition = "NUMBER", length = 4)
+    private Integer symbLibNmbr;
+
+    @ApiModelProperty("VMS 메시지 표출 방법 코드")  // Y NUMBER(3)
+    @Column(name = "VMS_MSG_DSPL_MTHD_CD", columnDefinition = "NUMBER", length = 3)
+    private Integer vmsMsgDsplMthdCd;
+
+    @ApiModelProperty("CCTV 관리 번호")  // Y NUMBER(10)
+    @Column(name = "CCTV_MNGM_NMBR", columnDefinition = "NUMBER", length = 10)
+    private Long cctvMngmNmbr;
+
+    public TbVmsFormDto toDto() {
+        return TbVmsFormDto.builder()
+                .vmsFormId(this.vmsFormId)
+                .vmsTypeCd(this.vmsTypeCd)
+                .vmsFormTypeCd(this.vmsFormTypeCd)
+                .vmsFormBckgHueCd(this.vmsFormBckgHueCd)
+                .vmsFormNm(this.vmsFormNm)
+                .vmsFormExpl(this.vmsFormExpl)
+                .vmsMsgDsplDrctCd(this.vmsMsgDsplDrctCd)
+                .symbLibNmbr(this.symbLibNmbr)
+                .imagFmt("png")
+                .vmsMsgDsplMthdCd(this.vmsMsgDsplMthdCd)
+                .cctvMngmNmbr(this.cctvMngmNmbr)
+                .build();
+    }
+
+    public TbVmsFormSimple(Integer vmsFormId) {
+        this.vmsFormId = vmsFormId;
+    }
+
+}

+ 41 - 0
src/main/java/com/its/api/its/repository/cctv/TbCctvPsetCtrlScnrRepository.java

@@ -0,0 +1,41 @@
+package com.its.api.its.repository.cctv;
+
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnr;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnrKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Repository
+public interface TbCctvPsetCtrlScnrRepository extends JpaRepository<TbCctvPsetCtrlScnr, TbCctvPsetCtrlScnrKey>, JpaSpecificationExecutor<TbCctvPsetCtrlScnr> {
+
+    @Query("select p from TbCctvPsetCtrlScnr p inner join fetch p.cctv cctv inner join fetch p.pset pset left outer join fetch cctv.state state")
+    List<TbCctvPsetCtrlScnr> findAll();
+
+    @Query("select p from TbCctvPsetCtrlScnr p inner join fetch p.cctv cctv inner join fetch p.pset pset left outer join fetch cctv.state state where cctv.delYn = 'N'")
+    List<TbCctvPsetCtrlScnr> findAllList();
+
+    @Query("select p from TbCctvPsetCtrlScnr p inner join fetch p.cctv cctv inner join fetch p.pset pset left outer join fetch cctv.state state " +
+           " where cctv.delYn = 'N' and p.cctvMngmNmbr = :nmbr")
+    List<TbCctvPsetCtrlScnr> findByIdList(@Param("nmbr") Long nmbr);
+
+    @Transactional
+    @Modifying
+    @Query(value =
+            "update tb_cctv_pset_ctrl_scnr     " +
+            "   set ctrl_dt     = :ctrlDt,     " +
+            "       ctrl_res_yn = :ctrlResYn   " +
+            " where cctv_mngm_nmbr = :nmbr     " +
+            "   and pset_nmbr      = :psetNmbr " +
+            "   and schd_hm        = :schdHm   ",
+            nativeQuery = true)
+    Integer updateCtrlResult(@Param("nmbr") Long nmbr, @Param("psetNmbr") String psetNmbr, @Param("schdHm") String schdHm,
+                             @Param("ctrlDt") String ctrlDt, @Param("ctrlResYn") String ctrlResYn);
+
+}

+ 1 - 0
src/main/java/com/its/api/its/repository/vms/TbVmsFormRepository.java

@@ -82,4 +82,5 @@ public interface TbVmsFormRepository extends JpaRepository<TbVmsForm, Integer>,
 
     @Query(value = "SELECT NVL(MAX(VMS_FORM_ID), 9999)+1 AS NEWID FROM TB_VMS_FORM", nativeQuery = true)
     Integer getNewVmsFormId();
+
 }

+ 3 - 2
src/main/java/com/its/api/its/service/cctv/CctvControlService.java

@@ -3,6 +3,7 @@ package com.its.api.its.service.cctv;
 import com.its.api.its.model.dto.cctv.CctvControlDto;
 import com.its.api.its.model.entity.cctv.TbCctvCtlr;
 import com.its.api.its.repository.cctv.TbCctvCtlrRepository;
+import com.its.utils.SysUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -72,7 +73,7 @@ public class CctvControlService {
     public CctvControlDto.CctvControlRes requestHttpPostProbe(CctvControlDto.CctvControlRes result, String controlUri, String ipAddr, String userId, String userPswd) {
         String encoding = Base64.getEncoder().encodeToString((userId + ":" + userPswd).getBytes());
         String apiUrl = "http://" + ipAddr + controlUri;
-        //log.info("{}, {}", apiUrl, SysUtils.byteArrayToHex(controlData));
+        log.info("{}", apiUrl);
 
         HttpURLConnection connection = null;
         try {
@@ -176,7 +177,7 @@ public class CctvControlService {
     public CctvControlDto.CctvControlRes requestHttpPostZeno(CctvControlDto.CctvControlRes result, byte[] controlData, String ipAddr, String userId, String userPswd) {
         String encoding = Base64.getEncoder().encodeToString((userId + ":" + userPswd).getBytes());
         String apiUrl = "http://" + ipAddr + "/cgi-bin/admin/uartctrl.cgi";
-        //log.info("{}, {}", apiUrl, SysUtils.byteArrayToHex(controlData));
+        log.info("{}, {}", apiUrl, SysUtils.byteArrayToHex(controlData));
 
         HttpURLConnection connection = null;
         try {

+ 142 - 0
src/main/java/com/its/api/its/service/cctv/TbCctvPsetCtrlScnrService.java

@@ -0,0 +1,142 @@
+package com.its.api.its.service.cctv;
+
+import com.its.api.its.model.dto.cctv.TbCctvPsetCtrlScnrDto;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnr;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnrKey;
+import com.its.api.its.repository.cctv.TbCctvPsetCtrlScnrRepository;
+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 TbCctvPsetCtrlScnrService {
+
+    private final TbCctvPsetCtrlScnrRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbCctvPsetCtrlScnr requireOne(TbCctvPsetCtrlScnrKey id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+//    @Transactional(readOnly = true)
+//    public List<TbCctvPsetCtrlScnrDto> findAll() {
+//        List<TbCctvPsetCtrlScnrDto> result = new ArrayList<>();
+//        List<TbCctvPsetCtrlScnr> data = this.repo.findAll();
+//        for (TbCctvPsetCtrlScnr entity : data) {
+//            result.add(entity.toDto());
+//        }
+//        return result;
+//    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+//    @Transactional(readOnly = true)
+//    public TbCctvPsetCtrlScnrDto findById(TbCctvPsetCtrlScnrKey id) {
+//        TbCctvPsetCtrlScnr entity = requireOne(id);
+//        return entity.toDto();
+//    }
+
+    // 데이터 변경
+//    @Transactional
+//    public TbCctvPsetCtrlScnrDto updateById(TbCctvPsetCtrlScnrKey id, TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq req) {
+//        TbCctvPsetCtrlScnr entity = requireOne(id);
+//        entity.updateInfo(req);
+//        this.repo.save(entity);
+//        return entity.toDto();
+//    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+//    @Transactional
+//    public TbCctvPsetCtrlScnrDto mergeInfo(TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq req) {
+//        TbCctvPsetCtrlScnr obj = req.toEntity();
+//        this.repo.save(obj);
+//        return obj.toDto();
+//    }
+
+    /**
+     * CCTV 프리셋 제어 스케쥴 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+     * @param reqList
+     * @return
+     */
+    @Transactional
+    public List<TbCctvPsetCtrlScnrDto> mergeInfoList(List<TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq> reqList) {
+        List<TbCctvPsetCtrlScnrDto> result = new ArrayList<>();
+        for (TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrUpdReq req : reqList) {
+            TbCctvPsetCtrlScnrKey key = new TbCctvPsetCtrlScnrKey(req.getCctvMngmNmbr(), req.getOldPsetNmbr(), req.getOldSchdHm());
+            Optional<TbCctvPsetCtrlScnr> oldObj = this.repo.findById(key);
+            if (oldObj.isPresent()) {
+                this.repo.deleteById(key);
+            }
+
+            TbCctvPsetCtrlScnr obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+//    @Transactional
+//    public TbCctvPsetCtrlScnrDto deleteById(TbCctvPsetCtrlScnrKey id) {
+//        TbCctvPsetCtrlScnr entity = requireOne(id);
+//        this.repo.deleteById(id);
+//        return entity.toDto();
+//    }
+
+    /**
+     * CCTV 프리셋 제어 스케쥴 데이터 삭제 - 존재하는 데이터 만 삭제
+     * @param ids
+     * @return
+     */
+    @Transactional
+    public List<TbCctvPsetCtrlScnrDto> deleteByIds(List<TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrDelReq> ids) {
+        List<TbCctvPsetCtrlScnrDto> result = new ArrayList<>();
+        for (TbCctvPsetCtrlScnrDto.TbCctvPsetCtrlScnrDelReq id : ids) {
+            TbCctvPsetCtrlScnrKey key = id.toEntityKey();
+            Optional<TbCctvPsetCtrlScnr> obj = this.repo.findById(key);
+            if (obj.isPresent()) {
+                this.repo.deleteById(key);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+    /**
+     * CCTV 프리셋 제어 시나리오 전체 목록 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbCctvPsetCtrlScnrDto> findAllList() {
+        List<TbCctvPsetCtrlScnrDto> result = new ArrayList<>();
+        List<TbCctvPsetCtrlScnr> data = this.repo.findAllList();
+        for (TbCctvPsetCtrlScnr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * CCTV 에 해당하는 프리셋 제어 스케쥴 시나리오 목록 조회
+     * @param id
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbCctvPsetCtrlScnrDto> findByIdList(Long id) {
+        List<TbCctvPsetCtrlScnrDto> result = new ArrayList<>();
+        List<TbCctvPsetCtrlScnr> data = this.repo.findByIdList(id);
+        for (TbCctvPsetCtrlScnr entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+}

+ 1 - 2
src/main/java/com/its/api/its/service/cctv/TbCctvScnrService.java

@@ -6,7 +6,6 @@ import com.its.api.its.model.entity.cctv.TbCctvScnrKey;
 import com.its.api.its.repository.cctv.TbCctvScnrRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
@@ -16,7 +15,7 @@ import java.util.Optional;
 
 @Slf4j
 @RequiredArgsConstructor
-@Service
+//@Service
 public class TbCctvScnrService {
 
     private final TbCctvScnrRepository repo;

+ 33 - 6
src/main/java/com/its/api/its/service/vms/TbVmsFormService.java

@@ -1,12 +1,12 @@
 package com.its.api.its.service.vms;
 
+import com.its.api.its.model.dto.common.NewIdIntegerDto;
+import com.its.api.its.model.dto.vms.TbVmsFormDetlDto;
 import com.its.api.its.model.dto.vms.TbVmsFormDto;
 import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
-import com.its.api.its.model.dto.common.NewIdIntegerDto;
 import com.its.api.its.model.entity.vms.TbVmsForm;
 import com.its.api.its.model.entity.vms.TbVmsFormObjectDetlInf;
 import com.its.api.its.repository.vms.TbVmsFormRepository;
-import com.its.utils.ItsUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -49,8 +49,8 @@ public class TbVmsFormService {
         List<TbVmsForm> data = this.repo.findAllByVmsType(vmsTypeCd);
         for (TbVmsForm entity : data) {
             TbVmsFormDto dto = entity.toDto();
-            dto.setVmsFormImag(ItsUtils.convertBmpToPng(dto.getVmsFormImag()));
-            dto.setImagFmt("png");
+//            dto.setVmsFormImag(ItsUtils.convertBmpToPng(dto.getVmsFormImag()));
+//            dto.setImagFmt("png");
             result.add(dto);
         }
         return result;
@@ -68,8 +68,8 @@ public class TbVmsFormService {
         List<TbVmsForm> data = this.repo.findAllByVmsTypeAndFormType(vmsTypeCd, formTypeCd);
         for (TbVmsForm entity : data) {
             TbVmsFormDto dto = entity.toDto();
-            dto.setVmsFormImag(ItsUtils.convertBmpToPng(dto.getVmsFormImag()));
-            dto.setImagFmt("png");
+//            dto.setVmsFormImag(ItsUtils.convertBmpToPng(dto.getVmsFormImag()));
+//            dto.setImagFmt("png");
             result.add(dto);
         }
         return result;
@@ -228,4 +228,31 @@ public class TbVmsFormService {
         return result;
     }
 
+    /**
+     * VMS 크기 유형별 폼 목록 조회
+     * @param type
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbVmsFormDto> findAllByType(String type) {
+        List<TbVmsFormDto> result = new ArrayList<>();
+        List<TbVmsForm> data = this.repo.findAllByVmsType(type);
+        for (TbVmsForm entity : data) {
+            result.add(entity.toDtoSimple());
+        }
+        return result;
+    }
+
+    /**
+     * VMS 폼 정보 상세 조회(이미지, 객체 목록 포함)
+     * @param id
+     * @return
+     */
+//    @Transactional(readOnly = true)
+    public TbVmsFormDetlDto findByVmsFormObjectDetail(Integer id) {
+        return TbVmsFormDetlDto.builder()
+                .form(findById(id))
+                .objects(findByVmsFormObject(id))
+                .build();
+    }
 }

+ 2 - 2
src/main/java/com/its/api/scheduler/ItsApiScheduler.java

@@ -2,7 +2,7 @@ package com.its.api.scheduler;
 
 import com.its.api.config.JobConfig;
 import com.its.api.scheduler.job.BaseDbmsJobThread;
-import com.its.api.scheduler.job.CctvPsetScnrJobThread;
+import com.its.api.scheduler.job.CctvPsetCtrlScnrJobThread;
 import com.its.api.scheduler.job.FcltSttsJobThread;
 import com.its.api.scheduler.job.UnitSttsJobThread;
 import lombok.AllArgsConstructor;
@@ -21,7 +21,7 @@ import javax.annotation.PreDestroy;
 public class ItsApiScheduler {
 
     private final JobConfig jobConfig;
-    private final CctvPsetScnrJobThread cctvPsetScnrThread;
+    private final CctvPsetCtrlScnrJobThread cctvPsetScnrThread;
     private final FcltSttsJobThread fcltSttsJobThread;
     private final UnitSttsJobThread unitSttsJobThread;
     private final BaseDbmsJobThread baseDbmsJobThread;

+ 95 - 0
src/main/java/com/its/api/scheduler/job/CctvPsetCtrlScnrJobThread.java

@@ -0,0 +1,95 @@
+package com.its.api.scheduler.job;
+
+import com.its.api.its.model.dto.cctv.CctvControlDto;
+import com.its.api.its.model.dto.cctv.TbCctvPsetCtrlScnrDto;
+import com.its.api.its.model.entity.cctv.TbCctvPsetCtrlScnr;
+import com.its.api.its.repository.cctv.TbCctvPsetCtrlScnrRepository;
+import com.its.api.its.service.cctv.CctvControlService;
+import com.its.utils.ItsUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@AllArgsConstructor
+@Service
+public class CctvPsetCtrlScnrJobThread {
+
+    private final TbCctvPsetCtrlScnrRepository cctvCtrlScnrRepo;
+    private final CctvControlService cctvControlService;
+
+    @Async("cctvPsetScnrExecutor")
+    public void run() {
+
+        log.info("START: CctvPsetScnrThread.run: {}", Thread.currentThread().getName());
+
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        List<TbCctvPsetCtrlScnrDto> cctvScnrList = new ArrayList<>();
+        List<TbCctvPsetCtrlScnr> cctvScnr = this.cctvCtrlScnrRepo.findAllList();
+        cctvScnr.forEach(obj -> {
+            cctvScnrList.add(obj.toDto());
+        });
+
+        String currDay = ItsUtils.getSysTime("yyyyMMdd");
+        String currCtrlDt = currDay+ItsUtils.getSysTime("HHmm");
+
+        cctvScnrList.forEach(obj -> {
+            if (StringUtils.equalsIgnoreCase("N", obj.getUseYn())) {
+                // 사용여부가 "N" 이면 제어하지 않음
+                return;
+            }
+
+            String controlDt = currDay + obj.getSchdHm().substring(0, 4);
+            int scheduleMin = ItsUtils.getDiffMinutes(controlDt+"00", currCtrlDt+"00");
+            if (scheduleMin < 0 || scheduleMin > 2) {
+                return;
+            }
+
+            // 제어시각 = 제어시작시각+0,1,2(분)
+            if (obj.getCtrlDt() != null && currCtrlDt.equals(obj.getCtrlDt().substring(0, 12))) {
+                if (("Y").equals(obj.getCtrlResYn())) {
+                    // 이미 제어를 수행하였고 결과가 성공이었다면 다시 제어할 필요 없음
+                    return;
+                }
+            }
+
+            // 제어를 시작한다.
+            log.info("Control: {}, {}, {}, {}", obj.getCctvMngmNmbr(), obj.getSchdHm(), obj.getPsetNmbr(), currCtrlDt);
+
+            CctvControlDto.CctvControlPresetReq req = CctvControlDto.CctvControlPresetReq.builder()
+                    .command("preset")
+                    .action("call")
+                    .speed(40)
+                    .no(Integer.valueOf(obj.getPsetNmbr()))
+                    .userId("SYSTEM")
+                    .build();
+            CctvControlDto.CctvControlRes res = this.cctvControlService.controlPreset(obj.getCctvMngmNmbr(), req);
+            String ctrlResYn = res.getError() == 0 ? "Y" : "N";
+//            String ctrlResYn = "N";
+//            TbCctvPsetCtrlScnr scnr = TbCctvPsetCtrlScnr.builder()
+//                    .cctvMngmNmbr(obj.getCctvMngmNmbr())
+//                    .psetNmbr(obj.getPsetNmbr())
+//                    .schdHm(obj.getSchdHm())
+//                    .useYn(obj.getUseYn())
+//                    .ctrlDt(controlDt+"00")
+//                    .ctrlResYn("N")
+//                    .build();
+//            //this.cctvScnrRepo.(scnr);
+//            if (obj.getCctvMngmNmbr() % 2 == 0) {
+//                ctrlResYn = "Y";
+//            }
+            this.cctvCtrlScnrRepo.updateCtrlResult(obj.getCctvMngmNmbr(), obj.getPsetNmbr(), obj.getSchdHm(), controlDt+"00", ctrlResYn);
+        });
+
+        stopWatch.stop();
+        log.info("--END: CctvPsetScnrThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
+    }
+}

+ 0 - 80
src/main/java/com/its/api/scheduler/job/CctvPsetScnrJobThread.java

@@ -1,80 +0,0 @@
-package com.its.api.scheduler.job;
-
-import com.its.api.its.model.dto.cctv.TbCctvScnrDto;
-import com.its.api.its.model.entity.cctv.TbCctvScnr;
-import com.its.api.its.repository.cctv.TbCctvScnrRepository;
-import com.its.api.its.service.cctv.CctvControlService;
-import com.its.utils.ItsUtils;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StopWatch;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Slf4j
-@AllArgsConstructor
-@Service
-public class CctvPsetScnrJobThread {
-
-    private final TbCctvScnrRepository cctvScnrRepo;
-    private final CctvControlService cctvControlService;
-
-    @Async("cctvPsetScnrExecutor")
-    public void run() {
-
-        log.info("START: CctvPsetScnrThread.run: {}", Thread.currentThread().getName());
-
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
-
-        List<TbCctvScnrDto> cctvScnrList = new ArrayList<>();
-        List<TbCctvScnr> cctvScnr = this.cctvScnrRepo.findAllList();
-        cctvScnr.forEach(obj -> {
-            cctvScnrList.add(obj.toDto());
-        });
-
-        String currDay = ItsUtils.getSysTime("yyyyMMdd");
-        String currCtrlDt = currDay+ItsUtils.getSysTime("HHmm");
-
-        cctvScnrList.forEach(obj -> {
-
-            String controlDt = currDay + obj.getStrtHms().substring(0, 4);
-            int scheduleMin = ItsUtils.getDiffMinutes(controlDt+"00", currCtrlDt+"00");
-            if (scheduleMin < 0 || scheduleMin > 2) {
-                return;
-            }
-
-            // 제어시각 = 제어시작시각+0,1,2(분)
-            if (obj.getCtrlDt() != null && currCtrlDt.equals(obj.getCtrlDt().substring(0, 12))) {
-                if (("Y").equals(obj.getCtrlResYn())) {
-                    // 이미 제어를 수행하였고 결과가 성공이었다면 다시 제어할 필요 없음
-                    return;
-                }
-            }
-
-            // 제어를 시작한다.
-            log.info("Control: {}, {}, {}, {}", obj.getCctvMngmNmbr(), obj.getStrtHms(), obj.getPsetNmbr(), currCtrlDt);
-
-            TbCctvScnr scnr = TbCctvScnr.builder()
-                    .cctvMngmNmbr(obj.getCctvMngmNmbr())
-                    .strtHms(obj.getStrtHms())
-                    .endHms(obj.getEndHms())
-                    .psetNmbr(obj.getPsetNmbr())
-                    .ctrlDt(controlDt+"00")
-                    .ctrlResYn("N")
-                    .build();
-            //this.cctvScnrRepo.(scnr);
-            String ctrlResYn = "N";
-            if (obj.getCctvMngmNmbr() % 2 == 0) {
-                ctrlResYn = "Y";
-            }
-            this.cctvScnrRepo.updateResult(obj.getCctvMngmNmbr(), obj.getStrtHms(), obj.getEndHms(), controlDt+"00", ctrlResYn);
-        });
-
-        stopWatch.stop();
-        log.info("--END: CctvPsetScnrThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
-    }
-}