shjung 1 жил өмнө
parent
commit
172486d3f0
35 өөрчлөгдсөн 1119 нэмэгдсэн , 656 устгасан
  1. 2 0
      conf/application.yml
  2. 1 1
      conf/debug.properties
  3. 3 0
      src/main/java/com/its/safe/config/ApplicationConfig.java
  4. 14 6
      src/main/java/com/its/safe/dao/mapper/its/VmsMapper.java
  5. 6 6
      src/main/java/com/its/safe/dao/mapper/safe/VmsSafeMapper.java
  6. 21 0
      src/main/java/com/its/safe/dto/its/ItsDbTimeParam.java
  7. 1 3
      src/main/java/com/its/safe/dto/its/TbAreaDto.java
  8. 14 85
      src/main/java/com/its/safe/dto/its/TbVmsCtlrDto.java
  9. 28 0
      src/main/java/com/its/safe/dto/its/TbVmsSafeMsgCtlrDto.java
  10. 76 0
      src/main/java/com/its/safe/dto/its/TbVmsSafeMsgDto.java
  11. 76 0
      src/main/java/com/its/safe/dto/its/TbVmsSafeMsgHsDto.java
  12. 25 0
      src/main/java/com/its/safe/dto/its/VmsMsgAreaDto.java
  13. 25 0
      src/main/java/com/its/safe/dto/safe/AreaDto.java
  14. 1 1
      src/main/java/com/its/safe/dto/safe/MessageDto.java
  15. 1 1
      src/main/java/com/its/safe/dto/safe/ReadCheckDto.java
  16. 23 0
      src/main/java/com/its/safe/entity/its/ItsDbTime.java
  17. 0 16
      src/main/java/com/its/safe/entity/its/MakeTrafParam.java
  18. 20 0
      src/main/java/com/its/safe/entity/its/SafeMsgTargetVms.java
  19. 2 5
      src/main/java/com/its/safe/entity/its/TbArea.java
  20. 0 42
      src/main/java/com/its/safe/entity/its/TbNode.java
  21. 43 0
      src/main/java/com/its/safe/entity/its/TbVmsCtlr.java
  22. 0 149
      src/main/java/com/its/safe/entity/its/TbVmsCtlrStts.java
  23. 102 0
      src/main/java/com/its/safe/entity/its/TbVmsSafeMsg.java
  24. 37 0
      src/main/java/com/its/safe/entity/its/TbVmsSafeMsgCtlr.java
  25. 85 0
      src/main/java/com/its/safe/entity/its/TbVmsSafeMsgHs.java
  26. 25 0
      src/main/java/com/its/safe/entity/its/VmsMsgArea.java
  27. 37 0
      src/main/java/com/its/safe/entity/safe/Area.java
  28. 133 0
      src/main/java/com/its/safe/entity/safe/Message.java
  29. 4 4
      src/main/java/com/its/safe/entity/safe/ReadCheck.java
  30. 0 57
      src/main/java/com/its/safe/entity/safe/TbMessage.java
  31. 0 135
      src/main/java/com/its/safe/service/NodeLinkService.java
  32. 0 95
      src/main/java/com/its/safe/service/StatisticsServices.java
  33. 108 19
      src/main/java/com/its/safe/service/VmsSafeAdapterService.java
  34. 203 28
      src/main/resources/mybatis/mapper/its/VmsMapper.xml
  35. 3 3
      src/main/resources/mybatis/mapper/safe/VmsSafeMapper.xml

+ 2 - 0
conf/application.yml

@@ -1,6 +1,8 @@
 application:
   name: 포항시 VMS 재난안전 연계 서버
   safe-system-id: jndr
+  msg-dspl-end-min: 1440
+  msg-dspl-clear-min: 10
 
 server:
   port: 7904

+ 1 - 1
conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Fri Jan 05 17:27:06 KST 2024
+#Mon Jan 08 17:33:17 KST 2024
 packet-info=x
 packet-dump=x
 system-debug=false

+ 3 - 0
src/main/java/com/its/safe/config/ApplicationConfig.java

