From f8c33ad3fb09dd0f70b68b74d59ce28761142bf0 Mon Sep 17 00:00:00 2001
From: Van333 <van666666@foxmail.com>
Date: 星期一, 14 十一月 2022 15:21:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/xm-20221107' into xm-20221107

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java          |  841 +++++++++++++++++++++++---
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaLedParam.java      |    4 
 dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaInfoBo.java                             |   83 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java    |    1 
 dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java                           |    2 
 dao/src/main/resources/mapper/NewNovaLedMapper.xml                                      |   38 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/StatusVO.java                |    6 
 ximon-admin/src/main/resources/application-local.yml                                    |    7 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java      |  117 +++
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java   |  124 +++
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java   |   68 ++
 sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java          |   33 
 dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java                               |    8 
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownResultUtil.java          |   19 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProWHVO.java                 |   31 
 sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java                   |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProGenrateVO.java            |   68 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TrasfromStatusVO.java        |   13 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java                |    2 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java         |   34 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java        |    5 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramInfoVO.java           |   29 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java      |   73 ++
 dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java                      |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java |   13 
 ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/CountDownLatchUtil.java   |   19 
 dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaListBo.java                             |   55 +
 dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java                            |  180 +----
 ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownLatchUtil.java           |   37 +
 29 files changed, 1,645 insertions(+), 273 deletions(-)

diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaInfoBo.java b/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaInfoBo.java
new file mode 100644
index 0000000..e9d25e2
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaInfoBo.java
@@ -0,0 +1,83 @@
+package com.sandu.ximon.dao.bo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/11
+ */
+@Data
+public class NewNovaInfoBo {
+
+
+    /**
+     * 浜у搧淇℃伅
+     */
+    @TableField(exist = false)
+    private ProductInfoDTO productInfo;
+
+    /**
+     * 閰嶇疆淇℃伅
+     */
+    @TableField(exist = false)
+    private ConfigInfoDTO configInfo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ProductInfoDTO {
+
+        /**
+         * 浜у搧鍚嶇О锛屼緥濡俆3,T6
+         */
+        private String productName;
+
+        /**
+         * 浜у搧缂栧彿
+         */
+        private Integer modelId;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ConfigInfoDTO {
+
+        /**
+         * 鏄惁鏀寔瑙嗛鍒囨崲锛宼rue琛ㄧず鏀寔锛宖alse琛ㄧず涓嶆敮鎸�
+         */
+        private Boolean videoSwitch;
+
+        /**
+         * 鏄剧ず璁惧锛屾湁涓ょLED銆丩CD
+         */
+        private String displayDevice;
+
+        /**
+         * 缃戝彛閰嶇疆
+         */
+        private List<PortConfigDTO> portConfig;
+
+        @NoArgsConstructor
+        @Data
+        public static class PortConfigDTO {
+
+            /**
+             * 缃戝彛缂栧彿锛屼緥濡�:1,2,3,4
+             */
+            private Integer portNO;
+
+            /**
+             * 鏄惁涓轰富缃戝彛
+             */
+            private Boolean isMainPort;
+
+            /**
+             * 瀵瑰簲鐨勪富缃戝彛锛屽鏋滆缃戝彛鏄富缃戝彛锛岃瀛楁鏃犳晥
+             */
+            private Integer belongMainPort;
+        }
+    }
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaListBo.java b/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaListBo.java
new file mode 100644
index 0000000..845cdcd
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaListBo.java
@@ -0,0 +1,55 @@
+package com.sandu.ximon.dao.bo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/11
+ * 璇虹摝璁惧鍒楄〃浣跨敤
+ */
+@Data
+public class NewNovaListBo {
+
+    private Long id;
+
+    /**
+     * 鎾斁鍣ㄥ悕绉�(鏁版嵁搴�)
+     */
+    private String name;
+
+
+    /**
+     * 鎾斁鍣ㄥ敮涓�鏍囪瘑,濡傛灉涓簄ull浠h〃娌℃湁缁戝畾鎾斁鍣�(Vnnox)
+     */
+    private String sn;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 鍦ㄧ嚎鐘舵�� 0绂荤嚎 1鍦ㄧ嚎
+     */
+    private Integer onlineSign;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 鐏潌id
+     */
+    private Long poleId;
+
+    /**
+     * 鐏潌鍚嶇О
+     */
+    private String poleName;
+
+
+
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java b/dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java
index 87d8853..9f7abc0 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java
@@ -4,11 +4,12 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.sandu.ximon.dao.bo.NewNovaInfoBo;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -31,15 +32,6 @@
      */
     private String name;
 
-    /**
-     * 鎾斁鍣ㄥ悕绉�(server)
-     */
-    private String playerName;
-
-    /**
-     * 鎾斁鍣↖D(Vnnox)
-     */
-    private String playerId;
 
     /**
      * 鎾斁鍣ㄥ敮涓�鏍囪瘑,濡傛灉涓簄ull浠h〃娌℃湁缁戝畾鎾斁鍣�(Vnnox)
@@ -52,7 +44,7 @@
     private LocalDateTime createTime;
 
     /**
-     * 鍒嗚鲸鐜�
+     * 鏄惁鍦ㄧ嚎杩�
      */
     private Integer onlineSign;
 
@@ -64,122 +56,52 @@
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 
-//    /**
-//     * 浜у搧鍚嶇О
-//     */
-//    @JsonIgnore
-//    @TableField(exist = false)
-//    private String productName;
-//
-//    /**
-//     * 鏄剧ず灞忓搴�,鍗曚綅涓哄儚绱�
-//     */
-//    @TableField(exist = false)
-//    private Integer width;
-//
-//    /**
-//     * 鏄剧ず灞忛珮搴�,鍗曚綅涓哄儚绱�
-//     */
-//    @TableField(exist = false)
-//    private Integer height;
-//
-//    /**
-//     * 鏃嬭浆瑙掑害:0锛�90锛�180锛�270
-//     */
-//    @TableField(exist = false)
-//    private Integer rotation;
-//
-//    /**
-//     * 鏄剧ず灞忓埆鍚�
-//     */
-//    @JsonIgnore
-//    @TableField(exist = false)
-//    private String aliasName;
-//
-//    /**
-//     * 鏄惁鏈変汉宸茬粡鐧婚檰
-//     */
-//    @JsonIgnore
-//    @TableField(exist = false)
-//    private Boolean logined;
-//
-//    /**
-//     * 鑻ュ凡缁忔湁浜虹櫥闄嗭紝浠h〃宸茬粡鐧婚檰鐨勭敤鎴峰悕鍒楄〃
-//     */
-//    @TableField(exist = false)
-//    private List<String> username;
-//
-//    /**
-//     * tcp杩炴帴绔彛
-//     */
-//    @TableField(exist = false)
-//    private Integer tcpPort;
-//
-//    /**
-//     * ftp杩炴帴绔彛
-//     */
-//    @TableField(exist = false)
-//    private Integer ftpPort;
-//
-//    /**
-//     * 绯荤粺璁剧疆ftp绔彛
-//     */
-//    @TableField(exist = false)
-//    private Integer syssetFtpPort;
-//
-//    /**
-//     * 绯荤粺璁剧疆tcp绔彛
-//     */
-//    @TableField(exist = false)
-//    private Integer syssetTcpPort;
-//
-//    /**
-//     * 缁堢杩斿洖鐨刱ey,鍙備笌ftp鐨勫瘑鐮佺敓浜ц鍒�
-//     */
-//    @TableField(exist = false)
-//    private String key;
-//
-//    /**
-//     * 绯荤粺骞冲彴淇℃伅锛堟殏鏃朵細鍑虹幇rk3368,rk312x锛�
-//     */
-//    @TableField(exist = false)
-//    private String platform;
-//
-//    /**
-//     * True琛ㄧず缁堢鏀寔鍔犲瘑妯″紡锛屽綋鐒跺鏋滄槸鏂扮殑缁堢涓�瀹氭槸True
-//     */
-//    @TableField(exist = false)
-//    private Boolean privacy;
-//
-//
-//    /**
-//     * 褰撳墠灞忎綋鐘舵�侊紝terminalState鍏辨湁6涓��,鍒嗗埆浠h〃锛�
-//     * 0锛氭湭杩炴帴浠讳綍缁堢锛屽綋鍓嶅浜庢湭杩炴帴鐘舵��
-//     * 1锛氳繛鎺ユ垚鍔熶絾鏄湭鐧诲綍鐘舵��
-//     * 2锛氳浠栦汉鐧诲綍鐘舵��
-//     * 3锛氱櫥褰曟垚鍔熺姸鎬�
-//     * 4锛氬瘑鐮侀敊璇姸鎬�
-//     * 5锛氱绾跨姸鎬侊紝澶勪簬鎼滅储涓嶅埌鐨勭姸鎬侊紝浣嗘槸鏇剧粡琚悳绱㈠埌杩�
-//     */
-//    @TableField(exist = false)
-//    private Integer terminalState;
-//
-//    /**
-//     * 璁板綍鐐瑰嚮蹇界暐瀵嗙爜鐨勬椂闂存埑
-//     */
-//    @JsonIgnore
-//    @TableField(exist = false)
-//    private Long ignoreTime;
-//
-//    /**
-//     * 鏄惁璁颁綇瀵嗙爜锛宼rue琛ㄧず璁颁綇锛宖alse锛岃〃绀烘病鏈�
-//     */
-//    @TableField(exist = false)
-//    private Boolean hasPassword;
-//
-//    /**
-//     * 瀵嗙爜
-//     */
-//    @TableField(exist = false)
-//    private String password;
+    /**
+     * 鍦ㄧ嚎鐘舵�� 0绂荤嚎 1鍦ㄧ嚎
+     */
+    @TableField(exist = false)
+    private Integer isOnline = 0;
+
+    /**
+     * 鐏潌id
+     */
+    @TableField(exist = false)
+    private Long poleId;
+
+    /**
+     * 鐏潌鍚嶇О
+     */
+    @TableField(exist = false)
+    private String poleName;
+
+    /**
+     * 鏈嶅姟鍣ㄨ澶囦俊鎭�
+     */
+    @TableField(exist = false)
+    private NewNovaInfoBo info;
+
+    /**
+     * 灞忓箷寮�鍏�  0鍏� 1寮�
+     */
+    @TableField(exist = false)
+    private int screenPower = 0;
+
+    /**
+     * 闊抽噺 0-100
+     */
+    @TableField(exist = false)
+    private BigDecimal volume = BigDecimal.ZERO;
+
+    /**
+     * 浜害鐧惧垎姣旓紝0-100
+     */
+    @TableField(exist = false)
+    private BigDecimal brightness = BigDecimal.ZERO;
+
+    /**
+     * 鍚屾鐘舵��
+     */
+    @TableField(exist = false)
+    private Integer sync = 0;
+
 }
\ No newline at end of file
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java b/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
index e4b4eb0..70ad843 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
@@ -37,7 +37,7 @@
     private String deviceCode;
 
     /**
-     * 璁惧绫诲瀷锛�0璺伅锛�1璇虹摝锛�2鍏呯數妗╋紝3澶ф皵鐩戞祴锛�4姘磋川鐩戞祴锛�5ip闊虫煴锛�6lcd骞垮憡鏈猴紝7鎽勫儚澶达紝8鏉嗕綋鍊炬祴锛�9涓�閿晳鍔� ,10 鐔欒  11澶ф皵鍐滆��
+     * 璁惧绫诲瀷锛�0璺伅锛�1璇虹摝锛�2鍏呯數妗╋紝3澶ф皵鐩戞祴锛�4姘磋川鐩戞祴锛�5ip闊虫煴锛�6lcd骞垮憡鏈猴紝7鎽勫儚澶达紝8鏉嗕綋鍊炬祴锛�9涓�閿晳鍔� ,10 鐔欒  11澶ф皵鍐滆��  12 鏂拌鐡�
      */
     private Integer deviceType;
 
diff --git a/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java b/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
index bdfbe26..7c70fd2 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
@@ -239,6 +239,14 @@
     LED_NEW_FILE_LIST("鏂拌鐡︽枃浠跺垪琛�"),
     LED_NEW_FILE_ADD("鏂拌鐡︽枃浠舵柊澧�"),
     LED_NEW_FILE_DEL("鏂拌鐡︽枃浠跺垹闄�"),
+    LED_NEW_ADD("鏂拌鐡﹀睆骞曟柊澧�"),
+    LED_NEW_EDIT("鏂拌鐡﹀睆骞曠紪杈�"),
+    LED_NEW_DEL("鏂拌鐡﹀睆骞曞垹闄�"),
+    LED_NEW_LIST("鏂拌鐡﹀睆骞曞垪琛�"),
+    LED_NEW_INFO("鏂拌鐡﹀睆骞曡鎯�"),
+    LED_NEW_VOL("鏂拌鐡﹂煶閲忚皟鑺�"),
+    LED_NEW_BRIGHTNESS("鏂拌鐡︿寒搴﹁皟鑺�"),
+    LED_NEW_POWER("鏂拌鐡﹀紑鍏宠皟鑺�"),
     ;
 
 
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java
index 92b0c0c..743ae93 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java
@@ -1,8 +1,11 @@
 package com.sandu.ximon.dao.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sandu.ximon.dao.bo.NewNovaListBo;
 import com.sandu.ximon.dao.domain.NewNovaLed;
 import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * @author Administrator
@@ -13,6 +16,7 @@
 @Mapper
 public interface NewNovaLedMapper extends BaseMapper<NewNovaLed> {
 
+    List<NewNovaLed> listLed(String keyword, Long userId);
 }
 
 
diff --git a/dao/src/main/resources/mapper/NewNovaLedMapper.xml b/dao/src/main/resources/mapper/NewNovaLedMapper.xml
index 862178c..fbad90f 100644
--- a/dao/src/main/resources/mapper/NewNovaLedMapper.xml
+++ b/dao/src/main/resources/mapper/NewNovaLedMapper.xml
@@ -5,19 +5,39 @@
 <mapper namespace="com.sandu.ximon.dao.mapper.NewNovaLedMapper">
 
     <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaLed">
-            <id property="id" column="id" jdbcType="BIGINT"/>
-            <result property="name" column="name" jdbcType="VARCHAR"/>
-            <result property="playerName" column="player_name" jdbcType="VARCHAR"/>
-            <result property="playerId" column="player_id" jdbcType="VARCHAR"/>
-            <result property="sn" column="sn" jdbcType="VARCHAR"/>
-            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="resolution" column="resolution" jdbcType="VARCHAR"/>
-            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <id property="id" column="id" jdbcType="BIGINT"/>
+        <result property="name" column="name" jdbcType="VARCHAR"/>
+        <result property="sn" column="sn" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="onlineSign" column="online_sign" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <sql id="Base_Column_List">
-        id,name,player_name,
+        id
+        ,name,player_name,
         player_id,sn,create_time,
         resolution,update_time
     </sql>
+    <select id="listLed" resultType="com.sandu.ximon.dao.domain.NewNovaLed">
+        SELECT
+        t1.*,
+        t3.id AS pole_id,
+        t3.pole_name
+        FROM
+        new_nova_led t1
+        LEFT JOIN pole_binding t2 ON t1.sn = t2.device_code
+        AND t2.device_type = 12
+        LEFT JOIN pole t3 ON t2.pole_id = t3.id
+        <where>
+            1=1
+            <if test="keyword != null and keyword != ''">
+                AND t1.name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
+                OR t1.sn LIKE CONCAT(CONCAT('%', #{keyword}), '%')
+            </if>
+            <if test="userId != null">
+                AND (t3.user_id = #{userId} OR t3.client_id = #{userId})
+            </if>
+        </where>
+    </select>
 </mapper>
diff --git a/sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java b/sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java
index 5c6885c..c4be2de 100644
--- a/sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java
+++ b/sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java
@@ -1,5 +1,7 @@
 package com.sandu.common.file;
 
+import com.sandu.common.file.config.NovaFileConfig;
+import com.sandu.common.util.SpringContextHolder;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.ImageType;
 import org.apache.pdfbox.rendering.PDFRenderer;
@@ -125,7 +127,7 @@
         ImageIO.write(bi, "png", targetFile);
         // 鏌ョ湅stop婧愮爜浼氳嚜鍔ㄥ叧娴�
         ff.stop();
-        return sourcePath;
+        return targetFile.getPath().replace(SpringContextHolder.getBean(NovaFileConfig.class).getUploadRootPath(), "").replace(File.separator,"/");
 
     }
 
diff --git a/sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java b/sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java
index 14f6fb0..4abbe70 100644
--- a/sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java
+++ b/sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java
@@ -5,14 +5,15 @@
 import cn.hutool.core.io.FileTypeUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
+import com.alibaba.fastjson.JSON;
 import com.sandu.common.enums.FileStorageEnums;
 import com.sandu.common.execption.BusinessException;
 import com.sandu.common.file.*;
-import com.sandu.common.file.config.FileProperties;
 import com.sandu.common.file.config.NovaFileConfig;
 import com.sandu.common.util.SpringContextHolder;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringEscapeUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -24,7 +25,9 @@
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.time.LocalDate;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 /**
@@ -35,8 +38,7 @@
 @AllArgsConstructor
 public class LocalFileUploadImpl implements IFileUpload {
 
-    private static List<String> videoSuffixList = CollectionUtil.newArrayList("mp4", "mov", "avi", "mkv", "m4v", "wmv",
-            "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob");
+    private static List<String> videoSuffixList = CollectionUtil.newArrayList("mp4", "mov", "avi", "mkv", "m4v", "wmv", "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob");
 
     private final FileToThumbnail fileToThumbnail;
 
@@ -52,7 +54,7 @@
         File dest;
         try {
             String type = Optional.ofNullable(FileTypeUtil.getType(multipartFile.getInputStream(), originalFilename)).orElse("");
-            dest = new File(fileProperties.getUploadRootPath() + type + File.separator + date + File.separator + fileName).getCanonicalFile();
+            dest = new File(fileProperties.getUploadRootPath() + File.separator + type + File.separator + date + File.separator + fileName).getCanonicalFile();
 
             if (!dest.getParentFile().exists()) {
                 dest.getParentFile().mkdirs();
@@ -67,8 +69,8 @@
         FileUploadDto uploadDto = new FileUploadDto();
         uploadDto.setOriginName(originalFilename);
         uploadDto.setFileName(fileName);
-        uploadDto.setRealUrl(dest.getPath());
-        uploadDto.setFileUrl(fileProperties.getRealUrl() + dest.getPath());
+        uploadDto.setRealUrl(dest.getPath().replace(File.separator,"/"));
+        uploadDto.setFileUrl(dest.getPath().replace(fileProperties.getUploadRootPath(), "").replace(File.separator,"/"));
         uploadDto.setFileType(FileUtil.getType(dest));
         uploadDto.setStorageType(FileStorageEnums.LOCAL.getCode());
         uploadDto.setFileSize(size);
@@ -95,10 +97,9 @@
             }
             try {
                 InputStream inputStream = multipartFile.getInputStream();
-                String screenShot = fileProperties.getUploadRootPath() + uploadDto.getFileType()
-                        + File.separator + date + File.separator + "screenShot" + uuidStr + ".jpg";
+                String screenShot = fileProperties.getUploadRootPath() + uploadDto.getFileType() + File.separator + date + File.separator + "screenShot" + uuidStr + ".jpg";
                 String thumbnailForVideo = fileToThumbnail.getThumbnailForVideo(inputStream, screenShot);
-                uploadDto.setScreenShot(fileProperties.getRealUrl() + thumbnailForVideo);
+                uploadDto.setScreenShot(thumbnailForVideo);
                 inputStream.close();
             } catch (IOException e) {
                 throw new RuntimeException(e);
@@ -130,4 +131,18 @@
         }
         return null;
     }
+
+    public static void main(String[] args) {
+//        String a = "E:\\\\file\\\\png\\\\2022-11-14\\\\bc8cbe61-2c81-4dac-911a-91b711eebc24\\\\png";
+//        System.out.println(a);
+//        System.out.println(a.replaceAll("\\\\", "/"));
+        File f = null;
+        try {
+            f = new File("E:\\file\\png\\2022-11-14\\cc4ce72e-2304-4f45-81e5-3b57519d57b6.png").getCanonicalFile();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println(File.separator);
+        System.out.println(f.getPath());
+    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java
index dcc2adf..8a6fab4 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java
@@ -18,5 +18,10 @@
      */
     private String stringPath;
 
+    /**
+     * 鑺傜洰鐢熸垚璺緞
+     */
+    private String outPutPath;
+
 
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java
index 1464ad2..1cb7eb3 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java
@@ -4,7 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.sandu.common.domain.ResponseVO;
-import com.sandu.common.file.FileToThumbnail;
+import com.sandu.common.file.config.NovaFileConfig;
 import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.util.ResponseUtil;
 import com.sandu.ximon.admin.newnova.param.NewNovaFileParam;
@@ -28,7 +28,7 @@
 @RequestMapping("/v1/nova/file")
 public class NewNovaFileController {
 
-    private FileToThumbnail fileToThumbnail;
+    private NovaFileConfig fileConfig;
     private PermissionConfig permissionConfig;
     private final NewNovaFileService newNovaFileService;
 
@@ -59,7 +59,14 @@
             wrapper.like(NewNovaFile::getName, keyword);
         }
         PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
-        return ResponseUtil.successPage(newNovaFileService.list(wrapper));
+        List<NewNovaFile> list = newNovaFileService.list(wrapper);
+        list.forEach(file -> {
+            file.setFileUrl(fileConfig.getRealUrl() + file.getFileUrl());
+            if (file.getScreenShot() != null) {
+                file.setScreenShot(fileConfig.getRealUrl() + file.getScreenShot());
+            }
+        });
+        return ResponseUtil.success(list);
     }
 
     @PostMapping("/uploading")
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java
index 3f8a749..ee85d11 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java
@@ -101,7 +101,6 @@
      * @return
      */
     public NewNovaFile uploadFile(MultipartFile multipartFile) {
-//        FileStorage fileStorage = localFileService.uploadFile(multipartFile);
 
         FileUploadDto fileUploadDto = localFileUpload.uploadFile(multipartFile);
         NewNovaFile novaFile = new NewNovaFile();
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java
index 703ae72..9b8e87e 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java
@@ -1,22 +1,18 @@
 package com.sandu.ximon.admin.newnova.led;
 
 import com.sandu.common.domain.ResponseVO;
+import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.util.ResponseUtil;
 import com.sandu.ximon.admin.newnova.param.NewNovaLedParam;
+import com.sandu.ximon.admin.newnova.param.NewNovaStatusParam;
 import com.sandu.ximon.admin.newnova.utils.NovaAPIUtil;
-import com.sandu.ximon.admin.newnova.vo.StatusVO;
 import com.sandu.ximon.admin.security.PermissionConfig;
-import com.sandu.ximon.dao.domain.LedV2RegisterResultEntity;
 import com.sandu.ximon.dao.enums.MenuEnum;
 import lombok.AllArgsConstructor;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.net.URISyntaxException;
-import java.util.Map;
+import java.util.List;
 
 /**
  * @author LiuHaoNan
@@ -28,20 +24,114 @@
 public class NewNovaLedController {
     private final PermissionConfig permissionConfig;
     private final NewNovaLedService newNovaLedService;
-    private final NovaAPIUtil novaApiUtil;
 
+
+    /**
+     * 灞忓箷娉ㄥ唽
+     *
+     * @param param
+     * @return
+     */
     @PostMapping("/validateSN")
-    public ResponseVO<Object> validateSN(@RequestBody @Validated NewNovaLedParam param)  {
-        if (!permissionConfig.check(MenuEnum.VNNOX_ADD.getCode())) {
+    public ResponseVO<Object> validateSN(@RequestBody @Validated NewNovaLedParam param) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_ADD.getCode())) {
             return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
         }
-       boolean b= newNovaLedService.saveLed(param);
-        return ResponseUtil.success("ledV2RegisterResultEntity");
+        boolean b = newNovaLedService.saveLed(param);
+        return ResponseUtil.success(b);
     }
-    @PostMapping("/test")
-    public ResponseVO<Object> validateSN()  {
-        StatusVO mzva51930N2113017308 = novaApiUtil.login("MZVA51930N2113017308");
-        return ResponseUtil.success(mzva51930N2113017308);
+
+    /**
+     * 缂栬緫灞忓箷鍚嶇О
+     */
+    @PostMapping("/editLed")
+    public ResponseVO editLed(@RequestBody NewNovaLedParam param) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_EDIT.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+        return ResponseUtil.success(newNovaLedService.editLed(param));
     }
 
+    /**
+     * 鍒犻櫎灞忓箷
+     */
+    @PostMapping("/delLed")
+    public ResponseVO delLEd(@RequestBody List<Long> ids) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_DEL.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+        return ResponseUtil.success(newNovaLedService.delLed(ids));
+    }
+
+
+    /**
+     * 灞忓箷鍒楄〃
+     */
+    @GetMapping("/listLed")
+    public ResponseVO listLed(BaseConditionVO baseConditionVO, @RequestParam(required = false, value = "keyword") String keyword,
+                              @RequestParam(required = false, value = "onlineStatus") boolean onlineStatus) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_LIST.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+        return ResponseUtil.success(newNovaLedService.listLed(baseConditionVO, keyword, onlineStatus));
+    }
+
+    /**
+     * 璇︾粏淇℃伅
+     *
+     * @param ledId
+     * @return
+     */
+    @GetMapping("/getInfo")
+    public ResponseVO getInfo(@RequestParam(required = true, value = "ledId") Long ledId) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_INFO.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+        return ResponseUtil.success(newNovaLedService.getInfo(ledId));
+    }
+
+    /**
+     * 璁剧疆浜害
+     */
+    @PostMapping("/setBrightness")
+    public ResponseVO setScreenBrightness(@RequestBody @Validated NewNovaStatusParam param) {
+        if (!permissionConfig.check(MenuEnum.LED_NEW_VOL.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+        if (param.getBrightness() == null) {
+            return ResponseUtil.fail("浜害涓嶈兘涓虹┖");
+        } else {
+            if (param.getBrightness() > 100 || param.getBrightness() < 0) {
+                return ResponseUtil.fail("浜害鑼冨洿涓�: 0-100");
+            }
+        }
+        if (newNovaLedService.getById(param.getId()) == null) {
+            return ResponseUtil.fail("璁惧涓嶅瓨鍦�");
+        }
+        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().setScreenBrightness(param));
+    }
+
+
+//    @PostMapping("/tranPro")
+//    public ResponseVO<Object> tranPro(@RequestBody Map pageInfo) throws InterruptedException {
+//        NovaAPIUtil a = NovaAPIUtil.getInstanceUtil();
+//        StatusVO login = a.login("MZVA51930N2113017308");
+//        if (login.getStatusCode() != 0) {
+//            return ResponseUtil.fail("genVO");
+//        }
+//        StatusVO createPro = a.createPro(new ProWHVO("jiemu 1", 128, 256));
+//        System.out.println(createPro + "createPro");
+//        StatusVO editPro = a.editProgram(Integer.valueOf(createPro.getStatusData()), pageInfo);
+//        StatusVO genVO = a.genrateProgram(Integer.valueOf(createPro.getStatusData()));
+//        ProgramPrarm page = new ProgramPrarm();
+//        page.setInsertPlay(true);
+//        page.setProgramID(Integer.valueOf(createPro.getStatusData()));
+//        page.setStartPlayAfterTransferred(true);
+//        List<String> sns = new ArrayList<String>();
+//        sns.add("MZVA51930N2113017308");
+//        page.setSnList(sns);
+//        List<TrasfromStatusVO> trasfromStatusVOS = a.trasfromProgram(page);
+//        return ResponseUtil.success(trasfromStatusVOS);
+//    }
+
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java
index 9771100..4384438 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java
@@ -1,13 +1,26 @@
 package com.sandu.ximon.admin.newnova.led;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
 import com.sandu.common.execption.BusinessException;
+import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.common.util.SpringContextHolder;
 import com.sandu.ximon.admin.newnova.param.NewNovaLedParam;
+import com.sandu.ximon.admin.newnova.utils.NovaAPIUtil;
+import com.sandu.ximon.admin.security.SecurityUtils;
+import com.sandu.ximon.admin.service.PoleBindingService;
+import com.sandu.ximon.admin.service.PoleService;
 import com.sandu.ximon.dao.domain.NewNovaLed;
+import com.sandu.ximon.dao.domain.Pole;
+import com.sandu.ximon.dao.domain.PoleBinding;
 import com.sandu.ximon.dao.mapper.NewNovaLedMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author LiuHaoNan
@@ -32,9 +45,113 @@
         NewNovaLed led = new NewNovaLed();
         led.setSn(param.getSn());
         led.setName(param.getName());
+        led.setOnlineSign(0);
         return save(led);
     }
 
 
