shjung hace 3 años
padre
commit
67e9509230

+ 8 - 14
src/main/java/com/its/op/controller/its/vms/TbVmsFormController.java

@@ -56,19 +56,13 @@ public class TbVmsFormController {
         return this.service.findByVmsFormObjectDetail(id);
     }
 
-    @ApiOperation(value = "VMS FORM 정보변경(TB_VMS_FORM)", response = TbVmsFormDto.class)
+    @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) {
         return this.service.updateById(id, req);
     }
 
-//    @ApiOperation(value = "VMS FORM 정보변경/생성-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
-//    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
-//    public List<TbVmsFormDto> mergeInfoList(@RequestBody @Valid final List<TbVmsFormDto.TbVmsFormUpdReq> listReq) {
-//        return this.service.mergeInfoList(listReq);
-//    }
-
-    @ApiOperation(value = "VMS FORM 정보변경/생성-개별(TB_VMS_FORM)", response = TbVmsFormDto.class)
+    @ApiOperation(value = "VMS FORM 정보변경/생성/업데이트-개별-객체정보포함(TB_VMS_FORM)", response = TbVmsFormDto.class)
     @PostMapping(value = "/{id}", produces = {"application/json; charset=utf8"})
     public TbVmsFormDto mergeInfo(@PathVariable("id") Integer id, @RequestBody @Valid final TbVmsFormDto.TbVmsFormUpdReq req) {
         return this.service.mergeInfo(req);
@@ -80,16 +74,16 @@ public class TbVmsFormController {
         return this.service.deleteById(id);
     }
 
-//    @ApiOperation(value = "VMS FORM 정보삭제-목록(TB_VMS_FORM)", response = TbVmsFormDto.class, responseContainer = "ArrayList")
-//    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
-//    public List<TbVmsFormDto> deleteDataByIds(@RequestBody @Valid final List<Integer> ids) {
-//        return this.service.deleteByIds(ids);
-//    }
-
     @ApiOperation(value = "신규 VMS FORM ID 조회(TB_VMS_FORM)", response = NewIdIntegerDto.class)
     @GetMapping(value = "/new-id", produces = {"application/json; charset=utf8"})
     public NewIdIntegerDto getNewVmsFormId() {
         return this.service.getNewVmsFormId();
     }
 
+    @ApiOperation(value = "VMS FORM 복사 추가", response = TbVmsFormDto.class)
+    @PostMapping(value = "/form/copy-add", produces = {"application/json; charset=utf8"})
+    public TbVmsFormDto formCopyAdd(@RequestBody @Valid final TbVmsFormDto.TbVmsFormCopyReq req) {
+        return this.service.formCopyAdd(req);
+    }
+
 }

+ 61 - 0
src/main/java/com/its/op/dao/repository/its/vms/TbVmsFormObjectRepository.java

@@ -4,9 +4,11 @@ import com.its.op.entity.its.vms.TbVmsFormObject;
 import com.its.op.entity.its.vms.TbVmsFormObjectKey;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -22,4 +24,63 @@ public interface TbVmsFormObjectRepository extends JpaRepository<TbVmsFormObject
     @Query("select count(p.vmsIfscId) from TbVmsFormObject p where p.vmsIfscId = :vmsIfscId")
     Integer findUsageCountByVmsIfscId(@Param("vmsIfscId") Long vmsIfscId);
 
+    @Modifying
+    @Query("delete from TbVmsFormObject p where p.vmsFormId = :vmsFormId")
+    void deleteDataById(@Param("vmsFormId") Integer vmsFormId);
+
+    @Transactional
+    @Modifying
+    @Query(value = 
+            "INSERT INTO TB_VMS_FORM_OBJECT (            " +
+            "                FORM_OBJECT_ID,             " +
+            "                VMS_FORM_ID,                " +
+            "                VMS_FORM_DSPL_ROW,          " +
+            "                VMS_FORM_DSPL_CLMN,         " +
+            "                VMS_FORM_OBJECT_TYPE_CD,    " +
+            "                VMS_FONT_TYPE_CD,           " +
+            "                VMS_FONT_HUE_CD,            " +
+            "                VMS_FONT_STYL_CD,           " +
+            "                VMS_FONT_SIZE,              " +
+            "                VMS_FONT_ALIGN,             " +
+            "                VMS_DSPL_TXT,               " +
+            "                VMS_DSPL_FIGR,              " +
+            "                VMS_DSPL_XCRDN,             " +
+            "                VMS_DSPL_YCRDN,             " +
+            "                VMS_DSPL_WIDTH,             " +
+            "                VMS_DSPL_HEIGHT,            " +
+            "                VMS_DSPL_BLINKING,          " +
+            "                VMS_DSPL_BKCOLOR,           " +
+            "                VMS_DSPL_SIZE,              " +
+            "                TRFC_FILL_CD,               " +
+            "                SYMBLIB_NMBR,               " +
+            "                VMS_IFSC_ID                 " +
+            "                )                           " +
+            "  SELECT                                    " +
+            "                FORM_OBJECT_ID,             " +
+            "                :newFormId,                 " +
+            "                VMS_FORM_DSPL_ROW,          " +
+            "                VMS_FORM_DSPL_CLMN,         " +
+            "                VMS_FORM_OBJECT_TYPE_CD,    " +
+            "                VMS_FONT_TYPE_CD,           " +
+            "                VMS_FONT_HUE_CD,            " +
+            "                VMS_FONT_STYL_CD,           " +
+            "                VMS_FONT_SIZE,              " +
+            "                VMS_FONT_ALIGN,             " +
+            "                VMS_DSPL_TXT,               " +
+            "                VMS_DSPL_FIGR,              " +
+            "                VMS_DSPL_XCRDN,             " +
+            "                VMS_DSPL_YCRDN,             " +
+            "                VMS_DSPL_WIDTH,             " +
+            "                VMS_DSPL_HEIGHT,            " +
+            "                VMS_DSPL_BLINKING,          " +
+            "                VMS_DSPL_BKCOLOR,           " +
+            "                VMS_DSPL_SIZE,              " +
+            "                TRFC_FILL_CD,               " +
+            "                SYMBLIB_NMBR,               " +
+            "                VMS_IFSC_ID                 " +
+            "  FROM TB_VMS_FORM_OBJECT                   " +
+            " WHERE VMS_FORM_ID = :orgFormId             ", 
+            nativeQuery = true)
+    void copyFormObjects(@Param("newFormId") Integer newFormId, @Param("orgFormId") Integer orgFormId);
+
 }