@@ -31,6 +31,9 @@ public class ApplicationConfig {
     private String userPswd = "1234";
 
     private String safeSystemId = "jndr";
+    private Integer msgDsplEndMin = 30;
+    private Integer msgDsplClearMin = 10;
+
 
     // Center Communication Config
     private boolean centerCommEnable = false;

+ 14 - 6
src/main/java/com/its/safe/dao/mapper/its/VmsMapper.java

@@ -1,16 +1,24 @@
 package com.its.safe.dao.mapper.its;
 
-import com.its.safe.entity.its.TbLink;
-import com.its.safe.entity.its.TbNode;
-import com.its.safe.entity.its.TbNodeRgn;
+import com.its.safe.dto.its.ItsDbTimeParam;
+import com.its.safe.entity.its.*;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 @Mapper
 public interface VmsMapper {
 
-    List<TbNode> selectNodeAll();
-    List<TbNodeRgn> selectNodeRgnAll();
-    List<TbLink> selectLinkAll();
+    ItsDbTime getCurrentTime(@Param("param") ItsDbTimeParam param);
+    List<TbArea> selectArea();
+    List<VmsMsgArea> selectVmsMsgArea(@Param("areaList") List<String> areaList);
+    List<SafeMsgTargetVms> selectSafeMsgTargetVms(@Param("areaList") List<String> areaList);
+    List<TbVmsCtlr> selectVmsCtlrInfo();
+
+    int createVmsSafeMsg(@Param("obj") TbVmsSafeMsg obj);
+    int cancelVmsSafeMsg(@Param("obj") TbVmsSafeMsg obj);
+    int insertVmsSafeMsgHs(@Param("obj") TbVmsSafeMsgHs obj);
+    int deleteVmsSafeMsgCtlr(@Param("obj") TbVmsSafeMsgCtlr obj);
+    int createVmsSafeMsgCtlr(@Param("obj") TbVmsSafeMsgCtlr obj);
 }

+ 6 - 6
src/main/java/com/its/safe/dao/mapper/safe/VmsSafeMapper.java

@@ -1,8 +1,8 @@
 package com.its.safe.dao.mapper.safe;
 
-import com.its.safe.entity.safe.TbArea;
-import com.its.safe.entity.safe.TbMessage;
-import com.its.safe.entity.safe.TbReadCheck;
+import com.its.safe.entity.safe.Area;
+import com.its.safe.entity.safe.Message;
+import com.its.safe.entity.safe.ReadCheck;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -11,11 +11,11 @@ import java.util.List;
 @Mapper
 public interface VmsSafeMapper {
 
-    List<TbArea> selectArea();
-    List<TbReadCheck> selectNewVmsSafeMessage(@Param("systemId") String systemId);
+    List<Area> selectArea();
+    List<ReadCheck> selectNewVmsSafeMessage(@Param("systemId") String systemId);
     int updateConfirmNewVmsSafeMessage(@Param("seq") Long seq);
 
-    List<TbMessage> selectVmsSafeMessage(@Param("messageSeq") Long messageSeq);
+    List<Message> selectVmsSafeMessage(@Param("messageSeq") Long messageSeq);
 
     int insertConnCheck(@Param("systemId") String systemId);
 

+ 21 - 0
src/main/java/com/its/safe/dto/its/ItsDbTimeParam.java

@@ -0,0 +1,21 @@
+package com.its.safe.dto.its;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 재난안전 표출 대상 VMS 정보 Entity Class
+ */
+@ApiModel("재난안전 표출 대상 VMS 정보")
+@Data
+@Builder
+public class ItsDbTimeParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer msgDsplEndMin = 30;
+    private Integer msgDsplClearMin = 10;
+
+}

+ 1 - 3
src/main/java/com/its/safe/dto/safe/TbAreaDto.java → src/main/java/com/its/safe/dto/its/TbAreaDto.java

@@ -1,4 +1,4 @@
-package com.its.safe.dto.safe;
+package com.its.safe.dto.its;
 
 import io.swagger.annotations.ApiModel;
 import lombok.Builder;
@@ -14,8 +14,6 @@ import java.io.Serializable;
 @ApiModel("TbAreaDto(법정동코드 정보)")
 public class TbAreaDto implements Serializable {
     private static final long serialVersionUID = 1L;
-
-    private Long seq;           // 테이블 seq
     private String code;        // 법정동코드 : 행안부 법정동 기준
     private String upperCode;   // 상위 법정동코드 : 모자 관계 파악용 상위 법정동 코드
     private String name;        // 법정동명 (풀 네임, 예: 경상북도 포항시 남구 구룡포읍 구룡포리)

+ 14 - 85
src/main/java/com/its/safe/dto/its/TbVmsCtlrDto.java

@@ -1,99 +1,28 @@
 package com.its.safe.dto.its;
 
-import com.its.safe.entity.its.TbVmsCtlrStts;
-import io.netty.channel.Channel;
-import lombok.*;
-import lombok.extern.slf4j.Slf4j;
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
 
 import java.io.Serializable;
-import java.net.InetSocketAddress;
 
-@Slf4j
-@Getter
-@Setter
-@ToString
+/**
+ * VMS DTO Class
+ */
+@ApiModel("VMS 정보")
+@Data
 @Builder
-@NoArgsConstructor//(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
 public class TbVmsCtlrDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    private int  index;
     private Long vmsCtlrNmbr;
-    private Long groupNo;
-    private Integer ctlrLocalNo;
-    private String ctlrId;
-    private String name;
-    private String ctlrIp;
-    private String ctlrPort;
-    private String usagTypeCd;
-    private String frmTypeCd;
-    private String typeCd;
-    private String modlTypeCd;
-    private String operMode;
-    private Integer cmncfailSlotNmbr;
-    private Integer pwerFailSlotNmbr;
-    private String cmtrinfrCnctYn;
-    private String wthrinfrCnctYn;
-    private String envrinfrCnctYn;
-    private Integer maxPhaseNum;
-    private String istlLctnNm;
+    private String vmsId;
+    private String vmsCtlrId;
+    private String vmsNm;
+    private String areaCode;
     private String istlLctnAddr;
-    private String trfcStrgUseYn;
-    private Long locIfscId;
-
-    private Integer defPhseChngCycl;    // 기본메시지주기
-    private String panlOnTime;          // 전광판 ON TIME
-    private String panlOffTime;         // 전광판 OFF TIME
-    private Integer panlPwerMode;        // 전광판 전원 모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer fanMode;            // FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer fanRunTmpr;          // 팬 동작 온도
-    private Integer hetrMode;           // 히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer hetrRunTmpr;         // 히터 동작 온도
-    private Integer brghMode;           // 휘도 모드(0x00:주간,0x01:야간,0x02:자동,0x09:수동)
-    private Integer brghCurrStep;       // 휘도 현재 단계(0~100)
-    private Integer brghWeekStep;       // 휘도 주간 단계(0~100)
-    private Integer brghNghtStep;       // 휘도 야간 단계(0~100)
-    private Integer modlErrRate;        // VMS 모듈 오류 율
-    private Integer cmncFailRate;       // VMS 통신 오류 기본 값
-
-    private Integer protocolVer;
+    private Double xCrdn;
+    private Double yCrdn;
     private String delYn;
 
-    private int vmsWidth;
-    private int vmsHeight;
-    private int modlRowNum;
-    private int modlColNum;
-    private int powrRowNum;
-    private int powrColNum;
-
-    private String localFormDir;
-    private String ftpFormDir;
-    private boolean ftpDownload;
-    private boolean symbolDownload;
-
-    private int maxCngstForm;        // 정체폼 생성 최대 갯수
-    private int cngstForms;
-    private boolean existCngsForm;
-    private boolean provide;
-    private boolean evehIngForm;
-    private boolean evehEndForm;
-
-    private byte txtOpCode;
-
-    private TbVmsCtlrStts     stts;
-    private int 			  netState;
-    private boolean           isDupCon;
-    private boolean           isDupLogin;
-    private String 		      dstIpAddr;
-    private Channel           channel = null;
-    private Channel           dupChannel = null;
-    private InetSocketAddress cliReq;
-    private long              syncTime;
-
-    public String getLogKey() {
-        return this.ctlrId;
-    }
-
 }
-

+ 28 - 0
src/main/java/com/its/safe/dto/its/TbVmsSafeMsgCtlrDto.java

@@ -0,0 +1,28 @@
+package com.its.safe.dto.its;
+
+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;
+
+/**
+ * VMS 재난안전 메시지 표출 대상 제어기 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSafeMsgCtlrDto(VMS 재난안전 메시지 표출 대상 제어기)")
+public class TbVmsSafeMsgCtlrDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    @JsonProperty("msg_seq")
+    private Long msgSeq;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    @JsonProperty("vms_ctlr_nmbr")
+    private Long vmsCtlrNmbr;
+
+}

+ 76 - 0
src/main/java/com/its/safe/dto/its/TbVmsSafeMsgDto.java

@@ -0,0 +1,76 @@
+package com.its.safe.dto.its;
+
+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;
+
+/**
+ * VMS 재난안전 메시지 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSafeMsgDto(VMS 재난안전 메시지)")
+public class TbVmsSafeMsgDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    @JsonProperty("msg_seq")
+    private Long msgSeq;
+
+    @ApiModelProperty("발령 (상황) 코드")  // Y VARCHAR(1)
+    @JsonProperty("msg_status")
+    private String msgStatus;
+
+    @ApiModelProperty("발령 (구분) 코드")  // Y VARCHAR(1)
+    @JsonProperty("msg_type")
+    private String msgType;
+
+    @ApiModelProperty("이전 메시지 일련번호: (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.")  // Y NUMBER(10)
+    @JsonProperty("pre_msg_seq")
+    private Long preMsgSeq;
+
+    @ApiModelProperty("제목")  // Y VARCHAR(100)
+    @JsonProperty("msg_title")
+    private String msgTitle;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_전체: 전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, MSG_TEXT_LN_1 + MSG_TEXT_LN_2)")  // Y VARCHAR(200)
+    @JsonProperty("msg_text")
+    private String msgText;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_1행: 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    @JsonProperty("msg_text_ln_1")
+    private String msgTextLn1;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_2행: 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    @JsonProperty("msg_text_ln_2")
+    private String msgTextLn2;
+
+    @ApiModelProperty("지역명: 법정동 이름, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(500)
+    @JsonProperty("area_desc")
+    private String areaDesc;
+
+    @ApiModelProperty("지역 코드: 법정동 코드, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(200)
+    @JsonProperty("area_code")
+    private String areaCode;
+
+    @ApiModelProperty("기록 시간 : 자동입력, CURRENT_TIMESTAMP()")  // Y VARCHAR(14)
+    @JsonProperty("crt_dt")
+    private String crtDt;
+
+    @ApiModelProperty("메시지 표출 시작 시각")  // Y VARCHAR(14)
+    @JsonProperty("msg_strt_dt")
+    private String msgStrtDt;
+
+    @ApiModelProperty("메시지 표출 종료 시각")  // Y VARCHAR(14)
+    @JsonProperty("msg_end_dt")
+    private String msgEndDt;
+
+    @ApiModelProperty("업데이트 시각")  // Y VARCHAR(14)
+    @JsonProperty("updt_dt")
+    private String updtDt;
+
+}

+ 76 - 0
src/main/java/com/its/safe/dto/its/TbVmsSafeMsgHsDto.java

@@ -0,0 +1,76 @@
+package com.its.safe.dto.its;
+
+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;
+
+/**
+ * VMS 재난안전 메시지 이력 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsSafeMsgHsDto(VMS 재난안전 메시지 이력)")
+public class TbVmsSafeMsgHsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    @JsonProperty("msg_seq")
+    private Long msgSeq;
+
+    @ApiModelProperty("업데이트 시각")  // N VARCHAR(14)
+    @JsonProperty("updt_dt")
+    private String updtDt;
+
+    @ApiModelProperty("발령 (상황) 코드")  // Y VARCHAR(1)
+    @JsonProperty("msg_status")
+    private String msgStatus;
+
+    @ApiModelProperty("발령 (구분) 코드")  // Y VARCHAR(1)
+    @JsonProperty("msg_type")
+    private String msgType;
+
+    @ApiModelProperty("이전 메시지 일련번호: (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.")  // Y NUMBER(10)
+    @JsonProperty("pre_msg_seq")
+    private Long preMsgSeq;
+
+    @ApiModelProperty("제목")  // Y VARCHAR(100)
+    @JsonProperty("msg_title")
+    private String msgTitle;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_전체: 전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, MSG_TEXT_LN_1 + MSG_TEXT_LN_2)")  // Y VARCHAR(200)
+    @JsonProperty("msg_text")
+    private String msgText;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_1행: 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    @JsonProperty("msg_text_ln_1")
+    private String msgTextLn1;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_2행: 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    @JsonProperty("msg_text_ln_2")
+    private String msgTextLn2;
+
+    @ApiModelProperty("지역명: 법정동 이름, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(500)
+    @JsonProperty("area_desc")
+    private String areaDesc;
+
+    @ApiModelProperty("지역 코드: 법정동 코드, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(200)
+    @JsonProperty("area_code")
+    private String areaCode;
+
+    @ApiModelProperty("기록 시간 : 자동입력, CURRENT_TIMESTAMP()")  // Y VARCHAR(14)
+    @JsonProperty("crt_dt")
+    private String crtDt;
+
+    @ApiModelProperty("메시지 표출 시작 시각")  // Y VARCHAR(14)
+    @JsonProperty("msg_strt_dt")
+    private String msgStrtDt;
+
+    @ApiModelProperty("메시지 표출 종료 시각")  // Y VARCHAR(14)
+    @JsonProperty("msg_end_dt")
+    private String msgEndDt;
+
+}

+ 25 - 0
src/main/java/com/its/safe/dto/its/VmsMsgAreaDto.java

@@ -0,0 +1,25 @@
+package com.its.safe.dto.its;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * VMS 메시지 법정동코드 정보 DTO Class
+ */
+@ApiModel("VMS 메시지 법정동코드 정보")
+@Data
+@Builder
+public class VmsMsgAreaDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String code;
+    private String upperCode;
+    private String codeName;
+    private Integer depthLevel;
+    private String depthPath;
+    private String isLeaf;
+
+}

+ 25 - 0
src/main/java/com/its/safe/dto/safe/AreaDto.java

@@ -0,0 +1,25 @@
+package com.its.safe.dto.safe;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 법정동코드 정보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbAreaDto(법정동코드 정보)")
+public class AreaDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long seq;           // 테이블 seq
+    private String code;        // 법정동코드 : 행안부 법정동 기준
+    private String upperCode;   // 상위 법정동코드 : 모자 관계 파악용 상위 법정동 코드
+    private String name;        // 법정동명 (풀 네임, 예: 경상북도 포항시 남구 구룡포읍 구룡포리)
+    private Long depth;         // 단계. (1:시, 2:구, 3:읍면동, 4:리)
+    private String baseDate;    // 코드 기준일 : 해당시 1, 행안부 법정동 변경시 여러 버전 존재 가능 하므로 구별 위해 기준일 기록 (예 : 2023년 11월 기준 -> 202311)
+
+}

+ 1 - 1
src/main/java/com/its/safe/dto/safe/TbMessageDto.java → src/main/java/com/its/safe/dto/safe/MessageDto.java

@@ -13,7 +13,7 @@ import java.sql.Timestamp;
 @Data
 @Builder
 @ApiModel("TbMessageDto(전파 메시지 정보)")
-public class TbMessageDto implements Serializable {
+public class MessageDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Long seq;

+ 1 - 1
src/main/java/com/its/safe/dto/safe/TbReadCheckDto.java → src/main/java/com/its/safe/dto/safe/ReadCheckDto.java

@@ -13,7 +13,7 @@ import java.sql.Timestamp;
 @Data
 @Builder
 @ApiModel("TbReadCheckDto(전파 메시지 상황 정보)")
-public class TbReadCheckDto implements Serializable {
+public class ReadCheckDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Long seq;

+ 23 - 0
src/main/java/com/its/safe/entity/its/ItsDbTime.java

@@ -0,0 +1,23 @@
+package com.its.safe.entity.its;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 재난안전 표출 대상 VMS 정보 Entity Class
+ */
+@ApiModel("재난안전 표출 대상 VMS 정보")
+@Data
+@Builder
+public class ItsDbTime implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String currentTime;
+    private String msgEndDt;
+    private String msgClearDt;
+    private String msgCancelDt;
+
+}

+ 0 - 16
src/main/java/com/its/safe/entity/its/MakeTrafParam.java

@@ -1,16 +0,0 @@
-package com.its.safe.entity.its;
-
-
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class MakeTrafParam {
-
-    private String PRCN_DT;
-    private int FROM_MIN;
-    private int MIN_SPEED;
-    private int MAX_SPEED;
-
-}

+ 20 - 0
src/main/java/com/its/safe/entity/its/SafeMsgTargetVms.java

@@ -0,0 +1,20 @@
+package com.its.safe.entity.its;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 재난안전 표출 대상 VMS 정보 Entity Class
+ */
+@ApiModel("재난안전 표출 대상 VMS 정보")
+@Data
+@Builder
+public class SafeMsgTargetVms implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long vmsCtlrNmbr;
+
+}

