Ver Fonte

rse mybatis delete, multiple database connection add

shjung há 3 anos atrás
pai
commit
8aa2081f1f
42 ficheiros alterados com 1395 adições e 226 exclusões
  1. 3 0
      src/main/java/com/its/api/config/DatabaseConfig.java
  2. 114 0
      src/main/java/com/its/api/config/DatabaseUtisConfig.java
  3. 0 37
      src/main/java/com/its/api/its/controller/dashboard/facility/RseController.java
  4. 20 20
      src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchAutoController.java
  5. 61 17
      src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchController.java
  6. 6 6
      src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchDefaultController.java
  7. 6 6
      src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchFixedController.java
  8. 3 3
      src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp0Controller.java
  9. 3 3
      src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp1Controller.java
  10. 3 3
      src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp2Controller.java
  11. 10 0
      src/main/java/com/its/api/its/controller/vms/VmsCommonController.java
  12. 2 0
      src/main/java/com/its/api/its/model/dto/dashboard/facility/ItsFacilitySttsDto.java
  13. 1 1
      src/main/java/com/its/api/its/model/dto/dashboard/facility/RseFacilitySttsDto.java
  14. 12 0
      src/main/java/com/its/api/its/model/dto/vms/TbVmsCmtrInfrDto.java
  15. 4 4
      src/main/java/com/its/api/its/model/dto/vms/TbVmsMsgDsplSchDto.java
  16. 76 0
      src/main/java/com/its/api/its/model/dto/vms/TbVmsMsgDsplSchVmsListDto.java
  17. 26 4
      src/main/java/com/its/api/its/model/entity/vms/TbVmsCmtrInfr.java
  18. 22 7
      src/main/java/com/its/api/its/model/entity/vms/TbVmsMsgDsplSch.java
  19. 1 1
      src/main/java/com/its/api/its/model/entity/vms/TbVmsMsgDsplSchKey.java
  20. 10 0
      src/main/java/com/its/api/its/repository/vms/TbVmsCmtrInfrRepository.java
  21. 4 0
      src/main/java/com/its/api/its/repository/vms/TbVmsCtlrRepository.java
  22. 29 0
      src/main/java/com/its/api/its/repository/vms/TbVmsMsgDsplSchRepository.java
  23. 0 26
      src/main/java/com/its/api/its/repository/vms/TbVmsTrfcInfrDsplSchRepository.java
  24. 16 0
      src/main/java/com/its/api/its/service/vms/TbVmsCmtrInfrService.java
  25. 111 46
      src/main/java/com/its/api/its/service/vms/TbVmsMsgDsplSchService.java
  26. 2 2
      src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp0Service.java
  27. 2 2
      src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp1Service.java
  28. 2 2
      src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp2Service.java
  29. 22 0
      src/main/java/com/its/api/utils/ItsUtils.java
  30. 58 0
      src/main/java/com/its/api/utis/controller/UtisController.java
  31. 97 0
      src/main/java/com/its/api/utis/model/dto/RsemstDto.java
  32. 76 0
      src/main/java/com/its/api/utis/model/dto/RseopstateDto.java
  33. 30 0
      src/main/java/com/its/api/utis/model/dto/RseopstateTotalDto.java
  34. 91 0
      src/main/java/com/its/api/utis/model/dto/UtisRseStateDto.java
  35. 138 0
      src/main/java/com/its/api/utis/model/entity/Rsemst.java
  36. 106 0
      src/main/java/com/its/api/utis/model/entity/Rseopstate.java
  37. 22 0
      src/main/java/com/its/api/utis/repository/RsemstRepository.java
  38. 13 0
      src/main/java/com/its/api/utis/repository/RseopstateRepository.java
  39. 114 0
      src/main/java/com/its/api/utis/service/RsemstService.java
  40. 65 0
      src/main/java/com/its/api/utis/service/RseopstateService.java
  41. 14 0
      src/main/resources/application.yml
  42. 0 36
      src/main/resources/mybatis/mapper/facility/RseMapper.xml

+ 3 - 0
src/main/java/com/its/api/config/DatabaseConfig.java

@@ -3,6 +3,7 @@ package com.its.api.config;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.SqlSessionFactory;
+import org.hibernate.cfg.AvailableSettings;
 import org.mybatis.spring.SqlSessionFactoryBean;
 import org.mybatis.spring.SqlSessionTemplate;
 import org.mybatis.spring.annotation.MapperScan;
@@ -71,6 +72,8 @@ public class DatabaseConfig {
             EntityManagerFactoryBuilder builder,
             @Autowired @Qualifier("dataSource") DataSource primaryDataSource,
             @Autowired @Qualifier("jpaProperties") JpaProperties jpaProperties) {
+
+        jpaProperties.getProperties().put(AvailableSettings.HBM2DDL_AUTO, "validate");
         return builder
                 .dataSource(primaryDataSource)
                 .properties(jpaProperties.getProperties())

+ 114 - 0
src/main/java/com/its/api/config/DatabaseUtisConfig.java

@@ -0,0 +1,114 @@
+package com.its.api.config;
+
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.hibernate.cfg.AvailableSettings;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+import java.util.Objects;
+
+@Slf4j
+@ToString
+@Configuration
+@EnableJpaRepositories(
+        basePackages= {"com.its.api.utis.repository"},
+        entityManagerFactoryRef = "utisEntityManagerFactory",
+        transactionManagerRef = "utisTransactionManager")
+@MapperScan(basePackages="com.its.api.utis.repository.*", sqlSessionFactoryRef = "utisSqlSessionFactory")
+@EnableTransactionManagement
+public class DatabaseUtisConfig {
+
+    @Value("${spring.utis-datasource.hikari.mapper-locations:classpath:mybatis/mapper/**/*.xml}")
+    String mapperLocations;
+
+    @PostConstruct
+    private void init() {
+        if (this.mapperLocations.trim().equals("")) {
+            this.mapperLocations = "classpath:mybatis/mapper/**/*.xml";
+        }
+        log.info("mapperLocations: {}", this.mapperLocations);
+        log.info("{}", this);
+    }
+
+    @Bean(name="utisDataSource")
+    @ConfigurationProperties(prefix="spring.utis-datasource.hikari")
+    public DataSource dataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name="utisJpaProperties")
+    @ConfigurationProperties(prefix="spring.utis-jpa")
+    public JpaProperties jpaProperties() {
+        return new JpaProperties();
+    }
+
+    @Bean(name="utisEntityManagerFactory")
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
+            EntityManagerFactoryBuilder builder,
+            @Autowired @Qualifier("utisDataSource") DataSource primaryDataSource,
+            @Autowired @Qualifier("utisJpaProperties") JpaProperties jpaProperties) {
+
+        jpaProperties.getProperties().put(AvailableSettings.HBM2DDL_AUTO, "validate");
+
+        return builder
+                .dataSource(primaryDataSource)
+                .properties(jpaProperties.getProperties())
+                .packages("com.its.api.utis.model.entity")
+                .persistenceUnit("default")
+                .build();
+    }
+
+    @Bean(name="utisTransactionManager")
+    public PlatformTransactionManager transactionManager(
+            @Autowired @Qualifier("utisEntityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory) {
+        JpaTransactionManager transactionManager = new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory.getObject()));
+        transactionManager.setNestedTransactionAllowed(true);
+        return transactionManager;
+    }
+
+    @Bean(name="utisSqlSessionFactory")
+    public SqlSessionFactory sqlSessionFactoryBean(
+            @Autowired @Qualifier("utisDataSource") DataSource dataSource, ApplicationContext applicationContext)
+            throws Exception {
+        log.info("mapperLocations: {}", this.mapperLocations);
+        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+        factoryBean.setDataSource(dataSource);
+        //factoryBean.setTypeAliasesPackage("");
+        //factoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis/mybatis-config.xml"));
+        factoryBean.setMapperLocations(applicationContext.getResources(this.mapperLocations));
+        return factoryBean.getObject();
+    }
+
+    @Bean(name="utisSqlSession")
+    public SqlSessionTemplate sqlSession(
+            @Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
+        return new SqlSessionTemplate(sqlSessionFactory);
+    }
+
+    @Bean(name="utisSqlSessionTemplate")
+    public SqlSessionTemplate sqlSessionTemplate(
+            @Autowired @Qualifier("utisSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
+        return new SqlSessionTemplate(sqlSessionFactory);
+    }
+
+}

+ 0 - 37
src/main/java/com/its/api/its/controller/dashboard/facility/RseController.java

@@ -1,37 +0,0 @@
-package com.its.api.its.controller.dashboard.facility;
-
-import com.its.api.its.model.dto.dashboard.facility.RseCommSttsDto;
-import com.its.api.its.model.dto.dashboard.facility.RseFacilitySttsDto;
-import com.its.api.its.service.dashboard.facility.RseService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@Api(tags = "90.시설물(DASHBOARD)-3.RSE")
-@Validated
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/api/dashboard/facility/rse")
-public class RseController {
-
-    private final RseService service;
-
-    @ApiOperation(value = "RSE.01.시설물상태", response = RseFacilitySttsDto.class, responseContainer = "ArrayList")
-    @GetMapping(value = "/stts", produces = {"application/json; charset=utf8"})
-    public List<RseFacilitySttsDto> findAllFacilityStts() {
-        return this.service.findAllFacilityStts();
-    }
-
-    @ApiOperation(value = "RSE.02.RSE통신상태", response = RseCommSttsDto.class, responseContainer = "ArrayList")
-    @GetMapping(value = "/comm", produces = {"application/json; charset=utf8"})
-    public List<RseCommSttsDto> findAllCommStts() {
-        return this.service.findAllCommStts();
-    }
-
-}

+ 20 - 20
src/main/java/com/its/api/its/controller/vms/TbVmsTrfcInfrDsplSchAutoController.java → src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchAutoController.java