+ 32 - 0
src/main/java/com/its/op/dao/repository/its/vms/TbVmsFormRepository.java

@@ -4,9 +4,11 @@ import com.its.op.entity.its.vms.TbVmsForm;
 import com.its.op.entity.its.vms.TbVmsFormObjectDetlInf;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -83,4 +85,34 @@ public interface TbVmsFormRepository extends JpaRepository<TbVmsForm, Integer>,
     @Query(value = "SELECT NVL(MAX(VMS_FORM_ID), 9999)+1 AS NEWID FROM TB_VMS_FORM", nativeQuery = true)
     Integer getNewVmsFormId();
 
+    @Transactional
+    @Modifying
+    @Query(value =
+            "INSERT INTO TB_VMS_FORM (VMS_FORM_ID, " +
+            "              VMS_TYPE_CD,            " +
+            "              VMS_FORM_TYPE_CD,       " +
+            "              VMS_FORM_BCKG_HUE_CD,   " +
+            "              VMS_FORM_NM,            " +
+            "              VMS_FORM_EXPL,          " +
+            "              VMS_MSG_DSPL_DRCT_CD,   " +
+            "              SYMBLIB_NMBR,           " +
+            "              VMS_FORM_IMAG,          " +
+            "              VMS_MSG_DSPL_MTHD_CD,   " +
+            "              CCTV_MNGM_NMBR)         " +
+            "SELECT :newFormId,                    " +
+            "       VMS_TYPE_CD,                   " +
+            "       VMS_FORM_TYPE_CD,              " +
+            "       VMS_FORM_BCKG_HUE_CD,          " +
+            "       :vmsFormNm,                    " +
+            "       VMS_FORM_EXPL,                 " +
+            "       VMS_MSG_DSPL_DRCT_CD,          " +
+            "       SYMBLIB_NMBR,                  " +
+            "       VMS_FORM_IMAG,                 " +
+            "       VMS_MSG_DSPL_MTHD_CD,          " +
+            "       CCTV_MNGM_NMBR                 " +
+            "  FROM TB_VMS_FORM                    " +
+            " WHERE VMS_FORM_ID = :orgFormId       ",
+            nativeQuery = true)
+    void copyForm(@Param("newFormId") Integer newFormId, @Param("orgFormId") Integer orgFormId, @Param("vmsFormNm") String vmsFormNm);
+
 }

+ 33 - 1
src/main/java/com/its/op/dto/its/vms/TbVmsFormDto.java

@@ -9,6 +9,8 @@ import lombok.*;
 import javax.validation.constraints.PositiveOrZero;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * VMS FORM DTO Class