+ 2 - 5
src/main/java/com/its/safe/entity/safe/TbArea.java → src/main/java/com/its/safe/entity/its/TbArea.java

@@ -1,6 +1,6 @@
-package com.its.safe.entity.safe;
+package com.its.safe.entity.its;
 
-import com.its.safe.dto.safe.TbAreaDto;
+import com.its.safe.dto.its.TbAreaDto;
 import io.swagger.annotations.ApiModel;
 import lombok.Builder;
 import lombok.Data;
@@ -15,8 +15,6 @@ import java.io.Serializable;
 @Builder
 public class TbArea implements Serializable {
     private static final long serialVersionUID = 1L;
-
-    private Long seq;           // 테이블 seq
     private String code;        // 법정동코드 : 행안부 법정동 기준
     private String upperCode;   // 상위 법정동코드 : 모자 관계 파악용 상위 법정동 코드
     private String name;        // 법정동명 (풀 네임, 예: 경상북도 포항시 남구 구룡포읍 구룡포리)
@@ -25,7 +23,6 @@ public class TbArea implements Serializable {
 
     public TbAreaDto toDto() {
         return TbAreaDto.builder()
-                .seq(this.seq)
                 .code(this.code)
                 .upperCode(this.upperCode)
                 .name(this.name)

+ 0 - 42
src/main/java/com/its/safe/entity/its/TbNode.java

@@ -1,42 +0,0 @@
-package com.its.safe.entity.its;
-
-import com.its.safe.dto.its.TbNodeDto;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 노드정보 Entity Class
- */
-@ApiModel("노드정보")
-@Data
-@Builder
-public class TbNode implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private Long nodeId;
-    private String nodeType;
-    private String nodeName;
-    private String turnP;
-    private String rmrk;
-
-    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
-    private Double xCrdn;
-
-    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
-    private Double yCrdn;
-
-    public TbNodeDto toDto() {
-        return TbNodeDto.builder()
-                .nodeId(this.nodeId)
-                .nodeType(this.nodeType)
-                .nodeName(this.nodeName)
-                .xCrdn(this.xCrdn)
-                .yCrdn(this.yCrdn)
-                .build();
-    }
-
-}

+ 43 - 0
src/main/java/com/its/safe/entity/its/TbVmsCtlr.java

@@ -0,0 +1,43 @@
+package com.its.safe.entity.its;
+
+import com.its.safe.dto.its.TbVmsCtlrDto;
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * VMS Entity Class
+ */
+@ApiModel("VMS 정보")
+@Data
+@Builder
+public class TbVmsCtlr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long vmsCtlrNmbr;
+    private String vmsId;
+    private String vmsCtlrId;
+    private String vmsNm;
+    private String areaCode;
+    private String istlLctnAddr;
+    private Double xCrdn;
+    private Double yCrdn;
+    private String delYn;
+
+    public TbVmsCtlrDto toDto() {
+        return TbVmsCtlrDto.builder()
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .vmsId(this.vmsId)
+                .vmsCtlrId(this.vmsCtlrId)
+                .vmsNm(this.vmsNm)
+                .areaCode(this.areaCode)
+                .istlLctnAddr(this.istlLctnAddr)
+                .xCrdn(this.xCrdn)
+                .yCrdn(this.yCrdn)
+                .delYn(this.delYn)
+                .build();
+    }
+
+}

+ 0 - 149
src/main/java/com/its/safe/entity/its/TbVmsCtlrStts.java

@@ -1,149 +0,0 @@
-package com.its.safe.entity.its;
-
-import com.its.app.utils.SysUtils;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- *  DTO Class
- */
-@Data
-public class TbVmsCtlrStts implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private Long vmsCtlrNmbr;
-    private String updtDt;
-    private String cmncSttsCd;      // 통신 상태 코드('CMS')
-    private String pwerSttsCd;      // 전원 상태 코드('PWS')
-    private String modlSttsCd;      // 모듈(LED) 상태 코드
-    private String cboxDoorSttsCd;  // 함체 문 상태 코드('CDS')
-    private String fanSttsCd;       // 팬 상태 코드('PAS')
-    private String hetrSttsCd;      // 히터 상태 코드('HTS')
-    private Integer cboxTmpr;       // 함체 온도
-    private Integer brghVal;        // 휘도값
-    private String commSttsCd;      // 통신 상태 코드('CMS')
-    private String modlStts;        // 모듈상태(문자열, 0: 꺼짐, 1: 켜짐, 9: 알수없음)
-    private String pwerStts;        // 전원상태(문자열, 0: 꺼짐, 1: 켜짐, 9: 알수없음)
-
-    private Integer cboxHum;        //CBOX_HUM	N	NUMBER(3)	Y	0		함체 습도
-    private String cboxFanSttsCd;   //CBOX_FAN_STTS_CD	N	VARCHAR2(7)	Y			함체 팬 상태 코드
-    private String cboxHetrSttsCd;  //CBOX_HETR_STTS_CD	N	VARCHAR2(7)	Y			함체 히터 상태 코드
-    private Integer tmpr;           //TMPR	N	NUMBER(3)	Y	0		표출부 온도
-    private Integer hum;            //HUM	N	NUMBER(3)	Y	0		표출부 습도
-    private String doorSttsCd;      //DOOR_STTS_CD	N	VARCHAR2(7)	Y			표출부 문 상태 코드
-    private Integer brghMode;       //BRGH_MODE	N	NUMBER(3)	Y	0		표출부 휘도모드(0:주간, 1:야간, 2: 자동, 3: 수동)
-    private Integer brghCurr;       //BRGH_CURR	N	NUMBER(3)	Y	0		표출부 현재 휘도값
-    private Integer brghWeek;       //BRGH_WEEK	N	NUMBER(3)	Y	0		표출부 주간 휘도값
-    private Integer brghNght;       //BRGH_NGHT	N	NUMBER(3)	Y	0		표출부 야간 휘도값
-    private String pwerOnOffCd;     //PWER_ONOFF_CD	N	VARCHAR2(7)	Y			표출부 전원 ON/OFF 코드
-
-    public TbVmsCtlrStts(Long vmsCtlrNmbr) {
-        this.vmsCtlrNmbr = vmsCtlrNmbr;
-        initUnknown();
-    }
-
-    public TbVmsCtlrStts clone() {
-        TbVmsCtlrStts dto = new TbVmsCtlrStts(this.vmsCtlrNmbr);
-        dto.setUpdtDt(this.updtDt);
-        dto.setCmncSttsCd(this.cmncSttsCd);
-        dto.setPwerSttsCd(this.pwerSttsCd);
-        dto.setModlSttsCd(this.modlSttsCd);
-        dto.setCboxDoorSttsCd(this.cboxDoorSttsCd);
-        dto.setFanSttsCd(this.fanSttsCd);
-        dto.setHetrSttsCd(this.hetrSttsCd);
-        dto.setCboxTmpr(this.cboxTmpr);
-        dto.setBrghVal(this.brghVal);
-        dto.setCommSttsCd(this.commSttsCd);
-        dto.setModlStts(this.modlStts);
-        dto.setPwerStts(this.pwerStts);
-
-        dto.setCboxHum(this.cboxHum);
-        dto.setCboxFanSttsCd(this.cboxFanSttsCd);
-        dto.setCboxHetrSttsCd(this.cboxHetrSttsCd);
-        dto.setTmpr(this.tmpr);
-        dto.setHum(this.hum);
-        dto.setDoorSttsCd(this.doorSttsCd);
-        dto.setBrghMode(this.brghMode);
-        dto.setBrghCurr(this.brghCurr);
-        dto.setBrghWeek(this.brghWeek);
-        dto.setBrghNght(this.brghNght);
-        dto.setPwerOnOffCd(this.pwerOnOffCd);
-
-        return dto;
-    }
-    public void initStts(boolean isConnected) {
-        if (isConnected) {
-            initUnknown();
-        } else {
-            initError();
-        }
-    }
-    public void initUnknown() {
-        this.updtDt = SysUtils.getSysTime();
-        this.cmncSttsCd = "CMS2";
-        this.commSttsCd = "CMS2";
-
-        this.pwerSttsCd = "PWS2";
-        this.modlSttsCd = "MOS2";
-        this.cboxDoorSttsCd = "CDS2";
-        this.fanSttsCd = "PAS2";
-        this.hetrSttsCd = "HTS2";
-        this.cboxTmpr = 0;
-        this.brghVal = 0;
-        this.modlStts = "11111111111111111111";
-        this.pwerStts = "11111111111111111111";
-
-        this.cboxHum = 0;
-        this.cboxFanSttsCd = "PAS2";
-        this.cboxHetrSttsCd = "HTS2";
-        this.tmpr = 0;
-        this.hum = 0;
-        this.doorSttsCd = "CDS2";
-        this.brghMode = 0;
-        this.brghCurr = 0;
-        this.brghWeek = 0;
-        this.brghNght = 0;
-        this.pwerOnOffCd = "PWO2";
-    }
-    public void initError() {
-        initUnknown();
-        this.cmncSttsCd = "CMS1";
-        this.commSttsCd = "CMS1";
-    }
-
-    public void initNormal() {
-        initUnknown();
-        this.cmncSttsCd = "CMS0";
-        this.commSttsCd = "CMS0";
-    }
-
-    public void updateStts(TbVmsCtlrStts dto) {
-        this.updtDt = dto.getUpdtDt();
-        this.cmncSttsCd = dto.getCmncSttsCd();
-        this.pwerSttsCd = dto.getPwerSttsCd();
-        this.modlSttsCd = dto.getModlSttsCd();
-        this.cboxDoorSttsCd = dto.getCboxDoorSttsCd();
-        this.fanSttsCd = dto.getFanSttsCd();
-        this.hetrSttsCd = dto.getHetrSttsCd();
-        this.cboxTmpr = dto.getCboxTmpr();
-        this.brghVal = dto.getBrghVal();
-        this.commSttsCd = dto.getCommSttsCd();
-        this.modlStts = dto.getModlStts();
-        this.pwerStts = dto.getPwerStts();
-
-        this.cboxHum = dto.getCboxHum();
-        this.cboxFanSttsCd = dto.getCboxFanSttsCd();
-        this.cboxHetrSttsCd = dto.getCboxHetrSttsCd();
-        this.tmpr = dto.getTmpr();
-        this.hum = dto.getHum();
-        this.doorSttsCd = dto.getDoorSttsCd();
-        this.brghMode = dto.getBrghMode();
-        this.brghCurr = dto.getBrghCurr();
-        this.brghWeek = dto.getBrghWeek();
-        this.brghNght = dto.getBrghNght();
-        this.pwerOnOffCd = dto.getPwerOnOffCd();
-    }
-
-
-}

