2021与蓝度共同重构项目,服务端
liuhaonan
2022-11-18 385b687cc1a0a8f6de2320af6b6e0d654cd658ed
changes
已添加22个文件
已修改22个文件
已重命名1个文件
2310 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaGroupListBo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaProgramBo.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaFile.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaGroup.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaGroupRelation.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaProFileRelation.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaProgram.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/PoleBindingEnums.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaGroupMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaGroupRelationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaProFileRelationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaProgramMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LedPlayerEntityMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaFileMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaGroupMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaGroupRelationMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaLedMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaProFileRelationMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaProgramMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/config/NovaFileConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/VnnoxController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/ProgramPathConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupController.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupRelationService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupService.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaFileParam.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProFileRelationService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProgramController.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProgramService.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java 348 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/AirDataVO.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramsInfoVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/resources/application-local.yml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaGroupListBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.sandu.ximon.dao.bo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
/**
 * @author LiuHaoNan
 * @date 2022/11/15
 */
@Data
public class NewNovaGroupListBo {
    private Long id;
    /**
     * æ’­æ”¾å™¨åç§°(database)
     */
    private String name;
    /**
     * æ’­æ”¾å™¨ID(Vnnox)
     */
    private String sn;
}
dao/src/main/java/com/sandu/ximon/dao/bo/NewNovaProgramBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.sandu.ximon.dao.bo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;
/**
 * @author LiuHaoNan
 * @date 2022/11/17
 */
@Data
public class NewNovaProgramBo {
    private Long id;
    /**
     * èŠ‚ç›®åç§°
     */
    private String name;
    /**
     * èŠ‚ç›®ç¼©ç•¥å›¾
     */
    private String screenShot;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    private Date updateTime;
}
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaFile.java
@@ -38,6 +38,11 @@
    private String name;
    /**
     * çœŸå®žåç§°
     */
    private String realName;
    /**
     * å¤§å°
     */
    private String size;
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaGroup.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
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 lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * æ–°è¯ºç“¦åˆ†ç»„
 *
 * @TableName new_nova_group
 */
