浏览代码

dev vds,dsrc control

shjung 3 年之前
父节点
当前提交
a8dc23baf6
共有 22 个文件被更改,包括 428 次插入139 次删除
  1. 23 7
      src/main/java/com/its/op/ItsOpServerApplication.java
  2. 7 1
      src/main/java/com/its/op/config/ApplicationConfig.java
  3. 2 2
      src/main/java/com/its/op/config/RseServerConfig.java
  4. 46 0
      src/main/java/com/its/op/controller/its/rse/RseControlController.java
  5. 0 1
      src/main/java/com/its/op/controller/its/rse/TbRseCtrlHsController.java
  6. 3 3
      src/main/java/com/its/op/controller/its/vds/VdsControlController.java
  7. 14 0
      src/main/java/com/its/op/dao/mapper/its/rse/RseMapper.java
  8. 1 2
      src/main/java/com/its/op/dao/repository/its/rse/TbRseCtrlHsRepository.java
  9. 24 0
      src/main/java/com/its/op/dto/its/common/NewCtrlSeqDto.java
  10. 72 0
      src/main/java/com/its/op/dto/its/rse/RseControlDto.java
  11. 9 57
      src/main/java/com/its/op/dto/its/rse/TbRseCtrlHsDto.java
  12. 20 13
      src/main/java/com/its/op/entity/its/rse/TbRseCtrlHs.java
  13. 0 27
      src/main/java/com/its/op/entity/its/rse/TbRseCtrlHsKey.java
  14. 7 7
      src/main/java/com/its/op/scheduler/ItsApiScheduler.java
  15. 3 3
      src/main/java/com/its/op/service/its/incident/TbIncdOcrrService.java
  16. 2 2
      src/main/java/com/its/op/service/its/link/TbLinkService.java
  17. 135 0
      src/main/java/com/its/op/service/its/rse/RseControlService.java
  18. 0 1
      src/main/java/com/its/op/service/its/rse/TbRseCtrlHsService.java
  19. 6 11
      src/main/java/com/its/op/service/its/vds/VdsControlService.java
  20. 19 1
      src/main/java/com/its/op/service/its/xprotocol/CenterProtocol.java
  21. 1 1
      src/main/resources/application.yml
  22. 34 0
      src/main/resources/mybatis/mapper/its/rse/RseMapper.xml

+ 23 - 7
src/main/java/com/its/op/ItsOpServerApplication.java

@@ -1,8 +1,6 @@
 package com.its.op;
 
-import com.its.op.config.AppUtils;
-import com.its.op.config.ProcessConfig;
-import com.its.op.config.VdsServerConfig;
+import com.its.op.config.*;
 import com.its.op.entity.its.unit.TbUnitSyst;
 import com.its.op.global.UnitSystManager;
 import com.its.op.xnetudp.CenterCommUdpServer;