+ 102 - 0
src/main/java/com/its/safe/entity/its/TbVmsSafeMsg.java

@@ -0,0 +1,102 @@
+package com.its.safe.entity.its;
+
+import com.its.safe.dto.its.TbVmsSafeMsgDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ * VMS 재난안전 메시지 Entity Class
+ */
+@ApiModel("VMS 재난안전 메시지")
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVmsSafeMsg implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    private Long msgSeq;
+
+    @ApiModelProperty("발령 (상황) 코드")  // Y VARCHAR(1)
+    private String msgStatus;
+
+    @ApiModelProperty("발령 (구분) 코드")  // Y VARCHAR(1)
+    private String msgType;
+
+    @ApiModelProperty("이전 메시지 일련번호: (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.")  // Y NUMBER(10)
+    private Long preMsgSeq;
+
+    @ApiModelProperty("제목")  // Y VARCHAR(100)
+    private String msgTitle;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_전체: 전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, MSG_TEXT_LN_1 + MSG_TEXT_LN_2)")  // Y VARCHAR(200)
+    private String msgText;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_1행: 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    private String msgTextLn1;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_2행: 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    private String msgTextLn2;
+
+    @ApiModelProperty("지역명: 법정동 이름, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(500)
+    private String areaDesc;
+
+    @ApiModelProperty("지역 코드: 법정동 코드, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(200)
+    private String areaCode;
+
+    @ApiModelProperty("기록 시간 : 자동입력, CURRENT_TIMESTAMP()")  // Y VARCHAR(14)
+    private String crtDt;
+
+    @ApiModelProperty("메시지 표출 시작 시각")  // Y VARCHAR(14)
+    private String msgStrtDt;
+
+    @ApiModelProperty("메시지 표출 종료 시각")  // Y VARCHAR(14)
+    private String msgEndDt;
+
+    @ApiModelProperty("업데이트 시각")  // Y VARCHAR(14)
+    private String updtDt;
+
+    public TbVmsSafeMsgDto toDto() {
+        return TbVmsSafeMsgDto.builder()
+                .msgSeq(this.msgSeq)
+                .msgStatus(this.msgStatus)
+                .msgType(this.msgType)
+                .preMsgSeq(this.preMsgSeq)
+                .msgTitle(this.msgTitle)
+                .msgText(this.msgText)
+                .msgTextLn1(this.msgTextLn1)
+                .msgTextLn2(this.msgTextLn2)
+                .areaDesc(this.areaDesc)
+                .areaCode(this.areaCode)
+                .crtDt(this.crtDt)
+                .msgStrtDt(this.msgStrtDt)
+                .msgEndDt(this.msgEndDt)
+                .updtDt(this.updtDt)
+                .build();
+    }
+
+    public TbVmsSafeMsgHs toSafeMsgHs() {
+        return TbVmsSafeMsgHs.builder()
+                .msgSeq(this.msgSeq)
+                .updtDt(this.updtDt)
+                .msgStatus(this.msgStatus)
+                .msgType(this.msgType)
+                .preMsgSeq(this.preMsgSeq)
+                .msgTitle(this.msgTitle)
+                .msgText(this.msgText)
+                .msgTextLn1(this.msgTextLn1)
+                .msgTextLn2(this.msgTextLn2)
+                .areaDesc(this.areaDesc)
+                .areaCode(this.areaCode)
+                .crtDt(this.crtDt)
+                .msgStrtDt(this.msgStrtDt)
+                .msgEndDt(this.msgEndDt)
+                .build();
+    }
+
+}

+ 37 - 0
src/main/java/com/its/safe/entity/its/TbVmsSafeMsgCtlr.java

@@ -0,0 +1,37 @@
+package com.its.safe.entity.its;
+
+import com.its.safe.dto.its.TbVmsSafeMsgCtlrDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * VMS 재난안전 메시지 표출 대상 제어기 Entity Class
+ */
+@ApiModel("VMS 재난안전 메시지 표출 대상 제어기")
+@Getter
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVmsSafeMsgCtlr implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    private Long msgSeq;
+
+    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
+    private Long vmsCtlrNmbr;
+
+    public TbVmsSafeMsgCtlrDto toDto() {
+        return TbVmsSafeMsgCtlrDto.builder()
+                .msgSeq(this.msgSeq)
+                .vmsCtlrNmbr(this.vmsCtlrNmbr)
+                .build();
+    }
+
+}

+ 85 - 0
src/main/java/com/its/safe/entity/its/TbVmsSafeMsgHs.java

@@ -0,0 +1,85 @@
+package com.its.safe.entity.its;
+
+import com.its.safe.dto.its.TbVmsSafeMsgHsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * VMS 재난안전 메시지 이력 Entity Class
+ */
+@ApiModel("VMS 재난안전 메시지 이력")
+@Getter
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVmsSafeMsgHs implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 일련번호")  // N NUMBER(10)
+    private Long msgSeq;
+
+    @ApiModelProperty("업데이트 시각")  // N VARCHAR(14)
+    private String updtDt;
+
+    @ApiModelProperty("발령 (상황) 코드")  // Y VARCHAR(1)
+    private String msgStatus;
+
+    @ApiModelProperty("발령 (구분) 코드")  // Y VARCHAR(1)
+    private String msgType;
+
+    @ApiModelProperty("이전 메시지 일련번호: (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.")  // Y NUMBER(10)
+    private Long preMsgSeq;
+
+    @ApiModelProperty("제목")  // Y VARCHAR(100)
+    private String msgTitle;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_전체: 전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, MSG_TEXT_LN_1 + MSG_TEXT_LN_2)")  // Y VARCHAR(200)
+    private String msgText;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_1행: 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    private String msgTextLn1;
+
+    @ApiModelProperty("전광판 재난방송 문안(한국어)_2행: 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)")  // Y VARCHAR(100)
+    private String msgTextLn2;
+
+    @ApiModelProperty("지역명: 법정동 이름, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(500)
+    private String areaDesc;
+
+    @ApiModelProperty("지역 코드: 법정동 코드, 복수개 입력시 컴마(,)로 구분함")  // Y VARCHAR(200)
+    private String areaCode;
+
+    @ApiModelProperty("기록 시간 : 자동입력, CURRENT_TIMESTAMP()")  // Y VARCHAR(14)
+    private String crtDt;
+
+    @ApiModelProperty("메시지 표출 시작 시각")  // Y VARCHAR(14)
+    private String msgStrtDt;
+
+    @ApiModelProperty("메시지 표출 종료 시각")  // Y VARCHAR(14)
+    private String msgEndDt;
+
+    public TbVmsSafeMsgHsDto toDto() {
+        return TbVmsSafeMsgHsDto.builder()
+                .msgSeq(this.msgSeq)
+                .updtDt(this.updtDt)
+                .msgStatus(this.msgStatus)
+                .msgType(this.msgType)
+                .preMsgSeq(this.preMsgSeq)
+                .msgTitle(this.msgTitle)
+                .msgText(this.msgText)
+                .msgTextLn1(this.msgTextLn1)
+                .msgTextLn2(this.msgTextLn2)
+                .areaDesc(this.areaDesc)
+                .areaCode(this.areaCode)
+                .crtDt(this.crtDt)
+                .msgStrtDt(this.msgStrtDt)
+                .msgEndDt(this.msgEndDt)
+                .build();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/safe/entity/its/VmsMsgArea.java

@@ -0,0 +1,25 @@
+package com.its.safe.entity.its;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * VMS 메시지 법정동코드 정보 Entity Class
+ */
+@ApiModel("VMS 메시지 법정동코드 정보")
+@Data
+@Builder
+public class VmsMsgArea implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String code;
+    private String upperCode;
+    private String codeName;
+    private Integer depthLevel;
+    private String depthPath;
+    private String isLeaf;
+
+}

+ 37 - 0
src/main/java/com/its/safe/entity/safe/Area.java

@@ -0,0 +1,37 @@
+package com.its.safe.entity.safe;
+
+import com.its.safe.dto.safe.AreaDto;
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 법정동코드 정보 Entity Class
+ */
+@ApiModel("법정동코드 정보")  // 전파시 기본적으로는 법정동코드를 사용함. 개별 장비에 요청도 가능) (공용, 시스템 읽기 전용)
+@Data
+@Builder
+public class Area implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long seq;           // 테이블 seq
+    private String code;        // 법정동코드 : 행안부 법정동 기준
+    private String upperCode;   // 상위 법정동코드 : 모자 관계 파악용 상위 법정동 코드
+    private String name;        // 법정동명 (풀 네임, 예: 경상북도 포항시 남구 구룡포읍 구룡포리)
+    private Long depth;         // 단계. (1:시, 2:구, 3:읍면동, 4:리)
+    private String baseDate;    // 코드 기준일 : 해당시 1, 행안부 법정동 변경시 여러 버전 존재 가능 하므로 구별 위해 기준일 기록 (예 : 2023년 11월 기준 -> 202311)
+
+    public AreaDto toDto() {
+        return AreaDto.builder()
+                .seq(this.seq)
+                .code(this.code)
+                .upperCode(this.upperCode)
+                .name(this.name)
+                .depth(this.depth)
+                .baseDate(this.baseDate)
+                .build();
+    }
+
+}

+ 133 - 0
src/main/java/com/its/safe/entity/safe/Message.java