+    /**
+     * 缂栬緫灞忓箷鍚嶇О
+     *
+     * @param param
+     * @return
+     */
+    public boolean editLed(NewNovaLedParam param) {
+        if (param.getId() == null) {
+            throw new BusinessException("灞忓箷id涓嶈兘涓虹┖");
+        }
+        if (param.getName() == null || param.getName().isEmpty()) {
+            throw new BusinessException("灞忓箷鍚嶇О涓嶈兘涓虹┖");
+        }
 
+        NewNovaLed one = getById(param.getId());
+        if (one == null) {
+            throw new BusinessException("璁惧涓嶅瓨鍦紒");
+        }
+//        one.setSn(param.getSn());
+        one.setName(param.getName());
+        return updateById(one);
+    }
+
+    /**
+     * 鍒犻櫎LED
+     *
+     * @param ids
+     * @return
+     */
+    public boolean delLed(List<Long> ids) {
+        if (ids.isEmpty()) {
+            throw new BusinessException("id涓嶈兘涓虹┖");
+        }
+        List<NewNovaLed> newNovaLeds = listByIds(ids);
+        if (newNovaLeds.isEmpty()) {
+            throw new BusinessException("璁惧涓嶅瓨鍦紒");
+        }
+        //鑾峰彇鍒犻櫎璁惧鐨勮澶囩爜
+        List<String> snList = newNovaLeds.stream().map(NewNovaLed::getSn).collect(Collectors.toList());
+        //鍒犻櫎缁戝畾鍏崇郴
+        SpringContextHolder.getBean(PoleBindingService.class).remove(Wrappers.lambdaQuery(PoleBinding.class)
+                .eq(PoleBinding::getDeviceType, 12).in(PoleBinding::getDeviceCode, snList));
+        //鍒犻櫎璁惧
+        return removeByIds(ids);
+    }
+
+    /**
+     * LED鍒楄〃
+     *
+     * @param baseConditionVO
+     * @param keyword
+     * @param onlineStatus
+     * @return
+     */
+    public List<NewNovaLed> listLed(BaseConditionVO baseConditionVO, String keyword, boolean onlineStatus) {
+
+        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
+        //鎺掑簭
+        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
+        List<NewNovaLed> newNovaListBos = baseMapper.listLed(keyword, SecurityUtils.getClientId());
+        //鑾峰彇鍦ㄧ嚎鐘舵��
+        instanceUtil.getOnlineStatus(newNovaListBos);
+        //鑾峰彇灞忓箷寮�鍏�
+        instanceUtil.getScreenPowerState(newNovaListBos);
+        //鑾峰彇闊抽噺
+        instanceUtil.getVolumeState(newNovaListBos);
+        //鑾峰彇浜害
+        instanceUtil.getScreenBrightness(newNovaListBos);
+        //鑾峰彇鍚屾鐘舵��
+        instanceUtil.getSync(newNovaListBos);
+
+        updateBatchById(newNovaListBos);
+        return newNovaListBos;
+    }
+
+    public NewNovaLed getInfo(Long ledId) {
+        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
+        NewNovaLed byId = getById(ledId);
+        if (byId == null) {
+            throw new BusinessException("璁惧涓嶅瓨鍦ㄦ垨id涓嶆纭� !");
+        }
+        PoleBinding poleBinding = SpringContextHolder.getBean(PoleBindingService.class).getOne(Wrappers.lambdaQuery(PoleBinding.class)
+                .eq(PoleBinding::getDeviceCode, byId.getSn()).eq(PoleBinding::getDeviceType, 12));
+        if (poleBinding != null) {
+            Pole pole = SpringContextHolder.getBean(PoleService.class).getById(poleBinding.getPoleId());
+            byId.setPoleId(pole.getId());
+            byId.setPoleName(pole.getPoleName());
+        }
+        List<NewNovaLed> list = new ArrayList<>();
+        list.add(byId);
+        //鑾峰彇鍦ㄧ嚎鐘舵��
+        instanceUtil.getOnlineStatus(list);
+        //鑾峰彇灞忓箷寮�鍏�
+        instanceUtil.getScreenPowerState(list);
+        //鑾峰彇闊抽噺
+        instanceUtil.getVolumeState(list);
+        //鑾峰彇浜害
+        instanceUtil.getScreenBrightness(list);
+        //鑾峰彇鍚屾鐘舵��
+        instanceUtil.getSync(list);
+        //鑾峰彇璇︽儏
+        instanceUtil.getInfo(byId);
+        return list.get(0);
+    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaLedParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaLedParam.java
index f6e19ed..6a00593 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaLedParam.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaLedParam.java
@@ -14,6 +14,10 @@
     @NotBlank(message = "sn鐮佷笉鑳戒负绌�")
     private String sn;
 
+    @NotBlank(message = "灞忓箷鍚嶇О涓嶈兘涓虹┖")
     private String name;
 
+
+    private Long id;
+
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java
new file mode 100644
index 0000000..bb8df8c
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java
@@ -0,0 +1,68 @@
+package com.sandu.ximon.admin.newnova.param;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/11
+ * 鏂拌鐡�  璁惧鐘舵�佽皟鑺�  寮�鍏�  闊抽噺  浜害 绛�
+ */
+@Data
+public class NewNovaStatusParam {
+
+
+    /**
+     * id
+     */
+    @NotNull(message = "id涓嶈兘涓虹┖")
+    private Long id;
+    /**
+     * 璁惧鐮�
+     */
+    @NotBlank(message = "sn涓嶈兘涓虹┖")
+    private String sn;
+
+    /**
+     * 浜害
+     */
+    private Double brightness;
+
+    /**
+     * 闊抽噺
+     */
+    private Double volume;
+
+
+    /**
+     * 鍚屾鐘舵��
+     */
+    private boolean sync = true;
+
+    /**
+     * ntp
+     */
+    private boolean ntp = true;
+
+
+    private List<NovaDTO> novaList;
+
+
+    @NoArgsConstructor
+    @Data
+    public static class NovaDTO {
+
+        private Long id;
+
+        private String sn;
+
+        private String name;
+
+        private boolean status = false;
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java
new file mode 100644
index 0000000..9432ef6
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java
@@ -0,0 +1,34 @@
+package com.sandu.ximon.admin.newnova.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@Data
+public class ProgramPrarm {
+
+    /**
+     * sn
+     */
+    private List<String> snList;
+
+    /**
+     * 鑺傜洰id
+     */
+    private Integer programID;
+
+    /**
+     * 鏄惁绔嬪嵆鎾斁鑺傜洰
+     */
+    private Boolean startPlayAfterTransferred;
+
+    /**
+     * 鏄惁鎻掓挱
+     */
+    private Boolean insertPlay;
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/CountDownLatchUtil.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/CountDownLatchUtil.java
new file mode 100644
index 0000000..4846bc9
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/CountDownLatchUtil.java
@@ -0,0 +1,19 @@
+package com.sandu.ximon.admin.newnova.utils;
+
+import org.apache.commons.lang.RandomStringUtils;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+public class CountDownLatchUtil {
+    public String createCoutDown(com.sandu.ximon.admin.utils.CountDownLatchUtil countDownLatchUtil) {
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        //鑾峰彇涓�涓�7浣嶉殢鏈烘暟
+        String str = RandomStringUtils.randomAlphanumeric(7);
+        countDownLatchUtil.push(str, countDownLatch);
+        return str;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java
index 6b71835..2d005fd 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java
@@ -1,163 +1,808 @@
 package com.sandu.ximon.admin.newnova.utils;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.sandu.common.execption.BusinessException;
+import com.sandu.common.util.SpringContextHolder;
 import com.sandu.ximon.admin.newnova.conf.FilePathConfig;
-import com.sandu.ximon.admin.newnova.vo.StatusVO;
-import com.sandu.ximon.admin.utils.CountDownLatchUtil;
+import com.sandu.ximon.admin.newnova.param.NewNovaStatusParam;
+import com.sandu.ximon.admin.newnova.param.ProgramPrarm;
+import com.sandu.ximon.admin.newnova.vo.*;
+import com.sandu.ximon.admin.security.SecurityUtils;
+import com.sandu.ximon.dao.bo.NewNovaInfoBo;
+import com.sandu.ximon.dao.domain.NewNovaLed;
 import com.sun.jna.Native;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Component;
 
-import java.util.LinkedHashMap;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author LiuHaoNan
  * @date 2022/11/9
  */
-@Component
-@AllArgsConstructor
 public class NovaAPIUtil {
 
 
-//    @Value("${new-nova.string-path}")
-//    public String getStringPath() {
-//        return stringPath;
-//    }
+    private FilePathConfig filePathConfig;
 
-    private final FilePathConfig filePathConfig;
-    private final CountDownLatchUtil countDownLatchUtil;
-    private static Boolean g_bAPIReturn = false;
-    private static int g_code = 0;
-    private static String g_sn = "BZSA79353N1310006847"; //BZSA07313J0350000997
+    private Map<String, Boolean> loginSn = new HashMap();
 
-    private static Map loginInfo = new LinkedHashMap();
+    private ViplexCore instance = null;
+
+    private static NovaAPIUtil instanceUtil = null;
+
+    private static String loginInfo = null;
+
+    private NovaAPIUtil() {
+        filePathConfig = SpringContextHolder.getBean(FilePathConfig.class);
+        String rootDir = filePathConfig.getOutPutPath();
+        instance = (ViplexCore) Native.loadLibrary(filePathConfig.getStringPath(), ViplexCore.class);
+        System.setProperty("jna.encoding", "UTF-8");
+        System.out.println("淇濆瓨璺緞:" + rootDir);
+        rootDir = rootDir.replaceAll("\\\\", "/");
+        String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}";
+        instance.nvSetDevLang("Java");
+        System.out.println("nvInit(sdk 鍒濆鍖�):");
+        System.out.println(instance.nvInit(rootDir, companyInfo));
 
 
-
-//    private static ViplexCore.CallBack callBack = new ViplexCore.CallBack() {
-//
-//        @Override
-//        public void dataCallBack(int code, String data) {
-//            // TODO Auto-generated method stub
-//            g_code = code;
-//            String strCode = "\nViplexCore Demo code:" + code;
-//            String strData = "\nViplexCore Demo data:" + data;
-//            System.out.println(strCode);
-//            System.out.println(strData);
-//            g_bAPIReturn = true;
-//        }
-//
-//    };
-
-
-    static void waitAPIReturn() throws InterruptedException {
-        while (!g_bAPIReturn) {
-            Thread.sleep(1000);
-        }
-        g_bAPIReturn = false;
+//        login("MZVA51930N2113017308");//todo 鎵嬪姩鐧诲綍杩樻槸鑷姩鐧诲綍
     }
 
+    public static NovaAPIUtil getInstanceUtil() {
+        if (instanceUtil == null) {
+            synchronized (NovaAPIUtil.class) {
+                if (instanceUtil == null) {
+                    instanceUtil = new NovaAPIUtil();
+                }
+            }
+        }
+        return instanceUtil;
+    }
 
     /**
      * 鐧诲綍
      */
     public StatusVO login(String sn) {
 
-        ViplexCore instance = (ViplexCore) Native.loadLibrary(filePathConfig.getStringPath(), ViplexCore.class);
-        String rootDir = System.getProperty("user.dir") + "/temp";
-        String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}";
-        instance.nvSetDevLang("Java");
-        System.out.println("nvInit(sdk 鍒濆鍖�):");
-        System.out.println(instance.nvInit(rootDir, companyInfo));
-        ViplexCore.CallBack callBack = new ViplexCore.CallBack() {
+        StatusVO searchVO = new StatusVO();
+        System.out.println("ViplexCore Demo nvSearchTerminalAsync(鎼滅储) begin... ");
+
+        CountDownLatch countDownLatch1 = new CountDownLatch(1);
+        instance.nvSearchTerminalAsync(new ViplexCore.CallBack() {
 
             @Override
             public void dataCallBack(int code, String data) {
-                // TODO Auto-generated method stub
-                g_code = code;
-                String strCode = "\nViplexCore Demo code:" + code;
-                String strData = "\nViplexCore Demo data:" + data;
-                System.out.println(strCode);
-                System.out.println(strData);
-                g_bAPIReturn = true;
+                searchVO.setStatusCode(code);
+                searchVO.setStatusData(data);
+                loginInfo = data;
+                System.out.println("\nViplexCore 鎼滅储 code:" + code);
+                System.out.println("\nViplexCore 鎼滅储 data:" + data);
+                countDownLatch1.countDown();
             }
-
-        };
-
-
-        System.out.println("ViplexCore Demo nvSearchTerminalAsync(鎼滅储) begin... ");
-        StatusVO statusVO = new StatusVO();
-        instance.nvSearchTerminalAsync(callBack);
-//        countDownLatchUtil.push();
-//        instance.nvSearchTerminalAsync(new ViplexCore.CallBack() {
-//
-//            @Override
-//            public void dataCallBack(int code, String data) {
-//                // TODO Auto-generated method stub
-//                g_code = code;
-//                statusVO.setStatusCode(code);
-//                statusVO.setStatusData(data);
-//                System.out.println("\nViplexCore Demo code:" + code);
-//                System.out.println("\nViplexCore Demo data:" + data);
-//                g_bAPIReturn = true;
-//            }
-//
-//        });
-
-
-
+        });
         try {
-            Thread.sleep(3000);
+            countDownLatch1.await();
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
-        g_bAPIReturn = false;
 
+        if (loginSn.get(sn) != null && loginSn.get(sn)) {
+            return new StatusVO(0);
+        }
+        if (!loginInfo.contains(String.format("\"sn\":\"%s\",", sn))) {
+            //鏈悳绱㈠埌灞忓箷  鐧诲綍涓嶆垚鍔�
+            return new StatusVO(10086);
+        }
+
+        StatusVO statusVO = new StatusVO();
 
         System.out.println("ViplexCore Demo nvLoginAsync(鐧诲綍) begin... ");
-        String loginParam = String.format("{\"sn\":\"" + sn + "\",\"ip\":\"\",\"username\":\"admin\",\"rememberPwd\":0,\"password\":\"1234567890\",\"loginType\":0}"
-                , g_sn);
+        String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":0,\"password\":\"123456\",\"loginType\":0}", sn);
+
+        CountDownLatch countDownLatch2 = new CountDownLatch(1);
         instance.nvLoginAsync(loginParam, new ViplexCore.CallBack() {
 
             @Override
             public void dataCallBack(int code, String data) {
-                // TODO Auto-generated method stub
-                g_code = code;
                 statusVO.setStatusCode(code);
                 statusVO.setStatusData(data);
                 System.out.println("\nViplexCore Demo code:" + code);
                 System.out.println("\nViplexCore Demo data:" + data);
-                g_bAPIReturn = true;
+                countDownLatch2.countDown();
             }
 
         });
         try {
-            waitAPIReturn();
+            countDownLatch2.await();
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
-        if (g_code != 0) {
-            System.out.println("ViplexCore Demo nvLoginAsync(鐧诲綍) 澶辫触锛�");
-            System.out.println("閿欒鐮�:" + g_code);
-            return statusVO;
+        if (statusVO.getStatusCode() != 0) {
+            System.out.println("ViplexCore " + sn + " nvLoginAsync(鐧诲綍) 澶辫触锛�");
+            System.out.println("閿欒鐮�:" + statusVO.getStatusCode());
+        } else {
+            //鐧婚檰鎴愬姛涔嬪悗瀛樺叆map淇濆瓨鐧诲綍淇℃伅
+            loginSn.put(sn, true);
         }
-        //鐧婚檰鎴愬姛涔嬪悗瀛樺叆map淇濆瓨鐧诲綍淇℃伅
-        loginInfo.put(sn, instance);
         return statusVO;
     }
 
     /**
      * 鍒涘缓鑺傜洰
      */
-    public int createPro(String sn) throws InterruptedException {
-        ViplexCore instance = (ViplexCore) loginInfo.get(sn);
-
+    public StatusVO createPro(ProWHVO proWHVO) throws InterruptedException {
+        String createProgram = JSON.toJSONString(proWHVO);
         System.out.println("ViplexCore Demo nvCreateProgramAsync(鍒涘缓鑺傜洰) begin... ");
-//        instance.nvCreateProgramAsync(createProgram, callBack);
-        waitAPIReturn();
+        StatusVO statusVO = new StatusVO();
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        try {
+            instance.nvCreateProgramAsync(createProgram, new ViplexCore.CallBack() {
 
-        return 1;
+                @Override
+                public void dataCallBack(int code, String data) {
+                    statusVO.setStatusCode(code);
+                    statusVO.setStatusData(data);
+                    System.out.println("\nViplexCore 鍒涘缓鑺傜洰 code:" + code);
+                    System.out.println("\nViplexCore 鍒涘缓鑺傜洰 data:" + data);
+                    if (code == 0) {
+                        JSONObject result = JSON.parseObject(data);
+                        //鍒涘缓鑺傜洰鎴愬姛 璁剧疆鐘舵�佷俊鎭负鑺傜洰id
+                        statusVO.setStatusData(String.valueOf(result.getJSONObject("onSuccess").getIntValue("programID")));
+                    }
+                    countDownLatch.countDown();
+                }
+
+            });
+            countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+        } catch (Exception e) {
+        }
+        return statusVO;
     }
 
+    /**
+     * 缂栬緫鑺傜洰
+     *
+     * @param pid
+     * @param pageInfo
+     * @return
+     */
+
+    public StatusVO editProgram(int pid, Map pageInfo) {
+        ProgramInfoVO programInfoVO = new ProgramInfoVO();
+        programInfoVO.setProgramID(pid);
+        programInfoVO.setPageInfo(pageInfo);
+        System.out.println("ViplexCore Demo nvSetPageProgramAsync(缂栬緫鑺傜洰) begin... ");
+        StatusVO statusVO = new StatusVO();
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        instance.nvSetPageProgramAsync(JSON.toJSONString(programInfoVO), new ViplexCore.CallBack() {
+            @Override
+            public void dataCallBack(int code, String data) {
+                statusVO.setStatusCode(code);
+                statusVO.setStatusData(data);
+                System.out.println("\nViplexCore 缂栬緫鑺傜洰 code:" + code);
+                System.out.println("\nViplexCore 缂栬緫鑺傜洰 data:" + data);
+                countDownLatch.countDown();
+            }
+
+        });
+        try {
+            countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        return statusVO;
+    }
+
+
+    /**
+     * 鐢熸垚鑺傜洰
+     *
+     * @param pid
+     * @return
+     */
+    public StatusVO genrateProgram(int pid) {
+        ProGenrateVO proGenrateVO = new ProGenrateVO();
+        proGenrateVO.setProgramID(pid);
+        proGenrateVO.setOutPutPath(filePathConfig.getOutPutPath());
+        System.out.println("ViplexCore Demo nvMakeProgramAsync(鐢熸垚鑺傜洰) begin... ");
+        StatusVO statusVO = new StatusVO();
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        instance.nvMakeProgramAsync(JSON.toJSONString(proGenrateVO), new ViplexCore.CallBack() {
+            @Override
+            public void dataCallBack(int code, String data) {
+                statusVO.setStatusCode(code);
+                statusVO.setStatusData(data);
+                System.out.println("\nViplexCore 鐢熸垚鑺傜洰 code:" + code);
+                System.out.println("\nViplexCore 鐢熸垚鑺傜洰 data:" + data);
+                countDownLatch.countDown();
+            }
+
+        });
+        try {
+            countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        return statusVO;
+    }
+
+
+    /**
+     * 鍙戝竷鑺傜洰
+     *
+     * @param
+     * @return
+     */
+    public List<TrasfromStatusVO> trasfromProgram(ProgramPrarm pageInfo) {
+
+        TransfromProgramVO transfromProgramVO = new TransfromProgramVO();
+        transfromProgramVO.setProgramName("鑺傜洰01");
+        //璁剧疆鑺傜洰鍐呭
+        TransfromProgramVO.SendProgramFilePathsDTO sendProgramFilePaths = new TransfromProgramVO.SendProgramFilePathsDTO();
+        //鑺傜洰
+        sendProgramFilePaths.setProgramPath(filePathConfig.getOutPutPath() + "/program" + pageInfo.getProgramID());
+        //鏂囦欢
+        Map<String, String> mediasPath = new HashMap();
+        mediasPath.put("C:/Users/Administrator/Desktop/novaWin/demo/java/test.png", "test.png");
+        sendProgramFilePaths.setMediasPath(mediasPath);
+
+        transfromProgramVO.setSendProgramFilePaths(sendProgramFilePaths);
+        //鑺傜洰鏍囪瘑
+        transfromProgramVO.setDeviceIdentifier(SecurityUtils.getUserId().toString());
+        transfromProgramVO.setInsertPlay(pageInfo.getInsertPlay());
+        transfromProgramVO.setStartPlayAfterTransferred(pageInfo.getStartPlayAfterTransferred());
+
+        List<TrasfromStatusVO> svoList = new ArrayList<>();
+        System.out.println("ViplexCore Demo nvStartTransferProgramAsync(鍙戦�佽妭鐩�) begin... ");
+//        System.out.println(trasfromProgram);
+//        instance.nvStartTransferProgramAsync(trasfromProgram, callBack);
+//        String trasfromProgram = String.format(
+//                "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program13\",\"mediasPath\": {\"C:/Users/Administrator/Desktop/novaWin/demo/java/test.png\": \"test.png\"}},\"programName\": \"jiemu1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
+//                g_sn,
+//                rootDir);
+        pageInfo.getSnList().forEach(sn -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if (transfromProgramVO == null) {
+                        return;
+                    }
+                    transfromProgramVO.setSn(sn);
+                    System.out.println(transfromProgramVO);
+
+                    //鎺ㄩ�佺粨鏋�
+                    TrasfromStatusVO trasfromStatusVO = new TrasfromStatusVO();
+                    trasfromStatusVO.setSn(sn);
+                    instance.nvStartTransferProgramAsync(JSON.toJSONString(transfromProgramVO), new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            trasfromStatusVO.setStatusCode(code);
+                            trasfromStatusVO.setStatusData(data);
+                            System.out.println("\nViplexCore 鍙戦�佽妭鐩� code:" + code);
+                            System.out.println("\nViplexCore 鍙戦�佽妭鐩� data:" + data);
+                            //鑺傜洰鍙戝竷鎴愬姛
+                            if (trasfromStatusVO.getStatusCode() == 0) {
+                                countDownLatch.countDown();
+                                svoList.add(trasfromStatusVO);
+                            } else if (trasfromStatusVO.getStatusCode() != 65362) {
+                                //涓婁紶澶辫触
+                                System.out.println("涓婁紶澶辫触");
+                                svoList.add(trasfromStatusVO);
+                                countDownLatch.countDown();
+                            }
+                        }
+                    });
+
+                }
+            }).start();
+
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+
+        return svoList;
+    }
+
+    /**
+     * 鏌ヨ鍦ㄧ嚎鐘舵��
+     *
+     * @return
+     */
+    public List<NewNovaLed> getOnlineStatus(List<NewNovaLed> newNovaListBos) {
+        //璁剧疆寮�鍏冲睆鐘舵��
+        newNovaListBos.forEach(led -> {
+            //鑾峰彇淇℃伅涔嬪墠鍏堢櫥褰�
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    StatusVO login = login(led.getSn());
+                    if (login.getStatusCode() == 0) {
+                        //鐧婚檰鎴愬姛 璁剧疆涓哄湪绾�
+                        led.setIsOnline(1);
+                        led.setOnlineSign(1);
+                    } else {
+                        led.setIsOnline(0);
+                    }
+                    countDownLatch.countDown();
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return newNovaListBos;
+    }
+
+
+    /**
+     * 鏌ヨ灞忓箷鍩烘湰淇℃伅
+     */
+
+    public NewNovaLed getInfo(NewNovaLed led) {
+        System.out.println("ViplexCore Demo nvGetProductInfoAsync(鑾峰彇灞忓箷淇℃伅) begin... ");
+        StatusVO login = login(led.getSn());
+
+        StatusVO result = new StatusVO();
+        if (login.getStatusCode() == 0) {
+
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    TrasfromStatusVO trasfromStatusVO = new TrasfromStatusVO();
+                    trasfromStatusVO.setSn(led.getSn());
+                    instance.nvGetProductInfoAsync("{\n" +
+                            "  \"sn\":\"" + led.getSn() + "\"\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+                            result.setStatusCode(code);
+                            result.setStatusData(data);
+                            System.out.println("\nViplexCore 鑾峰彇灞忓箷淇℃伅 code:" + code);
+                            System.out.println("\nViplexCore 鑾峰彇灞忓箷淇℃伅 data:" + data);
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MICROSECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        } else {
+            throw new BusinessException("璁惧鐧诲綍澶辫触,缁忔鏌ヨ澶囨槸鍚﹁繛鎺�");
+        }
+        NewNovaInfoBo newNovaInfoBo = JSON.parseObject(result.getStatusData(), NewNovaInfoBo.class);
+        led.setInfo(newNovaInfoBo);
+        System.out.println(JSON.toJSONString(led.getInfo()) + "--------");
+        return led;
+    }
+
+
+    /**
+     * 鑾峰彇寮�鍏冲睆鐘舵��
+     */
+    public List<NewNovaLed> getScreenPowerState(List<NewNovaLed> newNovaLsit) {
+
+        System.out.println("ViplexCore Demo nvGetScreenPowerStateAsync(鑾峰彇灞忓箷寮�鍏�) begin... ");
+
+        newNovaLsit.forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvGetScreenPowerStateAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\"\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 鑾峰彇灞忓箷寮�鍏� code:" + code);
+                            System.out.println("\nViplexCore 鑾峰彇灞忓箷寮�鍏� data:" + data);
+                            if (code == 0 && data.contains("OPEN")) {
+                                newNova.setScreenPower(1);
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return newNovaLsit;
+    }
+
+    /**
+     * 鑾峰彇闊抽噺
+     */
+    public List<NewNovaLed> getVolumeState(List<NewNovaLed> newNovaLsit) {
+
+        System.out.println("ViplexCore Demo nvGetVolumeAsync(鑾峰彇闊抽噺) begin... ");
+
+        newNovaLsit.forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvGetVolumeAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\"\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 鑾峰彇闊抽噺 code:" + code);
+                            System.out.println("\nViplexCore 鑾峰彇闊抽噺 data:" + data);
+                            if (code == 0) {
+                                newNova.setVolume((BigDecimal) JSON.parseObject(data, Map.class).get("ratio"));
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return newNovaLsit;
+    }
+
+
+    /**
+     * 璁剧疆闊抽噺
+     */
+    public boolean setVolume(NewNovaStatusParam param) {
+
+        System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(Volume) begin... ");
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        StatusVO login = login(param.getSn());
+        if (login.getStatusCode() == 0) {
+            String jsonStr = "{\n" +
+                    "  \"sn\":\"" + param.getSn() + "\",\n" +
+                    "  \"screenBrightnessInfo\":{\n" +
+                    "    \"ratio\":" + param.getVolume() + "\n" +
+                    "  }\n" +
+                    "}";
+            instance.nvSetVolumeAsync(jsonStr, new ViplexCore.CallBack() {
+                @Override
+                public void dataCallBack(int code, String data) {
+
+                    System.out.println("\nViplexCore Volume code:" + code);
+                    System.out.println("\nViplexCore Volume data:" + data);
+                    countDownLatch.countDown();
+                    if (code == 0) {
+                        login.setStatusCode(10086);
+                    }
+                }
+            });
+            try {
+                countDownLatch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        if (login.getStatusCode() == 10086) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇浜害
+     */
+    public List<NewNovaLed> getScreenBrightness(List<NewNovaLed> newNovaLsit) {
+
+        System.out.println("ViplexCore Demo nvGetScreenBrightnessAsync(鑾峰彇浜害) begin... ");
+
+
+        newNovaLsit.forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvGetScreenBrightnessAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\"\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 鑾峰彇浜害 code:" + code);
+                            System.out.println("\nViplexCore 鑾峰彇浜害 data:" + data);
+                            if (code == 0) {
+                                newNova.setBrightness((BigDecimal) JSON.parseObject(data, Map.class).get("ratio"));
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return newNovaLsit;
+    }
+
+    /**
+     * 璁剧疆浜害
+     */
+    public boolean setScreenBrightness(NewNovaStatusParam param) {
+
+        System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(璁剧疆浜害) begin... ");
+        CountDownLatch countDownLatch = new CountDownLatch(1);
+        StatusVO login = login(param.getSn());
+        if (login.getStatusCode() == 0) {
+            String jsonStr = "{\n" +
+                    "  \"sn\":\"" + param.getSn() + "\",\n" +
+                    "  \"screenBrightnessInfo\":{\n" +
+                    "    \"ratio\":" + param.getBrightness() + "\n" +
+                    "  }\n" +
+                    "}";
+            instance.nvSetScreenBrightnessAsync(jsonStr, new ViplexCore.CallBack() {
+                @Override
+                public void dataCallBack(int code, String data) {
+
+                    System.out.println("\nViplexCore 璁剧疆浜害 code:" + code);
+                    System.out.println("\nViplexCore 璁剧疆浜害 data:" + data);
+                    countDownLatch.countDown();
+                    if (code == 0) {
+                        login.setStatusCode(10086);
+                    }
+                }
+            });
+            try {
+                countDownLatch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        if (login.getStatusCode() == 10086) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 鑾峰彇鍚屾
+     */
+    public List<NewNovaLed> getSync(List<NewNovaLed> newNovaLsit) {
+
+        System.out.println("ViplexCore Demo nvGetSyncPlayAsync(鑾峰彇鍚屾) begin... ");
+
+        newNovaLsit.forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvGetSyncPlayAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\"\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 鑾峰彇浜害 code:" + code);
+                            System.out.println("\nViplexCore 鑾峰彇浜害 data:" + data);
+                            if (code == 0) {
+                                newNova.setSync(1);
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return newNovaLsit;
+    }
+
+    /**
+     * 璁剧疆鍚屾
+     */
+    public List<NewNovaStatusParam.NovaDTO> setSync(NewNovaStatusParam param) {
+
+        System.out.println("ViplexCore Demo nvSetSyncPlayAsync(璁剧疆鍚屾) begin... ");
+
+        if (param.getNovaList() == null || param.getNovaList().size() == 0) {
+            throw new BusinessException("鍚屾璁惧涓嶈兘涓虹┖ !");
+        }
+        param.getNovaList().forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvSetSyncPlayAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
+                            "  \"enable\":" + param.isSync() + "\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 璁剧疆鍚屾 code:" + code);
+                            System.out.println("\nViplexCore 璁剧疆鍚屾 data:" + data);
+                            if (code == 0) {
+                                newNova.setStatus(true);
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return param.getNovaList();
+    }
+
+    /**
+     * 閲嶅惎
+     */
+    public List<NewNovaStatusParam.NovaDTO> reboot(NewNovaStatusParam param) {
+
+        System.out.println("ViplexCore Demo nvSetReBootTaskAsync(閲嶅惎) begin... ");
+        if (param.getNovaList() == null || param.getNovaList().size() == 0) {
+            throw new BusinessException("閲嶅惎璁惧涓嶈兘涓虹┖ !");
+        }
+        param.getNovaList().forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvSetReBootTaskAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
+                            "  \"taskInfo\":{\n" +
+                            "    \"type\":\"REBOOT\",\n" +
+                            "    \"source\":{\n" +
+                            "      \"type\":0,\n" +
+                            "      \"platform\":4\n" +
+                            "    },\n" +
+                            "    \"executionType\":\"IMMEDIATELY\",\n" +
+                            "    \"reason\":\"Just to reboot\",\n" +
+                            "    \"conditions\":[\n" +
+                            "      {\n" +
+                            "        \"cron\":[\n" +
+                            "          \"0 15 10 ? * *\",\n" +
+                            "          \"0 0 12 * * ?\"\n" +
+                            "        ],\n" +
+                            "        \"enable\":false\n" +
+                            "      }\n" +
+                            "    ]\n" +
+                            "  }\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 閲嶅惎 code:" + code);
+                            System.out.println("\nViplexCore 閲嶅惎 data:" + data);
+                            if (code == 0) {
+                                newNova.setStatus(true);
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return param.getNovaList();
+    }
+
+    /**
+     * ntp瀵规椂
+     */
+    public List<NewNovaStatusParam.NovaDTO> ntp(NewNovaStatusParam param) {
+
+        System.out.println("ViplexCore Demo nvSetNetTimingInfoAsync(ntp) begin... ");
+
+        if (param.getNovaList() == null || param.getNovaList().size() == 0) {
+            throw new BusinessException("瀵规椂璁惧涓嶈兘涓虹┖ !");
+        }
+
+        param.getNovaList().forEach(newNova -> {
+            CountDownLatch countDownLatch = new CountDownLatch(1);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    //鎺ㄩ�佺粨鏋�
+                    instance.nvSetNetTimingInfoAsync("{\n" +
+                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
+                            "  \"TimingInfo\":{\n" +
+                            "    \"source\":{\n" +
+                            "      \"type\":1,\n" +
+                            "      \"platform\":1\n" +
+                            "    },\n" +
+                            "    \"taskArray\":[\n" +
+                            "      {\n" +
+                            "        \"type\":\"NTP_CONFIG\",\n" +
+                            "        \"action\":4,\n" +
+                            "        \"data\":{\n" +
+                            "          \"enable\":" + param.isNtp() + ",\n" +
+                            "          \"server\":\"http://ntpsss.net\"\n" +
+                            "        }\n" +
+                            "      }\n" +
+                            "    ]\n" +
+                            "  }\n" +
+                            "}", new ViplexCore.CallBack() {
+                        @Override
+                        public void dataCallBack(int code, String data) {
+
+                            System.out.println("\nViplexCore 閲嶅惎 code:" + code);
+                            System.out.println("\nViplexCore 閲嶅惎 data:" + data);
+                            if (code == 0) {
+                                newNova.setStatus(true);
+                            }
+                            countDownLatch.countDown();
+                        }
+                    });
+
+                }
+            }).start();
+            try {
+                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return param.getNovaList();
+    }
 
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProGenrateVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProGenrateVO.java
new file mode 100644
index 0000000..44ce0eb
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProGenrateVO.java
@@ -0,0 +1,68 @@
+package com.sandu.ximon.admin.newnova.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@NoArgsConstructor
+@Data
+@AllArgsConstructor
+public class ProGenrateVO {
+
+
+
+    private Integer programID;
+
+    private String outPutPath;
+
+//    private List<MediasPathDTO> mediasPath;
+//
+//    private ComplexProgramDTO complexProgram;
+//
+//    @NoArgsConstructor
+//    @Data
+//    public static class ComplexProgramDTO {
+//
+//        private String name;
+//
+//        private List<ProgramRegularDTO> programRegular;
+//
+//        @NoArgsConstructor
+//        @Data
+//        public static class ProgramRegularDTO {
+//
+//            private Integer priority;
+//
+//            private Integer programID;
+//
+//            private List<ConstraintsDTO> constraints;
+//
+//            @NoArgsConstructor
+//            @Data
+//            public static class ConstraintsDTO {
+//
+//                private String startTime;
+//
+//                private String endTime;
+//
+//                private List<String> cron;
+//            }
+//        }
+//    }
+//
+//    @NoArgsConstructor
+//    @Data
+//    public static class MediasPathDTO {
+//
+//        private String oldPath;
+//
+//        private String newPath;
+//    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProWHVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProWHVO.java
new file mode 100644
index 0000000..63597ac
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProWHVO.java
@@ -0,0 +1,31 @@
+package com.sandu.ximon.admin.newnova.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ * 鑺傜洰鍒嗚鲸鐜囧弬鏁�
+ */
+@Data
+@AllArgsConstructor
+public class ProWHVO {
+
+
+    /**
+     * 鑺傜洰鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鑺傜洰瀹�
+     */
+    private Integer width;
+
+    /**
+     * 鑺傜洰楂�
+     */
+    private Integer height;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramInfoVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramInfoVO.java
new file mode 100644
index 0000000..b9ffe1d
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramInfoVO.java
@@ -0,0 +1,29 @@
+package com.sandu.ximon.admin.newnova.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@Data
+public class ProgramInfoVO {
+
+    /**
+     * 鑺傜洰id(鍒涘缓鑺傜洰杩斿洖鐨刬d)
+     */
+    private int programID;
+
+    /**
+     * pageId(褰撳墠鐗堟湰pageId涓�1)
+     */
+    private int pageID = 1;
+
+    /**
+     * page鐨勮缁嗕俊鎭�
+     */
+    private Map pageInfo;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/StatusVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/StatusVO.java
index be27490..a7581a5 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/StatusVO.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/StatusVO.java
@@ -9,6 +9,12 @@
 @Data
 public class StatusVO {
 
+    public StatusVO(int statusCode) {
+        this.statusCode = statusCode;
+    }
+    public StatusVO() {
+    }
+
     private int statusCode;
 
     private String statusData;
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java
new file mode 100644
index 0000000..6b70c16
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java
@@ -0,0 +1,73 @@
+package com.sandu.ximon.admin.newnova.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@NoArgsConstructor
+@Data
+public class TransfromProgramVO {
+
+
+    /**
+     * 鍞竴鏍囪瘑绗�
+     */
+    private String sn;
+
+
+    /**
+     * 缂╃暐鍥捐矾寰勶紙鏈湴鍦板潃锛�
+     */
+    private String iconPath;
+
+    /**
+     * 缂╃暐鍥惧悕绉�
+     */
+    private String iconName;
+
+    /**
+     * 鑺傜洰鐩稿叧鏂囦欢璺緞
+     */
+    private SendProgramFilePathsDTO sendProgramFilePaths;
+
+    /**
+     * 鑺傜洰鍚嶇О锛屼笌鍒涘缓鑺傜洰涓殑name淇濇寔涓�鑷�
+     */
+    private String programName;
+
+    /**
+     * 鑺傜洰鐨勫敮涓�璇嗗埆鍙凤紝鍚屼竴PC鏈�濂戒繚鎸佷笉鍙橈紝濡�:鍙栬绠楁満鍚嶇О
+     */
+    private String deviceIdentifier;
+
+    /**
+     * 鏄惁绔嬪嵆鎾斁鑺傜洰
+     */
+    private Boolean startPlayAfterTransferred;
+
+    /**
+     * 鏄惁鎻掓挱
+     */
+    private Boolean insertPlay;
+
+    @NoArgsConstructor
+    @Data
+    public static class SendProgramFilePathsDTO {
+
+        /**
+         * 鑺傜洰鏂囦欢璺緞锛堢敓鎴愯妭鐩槸outputpath鍊�+program锛孖D鏄灏戯紝灏辨槸澶氬皯锛�
+         */
+        private String programPath;
+
+        /**
+         * {濯掍綋璺緞 : 濯掍綋鍚嶇О}(浠呮湰鍦板浘鐗囷紝瑙嗛锛孏IF鏂囦欢闇�瑕佹璺緞)
+         */
+        private Map<String, String> mediasPath;
+
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TrasfromStatusVO.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TrasfromStatusVO.java
new file mode 100644
index 0000000..3ca3a14
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TrasfromStatusVO.java
@@ -0,0 +1,13 @@
+package com.sandu.ximon.admin.newnova.vo;
+
+import lombok.Data;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@Data
+public class TrasfromStatusVO extends StatusVO {
+
+    private String sn;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
index 7d542dc..6d90489 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -1338,7 +1338,7 @@
         //璁剧疆瑙﹀彂鏉′欢    瀛樺叆Redis  15鍒嗛挓瓒呮椂   15鍒嗛挓鍐呭啀娆¤皟鐢ㄧ洿鎺ヨ繑鍥�
         redisUtils.set("redisStatusKeyTimeout", System.currentTimeMillis(), 60 * 15);
 
-        CountDownLatch countDownLatch = new CountDownLatch(7);//todo
+        CountDownLatch countDownLatch = new CountDownLatch(7);//todo 鍑犱釜璁惧璁剧疆涓哄嚑
         //鑾峰彇涓�涓�7浣嶉殢鏈烘暟
         String str = RandomStringUtils.randomAlphanumeric(7);
         countDownLatchUtil.push(str, countDownLatch);
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownLatchUtil.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownLatchUtil.java
index 228133e..c2d0425 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownLatchUtil.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownLatchUtil.java
@@ -1,7 +1,9 @@
 package com.sandu.ximon.admin.utils;
 
-import lombok.Data;
+import org.apache.commons.lang.RandomStringUtils;
 import org.springframework.context.annotation.Configuration;
+
+import java.util.concurrent.TimeUnit;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -27,9 +29,42 @@
         }
     }
 
+    /**
+     * 鍒犻櫎CountDown
+     * @param id
+     * @param countDownLatch  瀵硅薄
+     * @param timeout  绛夊緟鏃堕棿
+     */
+    public void remove(String id, CountDownLatch countDownLatch, int timeout) {
+        if (countDownLatch == null) {
+            return;
+        }
+        try {
+            countDownLatch.await(timeout, TimeUnit.MILLISECONDS);
+            if (data != null) {
+                data.remove(id);
+            }
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 娌℃湁绛夊緟鏃堕棿鐨勫垹闄�
+     * @param id
+     */
     public void remove(String id) {
         if (data != null) {
             data.remove(id);
         }
     }
+
+    public CountDownResultUtil createCoutDown(int times) {
+        CountDownLatchUtil countDownLatchUtil = new CountDownLatchUtil();
+        CountDownLatch countDownLatch = new CountDownLatch(times);
+        //鑾峰彇涓�涓�7浣嶉殢鏈烘暟
+        String str = RandomStringUtils.randomAlphanumeric(7);
+        countDownLatchUtil.push(str, countDownLatch);
+        return new CountDownResultUtil(str, countDownLatch);
+    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownResultUtil.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownResultUtil.java
new file mode 100644
index 0000000..cbd5007
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/utils/CountDownResultUtil.java
@@ -0,0 +1,19 @@
+package com.sandu.ximon.admin.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * @author LiuHaoNan
+ * @date 2022/11/10
+ */
+@Data
+@AllArgsConstructor
+public class CountDownResultUtil {
+
+    private String key;
+
+    private CountDownLatch countDownLatch;
+}
diff --git a/ximon-admin/src/main/resources/application-local.yml b/ximon-admin/src/main/resources/application-local.yml
index a56408a..2172b75 100644
--- a/ximon-admin/src/main/resources/application-local.yml
+++ b/ximon-admin/src/main/resources/application-local.yml
@@ -32,7 +32,7 @@
     #************************鏈湴涓婁紶鏂囦欢閰嶇疆************************
   upload:
     #鏂囦欢鏈嶅姟鍣ㄨ矾寰�
-    upload-root-path: E:\file\novafile
+    upload-root-path: E:\file\
     storage: local
     #鏈嶅姟鍣ㄦ枃浠跺墠缂�
     real-url: http://localhost/
@@ -86,11 +86,12 @@
 new-nova:
   #渚濊禆鍦板潃
   string-path: C:\Users\Administrator\Desktop\novaWin\bin\viplexcore.dll
+  out-put-path: E:\IdeaProjects\XMPoleManager/temp
 
 new-nova-file:
   upload:
     #鏂囦欢鏈嶅姟鍣ㄨ矾寰�
-    upload-root-path: E:\file\novafile
+    upload-root-path: E:\file\
     storage: local
     #鏈嶅姟鍣ㄦ枃浠跺墠缂�
-    real-url: http://localhost/
\ No newline at end of file
+    real-url: http://183.45.76.239:8089/file/
\ No newline at end of file

--
Gitblit v1.9.3