Ver Fonte

vms realtime draw traffic form

shjung há 3 anos atrás
pai
commit
2e5079ede0

+ 7 - 0
src/main/java/com/its/api/its/controller/vms/TbVmsFormController.java

@@ -1,6 +1,7 @@
 package com.its.api.its.controller.vms;
 
 import com.its.api.its.model.dto.vms.TbVmsFormDto;
+import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
 import com.its.api.its.service.vms.TbVmsFormService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -32,6 +33,12 @@ public class TbVmsFormController {
         return this.service.findById(id);
     }
 
+    @ApiOperation(value = "VMS FORM 객체 목록 조회(TB_VMS_FORM)", response = TbVmsFormObjectDetlDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/object/{id}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsFormObjectDetlDto> findByVmsFormObject(@PathVariable final Integer id) {
+        return this.service.findByVmsFormObject(id);
+    }
+
     @ApiOperation(value = "VMS FORM 정보변경(TB_VMS_FORM)", response = TbVmsFormDto.class)
     @PutMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsFormDto updateById(@PathVariable final Integer id, @RequestBody @Valid final TbVmsFormDto.TbVmsFormUpdReq req) {

+ 35 - 4
src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchAutoController.java

@@ -1,17 +1,17 @@
 package com.its.api.its.controller.vms;
 
 import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
+import com.its.api.its.model.dto.vms.VmsFormDrawTrafDto;
 import com.its.api.its.service.vms.TbVmsMsgDsplSchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+import java.util.Arrays;
 import java.util.List;
 
 @Api(tags = "12.VMS-3.스케줄관리-1.자동 스케줄 관리")
@@ -36,6 +36,37 @@ public class TbVmsMsgDsplSchAutoController {
     ) {
         return this.service.findAllVmsDsplSchedule(id);
     }
+    @ApiOperation(value = "VMS 제어기 유형별 폼 스케줄 목록 조회(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list-form/{id}/{type}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsMsgDsplSchDto> findAllVmsDsplSchedule(
+            @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
+            @PathVariable final Long id,
+            @ApiParam(name = "kind", value = "VMS 폼유형 코드(0:교통정보,1:돌발,2:공사/행사,3:홍보,4:우회도로,7:정체,8:재난안전)", example = "0", required = true)
+            @PathVariable final String kind
+    ) {
+        // 교통정보 ("0");
+        // 돌발 ("1");
+        // 공사/행사 ("2");
+        // 홍보 ("3");
+        // 우회도로 ("4");
+        // 정체 ("7");
+        // 재난안전 ("8");
+        List<String> trfcSituTypeCd = Arrays.asList(kind);
+        return this.service.findAllVmsDsplSchedule(id, trfcSituTypeCd);
+    }
+    // 교통정보 폼 그리기
+    @ApiOperation(value = "VMS 교통정보 폼 그리기", response = VmsFormDrawTrafDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "/list/traffic/draw/{id}/{form}", produces = {"application/json; charset=utf8"})
+    public VmsFormDrawTrafDto drawTrafficForm(
+            @ApiParam(name = "id", value = "VMS 제어기 관리번호", example = "10005", required = true)
+            @PathVariable final Long id,
+            @ApiParam(name = "form", value = "VMS 폼 ID", example = "10092", required = true)
+            @PathVariable final Integer form,
+            @RequestBody @Valid final VmsFormDrawTrafDto.VmsFormDrawTrafReq req
+    ) {
+        return this.service.drawTrafficForm(id, form, req);
+    }
+
     // 교통정보
     @ApiOperation(value = "VMS 폼 정보 조회-교통정보(TB_VMS_TRFC_INFR_DSPL_SCH)", response = TbVmsMsgDsplSchDto.class, responseContainer = "ArrayList")
     @GetMapping(value = "/list/traffic/{id}", produces = {"application/json; charset=utf8"})

+ 38 - 0
src/main/java/com/its/api/its/controller/vms/TbVmsMsgDsplSchController.java

@@ -13,6 +13,8 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 @Api(tags = "12.VMS-3.스케줄관리-0.공통")
@@ -43,6 +45,42 @@ public class TbVmsMsgDsplSchController {
     ) {
         return this.formService.findAllByVmsType(type);
     }
+    @ApiOperation(value = "VMS 크기유형별 폼유형 별 정보 조회(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/form-list/{type}/{kind}", produces = {"application/json; charset=utf8"})
+    public List<TbVmsFormDto> findAllByVmsTypeKind(
+            @ApiParam(name = "type", value = "VMS 유형(크기) 코드", example = "VMP2", required = true)
+            @PathVariable final String type,
+            @ApiParam(name = "kind", value = "VMS 폼유형 코드(0:교통정보,1:돌발,2:공사/행사,3:홍보,4:우회도로,7:정체,8:재난안전)", example = "0", required = true)
+            @PathVariable final Integer kind
+    ) {
+        List<Integer> formTypeCd;
+        switch(kind) {
+            case 0: // 교통정보 ("0");
+                formTypeCd = Arrays.asList(11, 12, 13, 14, 15);
+                break;
+            case 1: // 돌발 ("1");
+                formTypeCd = Arrays.asList(20);
+                break;
+            case 2: // 공사/행사 ("2");
+                formTypeCd = Arrays.asList(30);
+                break;
+            case 3: // 홍보 ("3");
+                formTypeCd = Arrays.asList(40);
+                break;
+            case 4: // 우회도로 ("4");
+                formTypeCd = Arrays.asList(50);
+                break;
+            case 7: // 정체 ("7");
+                formTypeCd = Arrays.asList(16);
+                break;
+            case 8: // 재난안전 ("8");
+                formTypeCd = Arrays.asList(60);
+                break;
+            default:
+                return new ArrayList<>();
+        }
+        return this.formService.findAllByVmsTypeAndFormType(type, formTypeCd);
+    }
 
     /**
      * 자동스케줄: 교통정보, 정체, 돌발, 공사/행사, 홍보, 우회도로, 재난안전

+ 42 - 0
src/main/java/com/its/api/its/global/VmsIfscManager.java

@@ -0,0 +1,42 @@
+package com.its.api.its.global;
+
+import com.its.api.its.model.entity.vms.TbVmsIfsc;
+import com.its.api.its.repository.vms.TbVmsIfscRepository;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@RequiredArgsConstructor
+@Getter
+@Component
+public class VmsIfscManager {
+
+    private final TbVmsIfscRepository repo;
+
+    private static final ConcurrentHashMap<Long, TbVmsIfsc> ifsc = new ConcurrentHashMap<>();
+
+    @PostConstruct
+    void init() {
+        load();
+    }
+
+    public void load() {
+
+        List<TbVmsIfsc> objList = this.repo.findAll();
+        objList.forEach(obj -> {
+            ifsc.put(obj.getVmsIfscId(), obj);
+        });
+        log.info("=== {}", ifsc);
+    }
+
+    public static TbVmsIfsc get(Long id) {
+        return ifsc.get(id);
+    }
+
+}

+ 158 - 0
src/main/java/com/its/api/its/model/dto/vms/TbVmsFormObjectDetlDto.java

@@ -0,0 +1,158 @@
+package com.its.api.its.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+/**
+ * VMS FORM OBJECT DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVmsFormObjectDtoDetl(VMS FORM OBJECT)")
+public class TbVmsFormObjectDetlDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("FORM OBJECT ID")  // N NUMBER(5)
+    @JsonProperty("form_object_id")
+    private Integer formObjectId;
+
+    @ApiModelProperty("VMS FORM ID")  // N NUMBER(5)
+    @JsonProperty("vms_form_id")
+    private Integer vmsFormId;
+
+    @ApiModelProperty("VMS FORM 표출 행")  // Y NUMBER(2)
+    @JsonProperty("vms_form_dspl_row")
+    private Integer vmsFormDsplRow;
+
+    @ApiModelProperty("VMS FORM 표출 칼럼")  // Y NUMBER(2)
+    @JsonProperty("vms_form_dspl_clmn")
+    private Integer vmsFormDsplClmn;
+
+    @ApiModelProperty("VMS FORM OBJECT 유형 코드")  // N NUMBER(3)
+    @JsonProperty("vms_form_object_type_cd")
+    private Integer vmsFormObjectTypeCd;
+
+    @ApiModelProperty("VMS 글꼴 유형 코드")  // N NUMBER(3)
+    @JsonProperty("vms_font_type_cd")
+    private Integer vmsFontTypeCd;
+
+    @ApiModelProperty("VMS 글꼴 색상 코드")  // N NUMBER(9)
+    @JsonProperty("vms_font_hue_cd")
+    private Integer vmsFontHueCd;
+
+    @ApiModelProperty("VMS 글꼴 방식 코드")  // Y NUMBER(3)
+    @JsonProperty("vms_font_styl_cd")
+    private Integer vmsFontStylCd;
+
+    @ApiModelProperty("VMS 글꼴 크기")  // Y NUMBER(3)
+    @JsonProperty("vms_font_size")
+    private Integer vmsFontSize;
+
+    @ApiModelProperty("VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)")  // Y NUMBER(1)
+    @JsonProperty("vms_font_align")
+    private Integer vmsFontAlign;
+
+    @ApiModelProperty("VMS 표출 텍스트")  // Y VARCHAR(200)
+    @JsonProperty("vms_dspl_txt")
+    private String vmsDsplTxt;
+
+    @ApiModelProperty("VMS 표출 도형")  // Y BLOB
+    @JsonProperty("vms_dspl_figr")
+    private byte[] vmsDsplFigr;
+
+    @ApiModelProperty("VMS 표출 X좌표")  // Y NUMBER(5)
+    @JsonProperty("vms_dspl_xcrdn")
+    private Integer vmsDsplXcrdn;
+
+    @ApiModelProperty("VMS 표출 Y좌표")  // Y NUMBER(5)
+    @JsonProperty("vms_dspl_ycrdn")
+    private Integer vmsDsplYcrdn;
+
+    @ApiModelProperty("VMS 표출 넓이")  // Y NUMBER(5)
+    @JsonProperty("vms_dspl_width")
+    private Integer vmsDsplWidth;
+
+    @ApiModelProperty("VMS 표출 높이")  // Y NUMBER(5)
+    @JsonProperty("vms_dspl_height")
+    private Integer vmsDsplHeight;
+
+    @ApiModelProperty("VMS 표출 점멸 여부(0:지속, 1:점멸)")  // Y NUMBER(1)
+    @JsonProperty("vms_dspl_blinking")
+    private Integer vmsDsplBlinking;
+
+    @ApiModelProperty("VMS 표출 배경색상코드")  // Y NUMBER(1)
+    @JsonProperty("vms_dspl_bkcolor")
+    private Integer vmsDsplBkcolor;
+
+    @ApiModelProperty("VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)")  // Y NUMBER(7)
+    @JsonProperty("vms_dspl_size")
+    private Integer vmsDsplSize;
+
+    @ApiModelProperty("FILL-IN 메시지 여부")  // Y CHAR(1)
+    @JsonProperty("trfc_fill_cd")
+    private String trfcFillCd;
+
+    @ApiModelProperty("심벌라이브러리 번호")  // Y NUMBER(4)
+    @JsonProperty("symb_lib_nmbr")
+    private Integer symbLibNmbr;
+
+    @ApiModelProperty("VMS 정보제공구간 ID")  // Y NUMBER(10)
+    @JsonProperty("vms_ifsc_id")
+    private Long vmsIfscId;
+
+    // Code Description Field
+    @ApiModelProperty("VMS FORM OBJECT 유형 코드 설명")
+    @JsonProperty("vms_form_object_type_desc")    // VMS_FORM_OBJECT_TYPE_CD
+    private Integer vmsFormObjectTypeDesc;
+
+    @ApiModelProperty("VMS 글꼴 유형 코드 설명")
+    @JsonProperty("vms_font_type_desc")    // VMS_FONT_TYPE_CD
+    private Integer vmsFontTypeDesc;
+
+    @ApiModelProperty("VMS 글꼴 색상 코드 설명")
+    @JsonProperty("vms_font_hue_desc")    // VMS_FONT_HUE_CD
+    private Integer vmsFontHueDesc;
+
+    @ApiModelProperty("VMS 글꼴 방식 코드 설명")
+    @JsonProperty("vms_font_styl_desc")    // VMS_FONT_STYL_CD
+    private Integer vmsFontStylDesc;
+
+    @ApiModelProperty("FILL-IN 메시지 여부 설명")
+    @JsonProperty("trfc_fill_desc")    // TRFC_FILL_CD
+    private String trfcFillDesc;
+
+    @ApiModelProperty("VMS 글꼴 형태 명")  // Y VARCHAR(60)
+    @JsonProperty("vms_font_shpe_nm")
+    private String vmsFontShpeNm;
+
+    @ApiModelProperty("이미지 데이터")  // Y BLOB
+    @JsonProperty("imag_data")
+    private byte[] imagData;
+
+    @ApiModelProperty("심벌 설명")  // Y VARCHAR(200)
+    @JsonProperty("symb_expl")
+    private String symbExpl;
+
+    @ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "VMS_TYPE_CD", length = 7)
+    private String vmsTypeCd;
+
+    @ApiModelProperty("VMS FORM 유형 코드")  // N NUMBER(3)
+    @Column(name = "VMS_FORM_TYPE_CD", nullable = false, columnDefinition = "NUMBER", length = 3)
+    private Integer vmsFormTypeCd;
+
+    @ApiModelProperty("VMS FORM 배경 색상 코드")  // N NUMBER(10)
+    @Column(name = "VMS_FORM_BCKG_HUE_CD", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long vmsFormBckgHueCd;
+
+    @ApiModelProperty("VMS FORM 명")  // Y VARCHAR(60)
+    @Column(name = "VMS_FORM_NM", length = 60)
+    private String vmsFormNm;
+
+}

+ 64 - 0
src/main/java/com/its/api/its/model/dto/vms/VmsFormDrawTrafDto.java

@@ -0,0 +1,64 @@
+package com.its.api.its.model.dto.vms;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+
+/**
+ * VMS 교통 정보 표출 일정 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("VmsFormDrawTrafDto(VMS 교통 정보 폼 그리기)")
+public class VmsFormDrawTrafDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("VMS FORM ID")  // Y NUMBER(5)
+    @JsonProperty("vms_form_id")
+    private Integer vmsFormId;
+
+    @ApiModelProperty("VMS FORM 이미지")  // Y BLOB
+    @JsonProperty("vms_form_imag")
+    private byte[] vmsFormImag;
+
+    @ApiModelProperty("VMS FORM 이미지 형식(bmp, png)")
+    @JsonProperty("imag_fmt")
+    private String imagFmt;
+
+    @ApiModel("TbVmsTrfcInfrDsplSchUpdReq(VMS 교통 정보 표출 일정 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class VmsFormDrawTrafReq {
+
+        @ApiModelProperty("1단 VMS 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("frst_vms_ifsc_id")
+        private Long frstVmsIfscId;
+
+        @ApiModelProperty("2단 VMS 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("secd_vms_ifsc_id")
+        @PositiveOrZero
+        private Long secdVmsIfscId;
+
+        @ApiModelProperty("3단 VMS 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("thir_vms_ifsc_id")
+        private Long thirVmsIfscId;
+
+        @ApiModelProperty("4단 VMS 정보제공구간 ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("four_vms_ifsc_id")
+        private Long fourVmsIfscId;
+
+        @Builder
+        public VmsFormDrawTrafReq(Long vms_ctlr_nmbr, String trfc_situ_type_cd, Integer phase, Integer vms_form_id, Long frst_vms_ifsc_id, Long secd_vms_ifsc_id, String vms_form_prrt_cd, Integer dspl_hh, String dspl_strt_hh, String dspl_end_hh, Long thir_vms_ifsc_id, Long four_vms_ifsc_id, String use_yn, Long frst_img_ifsc_id, Long secd_img_ifsc_id, Long thir_img_ifsc_id, Long four_img_ifsc_id) {
+            this.frstVmsIfscId = frst_vms_ifsc_id;
+            this.secdVmsIfscId = secd_vms_ifsc_id;
+            this.thirVmsIfscId = thir_vms_ifsc_id;
+            this.fourVmsIfscId = four_vms_ifsc_id;
+        }
+    }
+}

+ 0 - 77
src/main/java/com/its/api/its/model/dto/vms/VwVmsDsplPrstDto.java

@@ -1,77 +0,0 @@
-package com.its.api.its.model.dto.vms;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- *  DTO Class
- */
-@Data
-@Builder
-@ApiModel("VwVmsDsplPrstDto()")
-public class VwVmsDsplPrstDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
-    @JsonProperty("vms_ctlr_nmbr")
-    private Long vmsCtlrNmbr;
-
-    @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("스트리밍 세션 명")  // Y VARCHAR(200)
-    @JsonProperty("strm_sesn_nm")
-    private String strmSesnNm;
-
-    @ApiModelProperty("PHASE")  // N NUMBER(2)
-    @JsonProperty("phase")
-    private Integer phase;
-
-    @ApiModelProperty("표출 시간")  // Y NUMBER(3)
-    @JsonProperty("dspl_hh")
-    private Integer dsplHh;
-
-    @ApiModelProperty("제어기다운로드 여부(Y:성공,N:실패)")  // Y CHAR(1)
-    @JsonProperty("dnld_yn")
-    private String dnldYn;
-
-    @ApiModelProperty("VMS 메시지 표출 방법 코드")  // Y NUMBER(3)
-    @JsonProperty("vms_msg_dspl_mthd_cd")
-    private Integer vmsMsgDsplMthdCd;
-
-    @ApiModelProperty("교통 상황 유형 코드")  // Y VARCHAR(7)
-    @JsonProperty("trfc_situ_type_cd")
-    private String trfcSituTypeCd;
-
-    @ApiModelProperty("표출 일시")  // Y VARCHAR(14)
-    @JsonProperty("dspl_dt")
-    private String dsplDt;
-
-    @ApiModelProperty("7분전 시각")  // Y VARCHAR(14)
-    @JsonProperty("svc_dt")
-    private String svcDt;
-
-    @ApiModelProperty("VMS 표출 메시지 이미지")  // Y BLOB
-    @JsonProperty("vms_dspl_msg_imag")
-    private byte[] vmsDsplMsgImag;
-
-    // Code Description Field
-    @ApiModelProperty("이미지 형식(bmp, png)")
-    @JsonProperty("imag_fmt")
-    private String imagFmt;
-
-    @ApiModelProperty("서비스 여부(Y:성공,N:실패)")
-    @JsonProperty("svc_yn")
-    private String svcYn;
-
-}

+ 40 - 0
src/main/java/com/its/api/its/model/entity/vms/TbVmsFormObjectDetlInf.java

@@ -0,0 +1,40 @@
+package com.its.api.its.model.entity.vms;
+
+/**
+ * VMS FORM OBJECT Entity Class
+ */
+public interface TbVmsFormObjectDetlInf {
+
+    Integer getFormObjectId();
+    Integer getVmsFormId();
+    Integer getVmsFormDsplRow();
+    Integer getVmsFormDsplClmn();
+    Integer getVmsFormObjectTypeCd();
+    Integer getVmsFontTypeCd();
+    Integer getVmsFontHueCd();
+    Integer getVmsFontStylCd();
+    Integer getVmsFontSize();
+    Integer getVmsFontAlign();
+    String getVmsDsplTxt();
+    byte[] getVmsDsplFigr();
+    Integer getVmsDsplXcrdn();
+    Integer getVmsDsplYcrdn();
+    Integer getVmsDsplWidth();
+    Integer getVmsDsplHeight();
+    Integer getVmsDsplBlinking();
+    Integer getVmsDsplBkcolor();
+    Integer getVmsDsplSize();
+    String  getTrfcFillCd();
+    Integer getSymbLibNmbr();
+    Long    getVmsIfscId();
+
+    String  getVmsFontShpeNm();
+    byte[]  getImagData();
+    String  getSymbExpl();
+
+    String getVmsTypeCd();
+    Integer getVmsFormTypeCd();
+    Long getVmsFormBckgHueCd();
+    String getVmsFormNm();
+
+}

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

@@ -1,6 +1,7 @@
 package com.its.api.its.repository.vms;
 
 import com.its.api.its.model.entity.vms.TbVmsForm;
+import com.its.api.its.model.entity.vms.TbVmsFormObjectDetlInf;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -21,4 +22,61 @@ public interface TbVmsFormRepository extends JpaRepository<TbVmsForm, Integer>,
     @Query("select p from TbVmsForm p where p.vmsTypeCd = :vmsTypeCd and p.vmsFormTypeCd in :formTypeCd")
     List<TbVmsForm> findAllByVmsTypeAndFormType(@Param("vmsTypeCd") String vmsTypeCd, @Param("formTypeCd") List<Integer> formTypeCd);
 
+//    @Query("select a from TbVmsFormObject a, TbVmsSymbLib b, TbVmsFontShpe c, TbVmsForm d " +
+//            " where d.vmsFormId = :formId " +
+//            " and d.vmsFormId = a.vmsFormId " +
+//            " and a.symbLibNmbr = b.symbLibNmbr(+) " +
+//            " and a.vmsFontTypeCd = d.vmsFormTypeCd(+)")
+//    @Query("select a, c.vmsFontShpeNm, b.imagData, b.symbExpl " +
+//            "  from      TbVmsFormObject a " +
+//            "  left join TbVmsSymbLib    b " +
+//            "         on a.symbLibNmbr = b.symbLibNmbr " +
+//            "  left join TbVmsFontShpe   c " +
+//            "         on a.vmsFontTypeCd = c.vmsFontShpeCd " +
+//            "       join TbVmsForm       d " +
+//            "         on a.vmsFormId = d.vmsFormId               " +
+//            " where d.vmsFormId = :formId" +
+//            " order by a.formObjectId asc")
+//    @Query("select a from TbVmsFormObjectDetl a left outer join fetch a.font font left outer join fetch a.symb symb " +
+//            " where a.vmsFormId = :formId " +
+//            " order by a.formObjectId asc")
+    @Query("select a.formObjectId as formObjectId, " +
+        "      a.vmsFormId as vmsFormId, " +
+        "      a.vmsFormDsplRow as vmsFormDsplRow, " +
+        "      a.vmsFormDsplClmn as vmsFormDsplClmn, " +
+        "      a.vmsFormObjectTypeCd as vmsFormObjectTypeCd, " +
+        "      a.vmsFontTypeCd as vmsFontTypeCd, " +
+        "      a.vmsFontHueCd as vmsFontHueCd, " +
+        "      a.vmsFontStylCd as vmsFontStylCd, " +
+        "      a.vmsFontSize as vmsFontSize, " +
+        "      a.vmsFontAlign as vmsFontAlign, " +
+        "      a.vmsDsplTxt as vmsDsplTxt, " +
+        "      a.vmsDsplFigr as vmsDsplFigr, " +
+        "      a.vmsDsplXcrdn as vmsDsplXcrdn, " +
+        "      a.vmsDsplYcrdn as vmsDsplYcrdn, " +
+        "      a.vmsDsplWidth as vmsDsplWidth, " +
+        "      a.vmsDsplHeight as vmsDsplHeight, " +
+        "      a.vmsDsplBlinking as vmsDsplBlinking, " +
+        "      a.vmsDsplBkcolor as vmsDsplBkcolor, " +
+        "      a.vmsDsplSize as vmsDsplSize, " +
+        "      a.trfcFillCd as trfcFillCd, " +
+        "      a.symbLibNmbr as symbLibNmbr, " +
+        "      a.vmsIfscId as vmsIfscId, " +
+        "      c.vmsFontShpeNm as vmsFontShpeNm,  " +
+        "      b.imagData as imagData,  " +
+        "      b.symbExpl as symbExpl, " +
+        "      d.vmsTypeCd as vmsTypeCd, " +
+        "      d.vmsFormTypeCd as vmsFormTypeCd, " +
+        "      d.vmsFormBckgHueCd as vmsFormBckgHueCd, " +
+        "      d.vmsFormNm as vmsFormNm " +
+        "  from      TbVmsFormObject a " +
+        "  left join TbVmsSymbLib    b " +
+        "         on a.symbLibNmbr = b.symbLibNmbr " +
+        "  left join TbVmsFontShpe   c " +
+        "         on a.vmsFontTypeCd = c.vmsFontShpeCd " +
+        "       join TbVmsForm       d " +
+        "         on a.vmsFormId = d.vmsFormId " +
+        " where d.vmsFormId = :formId" +
+        " order by a.formObjectId asc")
+    List<TbVmsFormObjectDetlInf> findByVmsFormObject(@Param("formId") Integer formId);
 }