@@ -0,0 +1,133 @@
+package com.its.safe.entity.safe;
+
+import com.its.safe.dto.safe.MessageDto;
+import com.its.safe.entity.its.ItsDbTime;
+import com.its.safe.entity.its.TbVmsSafeMsg;
+import io.swagger.annotations.ApiModel;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+
+/**
+ * 전파 메시지 정보 Entity Class
+ */
+@ApiModel("전파 메시지 정보")
+@Data
+@Builder
+public class Message implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String STATUS_CHECK = "점검";
+
+    public static final String TYPE_MODIFY = "정정";
+    public static final String TYPE_CANCEL = "취소";
+    public static final String TYPE_CLEAR = "해제";
+
+    private Long seq;
+    private String status;  // 발령 (상황) 코드:
+                            // ① 실제 : 실제 상황
+                            // ② 훈련 : 훈련 상황
+                            // ③ 시험 : 시스템 관리 목적 으로 시험 (시스템 내부적으로만 진행하며 최종 말단 또는 장비까지의 전파는 진행 하지 않음, 예 : 전광판은 단말 표출x)
+                            // ④ 점검 : 시스템 점검 (단말정보 회신 요망 : device_of_{system_id} (각 시스템별))
+    private String msgType; // 발령 (구분) 코드 :
+                            // ① 발령 : 최초의 경보 메시지 전송임을 표현
+                            // ② 정정 : 기존 메시지에서 갱신된 내용이 있음을 표현
+                            // ③ 취소 : 이전에 발령된 경보가 오보 또는 기타 사유 경우 해당 경보를 취소하기 위해 사용 (전광판 : 이전 발령 내용 화면 표출 중지)
+                            // ④ 해제 : 이전 발령을 해제하는 내용(예 : 호우주의보가 해제되었습니다)을 전파하기 위해 사용
+    private Long preSeq;    // (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.
+    private String title;   // 제목
+    private String textBoard40Kr;   // 전광판 재난방송 문안(한국어)_전체 :  전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, textboard40_kr_1 + textboard40_kr_2)
+    private String textBoard40Kr1;  // 전광판 재난방송 문안(한국어)_1행 : 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)
+    private String textBoard40Kr2;  // 전광판 재난방송 문안(한국어)_2행 : 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)
+
+    private String areaDesc;        // 지역명 : 법정동 이름, 복수개 입력시 컴마(,)로 구분함
+    private String areaCode;        // 지역 코드 : 법정동 코드, 복수개 입력시 컴마(,)로 구분함
+    private Timestamp createTime;   // 기록 시간 : 자동입력, CURRENT_TIMESTAMP()
+
+    public void checkData() {
+        this.status = this.status.trim();
+        this.msgType = this.msgType.trim();
+        if (this.preSeq == null) {
+            this.preSeq = 0L;
+        }
+        if (this.title == null || this.title.isEmpty()) {
+            this.title = " ";
+        }
+        if (this.textBoard40Kr == null || this.textBoard40Kr.isEmpty()) {
+            this.textBoard40Kr = " ";
+        }
+        if (this.textBoard40Kr1 == null || this.textBoard40Kr1.isEmpty()) {
+            this.textBoard40Kr1 = " ";
+        }
+        if (this.textBoard40Kr2 == null || this.textBoard40Kr2.isEmpty()) {
+            this.textBoard40Kr2 = " ";
+        }
+    }
+    public MessageDto toDto() {
+        return MessageDto.builder()
+                .seq(this.seq)
+                .status(this.status.trim())
+                .msgType(this.msgType.trim())
+                .preSeq(this.preSeq)
+                .title(this.title)
+                .textBoard40Kr(this.textBoard40Kr)
+                .textBoard40Kr1(this.textBoard40Kr1)
+                .textBoard40Kr2(this.textBoard40Kr2)
+                .areaDesc(this.areaDesc)
+                .areaCode(this.areaCode)
+                .createTime(this.createTime)
+                .build();
+    }
+
+//    public String statusToCode() {
+//        // ① 실제 : 실제 상황
+//        // ② 훈련 : 훈련 상황
+//        // ③ 시험 : 시스템 관리 목적 으로 시험 (시스템 내부적으로만 진행하며 최종 말단 또는 장비까지의 전파는 진행 하지 않음, 예 : 전광판은 단말 표출x)
+//        // ④ 점검 : 시스템 점검 (단말정보 회신 요망 : device_of_{system_id} (각 시스템별))
+//        String tmpStatus = this.status.trim();
+//        if ("실제".equals(tmpStatus)) return "1";
+//        if ("훈련".equals(tmpStatus)) return "2";
+//        if ("시험".equals(tmpStatus)) return "3";
+//        if ("점검".equals(tmpStatus)) return "4";
+//        return "5"; // 알수없음
+//    }
+//
+//    public String typeToCode() {
+//        // ① 발령 : 최초의 경보 메시지 전송임을 표현
+//        // ② 정정 : 기존 메시지에서 갱신된 내용이 있음을 표현
+//        // ③ 취소 : 이전에 발령된 경보가 오보 또는 기타 사유 경우 해당 경보를 취소하기 위해 사용 (전광판 : 이전 발령 내용 화면 표출 중지)
+//        // ④ 해제 : 이전 발령을 해제하는 내용(예 : 호우주의보가 해제되었습니다)을 전파하기 위해 사용
+//        String tmpMsgType = this.msgType.trim();
+//        if ("발령".equals(tmpMsgType)) return "1";
+//        if ("정정".equals(tmpMsgType)) return "2";
+//        if ("취소".equals(tmpMsgType)) return "3";
+//        if ("해제".equals(tmpMsgType)) return "4";
+//        return "5"; // 알수없음
+//    }
+
+    public String getCreateTimeString() {
+        return new SimpleDateFormat("yyyyMMddHHmmss").format(this.createTime);
+    }
+    public TbVmsSafeMsg toSafeMsg(ItsDbTime dbTime) {
+        return TbVmsSafeMsg.builder()
+                .msgSeq(this.seq)
+                .msgStatus(this.status)
+                .msgType(this.msgType)
+                .preMsgSeq(this.preSeq)
+                .msgTitle(this.title)
+                .msgText(this.textBoard40Kr)
+                .msgTextLn1(this.textBoard40Kr1)
+                .msgTextLn2(this.textBoard40Kr2)
+                .areaDesc(this.areaDesc)
+                .areaCode(this.areaCode)
+                .crtDt(getCreateTimeString())
+                .msgStrtDt(dbTime.getCurrentTime())
+                .msgEndDt(dbTime.getMsgEndDt())
+                .updtDt(dbTime.getCurrentTime())
+                .build();
+    }
+
+}

+ 4 - 4
src/main/java/com/its/safe/entity/safe/TbReadCheck.java → src/main/java/com/its/safe/entity/safe/ReadCheck.java

@@ -1,6 +1,6 @@
 package com.its.safe.entity.safe;
 
-import com.its.safe.dto.safe.TbReadCheckDto;
+import com.its.safe.dto.safe.ReadCheckDto;
 import io.swagger.annotations.ApiModel;
 import lombok.Builder;
 import lombok.Data;
@@ -14,7 +14,7 @@ import java.sql.Timestamp;
 @ApiModel("전파 메시지 상황 정보")
 @Data
 @Builder