@@ -149,8 +151,12 @@ public class TbVmsFormDto implements Serializable {
         @PositiveOrZero
         private Long cctvMngmNmbr;
 
+        @ApiModelProperty("FORM 객체 목록")
+        @JsonProperty("objects")
+        List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects = new ArrayList<>();
+
         @Builder
-        public TbVmsFormUpdReq(Integer vms_form_id, String vms_type_cd, Integer vms_form_type_cd, Long vms_form_bckg_hue_cd, String vms_form_nm, String vms_form_expl, Integer vms_msg_dspl_drct_cd, Integer symb_lib_nmbr, byte[] vms_form_imag, Integer vms_msg_dspl_mthd_cd, Long cctv_mngm_nmbr) {
+        public TbVmsFormUpdReq(Integer vms_form_id, String vms_type_cd, Integer vms_form_type_cd, Long vms_form_bckg_hue_cd, String vms_form_nm, String vms_form_expl, Integer vms_msg_dspl_drct_cd, Integer symb_lib_nmbr, byte[] vms_form_imag, Integer vms_msg_dspl_mthd_cd, Long cctv_mngm_nmbr, List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects) {
             this.vmsFormId = vms_form_id;
             this.vmsTypeCd = vms_type_cd;
             this.vmsFormTypeCd = vms_form_type_cd;
@@ -162,6 +168,7 @@ public class TbVmsFormDto implements Serializable {
             this.vmsFormImag = vms_form_imag;
             this.vmsMsgDsplMthdCd = vms_msg_dspl_mthd_cd;
             this.cctvMngmNmbr = cctv_mngm_nmbr;
+            this.objects = objects;
         }
 
         public TbVmsForm toEntity() {
@@ -182,4 +189,29 @@ public class TbVmsFormDto implements Serializable {
 
     }
 
+    @ApiModel("TbVmsFormCopyReq(VMS FORM 복사 추가)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbVmsFormCopyReq {
+
+        @ApiModelProperty("VMS FORM ID, Nullable = N, NUMBER(5)")  // N NUMBER(5)
+        @JsonProperty("vms_form_id")
+        @PositiveOrZero
+        private Integer vmsFormId;
+
+        @ApiModelProperty("VMS FORM 명, Nullable = Y, VARCHAR(60)")  // Y VARCHAR(60)
+        @JsonProperty("vms_form_nm")
+        @Size(min=1, max=60)
+        private String vmsFormNm;
+
+        @Builder
+        public TbVmsFormCopyReq(Integer vms_form_id, String vms_form_nm) {
+            this.vmsFormId = vms_form_id;
+            this.vmsFormNm = vms_form_nm;
+        }
+
+    }
+
 }

+ 10 - 3
src/main/java/com/its/op/dto/its/vms/TbVmsIfscCmtrGradDto.java

@@ -45,13 +45,16 @@ public class TbVmsIfscCmtrGradDto implements Serializable {
     @ToString
     @NoArgsConstructor
     @AllArgsConstructor
+    @Builder
     public static class CmtrGrad {
         @ApiModelProperty("최저속도")  // Y NUMBER(3)
         @JsonProperty("lwstsped")
+        @PositiveOrZero
         private Integer lwstsped;
 
         @ApiModelProperty("최고속도")  // Y NUMBER(3)
         @JsonProperty("hghssped")
+        @PositiveOrZero
         private Integer hghssped;
     }
 
@@ -59,16 +62,20 @@ public class TbVmsIfscCmtrGradDto implements Serializable {
     @Getter
     @Setter
     @ToString
-    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    @AllArgsConstructor
+    @Builder
     public static class TbVmsIfscCmtrGradAllUpdReq {
 
-        @ApiModelProperty("정체")
+        @ApiModelProperty("원활")
         @JsonProperty("grad1")
         private CmtrGrad grad1;
+
         @ApiModelProperty("지체")
         @JsonProperty("grad2")
         private CmtrGrad grad2;
-        @ApiModelProperty("원활")
+
+        @ApiModelProperty("정체")
         @JsonProperty("grad3")
         private CmtrGrad grad3;
 

+ 19 - 10
src/main/java/com/its/op/dto/its/vms/TbVmsIfscDto.java

@@ -61,13 +61,13 @@ public class TbVmsIfscDto implements Serializable {
     //@JsonProperty("edtn_desc")    // EDTN_CD
     //private String edtnDesc;
 
-    @ApiModelProperty("정체")
+    @ApiModelProperty("원활")
     @JsonProperty("grad1")
     private TbVmsIfscCmtrGradDto.CmtrGrad grad1;
     @ApiModelProperty("지체")
     @JsonProperty("grad2")
     private TbVmsIfscCmtrGradDto.CmtrGrad grad2;
-    @ApiModelProperty("원활")
+    @ApiModelProperty("정체")
     @JsonProperty("grad3")
     private TbVmsIfscCmtrGradDto.CmtrGrad grad3;
 
@@ -129,13 +129,13 @@ public class TbVmsIfscDto implements Serializable {
         @Pattern(regexp = "[YN]")
         private String axisYn;
 
-        @ApiModelProperty("정체")
+        @ApiModelProperty("원활")
         @JsonProperty("grad1")
         private TbVmsIfscCmtrGradDto.CmtrGrad grad1;
         @ApiModelProperty("지체")
         @JsonProperty("grad2")
         private TbVmsIfscCmtrGradDto.CmtrGrad grad2;
-        @ApiModelProperty("원활")
+        @ApiModelProperty("정체")
         @JsonProperty("grad3")
         private TbVmsIfscCmtrGradDto.CmtrGrad grad3;
 
@@ -144,7 +144,10 @@ public class TbVmsIfscDto implements Serializable {
         private List<VmsIfscLinkOrd> ifscs;
 
         @Builder
-        public TbVmsIfscUpdReq(Long vms_ifsc_id, String vms_ifsc_nm, String edtn_cd, String dspl_strt_node_nm, String dspl_end_node_nm, Long detr_id, String road_nm, String spot_nm, String axis_yn, List<VmsIfscLinkOrd> ifscs) {
+        public TbVmsIfscUpdReq(Long vms_ifsc_id, String vms_ifsc_nm, String edtn_cd, String dspl_strt_node_nm,
+                               String dspl_end_node_nm, Long detr_id, String road_nm, String spot_nm, String axis_yn,
+                               TbVmsIfscCmtrGradDto.CmtrGrad grad1, TbVmsIfscCmtrGradDto.CmtrGrad grad2, TbVmsIfscCmtrGradDto.CmtrGrad grad3,
+                               List<VmsIfscLinkOrd> ifscs) {
             this.vmsIfscId = vms_ifsc_id;
             this.vmsIfscNm = vms_ifsc_nm;
             this.edtnCd = edtn_cd;
@@ -154,6 +157,9 @@ public class TbVmsIfscDto implements Serializable {
             this.roadNm = road_nm;
             this.spotNm = spot_nm;
             this.axisYn = axis_yn;
+            this.grad1 = grad1;
+            this.grad2 = grad2;
+            this.grad3 = grad3;
             this.ifscs = ifscs;
         }
 
@@ -175,6 +181,9 @@ public class TbVmsIfscDto implements Serializable {
 
     @Getter
     @Setter
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Builder
     public static class VmsIfscLinkOrd {
         @ApiModelProperty("정보제공구간 ID")  // N NUMBER(10)
         @JsonProperty("ifsc_id")
@@ -184,11 +193,11 @@ public class TbVmsIfscDto implements Serializable {
         @JsonProperty("ord")
         private Integer ord;
 
-        @Builder
-        public VmsIfscLinkOrd(Long ifsc_id, Integer ord) {
-            this.ifscId = ifsc_id;
-            this.ord = ord;
-        }
+//        @Builder
+//        public VmsIfscLinkOrd(Long ifsc_id, Integer ord) {
+//            this.ifscId = ifsc_id;
+//            this.ord = ord;
+//        }
     }
 
 }

+ 4 - 0
src/main/java/com/its/op/entity/its/vms/TbVmsForm.java

@@ -103,6 +103,10 @@ public class TbVmsForm implements Serializable {
         this.vmsFormId = vmsFormId;
     }
 
+    public void copyForm(Integer vmsFormId, String vmsFormNm) {
+        this.vmsFormId = vmsFormId;
+        this.vmsFormNm = vmsFormNm;
+    }
     public void updateInfo(TbVmsFormDto.TbVmsFormUpdReq req) {
         this.vmsTypeCd = req.getVmsTypeCd();
         this.vmsFormTypeCd = req.getVmsFormTypeCd();

+ 1 - 1
src/main/java/com/its/op/security/interceptor/ApiInterceptor.java

@@ -22,8 +22,8 @@ public class ApiInterceptor implements HandlerInterceptor {
 
         HttpSession session = request.getSession(false);
         if (session == null) {
-            log.error("로그인 하지 않은 사용자가 API(POST/PUT/DELETE)에 접근함.");
             if (!StringUtils.equalsIgnoreCase("GET", request.getMethod())) {
+                log.error("로그인 하지 않은 사용자가 API(POST/PUT/DELETE)에 접근함.");
                 // GET Method 를 제외한 Request 제한할 경우.... ==> Web Security 에서 처리함.
                 //return false;
             }

+ 2 - 2
src/main/java/com/its/op/service/its/vms/TbVmsDsplHsService.java

@@ -65,9 +65,9 @@ public class TbVmsDsplHsService {
      */
     public List<TbVmsDsplHsDto> findAllByDateRange(String fromDt, String toDt, List<Long> ids) {
         List<TbVmsDsplHsDto> result = new ArrayList<>();
-        log.error("SELECT");
+        //log.error("SELECT");
         List<TbVmsDsplHs> data = this.repo.findAllByDateRange(fromDt, toDt, ids);
-        log.error("FETCH");
+        //log.error("FETCH");
         if (data != null) {
             data.forEach(obj -> {
                 result.add(obj.toDto());

+ 68 - 41
src/main/java/com/its/op/service/its/vms/TbVmsFormService.java

@@ -1,18 +1,24 @@
 package com.its.op.service.its.vms;
 
+import com.its.op.dao.repository.its.vms.TbVmsFormObjectRepository;
+import com.its.op.dao.repository.its.vms.TbVmsFormRepository;
 import com.its.op.dto.its.common.NewIdIntegerDto;
 import com.its.op.dto.its.vms.TbVmsFormDetlDto;
 import com.its.op.dto.its.vms.TbVmsFormDto;
 import com.its.op.dto.its.vms.TbVmsFormObjectDetlDto;
+import com.its.op.dto.its.vms.TbVmsFormObjectDto;
 import com.its.op.entity.its.vms.TbVmsForm;
+import com.its.op.entity.its.vms.TbVmsFormObject;
 import com.its.op.entity.its.vms.TbVmsFormObjectDetlInf;
-import com.its.op.dao.repository.its.vms.TbVmsFormRepository;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
 
 @Slf4j
 @RequiredArgsConstructor
@@ -20,6 +26,7 @@ import java.util.*;
 public class TbVmsFormService {
 
     private final TbVmsFormRepository repo;
+    private final TbVmsFormObjectRepository objectRepo;
 
     // 데이터 1건 조회, 없으면 exception
     private TbVmsForm requireOne(Integer id) {
@@ -117,7 +124,12 @@ public class TbVmsFormService {
         return entity.toDto();
     }
 
-    // 데이터 변경
+    /**
+     * 폼 정보 만 업데이트 한다
+     * @param id
+     * @param req
+     * @return
+     */
     @Transactional
     public TbVmsFormDto updateById(Integer id, TbVmsFormDto.TbVmsFormUpdReq req) {
         TbVmsForm entity = requireOne(id);
@@ -126,57 +138,54 @@ public class TbVmsFormService {
         return entity.toDto();
     }
 
-    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
-    @Transactional
-    public List<TbVmsFormDto> mergeInfoList(List<TbVmsFormDto.TbVmsFormUpdReq> reqList) {
-        List<TbVmsFormDto> result = new ArrayList<>();
-        for (TbVmsFormDto.TbVmsFormUpdReq req : reqList) {
-            TbVmsForm obj = req.toEntity();
-            this.repo.save(obj);
-            result.add(obj.toDto());
-        }
-        return result;
-    }
-
-    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    /**
+     * 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+     * 폼 정보를 저장한 후 폼 객체 정보를 삭제한 다음 폼 객체 정보를 저장한다.
+     * @param req
+     * @return
+     */
     @Transactional
     public TbVmsFormDto mergeInfo(TbVmsFormDto.TbVmsFormUpdReq req) {
         TbVmsForm obj = req.toEntity();
+        // 폼 정보를 삭제한다.
         this.repo.save(obj);
+        // 폼 객체 정보를 삭제한다.
+        this.objectRepo.deleteDataById(req.getVmsFormId());
+        // 폼 객체 정보를 저장한다.
+        List<TbVmsFormObjectDto.TbVmsFormObjectUpdReq> objects = req.getObjects();
+        if (objects != null) {
+            objects.forEach(formObjectDto -> {
+                TbVmsFormObject object = formObjectDto.toEntity();
+                this.objectRepo.save(object);
+            });
+        }
         return obj.toDto();
     }
 
-    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    /**
+     * 폼 정보를 삭제한다.
+     * @param vmsFormId
+     * @return
+     */
     @Transactional
-    public TbVmsFormDto deleteById(Integer id) {
-        TbVmsForm entity = requireOne(id);
-        this.repo.deleteById(id);
+    public TbVmsFormDto deleteById(Integer vmsFormId) {
+        TbVmsForm entity = requireOne(vmsFormId);
+        // 폼 객체 정보를 먼저 삭제한다.
+        this.objectRepo.deleteDataById(vmsFormId);
+        // 폼 정보를 삭제한다.
+        this.repo.deleteById(vmsFormId);
         return entity.toDto();
     }
 
-    // 정보 삭제-목록, 존재하는 데이터 만 삭제
-    @Transactional
-    public List<TbVmsFormDto> deleteByIds(List<Integer> ids) {
-        List<TbVmsFormDto> result = new ArrayList<>();
-        for (Integer id : ids) {
-            Optional<TbVmsForm> obj = this.repo.findById(id);
-            if (obj.isPresent()) {
-                this.repo.deleteById(id);
-                result.add(obj.get().toDto());
-            }
-        }
-        return result;
-    }
-
     /**
      * VMS 폼의 객체 정보 목록을 조회한다.
-     * @param id
+     * @param vmsFormId
      * @return
      */
     @Transactional(readOnly = true)
-    public List<TbVmsFormObjectDetlDto> findByVmsFormObject(Integer id) {
+    public List<TbVmsFormObjectDetlDto> findByVmsFormObject(Integer vmsFormId) {
         List<TbVmsFormObjectDetlDto> result = new ArrayList<>();
-        List<TbVmsFormObjectDetlInf> data = this.repo.findByVmsFormObject(id);
+        List<TbVmsFormObjectDetlInf> data = this.repo.findByVmsFormObject(vmsFormId);
         data.forEach(obj -> {
             TbVmsFormObjectDetlDto dto = TbVmsFormObjectDetlDto.builder()
                     .formObjectId(obj.getFormObjectId())
@@ -245,14 +254,32 @@ public class TbVmsFormService {
 
     /**
      * VMS 폼 정보 상세 조회(이미지, 객체 목록 포함)
-     * @param id
+     * @param vmsFormId
      * @return
      */
 //    @Transactional(readOnly = true)
-    public TbVmsFormDetlDto findByVmsFormObjectDetail(Integer id) {
+    public TbVmsFormDetlDto findByVmsFormObjectDetail(Integer vmsFormId) {
         return TbVmsFormDetlDto.builder()
-                .form(findById(id))
-                .objects(findByVmsFormObject(id))
+                .form(findById(vmsFormId))
+                .objects(findByVmsFormObject(vmsFormId))
                 .build();
     }
+
+    /**
+     * VMS 폼 복사 추가
+     * @param req
+     * @return
+     */
+    //@Transactional
+    public TbVmsFormDto formCopyAdd(TbVmsFormDto.TbVmsFormCopyReq req) {
+        TbVmsForm orgForm = requireOne(req.getVmsFormId());
+        NewIdIntegerDto newFormId = getNewVmsFormId();
+        // 폼 정보 복사 해서 추가
+        this.repo.copyForm(newFormId.getNewId(), req.getVmsFormId(), req.getVmsFormNm());
+        // 폼 객체 정보 복사해서 추가
+        this.objectRepo.copyFormObjects(newFormId.getNewId(), req.getVmsFormId());
+
+        orgForm.copyForm(newFormId.getNewId(), req.getVmsFormNm());
+        return orgForm.toDto();
+    }
 }

+ 0 - 0
src/main/resources/logback-spring.xmlx → src/main/resources/logback-spring.xml


+ 11 - 8
src/main/resources/static/application/op/06.vms/02.manager/02.vms-ifsc/01.vms-ifsc/vms-ifsc.js

@@ -203,6 +203,9 @@ $(() => {
             columnAutoWidth: true,
             noDataText: "표출할 정보가 없습니다.",
             keyExpr: "ifsc_id",
+            editing: {
+                confirmDelete : false,
+            },
             scrolling: {
                 mode: "standard",
             },
@@ -529,13 +532,12 @@ function eventOff() {
 
 //링크 삭제 이벤트
 function linkDelBtnClick() {
-    const rowIdx = _editTable.getRowIndexByKey(_editTable.getSelectedRowKeys()[0]);
-    const ifscId = _editTable.cellValue(rowIdx, "ifsc_id");
+    const ifscId = _editTable.getSelectedRowsData()[0].ifsc_id;
+
     if (ifscId) {
         _selObjMap.delete(ifscId);
+        _editTable.option('dataSource', Array.from(_selObjMap.values()));
         _mapManager.updateEditLink(_lyrIdx, ifscId, 0, false);
-        const data = Array.from(_selObjMap.values());
-        _editTable.option("dataSource", data);
         _editTable.refresh().done(() => {
             if (nullChecker(_editTable.option("focusedRowIndex")) !== "") {
                 _editTable.selectRows(_editTable.getKeyByRowIndex(_editTable.option("focusedRowIndex")), true);
@@ -572,21 +574,22 @@ function listMove(changeNum) {
         dataSource.sort(function (a, b) {
             return a["ord"] - b["ord"];
         });
+        console.log(dataSource);
         const selectData = { ...dataSource[selectRow] };
         const changeData = { ...dataSource[changeRow] };
-        const columns = ["ifsc_id", "color", "end_nm", "f_node_id", "road_id", "road_name", "sect_lngt", "strt_nm", "t_node_id"];
+        const columns = ["ifsc_id", "color", "end_nm", "f_node_id", "ifsc_nm", "road_id", "vms_ifsc_id", "road_name", "sect_lngt", "strt_nm", "t_node_id"];
         columns.forEach((column) => {
             dataSource[selectRow][column] = changeData[column];
             dataSource[changeRow][column] = selectData[column];
         });
-
+        _selObjMap.set(dataSource[selectRow].ifsc_id, dataSource[selectRow]);
+        _selObjMap.set(dataSource[changeRow].ifsc_id, dataSource[changeRow]);
         _editTable.option("dataSource", dataSource);
 
         _editTable.refresh().done(() => {
             _editTable.clearSelection();
             _editTable.selectRowsByIndexes(changeRow);
             _editTable.option("focusedRowIndex", changeRow);
-
             isMove = true;
         });
     }
@@ -773,7 +776,7 @@ function saveEvent() {
         vms_ifsc_id : null,
         vms_ifsc_nm : null,
         axis_yn : null,
-        editn_cd : 'EDI0',
+        edtn_cd : 'EDI0',
         grad1  : {
             hghssped : 0,
             lwstsped : 0,

+ 75 - 0
src/main/resources/static/application/op/06.vms/03.form/manage.css

@@ -303,3 +303,78 @@ body{
     position: absolute;
 }
 
+.modal-screen{
+    z-index: 200;
+    background: #363640;
+    position: relative;
+    width: 500px;
+    height: 500px;
+    display: flex;
+    flex-direction: column;
+    border: 1px solid #515159;
+}
+.modal-background{
+    position: absolute;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    left: 0px;
+    top: 0px;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    background-color: rgba(75, 73, 73, 0.4);
+}
+
+.modal-title{
+    height: 30px;
+}
+
+.modal-content{
+    width: 100%;
+    height: 65%;
+    display: flex; 
+    align-items: center; 
+    justify-content: center;
+    border-bottom: 1px solid #515159;
+}
+.modal-button{
+    width: 100%;
+    height: 20%;
+    display: flex;
+    align-items: center;
+    justify-content: right;
+}
+.modal-button > div{
+    margin-right: 10px;
+}
+.modal-container{
+    width: calc(100% - 20px);
+    height: calc(100% - 20px);
+    padding: 10px;
+}
+.modal-container > div:nth-child(1){
+    width: 100%;
+    height: 100%;
+}
+.modal-table-box{
+    width: calc(100% - 4px);
+    height: calc(100% - 69px);
+    padding: 2px;
+}
+
+.modal-table-box > div:nth-child(1){
+    width: 100%;
+    height: 100%;
+}
+.modal-container > div:nth-child(1) > div:nth-child(3){
+    width: 100%;
+    height: 40px;
+    display: flex;
+    align-items: center;
+}
+.modal-x-btn,
+.modal-container > div:nth-child(1) > div:nth-child(3) > div:nth-child(1){
+    margin-left: auto;
+    margin-right: 10px;
+}

+ 218 - 47
src/main/resources/static/application/op/06.vms/03.form/manage.js

@@ -52,6 +52,12 @@ let _vmsFormBgCdData   = null;
 let _vmsObjFormNm      = null;
 let _vmsFormFontData   = null;
 let _vmsInputMap       = new Map();
+let _objDelBtn         = null;
+let _objAddBtn         = null;
+let _objmoveUpBtn      = null;
+let _objmoveDnBtn      = null;
+let _modalList         = null;
+
 const _selectedColor   = 'rgb(125, 116, 116)';
 const alignDataSource  = [
     {
@@ -72,6 +78,7 @@ let formInfoDiv = $(`<div class="form-info-edit-sect b0">
                             <div class="img-box">
                                 <img class="vms-img">
                                 <div class="b0 img-text">폼 미리보기</div>
+                                <a class='download' download=''></a>
                             </div>
                             <div class="ml-5">
                                     <div class="img-save-btn"></div>
@@ -376,7 +383,30 @@ let formViewBtn   = second.children().eq(1).children().eq(0);
 let formApplyBtn  = second.children().eq(2).children().eq(0);
 
 $(()=>{
- 
+    //모달 div form-type-select-btn
+    const modalDiv = $(
+        `<div class='modal-background'>
+            <div class='modal-screen b0'>
+            <div class='serve-title color modal-title'> 
+                <div>VMS 폼 유형 선택</div>
+                <div class='modal-x-btn'></div>
+            </div>
+                <div class='modal-container'>
+                    <div class='b0'>
+                        <div class='serve-title'>폼 유형 목록</div>
+                        <div class='modal-table-box b2'>
+                            <div class='modal-list'></div>
+                        </div>
+                        <div>
+                            <div class='form-type-select-btn'></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>`
+    );
+    $('body').append(modalDiv);
+
      //소통정보 이력분석 테이블
      _listTable = $(".list-table").width('100%').height('100%').dxDataGrid({
         dataSource              : null,
@@ -460,6 +490,7 @@ $(()=>{
         rowAlternationEnabled   : true,
         columnAutoWidth         : true,
         focusedRowEnabled       : true,
+        disabled                : true,
         keyExpr                 : 'form_object_id',
         noDataText              : '등록되어 있는 객체 정보가 없습니다.',
         scrolling               : {
@@ -575,11 +606,12 @@ $(()=>{
                 box   : directDiv,
             },
         ],
-        selectIndex:0,
-        loop:false,
-        animationEnabled: true,
-        swipeEnabled: false,
-        itemTitleTemplate: function(e){
+        disabled          : true,
+        selectIndex       : 0,
+        loop              : false,
+        animationEnabled  : true,
+        swipeEnabled      : false,
+        itemTitleTemplate : function(e){
         return $('<div style="height:29px; line-height:29px;">'+e.name+'</div>')
         },
         itemTemplate: function(e){
@@ -605,6 +637,53 @@ $(()=>{
         }
     }).dxSelectBox('instance');
 
+    _modalList = $('.modal-list').dxDataGrid({
+        dataSource              : null,
+        allowColumnReordering   : true,
+        showColumnLines         : true,
+        showBorders             : true,
+        allowColumnResizing     : true,
+        rowAlternationEnabled   : true,
+        columnAutoWidth         : true,
+        focusedRowEnabled       : true,
+        keyExpr                 : 'vms_form_type_cd',
+        noDataText              : '폼 유형 정보가 없습니다.',
+        scrolling               : {
+            mode : 'standard',
+        },
+        selection: {
+            mode: 'single',
+        },
+        paging: {
+            enabled: true,
+            pageSize: 1000,
+        },
+        sorting  : {
+            showSortIndexes : false,
+            mode            : 'none',
+        },
+        columns:[
+                    {
+                        dataField    : "vms_form_type_cd",
+                        caption      : "코드",
+                        alignment    : "center",
+                        cssClass     : 'no-padding',
+                    },
+                    {
+                        dataField    : "vms_form_type_nm",
+                        caption      : "VMS 폼 유형",
+                        alignment    : "center",
+                        cssClass     : 'no-padding',
+                        cellTemplate(c,e){
+                            c.css('text-align','left');
+                            c.text(e.displayValue);
+                        }
+                    },
+                ],
+    }).dxDataGrid('instance');
+
+    creatBtn($('.modal-x-btn'), 'close', null, '닫기', 'text', modalClose);
+    creatBtn($('.form-type-select-btn'), 'check', '폼 유형 선택', '폼 유형 선택', 'outlined', formTypeSelect);
     /**
      * vms 폼 정보
      */
@@ -622,7 +701,7 @@ $(()=>{
     _vmsFormObjBgCd    = inputBox( 'form', formBgColor, 'vms_form_bckg_hue_cd', 'select', 100, null, 'color', 'vms_font_colr_cd' );
     _vmsFormObjTypeCd  = inputBox( null, objTypeCd, 'vms_form_object_type_cd', 'select', 240, null, 'vms_form_object_type_desc', 'vms_form_object_type_cd' );
     //vms 폼 이미지 저장 버튼
-    _imgSaveBtn  = creatBtn($('.img-save-btn'), 'save', '폼 이미지 저장', '폼 이미지 저장', 'outlined', formImgSave, null, true, true, 30); 
+    _imgSaveBtn  = creatBtn($('.img-save-btn'), 'save', '폼 이미지 저장', '폼 이미지 저장', 'outlined', null, null, true, true, 30); 
 
 
     /**
@@ -640,19 +719,13 @@ $(()=>{
     _editTextColor     = inputBox( 'obj', textColor, 'vms_font_hue_cd', 'select', 100, null, 'color', 'vms_font_colr_cd' );
     _editTextSize      = inputBox( 'obj', textSize, 'vms_font_size', 'number', 80 );
     _editTextAlign     = inputBox( 'obj', textAlign, 'vms_font_align', 'select', 80, null, 'vms_font_align_desc', 'vms_font_align' );
-
-    _editTextInfo.box.on('input',function(e){
-        const rowData = _objList.getSelectedRowsData();
-        console.log(rowData);
-        let html = canvas.children('#'+rowData[0].form_object_id).html();
-        console.log(e.event.originalEvent.data, html);
-    });
-    //객체 목록 버튼
-    creatBtn( objDel, null, '객체삭제', '객체삭제', 'outlined', objDelEvent, null, false, true, 26);
-    creatBtn( objAdd, null, '객체추가', '객체추가', 'outlined', objAddEvent, null, false, true, 26);
-    creatBtn( objMoveUp, 'chevronup', null, '위로', 'contained', () => listMove(-1), null, false, true, 26);
-    creatBtn( objMoveDown, 'chevrondown', null, '아래로', 'contained', () => listMove(1), null, false, true, 26);
     
+    //객체 목록 버튼
+    _objDelBtn    = creatBtn( objDel, null, '객체삭제', '객체삭제', 'outlined', objDelEvent, null, true, true, 26);
+    _objAddBtn    = creatBtn( objAdd, null, '객체추가', '객체추가', 'outlined', objAddEvent, null, true, true, 26);
+    _objmoveUpBtn = creatBtn( objMoveUp, 'chevronup', null, '위로', 'text', () => listMove(-1), null, true, true, 26);
+    _objmoveDnBtn = creatBtn( objMoveDown, 'chevrondown', null, '아래로', 'text', () => listMove(1), null, true, true, 26);
+
     //폼 객체 편집 버튼
     creatBtn( objMoveUp, 'chevronup', null, '위로', 'contained', () => listMove(-1), null, false, true, 26);
     creatBtn( objMoveDown, 'chevrondown', null, '아래로', 'contained', () => listMove(1), null, false, true, 26);
@@ -835,7 +908,8 @@ function recvVmsFormTypeFunc(jsonData){
     _vmsFormTypeCd.data = _vmsFormTypeCdData;
     _vmsFormTypeCd.box.option('dataSource', _vmsFormTypeCdData);
     setValue(_vmsFormTypeCd.box, _vmsFormTypeCdData[0].vms_form_type_cd);
-
+    console.log(jsonData);
+    _modalList.option('dataSource', jsonData);
 }
 
 //VMS TYPE 콤보박스 선택 이벤트
@@ -891,8 +965,12 @@ function listTableClick(formId) {
     dsblOffBtn(_delBtn);
     dsblOffBtn(_formCopyBtn);
     dsblOffBtn(_imgSaveBtn);
+    _imgSaveBtn.off('click');
+    _imgSaveBtn.on('click', ()=> formImgSave('data:image/png;base64,' + data.form.vms_form_imag, formId));
 }
 
+
+
 /**
  * 객체 목록 더블 클릭 함수
  * @param {*} info 테이블 정보
@@ -902,26 +980,46 @@ function objListDblClick(info){
         const rowData  = info.data;
         const rowIndex = info.rowIndex;
         let dataSource = _objList.option('dataSource');
-        for (let ii = 0; ii < canvas.children().length; ii++) {
-            if(canvas.children().eq(ii).css('background-color') === _selectedColor){
-                dataSource.filter((item)=>{
-                    
-                })
-                canvas.children().eq(ii).css('background-color', 'rgb(0,0,0)');
-            }
-        }
+        
+        dataSource.map((obj)=>{
+            _vmsFormFontColrData.filter((color)=>{
+                if(obj.vms_dspl_bkcolor === color.vms_font_colr_cd){
+                    $('#' + obj.form_object_id).css('background-color', color.color);
+                    $('#' + obj.form_object_id).css('border-bottom','');
+                    $('#' + obj.form_object_id).css('border-right', '');
+                }
+            })
+        });
+
         canvas.children().eq(rowIndex).css('background-color', _selectedColor);
+        canvas.children().eq(rowIndex).css('border-bottom', '1px solid ' + _selectedColor);
+        canvas.children().eq(rowIndex).css('border-right', '1px solid ' + _selectedColor);
         setObjData(info.data);
     }
 }
 
+function setObjData(data){
+    _vmsInputMap.get('obj').forEach((info)=>{
+        if (info.type === 'check'){
+            let check = data[info.column] === 1 ? true: false;
+            setValue(info.box, check);
+        }
+        else {
+            setValue(info.box, data[info.column]);
+        }
+    });
+    setValue(_editObjTypeCd.box, data[_editObjTypeCd.column]);
+}
+
 function eventOn(){
     hideBtn(_editBtn);
     showBtn(_cancelBtn);
     dsblOnBtn(_delBtn);
     dsblOnBtn(_formCopyBtn);
-    dsblOnBtn(_imgSaveBtn);
     dsblOffBtn(_saveBtn);
+    dsblOffBtn(_objDelBtn);
+    dsblOffBtn(_objAddBtn);
+    _formTab.option('selectedIndex', 1);
     _vmsMsgDsplMthdCd.box.option('readOnly', false);
     _vmsMsgDsplDrctCd.box.option('readOnly', false);
     _vmsObjFormNm    .box.option('readOnly', false);
@@ -930,15 +1028,43 @@ function eventOn(){
     _vmsFormObjTypeCd.box.option('readOnly', false);
     _vmsInputMap.get('obj').forEach((obj)=>{
         obj.box.option('readOnly', false);
+    });
+    _editTextInfo.box.off('keyUp');
+    _editTextInfo.box.on('keyUp', function(e){
+        const rowData = _objList.getSelectedRowsData()[0];
+        canvas.children('#' + rowData.form_object_id).html(window.event.target.value.replaceAll(" ", "&nbsp;"));
+    });
+}
+
+function eventOff(){
+    showBtn(_editBtn);
+    hideBtn(_cancelBtn);
+    dsblOffBtn(_delBtn);
+    dsblOffBtn(_formCopyBtn);
+    dsblOffBtn(_imgSaveBtn);
+    dsblOnBtn(_saveBtn);
+    _editTextInfo.box.off('change');
+    _vmsMsgDsplMthdCd.box.option('readOnly', true);
+    _vmsMsgDsplDrctCd.box.option('readOnly', true);
+    _vmsObjFormNm    .box.option('readOnly', true);
+    _vmsObjFormExpl  .box.option('readOnly', true);
+    _vmsFormObjBgCd  .box.option('readOnly', true);
+    _vmsFormObjTypeCd.box.option('readOnly', true);
+    _vmsInputMap.get('obj').forEach((obj)=>{
+        obj.box.option('readOnly', true);
     })
 }
 
-function formImgSave(){
 
+//폼이미지 저장 함수
+function formImgSave(image, formId){
+    $('.download').prop('href', image);
+    $('.download').prop('download', formId + '.bmp');
+    $('.download')[0].click();
 }
 
 function addEvent(){
-    eventOn();
+    $('.modal-background').css('display', 'flex');
 }
 
 function editEvent(){
@@ -950,7 +1076,7 @@ function delEvent(){
 }
 
 function cancelEvent(){
-
+    eventOff();
 }
 
 function formCopy(){
@@ -969,24 +1095,28 @@ function objAddEvent(){
 
 }
 
+function formTypeSelect(){
+    eventOn();
+}
+
 let isMove = true;
 function listMove(changeNum){
+    if(_editBtn.option('visible')) return false;
     if (!isMove) {
         console.log("dup click. move dn");
         return;
     }
-    const selRowKeys = montPrpcTable.getSelectedRowKeys();
+    const selRowKeys = _objList.getSelectedRowKeys();
     if (selRowKeys == 0) {
-        console.log("unselected: ", montPrpcTable.getSelectedRowsData().length);
+        console.log("unselected: ", _objList.getSelectedRowsData().length);
         return;
     }
     const selectKey = selRowKeys[0];
-    const selectRow = montPrpcTable.getRowIndexByKey(selectKey);
+    const selectRow = _objList.getRowIndexByKey(selectKey);
     const changeRow = selectRow + changeNum;
     let result = false;
-    console.log(montPrpcTable.option('dataSource'));
     if(changeNum === 1){
-        result = changeRow < montPrpcTable.option('dataSource').length ? true : false;
+        result = changeRow < _objList.option('dataSource').length ? true : false;
     }
     else{
         result = changeRow >= 0 ? true : false;
@@ -994,25 +1124,61 @@ function listMove(changeNum){
 
     if (result) {
         isMove = false;
-        const dataSource = [...montPrpcTable.option('dataSource')];
+        const dataSource = [..._objList.option('dataSource')];
         dataSource.sort(function(a,b){
-            return a['monitoring_seq'] - b['monitoring_seq'];
+            return a['form_object_id'] - b['form_object_id'];
         })
+
+    const columns = [
+        'imag_data',
+        'symb_expl',
+        'symb_lib_nmbr',
+        'trfc_fill_cd',
+        'trfc_fill_desc',
+        'vms_dspl_bkcolor',
+        'vms_dspl_blinking',
+        'vms_dspl_figr',
+        'vms_dspl_height',
+        'vms_dspl_size',
+        'vms_dspl_txt',
+        'vms_dspl_width',
+        'vms_dspl_xcrdn',
+        'vms_dspl_ycrdn',
+        'vms_font_align',
+        'vms_font_hue_cd',
+        'vms_font_hue_desc',
+        'vms_font_shpe_nm',
+        'vms_font_size',
+        'vms_font_styl_cd',
+        'vms_font_styl_desc',
+        'vms_font_type_cd',
+        'vms_font_type_desc',
+        'vms_form_bckg_hue_cd',
+        'vms_form_dspl_clmn',
+        'vms_form_dspl_row',
+        'vms_form_id',
+        'vms_form_nm',
+        'vms_form_object_type_cd',
+        'vms_form_object_type_desc',
+        'vms_form_type_cd',
+        'vms_ifsc_id',
+        'vms_type_cd',
+    ];
+
         const selectData = {...dataSource[selectRow]};
         const changeData = {...dataSource[changeRow]};
 
-        const columns = ['cctv_ctlr_nmbr', 'strmrtmpaddr','istl_lctn_nm','cctv_ctlr_id','strm_http_addr','monitoring_nm','monitoring_type'];
         columns.forEach((column) => {
             dataSource[selectRow][column] = changeData[column];
             dataSource[changeRow][column] = selectData[column];
         });
 
-        montPrpcTable.option('dataSource', dataSource);
+        _objList.option('dataSource', dataSource);
         
-        montPrpcTable.refresh().done(()=>{
-            montPrpcTable.clearSelection();
-            montPrpcTable.selectRowsByIndexes(changeRow);
-            montPrpcTable.option('focusedRowIndex', changeRow);
+        _objList.refresh().done(()=>{
+            _objList.clearSelection();
+            _objList.selectRowsByIndexes(changeRow);
+            _objList.option('focusedRowIndex', changeRow);
          
             isMove = true;
         });
@@ -1035,6 +1201,12 @@ function fontWeight(){
 
 }
 
+function modalClose(){
+    _modalList.clearSelection();
+    _modalList.option('focusedRowIndex', -1);
+    $('.modal-background').css('display', 'none');
+}
+
 /**
  * input 생성 함수
  * @param {*} postion 생성 위치 
@@ -1148,7 +1320,7 @@ function setData(data){
   
     const lookupData = _objList.option('columns[1].lookup.dataSource');
     //오브젝트 데이터
-    if(lookupData !== dataSource){
+    if (lookupData !== dataSource){
         _objList.option('columns[1].lookup.dataSource', dataSource);
     }
     _vmsInputMap.get('obj').forEach((info)=>{
@@ -1165,7 +1337,6 @@ function setData(data){
  
     _editObjTypeCd.box.option('dataSource', dataSource);
     _vmsFormObjTypeCd.box.option('dataSource', dataSource);
-    
     setValue(_vmsFormObjTypeCd.box, dataSource[0][_vmsFormObjTypeCd.column]);
     setValue(_editObjTypeCd.box, dataSource[0][_editObjTypeCd.column]);
     _objList.refresh().then(()=>{

+ 24 - 2
src/main/resources/static/application/parse.html

@@ -254,7 +254,7 @@
             });
             console.log(objForm);
             // 미리보기 폼을 캔버스에 그린다.
-            drawPreviewForm(objForm);
+            drawPreviewForm(objForm, true, 2, 12);
 
             $log.append(html);
             $log.append("<h3>Preview:</h3>");
@@ -314,11 +314,33 @@
                 };
             }
 
-            function drawPreviewForm(form) {
+            function drawPreviewForm(form, drawModule, rows, cols) {
                 const canvas = document.getElementById("previewCanvas");
                 const ctx = canvas.getContext("2d");
                 ctx.fillStyle = form.color;
                 ctx.fillRect(0, 0, canvas.width, canvas.height);
+                if (drawModule) {
+                    let x = 0;
+                    let y = 0;
+                    let w = canvas.width / cols;
+                    let h = canvas.height / rows;
+
+                    ctx.setLineDash([5, 3]);
+                    ctx.beginPath();
+                    ctx.lineWidth = 1;
+                    ctx.strokeStyle = "gray";
+                    ctx.rect(0, 0, canvas.width, canvas.height);
+                    let ii;
+                    for (ii = 1; ii < rows; ii++) {
+                        ctx.moveTo(0, ii * h);
+                        ctx.lineTo(canvas.width, ii * h);
+                    }
+                    for (ii = 1; ii < cols; ii++) {
+                        ctx.moveTo(ii * w, 0);
+                        ctx.lineTo(ii * w, canvas.height);
+                    }
+                    ctx.stroke();
+                }
 
                 form.lines.forEach((line, idx) => {
                     line.texts.forEach((text, seq) => {

BIN
src/main/resources/static/images/logo.png