@TableName(value = "new_nova_group")
@Data
public class NewNovaGroup implements Serializable {
    /**
     * åˆ†ç»„id
     */
    @TableId(type = IdType.AUTO)
    private Long groupId;
    /**
     * åˆ†ç»„名称
     */
    private String groupName;
    /**
     * ä¸Šçº§å®¢æˆ·id
     */
    @JsonIgnore
    private Long clientId;
    /**
     * ç”¨æˆ·id
     */
    private Long userId;
    /**
     * ç”¨æˆ·å
     */
    @TableField(exist = false)
    private String userName;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    private Date updateTime;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaGroupRelation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
 * æ–°è¯ºç“¦åˆ†ç»„关系
 * @TableName new_nova_group_relation
 */
@TableName(value ="new_nova_group_relation")
@Data
public class NewNovaGroupRelation implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * è¯ºç“¦id
     */
    private Long novaId;
    /**
     * åˆ†ç»„id
     */
    private Long novaGroupId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     *
     */
    private Date updateTime;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaLed.java
@@ -99,7 +99,7 @@
    private BigDecimal brightness = BigDecimal.ZERO;
    /**
     * åŒæ­¥çŠ¶æ€
     * åŒæ­¥çŠ¶æ€ 0未同步  1已同步  -1 åŒæ­¥å¤±è´¥
     */
    @TableField(exist = false)
    private Integer sync = 0;
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaProFileRelation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 * æ–°è¯ºç“¦èŠ‚ç›®æ–‡ä»¶å…³è”è¡¨
 * @TableName new_nova_pro_file_relation
 */
@TableName(value ="new_nova_pro_file_relation")
@Data
public class NewNovaProFileRelation implements Serializable {
    /**
     *
     */
    @TableId
    private Long id;
    /**
     * è¯ºç“¦èŠ‚ç›®è¡¨id
     */
    private Long newNovaProgramId;
    /**
     * è¯ºç“¦æ–‡ä»¶è¡¨id
     */
    private Long newNovaFileId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaProgram.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
/**
 * æ–°è¯ºç“¦èŠ‚ç›®è¡¨
 * @TableName new_nova_program
 */
@TableName(value ="new_nova_program")
@Data
public class NewNovaProgram implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * èŠ‚ç›®id
     */
    private Integer pid;
    /**
     * èŠ‚ç›®åç§°
     */
    private String name;
    /**
     * æ˜¯å¦æ’æ’­ 0否 1是
     */
    private Integer insertPlay;
    /**
     * æ˜¯å¦ç«‹å³æ’­æ”¾ 0否  1是
     */
    private Integer startPlayAfterTransferred;
    /**
     * èŠ‚ç›®å†…å®¹
     */
    @TableField(exist = false)
    private List<Map> pageInfo;
    /**
     * èŠ‚ç›®å†…å®¹
     */
    @JsonIgnore
    private String pageInfoJsonStr;
    /**
     * èŠ‚ç›®æ–‡ä»¶
     */
    @TableField(exist = false)
    private List<String> files;
    /**
     * èŠ‚ç›®å®½
     */
    private Integer width;
    /**
     * èŠ‚ç›®é«˜
     */
    private Integer height;
    /**
     * èŠ‚ç›®ç¼©ç•¥å›¾
     */
    private String screenShot;
    /**
     * ç”¨æˆ·id
     */
    private Long userId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    private Date updateTime;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
@@ -247,6 +247,22 @@
    LED_NEW_VOL("新诺瓦音量调节"),
    LED_NEW_BRIGHTNESS("新诺瓦亮度调节"),
    LED_NEW_POWER("新诺瓦开关调节"),
    LED_NEW_SYNC("新诺瓦同步"),
    LED_NEW_REBOOT("新诺瓦重启"),
    LED_NEW_SCREENSHOT("新诺瓦截屏"),
    LED_NEW_NTP("新诺瓦ntp"),
    LED_NEW_GROUB_ADD("新诺瓦分组新增"),
    LED_NEW_GROUB_UPDATE("新诺瓦分组编辑"),
    LED_NEW_GROUB_DEL("新诺瓦分组删除"),
    LED_NEW_GROUB_LIST("新诺瓦分组列表"),
    LED_NEW_GROUB_BIND("绑定新诺瓦分组"),
    LED_NEW_GROUB_INFO("绑新诺瓦分组详情"),
    LED_NEW_PROGRAM_ADD("诺瓦节目制作并发送"),
    LED_NEW_PROGRAM_UPDATE("诺瓦节目编辑"),
    LED_NEW_PROGRAM_DEL("诺瓦节目删除"),
    LED_NEW_PROGRAM_LIST("诺瓦节目列表"),
    LED_NEW_PROGRAM_INFO("诺瓦节目详情"),
    LED_NEW_PUSH_AIR("诺瓦推送大气信息"),
    ;
dao/src/main/java/com/sandu/ximon/dao/enums/PoleBindingEnums.java
@@ -64,4 +64,9 @@
     * å†œè€•
     */
    public static final String ATMOSPHERIC_NONG_GENG = "11";
    /**
     * æ–°è¯ºç“¦
     */
    public static final String NEW_NOVA = "12";
}
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaGroupMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sandu.ximon.dao.domain.NewNovaGroup;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€new_nova_group(新诺瓦分组)】的数据库操作Mapper
 * @createDate 2022-11-15 09:48:48
 * @Entity com.sandu.ximon.dao.domain.NewNovaGroup
 */
@Mapper
public interface NewNovaGroupMapper extends BaseMapper<NewNovaGroup> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaGroupRelationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sandu.ximon.dao.domain.NewNovaGroupRelation;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€new_nova_group_relation(新诺瓦分组关系)】的数据库操作Mapper
 * @createDate 2022-11-15 09:49:00
 * @Entity com.sandu.ximon.dao.domain.NewNovaGroupRelation
 */
@Mapper
public interface NewNovaGroupRelationMapper extends BaseMapper<NewNovaGroupRelation> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaLedMapper.java
@@ -1,7 +1,7 @@
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.bo.NewNovaGroupListBo;
import com.sandu.ximon.dao.domain.NewNovaLed;
import org.apache.ibatis.annotations.Mapper;
@@ -16,7 +16,9 @@
@Mapper
public interface NewNovaLedMapper extends BaseMapper<NewNovaLed> {
    List<NewNovaLed> listLed(String keyword, Long userId);
    List<NewNovaLed> listLed(String keyword,Long groupId, Long userId);
    List<NewNovaGroupListBo> getListByGroupId(Long groupId, Long clientId);
}
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaProFileRelationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sandu.ximon.dao.domain.NewNovaProFileRelation;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€new_nova_pro_file_relation(新诺瓦节目文件关联表)】的数据库操作Mapper
 * @createDate 2022-11-16 14:15:31
 * @Entity com.sandu.ximon.dao.domain.NewNovaProFileRelation
 */
@Mapper
public interface NewNovaProFileRelationMapper extends BaseMapper<NewNovaProFileRelation> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaProgramMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.sandu.ximon.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sandu.ximon.dao.bo.NewNovaProgramBo;
import com.sandu.ximon.dao.domain.NewNovaProgram;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€new_nova_program(新诺瓦节目表)】的数据库操作Mapper
 * @createDate 2022-11-17 10:24:26
 * @Entity com.sandu.ximon.dao.domain.NewNovaProgram
 */
@Mapper
public interface NewNovaProgramMapper extends BaseMapper<NewNovaProgram> {
    List<NewNovaProgramBo> listProgram(String keyword, Long userId);
}
dao/src/main/resources/mapper/LedPlayerEntityMapper.xml
@@ -99,9 +99,9 @@
                AND t5.group_id=#{groupId}
            </if>
            <if test="keyword != null and keyword != ''">
                AND t1.name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                AND (t1.name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.sn LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.id LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.id LIKE CONCAT(CONCAT('%', #{keyword}), '%'))
            </if>
            <if test="userId != null">
                AND (t3.user_id = #{userId} OR t3.client_id = #{userId})
dao/src/main/resources/mapper/NewNovaFileMapper.xml
@@ -9,6 +9,7 @@
            <result property="userId" column="user_id" jdbcType="BIGINT"/>
            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="realName" column="real_name" jdbcType="VARCHAR"/>
            <result property="size" column="size" jdbcType="VARCHAR"/>
            <result property="fileType" column="file_type" jdbcType="VARCHAR"/>
            <result property="fileUrl" column="file_url" jdbcType="VARCHAR"/>
dao/src/main/resources/mapper/NewNovaGroupMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.NewNovaGroupMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaGroup">
            <id property="groupId" column="group_id" jdbcType="BIGINT"/>
            <result property="groupName" column="group_name" jdbcType="VARCHAR"/>
            <result property="clientId" column="client_id" jdbcType="BIGINT"/>
            <result property="userId" column="user_id" jdbcType="BIGINT"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        group_id,group_name,client_id,
        user_id,create_time,update_time
    </sql>
</mapper>
dao/src/main/resources/mapper/NewNovaGroupRelationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.NewNovaGroupRelationMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaGroupRelation">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="novaId" column="nova_id" jdbcType="BIGINT"/>
            <result property="novaGroupId" column="nova_group_id" jdbcType="BIGINT"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,nova_id,nova_group_id,
        create_time,update_time
    </sql>
</mapper>
dao/src/main/resources/mapper/NewNovaLedMapper.xml
@@ -29,15 +29,34 @@
        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
        LEFT JOIN new_nova_group_relation t4 ON t4.nova_id = t1.id
        LEFT JOIN new_nova_group t5 ON t5.group_id = t4.nova_group_id
        <where>
            1=1
            <if test="groupId != null">
                AND t5.group_id=#{groupId}
            </if>
            <if test="keyword != null and keyword != ''">
                AND t1.name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.sn LIKE CONCAT(CONCAT('%', #{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>
        GROUP BY t1.id
    </select>
    <select id="getListByGroupId" resultType="com.sandu.ximon.dao.bo.NewNovaGroupListBo">
        SELECT
        t1.*
        FROM
        new_nova_led t1
        INNER JOIN new_nova_group_relation t2 ON t1.id = t2.nova_id
        LEFT JOIN new_nova_group t3 ON t3.group_id = t2.nova_group_id
        WHERE
        t3.group_id=#{groupId}
        <if test="clientId != null">
            AND (t3.user_id = #{clientId} OR t3.client_id = #{clientId})
        </if>
    </select>
</mapper>
dao/src/main/resources/mapper/NewNovaProFileRelationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.NewNovaProFileRelationMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaProFileRelation">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="newNovaProgramId" column="new_nova_program_id" jdbcType="BIGINT"/>
            <result property="newNovaFileId" column="new_nova_file_id" jdbcType="BIGINT"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,new_nova_program_id,new_nova_file_id
    </sql>
</mapper>
dao/src/main/resources/mapper/NewNovaProgramMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.NewNovaProgramMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaProgram">
        <id property="id" column="id" jdbcType="BIGINT"/>
        <result property="pid" column="pid" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="insertPlay" column="insert_play" jdbcType="INTEGER"/>
        <result property="startPlayAfterTransferred" column="start_play_after_transferred" jdbcType="INTEGER"/>
        <result property="pageInfoJsonStr" column="page_info_json_str" jdbcType="VARCHAR"/>
        <result property="width" column="width" jdbcType="INTEGER"/>
        <result property="height" column="height" jdbcType="INTEGER"/>
        <result property="screenShot" column="screen_shot" jdbcType="VARCHAR"/>
        <result property="userId" column="user_id" jdbcType="BIGINT"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id
        ,pid,name,
        insert_play,start_play_after_transferred,page_info_json_str,
        width,height,screen_shot,
        user_id,create_time,update_time
    </sql>
    <select id="listProgram" resultType="com.sandu.ximon.dao.bo.NewNovaProgramBo">
        SELECT * FROM `new_nova_program`
        <where>
            1=1
            <if test="keyword != null and keyword != ''">
                AND name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
            </if>
            <if test="userId != null">
                AND user_id = #{userId}
            </if>
        </where>
    </select>
</mapper>
sandu-common/src/main/java/com/sandu/common/file/config/NovaFileConfig.java
@@ -20,5 +20,11 @@
    /**
     * æœåС噍ip和端口
     */
    private String realUrl;
    private String fileUrl;
    /**
     * æˆªå›¾å­˜æ”¾è·¯å¾„
     */
    private String screenShotPath;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
@@ -225,7 +225,7 @@
        }
        boolean result = poleService.unBindPole(poleId, param.getDeviceCode(), param.getDeviceType());
        if (result) {
            //设备类型,0路灯,1led屏幕,2充电桩,3大气监测,4水质监测,5ip音柱,6lcd广告机,7摄像头,8杆体倾测,9一键救助, 10熙讯, 11农耕
            //设备类型,0路灯,1led屏幕,2充电桩,3大气监测,4水质监测,5ip音柱,6lcd广告机,7摄像头,8杆体倾测,9一键救助, 10熙讯, 11农耕, 12新诺瓦
            switch (param.getDeviceType().toString()) {
                case PoleBindingEnums.LIGHT:
                    //删除灯杆的devicescode
@@ -258,6 +258,8 @@
                    break;
                case PoleBindingEnums.ATMOSPHERIC_NONG_GENG:
                    break;
                case PoleBindingEnums.NEW_NOVA:
                    break;
                default:
                    break;
            }
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/VnnoxController.java
@@ -274,9 +274,9 @@
     */
    @GetMapping("/getByGroupId")
    public ResponseVO<Object> getByGroupId(@RequestParam(value = "groupId", required = true) Long groupId) {
//        if (!permissionConfig.check(MenuEnum.LED_N_GROUP_INFO.getCode())) {
//            return ResponseUtil.fail("缺少对应用户权限");
//        }
        if (!permissionConfig.check(MenuEnum.LED_N_GROUP_INFO.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (groupId == null) {
            throw new BusinessException("groupId不能为空");
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/ProgramPathConfig.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/conf/FilePathConfig.java ÐÞ¸Ä
@@ -11,7 +11,7 @@
@Data
@Configuration
@ConfigurationProperties(prefix = "new-nova")
public class FilePathConfig {
public class ProgramPathConfig {
    /**
     * ä¾èµ–存放路径
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java
@@ -61,9 +61,9 @@
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        List<NewNovaFile> list = newNovaFileService.list(wrapper);
        list.forEach(file -> {
            file.setFileUrl(fileConfig.getRealUrl() + file.getFileUrl());
            file.setFileUrl(fileConfig.getFileUrl() + file.getFileUrl());
            if (file.getScreenShot() != null) {
                file.setScreenShot(fileConfig.getRealUrl() + file.getScreenShot());
                file.setScreenShot(fileConfig.getFileUrl() + file.getScreenShot());
            }
        });
        return ResponseUtil.success(list);
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java
@@ -106,6 +106,7 @@
        NewNovaFile novaFile = new NewNovaFile();
        novaFile.setName(fileUploadDto.getOriginName());
        novaFile.setRealName(fileUploadDto.getFileName());
        novaFile.setFileType(fileUploadDto.getFileType());
        novaFile.setRealUrl(fileUploadDto.getRealUrl());
        novaFile.setFileUrl(fileUploadDto.getFileUrl());
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.sandu.ximon.admin.newnova.grouping;
import com.github.pagehelper.PageHelper;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.GroupParam;
import com.sandu.ximon.admin.security.PermissionConfig;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/15
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/newNova/group")
public class NewNovaGroupController {
    private PermissionConfig permissionConfig;
    private final NewNovaGroupService ledGroupService;
    /**
     * æ–°å¢žåˆ†ç»„
     *
     * @param param
     * @return
     */
    @PostMapping("/add")
    public ResponseVO<Object> addGroup(@RequestBody @Validated GroupParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_ADD.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        boolean b = ledGroupService.addGroup(param);
        if (b) {
            return ResponseUtil.success("添加成功");
        } else {
            return ResponseUtil.fail("添加失败");
        }
    }
    /**
     * ç¼–辑分组
     *
     * @param param
     * @return
     */
    @PostMapping("/update")
    public ResponseVO<Object> updateGroup(@RequestBody @Validated GroupParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_UPDATE.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        boolean b = ledGroupService.updateGroup(param);
        if (b) {
            return ResponseUtil.success("编辑成功");
        } else {
            return ResponseUtil.fail("编辑失败");
        }
    }
    /**
     * åˆ é™¤åˆ†ç»„
     *
     * @param groupIds
     * @return
     */
    @PostMapping("/delete")
    public ResponseVO<Object> delGroup(@RequestBody List<Long> groupIds) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_DEL.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        boolean b = ledGroupService.deleteGroup(groupIds);
        if (b) {
            return ResponseUtil.success("删除成功");
        } else {
            return ResponseUtil.fail("删除失败");
        }
    }
    /**
     * åˆ†ç»„列表
     *
     * @param baseConditionVO
     * @param keyword
     * @return
     */
    @GetMapping("/list")
    public ResponseVO<Object> listGroup(BaseConditionVO baseConditionVO,
                                        @RequestParam(value = "keyword", required = false) String keyword) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_LIST.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        return ResponseUtil.success(ledGroupService.groupList(baseConditionVO, keyword));
    }
    /**
     * ç»‘定LED到分组内
     *
     * @param param
     * @return
     */
    @PostMapping("/bind")
    public ResponseVO<Object> bindPole(@RequestBody GroupParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_BIND.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        boolean b = ledGroupService.bindLed(param.getGroupId(), param.getLedIdList());
        if (b) {
            return ResponseUtil.success("添加成功");
        } else {
            return ResponseUtil.fail("添加失败");
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupRelationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.sandu.ximon.admin.newnova.grouping;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.NewNovaGroupRelation;
import com.sandu.ximon.dao.mapper.NewNovaGroupRelationMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/15
 */
@Service
@AllArgsConstructor
public class NewNovaGroupRelationService extends BaseServiceImpl<NewNovaGroupRelationMapper, NewNovaGroupRelation> {
    /**
     * æ·»åŠ ç»‘å®šå…³ç³»
     *
     * @param groupId
     * @param novaIdList
     * @return
     */
    public boolean saveBinding(Long groupId, List<Long> novaIdList) {
        remove(Wrappers.lambdaQuery(NewNovaGroupRelation.class).eq(NewNovaGroupRelation::getNovaGroupId, groupId));
        if (CollectionUtil.isEmpty(novaIdList)) {
            return true;
        }
        List<NewNovaGroupRelation> batchList = new ArrayList<>();
        for (Long novaId : novaIdList) {
            NewNovaGroupRelation poleGroupRelation = new NewNovaGroupRelation();
            poleGroupRelation.setNovaGroupId(groupId);
            poleGroupRelation.setNovaId(novaId);
            batchList.add(poleGroupRelation);
        }
        return saveBatch(batchList);
    }
    /**
     * åˆ é™¤ç»‘定关系
     *
     * @param groupIds
     */
    public void deleteBinding(List<Long> groupIds) {
        remove(Wrappers.lambdaQuery(NewNovaGroupRelation.class).in(NewNovaGroupRelation::getNovaGroupId, groupIds));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/grouping/NewNovaGroupService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
package com.sandu.ximon.admin.newnova.grouping;
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.ximon.admin.param.GroupParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.AdminService;
import com.sandu.ximon.admin.service.ClientService;
import com.sandu.ximon.dao.domain.Admin;
import com.sandu.ximon.dao.domain.Client;
import com.sandu.ximon.dao.domain.NewNovaGroup;
import com.sandu.ximon.dao.mapper.NewNovaGroupMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/15
 */
@Service
@AllArgsConstructor
public class NewNovaGroupService extends BaseServiceImpl<NewNovaGroupMapper, NewNovaGroup> {
    private final ClientService clientService;
    private final AdminService adminService;
    private final NewNovaGroupRelationService relationService;
    /**
     * æ–°å¢žåˆ†ç»„
     *
     * @param param
     * @return
     */
    public boolean addGroup(GroupParam param) {
        NewNovaGroup group = new NewNovaGroup();
        group.setUserId(SecurityUtils.getUserId());
//        group.setClientId(clientService.getClientId(SecurityUtils.getUserId()));
        group.setGroupName(param.getGroupName());
        return save(group);
    }
    /**
     * ç¼–辑分组
     *
     * @param
     * @param param
     * @return
     */
    public boolean updateGroup(GroupParam param) {
        if (param.getGroupId() == null) {
            throw new BusinessException("分组id不能为空");
        }
        NewNovaGroup poleGroup = getById(param.getGroupId());
        if (poleGroup == null) {
            throw new BusinessException("未找到该分组");
        }
        poleGroup.setGroupName(param.getGroupName());
        return updateById(poleGroup);
    }
    /**
     * åˆ é™¤åˆ†ç»„
     *
     * @param groupIds
     * @return
     */
    public boolean deleteGroup(List<Long> groupIds) {
        List<NewNovaGroup> ledNovaGroups = listByIds(groupIds);
        if (ledNovaGroups == null) {
            throw new BusinessException("未找到该分组");
        }
        /**
         * åˆªé™¤å…³ç³»
         */
        relationService.deleteBinding(groupIds);
        return removeByIds(groupIds);
    }
    /**
     * åˆ†ç»„列表
     *
     * @param baseConditionVO
     * @param keyword
     * @return
     */
    public Object groupList(BaseConditionVO baseConditionVO, String keyword) {
        if (keyword == null) {
            throw new BusinessException("关键字不能为null,不需要模糊查询请传空字符串");
        }
        List<NewNovaGroup> list;
        if (SecurityUtils.getClientId() == null) {
            //超管
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            list = list(Wrappers.lambdaQuery(NewNovaGroup.class).like(NewNovaGroup::getGroupName, keyword));
        } else {
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
            list = list(Wrappers.lambdaQuery(NewNovaGroup.class).eq(NewNovaGroup::getUserId, SecurityUtils.getUserId()).like(NewNovaGroup::getGroupName, keyword));
        }
        list.forEach(gro -> {
            Admin byId = adminService.getById(gro.getUserId());
            if (byId != null) {
                gro.setUserName(byId.getUsername());
            } else {
                Client client = clientService.getById(gro.getUserId());
                if (client == null) {
                    gro.setUserName(gro.getUserName());
                } else {
                    gro.setUserName("admin");
                }
            }
        });
        return list;
    }
    /**
     * ç»‘定
     *
     * @param groupId
     * @param ledIdList
     * @return
     */
    public boolean bindLed(Long groupId, List<Long> ledIdList) {
        NewNovaGroup ledNovaGroup = getById(groupId);
        if (ledNovaGroup == null) {
            throw new BusinessException("未找到该分组");
        }
        return relationService.saveBinding(groupId, ledIdList);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedController.java
@@ -1,12 +1,17 @@
package com.sandu.ximon.admin.newnova.led;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.newnova.grouping.NewNovaGroupService;
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.security.PermissionConfig;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.domain.NewNovaGroup;
import com.sandu.ximon.dao.domain.NewNovaLed;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
@@ -24,6 +29,7 @@
public class NewNovaLedController {
    private final PermissionConfig permissionConfig;
    private final NewNovaLedService newNovaLedService;
    private final NewNovaGroupService groupService;
    /**
@@ -69,11 +75,12 @@
     */
    @GetMapping("/listLed")
    public ResponseVO listLed(BaseConditionVO baseConditionVO, @RequestParam(required = false, value = "keyword") String keyword,
                              @RequestParam(required = false, value = "onlineStatus") boolean onlineStatus) {
                              @RequestParam(required = false, value = "onlineStatus") boolean onlineStatus,
                              @RequestParam(required = false, value = "groupId") Long groupId) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_LIST.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaLedService.listLed(baseConditionVO, keyword, onlineStatus));
        return ResponseUtil.success(newNovaLedService.listLed(baseConditionVO, keyword, groupId, onlineStatus));
    }
    /**
@@ -90,12 +97,13 @@
        return ResponseUtil.success(newNovaLedService.getInfo(ledId));
    }
    /**
     * è®¾ç½®äº®åº¦
     */
    @PostMapping("/setBrightness")
    public ResponseVO setScreenBrightness(@RequestBody @Validated NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_VOL.getCode())) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_BRIGHTNESS.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getBrightness() == null) {
@@ -105,17 +113,160 @@
                return ResponseUtil.fail("亮度范围为: 0-100");
            }
        }
        if (newNovaLedService.getById(param.getId()) == null) {
        NewNovaLed byId = newNovaLedService.getById(param.getId());
        if (byId == null) {
            return ResponseUtil.fail("设备不存在");
        } else {
            if (!byId.getSn().equals(param.getSn())) {
                return ResponseUtil.fail("sn与id不匹配");
            }
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().setScreenBrightness(param));
    }
    /**
     * è®¾ç½®éŸ³é‡
     */
    @PostMapping("/setVolume")
    public ResponseVO setVolume(@RequestBody @Validated NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_VOL.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getVolume() == null) {
            return ResponseUtil.fail("音量不能为空");
        } else {
            if (param.getVolume() > 100 || param.getVolume() < 0) {
                return ResponseUtil.fail("音量范围为: 0-100");
            }
        }
        NewNovaLed byId = newNovaLedService.getById(param.getId());
        if (byId == null) {
            return ResponseUtil.fail("设备不存在");
        } else {
            if (!byId.getSn().equals(param.getSn())) {
                return ResponseUtil.fail("sn与id不匹配");
            }
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().setVolume(param));
    }
    /**
     * è®¾ç½®åŒæ­¥
     */
    @PostMapping("/setSync")
    public ResponseVO setSync(@RequestBody NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_SYNC.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getNovaList() == null || param.getNovaList().isEmpty()) {
            return ResponseUtil.fail("请选择设备");
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().setSync(param));
    }
    /**
     * è®¾ç½®å±å¹•开关
     */
    @PostMapping("/setPowerStatus")
    public ResponseVO setPowerStatus(@RequestBody NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_POWER.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        NewNovaLed byId = newNovaLedService.getById(param.getId());
        if (byId == null) {
            return ResponseUtil.fail("设备不存在");
        } else {
            if (!byId.getSn().equals(param.getSn())) {
                return ResponseUtil.fail("sn与id不匹配");
            }
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().setPowerStatus(param));
    }
    /**
     * é‡å¯
     */
    @PostMapping("/reboot")
    public ResponseVO reboot(@RequestBody NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_REBOOT.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getNovaList() == null || param.getNovaList().isEmpty()) {
            return ResponseUtil.fail("请选择设备");
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().reboot(param));
    }
    /**
     * ntp
     */
    @PostMapping("/ntp")
    public ResponseVO ntp(@RequestBody NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_NTP.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getNovaList() == null || param.getNovaList().isEmpty()) {
            return ResponseUtil.fail("请选择设备");
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().ntp(param));
    }
    /**
     * æˆªå±
     */
    @PostMapping("/screenShot")
    public ResponseVO screenShot(@RequestBody NewNovaStatusParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_SCREENSHOT.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (param.getScreenShotList() == null || param.getScreenShotList().isEmpty()) {
            return ResponseUtil.fail("请选择设备");
        }
        return ResponseUtil.success(NovaAPIUtil.getInstanceUtil().screenShot(param));
    }
    /**
     * æ ¹æ®åˆ†ç»„id获取组内的屏幕
     */
    @GetMapping("/getByGroupId")
    public ResponseVO<Object> getByGroupId(@RequestParam(value = "groupId", required = true) Long groupId) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_GROUB_INFO.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (groupId == null) {
            throw new BusinessException("groupId不能为空");
        }
        NewNovaGroup byId = groupService.getById(groupId);
        if (SecurityUtils.getClientId() != null && !SecurityUtils.getUserId().equals(byId.getUserId())) {
            throw new BusinessException("不能查看不属于自己分组的内容!");
        }
        if (byId == null) {
            throw new BusinessException("分组不存在");
        }
        return ResponseUtil.success(newNovaLedService.getListByGroupId(groupId));
    }
    /**
     * æŽ¨é€å¤§æ°”
     */
    @GetMapping("/pushAirData")
    public ResponseVO<Object> pushAirData(@RequestParam(value = "id", required = true) Long id
            , @RequestParam(value = "duration", required = true) Long duration
            , @RequestParam(value = "fontSize", required = true) Long fontSize) throws InterruptedException {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PUSH_AIR.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaLedService.pushAirData(id, duration,fontSize));
    }
//    @PostMapping("/tranPro")
//    public ResponseVO<Object> tranPro(@RequestBody Map pageInfo) throws InterruptedException {
//        NovaAPIUtil a = NovaAPIUtil.getInstanceUtil();
//        StatusVO login = a.login("MZVA51930N2113017308");
//        StatusVO login = a.login("MZVA51930N2113017308", 0);
//        if (login.getStatusCode() != 0) {
//            return ResponseUtil.fail("genVO");
//        }
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java
@@ -1,16 +1,26 @@
package com.sandu.ximon.admin.newnova.led;
import com.alibaba.fastjson.JSON;
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.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.newnova.conf.ProgramPathConfig;
import com.sandu.ximon.admin.newnova.param.NewNovaLedParam;
import com.sandu.ximon.admin.newnova.param.ProgramPrarm;
import com.sandu.ximon.admin.newnova.program.NewNovaProgramService;
import com.sandu.ximon.admin.newnova.utils.NovaAPIUtil;
import com.sandu.ximon.admin.newnova.vo.ProWHVO;
import com.sandu.ximon.admin.newnova.vo.StatusVO;
import com.sandu.ximon.admin.newnova.vo.TrasfromStatusVO;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.AirDataService;
import com.sandu.ximon.admin.service.PoleBindingService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.dao.bo.NewNovaGroupListBo;
import com.sandu.ximon.dao.domain.NewNovaLed;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleBinding;
@@ -18,8 +28,12 @@
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -30,6 +44,8 @@
@AllArgsConstructor
public class NewNovaLedService extends BaseServiceImpl<NewNovaLedMapper, NewNovaLed> {
    private final PoleBindingService poleBindingService;
    private ProgramPathConfig filePathConfig;
    /**
     * å±å¹•注册
@@ -101,17 +117,18 @@
     *
     * @param baseConditionVO
     * @param keyword
     * @param groupId
     * @param onlineStatus
     * @return
     */
    public List<NewNovaLed> listLed(BaseConditionVO baseConditionVO, String keyword, boolean onlineStatus) {
    public List<NewNovaLed> listLed(BaseConditionVO baseConditionVO, String keyword, Long groupId, boolean onlineStatus) {
        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
        //排序
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        List<NewNovaLed> newNovaListBos = baseMapper.listLed(keyword, SecurityUtils.getClientId());
        List<NewNovaLed> newNovaListBos = baseMapper.listLed(keyword, groupId, SecurityUtils.getClientId());
        //获取在线状态
        instanceUtil.getOnlineStatus(newNovaListBos);
        instanceUtil.getOnlineStatus(newNovaListBos, onlineStatus);
        //获取屏幕开关
        instanceUtil.getScreenPowerState(newNovaListBos);
        //获取音量
@@ -141,7 +158,7 @@
        List<NewNovaLed> list = new ArrayList<>();
        list.add(byId);
        //获取在线状态
        instanceUtil.getOnlineStatus(list);
        instanceUtil.getOnlineStatus(list, false);
        //获取屏幕开关
        instanceUtil.getScreenPowerState(list);
        //获取音量
@@ -154,4 +171,210 @@
        instanceUtil.getInfo(byId);
        return list.get(0);
    }
    /**
     * èŽ·å–æ•´ç»„çš„å±å¹•
     *
     * @param groupId
     */
    public List<NewNovaGroupListBo> getListByGroupId(Long groupId) {
        List<NewNovaGroupListBo> listByGroupId = baseMapper.getListByGroupId(groupId, SecurityUtils.getClientId());
        return listByGroupId;
    }
    /**
     * æŽ¨é€å¤§æ°”
     *
     * @param id
     * @param duration
     * @param fontSize
     */
    public Object pushAirData(Long id, Long duration, Long fontSize) throws InterruptedException {
        NovaAPIUtil apiUtil = NovaAPIUtil.getInstanceUtil();
        NewNovaLed byId = getById(id);
        PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, byId.getSn()).eq(PoleBinding::getDeviceType, 12));
        if (nova == null) {
            throw new BusinessException("未绑定诺瓦设备");
        }
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, nova.getPoleId()).eq(PoleBinding::getDeviceType, 3));
        if (air == null) {
            throw new BusinessException("未绑定大气设备");
        }
        //获取大气监测数据
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(nova.getPoleId());
        //解析大气数据
        Map pageInfo = parseData(data, duration,fontSize);
        ProgramPrarm page = new ProgramPrarm();
        page.setPageInfo(pageInfo);
        page.setInsertPlay(true);
        ProWHVO whvo = new ProWHVO("大气监测", 128, 256);
        page.setProgramMsg(whvo);
        StatusVO createPro = apiUtil.createPro(whvo);
        Integer pid = Integer.valueOf(createPro.getStatusData());
        page.setProgramID(pid);
        StatusVO editPro = apiUtil.editProgram(pid, pageInfo);
        if(editPro.getStatusCode()!=0){
            throw new BusinessException(editPro.getStatusData());
        }
        StatusVO genVO = apiUtil.genrateProgram(pid);
        if(genVO.getStatusCode()!=0){
            throw new BusinessException(genVO.getStatusData());
        }
        page.setProgramID(Integer.valueOf(createPro.getStatusData()));
        page.setStartPlayAfterTransferred(true);
        List<String> sns = new ArrayList<String>();
        sns.add(byId.getSn());
        page.setSnList(sns);
        List<TrasfromStatusVO> trasfromStatusVOS = apiUtil.trasfromProgram(page);
        File file = new File(filePathConfig.getOutPutPath() + "/program" + pid);
        SpringContextHolder.getBean(NewNovaProgramService.class).deleteFile(file);
        return trasfromStatusVOS;
    }
    /**
     * å¤„理大气数据
     *
     * @param data
     * @param duration
     * @param fontSize
     * @return
     */
    private Map parseData(A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data, Long duration, Long fontSize) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z+8:00'");
        Date end = new Date();
        end.setTime(end.getTime()+duration);
        String str = "{\n" +
                "        \"name\": \"大气监测\",\n" +
                "        \"widgetContainers\": [\n" +
                "            {\n" +
                "                \"contents\": {\n" +
                "                    \"widgets\": [\n" +
                "                        {\n" +
                "                            \"constraints\": [\n" +
                "                                {\n" +
                "                                    \"cron\": [\n" +
                "                                        \"\"\n" +
                "                                    ],\n" +
                "                                    \"endTime\": \"" + sdf.format(end) + "\",\n" +
                "                                    \"startTime\": \"" + sdf.format(new Date()) + "\"\n" +
                "                                }\n" +
                "                            ],\n" +
                "                            \"duration\":" + duration + ",\n" +
                "                            \"metadata\": {\n" +
                "                                \"content\": {\n" +
                "                                    \"autoPaging\": true,\n" +
                "                                    \"backgroundMusic\": {\n" +
                "                                        \"duration\": 0,\n" +
                "                                        \"isTextSync\": false\n" +
                "                                    },\n" +
                "                                    \"displayStyle\": {\n" +
                "                                        \"scrollAttributes\": {\n" +
                "                                            \"effects\": {\n" +
                "                                                \"animation\": \"MARQUEE_LEFT\",\n" +
                "                                                \"speed\": 3\n" +
                "                                            }\n" +
                "                                        },\n" +
                "                                        \"type\": \"STATIC\"\n" +
                "                                    },\n" +
                "                                    \"paragraphs\": [\n" +
                "                                        {\n" +
                "                                            \"backgroundColor\": \"#00000000\",\n" +
                "                                            \"horizontalAlignment\": \"LEFT\",\n" +
                "                                            \"letterSpacing\": 0,\n" +
                "                                            \"lineSpacing\": 0,\n" +
                "                                            \"lines\": [\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"环境监测:\"\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"温度:" + (data == null || data.getTemperature() == null ? " - " : data.getTemperature()) + "°\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"湿度:" + (data == null || data.getHumidity() == null ? " - " : data.getHumidity()) + "%\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"pm25:" + (data == null || data.getPm25() == null ? " - " : data.getPm25()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"pm10:" + (data == null || data.getPm10() == null ? " - " : data.getPm10()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"甲醛:" + (data == null || data.getEch2o() == null ? " - " : data.getEch2o()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"CO2:" + (data == null || data.getCo2() == null ? " - " : data.getCo2()) + "ppm\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                }\n" +
                "                                            ],\n" +
                "                                            \"verticalAlignment\": \"TOP\"\n" +
                "                                        }\n" +
                "                                    ],\n" +
                "                                    \"textAttributes\": [\n" +
                "                                        {\n" +
                "                                            \"backgroundColor\": \"#ff000000\",\n" +
                "                                            \"attributes\": {\n" +
                "                                                \"font\": {\n" +
                "                                                    \"family\": [\n" +
                "                                                        \"Helvetica\"\n" +
                "                                                    ],\n" +
                "                                                    \"isUnderline\": false,\n" +
                "                                                    \"size\": "+fontSize+",\n" +
                "                                                    \"style\": \"NORMAL\"\n" +
                "                                                },\n" +
                "                                                \"letterSpacing\": 0,\n" +
                "                                                \"textColor\": \"#ffff0000\"\n" +
                "                                            }\n" +
                "                                        }\n" +
                "                                    ]\n" +
                "                                }\n" +
                "                            },\n" +
                "                            \"name\": \"环境监测\",\n" +
                "                            \"type\": \"ARCH_TEXT\"\n" +
                "                        }\n" +
                "                    ]\n" +
                "                },\n" +
                "                \"id\": 1,\n" +
                "                \"name\": \"widgetContainers1\"\n" +
                "            }\n" +
                "        ]\n" +
                "    }";
        return JSON.parseObject(str, Map.class);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaFileParam.java
@@ -19,6 +19,9 @@
    @NotBlank(message = "文件名不能为空")
    private String name;
    private String realName;
    /**
     * å¤§å°
     */
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaStatusParam.java
@@ -48,8 +48,21 @@
     */
    private boolean ntp = true;
    /**
     * å±å¹•开关 0关 1开
     */
    private int powerStatus =0;
    /**
     * éŸ³é‡äº®åº¦ç­‰
     */
    private List<NovaDTO> novaList;
    /**
     * æˆªå›¾
     */
    private List<NovascreenShotDTO> screenShotList;
    @NoArgsConstructor
@@ -65,4 +78,20 @@
        private boolean status = false;
    }
    @NoArgsConstructor
    @Data
    public static class NovascreenShotDTO {
        private Long id;
        private String sn;
        private String name;
        private int code;
        private String screenShot;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/ProgramPrarm.java
@@ -1,8 +1,12 @@
package com.sandu.ximon.admin.newnova.param;
import com.sandu.ximon.admin.newnova.vo.ProWHVO;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author LiuHaoNan
@@ -19,7 +23,18 @@
    /**
     * èŠ‚ç›®id
     */
    @NotNull(message = "节目id不能为空")
    private Integer programID;
    /**
     * èŠ‚ç›®ä¿¡æ¯
     */
    private ProWHVO programMsg;
    /**
     * ç¼©ç•¥å›¾
     */
    private String screenShot;
    /**
     * æ˜¯å¦ç«‹å³æ’­æ”¾èŠ‚ç›®
@@ -31,4 +46,25 @@
     */
    private Boolean insertPlay;
    /**
     * å¤§æ°”节目
     */
    private Map pageInfo;
    /**
     * èŠ‚ç›®å†…å®¹
     */
    private List<Map> sceneItems;
    /**
     * æ–‡ä»¶id
     */
    private List<Long> fileIds;
    /**
     * èŠ‚ç›®æ–‡ä»¶Map
     */
    private Map<String, String> fileMap=new HashMap<String, String>();
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProFileRelationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.sandu.ximon.admin.newnova.program;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.NewNovaProFileRelation;
import com.sandu.ximon.dao.mapper.NewNovaProFileRelationMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/16
 */
@Service
@AllArgsConstructor
public class NewNovaProFileRelationService extends BaseServiceImpl<NewNovaProFileRelationMapper, NewNovaProFileRelation> {
    /**
     * ä¿å­˜èŠ‚ç›®,文件关系
     *
     * @param programId
     * @param fileIds
     * @return
     */
    public boolean saveRelation(Long programId, List<Long> fileIds) {
        remove(Wrappers.lambdaQuery(NewNovaProFileRelation.class).eq(NewNovaProFileRelation::getNewNovaProgramId, programId));
        if (CollectionUtil.isEmpty(fileIds)) {
            return true;
        }
        List<NewNovaProFileRelation> batchList = new ArrayList<>();
        for (Long fileId : fileIds) {
            NewNovaProFileRelation fileRelation = new NewNovaProFileRelation();
            fileRelation.setNewNovaFileId(fileId);
            fileRelation.setNewNovaProgramId(programId);
            batchList.add(fileRelation);
        }
        return saveBatch(batchList);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProgramController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.sandu.ximon.admin.newnova.program;
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.ProgramPrarm;
import com.sandu.ximon.admin.security.PermissionConfig;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/16
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/nova/program")
public class NewNovaProgramController {
    private final NewNovaProgramService newNovaProgramService;
    private final PermissionConfig permissionConfig;
    /**
     * èŠ‚ç›®æ–°å¢ž
     *
     * @param programPrarm
     * @return
     * @throws InterruptedException
     */
    @PostMapping("/addProgram")
    public ResponseVO<Object> addProgram(@RequestBody ProgramPrarm programPrarm) throws InterruptedException {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PROGRAM_ADD.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (programPrarm.getProgramID() != null) {
            return ResponseUtil.fail("节目新增无需传入节目id");
        }
        return ResponseUtil.success(newNovaProgramService.addProgram(programPrarm));
    }
    /**
     * èŠ‚ç›®ç¼–è¾‘
     *
     * @param programPrarm
     * @return
     * @throws InterruptedException
     */
    @PostMapping("/updateProgram")
    public ResponseVO<Object> updateProgram(@RequestBody @Validated ProgramPrarm programPrarm) throws InterruptedException {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PROGRAM_UPDATE.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (programPrarm.getProgramID() == null) {
            return ResponseUtil.fail("节目id不能为空");
        }
        return ResponseUtil.success(newNovaProgramService.addProgram(programPrarm));
    }
    /**
     * èŠ‚ç›®åˆ é™¤
     *
     * @param pids
     * @return
     */
    @PostMapping("/deleteProgram")
    public ResponseVO<Object> delProgram(@RequestBody List<Long> pids) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PROGRAM_DEL.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaProgramService.delProgram(pids));
    }
    /**
     * èŠ‚ç›®è¯¦æƒ…
     *
     * @param id
     * @return
     */
    @PostMapping("/programInfo")
    public ResponseVO<Object> programInfo(@RequestParam(value = "id", required = true) Long id) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PROGRAM_INFO.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaProgramService.programInfo(id));
    }
    /**
     * èŠ‚ç›®åˆ—è¡¨
     *
     * @param baseConditionVO
     * @param keyword
     * @return
     */
    @GetMapping("/listProgram")
    public ResponseVO listProgram(BaseConditionVO baseConditionVO, @RequestParam(required = false, value = "keyword") String keyword) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_PROGRAM_LIST.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaProgramService.listProgram(baseConditionVO, keyword));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/program/NewNovaProgramService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,230 @@
package com.sandu.ximon.admin.newnova.program;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.config.NovaFileConfig;
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.conf.ProgramPathConfig;
import com.sandu.ximon.admin.newnova.file.NewNovaFileService;
import com.sandu.ximon.admin.newnova.param.ProgramPrarm;
import com.sandu.ximon.admin.newnova.utils.NovaAPIUtil;
import com.sandu.ximon.admin.newnova.vo.StatusVO;
import com.sandu.ximon.admin.newnova.vo.TrasfromStatusVO;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.bo.NewNovaProgramBo;
import com.sandu.ximon.dao.domain.NewNovaFile;
import com.sandu.ximon.dao.domain.NewNovaProFileRelation;
import com.sandu.ximon.dao.domain.NewNovaProgram;
import com.sandu.ximon.dao.mapper.NewNovaProgramMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author LiuHaoNan
 * @date 2022/11/16
 */
@Service
@AllArgsConstructor
public class NewNovaProgramService extends BaseServiceImpl<NewNovaProgramMapper, NewNovaProgram> {
    private NewNovaProFileRelationService fileRelationService;
    private NewNovaFileService fileService;
    private ProgramPathConfig filePathConfig;
    /**
     * èŠ‚ç›®æ–°å¢ž
     *
     * @param programPrarm
     * @return
     */
    public List<TrasfromStatusVO> addProgram(ProgramPrarm programPrarm) throws InterruptedException {
        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
        NewNovaProgram newNovaProgram = new NewNovaProgram();
        newNovaProgram.setName(programPrarm.getProgramMsg().getName());
        newNovaProgram.setWidth(programPrarm.getProgramMsg().getWidth());
        newNovaProgram.setHeight(programPrarm.getProgramMsg().getHeight());
        newNovaProgram.setScreenShot(programPrarm.getScreenShot());
        if (programPrarm.getInsertPlay()) {
            newNovaProgram.setInsertPlay(1);
        } else {
            newNovaProgram.setInsertPlay(0);
        }
        if (programPrarm.getStartPlayAfterTransferred()) {
            newNovaProgram.setStartPlayAfterTransferred(1);
        } else {
            newNovaProgram.setStartPlayAfterTransferred(0);
        }
        Integer pid = null;
        //创建节目
        if (programPrarm.getProgramID() == null) {
            StatusVO createPro = instanceUtil.createPro(programPrarm.getProgramMsg());
            pid = Integer.valueOf(createPro.getStatusData());
            checkProgram(createPro);
        } else {
            NewNovaProgram byId = getById(programPrarm.getProgramID());
            if (byId == null) {
                throw new BusinessException("未找到节目");
            }
            pid = byId.getPid();
            newNovaProgram.setId(byId.getId());
        }
        System.out.println("pid = " + pid);
        programPrarm.setProgramID(pid);
        newNovaProgram.setPid(pid);
        //编辑节目
        StatusVO editProgram = instanceUtil.editPrograms(pid, programPrarm.getSceneItems());
        checkProgram(editProgram);
        newNovaProgram.setPageInfoJsonStr(JSON.toJSONString(programPrarm.getSceneItems()));
        //生成节目
        StatusVO genrateProgram = instanceUtil.genrateProgram(pid);
        checkProgram(genrateProgram);
        //发布节目
        List<TrasfromStatusVO> trasfromStatusVOS = new ArrayList<>();
        if (!programPrarm.getSnList().isEmpty()) {
            Map<String, String> proFile = getProFile(programPrarm);
            programPrarm.setFileMap(proFile);
            trasfromStatusVOS = instanceUtil.trasfromProgram(programPrarm);
        }
        newNovaProgram.setUserId(SecurityUtils.getUserId());
        saveOrUpdate(newNovaProgram);
        fileRelationService.saveRelation(newNovaProgram.getId(), programPrarm.getFileIds());
        return trasfromStatusVOS;
    }
    /**
     * æ ¡éªŒæ˜¯å¦æ‰§è¡ŒæˆåŠŸ
     */
    public void checkProgram(StatusVO statusVO) {
        if (statusVO.getStatusCode() != 0) {
            throw new BusinessException("节目新增失败 : " + statusVO.getStatusData());
        }
    }
    /**
     * èŽ·å–èŠ‚ç›®æ–‡ä»¶
     *
     * @return
     */
    public Map<String, String> getProFile(ProgramPrarm programPrarm) {
        List<NewNovaFile> novaFiles = fileService.listByIds(programPrarm.getFileIds());
        if (novaFiles == null || novaFiles.size() == 0) {
            return new HashMap<String, String>();
        }
        Map<String, String> fileMap = new HashMap<String, String>();
        novaFiles.forEach(file -> {
            fileMap.put(file.getRealUrl(), file.getRealName());
        });
        return fileMap;
    }
    /**
     * åˆ é™¤èŠ‚ç›®
     *
     * @param pids
     * @return
     */
    public Boolean delProgram(List<Long> pids) {
        if (pids.isEmpty()) {
            throw new BusinessException("节目id不能为空");
        }
        List<NewNovaProgram> newNovaPrograms = listByIds(pids);
        if (newNovaPrograms.isEmpty()) {
            throw new BusinessException("未找到节目");
        }
        newNovaPrograms.forEach(newNovaProgram -> {
            if (SecurityUtils.getClientId() != null) {
                if (!newNovaProgram.getUserId().equals(SecurityUtils.getUserId())) {
                    throw new BusinessException("不能操作不属于你的节目");
                }
            }
            File file = new File(filePathConfig.getOutPutPath() + "/program" + newNovaProgram.getPid());
            deleteFile(file);
        });
        return removeByIds(pids);
    }
    /**
     * .
     * åˆ é™¤æœ¬åœ°æ–‡ä»¶å†…容
     *
     * @param file
     * @return
     */
    public Boolean deleteFile(File file) {
        //判断文件不为null或文件目录存在
        if (file == null || !file.exists()) {
            System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确");
            return false;
        }
        //获取目录下子文件
        File[] files = file.listFiles();
        //遍历该目录下的文件对象
        for (File f : files) {
            //判断子目录是否存在子目录,如果是文件则删除
            if (f.isDirectory()) {
                //递归删除目录下的文件
                deleteFile(f);
            } else {
                //文件删除
                f.delete();
                //打印文件名
                System.out.println("文件名:" + f.getName());
            }
        }
        //文件夹删除
        file.delete();
        System.out.println("目录名:" + file.getName());
        return true;
    }
    /**
     * èŠ‚ç›®è¯¦æƒ…
     *
     * @param id
     * @return
     */
    public NewNovaProgram programInfo(Long id) {
        NewNovaProgram byId = getById(id);
        if (byId == null) {
            throw new BusinessException("未找到节目 ! ");
        }
        List<NewNovaProFileRelation> fileRelations = fileRelationService.list(Wrappers.lambdaQuery(NewNovaProFileRelation.class).eq(NewNovaProFileRelation::getNewNovaProgramId, id));
        if (!fileRelations.isEmpty()) {
            List<Long> fileIds = fileRelations.stream().map(NewNovaProFileRelation::getNewNovaFileId).collect(Collectors.toList());
            List<NewNovaFile> newNovaFiles = fileService.listByIds(fileIds);
            List<String> fileUrls = new ArrayList<>();
            NovaFileConfig config = SpringContextHolder.getBean(NovaFileConfig.class);
            for (NewNovaFile newNovaFile : newNovaFiles) {
                fileUrls.add(config.getFileUrl() + newNovaFile.getFileUrl());
            }
            byId.setFiles(fileUrls);
        }
        byId.setPageInfo(JSON.parseObject(byId.getPageInfoJsonStr(), List.class));
        return byId;
    }
    public List<NewNovaProgramBo> listProgram(BaseConditionVO baseConditionVO, String keyword) {
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        List<NewNovaProgramBo> list = baseMapper.listProgram(keyword, SecurityUtils.getClientId());
        return list;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/NovaAPIUtil.java
@@ -3,8 +3,9 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.config.NovaFileConfig;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.newnova.conf.FilePathConfig;
import com.sandu.ximon.admin.newnova.conf.ProgramPathConfig;
import com.sandu.ximon.admin.newnova.param.NewNovaStatusParam;
import com.sandu.ximon.admin.newnova.param.ProgramPrarm;
import com.sandu.ximon.admin.newnova.vo.*;
@@ -12,7 +13,9 @@
import com.sandu.ximon.dao.bo.NewNovaInfoBo;
import com.sandu.ximon.dao.domain.NewNovaLed;
import com.sun.jna.Native;
import org.joda.time.DateTime;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
@@ -28,7 +31,7 @@
public class NovaAPIUtil {
    private FilePathConfig filePathConfig;
    private ProgramPathConfig filePathConfig;
    private Map<String, Boolean> loginSn = new HashMap();
@@ -39,7 +42,7 @@
    private static String loginInfo = null;
    private NovaAPIUtil() {
        filePathConfig = SpringContextHolder.getBean(FilePathConfig.class);
        filePathConfig = SpringContextHolder.getBean(ProgramPathConfig.class);
        String rootDir = filePathConfig.getOutPutPath();
        instance = (ViplexCore) Native.loadLibrary(filePathConfig.getStringPath(), ViplexCore.class);
        System.setProperty("jna.encoding", "UTF-8");
@@ -51,7 +54,7 @@
        System.out.println(instance.nvInit(rootDir, companyInfo));
//        login("MZVA51930N2113017308");//todo æ‰‹åŠ¨ç™»å½•è¿˜æ˜¯è‡ªåŠ¨ç™»å½•
//        login("MZVA51930N2113017308");
    }
    public static NovaAPIUtil getInstanceUtil() {
@@ -67,8 +70,14 @@
    /**
     * ç™»å½•
     * loginType
     * 0:登陆到屏体管理
     * 1:登陆到系统设置(暗门登录)
     * 2:登陆到诊断模块
     * 3:LCT登录
     * 5:公网SDK登录
     */
    public StatusVO login(String sn) {
    public StatusVO login(String sn, Integer loginType) {
        StatusVO searchVO = new StatusVO();
        System.out.println("ViplexCore Demo nvSearchTerminalAsync(搜索) begin... ");
@@ -87,7 +96,7 @@
            }
        });
        try {
            countDownLatch1.await();
            countDownLatch1.await(10000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
@@ -95,15 +104,19 @@
        if (loginSn.get(sn) != null && loginSn.get(sn)) {
            return new StatusVO(0);
        }
        if (!loginInfo.contains(String.format("\"sn\":\"%s\",", sn))) {
        if (loginInfo == null) {
            return new StatusVO(10086);
        }
        if (!loginInfo.contains(String.format("\"sn\":\"%s\",", sn)) && loginType == 0) {
            //未搜索到屏幕  ç™»å½•不成功
            System.out.println("loginType : " + loginType);
            return new StatusVO(10086);
        }
        StatusVO statusVO = new StatusVO();
        System.out.println("ViplexCore Demo nvLoginAsync(登录) begin... ");
        String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":0,\"password\":\"123456\",\"loginType\":0}", sn);
        String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":0,\"password\":\"123456\",\"loginType\":" + loginType + "}", sn);
        CountDownLatch countDownLatch2 = new CountDownLatch(1);
        instance.nvLoginAsync(loginParam, new ViplexCore.CallBack() {
@@ -112,8 +125,8 @@
            public void dataCallBack(int code, String data) {
                statusVO.setStatusCode(code);
                statusVO.setStatusData(data);
                System.out.println("\nViplexCore Demo code:" + code);
                System.out.println("\nViplexCore Demo data:" + data);
                System.out.println("\nViplexCore ç™»å½• code:" + code);
                System.out.println("\nViplexCore ç™»å½• data:" + data);
                countDownLatch2.countDown();
            }
@@ -180,6 +193,7 @@
        System.out.println("ViplexCore Demo nvSetPageProgramAsync(编辑节目) begin... ");
        StatusVO statusVO = new StatusVO();
        CountDownLatch countDownLatch = new CountDownLatch(1);
        System.out.println("editProgram: " + JSON.toJSONString(programInfoVO));
        instance.nvSetPageProgramAsync(JSON.toJSONString(programInfoVO), new ViplexCore.CallBack() {
            @Override
            public void dataCallBack(int code, String data) {
@@ -199,6 +213,42 @@
        return statusVO;
    }
    /**
     * åˆ¶ä½œå¤šé¡µèŠ‚ç›®
     *
     * @param pageInfo
     * @return
     */
    public StatusVO editPrograms(int pid, List<Map> pageInfo) {
        ProgramsInfoVO programInfoVO = new ProgramsInfoVO();
        programInfoVO.setProgramID(pid);
        programInfoVO.setSceneItems(pageInfo);
        System.out.println("ViplexCore Demo nvSetPageProgramAsync(编辑节目) begin... ");
        StatusVO statusVO = new StatusVO();
        CountDownLatch countDownLatch = new CountDownLatch(1);
        System.out.println("editProgram: " + JSON.toJSONString(programInfoVO));
        instance.nvSetPageProgramsAsync(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;
    }
    /**
@@ -243,15 +293,16 @@
    public List<TrasfromStatusVO> trasfromProgram(ProgramPrarm pageInfo) {
        TransfromProgramVO transfromProgramVO = new TransfromProgramVO();
        transfromProgramVO.setProgramName("节目01");
        transfromProgramVO.setProgramName(pageInfo.getProgramMsg().getName());
        //设置节目内容
        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);
//        Map<String, String> mediasPath = new HashMap();
//        mediasPath.put("C:/Users/Administrator/Desktop/novaWin/demo/java/test.png", "test.png");
//        sendProgramFilePaths.setMediasPath(mediasPath);
        sendProgramFilePaths.setMediasPath(pageInfo.getFileMap());
        transfromProgramVO.setSendProgramFilePaths(sendProgramFilePaths);
        //节目标识
@@ -277,10 +328,16 @@
                    }
                    transfromProgramVO.setSn(sn);
                    System.out.println(transfromProgramVO);
                    StatusVO login = login(sn, 0);
                    //推送结果
                    TrasfromStatusVO trasfromStatusVO = new TrasfromStatusVO();
                    trasfromStatusVO.setSn(sn);
                    if (login.getStatusCode() != 0) {
                        trasfromStatusVO.setStatusCode(login.getStatusCode());
                        trasfromStatusVO.setStatusData(login.getStatusData());
                        return;
                    }
                    System.out.println("program: " + JSON.toJSONString(transfromProgramVO));
                    instance.nvStartTransferProgramAsync(JSON.toJSONString(transfromProgramVO), new ViplexCore.CallBack() {
                        @Override
                        public void dataCallBack(int code, String data) {
@@ -316,12 +373,17 @@
        return svoList;
    }
    /**
     * æŸ¥è¯¢åœ¨çº¿çŠ¶æ€
     *
     * @return
     */
    public List<NewNovaLed> getOnlineStatus(List<NewNovaLed> newNovaListBos) {
    public List<NewNovaLed> getOnlineStatus(List<NewNovaLed> newNovaListBos, boolean onlineStatus) {
        List<NewNovaLed> online = new ArrayList<>();
        //设置开关屏状态
        newNovaListBos.forEach(led -> {
            //获取信息之前先登录
@@ -329,11 +391,12 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    StatusVO login = login(led.getSn());
                    StatusVO login = login(led.getSn(), 0);
                    if (login.getStatusCode() == 0) {
                        //登陆成功 è®¾ç½®ä¸ºåœ¨çº¿
                        led.setIsOnline(1);
                        led.setOnlineSign(1);
                        online.add(led);
                    } else {
                        led.setIsOnline(0);
                    }
@@ -346,6 +409,9 @@
                throw new RuntimeException(e);
            }
        });
        if (onlineStatus) {
            return online;
        }
        return newNovaListBos;
    }
@@ -356,7 +422,7 @@
    public NewNovaLed getInfo(NewNovaLed led) {
        System.out.println("ViplexCore Demo nvGetProductInfoAsync(获取屏幕信息) begin... ");
        StatusVO login = login(led.getSn());
        StatusVO login = login(led.getSn(), 0);
        StatusVO result = new StatusVO();
        if (login.getStatusCode() == 0) {
@@ -393,7 +459,6 @@
        }
        NewNovaInfoBo newNovaInfoBo = JSON.parseObject(result.getStatusData(), NewNovaInfoBo.class);
        led.setInfo(newNovaInfoBo);
        System.out.println(JSON.toJSONString(led.getInfo()) + "--------");
        return led;
    }
@@ -437,6 +502,52 @@
        return newNovaLsit;
    }
    /**
     * è®¾ç½®å¼€å…³å±
     */
    public boolean setPowerStatus(NewNovaStatusParam param) {
        System.out.println("ViplexCore Demo nvSetScreenPowerStateAsync(设置屏幕开关) begin... ");
        CountDownLatch countDownLatch = new CountDownLatch(1);
        StatusVO login = login(param.getSn(), 0);
        String status = "CLOSE";
        if (param.getPowerStatus() == 1) {
            status = "OPEN";
        }
        if (login.getStatusCode() == 0) {
            String jsonStr = "{\n" +
                    "  \"sn\":\"" + param.getSn() + "\",\n" +
                    "  \"taskInfo\":{\n" +
                    "    \"state\":\"" + status + "\"\n" +
                    "  }\n" +
                    "}";
            instance.nvSetScreenPowerStateAsync(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;
        }
    }
    /**
     * èŽ·å–éŸ³é‡
@@ -486,11 +597,11 @@
        System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(Volume) begin... ");
        CountDownLatch countDownLatch = new CountDownLatch(1);
        StatusVO login = login(param.getSn());
        StatusVO login = login(param.getSn(), 0);
        if (login.getStatusCode() == 0) {
            String jsonStr = "{\n" +
                    "  \"sn\":\"" + param.getSn() + "\",\n" +
                    "  \"screenBrightnessInfo\":{\n" +
                    "  \"volumeInfo\":{\n" +
                    "    \"ratio\":" + param.getVolume() + "\n" +
                    "  }\n" +
                    "}";
@@ -568,7 +679,7 @@
        System.out.println("ViplexCore Demo nvSetScreenBrightnessAsync(设置亮度) begin... ");
        CountDownLatch countDownLatch = new CountDownLatch(1);
        StatusVO login = login(param.getSn());
        StatusVO login = login(param.getSn(), 0);
        if (login.getStatusCode() == 0) {
            String jsonStr = "{\n" +
                    "  \"sn\":\"" + param.getSn() + "\",\n" +
@@ -620,10 +731,15 @@
                        @Override
                        public void dataCallBack(int code, String data) {
                            System.out.println("\nViplexCore èŽ·å–äº®åº¦ code:" + code);
                            System.out.println("\nViplexCore èŽ·å–äº®åº¦ data:" + data);
                            System.out.println("\nViplexCore èŽ·å–åŒæ­¥ code:" + code);
                            System.out.println("\nViplexCore èŽ·å–åŒæ­¥ data:" + data);
                            if (code == 0) {
                                newNova.setSync(1);
                                boolean enable = (boolean) JSON.parseObject(data, Map.class).get("enable");
                                if (enable) {
                                    newNova.setSync(1);
                                }
                            } else {
                                newNova.setSync(-1);
                            }
                            countDownLatch.countDown();
                        }
@@ -656,11 +772,15 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //推送结果
                    instance.nvSetSyncPlayAsync("{\n" +
                    login(newNova.getSn(), 0);
                    String str = "{\n" +
                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
                            "  \"enable\":" + param.isSync() + "\n" +
                            "}", new ViplexCore.CallBack() {
                            "}";
                    System.out.println("str : " + str);
                    //推送结果
                    instance.nvSetSyncPlayAsync(str, new ViplexCore.CallBack() {
                        @Override
                        public void dataCallBack(int code, String data) {
@@ -695,52 +815,59 @@
            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() {
                    CountDownLatch countDownLatch = new CountDownLatch(1);
                    new Thread(new Runnable() {
                        @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);
                        public void run() {
                            StatusVO login = login(newNova.getSn(), 1);
                            if (login.getStatusCode() != 0) {
                                countDownLatch.countDown();
                                return;
                            }
                            countDownLatch.countDown();
                        }
                    });
                            //推送结果
                            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);
                    }
                    login(newNova.getSn(), 0);
                }
            }).start();
            try {
                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        );
        return param.getNovaList();
    }
@@ -761,9 +888,9 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //推送结果
                    instance.nvSetNetTimingInfoAsync("{\n" +
                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
//                    login(newNova.getSn(), 0);
                    String ntpStr="{\n" +
                            "  \"sn\":\""+newNova.getSn()+"\",\n" +
                            "  \"TimingInfo\":{\n" +
                            "    \"source\":{\n" +
                            "      \"type\":1,\n" +
@@ -774,19 +901,25 @@
                            "        \"type\":\"NTP_CONFIG\",\n" +
                            "        \"action\":4,\n" +
                            "        \"data\":{\n" +
                            "          \"enable\":" + param.isNtp() + ",\n" +
                            "          \"server\":\"http://ntpsss.net\"\n" +
                            "          \"enable\":"+param.isNtp()+",\n" +
                            "          \"server\":\"http://ntp1.aliyun.com\"\n" +
                            "        }\n" +
                            "      }\n" +
                            "    ]\n" +
                            "  }\n" +
                            "}", new ViplexCore.CallBack() {
                            "}";
                    System.out.println("ntpStr"+ ntpStr);
                    //推送结果
                    instance.nvSetNetTimingInfoAsync(ntpStr, 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) {
                            System.out.println("\nViplexCore ntp code:" + code);
                            System.out.println("\n时间 ntp :" + DateTime.now());
                            System.out.println("\nViplexCore ntp data:" + data);
                            if (code == 0 && data.contains("\"status\":1")) {
                                System.out.println("results: " + data.contains("\"status\":1"));
                                newNova.setStatus(true);
                            }
                            countDownLatch.countDown();
@@ -805,4 +938,61 @@
        return param.getNovaList();
    }
    /**
     * æˆªå±
     */
    public List<NewNovaStatusParam.NovascreenShotDTO> screenShot(NewNovaStatusParam param) {
        System.out.println("ViplexCore Demo nvDownLoadScreenshotAsync(截屏) begin... ");
        NovaFileConfig config = SpringContextHolder.getBean(NovaFileConfig.class);
        String shotPath = config.getScreenShotPath();
        param.getScreenShotList().forEach(newNova -> {
            CountDownLatch countDownLatch = new CountDownLatch(1);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    login(newNova.getSn(), 0);
                    String pictureName = newNova.getSn() + ".png";
                    String str = "{\n" +
                            "  \"sn\":\"" + newNova.getSn() + "\",\n" +
                            "  \"width\":400,\n" +
                            "  \"height\":400,\n" +
                            "  \"downLoadDirectoryPath\":\"" + shotPath.replace(File.separator, "/") + "\",\n" +
                            "  \"pictureName\":\"" + pictureName + "\",\n" +
                            "  \"pictureType\":0\n" +
                            "}";
                    System.out.println("str" + str);
                    //推送结果
                    instance.nvDownLoadScreenshotAsync(str, new ViplexCore.CallBack() {
                        @Override
                        public void dataCallBack(int code, String data) {
                            System.out.println("\nViplexCore æˆªå± code:" + code);
                            System.out.println("\nViplexCore æˆªå± data:" + data);
                            newNova.setCode(code);
                            if (code == 0) {
                                String img = config.getScreenShotPath() + pictureName;
                                newNova.setScreenShot(config.getFileUrl() + img.replace(config.getUploadRootPath(), "").replace(File.separator, "/"));
                            } else {
                                newNova.setScreenShot(data);
                            }
                            countDownLatch.countDown();
                        }
                    });
                }
            }).start();
            try {
                countDownLatch.await(30000, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        return param.getScreenShotList();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/AirDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.sandu.ximon.admin.newnova.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/18
 */
@NoArgsConstructor
@Data
public class AirDataVO {
    private String name;
    private List<WidgetContainersDTO> widgetContainers;
    @NoArgsConstructor
    @Data
    public static class WidgetContainersDTO {
        private ContentsDTO contents;
        private Integer id;
        private String name;
        @NoArgsConstructor
        @Data
        public static class ContentsDTO {
            private List<WidgetsDTO> widgets;
            @NoArgsConstructor
            @Data
            public static class WidgetsDTO {
                private List<ConstraintsDTO> constraints;
                private Integer duration;
                private MetadataDTO metadata;
                private String name;
                private String type;
                @NoArgsConstructor
                @Data
                public static class MetadataDTO {
                    @JsonProperty("content")
                    private ContentDTO content;
                    @NoArgsConstructor
                    @Data
                    public static class ContentDTO {
                        private Boolean autoPaging;
                        private BackgroundMusicDTO backgroundMusic;
                        private DisplayStyleDTO displayStyle;
                        private List<ParagraphsDTO> paragraphs;
                        private List<TextAttributesDTO> textAttributes;
                        @NoArgsConstructor
                        @Data
                        public static class BackgroundMusicDTO {
                            private Integer duration;
                            private Boolean isTextSync;
                        }
                        @NoArgsConstructor
                        @Data
                        public static class DisplayStyleDTO {
                            private ScrollAttributesDTO scrollAttributes;
                            private String type;
                            @NoArgsConstructor
                            @Data
                            public static class ScrollAttributesDTO {
                                private EffectsDTO effects;
                                @NoArgsConstructor
                                @Data
                                public static class EffectsDTO {
                                    private String animation;
                                    private Integer speed;
                                }
                            }
                        }
                        @NoArgsConstructor
                        @Data
                        public static class ParagraphsDTO {
                            private String backgroundColor;
                            private String horizontalAlignment;
                            private Integer letterSpacing;
                            private Integer lineSpacing;
                            private List<LinesDTO> lines;
                            private String verticalAlignment;
                            @NoArgsConstructor
                            @Data
                            public static class LinesDTO {
                                private List<SegsDTO> segs;
                                @NoArgsConstructor
                                @Data
                                public static class SegsDTO {
                                    private String content;
                                }
                            }
                        }
                        @NoArgsConstructor
                        @Data
                        public static class TextAttributesDTO {
                            private String backgroundColor;
                            private AttributesDTO attributes;
                            @NoArgsConstructor
                            @Data
                            public static class AttributesDTO {
                                private FontDTO font;
                                private Integer letterSpacing;
                                private String textColor;
                                @NoArgsConstructor
                                @Data
                                public static class FontDTO {
                                    private List<String> family;
                                    private Boolean isUnderline;
                                    private Integer size;
                                    private String style;
                                }
                            }
                        }
                    }
                }
                @NoArgsConstructor
                @Data
                public static class ConstraintsDTO {
                    private List<String> cron;
                    private String endTime;
                    private String startTime;
                }
            }
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/ProgramsInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.sandu.ximon.admin.newnova.vo;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
 * @author LiuHaoNan
 * @date 2022/11/18
 */
@Data
public class ProgramsInfoVO {
    /**
     * èŠ‚ç›®id(创建节目返回的id)
     */
    private int programID;
    /**
     * pageId(当前版本pageId为1)
     */
    private int pageID = 1;
    /**
     * åœºæ™¯åˆ—表,一个场景包含一个播放页面,多个场景对应多个播放页面
     */
    private List<Map> sceneItems;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/vo/TransfromProgramVO.java
@@ -3,6 +3,7 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.Map;
/**
@@ -67,7 +68,7 @@
        /**
         * {媒体路径 : åª’体名称}(仅本地图片,视频,GIF文件需要次路径)
         */
        private Map<String, String> mediasPath;
        private Map<String, String> mediasPath = new HashMap<>();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java
@@ -5,6 +5,7 @@
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.newnova.led.NewNovaLedService;
import com.sandu.ximon.admin.param.PoleBindingParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.domain.*;
@@ -97,6 +98,9 @@
            case PoleBindingEnums.ATMOSPHERIC_NONG_GENG:
                size = SpringContextHolder.getBean(AirEquipmentNongGengService.class).list(Wrappers.lambdaQuery(AirEquipmentNongGeng.class).eq(AirEquipmentNongGeng::getMac, param.getDeviceCode())).size();
                break;
            case PoleBindingEnums.NEW_NOVA:
                size = SpringContextHolder.getBean(NewNovaLedService.class).list(Wrappers.lambdaQuery(NewNovaLed.class).eq(NewNovaLed::getSn, param.getDeviceCode())).size();
                break;
            default:
                break;
        }
ximon-admin/src/main/resources/application-local.yml
@@ -65,7 +65,7 @@
nova-conf:   #诺瓦回调
nova-conf: #诺瓦回调
  notify-url: http://39.103.154.108:20018/serv/vnnox/progress
  screen-shot-notify-url: http://39.103.154.108:20018/serv/vnnox/screenshot
  status-notify-url: http://39.103.154.108:20018/serv/vnnox/asyncStatus
@@ -86,6 +86,7 @@
new-nova:
  #依赖地址
  string-path: C:\Users\Administrator\Desktop\novaWin\bin\viplexcore.dll
  #节目生成路径
  out-put-path: E:\IdeaProjects\XMPoleManager/temp
new-nova-file:
@@ -94,4 +95,6 @@
    upload-root-path: E:\file\
    storage: local
    #服务器文件前缀
    real-url: http://183.45.76.239:8089/file/
    file-url: http://183.45.76.239:8089/file/
    #诺瓦截屏存放路径   æ–‡ä»¶å¤¹å¿…须存在  ä¸”是服务器文件路径(upload-root-path)下的子文件夹
    screen-shot-path: E:\file\screenShot\