-public class TbReadCheck implements Serializable {
+public class ReadCheck implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Long seq;
@@ -23,8 +23,8 @@ public class TbReadCheck implements Serializable {
     private Timestamp requestTime;
     private Timestamp responseTime;
 
-    public TbReadCheckDto toDto() {
-        return TbReadCheckDto.builder()
+    public ReadCheckDto toDto() {
+        return ReadCheckDto.builder()
                 .seq(this.seq)
                 .messageSeq(this.messageSeq)
                 .systemId(this.systemId)

+ 0 - 57
src/main/java/com/its/safe/entity/safe/TbMessage.java

@@ -1,57 +0,0 @@
-package com.its.safe.entity.safe;
-
-import com.its.safe.dto.safe.TbMessageDto;
-import io.swagger.annotations.ApiModel;
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.sql.Timestamp;
-
-/**
- * 전파 메시지 정보 Entity Class
- */
-@ApiModel("전파 메시지 정보")
-@Data
-@Builder
-public class TbMessage implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private Long seq;
-    private String status;  // 발령 (상황) 코드:
-                            // ① 실제 : 실제 상황
-                            // ② 훈련 : 훈련 상황
-                            // ③ 시험 : 시스템 관리 목적 으로 시험 (시스템 내부적으로만 진행하며 최종 말단 또는 장비까지의 전파는 진행 하지 않음, 예 : 전광판은 단말 표출x)
-                            // ④ 점검 : 시스템 점검 (단말정보 회신 요망 : device_of_{system_id} (각 시스템별))
-    private String msgType; // 발령 (구분) 코드 :
-                            // ① 발령 : 최초의 경보 메시지 전송임을 표현
-                            // ② 정정 : 기존 메시지에서 갱신된 내용이 있음을 표현
-                            // ③ 취소 : 이전에 발령된 경보가 오보 또는 기타 사유 경우 해당 경보를 취소하기 위해 사용 (전광판 : 이전 발령 내용 화면 표출 중지)
-                            // ④ 해제 : 이전 발령을 해제하는 내용(예 : 호우주의보가 해제되었습니다)을 전파하기 위해 사용
-    private Long preSeq;    // (msg_type = 정정, 취소, 해제)시 처리할 대상인 이전 seq, 없으면 최근 것을 대상으로 처리하면 됨.
-    private String title;   // 제목
-    private String textBoard40Kr;   // 전광판 재난방송 문안(한국어)_전체 :  전광판 표출될 전체 문장 (한글 기준 20자 표출 가능시 전체 문장, textboard40_kr_1 + textboard40_kr_2)
-    private String textBoard40Kr1;  // 전광판 재난방송 문안(한국어)_1행 : 전광판이 2행으로 표출 될 경우 (상행)에 표출될 문장 (가로 10자 X 세로 2행 기준)
-    private String textBoard40Kr2;  // 전광판 재난방송 문안(한국어)_2행 : 전광판이 2행으로 표출 될 경우 (하행)에 표출될 문장 (가로 10자 X 세로 2행 기준)
-
-    private String areaDesc;        // 지역명 : 법정동 이름, 복수개 입력시 컴마(,)로 구분함
-    private String areaCode;        // 지역 코드 : 법정동 코드, 복수개 입력시 컴마(,)로 구분함
-    private Timestamp createTime;   // 기록 시간 : 자동입력, CURRENT_TIMESTAMP()
-
-    public TbMessageDto toDto() {
-        return TbMessageDto.builder()
-                .seq(this.seq)
-                .status(this.status.trim())
-                .msgType(this.msgType.trim())
-                .preSeq(this.preSeq)
-                .title(this.title)
-                .textBoard40Kr(this.textBoard40Kr)
-                .textBoard40Kr1(this.textBoard40Kr1)
-                .textBoard40Kr2(this.textBoard40Kr2)
-                .areaDesc(this.areaDesc)
-                .areaCode(this.areaCode)
-                .createTime(this.createTime)
-                .build();
-    }
-
-}

+ 0 - 135
src/main/java/com/its/safe/service/NodeLinkService.java

@@ -1,135 +0,0 @@
-package com.its.safe.service;
-
-import com.its.app.utils.Elapsed;
-import com.its.app.utils.SysUtils;
-import com.its.safe.config.ServerConfig;
-import com.its.safe.dao.mapper.its.VmsMapper;
-import com.its.safe.dto.its.TbLinkDto;
-import com.its.safe.dto.its.TbNodeDto;
-import com.its.safe.entity.its.MakeTrafParam;
-import com.its.safe.entity.its.TbLink;
-import com.its.safe.entity.its.TbNode;
-import com.its.safe.entity.its.TbNodeRgn;
-import com.its.safe.process.DbmsData;
-import com.its.safe.process.DbmsDataProcess;
-import com.its.safe.process.DbmsDataType;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.PostConstruct;
-import java.util.List;
-
-@Slf4j
-//@Service
-@RequiredArgsConstructor
-@Transactional(rollbackFor = {Exception.class})
-public class NodeLinkService {
-
-    private final ServerConfig config;
-    private final AppRepositoryService repoService;
-    private final VmsMapper mapper;
-    private final DbmsDataProcess dbmsDataProcess;
-
-    @PostConstruct
-    private void init() {
-        log.info("NodeService.init: Start.");
-        log.info("NodeService.init: ..End.");
-    }
-
-    public void loadDb() {
-        loadNodeInfo();
-        loadNodeRgnInfo();
-        loadLinkInfo();
-    }
-
-    public void loadNodeInfo() {
-        Elapsed elapsed = new Elapsed();
-
-        try {
-            List<TbNode> infoList  = this.mapper.selectNodeAll();
-            log.info("NodeService.loadNodeInfo: {} EA", infoList.size());
-            for (TbNode dto : infoList) {
-//                log.info("NodeService.loadNodeInfo: {}.", dto);
-                TbNodeDto nodeObj = dto.toDto();
-                nodeObj.setBisRadius((float)this.config.getMaxDistance());
-                this.repoService.putNodeMap(nodeObj);
-            }
-        }
-        catch (Exception e) {
-            log.error("NodeService.loadNodeInfo: {}.", e.toString());
-        }
-
-        this.repoService.getNodeMap().forEach((key, obj) -> {
-            log.info("NodeService.loadNodeInfo:: {}.", obj.toString());
-        });
-        log.info("NodeService.loadNodeInfo: {} EA, {} ms.", this.repoService.getNodeMap().size(), elapsed.milliSeconds());
-    }
-    public void loadNodeRgnInfo() {
-        Elapsed elapsed = new Elapsed();
-
-        try {
-            List<TbNodeRgn> infoList  = this.mapper.selectNodeRgnAll();
-            log.info("NodeService.loadNodeRgnInfo: {} EA", infoList.size());
-            for (TbNodeRgn dto : infoList) {
-                log.info("NodeService.loadNodeRgnInfo: {}.", dto);
-                TbNodeDto nodeObj = this.repoService.getNodeMap().get(dto.getNodeId());
-                if (nodeObj != null) {
-                    if (dto.getBisRad() < 10) {
-                        dto.setBisRad(10);
-                    }
-                    nodeObj.setBisRadius(dto.getBisRad());
-                    if (dto.getBisRad() > this.config.getMaxDistance()) {
-                        this.config.setMaxDistance(dto.getBisRad());
-                    }
-                }
-            }
-        }
-        catch (Exception e) {
-            log.error("NodeService.loadNodeRgnInfo: {}.", e.toString());
-        }
-        log.info("NodeService.loadNodeRgnInfo: {} EA, {} ms.", this.repoService.getNodeMap().size(), elapsed.milliSeconds());
-    }
-
-    public void loadLinkInfo() {
-        Elapsed elapsed = new Elapsed();
-
-        try {
-            List<TbLink> infoList  = this.mapper.selectLinkAll();
-            log.info("NodeService.loadLinkInfo: {} EA", infoList.size());
-            for (TbLink dto : infoList) {
-//                log.info("NodeService.loadLinkInfo: {}.", dto);
-                TbLinkDto linkObj = dto.toDto();
-                this.repoService.putLinkMap(linkObj);
-                this.repoService.putSectMap(linkObj);
-            }
-        }
-        catch (Exception e) {
-            log.error("NodeService.loadLinkInfo: {}.", e.toString());
-        }
-
-        this.repoService.getLinkMap().forEach((key, obj) -> {
-            log.info("NodeService.loadLinkInfo:: {}.", obj.toString());
-        });
-        log.info("NodeService.loadLinkInfo: LINK: {} EA, SECT: {} EA, {} ms.", this.repoService.getLinkMap().size(), this.repoService.getSectMap().size(), elapsed.milliSeconds());
-    }
-
-    /**
-     * BIS 구간 소통정보 생성
-     */
-    public void makeBisLinkTraf() {
-        int historyMin = this.config.getHistoryMin();
-        int minSpeed = this.config.getMinSpeed();
-        int maxSpeed = this.config.getMaxSpeed();
-        String currentTm = SysUtils.getSysTime();
-
-        MakeTrafParam makeParam = MakeTrafParam.builder()
-                .PRCN_DT(currentTm)
-                .FROM_MIN(historyMin)
-                .MIN_SPEED(minSpeed)
-                .MAX_SPEED(maxSpeed)
-                .build();
-        this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CRT_BIS_LINK_TRAF, false, makeParam));
-    }
-
-}

+ 0 - 95
src/main/java/com/its/safe/service/StatisticsServices.java

@@ -1,95 +0,0 @@
-package com.its.safe.service;
-
-import com.its.app.utils.Elapsed;
-import com.its.app.utils.TimeUtils;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import java.util.Calendar;
-import java.util.Date;
-
-@Slf4j
-@Service
-@Transactional(rollbackFor = {Exception.class})
-public class StatisticsServices {
-
-    //private RseStatMapper statMapper;
-    private final String logKey = "statistics";
-
-    @PostConstruct
-    private void init() {
-//        this.statMapper = (RseStatMapper) AppUtils.getBean(RseStatMapper.class);
-    }
-
-    @PreDestroy
-    public void destroyService() {
-    }
-
-    @Async("statisticsExecutor")
-    public void CRT_TB_RSE_OBU_CLCT_STAT_HH(String statDt, String fromDt, String toDt) {
-        MDC.put("id", logKey);
-        Elapsed elapsed = new Elapsed();
-//        voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
-//        log.info("CRT_RSE_OBU_CLCT_STAT_HH: start. [{}], {}", statTime, Thread.currentThread().getName());
-//        this.statMapper.CRT_TB_RSE_OBU_CLCT_STAT_HH(statTime);
-//        log.info("CRT_RSE_OBU_CLCT_STAT_HH: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
-        MDC.remove(logKey);
-        MDC.clear();
-    }
-
-    @Async("statisticsExecutor")
-    public void CRT_TB_RSE_OBU_CLCT_STAT_DD(String statDt, String fromDt, String toDt) {
-        MDC.put("id", logKey);
-        Elapsed elapsed = new Elapsed();
-//        voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
-//        log.info("CRT_RSE_OBU_CLCT_STAT_DD: start. [{}], {}", statTime, Thread.currentThread().getName());
-//        this.statMapper.CRT_TB_RSE_OBU_CLCT_STAT_DD(statTime);
-//        log.info("CRT_RSE_OBU_CLCT_STAT_DD: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
-        MDC.remove(logKey);
-        MDC.clear();
-    }
-
-    public static int getDayWeek(Date paramDt) {
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(paramDt);
-        return cal.get(Calendar.DAY_OF_WEEK);		/* DAY_OF_WEEK 리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다. */
-    }
-
-    public String getDayWeekCd(int week) {
-        String sWeek = "DTW0";
-        switch(week) {
-            case 1: sWeek = "DTW7";	break;
-            case 2: sWeek = "DTW1";	break;
-            case 3: sWeek = "DTW2";	break;
-            case 4: sWeek = "DTW3";	break;
-            case 5: sWeek = "DTW4";	break;
-            case 6: sWeek = "DTW5";	break;
-            case 7: sWeek = "DTW6"; break;
-        }
-        return sWeek;
-    }
-
-    @Async("statisticsExecutor")
-    public void CRT_TB_RSE_OD_STAT_HH(String statDt, String fromDt, String toDt) {
-        MDC.put("id", logKey);
-        Elapsed elapsed = new Elapsed();
-        Date dtStat = TimeUtils.stringToDate(statDt);
-        String weekCd = getDayWeekCd(getDayWeek(dtStat));
-//        voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
-//        statTime.setDAY_TYPE_CD(weekCd);
-//        statTime.setB_FROM_DT(TimeUtils.getTime(dtStat, TimeUtils.TYPE_PRCS_30MIN));
-//        statTime.setB_TO_DT(TimeUtils.getToTime(statTime.getB_FROM_DT(), TimeUtils.TYPE_PRCS_30MIN));
-//        //log.info("{}", statTime);
-//        log.info("------CRT_RSE_OD_STAT_HH: start. [{}], {}", statTime, Thread.currentThread().getName());
-//        this.statMapper.CRT_TB_RSE_OD_STAT_HH(statTime);
-//        log.info("------CRT_RSE_OD_STAT_HH: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
-        MDC.remove(logKey);
-        MDC.clear();
-    }
-
-}

+ 108 - 19
src/main/java/com/its/safe/service/VmsSafeAdapterService.java

@@ -2,11 +2,13 @@ package com.its.safe.service;
 
 import com.its.app.utils.Elapsed;
 import com.its.safe.config.ApplicationConfig;
+import com.its.safe.dao.mapper.its.VmsMapper;
 import com.its.safe.dao.mapper.safe.VmsSafeMapper;
-import com.its.safe.dto.safe.TbMessageDto;
-import com.its.safe.entity.safe.TbArea;
-import com.its.safe.entity.safe.TbMessage;
-import com.its.safe.entity.safe.TbReadCheck;
+import com.its.safe.dto.its.ItsDbTimeParam;
+import com.its.safe.dto.its.TbVmsCtlrDto;
+import com.its.safe.entity.its.*;
+import com.its.safe.entity.safe.Message;
+import com.its.safe.entity.safe.ReadCheck;
 import com.its.safe.process.DbmsDataProcess;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -14,8 +16,11 @@ 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.Map;
 import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
 @Getter
@@ -25,42 +30,108 @@ import java.util.StringTokenizer;
 public class VmsSafeAdapterService {
 
     private final ApplicationConfig appConfig;
+    private final ConcurrentHashMap<Long, TbVmsCtlrDto> vmsCtlrMap = new ConcurrentHashMap<>();
     private final DbmsDataProcess dbmsDataProcess;
+    private final VmsMapper vmsMapper;
     private final VmsSafeMapper vmsSafeMapper;
 
     public void run() {
         Elapsed elapsed = new Elapsed();
         selectArea();
-
+        selectVmsCtlrInfo();
         selectNewSafeMessage();
         updateConnCheck();
         log.info("VmsSafeAdapterService.run:: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
+    public void selectVmsCtlrInfo() {
+        Elapsed elapsed = new Elapsed();
+        try {
+            List<TbVmsCtlr> vmsList = this.vmsMapper.selectVmsCtlrInfo();
+            log.info("VmsSafeAdapterService.selectVmsCtlrInfo(), {} EA", vmsList.size());
+            for (Map.Entry<Long, TbVmsCtlrDto> e : this.vmsCtlrMap.entrySet()) {
+                // 초기화, 기존 정보 삭제로 초기화
+                e.getValue().setDelYn("Y");
+            }
+
+            for (TbVmsCtlr ctlr : vmsList) {
+                TbVmsCtlrDto obj = ctlr.toDto();
+                log.info("VmsSafeAdapterService.selectVmsCtlrInfo: {}.", obj);
+                this.vmsCtlrMap.put(obj.getVmsCtlrNmbr(), obj);
+            }
+        }
+        catch (Exception e) {
+            log.error("VmsSafeAdapterService.selectVmsCtlrInfo: Exception: {}.", e.toString());
+        }
+        log.info("VmsSafeAdapterService.selectVmsCtlrInfo: {}", this.vmsCtlrMap);
+        log.info("VmsSafeAdapterService.selectVmsCtlrInfo:: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
     public void selectNewSafeMessage() {
         Elapsed elapsed = new Elapsed();
         try {
-            List<TbReadCheck> checkList = this.vmsSafeMapper.selectNewVmsSafeMessage(this.appConfig.getSafeSystemId());
+            ItsDbTimeParam param = ItsDbTimeParam.builder()
+                    .msgDsplEndMin(this.appConfig.getMsgDsplEndMin())
+                    .msgDsplClearMin(this.appConfig.getMsgDsplClearMin()).build();
+            ItsDbTime dbTime = this.vmsMapper.getCurrentTime(param);
+            log.info("VmsSafeAdapterService.selectNewSafeMessage(), {}", dbTime);
+            List<ReadCheck> checkList = this.vmsSafeMapper.selectNewVmsSafeMessage(this.appConfig.getSafeSystemId());
             log.info("VmsSafeAdapterService.selectNewSafeMessage(), {} EA", checkList.size());
-            for (TbReadCheck chkMessage : checkList) {
+            for (ReadCheck chkMessage : checkList) {
                 log.info("VmsSafeAdapterService.selectNewSafeMessage: {}.", chkMessage.toDto());
 
-                List<TbMessage> messageList = this.vmsSafeMapper.selectVmsSafeMessage(chkMessage.getMessageSeq());
-                for (TbMessage message : messageList) {
-                    TbMessageDto msgDto = message.toDto();
-                    log.info("VmsSafeAdapterService.selectVmsSafeMessage: {}.", msgDto);
-
-//                    String[] codes = msgDto.getAreaCode().split(",");   // 빈 문자열 분리.
-//                    for (int ii = 0; ii < codes.length; ii++) {
-//                        log.info("VmsSafeAdapterService.selectVmsSafeMessage: SEQ {}, {} EA, AREA_CODE [{}]", msgDto.getSeq(), codes.length, codes[ii]);
-//                    }
+                List<Message> messageList = this.vmsSafeMapper.selectVmsSafeMessage(chkMessage.getMessageSeq());
+                for (Message message : messageList) {
+                    message.checkData();
+                    TbVmsSafeMsg safeMsg = message.toSafeMsg(dbTime);
+                    TbVmsSafeMsgHs safeMsgHs = safeMsg.toSafeMsgHs();
 
-                    StringTokenizer areaCodes = new StringTokenizer(msgDto.getAreaCode(), ",");
+                    log.info("VmsSafeAdapterService.selectVmsSafeMessage: {}.", safeMsg);
+                    StringTokenizer areaCodes = new StringTokenizer(safeMsg.getAreaCode(), ",");
                     int areaCount = areaCodes.countTokens();
+                    List<String> codeList = new ArrayList<>();
                     while(areaCodes.hasMoreTokens()){
                         String areaCode = areaCodes.nextToken().trim();
-                        log.info("VmsSafeAdapterService.selectVmsSafeMessage: SEQ {}, {} EA, AREA_CODE [{}].", msgDto.getSeq(), areaCount, areaCode);
+                        codeList.add(areaCode);
+                        log.info("VmsSafeAdapterService.selectVmsSafeMessage: SEQ {}, {} EA, AREA_CODE [{}].", safeMsg.getMsgSeq(), areaCount, areaCode);
+                    }
+
+                    safeMsg.setMsgType("취소");
+                    safeMsg.setPreMsgSeq(safeMsg.getMsgSeq());
+                    log.info("VmsSafeAdapterService.selectVmsSafeMessage: IN_AREA_CODE [{}].", codeList);
+                    if (codeList.isEmpty()) {
+                        continue;
+                    }
+                    List<Long> targetVmsList = selectSafeMsgTargetVms(codeList);
+
+                    if (Message.TYPE_MODIFY.equals(safeMsg.getMsgType())) {
+                        // 정정
                     }
+                    else if (Message.TYPE_CANCEL.equals(safeMsg.getMsgType())) {
+                        // 취소
+                        TbVmsSafeMsg cancelMsg = TbVmsSafeMsg.builder()
+                                .msgSeq(safeMsg.getPreMsgSeq())
+                                .msgType(safeMsg.getMsgType())
+                                .msgEndDt(dbTime.getMsgCancelDt())
+                                .updtDt(dbTime.getCurrentTime())
+                                .build();
+                        this.vmsMapper.cancelVmsSafeMsg(cancelMsg);
+                    }
+                    else if (Message.TYPE_CLEAR.equals(safeMsg.getMsgType())) {
+                        // 해제 ==> 해제 메시지 표출
+                    }
+                    else {
+
+                    }
+
+                    this.vmsMapper.createVmsSafeMsg(safeMsg);
+                    //this.vmsMapper.insertVmsSafeMsgHs(safeMsgHs);
+                    this.vmsMapper.deleteVmsSafeMsgCtlr(TbVmsSafeMsgCtlr.builder().msgSeq(safeMsg.getMsgSeq()).vmsCtlrNmbr(0L).build());
+                    for (Long vmsCtlrNmbr : targetVmsList) {
+                        this.vmsMapper.createVmsSafeMsgCtlr(TbVmsSafeMsgCtlr.builder().msgSeq(safeMsg.getMsgSeq()).vmsCtlrNmbr(vmsCtlrNmbr).build());
+                    }
+
+                    updateConfirmNewVmsSafeMessage(safeMsg.getMsgSeq());
                 }
             }
         }
@@ -87,7 +158,7 @@ public class VmsSafeAdapterService {
     public void selectArea() {
         Elapsed elapsed = new Elapsed();
         try {
-            List<TbArea> resultList = this.vmsSafeMapper.selectArea();
+            List<TbArea> resultList = this.vmsMapper.selectArea();
             log.info("VmsSafeAdapterService.selectArea(), {} EA", resultList.size());
             for (TbArea area : resultList) {
                 log.info("VmsSafeAdapterService.selectArea: {}.", area.toDto());
@@ -99,6 +170,24 @@ public class VmsSafeAdapterService {
         log.info("VmsSafeAdapterService.selectArea:: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
+    public List<Long> selectSafeMsgTargetVms(List<String> areaCodes) {
+        Elapsed elapsed = new Elapsed();
+        List<Long> vmsList = new ArrayList<>();
+        try {
+            List<SafeMsgTargetVms> resultList = this.vmsMapper.selectSafeMsgTargetVms(areaCodes);
+            log.info("VmsSafeAdapterService.selectVmsMsgArea(), {} EA", resultList.size());
+            for (SafeMsgTargetVms vms : resultList) {
+                log.info("VmsSafeAdapterService.selectVmsMsgArea: {}.", vms);
+                vmsList.add(vms.getVmsCtlrNmbr());
+            }
+        }
+        catch (Exception e) {
+            log.error("VmsSafeAdapterService.selectVmsMsgArea: Exception: {}.", e.toString());
+        }
+        log.info("VmsSafeAdapterService.selectVmsMsgArea:: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+        return vmsList;
+    }
+
     public void updateConnCheck() {
         Elapsed elapsed = new Elapsed();
         String systemId = this.appConfig.getSafeSystemId();

+ 203 - 28
src/main/resources/mybatis/mapper/its/VmsMapper.xml

@@ -3,43 +3,218 @@
 
 <mapper namespace="com.its.safe.dao.mapper.its.VmsMapper">
 
-    <select id="selectNodeAll" resultType="com.its.safe.entity.its.TbNode" fetchSize="1000">
+    <select id="getCurrentTime" parameterType="com.its.safe.dto.its.ItsDbTimeParam" resultType="com.its.safe.entity.its.ItsDbTime" fetchSize="1">
     <![CDATA[
-        SELECT A.NODE_ID,
-               A.NODE_TYPE,
-               A.NODE_NAME,
-               A.TURN_P,
-               A.RMRK,
-               A.X_CRDN,
-               A.Y_CRDN
-        FROM TB_NODE A
+        SELECT to_char(sysdate, 'YYYYMMDDHH24MISS') as currentTime,
+               to_char(sysdate+#{param.msgDsplEndMin}/1440, 'YYYYMMDDHH24MISS') as msgEndDt,
+               to_char(sysdate+#{param.msgDsplClearMin}/1440, 'YYYYMMDDHH24MISS') as msgClearDt,
+               to_char(sysdate-5/1440, 'YYYYMMDDHH24MISS') as msgCancelDt
+        FROM dual
         ]]>
     </select>
 
-    <select id="selectNodeRgnAll" resultType="com.its.safe.entity.its.TbNodeRgn" fetchSize="1000">
+    <select id="selectArea" resultType="com.its.safe.entity.its.TbArea" fetchSize="500">
     <![CDATA[
-        SELECT A.NODE_ID,
-               A.BIS_RAD
-        FROM TB_NODE_RGN A
+        SELECT A.code as code,
+               A.upper_code as upperCode,
+               A.name as name,
+               A.depth as depth,
+               A.base_date as baseDate
+        FROM tb_area A
+        WHERE 1=1
         ]]>
     </select>
 
-    <select id="selectLinkAll" resultType="com.its.safe.entity.its.TbLink" fetchSize="1000">
-    <![CDATA[
-        SELECT A.LINK_ID,
-               A.F_NODE_ID,
-               A.T_NODE_ID,
-               A.LANES,
-               A.ROAD_RANK,
-               A.ROAD_TYPE,
-               A.ROAD_NO,
-               A.ROAD_NAME,
-               A.MAX_SPD,
-               A.LINK_LENG,
-               A.DEL_YN
-        FROM TB_LINK A
-       WHERE A.LINK_LENG > 1
+    <select id="selectVmsMsgArea" parameterType="java.util.List" resultType="com.its.safe.entity.its.VmsMsgArea" fetchSize="100">
+        SELECT code as code
+             , upper_code as upperCode
+             , LPAD(' ', (LEVEL-1)*4) || name AS codeName
+             , LEVEL as depthLevel
+             , REGEXP_REPLACE(SYS_CONNECT_BY_PATH(upper_code, ' -> '), '^\s+\-\>\s+', '') as depthPath
+             , CONNECT_BY_ISLEAF AS isLeaf
+        FROM tb_area
+        WHERE 1=1
+          AND CONNECT_BY_ISLEAF = 1
+            <if test="areaList != null and areaList.size > 0">
+                <foreach collection="areaList" item="code" index="index" open="START WITH code in (" close=") CONNECT BY PRIOR code = upper_code" separator=", ">
+                    '' || #{code} || ''
+                </foreach>
+            </if>
+    </select>
+
+    <select id="selectSafeMsgTargetVms" parameterType="java.util.List" resultType="com.its.safe.entity.its.SafeMsgTargetVms" fetchSize="100">
+        select distinct vms_ctlr_nmbr as vmsCtlrNmbr
+        from tb_vms_ctlr x, (
+        SELECT code as code
+        , upper_code as upperCode
+        , LPAD(' ', (LEVEL-1)*4) || name AS codeName
+        , LEVEL as depthLevel
+        , REGEXP_REPLACE(SYS_CONNECT_BY_PATH(upper_code, ' -> '), '^\s+\-\>\s+', '') as depthPath
+        , CONNECT_BY_ISLEAF AS isLeaf
+        FROM tb_area
+        WHERE 1=1
+        AND CONNECT_BY_ISLEAF = 1
+        <if test="areaList != null and areaList.size > 0">
+            <foreach collection="areaList" item="code" index="index" open="START WITH code in (" close=") CONNECT BY PRIOR code = upper_code" separator=", ">
+                '' || #{code} || ''
+            </foreach>
+        </if>
+        ) y
+        where 1=1
+        and x.del_yn = 'N'
+        and x.area_code = y.code
+    </select>
+
+    <select id="selectVmsCtlrInfo" resultType="com.its.safe.entity.its.TbVmsCtlr" fetchSize="30">
+    <![CDATA[
+        select vms_ctlr_nmbr, vms_id, vms_ctlr_id, vms_nm, area_code, istl_lctn_addr, y_crdn, x_crdn, del_yn
+        from tb_vms_ctlr
+        where 1=1
+          and del_yn = 'N'
         ]]>
     </select>
 
+
+    <update id="createVmsSafeMsg" parameterType="com.its.safe.entity.its.TbVmsSafeMsg">
+    <![CDATA[
+        merge into tb_vms_safe_msg L
+            using (select
+                       #{obj.msgSeq}        AS msg_seq,
+                       #{obj.msgStatus}     AS msg_status,
+                       #{obj.msgType}       AS msg_type,
+                       #{obj.preMsgSeq}     AS pre_msg_seq,
+                       #{obj.msgTitle}      AS msg_title,
+                       #{obj.msgText}       AS msg_text,
+                       #{obj.msgTextLn1}    AS msg_text_ln_1,
+                       #{obj.msgTextLn2}    AS msg_text_ln_2,
+                       #{obj.areaDesc}      AS area_desc,
+                       #{obj.areaCode}      AS area_code,
+                       #{obj.crtDt}         AS crt_dt,
+                       #{obj.msgStrtDt}     AS msg_strt_dt,
+                       #{obj.msgEndDt}      AS msg_end_dt,
+                       #{obj.updtDt}        AS updt_dt
+                   from dual) M
+            on (    L.msg_seq = M.msg_seq)
+            when matched then
+                update set
+                    L.msg_status    = M.msg_status,
+                    L.msg_type      = M.msg_type,
+                    L.pre_msg_seq   = M.pre_msg_seq,
+                    L.msg_title     = M.msg_title,
+                    L.msg_text      = M.msg_text,
+                    L.msg_text_ln_1 = M.msg_text_ln_1,
+                    L.msg_text_ln_2 = M.msg_text_ln_2,
+                    L.area_desc     = M.area_desc,
+                    L.area_code     = M.area_code,
+                    L.crt_dt        = M.crt_dt,
+--                     L.msg_strt_dt   = M.msg_strt_dt,
+                    L.msg_end_dt    = M.msg_end_dt,
+                    L.updt_dt       = M.updt_dt
+            when not matched then
+                insert (
+                        msg_seq,
+                        msg_status,
+                        msg_type,
+                        pre_msg_seq,
+                        msg_title,
+                        msg_text,
+                        msg_text_ln_1,
+                        msg_text_ln_2,
+                        area_desc,
+                        area_code,
+                        crt_dt,
+                        msg_strt_dt,
+                        msg_end_dt,
+                        updt_dt )
+                    values (
+                       M.msg_seq,
+                       M.msg_status,
+                       M.msg_type,
+                       M.pre_msg_seq,
+                       M.msg_title,
+                       M.msg_text,
+                       M.msg_text_ln_1,
+                       M.msg_text_ln_2,
+                       M.area_desc,
+                       M.area_code,
+                       M.crt_dt,
+                       M.msg_strt_dt,
+                       M.msg_end_dt,
+                       M.updt_dt )
+        ]]>
+    </update>
+
+    <update id="cancelVmsSafeMsg" parameterType="com.its.safe.entity.its.TbVmsSafeMsg">
+    <![CDATA[
+        update tb_vms_safe_msg
+        set
+            msg_type      = #{obj.msgType},
+            msg_end_dt    = #{obj.msgEndDt},
+            updt_dt       = #{obj.updtDt}
+        where msg_seq = #{obj.msgSeq}
+        ]]>
+    </update>
+
+    <insert id="insertVmsSafeMsgHs" parameterType="com.its.safe.entity.its.TbVmsSafeMsgHs">
+    <![CDATA[
+        insert into tb_vms_safe_msg_hs (
+            msg_seq,
+            updt_dt,
+            msg_status,
+            msg_type,
+            pre_msg_seq,
+            msg_title,
+            msg_text,
+            msg_text_ln_1,
+            msg_text_ln_2,
+            area_desc,
+            area_code,
+            crt_dt,
+            msg_strt_dt,
+            msg_end_dt )
+        values (
+           #{obj.msgSeq},
+           #{obj.updtDt},
+           #{obj.msgStatus},
+           #{obj.msgType},
+           #{obj.preMsgSeq},
+           #{obj.msgTitle},
+           #{obj.msgText},
+           #{obj.msgTextLn1},
+           #{obj.msgTextLn2},
+           #{obj.areaDesc},
+           #{obj.areaCode},
+           #{obj.crtDt},
+           #{obj.msgStrtDt},
+           #{obj.msgEndDt}
+               )
+        ]]>
+    </insert>
+
+    <delete id="deleteVmsSafeMsgCtlr" parameterType="com.its.safe.entity.its.TbVmsSafeMsgCtlr">
+    <![CDATA[
+        delete from tb_vms_safe_msg_ctlr
+        where msg_seq = #{obj.msgSeq}
+        ]]>
+    </delete>
+
+    <update id="createVmsSafeMsgCtlr" parameterType="com.its.safe.entity.its.TbVmsSafeMsgCtlr">
+    <![CDATA[
+        merge into tb_vms_safe_msg_ctlr L
+            using (select
+                       #{obj.msgSeq}      AS msg_seq,
+                       #{obj.vmsCtlrNmbr} AS vms_ctlr_nmbr
+                   from dual) M
+            on (    L.msg_seq = M.msg_seq
+                and L.vms_ctlr_nmbr = M.vms_ctlr_nmbr)
+        when not matched then
+        insert (
+                   msg_seq,
+                   vms_ctlr_nmbr )
+        values (
+                   M.msg_seq,
+                   M.vms_ctlr_nmbr )
+        ]]>
+    </update>
+
 </mapper>

+ 3 - 3
src/main/resources/mybatis/mapper/safe/VmsSafeMapper.xml

@@ -3,7 +3,7 @@
 
 <mapper namespace="com.its.safe.dao.mapper.safe.VmsSafeMapper">
 
-    <select id="selectArea" resultType="com.its.safe.entity.safe.TbArea" fetchSize="500">
+    <select id="selectArea" resultType="com.its.safe.entity.safe.Area" fetchSize="500">
     <![CDATA[
         SELECT A.seq as seq,
                A.code as code,
@@ -16,7 +16,7 @@
         ]]>
     </select>
 
-    <select id="selectNewVmsSafeMessage" parameterType="java.lang.String" resultType="com.its.safe.entity.safe.TbReadCheck" fetchSize="20">
+    <select id="selectNewVmsSafeMessage" parameterType="java.lang.String" resultType="com.its.safe.entity.safe.ReadCheck" fetchSize="20">
     <![CDATA[
         SELECT A.seq as seq,
                A.message_seq as messageSeq,
@@ -40,7 +40,7 @@
         ]]>
     </update>
 
-    <select id="selectVmsSafeMessage" parameterType="java.lang.Long" resultType="com.its.safe.entity.safe.TbMessage" fetchSize="20">
+    <select id="selectVmsSafeMessage" parameterType="java.lang.Long" resultType="com.its.safe.entity.safe.Message" fetchSize="20">
     <![CDATA[
         SELECT A.seq as seq,
                A.status as status,