+ 48 - 0
src/main/java/com/its/api/its/service/vms/TbVmsFormService.java

@@ -1,7 +1,9 @@
 package com.its.api.its.service.vms;
 
 import com.its.api.its.model.dto.vms.TbVmsFormDto;
+import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
 import com.its.api.its.model.entity.vms.TbVmsForm;
+import com.its.api.its.model.entity.vms.TbVmsFormObjectDetlInf;
 import com.its.api.its.repository.vms.TbVmsFormRepository;
 import com.its.api.utils.ItsUtils;
 import lombok.RequiredArgsConstructor;
@@ -165,4 +167,50 @@ public class TbVmsFormService {
         return result;
     }
 
+    /**
+     * VMS 폼의 객체 정보 목록을 조회한다.
+     * @param id
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbVmsFormObjectDetlDto> findByVmsFormObject(Integer id) {
+        List<TbVmsFormObjectDetlDto> result = new ArrayList<>();
+        List<TbVmsFormObjectDetlInf> data = this.repo.findByVmsFormObject(id);
+        data.forEach(obj -> {
+            TbVmsFormObjectDetlDto dto = TbVmsFormObjectDetlDto.builder()
+                    .formObjectId(obj.getFormObjectId())
+                    .vmsFormId(obj.getVmsFormId())
+                    .vmsFormDsplRow(obj.getVmsFormDsplRow())
+                    .vmsFormDsplClmn(obj.getVmsFormDsplClmn())
+                    .vmsFormObjectTypeCd(obj.getVmsFormObjectTypeCd())
+                    .vmsFontTypeCd(obj.getVmsFontTypeCd())
+                    .vmsFontHueCd(obj.getVmsFontHueCd())
+                    .vmsFontStylCd(obj.getVmsFontStylCd())
+                    .vmsFontSize(obj.getVmsFontSize())
+                    .vmsFontAlign(obj.getVmsFontAlign())
+                    .vmsDsplTxt(obj.getVmsDsplTxt())
+                    .vmsDsplFigr(obj.getVmsDsplFigr())
+                    .vmsDsplXcrdn(obj.getVmsDsplXcrdn())
+                    .vmsDsplYcrdn(obj.getVmsDsplYcrdn())
+                    .vmsDsplWidth(obj.getVmsDsplWidth())
+                    .vmsDsplHeight(obj.getVmsDsplHeight())
+                    .vmsDsplBlinking(obj.getVmsDsplBlinking())
+                    .vmsDsplBkcolor(obj.getVmsDsplBkcolor())
+                    .vmsDsplSize(obj.getVmsDsplSize())
+                    .trfcFillCd(obj.getTrfcFillCd())
+                    .symbLibNmbr(obj.getSymbLibNmbr())
+                    .vmsIfscId(obj.getVmsIfscId())
+                    .vmsFontShpeNm(obj.getVmsFontShpeNm())
+                    .imagData(obj.getImagData())
+                    .symbExpl(obj.getSymbExpl())
+                    .vmsTypeCd(obj.getVmsTypeCd())
+                    .vmsFormTypeCd(obj.getVmsFormTypeCd())
+                    .vmsFormBckgHueCd(obj.getVmsFormBckgHueCd())
+                    .vmsFormNm(obj.getVmsFormNm())
+                    .build();
+
+            result.add(dto);
+        });
+        return result;
+    }
 }

+ 221 - 1
src/main/java/com/its/api/its/service/vms/TbVmsMsgDsplSchService.java

@@ -1,8 +1,13 @@
 package com.its.api.its.service.vms;
 
+import com.its.api.its.global.VmsIfscManager;
+import com.its.api.its.global.VmsManager;
+import com.its.api.its.model.dto.vms.TbVmsFormObjectDetlDto;
 import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchDto;
 import com.its.api.its.model.dto.vms.TbVmsMsgDsplSchVmsListDto;
+import com.its.api.its.model.dto.vms.VmsFormDrawTrafDto;
 import com.its.api.its.model.entity.vms.TbVmsCtlr;
+import com.its.api.its.model.entity.vms.TbVmsIfsc;
 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;
@@ -10,9 +15,16 @@ import com.its.api.its.repository.vms.TbVmsMsgDsplSchRepository;
 import com.its.api.utils.ItsUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.sanselan.Sanselan;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
 import java.util.*;
 
 @Slf4j
@@ -22,6 +34,7 @@ public class TbVmsMsgDsplSchService {
 
     private final TbVmsMsgDsplSchRepository repo;
     private final TbVmsCtlrRepository vmsRepo;
+    private final TbVmsFormService formService;
 
     // 데이터 1건 조회, 없으면 exception
     private TbVmsMsgDsplSch requireOne(TbVmsMsgDsplSchKey id) {
@@ -90,6 +103,195 @@ public class TbVmsMsgDsplSchService {
         return result;
     }
 
+    private Color getColor(int code) {
+        if (code == 0) return Color.BLACK;
+        if (code == 1) return Color.RED;
+        if (code == 2) return Color.GREEN;
+        if (code == 3) return Color.YELLOW;
+        return Color.BLACK;
+    }
+
+    /**
+     * VMS 교통정보 폼을 실시간 으로 그린다.
+     * @param vms
+     * @param dto
+     * @param formObjs
+     * @return
+     * @throws IOException
+     */
+    private byte[] createVmsTrafScheForm(TbVmsCtlr vms, TbVmsMsgDsplSchDto dto, List<TbVmsFormObjectDetlDto> formObjs, VmsFormDrawTrafDto.VmsFormDrawTrafReq req) throws IOException {
+
+        String imagFmt = "png";
+        if (vms == null || vms.getType() == null) {
+            log.error("Not Found VMS Controller: {}", vms);
+            return dto.getVmsFormImag();
+        }
+        if (formObjs.size() == 0) {
+            log.error("VMS Objects zero: {}", vms);
+            return dto.getVmsFormImag();
+        }
+
+        Long[] ifscIds = new Long[4];
+        if (dto != null) {
+            ifscIds[0] = dto.getFrstVmsIfscId();
+            ifscIds[1] = dto.getSecdVmsIfscId();
+            ifscIds[2] = dto.getThirVmsIfscId();
+            ifscIds[3] = dto.getFourVmsIfscId();
+        } else if (req != null) {
+            ifscIds[0] = req.getFrstVmsIfscId();
+            ifscIds[1] = req.getSecdVmsIfscId();
+            ifscIds[2] = req.getThirVmsIfscId();
+            ifscIds[3] = req.getFourVmsIfscId();
+        } else {
+            log.error("VMS Form draw request object error");
+            return null;
+        }
+        int formColorCd = formObjs.get(0).getVmsFormBckgHueCd().intValue();
+        /**
+         * 배경 이미지를 만든다.
+         */
+        int width = vms.getType().getVmsWdth();
+        int height = vms.getType().getVmsHght();
+        // TYPE_INT_ARGB specifies the image format: 8-bit RGBA packed
+        BufferedImage formImage = new BufferedImage(width, height, (("png").equals(imagFmt) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB));
+        Graphics2D g2d = (Graphics2D)formImage.createGraphics();  //createGraphics();getGraphics();
+        //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2d.setColor(getColor(formColorCd));
+        g2d.fillRect(0, 0, width, height);
+
+        formObjs.forEach(obj -> {
+            int objKind;
+            String dsplText = obj.getVmsDsplTxt();
+            int objType = obj.getVmsFormObjectTypeCd();
+            if (objType ==  1 || //이미지 심볼
+                objType ==  2 || //소통정보이미지
+                objType ==  3 || //파일이미지
+                objType == 17 || //소통이미지1
+                objType == 27 || //소통이미지2
+                objType == 37 || //소통이미지3
+                objType == 47 )  //소통이미지4
+            {
+                if (objType == 1) objKind = 1;  //Image Id
+                else              objKind = 2;  //Image
+            }
+            else {
+                objKind = 0;  //문자열그리기
+            }
+
+            Long ifscId = null;
+            if (objType >= 11 && objType < 17)
+                ifscId = ifscIds[0];
+            else
+            if (objType >= 21 && objType < 27)
+                ifscId = ifscIds[1];
+            else
+            if (objType >= 31 && objType < 37)
+                ifscId = ifscIds[2];
+            else
+            if (objType >= 41 && objType < 47)
+                ifscId = ifscIds[3];
+
+            if (ifscId != null && ifscId != 0) {
+                TbVmsIfsc vmsIfsc = VmsIfscManager.get(ifscId);
+                if (vmsIfsc != null) {
+                    switch(objType)
+                    {
+                        case 11: case 21: case 31: case 41:
+                        dsplText = vmsIfsc.getVmsIfscNm();
+                        break;
+                        case 12: case 22: case 32: case 42:
+                        dsplText = vmsIfsc.getDsplStrtNodeNm();
+                        break;
+                        case 13: case 23: case 33: case 43:
+                        dsplText = vmsIfsc.getDsplEndNodeNm();
+                        break;
+                    }
+                }
+            }
+
+            // 그리기 시작한다
+            int left = obj.getVmsDsplXcrdn();
+            int top = obj.getVmsDsplYcrdn();
+            if (objKind == 0) {
+                // 문자열 그리기
+                int fontSize  = obj.getVmsFontSize();
+                int fontStyle = (obj.getVmsFontStylCd() == 1) ? Font.BOLD : Font.PLAIN;
+                int dsplWidth = obj.getVmsDsplWidth();
+
+                Font txtFont = new Font(obj.getVmsFontShpeNm(), fontStyle, fontSize);
+                txtFont = txtFont.deriveFont(fontSize * 1.35f);
+                g2d.setFont(txtFont);
+                FontMetrics fm = g2d.getFontMetrics(txtFont);
+                int txtWidth = fm.stringWidth(dsplText);
+                int nWidth = dsplWidth - txtWidth;
+                if (obj.getVmsFontAlign() == 1) {
+                    // right, 좌측에서 글자길이를 뺀다음 만약 음수이면 0으로 설정
+                    left += nWidth;
+                    //left = (left + dsplWidth) - txtWidth;
+                }
+                else if (obj.getVmsFontAlign() == 2) {
+                    // center, 원래 글자의 중앙값을 얻은 다음에 조정된 글자의 1/2 크기를 뺀다음 음수이면 0으로 설정
+                    left += (nWidth / 2);
+                    //left = (left + (dsplWidth / 2)) - (txtWidth/2);
+                }
+                if (left < 0) {
+                    left = 0;
+                }
+                g2d.setColor(getColor(obj.getVmsFontHueCd()));
+                g2d.drawString(dsplText, left, top + fm.getAscent());//fm.getHeight() - fm.getDescent() - fm.getLeading());
+            }
+            else {
+                try {
+                    BufferedImage symbol = null;
+                    if (obj.getVmsDsplFigr() != null) {
+                        symbol = Sanselan.getBufferedImage(obj.getVmsDsplFigr());
+                    } else {
+                        symbol = Sanselan.getBufferedImage(obj.getImagData());
+                    }
+                    g2d.drawImage(symbol, left, top, null);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+
+        String saveDir = ItsUtils.createUserDir("/image/vms/traf-sche/");
+        ItsUtils.saveImageFile(formImage, imagFmt, saveDir + vms.getVmsCtlrNmbr() + "_" + dto.getPhase() + "." + imagFmt);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ImageIO.write(formImage, imagFmt, out);
+        g2d.dispose();
+        return out.toByteArray();
+    }
+
+    /**
+     * VMS 교통정보 폼 실시간 드로잉
+     * @param id
+     * @param formId
+     * @param req
+     * @return
+     */
+    public VmsFormDrawTrafDto drawTrafficForm(Long id, Integer formId, VmsFormDrawTrafDto.VmsFormDrawTrafReq req) {
+        VmsFormDrawTrafDto result = VmsFormDrawTrafDto.builder()
+                .vmsFormId(formId)
+                .vmsFormImag(null)
+                .imagFmt("png").build();
+
+        // 교통정보 스케쥴인 경우 교통정보 폼을 만들어서 리턴해 준다.
+        TbVmsCtlr obj = VmsManager.get(id);
+        if (obj == null) {
+            return result;
+        }
+        List<TbVmsFormObjectDetlDto> formObjs = this.formService.findByVmsFormObject(formId);
+        try {
+            // 교통정보 폼 그리기
+            result.setVmsFormImag(createVmsTrafScheForm(obj, null, formObjs, req));
+        } catch (IOException e) {
+            log.error("{}", e.getMessage());
+        }
+
+        return result;
+    }
     /**
      * 자동 스케줄 목록 조회
      * @param id
@@ -102,8 +304,25 @@ public class TbVmsMsgDsplSchService {
     // 교통정보
     public List<TbVmsMsgDsplSchDto> findAllTraffic(Long id) {
         List<String> formTypeCd = Collections.singletonList("0");
-        return findAllVmsDsplSchedule(id, formTypeCd);
+        List<TbVmsMsgDsplSchDto> dtoList = findAllVmsDsplSchedule(id, formTypeCd);
+
+        // 교통정보 스케쥴인 경우 교통정보 폼을 만들어서 리턴해 준다.
+        TbVmsCtlr obj = VmsManager.get(id);
+        if (obj == null) {
+            return dtoList;
+        }
+        dtoList.forEach(dto -> {
+            List<TbVmsFormObjectDetlDto> formObjs = this.formService.findByVmsFormObject(dto.getVmsFormId());
+            try {
+                // 교통정보 폼 그리기
+                dto.setVmsFormImag(createVmsTrafScheForm(obj, dto, formObjs, null));
+            } catch (IOException e) {
+                log.error("{}", e.getMessage());
+            }
+        });
+        return dtoList;
     }
+
     // 정체
     public List<TbVmsMsgDsplSchDto> findAllCongest(Long id) {
         List<String> formTypeCd = Collections.singletonList("7");
@@ -314,4 +533,5 @@ public class TbVmsMsgDsplSchService {
         }
         return result;
     }
+
 }

+ 3 - 4
src/main/java/com/its/api/scheduler/job/BaseDbmsJobThread.java

@@ -1,9 +1,6 @@
 package com.its.api.scheduler.job;
 
-import com.its.api.its.global.CctvManager;
-import com.its.api.its.global.CodeManager;
-import com.its.api.its.global.VdsManager;
-import com.its.api.its.global.VmsManager;
+import com.its.api.its.global.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
@@ -21,6 +18,7 @@ public class BaseDbmsJobThread {
     private final CctvManager cctvManager;
     private final VdsManager vdsManager;
     private final VmsManager vmsManager;
+    private final VmsIfscManager vmsIfscManager;
 
     @PostConstruct
     private void init() {
@@ -39,6 +37,7 @@ public class BaseDbmsJobThread {
         cctvManager.load();
         vdsManager.load();
         vmsManager.load();
+        vmsIfscManager.load();
 
         stopWatch.stop();
         log.info("--END: BaseDbmsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());

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

@@ -16,7 +16,6 @@ application:
   job-schedule:
     cctv-preset: false
 
-
 server:
   port: 8999
   shutdown: graceful
@@ -53,6 +52,7 @@ spring:
       ddl-auto: none
     properties:
       hibernate:
+        default_batch_fetch_size: 1000
         format_sql: true
         use_sql_columns: true
         hbm2ddl.auto: validate
@@ -64,7 +64,7 @@ spring:
 
 logging:
   level:
-    #org.hibernate.SQL: INFO
+    //org.hibernate.SQL: INFO
     org:
       springframework:
         jdbc:
@@ -75,4 +75,4 @@ logging:
         type:
           descriptor:
             sql:
-              BasicBinder: OFF
+              BasicBinder: TRACE