@@ -1,7 +1,7 @@
 package com.its.api.its.controller.vms;
 
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
-import com.its.api.its.service.vms.TbVmsTrfcInfrDsplSchService;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -19,27 +19,27 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/schedule/auto")
-public class TbVmsTrfcInfrDsplSchAutoController {
+public class TbVmsMsgDsplSchAutoController {
 
-    private final TbVmsTrfcInfrDsplSchService service;
+    private final TbVmsMsgDsplSchService service;
 
     /**
      * VMS 제어기 관리 번호로 폼 표출 스케줄 목록 조회
      * @param id
      * @return
      */
-    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllVmsDsplSchedule(
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
         return this.service.findAllVmsDsplSchedule(id);
     }
     // 교통정보
-    @ApiOperation(value = "VMS 폼 정보 조회-교통정보(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-교통정보(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/traffic/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllTrafficByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllTrafficByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -47,9 +47,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 정체
-    @ApiOperation(value = "VMS 폼 정보 조회-정체(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-정체(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/congest/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllCongestByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllCongestByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -57,9 +57,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 돌발
-    @ApiOperation(value = "VMS 폼 정보 조회-돌발(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-돌발(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/incident/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllIncidentByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllIncidentByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -67,9 +67,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 공사/행사
-    @ApiOperation(value = "VMS 폼 정보 조회-공사/행사(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-공사/행사(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/event/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllEventByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllEventByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -77,9 +77,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 홍보
-    @ApiOperation(value = "VMS 폼 정보 조회-홍보(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-홍보(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/notice/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllHongboByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllHongboByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -87,9 +87,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 우회도로
-    @ApiOperation(value = "VMS 폼 정보 조회-우회도로(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-우회도로(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/detour/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllDetourByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllDetourByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {
@@ -97,9 +97,9 @@ public class TbVmsTrfcInfrDsplSchAutoController {
     }
 
     // 재난안전
-    @ApiOperation(value = "VMS 폼 정보 조회-재난안전(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 정보 조회-재난안전(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/safety/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllSafetyByVmsType(
+    public List<TbVmsMsgDsplSchDto> findAllSafetyByVmsType(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {

+ 61 - 17
src/main/java/com/its/api/its/controller/vms/TbVmsTrfcInfrDsplSchController.java → src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchController.java

@@ -1,9 +1,10 @@
 package com.its.api.its.controller.vms;
 
 import com.its.api.its.model.dto.vms.TbVmsFormDto;
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
 import com.its.api.its.service.vms.TbVmsFormService;
-import com.its.api.its.service.vms.TbVmsTrfcInfrDsplSchService;
+import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -14,20 +15,21 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "12.VMS-3.스케줄관리-0.공통 스케줄 관리 공통")
+@Api(tags = "12.VMS-3.스케줄관리-0.공통")
 @Validated
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/schedule/common")
-public class TbVmsTrfcInfrDsplSchController {
+public class TbVmsMsgDsplSchController {
 
-    private final TbVmsTrfcInfrDsplSchService service;
+    private final TbVmsMsgDsplSchService service;
     private final TbVmsFormService formService;
 
     /*
-     * 스케쥴 관리에서 VMS 크기 유형이 변경될때 등록되어 있는 폼 을 조회한다.
-     * 자동, 고정, 기본 스케쥴에 따라 등록되어 있는 폼 유형을 조회한다.(고정, 기본 스케줄은 홍보 폼 만 등록 가능하다)
+      스케쥴 관리에서 VMS 크기 유형이 변경될때 등록되어 있는 폼 을 조회한다.
+      자동, 고정, 기본 스케쥴에 따라 등록되어 있는 폼 유형을 조회한다.(고정, 기본 스케줄은 홍보 폼 만 등록 가능하다)
      */
+
     /**
      * VMS 크기유형에 따른 모든 폼을 조회(조회 속도 때문에 사용하지 말자)
      * @param type
@@ -123,23 +125,63 @@ public class TbVmsTrfcInfrDsplSchController {
      * @param listReq
      * @return
      */
-    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> mergeInfoList(
+    public List<TbVmsMsgDsplSchDto> mergeInfoList(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id,
-            @RequestBody @Valid final List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
+            @RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
         return this.service.mergeInfoList(id, listReq);
     }
 
+    /**
+     * [전체 VMS 편집 - VMS 목록]
+     * @param type
+     * @param kind
+     * @param form
+     * @return
+     */
+    @ApiOperation(value = "VMS 스케줄 VMS 목록 조회[전체 VMS 편집](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchVmsListDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/vms-list/edit/{type}/{kind}/{form}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsMsgDsplSchVmsListDto> findAllByEditVmsList(
+            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
+            @PathVariable final String type,
+            @ApiParam(name = "kind", value = "VMS 스케줄 종류(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄,...)", example = "3", required = true)
+            @PathVariable final String kind,
+            @ApiParam(name = "form", value = "VMS 폼 번호", example = "10404", required = true)
+            @PathVariable final Integer form
+            ) {
+        return this.service.findAllByAllEditVmsList(type, kind, form, true);
+    }
+
+    /**
+     * [전체 VMS 등록 - VMS 목록]
+     * @param type
+     * @param kind
+     * @param form
+     * @return
+     */
+    @ApiOperation(value = "VMS 스케줄 VMS 목록 조회[전체 VMS 등록](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchVmsListDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/vms-list/add/{type}/{kind}/{form}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsMsgDsplSchVmsListDto> findAllByAddVmsList(
+            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
+            @PathVariable final String type,
+            @ApiParam(name = "kind", value = "VMS 스케줄 종류(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄,...)", example = "3", required = true)
+            @PathVariable final String kind,
+            @ApiParam(name = "form", value = "VMS 폼 번호", example = "10065", required = true)
+            @PathVariable final Integer form
+    ) {
+        return this.service.findAllByAllEditVmsList(type, kind, form, false);
+    }
+
     /**
      * VMS 폼 표출 스케줄 일괄 등록[전체 VMS 등록 - 저장]
      * @param listReq
      * @return
      */
-    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 등록 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 등록 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @PostMapping(value = "/batch", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> batchCreateInfoList(@RequestBody @Valid final List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
+    public List<TbVmsMsgDsplSchDto> batchCreateInfoList(@RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
         return this.service.batchCreateInfoList(listReq);
     }
 
@@ -148,9 +190,9 @@ public class TbVmsTrfcInfrDsplSchController {
      * @param listReq
      * @return
      */
-    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 편집 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보변경/생성-목록[전체 VMS 편집 - 저장](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @PutMapping(value = "/batch", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> batchMergeInfoList(@RequestBody @Valid final List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
+    public List<TbVmsMsgDsplSchDto> batchMergeInfoList(@RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> listReq) {
         return this.service.batchMergeInfoList(listReq);
     }
 
@@ -159,11 +201,13 @@ public class TbVmsTrfcInfrDsplSchController {
      * @param ids
      * @return
      */
-    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보삭제-목록-[전체 VMS 편집 - 삭제](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 교통 정보 표출 일정 정보삭제-목록-[전체 VMS 편집 - 삭제](TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq.class, responseContainer = "ArrayList")
     @DeleteMapping(value = "/batch", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> batchDeleteDataByIds(
-            @RequestBody @Valid final List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> ids) {
+    public List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> batchDeleteDataByIds(
+            @RequestBody @Valid final List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> ids) {
         return this.service.batchDeleteByIds(ids);
     }
 
+    //TODO: 스케줄에서 VMS 객체 선택 시 폼 이미지 다시 그리는 것 추가해야함.
+
 }

+ 6 - 6
src/main/java/com/its/api/its/controller/vms/TbVmsTrfcInfrDsplSchDefaultController.java → src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchDefaultController.java

@@ -1,7 +1,7 @@
 package com.its.api.its.controller.vms;
 
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
-import com.its.api.its.service.vms.TbVmsTrfcInfrDsplSchService;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -19,18 +19,18 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/schedule/default")
-public class TbVmsTrfcInfrDsplSchDefaultController {
+public class TbVmsMsgDsplSchDefaultController {
 
-    private final TbVmsTrfcInfrDsplSchService service;
+    private final TbVmsMsgDsplSchService service;
 
     /**
      * VMS 제어기 관리 번호로 폼 표출 스케줄 목록 조회
      * @param id
      * @return
      */
-    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllVmsDsplSchedule(
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {

+ 6 - 6
src/main/java/com/its/api/its/controller/vms/TbVmsTrfcInfrDsplSchFixedController.java → src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchFixedController.java

@@ -1,7 +1,7 @@
 package com.its.api.its.controller.vms;
 
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
-import com.its.api.its.service.vms.TbVmsTrfcInfrDsplSchService;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -19,18 +19,18 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/schedule/fixed")
-public class TbVmsTrfcInfrDsplSchFixedController {
+public class TbVmsMsgDsplSchFixedController {
 
-    private final TbVmsTrfcInfrDsplSchService service;
+    private final TbVmsMsgDsplSchService service;
 
     /**
      * VMS 제어기 관리 번호로 폼 표출 스케줄 목록 조회
      * @param id
      * @return
      */
-    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsTrfcInfrDsplSchDto.class, responseContainer = "ArrayList")
+    @ApiOperation(value = "VMS 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/{id}", produces = {"application/json; charset=utf8"})
-    public List<TbVmsTrfcInfrDsplSchDto> findAllVmsDsplSchedule(
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(
             @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
             @PathVariable final Long id
     ) {

+ 3 - 3
src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibControllerVMP0.java → src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp0Controller.java

@@ -1,7 +1,7 @@
 package com.its.api.its.controller.vms;
 
 import com.its.api.its.model.dto.vms.TbVmsSymbLibDto;
-import com.its.api.its.service.vms.TbVmsSymbLibServiceVMP0;
+import com.its.api.its.service.vms.TbVmsSymbLibVmp0Service;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -16,9 +16,9 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/manager/symbl-vmp0")
-public class TbVmsSymbLibControllerVMP0 {
+public class TbVmsSymbLibVmp0Controller {
 
-    private final TbVmsSymbLibServiceVMP0 service;
+    private final TbVmsSymbLibVmp0Service service;
 
     @ApiOperation(value = "VMS 심벌이미지 전체조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @GetMapping(value = "", produces = {"application/json; charset=utf8"})

+ 3 - 3
src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibControllerVMP1.java → src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp1Controller.java

@@ -1,6 +1,6 @@
 package com.its.api.its.controller.vms;
 
-import com.its.api.its.service.vms.TbVmsSymbLibServiceVMP1;
+import com.its.api.its.service.vms.TbVmsSymbLibVmp1Service;
 import com.its.api.its.model.dto.vms.TbVmsIfscRltnDto;
 import com.its.api.its.model.dto.vms.TbVmsSymbLibDto;
 import com.its.api.its.model.dto.vms.TbVmsSymbLibIfscVMP1Dto;
@@ -19,9 +19,9 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/manager/symbl-vmp1")
-public class TbVmsSymbLibControllerVMP1 {
+public class TbVmsSymbLibVmp1Controller {
 
-    private final TbVmsSymbLibServiceVMP1 service;
+    private final TbVmsSymbLibVmp1Service service;
     private final TbVmsIfscRltnService vmsIfscRltnService;
 
     @ApiOperation(value = "VMS 도형식 정보제공구간 전체조회(TB_VMS_CTLR, TB_VMS_IFSC, TB_VMS_IFSC_RLTN)", response = TbVmsIfscRltnDto.class)

+ 3 - 3
src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibControllerVMP2.java → src/main/java/com/its/api/its/controller/vms/TbVmsSymbLibVmp2Controller.java

@@ -1,6 +1,6 @@
 package com.its.api.its.controller.vms;
 
-import com.its.api.its.service.vms.TbVmsSymbLibServiceVMP2;
+import com.its.api.its.service.vms.TbVmsSymbLibVmp2Service;
 import com.its.api.its.model.dto.vms.TbVmsSymbLibDto;
 import com.its.api.its.model.dto.vms.TbVmsSymbLibIfscVMP2Dto;
 import io.swagger.annotations.Api;
@@ -17,9 +17,9 @@ import java.util.List;
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/api/vms/manager/symbl-vmp2")
-public class TbVmsSymbLibControllerVMP2 {
+public class TbVmsSymbLibVmp2Controller {
 
-    private final TbVmsSymbLibServiceVMP2 service;
+    private final TbVmsSymbLibVmp2Service service;
 
     @ApiOperation(value = "VMS 소통정보 이미지 전체조회(TB_VMS_SYMB_LIB)", response = TbVmsSymbLibDto.class)
     @GetMapping(value = "", produces = {"application/json; charset=utf8"})

+ 10 - 0
src/main/java/com/its/api/its/controller/vms/VmsCommonController.java

@@ -1,5 +1,6 @@
 package com.its.api.its.controller.vms;
 
+import com.its.api.its.model.dto.common.TrafDto;
 import com.its.api.its.model.dto.vms.*;
 import com.its.api.its.service.vms.*;
 import io.swagger.annotations.Api;
@@ -28,6 +29,7 @@ public class VmsCommonController {
     private final TbVmsFormObjectTypeService objectTypeService;
     private final TbVmsFontColrService fontColrService;
     private final TbVmsDsplPrstService dsplPrstService;
+    private final TbVmsCmtrInfrService vmsTrafService;
 
     @ApiOperation(value = "VMS 목록 조회(TB_VMS_CTLR)", response = TbVmsIfscRltnDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/vms-list", produces = {"application/json; charset=utf8"})
@@ -115,4 +117,12 @@ public class VmsCommonController {
         return this.dsplPrstService.findAllByIds(id);
     }
 
+    @ApiOperation(value = "VMS정보제공구간소통정보(TB_VMS_CMTRINFR)", response = TrafDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/vms-ifsc-traf/{id}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsCmtrInfrDto> findAllTrafVms(
+            @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
+            @PathVariable final Long id) {
+        return this.vmsTrafService.findAllTrafByVms(id);
+    }
+
 }

+ 2 - 0
src/main/java/com/its/api/its/model/dto/dashboard/facility/ItsFacilitySttsDto.java

@@ -27,9 +27,11 @@ public class ItsFacilitySttsDto {
     @ApiModelProperty("유선장애")
     @JsonProperty("error")
     private int ERRCNT;
+
     @ApiModelProperty("수집장애")
     @JsonProperty("col_err")
     private int COLCNT;
+
     @ApiModelProperty("도어열림")
     @JsonProperty("door_err")
     private int DOORCNT;

+ 1 - 1
src/main/java/com/its/api/its/model/dto/dashboard/facility/RseFacilitySttsDto.java

@@ -20,7 +20,7 @@ public class RseFacilitySttsDto {
     private String TYPE;
     @ApiModelProperty("전체")
     @JsonProperty("total")
-    private int TOT_CNT;
+    private int TOTCNT;
     @ApiModelProperty("유선정상")
     @JsonProperty("normal")
     private int NORCNT;

+ 12 - 0
src/main/java/com/its/api/its/model/dto/vms/TbVmsCmtrInfrDto.java

@@ -40,6 +40,18 @@ public class TbVmsCmtrInfrDto implements Serializable {
     private Integer trvlHh;
 
     // Code Description Field
+    @ApiModelProperty("VMS 정보제공구간 명")  // Y VARCHAR(60)
+    @JsonProperty("vms_ifsc_nm")
+    private String vmsIfscNm;
+
+    @ApiModelProperty("표출 시작 노드 명")  // Y VARCHAR(30)
+    @JsonProperty("dspl_strt_node_nm")
+    private String dsplStrtNodeNm;
+
+    @ApiModelProperty("표출 종료 노드 명")  // Y VARCHAR(30)
+    @JsonProperty("dspl_end_node_nm")
+    private String dsplEndNodeNm;
+
     @ApiModelProperty("소통 등급 코드 설명")
     @JsonProperty("cmtr_grad_desc")    // CMTR_GRAD_CD
     private String cmtrGradDesc;

+ 4 - 4
src/main/java/com/its/api/its/model/dto/vms/TbVmsTrfcInfrDsplSchDto.java → src/main/java/com/its/api/its/model/dto/vms/TbVmsMsgDsplSchDto.java

@@ -1,7 +1,7 @@
 package com.its.api.its.model.dto.vms;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.its.api.its.model.entity.vms.TbVmsTrfcInfrDsplSch;
+import com.its.api.its.model.entity.vms.TbVmsMsgDsplSch;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
@@ -17,7 +17,7 @@ import java.io.Serializable;
 @Data
 @Builder
 @ApiModel("TbVmsTrfcInfrDsplSchDto(VMS 교통 정보 표출 일정)")
-public class TbVmsTrfcInfrDsplSchDto implements Serializable {
+public class TbVmsMsgDsplSchDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
@@ -223,8 +223,8 @@ public class TbVmsTrfcInfrDsplSchDto implements Serializable {
             this.fourImgIfscId = four_img_ifsc_id;
         }
 
-        public TbVmsTrfcInfrDsplSch toEntity() {
-            TbVmsTrfcInfrDsplSch entity = TbVmsTrfcInfrDsplSch.builder()
+        public TbVmsMsgDsplSch toEntity() {
+            TbVmsMsgDsplSch entity = TbVmsMsgDsplSch.builder()
                     .vmsCtlrNmbr(this.vmsCtlrNmbr)
                     .trfcSituTypeCd(this.trfcSituTypeCd)
                     .phase(this.phase)

+ 76 - 0
src/main/java/com/its/api/its/model/dto/vms/TbVmsMsgDsplSchVmsListDto.java

@@ -0,0 +1,76 @@
+package com.its.api.its.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.its.model.entity.vms.TbVmsCtlr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * VMS 교통 정보 표출 일정 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsMsgDsplSchVmsListDto(VMS 교통 정보 표출 일정 편집 VMS 정보)")
+public class TbVmsMsgDsplSchVmsListDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @JsonProperty("vms_ctlr_nmbr")
+    private Long vmsCtlrNmbr;
+
+    @ApiModelProperty("스케줄 유형 코드(0:교통정보,1:돌발,2:공사/행사문안,3:홍보문안,4:우회도로,5:고정스케줄, 6:기본스케줄)")  // N VARCHAR(7)
+    @JsonProperty("trfc_situ_type_cd")
+    private String trfcSituTypeCd;
+
+    @ApiModelProperty("PHASE")  // N NUMBER(2)
+    @JsonProperty("phase")
+    private Integer phase;
+
+    @ApiModelProperty("VMS FORM ID")  // Y NUMBER(5)
+    @JsonProperty("vms_form_id")
+    private Integer vmsFormId;
+
+    @ApiModelProperty("표출 시간")  // Y NUMBER(3)
+    @JsonProperty("dspl_hh")
+    private Integer dsplHh;
+
+    @ApiModelProperty("표출 시작 시간")  // Y VARCHAR(14)
+    @JsonProperty("dspl_strt_hh")
+    private String dsplStrtHh;
+
+    @ApiModelProperty("표출 종료 시간")  // Y VARCHAR(14)
+    @JsonProperty("dspl_end_hh")
+    private String dsplEndHh;
+
+    @ApiModelProperty("사용여부(Y:시용,N:사용안함)")  // Y CHAR(1)
+    @JsonProperty("use_yn")
+    private String useYn;
+
+    /**
+     * VMS 편집 목록에 VMS 목록 조회시 사용됨
+     */
+    @ApiModelProperty("VMS 제어기 ID")  // Y VARCHAR(30)
+    @JsonProperty("vms_ctlr_id")
+    private String vmsCtlrId;
+
+    @ApiModelProperty("VMS 명")  // Y VARCHAR(40)
+    @JsonProperty("vms_nm")
+    private String vmsNm;
+
+    @ApiModelProperty("VMS 스케줄 선택")
+    @JsonProperty("select_yn")
+    private String selectYn;
+
+    public void setVmsInfo(TbVmsCtlr vms, boolean isSelect) {
+        if (vms != null) {
+            this.vmsCtlrId = vms.getVmsCtlrId();
+            this.vmsNm = vms.getVmsNm();
+        }
+        this.selectYn = isSelect ? "Y" : "N";
+    }
+
+}

+ 26 - 4
src/main/java/com/its/api/its/model/entity/vms/TbVmsCmtrInfr.java

@@ -7,11 +7,10 @@ import com.its.api.utils.ItsUtils;
 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.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.io.Serializable;
 
 /**
@@ -48,6 +47,11 @@ public class TbVmsCmtrInfr implements Serializable {
     @Column(name = "TRVL_HH", columnDefinition = "NUMBER", length = 6)
     private Integer trvlHh;
 
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="VMS_IFSC_ID", referencedColumnName = "VMS_IFSC_ID")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbVmsIfsc vmsIfsc = new TbVmsIfsc();
+
     public TbVmsCmtrInfrDto toDto() {
         TbVmsCmtrInfrDto dto = TbVmsCmtrInfrDto.builder()
                 .vmsIfscId(this.vmsIfscId)
@@ -57,6 +61,24 @@ public class TbVmsCmtrInfr implements Serializable {
                 .trvlHh(this.trvlHh)
                 .build();
 
+        if (this.vmsIfsc != null) {
+            dto.setVmsIfscNm(this.vmsIfsc.getVmsIfscNm());
+            dto.setDsplStrtNodeNm(this.vmsIfsc.getDsplStrtNodeNm());
+            dto.setDsplEndNodeNm(this.vmsIfsc.getDsplEndNodeNm());
+        }
+
+        if (("1").equals(dto.getCmtrGradCd())) {
+            dto.setCmtrGradDesc("원활");
+        }
+        else if (("2").equals(dto.getCmtrGradCd())) {
+            dto.setCmtrGradDesc("지체");
+        }
+        else if (("3").equals(dto.getCmtrGradCd())) {
+            dto.setCmtrGradDesc("정체");
+        }
+        else {
+            dto.setCmtrGradDesc("정보없음");
+        }
         return dto;
     }
 

+ 22 - 7
src/main/java/com/its/api/its/model/entity/vms/TbVmsTrfcInfrDsplSch.java → src/main/java/com/its/api/its/model/entity/vms/TbVmsMsgDsplSch.java

@@ -1,6 +1,7 @@
 package com.its.api.its.model.entity.vms;
 
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
 import com.its.api.utils.ItsUtils;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -21,8 +22,8 @@ import java.io.Serializable;
 @ApiModel("VMS 교통 정보 표출 일정")
 @Entity
 @Table(name = "TB_VMS_TRFC_INFR_DSPL_SCH")
-@IdClass(TbVmsTrfcInfrDsplSchKey.class)
-public class TbVmsTrfcInfrDsplSch implements Serializable {
+@IdClass(TbVmsMsgDsplSchKey.class)
+public class TbVmsMsgDsplSch implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
@@ -105,8 +106,8 @@ public class TbVmsTrfcInfrDsplSch implements Serializable {
     @NotFound(action = NotFoundAction.IGNORE)
     private TbVmsForm form = new TbVmsForm();
 
-    public TbVmsTrfcInfrDsplSchDto toDto() {
-        TbVmsTrfcInfrDsplSchDto dto = TbVmsTrfcInfrDsplSchDto.builder()
+    public TbVmsMsgDsplSchDto toDto() {
+        TbVmsMsgDsplSchDto dto = TbVmsMsgDsplSchDto.builder()
                 .vmsCtlrNmbr(this.vmsCtlrNmbr)
                 .trfcSituTypeCd(this.trfcSituTypeCd)
                 .phase(this.phase)
@@ -132,14 +133,28 @@ public class TbVmsTrfcInfrDsplSch implements Serializable {
         }
         return dto;
     }
+    public TbVmsMsgDsplSchVmsListDto toVmsListDto() {
+        TbVmsMsgDsplSchVmsListDto dto = TbVmsMsgDsplSchVmsListDto.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .trfcSituTypeCd(this.trfcSituTypeCd)
+                .phase(this.phase)
+                .vmsFormId(this.vmsFormId)
+                .dsplHh(this.dsplHh)
+                .dsplStrtHh(this.dsplStrtHh)
+                .dsplEndHh(this.dsplEndHh)
+                .useYn(this.useYn)
+                .build();
+
+        return dto;
+    }
 
-    public TbVmsTrfcInfrDsplSch(Long vmsCtlrNmbr, String trfcSituTypeCd, Integer phase) {
+    public TbVmsMsgDsplSch(Long vmsCtlrNmbr, String trfcSituTypeCd, Integer phase) {
         this.vmsCtlrNmbr = vmsCtlrNmbr;
         this.trfcSituTypeCd = trfcSituTypeCd;
         this.phase = phase;
     }
 
-    public void updateInfo(TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
+    public void updateInfo(TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
         this.vmsFormId = req.getVmsFormId();
         this.frstVmsIfscId = req.getFrstVmsIfscId();
         this.secdVmsIfscId = req.getSecdVmsIfscId();

+ 1 - 1
src/main/java/com/its/api/its/model/entity/vms/TbVmsTrfcInfrDsplSchKey.java → src/main/java/com/its/api/its/model/entity/vms/TbVmsMsgDsplSchKey.java

@@ -13,7 +13,7 @@ import java.io.Serializable;
 @Data
 @NoArgsConstructor(access = AccessLevel.PROTECTED)
 @AllArgsConstructor
-public class TbVmsTrfcInfrDsplSchKey implements Serializable {
+public class TbVmsMsgDsplSchKey implements Serializable {
     private static final long serialVersionUID = 1L;
 
     // VMS_CTLR_NMBR, VMS 제어기 번호  // N NUMBER(10)

+ 10 - 0
src/main/java/com/its/api/its/repository/vms/TbVmsCmtrInfrRepository.java

@@ -3,9 +3,19 @@ package com.its.api.its.repository.vms;
 import com.its.api.its.model.entity.vms.TbVmsCmtrInfr;
 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 TbVmsCmtrInfrRepository extends JpaRepository<TbVmsCmtrInfr, Long>, JpaSpecificationExecutor<TbVmsCmtrInfr> {
 
+    @Query("select p from TbVmsCmtrInfr p inner join fetch p.vmsIfsc")
+    List<TbVmsCmtrInfr> findAll();
+
+    @Query("select p from TbVmsCmtrInfr p inner join fetch p.vmsIfsc " +
+           " where p.vmsIfscId in (select s.vmsIfscId from TbVmsIfscRltn s where s.vmsCtlrNmbr = :vmsCtlrNmbr)")
+    List<TbVmsCmtrInfr> findAllByVms(Long vmsCtlrNmbr);
+
 }

+ 4 - 0
src/main/java/com/its/api/its/repository/vms/TbVmsCtlrRepository.java

@@ -16,4 +16,8 @@ public interface TbVmsCtlrRepository extends JpaRepository<TbVmsCtlr, Long>, Jpa
 
     @Query("select p from TbVmsCtlr p inner join fetch p.usagType inner join fetch p.type where p.vmsCtlrNmbr in :vmsIds and p.delYn = 'N'")
     List<TbVmsCtlr> findAllByIds(List<Long> vmsIds);
+
+    @Query("select p from TbVmsCtlr p inner join fetch p.usagType inner join fetch p.type where p.vmsTypeCd = :vmsTypeCd and p.delYn = 'N'")
+    List<TbVmsCtlr> findAllByTypeCd(String vmsTypeCd);
+
 }

+ 29 - 0
src/main/java/com/its/api/its/repository/vms/TbVmsMsgDsplSchRepository.java

@@ -0,0 +1,29 @@
+package com.its.api.its.repository.vms;
+
+import com.its.api.its.model.entity.vms.TbVmsMsgDsplSch;
+import com.its.api.its.model.entity.vms.TbVmsMsgDsplSchKey;
+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.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbVmsMsgDsplSchRepository extends JpaRepository<TbVmsMsgDsplSch, TbVmsMsgDsplSchKey>, JpaSpecificationExecutor<TbVmsMsgDsplSch> {
+
+    @Modifying
+    @Query("delete from TbVmsMsgDsplSch p where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd in :trfcSituTypeCd")
+    void deleteDataByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, List<String> trfcSituTypeCd);
+
+    @Query("select p from TbVmsMsgDsplSch p inner join fetch p.form where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd in :trfcSituTypeCd")
+    List<TbVmsMsgDsplSch> findAllByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, List<String> trfcSituTypeCd);
+
+    @Query("select nvl(max(p.phase), 0) + 1 as maxPhase from TbVmsMsgDsplSch p where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd = :trfcSituTypeCd")
+    Integer findMaxPhaseByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, String trfcSituTypeCd);
+
+    @Query("select p from TbVmsMsgDsplSch p inner join fetch p.form where p.trfcSituTypeCd = :trfcSituTypeCd and p.vmsFormId = :vmsFormId")
+    List<TbVmsMsgDsplSch> findAllByAllEditVmsList(String trfcSituTypeCd, Integer vmsFormId);
+
+}

+ 0 - 26
src/main/java/com/its/api/its/repository/vms/TbVmsTrfcInfrDsplSchRepository.java

@@ -1,26 +0,0 @@
-package com.its.api.its.repository.vms;
-
-import com.its.api.its.model.entity.vms.TbVmsTrfcInfrDsplSch;
-import com.its.api.its.model.entity.vms.TbVmsTrfcInfrDsplSchKey;
-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.stereotype.Repository;
-
-import java.util.List;
-
-@Repository
-public interface TbVmsTrfcInfrDsplSchRepository extends JpaRepository<TbVmsTrfcInfrDsplSch, TbVmsTrfcInfrDsplSchKey>, JpaSpecificationExecutor<TbVmsTrfcInfrDsplSch> {
-
-    @Modifying
-    @Query("delete from TbVmsTrfcInfrDsplSch p where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd in :trfcSituTypeCd")
-    void deleteDataByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, List<String> trfcSituTypeCd);
-
-    @Query("select p from TbVmsTrfcInfrDsplSch p where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd in :trfcSituTypeCd")
-    List<TbVmsTrfcInfrDsplSch> findAllByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, List<String> trfcSituTypeCd);
-
-    @Query("select nvl(max(p.phase), 0) + 1 as maxPhase from TbVmsTrfcInfrDsplSch p where p.vmsCtlrNmbr = :vmsCtlrNmbr and p.trfcSituTypeCd = :trfcSituTypeCd")
-    Integer findMaxPhaseByVmsCtrlTrfcSituTypeCd(Long vmsCtlrNmbr, String trfcSituTypeCd);
-
-}

+ 16 - 0
src/main/java/com/its/api/its/service/vms/TbVmsCmtrInfrService.java

@@ -48,6 +48,7 @@ public class TbVmsCmtrInfrService {
      * 소통정보조회
      * @return
      */
+    @Transactional(readOnly = true)
     public List<TrafDto> findAllTraf() {
         List<TrafDto> result = new ArrayList<>();
         List<TbVmsCmtrInfr> data = this.repo.findAll();
@@ -56,4 +57,19 @@ public class TbVmsCmtrInfrService {
         });
         return result;
     }
+
+    /**
+     * VMS 제어기별 VMS 정보제공구간 소통정보 조회
+     * @param id
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbVmsCmtrInfrDto> findAllTrafByVms(Long id) {
+        List<TbVmsCmtrInfrDto> result = new ArrayList<>();
+        List<TbVmsCmtrInfr> data = this.repo.findAllByVms(id);
+        data.forEach(obj -> {
+            result.add(obj.toDto());
+        });
+        return result;
+    }
 }

+ 111 - 46
src/main/java/com/its/api/its/service/vms/TbVmsTrfcInfrDsplSchService.java → src/main/java/com/its/api/its/service/vms/TbVmsMsgDsplSchService.java

@@ -1,9 +1,13 @@
 package com.its.api.its.service.vms;
 
-import com.its.api.its.model.dto.vms.TbVmsTrfcInfrDsplSchDto;
-import com.its.api.its.model.entity.vms.TbVmsTrfcInfrDsplSch;
-import com.its.api.its.model.entity.vms.TbVmsTrfcInfrDsplSchKey;
-import com.its.api.its.repository.vms.TbVmsTrfcInfrDsplSchRepository;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
+import com.its.api.its.model.entity.vms.TbVmsCtlr;
+import com.its.api.its.model.entity.vms.TbVmsMsgDsplSch;
+import com.its.api.its.model.entity.vms.TbVmsMsgDsplSchKey;
+import com.its.api.its.repository.vms.TbVmsCtlrRepository;
+import com.its.api.its.repository.vms.TbVmsMsgDsplSchRepository;
+import com.its.api.utils.ItsUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -14,21 +18,22 @@ import java.util.*;
 @Slf4j
 @RequiredArgsConstructor
 @Service
-public class TbVmsTrfcInfrDsplSchService {
+public class TbVmsMsgDsplSchService {
 
-    private final TbVmsTrfcInfrDsplSchRepository repo;
+    private final TbVmsMsgDsplSchRepository repo;
+    private final TbVmsCtlrRepository vmsRepo;
 
     // 데이터 1건 조회, 없으면 exception
-    private TbVmsTrfcInfrDsplSch requireOne(TbVmsTrfcInfrDsplSchKey id) {
+    private TbVmsMsgDsplSch requireOne(TbVmsMsgDsplSchKey id) {
         return this.repo.findById(id)
                 .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
     }
 
     // 전체 데이터 조회
     @Transactional(readOnly = true)
-    public List<TbVmsTrfcInfrDsplSchDto> findAll() {
-        List<TbVmsTrfcInfrDsplSchDto> result = new ArrayList<>();
-        List<TbVmsTrfcInfrDsplSch> data = this.repo.findAll();
+    public List<TbVmsMsgDsplSchDto> findAll() {
+        List<TbVmsMsgDsplSchDto> result = new ArrayList<>();
+        List<TbVmsMsgDsplSch> data = this.repo.findAll();
         data.forEach(obj -> {
             if (!("5").equals(obj.getTrfcSituTypeCd()) &&
                 !("6").equals(obj.getTrfcSituTypeCd())) {
@@ -40,15 +45,15 @@ public class TbVmsTrfcInfrDsplSchService {
 
     // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
     @Transactional(readOnly = true)
-    public TbVmsTrfcInfrDsplSchDto findById(TbVmsTrfcInfrDsplSchKey id) {
-        TbVmsTrfcInfrDsplSch entity = requireOne(id);
+    public TbVmsMsgDsplSchDto findById(TbVmsMsgDsplSchKey id) {
+        TbVmsMsgDsplSch entity = requireOne(id);
         return entity.toDto();
     }
 
     // 데이터 변경
     @Transactional
-    public TbVmsTrfcInfrDsplSchDto updateById(TbVmsTrfcInfrDsplSchKey id, TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
-        TbVmsTrfcInfrDsplSch entity = requireOne(id);
+    public TbVmsMsgDsplSchDto updateById(TbVmsMsgDsplSchKey id, TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
+        TbVmsMsgDsplSch entity = requireOne(id);
         entity.updateInfo(req);
         this.repo.save(entity);
         return entity.toDto();
@@ -56,16 +61,16 @@ public class TbVmsTrfcInfrDsplSchService {
 
     // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
     @Transactional
-    public TbVmsTrfcInfrDsplSchDto mergeInfo(TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
-        TbVmsTrfcInfrDsplSch obj = req.toEntity();
+    public TbVmsMsgDsplSchDto mergeInfo(TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req) {
+        TbVmsMsgDsplSch obj = req.toEntity();
         this.repo.save(obj);
         return obj.toDto();
     }
 
     // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
     @Transactional
-    public TbVmsTrfcInfrDsplSchDto deleteById(TbVmsTrfcInfrDsplSchKey id) {
-        TbVmsTrfcInfrDsplSch entity = requireOne(id);
+    public TbVmsMsgDsplSchDto deleteById(TbVmsMsgDsplSchKey id) {
+        TbVmsMsgDsplSch entity = requireOne(id);
         this.repo.deleteById(id);
         return entity.toDto();
     }
@@ -76,9 +81,9 @@ public class TbVmsTrfcInfrDsplSchService {
      * @param trfcSituTypeCd
      * @return
      */
-    public List<TbVmsTrfcInfrDsplSchDto> findAllVmsDsplSchedule(Long id, List<String> trfcSituTypeCd) {
-        List<TbVmsTrfcInfrDsplSchDto> result = new ArrayList<>();
-        List<TbVmsTrfcInfrDsplSch> data = this.repo.findAllByVmsCtrlTrfcSituTypeCd(id, trfcSituTypeCd);
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(Long id, List<String> trfcSituTypeCd) {
+        List<TbVmsMsgDsplSchDto> result = new ArrayList<>();
+        List<TbVmsMsgDsplSch> data = this.repo.findAllByVmsCtrlTrfcSituTypeCd(id, trfcSituTypeCd);
         data.forEach(obj -> {
             result.add(obj.toDto());
         });
@@ -90,42 +95,42 @@ public class TbVmsTrfcInfrDsplSchService {
      * @param id
      * @return
      */
-    public List<TbVmsTrfcInfrDsplSchDto> findAllVmsDsplSchedule(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(Long id) {
         List<String> trfcSituTypeCd = Arrays.asList("0", "1", "2", "3", "4", "7", "8");
         return findAllVmsDsplSchedule(id, trfcSituTypeCd);
     }
     // 교통정보
-    public List<TbVmsTrfcInfrDsplSchDto> findAllTraffic(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllTraffic(Long id) {
         List<String> formTypeCd = Collections.singletonList("0");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 정체
-    public List<TbVmsTrfcInfrDsplSchDto> findAllCongest(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllCongest(Long id) {
         List<String> formTypeCd = Collections.singletonList("7");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 돌발
-    public List<TbVmsTrfcInfrDsplSchDto> findAllIncident(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllIncident(Long id) {
         List<String> formTypeCd = Collections.singletonList("1");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 공사/행사
-    public List<TbVmsTrfcInfrDsplSchDto> findAllEvent(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllEvent(Long id) {
         List<String> formTypeCd = Collections.singletonList("2");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 홍보
-    public List<TbVmsTrfcInfrDsplSchDto> findAllHongbo(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllHongbo(Long id) {
         List<String> formTypeCd = Collections.singletonList("3");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 우회도로
-    public List<TbVmsTrfcInfrDsplSchDto> findAllDetour(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllDetour(Long id) {
         List<String> formTypeCd = Collections.singletonList("4");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
     // 재난안전
-    public List<TbVmsTrfcInfrDsplSchDto> findAllSafety(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllSafety(Long id) {
         List<String> formTypeCd = Collections.singletonList("8");
         return findAllVmsDsplSchedule(id, formTypeCd);
     }
@@ -135,7 +140,7 @@ public class TbVmsTrfcInfrDsplSchService {
      * @param id
      * @return
      */
-    public List<TbVmsTrfcInfrDsplSchDto> findAllDefault(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllDefault(Long id) {
         List<String> trfcSituTypeCd = Collections.singletonList("6");
         return findAllVmsDsplSchedule(id, trfcSituTypeCd);
     }
@@ -145,7 +150,7 @@ public class TbVmsTrfcInfrDsplSchService {
      * @param id
      * @return
      */
-    public List<TbVmsTrfcInfrDsplSchDto> findAllFixed(Long id) {
+    public List<TbVmsMsgDsplSchDto> findAllFixed(Long id) {
         List<String> trfcSituTypeCd = Collections.singletonList("5");
         return findAllVmsDsplSchedule(id, trfcSituTypeCd);
     }
@@ -159,8 +164,8 @@ public class TbVmsTrfcInfrDsplSchService {
      * @return
      */
     @Transactional
-    public List<TbVmsTrfcInfrDsplSchDto> mergeInfoList(Long id, List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
-        List<TbVmsTrfcInfrDsplSchDto> result = new ArrayList<>();
+    public List<TbVmsMsgDsplSchDto> mergeInfoList(Long id, List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
+        List<TbVmsMsgDsplSchDto> result = new ArrayList<>();
 
         HashSet<String> trfcSituTypeCdSet = new HashSet<>();
         reqList.forEach(obj -> {
@@ -171,11 +176,18 @@ public class TbVmsTrfcInfrDsplSchService {
             }
             trfcSituTypeCdSet.add(obj.getTrfcSituTypeCd());
         });
+
+        /**
+         * 기존 데이터를 모두 삭제
+         */
         List<String> trfcSituTypeCd = new ArrayList<>(trfcSituTypeCdSet);
         this.repo.deleteDataByVmsCtrlTrfcSituTypeCd(id, trfcSituTypeCd);
 
-        for (TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
-            TbVmsTrfcInfrDsplSch obj = req.toEntity();
+        /**
+         * 요청 데이터 저장
+         */
+        for (TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
+            TbVmsMsgDsplSch obj = req.toEntity();
             this.repo.save(obj);    // INSERT
             result.add(obj.toDto());
         }
@@ -190,10 +202,10 @@ public class TbVmsTrfcInfrDsplSchService {
      * @return
      */
     @Transactional
-    public List<TbVmsTrfcInfrDsplSchDto> batchCreateInfoList(List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
-        List<TbVmsTrfcInfrDsplSchDto> result = new ArrayList<>();
-        for (TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
-            TbVmsTrfcInfrDsplSch obj = req.toEntity();
+    public List<TbVmsMsgDsplSchDto> batchCreateInfoList(List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
+        List<TbVmsMsgDsplSchDto> result = new ArrayList<>();
+        for (TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
+            TbVmsMsgDsplSch obj = req.toEntity();
             if (!("8".equals(req.getTrfcSituTypeCd()))) {
                 // 재난 안전 폼이 아닌경우 해당 폼 유형에서 최대 PHASE 로 설정 한다.
                 int maxPhase = this.repo.findMaxPhaseByVmsCtrlTrfcSituTypeCd(req.getVmsCtlrNmbr(), req.getTrfcSituTypeCd());
@@ -213,10 +225,10 @@ public class TbVmsTrfcInfrDsplSchService {
      * @return
      */
     @Transactional
-    public List<TbVmsTrfcInfrDsplSchDto> batchMergeInfoList(List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
-        List<TbVmsTrfcInfrDsplSchDto> result = new ArrayList<>();
-        for (TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
-            TbVmsTrfcInfrDsplSch obj = req.toEntity();
+    public List<TbVmsMsgDsplSchDto> batchMergeInfoList(List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq> reqList) {
+        List<TbVmsMsgDsplSchDto> result = new ArrayList<>();
+        for (TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchUpdReq req : reqList) {
+            TbVmsMsgDsplSch obj = req.toEntity();
             this.repo.save(obj);    // INSERT or UPDATE
             result.add(obj.toDto());
         }
@@ -229,10 +241,10 @@ public class TbVmsTrfcInfrDsplSchService {
      * @return
      */
     @Transactional
-    public List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> batchDeleteByIds(List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> ids) {
-        List<TbVmsTrfcInfrDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> result = new ArrayList<>();
+    public List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> batchDeleteByIds(List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> ids) {
+        List<TbVmsMsgDsplSchDto.TbVmsTrfcInfrDsplSchDelReq> result = new ArrayList<>();
         ids.forEach(obj -> {
-            TbVmsTrfcInfrDsplSchKey key = new TbVmsTrfcInfrDsplSchKey(obj.getVmsCtlrNmbr(), obj.getTrfcSituTypeCd(), obj.getPhase());
+            TbVmsMsgDsplSchKey key = new TbVmsMsgDsplSchKey(obj.getVmsCtlrNmbr(), obj.getTrfcSituTypeCd(), obj.getPhase());
             try {
                 this.repo.deleteById(key);
                 result.add(obj);
@@ -244,4 +256,57 @@ public class TbVmsTrfcInfrDsplSchService {
         return result;
     }
 
+    /**
+     * VMS 일괄 편집 시 VMS 목록 조회
+     * @param vmsSizeType
+     * @param trfcSituTypeCd
+     * @param vmsFormId
+     * @param isEdit
+     * @return
+     */
+    public List<TbVmsMsgDsplSchVmsListDto> findAllByAllEditVmsList(String vmsSizeType, String trfcSituTypeCd, Integer vmsFormId, boolean isEdit) {
+        List<TbVmsMsgDsplSchVmsListDto> result = new ArrayList<>();
+
+        Map<Long, TbVmsCtlr> vmsMap = new HashMap<>();
+        List<TbVmsCtlr> vmsList = this.vmsRepo.findAllByTypeCd(vmsSizeType);
+        vmsList.forEach(obj -> {
+            vmsMap.put(obj.getVmsCtlrNmbr(), obj);
+        });
+        //Map<Long, TbVmsCtlr> vmsList = vmsList.stream().collect(Collectors.toMap(TbVmsCtlr::getVmsCtlrNmbr, Function.identity()));
+
+        Set<Long> schSet = new HashSet<>();
+        List<TbVmsMsgDsplSch> data = this.repo.findAllByAllEditVmsList(trfcSituTypeCd, vmsFormId);
+        data.forEach(obj -> {
+            TbVmsMsgDsplSchVmsListDto dto = obj.toVmsListDto();
+            log.error("EDT: {}", obj.getVmsCtlrNmbr());
+            schSet.add(dto.getVmsCtlrNmbr());
+            dto.setVmsInfo(vmsMap.get(dto.getVmsCtlrNmbr()), isEdit);
+            result.add(dto);
+        });
+
+        if (!isEdit) {
+            /** 일괄 등록 인 경우 스케줄에 등록되지 않은 VMS 를 추가해 준다. **/
+            vmsList.forEach(obj -> {
+                if (schSet.add(obj.getVmsCtlrNmbr())) {
+                    log.error("ADD: {}", obj.getVmsCtlrNmbr());
+                    /** 등록되어 있지 않음 VMS 임 **/
+                    TbVmsMsgDsplSchVmsListDto dto = TbVmsMsgDsplSchVmsListDto.builder()
+                            .vmsCtlrNmbr(obj.getVmsCtlrNmbr())
+                            .trfcSituTypeCd(trfcSituTypeCd)
+                            .phase(1)
+                            .vmsFormId(vmsFormId)
+                            .dsplHh(4)
+                            .dsplStrtHh(ItsUtils.getSysTime())
+                            .dsplEndHh("20991231235959")
+                            .useYn("Y")
+                            .vmsCtlrId(obj.getVmsCtlrId())
+                            .vmsNm(obj.getVmsNm())
+                            .selectYn("Y")
+                            .build();
+                    result.add(dto);
+                }
+            });
+        }
+        return result;
+    }
 }

+ 2 - 2
src/main/java/com/its/api/its/service/vms/TbVmsSymbLibServiceVMP0.java → src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp0Service.java

@@ -11,9 +11,9 @@ import java.util.ConcurrentModificationException;
 
 @Slf4j
 @Service
-public class TbVmsSymbLibServiceVMP0 extends TbVmsSymbLibService {
+public class TbVmsSymbLibVmp0Service extends TbVmsSymbLibService {
 
-    public TbVmsSymbLibServiceVMP0(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository) {
+    public TbVmsSymbLibVmp0Service(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository) {
         super("VMP0", repo, formObjectRepository);
     }
 

+ 2 - 2
src/main/java/com/its/api/its/service/vms/TbVmsSymbLibServiceVMP1.java → src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp1Service.java

@@ -16,11 +16,11 @@ import java.util.List;
 
 @Slf4j
 @Service
-public class TbVmsSymbLibServiceVMP1 extends TbVmsSymbLibService {
+public class TbVmsSymbLibVmp1Service extends TbVmsSymbLibService {
 
     private final TbVmsSymbIfscService ifscService;
 
-    public TbVmsSymbLibServiceVMP1(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
+    public TbVmsSymbLibVmp1Service(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
         super("VMP1", repo, formObjectRepository);
         this.ifscService = ifscService;
     }

+ 2 - 2
src/main/java/com/its/api/its/service/vms/TbVmsSymbLibServiceVMP2.java → src/main/java/com/its/api/its/service/vms/TbVmsSymbLibVmp2Service.java

@@ -16,11 +16,11 @@ import java.util.ConcurrentModificationException;
 
 @Slf4j
 @Service
-public class TbVmsSymbLibServiceVMP2 extends TbVmsSymbLibService {
+public class TbVmsSymbLibVmp2Service extends TbVmsSymbLibService {
 
     private final TbVmsSymbIfscService ifscService;
 
-    public TbVmsSymbLibServiceVMP2(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
+    public TbVmsSymbLibVmp2Service(TbVmsSymbLibRepository repo, TbVmsFormObjectRepository formObjectRepository, TbVmsSymbIfscService ifscService) {
         super("VMP2", repo, formObjectRepository);
         this.ifscService = ifscService;
     }

+ 22 - 0
src/main/java/com/its/api/utils/ItsUtils.java

@@ -59,6 +59,28 @@ public final class ItsUtils
 		return min > 10 ? "Y" : "N";
 	}
 
+	public static String getRseCommStts(String prcsDt) {
+
+		if (prcsDt == null || prcsDt.length() != 14) {
+			return "Y";
+		}
+
+		Date startDateTime = getPrcsDt(prcsDt);
+		if (startDateTime == null) {
+			return "0";
+		}
+		Calendar currDateTime = Calendar.getInstance();
+
+		GregorianCalendar gcStartDateTime = new GregorianCalendar();
+		GregorianCalendar gcEndDateTime = new GregorianCalendar();
+		gcStartDateTime.setTime(startDateTime);
+		gcEndDateTime.setTime(currDateTime.getTime());
+
+		long gap = gcEndDateTime.getTimeInMillis() - gcStartDateTime.getTimeInMillis();
+		long min = gap / 1000L / 60L;
+		return min > 30 ? "0" : "1";
+	}
+
 	public static String getServiceYn(String prcsDt) {
 
 		if (prcsDt == null || prcsDt.length() != 14) {

+ 58 - 0
src/main/java/com/its/api/utis/controller/UtisController.java

@@ -0,0 +1,58 @@
+package com.its.api.utis.controller;
+
+import com.its.api.its.model.dto.dashboard.facility.RseFacilitySttsDto;
+import com.its.api.utis.model.dto.RsemstDto;
+import com.its.api.utis.model.dto.RseopstateTotalDto;
+import com.its.api.utis.model.dto.UtisRseStateDto;
+import com.its.api.utis.service.RsemstService;
+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 = "90.시설물(DASHBOARD)-3.RSE")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/dashboard/facility/rse")
+public class UtisController {
+
+    private final RsemstService service;
+
+    @ApiOperation(value = "RSE.00.RSE 정보 전체조회(RSEMST)", response = RsemstDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<RsemstDto> findAll() {
+        return service.findAll();
+    }
+
+    @ApiOperation(value = "RSE.00.RSE 정보 개별조회(RSEMST)", response = RsemstDto.class)
+    @GetMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
+    public RsemstDto findById(@PathVariable final String id) {
+        return this.service.findById(id);
+    }
+
+    @ApiOperation(value = "RSE.01.시설물상태(RSEMST, RSEOPSTATE)", response = RseFacilitySttsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/stts", produces = {"application/json; charset=utf8"})
+    public RseopstateTotalDto findAllStateTotal() {
+        return this.service.findAllRseSttsTotal();
+    }
+
+    @ApiOperation(value = "RSE.02.RSE통신상태(RSEMST, RSEOPSTATE)", response = UtisRseStateDto.RseCommSttsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/comm", produces = {"application/json; charset=utf8"})
+    public List<UtisRseStateDto.RseCommSttsDto> findAllCommStts() {
+        return this.service.findAllCommStts();
+    }
+
+    @ApiOperation(value = "RSE.03.RSE 시설물/통신상태정보 조회(RSEMST, RSEOPSTATE)", response = UtisRseStateDto.class)
+    @GetMapping(value = "/all", produces = {"application/json; charset=utf8"})
+    public UtisRseStateDto findRseSttsAll() {
+        return this.service.findAllRseStts();
+    }
+
+}

+ 97 - 0
src/main/java/com/its/api/utis/model/dto/RsemstDto.java

@@ -0,0 +1,97 @@
+package com.its.api.utis.model.dto;
+
+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.time.LocalDateTime;
+
+/**
+ * RSE마스터 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("RsemstDto(RSE마스터)")
+public class RsemstDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("RSEID")  // N VARCHAR(16)
+    @JsonProperty("rseid")
+    private String rseid;
+
+    @ApiModelProperty("설치일자")  // Y DATE(0)
+    @JsonProperty("instdt")
+    private LocalDateTime instdt;
+
+    @ApiModelProperty("UTIS도시코드")  // Y NUMBER(3)
+    @JsonProperty("citycd")
+    private Integer citycd;
+
+    @ApiModelProperty("권역코드")  // Y NUMBER(3)
+    @JsonProperty("regioncd")
+    private Integer regioncd;
+
+    @ApiModelProperty("구역코드")  // Y NUMBER(3)
+    @JsonProperty("areacd")
+    private Integer areacd;
+
+    @ApiModelProperty("IP")  // Y VARCHAR(39)
+    @JsonProperty("rseip")
+    private String rseip;
+
+    @ApiModelProperty("경도")  // Y NUMBER(10)
+    @JsonProperty("coordx")
+    private Long coordx;
+
+    @ApiModelProperty("위도")  // Y NUMBER(10)
+    @JsonProperty("coordy")
+    private Long coordy;
+
+    @ApiModelProperty("구역반경1")  // Y NUMBER(4)
+    @JsonProperty("radius1")
+    private Integer radius1;
+
+    @ApiModelProperty("구역반경2")  // Y NUMBER(4)
+    @JsonProperty("radius2")
+    private Integer radius2;
+
+    @ApiModelProperty("제조사코드")  // Y VARCHAR(5)
+    @JsonProperty("compcd")
+    private String compcd;
+
+    @ApiModelProperty("RSE 설치위치")  // Y VARCHAR(32)
+    @JsonProperty("location")
+    private String location;
+
+    @ApiModelProperty("RSE환경정보ID")  // Y NUMBER(3)
+    @JsonProperty("rseconfigid")
+    private Integer rseconfigid;
+
+    @ApiModelProperty("OBE파라미터ID")  // Y NUMBER(3)
+    @JsonProperty("obeparamid")
+    private Integer obeparamid;
+
+    @ApiModelProperty("포트")  // Y NUMBER(5)
+    @JsonProperty("port")
+    private Integer port;
+
+    @ApiModelProperty("브릿지RES여부(0:일반/1:브릿지)")  // Y NUMBER(1)
+    @JsonProperty("bridge")
+    private Integer bridge;
+
+    @ApiModelProperty("통신여부(0:통신안함/1:통신함)")  // Y NUMBER(1)
+    @JsonProperty("comyn")
+    private Integer comyn;
+
+    @ApiModelProperty("")  // Y NUMBER(1)
+    @JsonProperty("commtype")
+    private Integer commtype;
+
+    @ApiModelProperty("수집시간")  // Y DATE(0)
+    @JsonProperty("coll_dt")
+    private String collDt;
+
+}

+ 76 - 0
src/main/java/com/its/api/utis/model/dto/RseopstateDto.java

@@ -0,0 +1,76 @@
+package com.its.api.utis.model.dto;
+
+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;
+
+/**
+ * RSE운영상태정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("RseopstateDto(RSE운영상태정보)")
+public class RseopstateDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("RSEID")  // N VARCHAR(16)
+    @JsonProperty("rseid")
+    private String rseid;
+
+    @ApiModelProperty("펌웨어버젼")  // Y VARCHAR(18)
+    @JsonProperty("firmver")
+    private String firmver;
+
+    @ApiModelProperty("맵버젼")  // Y VARCHAR(9)
+    @JsonProperty("mapver")
+    private String mapver;
+
+    @ApiModelProperty("RSE부팅이후경과시간")  // Y NUMBER(10)
+    @JsonProperty("passtm")
+    private Long passtm;
+
+    @ApiModelProperty("최근상태정보전송이후경과시간")  // Y NUMBER(10)
+    @JsonProperty("stpasstm")
+    private Long stpasstm;
+
+    @ApiModelProperty("가용메모리용량")  // Y NUMBER(10)
+    @JsonProperty("usemem")
+    private Long usemem;
+
+    @ApiModelProperty("OBE접속대수")  // Y NUMBER(10)
+    @JsonProperty("obeconcnt")
+    private Long obeconcnt;
+
+    @ApiModelProperty("OBE접속실패대수1")  // Y NUMBER(10)
+    @JsonProperty("obeconfailcnt1")
+    private Long obeconfailcnt1;
+
+    @ApiModelProperty("OBE접속실패대수2")  // Y NUMBER(10)
+    @JsonProperty("obeconfailcnt2")
+    private Long obeconfailcnt2;
+
+    @ApiModelProperty("전체다중전송량")  // Y NUMBER(10)
+    @JsonProperty("multiqty")
+    private Long multiqty;
+
+    @ApiModelProperty("교통정보량")  // Y NUMBER(10)
+    @JsonProperty("trafficqty")
+    private Long trafficqty;
+
+    @ApiModelProperty("수집정보 업로드량")  // Y NUMBER(10)
+    @JsonProperty("upqty")
+    private Long upqty;
+
+    @ApiModelProperty("비OBE접속시도회수")  // Y NUMBER(10)
+    @JsonProperty("nonobeconcnt")
+    private Long nonobeconcnt;
+
+    @ApiModelProperty("수집시간")  // Y DATE(0)
+    @JsonProperty("coll_dt")
+    private String collDt;
+
+}

+ 30 - 0
src/main/java/com/its/api/utis/model/dto/RseopstateTotalDto.java

@@ -0,0 +1,30 @@
+package com.its.api.utis.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("RseopstateTotalDto(RSE 시설물 상태 통합)")
+public class RseopstateTotalDto {
+
+    @ApiModelProperty("시설물유형(RSE)")
+    @JsonProperty("type")
+    private String type;
+    @ApiModelProperty("전체")
+    @JsonProperty("total")
+    private int total;
+    @ApiModelProperty("유선정상")
+    @JsonProperty("normal")
+    private int normal;
+    @ApiModelProperty("유선장애")
+    @JsonProperty("error")
+    private int error;
+}

+ 91 - 0
src/main/java/com/its/api/utis/model/dto/UtisRseStateDto.java

@@ -0,0 +1,91 @@
+package com.its.api.utis.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.utils.ItsUtils;
+import com.its.api.utis.model.entity.Rsemst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("UtisRseStateDto(RSE 시설물 상태 정보)")
+public class UtisRseStateDto {
+
+    @ApiModelProperty("시설물유형(RSE)")
+    @JsonProperty("type")
+    private String type;
+    @ApiModelProperty("전체")
+    @JsonProperty("total")
+    private int total;
+    @ApiModelProperty("유선정상")
+    @JsonProperty("normal")
+    private int normal;
+    @ApiModelProperty("유선장애")
+    @JsonProperty("error")
+    private int error;
+
+    @ApiModelProperty("RSE 개별 상태 정보")
+    @JsonProperty("lists")
+    List<RseCommSttsDto> lists = new ArrayList<>();
+
+    @Getter
+    @Setter
+    @ToString
+    @ApiModel("RseCommSttsDto(RSE 개별 상태 정보)")
+    public static class RseCommSttsDto {
+
+        @ApiModelProperty("RSE ID")
+        @JsonProperty("rse_id")
+        private String rseId;
+        @ApiModelProperty("설치위치")
+        @JsonProperty("location")
+        private String location;
+        @ApiModelProperty("장애일시")
+        @JsonProperty("coll_dt")
+        private String collDt;
+        @ApiModelProperty("통신상태")
+        @JsonProperty("comm_cd")
+        private String commCd;
+        @ApiModelProperty("장애일시")
+        @JsonProperty("comm_desc")
+        private String commDesc;
+
+        @Builder
+        public RseCommSttsDto(String rseId, String location, String collDt, String commCd, String commDesc) {
+            this.rseId = rseId;
+            this.location = location;
+            this.collDt = collDt;
+            this.commCd = commCd;
+            this.commDesc = commDesc;
+        }
+    }
+
+    public static RseCommSttsDto toSttsDto(Rsemst rse) {
+
+        RseCommSttsDto stts = RseCommSttsDto.builder()
+                .rseId(rse.getRseid())
+                .location(rse.getLocation())
+                .commCd("0")
+                .build();
+        if (rse.getState() != null) {
+            String collDt = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(rse.getState().getColldt());
+            stts.setCollDt(collDt);
+            stts.setCommCd(ItsUtils.getRseCommStts(stts.getCollDt()));
+        }
+
+        if (("0").equals(stts.getCommCd())) {
+            stts.setCommDesc("이상");
+        }
+        else {
+            stts.setCommDesc("정상");
+        }
+        return stts;
+    }
+}

+ 138 - 0
src/main/java/com/its/api/utis/model/entity/Rsemst.java

@@ -0,0 +1,138 @@
+package com.its.api.utis.model.entity;
+
+import com.its.api.utis.model.dto.RsemstDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * RSE마스터 Entity Class
+ */
+@Slf4j
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("RSE마스터")
+@Entity
+@Table(name = "RSEMST")
+public class Rsemst implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("RSEID")  // N VARCHAR(16)
+    @Id
+    @Column(name = "RSEID", nullable = false, length = 16)
+    private String rseid;
+
+    @ApiModelProperty("설치일자")  // Y DATE(0)
+    @Column(name = "INSTDT")
+    private LocalDateTime instdt;
+
+    @ApiModelProperty("UTIS도시코드")  // Y NUMBER(3)
+    @Column(name = "CITYCD", columnDefinition = "NUMBER", length = 3)
+    private Integer citycd;
+
+    @ApiModelProperty("권역코드")  // Y NUMBER(3)
+    @Column(name = "REGIONCD", columnDefinition = "NUMBER", length = 3)
+    private Integer regioncd;
+
+    @ApiModelProperty("구역코드")  // Y NUMBER(3)
+    @Column(name = "AREACD", columnDefinition = "NUMBER", length = 3)
+    private Integer areacd;
+
+    @ApiModelProperty("IP")  // Y VARCHAR(39)
+    @Column(name = "RSEIP", length = 39)
+    private String rseip;
+
+    @ApiModelProperty("경도")  // Y NUMBER(10)
+    @Column(name = "COORDX", columnDefinition = "NUMBER", length = 10)
+    private Long coordx;
+
+    @ApiModelProperty("위도")  // Y NUMBER(10)
+    @Column(name = "COORDY", columnDefinition = "NUMBER", length = 10)
+    private Long coordy;
+
+    @ApiModelProperty("구역반경1")  // Y NUMBER(4)
+    @Column(name = "RADIUS1", columnDefinition = "NUMBER", length = 4)
+    private Integer radius1;
+
+    @ApiModelProperty("구역반경2")  // Y NUMBER(4)
+    @Column(name = "RADIUS2", columnDefinition = "NUMBER", length = 4)
+    private Integer radius2;
+
+    @ApiModelProperty("제조사코드")  // Y VARCHAR(5)
+    @Column(name = "COMPCD", length = 5)
+    private String compcd;
+
+    @ApiModelProperty("RSE 설치위치")  // Y VARCHAR(32)
+    @Column(name = "LOCATION", length = 32)
+    private String location;
+
+    @ApiModelProperty("RSE환경정보ID")  // Y NUMBER(3)
+    @Column(name = "RSECONFIGID", columnDefinition = "NUMBER", length = 3)
+    private Integer rseconfigid;
+
+    @ApiModelProperty("OBE파라미터ID")  // Y NUMBER(3)
+    @Column(name = "OBEPARAMID", columnDefinition = "NUMBER", length = 3)
+    private Integer obeparamid;
+
+    @ApiModelProperty("포트")  // Y NUMBER(5)
+    @Column(name = "PORT", columnDefinition = "NUMBER", length = 5)
+    private Integer port;
+
+    @ApiModelProperty("브릿지RES여부(0:일반/1:브릿지)")  // Y NUMBER(1)
+    @Column(name = "BRIDGE", columnDefinition = "NUMBER", length = 1)
+    private Integer bridge;
+
+    @ApiModelProperty("통신여부(0:통신안함/1:통신함)")  // Y NUMBER(1)
+    @Column(name = "COMYN", columnDefinition = "NUMBER", length = 1)
+    private Integer comyn;
+
+    @ApiModelProperty("통신유형")  // Y NUMBER(1)
+    @Column(name = "COMMTYPE", columnDefinition = "NUMBER", length = 1)
+    private Integer commtype;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="RSEID", referencedColumnName = "RSEID")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private Rseopstate state = new Rseopstate();
+
+    public RsemstDto toDto() {
+        RsemstDto dto = RsemstDto.builder()
+                .rseid(this.rseid)
+                .instdt(this.instdt)
+                .citycd(this.citycd)
+                .regioncd(this.regioncd)
+                .areacd(this.areacd)
+                .rseip(this.rseip)
+                .coordx(this.coordx)
+                .coordy(this.coordy)
+                .radius1(this.radius1)
+                .radius2(this.radius2)
+                .compcd(this.compcd)
+                .location(this.location)
+                .rseconfigid(this.rseconfigid)
+                .obeparamid(this.obeparamid)
+                .port(this.port)
+                .bridge(this.bridge)
+                .comyn(this.comyn)
+                .commtype(this.commtype)
+                .build();
+
+        if (this.state != null) {
+            String collDt = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(this.state.getColldt());
+            dto.setCollDt(collDt);
+            log.error("{}", dto);
+        }
+        return dto;
+    }
+
+}

+ 106 - 0
src/main/java/com/its/api/utis/model/entity/Rseopstate.java

@@ -0,0 +1,106 @@
+package com.its.api.utis.model.entity;
+
+import com.its.api.utis.model.dto.RseopstateDto;
+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;
+import java.time.LocalDateTime;
+
+/**
+ * RSE운영상태정보 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("RSE운영상태정보")
+@Entity
+@Table(name = "RSEOPSTATE")
+public class Rseopstate implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("RSEID")  // N VARCHAR(16)
+    @Id
+    @Column(name = "RSEID", nullable = false, length = 16)
+    private String rseid;
+
+    @ApiModelProperty("펌웨어버젼")  // Y VARCHAR(18)
+    @Column(name = "FIRMVER", length = 18)
+    private String firmver;
+
+    @ApiModelProperty("맵버젼")  // Y VARCHAR(9)
+    @Column(name = "MAPVER", length = 9)
+    private String mapver;
+
+    @ApiModelProperty("RSE부팅이후경과시간")  // Y NUMBER(10)
+    @Column(name = "PASSTM", columnDefinition = "NUMBER", length = 10)
+    private Long passtm;
+
+    @ApiModelProperty("최근상태정보전송이후경과시간")  // Y NUMBER(10)
+    @Column(name = "STPASSTM", columnDefinition = "NUMBER", length = 10)
+    private Long stpasstm;
+
+    @ApiModelProperty("가용메모리용량")  // Y NUMBER(10)
+    @Column(name = "USEMEM", columnDefinition = "NUMBER", length = 10)
+    private Long usemem;
+
+    @ApiModelProperty("OBE접속대수")  // Y NUMBER(10)
+    @Column(name = "OBECONCNT", columnDefinition = "NUMBER", length = 10)
+    private Long obeconcnt;
+
+    @ApiModelProperty("OBE접속실패대수1")  // Y NUMBER(10)
+    @Column(name = "OBECONFAILCNT1", columnDefinition = "NUMBER", length = 10)
+    private Long obeconfailcnt1;
+
+    @ApiModelProperty("OBE접속실패대수2")  // Y NUMBER(10)
+    @Column(name = "OBECONFAILCNT2", columnDefinition = "NUMBER", length = 10)
+    private Long obeconfailcnt2;
+
+    @ApiModelProperty("전체다중전송량")  // Y NUMBER(10)
+    @Column(name = "MULTIQTY", columnDefinition = "NUMBER", length = 10)
+    private Long multiqty;
+
+    @ApiModelProperty("교통정보량")  // Y NUMBER(10)
+    @Column(name = "TRAFFICQTY", columnDefinition = "NUMBER", length = 10)
+    private Long trafficqty;
+
+    @ApiModelProperty("수집정보 업로드량")  // Y NUMBER(10)
+    @Column(name = "UPQTY", columnDefinition = "NUMBER", length = 10)
+    private Long upqty;
+
+    @ApiModelProperty("비OBE접속시도회수")  // Y NUMBER(10)
+    @Column(name = "NONOBECONCNT", columnDefinition = "NUMBER", length = 10)
+    private Long nonobeconcnt;
+
+    @ApiModelProperty("수집시간")  // Y DATE(0)
+    @Column(name = "COLLDT", length = 0)
+    private LocalDateTime colldt;
+
+    public RseopstateDto toDto() {
+        RseopstateDto dto = RseopstateDto.builder()
+                .rseid(this.rseid)
+                .firmver(this.firmver)
+                .mapver(this.mapver)
+                .passtm(this.passtm)
+                .stpasstm(this.stpasstm)
+                .usemem(this.usemem)
+                .obeconcnt(this.obeconcnt)
+                .obeconfailcnt1(this.obeconfailcnt1)
+                .obeconfailcnt2(this.obeconfailcnt2)
+                .multiqty(this.multiqty)
+                .trafficqty(this.trafficqty)
+                .upqty(this.upqty)
+                .nonobeconcnt(this.nonobeconcnt)
+                //.colldt(this.colldt)
+                .build();
+
+        return dto;
+    }
+
+}

+ 22 - 0
src/main/java/com/its/api/utis/repository/RsemstRepository.java

@@ -0,0 +1,22 @@
+package com.its.api.utis.repository;
+
+import com.its.api.utis.model.entity.Rsemst;
+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 RsemstRepository extends JpaRepository<Rsemst, String>, JpaSpecificationExecutor<Rsemst> {
+
+    @Query("select p from Rsemst p left outer join fetch p.state")
+    List<Rsemst> findAll();
+
+    @Query("select count(p.rseid) as total from Rsemst p")
+    Integer findAllCount();
+
+    @Query("select count(p.rseid) as normal from Rseopstate p, Rsemst m where p.rseid = m.rseid and p.colldt > (sysdate - 30/1440)")
+    Integer findAllNormalCount();
+}

+ 13 - 0
src/main/java/com/its/api/utis/repository/RseopstateRepository.java

@@ -0,0 +1,13 @@
+package com.its.api.utis.repository;
+
+import com.its.api.utis.model.entity.Rseopstate;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface RseopstateRepository extends JpaRepository<Rseopstate, String>, JpaSpecificationExecutor<Rseopstate> {
+/*
+    @Query("select count(p.rseid) as normal from Rseopstate p, Rsemst m where p.rseid = m.rseid and p.colldt > (sysdate - 30/1440)")
+    Integer findAllNormalCount();*/
+}

+ 114 - 0
src/main/java/com/its/api/utis/service/RsemstService.java

@@ -0,0 +1,114 @@
+package com.its.api.utis.service;
+
+import com.its.api.utis.model.dto.RsemstDto;
+import com.its.api.utis.model.dto.RseopstateTotalDto;
+import com.its.api.utis.model.dto.UtisRseStateDto;
+import com.its.api.utis.model.entity.Rsemst;
+import com.its.api.utis.repository.RsemstRepository;
+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.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class RsemstService {
+
+    private final RsemstRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private Rsemst requireOne(String id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    /**
+     * 전체 데이터 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<RsemstDto> findAll() {
+        List<RsemstDto> result = new ArrayList<>();
+        List<Rsemst> data = this.repo.findAll();
+        data.forEach(obj -> {
+            result.add(obj.toDto());
+        });
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public RsemstDto findById(String id) {
+        Rsemst entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    /**
+     * RSE 상태 통합 정보 및 개별 정보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public UtisRseStateDto findAllRseStts() {
+
+        UtisRseStateDto result = new UtisRseStateDto();
+
+        List<Rsemst> data = this.repo.findAll();
+        AtomicInteger normal = new AtomicInteger();
+        data.forEach(obj -> {
+            UtisRseStateDto.RseCommSttsDto stts = UtisRseStateDto.toSttsDto(obj);
+            result.getLists().add(stts);
+            if (("1").equals(stts.getCommCd())) {
+                normal.getAndIncrement();
+            }
+        });
+
+        result.setType("RSE");
+        result.setTotal(data.size());
+        result.setNormal(normal.get());
+        result.setError(result.getTotal() - result.getNormal());
+
+        return result;
+    }
+
+    /**
+     * RSE 상태 통합
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public RseopstateTotalDto findAllRseSttsTotal() {
+
+        int total = this.repo.findAllCount();
+        int normal = this.repo.findAllNormalCount();
+
+        return RseopstateTotalDto.builder()
+                .type("RSE")
+                .total(total)
+                .normal(normal)
+                .error(total - normal)
+                .build();
+    }
+
+    /**
+     * RSE 개별 통신 상태 목록 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<UtisRseStateDto.RseCommSttsDto> findAllCommStts() {
+
+        List<UtisRseStateDto.RseCommSttsDto> result = new ArrayList<>();
+        List<Rsemst> data = this.repo.findAll();
+        AtomicInteger normal = new AtomicInteger();
+        data.forEach(obj -> {
+            UtisRseStateDto.RseCommSttsDto stts = UtisRseStateDto.toSttsDto(obj);
+            result.add(stts);
+        });
+
+        return result;
+    }
+}

+ 65 - 0
src/main/java/com/its/api/utis/service/RseopstateService.java

@@ -0,0 +1,65 @@
+package com.its.api.utis.service;
+
+import com.its.api.utis.model.dto.RseopstateDto;
+import com.its.api.utis.model.entity.Rseopstate;
+import com.its.api.utis.repository.RsemstRepository;
+import com.its.api.utis.repository.RseopstateRepository;
+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;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class RseopstateService {
+
+    private final RseopstateRepository repo;
+    private final RsemstRepository rseRepo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private Rseopstate requireOne(String id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<RseopstateDto> findAll() {
+        List<RseopstateDto> result = new ArrayList<>();
+        List<Rseopstate> data = this.repo.findAll();
+        for (Rseopstate entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public RseopstateDto findById(String id) {
+        Rseopstate entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    /**
+     * RSE 상태 통합
+     * @return
+     */
+    /*@Transactional(readOnly = true)
+    public RseopstateTotalDto findAllStateTotal() {
+
+        int total = this.rseRepo.findAllCount();
+        int normal = this.repo.findAllNormalCount();
+
+        return RseopstateTotalDto.builder()
+                .type("RSE")
+                .total(total)
+                .normal(normal)
+                .error(total - normal)
+                .build();
+    }*/
+}

+ 14 - 0
src/main/resources/application.yml

@@ -19,6 +19,8 @@ server:
       timeout: 300
 
 spring:
+  main:
+    banner-mode: off
   application:
     name: its-op-server
   jackson:
@@ -89,6 +91,18 @@ spring:
       hibernate:
         dialect: org.hibernate.dialect.Oracle10gDialect
 
+  utis-datasource:
+    hikari:
+      driver-class-name: com.tmax.tibero.jdbc.TbDriver
+      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
+      username: rutis
+      password: rutis
+  utis-jpa:
+    database-platform: org.hibernate.dialect.Oracle10gDialect
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.Oracle10gDialect
+
 ---
 spring:
   config:

+ 0 - 36
src/main/resources/mybatis/mapper/facility/RseMapper.xml

@@ -1,36 +0,0 @@
-<?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.api.its.repository.dashboard.facility.RseMapper">
-
-    <select id="findAllFacilityStts" resultType="com.its.api.its.model.dto.dashboard.facility.RseFacilitySttsDto">
-        <![CDATA[
-        SELECT 'RSE' AS TYPE, COUNT(1) AS TOTCNT, SUM(NVL(CHKFLAG, 0)) AS NORCNT, COUNT(1) - SUM(NVL(CHKFLAG, 0)) AS ERRCNT
-        FROM RSEMST A,
-             (SELECT RSEID,
-                     CASE WHEN (SYSDATE - COLLDT) < 30/1440 THEN 1
-                          ELSE 0 END AS CHKFLAG
-              FROM RSEOPSTATE) B
-        WHERE 1=1
-          AND A.RSEID = B.RSEID(+)
-        ]]>
-    </select>
-    <select id="findAllCommStts" resultType="com.its.api.its.model.dto.dashboard.facility.RseCommSttsDto">
-        <![CDATA[
-        SELECT RSEID, LOCATION, COLLDT, COMM_CD, DECODE(COMM_CD, 0, '장애', '정상') AS COMM_DESC
-        FROM (SELECT A.RSEID, A.LOCATION, NVL(B.COLLDT, '-') AS COLLDT, NVL(B.CHKFLAG, 0) AS COMM_CD
-              FROM RSEMST A,
-                   (SELECT RSEID, TO_CHAR(COLLDT, 'YYYYMMDDHH24MISS') AS COLLDT,
-                           CASE WHEN (SYSDATE - COLLDT) < 30/1440 THEN 1
-                                ELSE 0 END AS CHKFLAG
-                    FROM RSEOPSTATE) B
-              WHERE 1=1
-                AND A.RSEID = B.RSEID(+)
-             )
-        WHERE 1=1
-          AND COMM_CD = 0
-        ORDER BY RSEID
-        ]]>
-    </select>
-
-</mapper>