@@ -68,7 +66,7 @@ public class ItsOpServerApplication extends SpringBootServletInitializer impleme
     @Override
     public void run(String... args) {
 
-        ProcessConfig processConfig = (ProcessConfig) AppUtils.getBean(ProcessConfig.class);
+        ApplicationConfig applicationConfig = (ApplicationConfig) AppUtils.getBean(ApplicationConfig.class);
 
         log.info("");
         log.info("");
@@ -78,8 +76,8 @@ public class ItsOpServerApplication extends SpringBootServletInitializer impleme
         log.info("**              Intelligent Traffic System Common Operating Server.               **");
         log.info("**                                                                                **");
         log.info("**                                                                   [ver.1.0]    **");
-        log.info("** process: {}", processConfig.getId());
-        log.info("** startup: {}", processConfig.getBootingDateTime());
+        log.info("** process: {}", applicationConfig.getId());
+        log.info("** startup: {}", applicationConfig.getBootingDateTime());
         log.info("************************************************************************************");
 
         CenterCommUdpServer centerCommUdpServer = (CenterCommUdpServer)AppUtils.getBean(CenterCommUdpServer.class);
@@ -88,14 +86,32 @@ public class ItsOpServerApplication extends SpringBootServletInitializer impleme
 //        VdsCommClientService vdsCommClientService = (VdsCommClientService)AppUtils.getBean(VdsCommClientService.class);
 //        vdsCommClientService.run();
 
+        VmsServerConfig vmsServerConfig = (VmsServerConfig)AppUtils.getBean(VmsServerConfig.class);
+        TbUnitSyst vmsServer = UnitSystManager.get(vmsServerConfig.getProcessId());
+        if (vmsServer != null) {
+            vmsServerConfig.setIpAddress(vmsServer.getSystIp1().trim());
+            vmsServerConfig.setPort(Integer.parseInt(vmsServer.getPrgmPort().trim()));
+        }
         VdsServerConfig vdsServerConfig = (VdsServerConfig)AppUtils.getBean(VdsServerConfig.class);
         TbUnitSyst vdsServer = UnitSystManager.get(vdsServerConfig.getProcessId());
         if (vdsServer != null) {
             vdsServerConfig.setIpAddress(vdsServer.getSystIp1().trim());
             vdsServerConfig.setPort(Integer.parseInt(vdsServer.getPrgmPort().trim()));
         }
+        RseServerConfig rseServerConfig = (RseServerConfig)AppUtils.getBean(RseServerConfig.class);
+        TbUnitSyst rseServer = UnitSystManager.get(vdsServerConfig.getProcessId());
+        if (rseServer != null) {
+            rseServerConfig.setIpAddress(rseServer.getSystIp1().trim());
+            rseServerConfig.setPort(Integer.parseInt(rseServer.getPrgmPort().trim()));
+        }
+        CctvServerConfig cctvServerConfig = (CctvServerConfig)AppUtils.getBean(CctvServerConfig.class);
+        TbUnitSyst cctvServer = UnitSystManager.get(vdsServerConfig.getProcessId());
+        if (cctvServer != null) {
+            cctvServerConfig.setIpAddress(cctvServer.getSystIp1().trim());
+            cctvServerConfig.setPort(Integer.parseInt(cctvServer.getPrgmPort().trim()));
+        }
 
-        processConfig.setStartSchedule(true);
+        applicationConfig.setStartSchedule(true);
     }
 
     @Override

+ 7 - 1
src/main/java/com/its/op/config/ProcessConfig.java → src/main/java/com/its/op/config/ApplicationConfig.java

@@ -16,7 +16,7 @@ import javax.annotation.PostConstruct;
 @ToString
 @Configuration
 @ConfigurationProperties(prefix = "application.process")
-public class ProcessConfig {
+public class ApplicationConfig {
 
     private String bootingDateTime;
     private boolean startSchedule;
@@ -30,6 +30,12 @@ public class ProcessConfig {
     private String regionCode = "228";
     private String regionName = "평택시";
 
+    private String vdsServerId = "VDS01";
+    private String vmsServerId = "VMS01";
+    private String dsrcServerId = "DSRC01";
+    private String cctvServerId = "CTV01";
+    private String trafServerId = "UTP01";
+
     @PostConstruct
     private void init() {
         this.startSchedule = false;

+ 2 - 2
src/main/java/com/its/op/config/DsrcServerConfig.java → src/main/java/com/its/op/config/RseServerConfig.java

@@ -14,8 +14,8 @@ import javax.annotation.PostConstruct;
 @Setter
 @ToString
 @Configuration
-@ConfigurationProperties(prefix = "application.dsrc-server")
-public class DsrcServerConfig {
+@ConfigurationProperties(prefix = "application.rse-server")
+public class RseServerConfig {
 
     private boolean enabled = true;
     private String  processId;

+ 46 - 0
src/main/java/com/its/op/controller/its/rse/RseControlController.java

@@ -0,0 +1,46 @@
+package com.its.op.controller.its.rse;
+
+import com.its.op.controller.its.LoginController;
+import com.its.op.dto.its.rse.RseControlDto;
+import com.its.op.service.its.rse.RseControlService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+@Slf4j
+@Api(tags = "14.RSE-0.제어")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/rse/control")
+public class RseControlController {
+
+    private final RseControlService service;
+    private final LoginController loginController;
+
+    @ApiOperation(value = "RSE 제어기 리셋", response = RseControlDto.RseControlRes.class)
+    @PostMapping(value = "/reset/{id}", produces = {"application/json; charset=utf8"})
+    public RseControlDto.RseControlRes controlReset(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "제어정보", example = "", required = true)
+            @RequestBody @Valid final RseControlDto.RseControlResetReq req,
+            HttpServletRequest request) {
+        String userId = this.loginController.getSessionUserId(request);
+        log.info("UUID: {}", userId);
+        if (!userId.equals("")) {
+            req.setUserId(userId);
+        }
+        req.setDevice(0);
+        req.setControl(1);
+        return this.service.controlReset(id, req);
+    }
+
+}

+ 0 - 1
src/main/java/com/its/op/controller/its/rse/TbRseCtrlHsController.java

@@ -1,7 +1,6 @@
 package com.its.op.controller.its.rse;
 
 import com.its.op.dto.its.rse.TbRseCtrlHsDto;
-import com.its.op.entity.its.rse.TbRseCtrlHsKey;
 import com.its.op.service.its.rse.TbRseCtrlHsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 3 - 3
src/main/java/com/its/op/controller/its/vds/VdsControlController.java

@@ -28,9 +28,9 @@ public class VdsControlController {
     @ApiOperation(value = "VDS 제어기 리셋", response = VdsControlDto.VdsControlRes.class)
     @PostMapping(value = "/reset/{id}", produces = {"application/json; charset=utf8"})
     public VdsControlDto.VdsControlRes controlReset(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
             @PathVariable("id") Long id,
-            @ApiParam(name = "req", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "req", value = "제어정보", example = "", required = true)
             @RequestBody @Valid final VdsControlDto.VdsControlResetReq req,
             HttpServletRequest request) {
         String userId = this.loginController.getSessionUserId(request);
@@ -44,7 +44,7 @@ public class VdsControlController {
     @ApiOperation(value = "VDS 영상 이미지 요청", response = VdsControlDto.VdsControlRes.class)
     @PostMapping(value = "/stop-image/{id}", produces = {"application/json; charset=utf8"})
     public VdsControlDto.VdsControlRes requestStopImage(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "VDS 영상정보 요청", example = "[1, 0, ADMIN]", required = true)
             @RequestBody @Valid final VdsControlDto.VdsControlStopImageReq req,

+ 14 - 0
src/main/java/com/its/op/dao/mapper/its/rse/RseMapper.java

@@ -0,0 +1,14 @@
+package com.its.op.dao.mapper.its.rse;
+
+import com.its.op.dto.its.common.NewCtrlSeqDto;
+import com.its.op.entity.its.rse.TbRseCtrlHs;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface RseMapper {
+
+    NewCtrlSeqDto getNextCtrlSeq();
+    int insertRseCtrlHs(@Param("obj") TbRseCtrlHs obj);
+
+}

+ 1 - 2
src/main/java/com/its/op/dao/repository/its/rse/TbRseCtrlHsRepository.java

@@ -1,7 +1,6 @@
 package com.its.op.dao.repository.its.rse;
 
 import com.its.op.entity.its.rse.TbRseCtrlHs;
-import com.its.op.entity.its.rse.TbRseCtrlHsKey;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -10,7 +9,7 @@ import org.springframework.stereotype.Repository;
 import java.util.List;
 
 @Repository
-public interface TbRseCtrlHsRepository extends JpaRepository<TbRseCtrlHs, TbRseCtrlHsKey>, JpaSpecificationExecutor<TbRseCtrlHs> {
+public interface TbRseCtrlHsRepository extends JpaRepository<TbRseCtrlHs, Long>, JpaSpecificationExecutor<TbRseCtrlHs> {
 
     @Query("select p from TbRseCtrlHs p")
     List<TbRseCtrlHs> findAll();

+ 24 - 0
src/main/java/com/its/op/dto/its/common/NewCtrlSeqDto.java

@@ -0,0 +1,24 @@
+package com.its.op.dto.its.common;
+
+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;
+
+/**
+ * Long New ID DTO Class
+ */
+@Data
+@Builder
+@ApiModel("NewCtrlSeqDto(신규 제어 SEQUENCE 정보)")
+public class NewCtrlSeqDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("신규제어 SEQUENCE")
+    @JsonProperty("ctrl_seq")
+    private Long CTRL_SEQ;
+
+}

+ 72 - 0
src/main/java/com/its/op/dto/its/rse/RseControlDto.java

@@ -0,0 +1,72 @@
+package com.its.op.dto.its.rse;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ * RSE 제어기 제어정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("RseControlDto(RSE 제어 정보")
+public class RseControlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModel("RseControlResetReq(RSE 제어기 리셋)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class RseControlResetReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @ApiModelProperty("장치유형(기본0)")
+        @JsonProperty("device")
+        private Integer device;
+
+        @ApiModelProperty("제어정보(기본1)")
+        @JsonProperty("control")
+        private Integer control;
+
+        @Builder
+        public RseControlResetReq(String user_id, Integer device, Integer control) {
+            this.userId = user_id;
+            this.device = device;
+            this.control = control;
+        }
+    }
+
+    @ApiModel("RseControlRes(RSE 제어기 제어 응답)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class RseControlRes {
+
+        @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 RseControlRes(Integer error, String message) {
+            this.error = error;
+            this.message = message;
+        }
+    }
+
+}

+ 9 - 57
src/main/java/com/its/op/dto/its/rse/TbRseCtrlHsDto.java

@@ -1,13 +1,11 @@
 package com.its.op.dto.its.rse;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.its.op.entity.its.rse.TbRseCtrlHs;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
+import lombok.Builder;
+import lombok.Data;
 
-import javax.validation.constraints.PositiveOrZero;
-import javax.validation.constraints.Size;
 import java.io.Serializable;
 
 /**
@@ -19,6 +17,10 @@ import java.io.Serializable;
 public class TbRseCtrlHsDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty("RSE 제어 일련번호")  // N NUMBER(10)
+    @JsonProperty("ctrl_seq")
+    private Long ctrlSeq;
+
     @ApiModelProperty("RSE 제어기 번호")  // N NUMBER(10)
     @JsonProperty("rse_ctlr_nmbr")
     private Long rseCtlrNmbr;
@@ -39,58 +41,8 @@ public class TbRseCtrlHsDto implements Serializable {
     @JsonProperty("rsps_type")
     private String rspsType;
 
-    // Code Description Field
-    @ApiModel("TbRseCtrlHsUpdReq(RSE 제어 이력 정보변경)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class TbRseCtrlHsUpdReq {
-
-        @ApiModelProperty("RSE 제어기 번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
-        @JsonProperty("rse_ctlr_nmbr")
-        @PositiveOrZero
-        private Long rseCtlrNmbr;
-
-        @ApiModelProperty("제어 일시, Nullable = N, VARCHAR2(14)")  // N VARCHAR2(14)
-        @JsonProperty("cntl_dt")
-        @Size(min=1, max=14)
-        private String cntlDt;
-
-        @ApiModelProperty("장치 유형, Nullable = N, VARCHAR2(7)")  // N VARCHAR2(7)
-        @JsonProperty("devc_type")
-        @Size(min=1, max=7)
-        private String devcType;
-
-        @ApiModelProperty("제어 유형, Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
-        @JsonProperty("cntl_type")
-        @Size(min=1, max=7)
-        private String cntlType;
-
-        @ApiModelProperty("응답 유형, Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
-        @JsonProperty("rsps_type")
-        @Size(min=1, max=7)
-        private String rspsType;
-
-        @Builder
-        public TbRseCtrlHsUpdReq(Long rse_ctlr_nmbr, String cntl_dt, String devc_type, String cntl_type, String rsps_type) {
-            this.rseCtlrNmbr = rse_ctlr_nmbr;
-            this.cntlDt = cntl_dt;
-            this.devcType = devc_type;
-            this.cntlType = cntl_type;
-            this.rspsType = rsps_type;
-        }
-
-        public TbRseCtrlHs toEntity() {
-            return TbRseCtrlHs.builder()
-                    .rseCtlrNmbr(this.rseCtlrNmbr)
-                    .cntlDt(this.cntlDt)
-                    .devcType(this.devcType)
-                    .cntlType(this.cntlType)
-                    .rspsType(this.rspsType)
-                    .build();
-        }
-
-    }
+    @ApiModelProperty("제어한 사용자ID")  // Y VARCHAR2(20)
+    @JsonProperty("user_id")
+    private String userId;
 
 }

+ 20 - 13
src/main/java/com/its/op/entity/its/rse/TbRseCtrlHs.java

@@ -8,7 +8,10 @@ import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
 import java.io.Serializable;
 
 /**
@@ -21,22 +24,23 @@ import java.io.Serializable;
 @ApiModel("RSE 제어 이력")
 @Entity
 @Table(name = "TB_RSE_CTRL_HS")
-@IdClass(TbRseCtrlHsKey.class)
 public class TbRseCtrlHs implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty("RSE 제어 번호")  // N NUMBER(10)
+    @ApiModelProperty("RSE 제어 일련번호")  // N NUMBER(10)
     @Id
+    @Column(name = "CTRL_SEQ", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long ctrlSeq;
+
+    @ApiModelProperty("RSE 제어기 번호")  // N NUMBER(10)
     @Column(name = "RSE_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
     private Long rseCtlrNmbr;
 
     @ApiModelProperty("제어 일시")  // N VARCHAR2(14)
-    @Id
     @Column(name = "CNTL_DT", nullable = false, length = 14)
     private String cntlDt;
 
     @ApiModelProperty("장치 유형")  // N VARCHAR2(7)
-    @Id
     @Column(name = "DEVC_TYPE", nullable = false, length = 7)
     private String devcType;
 
@@ -48,25 +52,28 @@ public class TbRseCtrlHs implements Serializable {
     @Column(name = "RSPS_TYPE", length = 7)
     private String rspsType;
 
+    @ApiModelProperty("제어한 사용자ID")  // Y VARCHAR2(20)
+    @Column(name = "USER_ID", length = 20)
+    private String userId;
+
+    public void setResult(String rspsType) {
+        this.rspsType = rspsType;
+    }
     public TbRseCtrlHsDto toDto() {
         return TbRseCtrlHsDto.builder()
+                .ctrlSeq(this.ctrlSeq)
                 .rseCtlrNmbr(this.rseCtlrNmbr)
                 .cntlDt(this.cntlDt)
                 .devcType(this.devcType)
                 .cntlType(this.cntlType)
                 .rspsType(this.rspsType)
+                .userId(this.userId)
                 .build();
     }
 
-    public TbRseCtrlHs(Long rseCtlrNmbr, String cntlDt, String devcType) {
-        this.rseCtlrNmbr = rseCtlrNmbr;
-        this.cntlDt = cntlDt;
-        this.devcType = devcType;
+    public TbRseCtrlHs(Long ctrlSeq) {
+        this.ctrlSeq = ctrlSeq;
     }
 
-    public void updateInfo(TbRseCtrlHsDto.TbRseCtrlHsUpdReq req) {
-        this.cntlType = req.getCntlType();
-        this.rspsType = req.getRspsType();
-    }
 
 }

+ 0 - 27
src/main/java/com/its/op/entity/its/rse/TbRseCtrlHsKey.java

@@ -1,27 +0,0 @@
-package com.its.op.entity.its.rse;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * RSE 제어 이력 Key Class
- */
-@Data
-@NoArgsConstructor//(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
-public class TbRseCtrlHsKey implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    // RSE_CTLR_NMBR, RSE 제어기 번호  // N NUMBER(10)
-    private Long rseCtlrNmbr;
-
-    // CNTL_DT, 제어 일시  // N VARCHAR2(14)
-    private String cntlDt;
-
-    // DEVC_TYPE, 장치 유형  // N VARCHAR2(7)
-    private String devcType;
-
-}

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

@@ -1,7 +1,7 @@
 package com.its.op.scheduler;
 
 import com.its.op.config.JobConfig;
-import com.its.op.config.ProcessConfig;
+import com.its.op.config.ApplicationConfig;
 import com.its.op.scheduler.job.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -18,7 +18,7 @@ import javax.annotation.PreDestroy;
 @Component
 public class ItsApiScheduler {
 
-    private final ProcessConfig processConfig;
+    private final ApplicationConfig applicationConfig;
     private final JobConfig jobConfig;
     private final FcltSttsJobThread fcltSttsJobThread;
     private final UnitSttsJobThread unitSttsJobThread;
@@ -35,7 +35,7 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "0 * * * * *")  // 1분 주기 작업 실행
     public void jobCctvPsetScnr() {
-        if (!this.processConfig.isStartSchedule()) {
+        if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
 
@@ -47,7 +47,7 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "5 * * * * *")  // 60초 주기 작업 실행
     public void pollingBaseDbms() {
-        if (!this.processConfig.isStartSchedule()) {
+        if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
 
@@ -62,7 +62,7 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "20 * * * * *")  // 60초 주기 작업 실행
     public void pollingUnitStts() {
-        if (!this.processConfig.isStartSchedule()) {
+        if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
 
@@ -77,7 +77,7 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "25 * * * * *")  // 60초 주기 작업 실행
     public void pollingFcltStts() {
-        if (!this.processConfig.isStartSchedule()) {
+        if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
 
@@ -93,7 +93,7 @@ public class ItsApiScheduler {
     @Scheduled(cron = "40 0/10 * * * *")  // 10분 주기 작업 실행
     //@Scheduled(cron = "40 * * * * *")  // 10분 주기 작업 실행
     public void jobDbSvrStts() {
-        if (!this.processConfig.isStartSchedule()) {
+        if (!this.applicationConfig.isStartSchedule()) {
             return;
         }
         this.dbmsSttsJobThread.run();

+ 3 - 3
src/main/java/com/its/op/service/its/incident/TbIncdOcrrService.java

@@ -1,6 +1,6 @@
 package com.its.op.service.its.incident;
 
-import com.its.op.config.ProcessConfig;
+import com.its.op.config.ApplicationConfig;
 import com.its.op.dao.repository.its.code.TbCmmnCdRepository;
 import com.its.op.dao.repository.its.ifsc.TbIfscLinkRltnRepository;
 import com.its.op.dao.repository.its.incident.TbIncdOcrrRepository;
@@ -35,7 +35,7 @@ public class TbIncdOcrrService {
     private final TbVmsIfscRltnIfscRepository vmsLinkIfscRepo;
     private final TbVmsRltnIfscRepository vmsIfscRltnRepo;
     private final TbVmsCtlrRepository vmsRepo;
-    private final ProcessConfig processConfig;
+    private final ApplicationConfig applicationConfig;
 
     private final TbCmmnCdRepository codeRepo;
 
@@ -128,7 +128,7 @@ public class TbIncdOcrrService {
      */
     @Transactional(readOnly = true)
     public IncdNewIdDto getNewIncdId() {
-        String centerId = this.processConfig.getCenterId();
+        String centerId = this.applicationConfig.getCenterId();
         String newId = this.repo.getNewIncdId(centerId);
         IncdNewIdDto result = IncdNewIdDto.builder()
                 .incdOcrrId(centerId + newId)

+ 2 - 2
src/main/java/com/its/op/service/its/link/TbLinkService.java

@@ -1,6 +1,6 @@
 package com.its.op.service.its.link;
 
-import com.its.op.config.ProcessConfig;
+import com.its.op.config.ApplicationConfig;
 import com.its.op.dao.repository.its.link.TbLinkRepository;
 import com.its.op.dto.its.link.TbLinkDto;
 import com.its.op.entity.its.link.TbLink;
@@ -19,7 +19,7 @@ import java.util.Optional;
 @Service
 public class TbLinkService {
 
-    private final ProcessConfig processConfig;
+    private final ApplicationConfig applicationConfig;
     private final TbLinkRepository repo;
 
     // 데이터 1건 조회, 없으면 exception

+ 135 - 0
src/main/java/com/its/op/service/its/rse/RseControlService.java

@@ -0,0 +1,135 @@
+package com.its.op.service.its.rse;
+
+import com.its.op.config.RseServerConfig;
+import com.its.op.dao.mapper.its.rse.RseMapper;
+import com.its.op.dto.its.common.NewCtrlSeqDto;
+import com.its.op.dto.its.rse.RseControlDto;
+import com.its.op.entity.its.rse.TbRseCtrlHs;
+import com.its.op.service.its.xprotocol.CenterProtocol;
+import com.its.utils.ItsUtils;
+import com.its.utils.SysUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class RseControlService {
+
+    private final RseServerConfig config;
+    private final RseMapper mapper;
+
+    public ByteBuffer getResetCommand(Long ctlrNmbr, Long ctrlSeq, Integer devcType, Integer cntlType) {
+        int length = 16;
+        byte opCode = CenterProtocol.INT_OP_DSRC_CONTROL_REQ;
+
+        // Center packet
+        byte[] center = CenterProtocol.getRequestHead(CenterProtocol.INT_ID_RSE_OPER, CenterProtocol.INT_ID_RSE_SERVER, opCode, length);
+
+        // command message packet
+        ByteBuffer msgBuffer = ByteBuffer.allocate(length);
+        msgBuffer.order(ByteOrder.BIG_ENDIAN);
+        msgBuffer.putLong(ctlrNmbr);
+        msgBuffer.putLong(ctrlSeq);
+        msgBuffer.putInt(devcType);
+        msgBuffer.putInt(cntlType);
+
+        ByteBuffer cmdBuffer = ByteBuffer.allocate(center.length + length);
+        cmdBuffer.order(ByteOrder.BIG_ENDIAN);
+        cmdBuffer.put(center);
+        cmdBuffer.put(msgBuffer.array());
+        log.info("RSE Request Buffer: {}", SysUtils.byteArrayToHex(cmdBuffer.array()));
+        return cmdBuffer;
+    }
+
+    /**
+     * RSE 제어기 리셋
+     * @param req : request buffer
+     * @return : reset result
+     */
+    public RseControlDto.RseControlRes controlReset(Long id, RseControlDto.RseControlResetReq req) {
+        NewCtrlSeqDto dto = this.mapper.getNextCtrlSeq();
+        TbRseCtrlHs hs = TbRseCtrlHs.builder()
+                .ctrlSeq(dto.getCTRL_SEQ())
+                .rseCtlrNmbr(id)
+                .cntlDt(ItsUtils.getSysTime())
+                .devcType(String.valueOf(req.getDevice()))
+                .cntlType(String.valueOf(req.getControl()))
+                .rspsType("")
+                .userId(req.getUserId())
+                .build();
+
+        this.mapper.insertRseCtrlHs(hs);    // 결과는 통신서버에서 업데이트 한다.
+
+        RseControlDto.RseControlRes result = new RseControlDto.RseControlRes(0, "success");
+        ByteBuffer cmdBuffer = getResetCommand(id, dto.getCTRL_SEQ(), req.getDevice(), req.getControl());
+
+        String ipAddress = this.config.getIpAddress();
+        int port = this.config.getPort();
+        int connTimeout = 3000; // milli-seconds
+        int readTimeout = 2000; // milli-seconds
+
+        Socket socket = null;
+        try {
+            socket = CenterProtocol.connectServer(ipAddress, port, connTimeout, readTimeout);
+            try {
+                byte[] data = cmdBuffer.array();
+                OutputStream os = socket.getOutputStream();
+                os.write(data);
+                os.flush();
+                InputStream recvStream = socket.getInputStream();
+                try {
+                    while (true) {
+                        byte[] head = CenterProtocol.receiveBytes(recvStream, 10);
+                        if (head[0] == (byte)0x24 && head[1] == (byte)0x04 && head[5] == (byte)0x0C) {
+                            log.info("RECV RESPONSE HEAD: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
+                            if (head[4] == (byte) 0xFF) {
+                                result.setResult(9, "RSE 서버에서 알수 없는 RSE 제어기 입니다.");
+                            } else if (head[4] == (byte) 0xFE) {
+                                result.setResult(8, "RSE 서버에서 RSE 제어기 통신 상태가 비정상 입니다.");
+                            } else if (head[4] == (byte) 0xFD) {
+                                result.setResult(7, "제어기 제어값 오류.");
+                            } else if (head[4] == (byte) 0xFC) {
+                                result.setResult(6, "RSE 서버에서 RSE 제어기로 리셋 명령을 전송하지 못하였습니다.");
+                            } else {
+                                result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                            }
+                        } else {
+                            result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                        }
+                        break;
+                    }
+                } catch (IOException e) {
+                    // 이전 VDS 통신 서버에서는 응답을 주지 않기 때문에 타임아웃 걸린 경우 정상적으로 처리하도록 함
+                    result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                }
+            } catch (IOException e) {
+                result.setResult(3, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하지 못하였습니다.");
+            }
+        } catch (IOException e) {
+            log.error("Reset Request. {}, {}, IOException", ipAddress, port);
+            String errMsg = "[VDS 서버: " + ipAddress + "." + port + "]";
+            result.setResult(2, "RSE 서버와 통신이 실패하였습니다.\r\n" + errMsg);
+            return result;
+        }
+        finally {
+            try {
+                if (socket != null) {
+                    socket.close();
+                }
+            } catch (IOException e) {
+                log.error("RseControlService: requestCommandReset, socket close IOException");
+            }
+        }
+        return result;
+    }
+
+}

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

@@ -3,7 +3,6 @@ package com.its.op.service.its.rse;
 import com.its.op.dao.repository.its.rse.TbRseCtrlHsRepository;
 import com.its.op.dto.its.rse.TbRseCtrlHsDto;
 import com.its.op.entity.its.rse.TbRseCtrlHs;
-import com.its.op.entity.its.rse.TbRseCtrlHsKey;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 6 - 11
src/main/java/com/its/op/service/its/vds/VdsControlService.java

@@ -24,7 +24,7 @@ import java.util.concurrent.*;
 @Service
 public class VdsControlService {
 
-    private final VdsServerConfig vdsServerConfig;
+    private final VdsServerConfig config;
 
     private static final int[] crc16_arc = {
             0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
@@ -167,8 +167,8 @@ public class VdsControlService {
             return result;
         }
 
-        String ipAddress = this.vdsServerConfig.getIpAddress();
-        int port = this.vdsServerConfig.getPort();
+        String ipAddress = this.config.getIpAddress();
+        int port = this.config.getPort();
         int connTimeout = 3000; // milli-seconds
         int readTimeout = 2000; // milli-seconds
 
@@ -238,8 +238,8 @@ public class VdsControlService {
             return result;
         }
 
-        String ipAddress = this.vdsServerConfig.getIpAddress();
-        int port = this.vdsServerConfig.getPort();
+        String ipAddress = this.config.getIpAddress();
+        int port = this.config.getPort();
         int taskTimeout = 6000; // milli-seconds
         int connectTimeout = 3000; // milli-seconds
         int readTimeout = 4000; // milli-seconds
@@ -270,12 +270,7 @@ public class VdsControlService {
                     socket.setSoTimeout(readTimeout);			    /* InputStream 에서 데이터읽을때의 timeout */
                     socket.connect(socketAddress, connectTimeout);  /* socket 연결 자체에대한 timeout */
 
-                    try {
-                        byte[] data = cmdBuffer.array();
-                        OutputStream os = socket.getOutputStream();
-                        os.write(data);
-                        os.flush();
-                    } catch (IOException e) {
+                    if (!CenterProtocol.sendData(socket, cmdBuffer.array())) {
                         taskResult = 3;
                         result.setResult(taskResult, "VDS 서버에 정지영상 요청 명령을 정상적으로 전송하지 못하였습니다.");
                     }

+ 19 - 1
src/main/java/com/its/op/service/its/xprotocol/CenterProtocol.java

@@ -2,6 +2,7 @@ package com.its.op.service.its.xprotocol;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
@@ -41,7 +42,7 @@ public class CenterProtocol {
     public static final int INT_ID_SIG_OPER 			= 0x23;    /* 신호운영단말 */
     public static final int INT_ID_VDS_OPER 			= 0x24;    /* VDS운영단말 */
     public static final int INT_ID_AVI_OPER 			= 0x25;    /* AVI운영단말 */
-    public static final int INT_ID_DSRC_OPER 			= 0x26;    /* DSRC운영단말 */
+    public static final int INT_ID_RSE_OPER 			= 0x26;    /* DSRC운영단말 */
     public static final int INT_ID_VMS_OPER 			= 0x27;    /* VMS운영단말 */
     public static final int INT_ID_CCTV_OPER 			= 0x28;    /* CCTV운영단말 */
     public static final int INT_ID_FMS_OPER 			= 0x29;    /* 시설물관리단말 */
@@ -253,4 +254,21 @@ public class CenterProtocol {
         return buffer;
     }
 
+    /**
+     * 소켓으로 데이터 전송
+     * @param socket
+     * @param data
+     * @return
+     */
+    public static boolean sendData(Socket socket, byte[] data) {
+        try {
+            OutputStream os = socket.getOutputStream();
+            os.write(data);
+            os.flush();
+        } catch (IOException e) {
+            return false;
+        }
+        return true;
+    }
+
 }

+ 1 - 1
src/main/resources/application.yml

@@ -12,7 +12,7 @@ application:
     process-id: VDS01
   vms-server:
     process-id: VMS01
-  dsrc-server:
+  rse-server:
     process-id: DSRC01
   cctv-server:
     process-id: CTV01

+ 34 - 0
src/main/resources/mybatis/mapper/its/rse/RseMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.its.op.dao.mapper.its.rse.RseMapper">
+
+    <select id="getNextCtrlSeq" resultType="com.its.op.dto.its.common.NewCtrlSeqDto">
+       <![CDATA[
+        SELECT RSE_CTRL_SEQ.NEXTVAL AS CTRL_SEQ FROM DUAL
+        ]]>
+    </select>
+
+    <insert id="insertRseCtrlHs" parameterType="com.its.op.entity.its.rse.TbRseCtrlHs">
+    <![CDATA[
+        INSERT INTO TB_RSE_CTRL_HS (
+            CTRL_SEQ,
+            RSE_CTLR_NMBR,
+            CNTL_DT,
+            DEVC_TYPE,
+            CNTL_TYPE,
+            RSPS_TYPE,
+            USER_ID)
+        VALUES (
+                   #{obj.CTRL_SEQ},
+                   #{obj.RSE_CTLR_NMBR},
+                   #{obj.CNTL_DT},
+                   #{obj.DEVC_TYPE},
+                   #{obj.CNTL_TYPE},
+                   #{obj.RSPS_TYPE},
+                   #{obj.USER_ID}
+               )
+        ]]>
+    </insert>
+
+</mapper>