2021与蓝度共同重构项目,服务端
liuhaonan
2022-04-27 c8ce26aac0004e249a0cef35fe15b2ddb280ad25
大气数据推送到LED
已修改13个文件
已添加14个文件
已重命名1个文件
已复制1个文件
713 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/AirDataMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/AirDataMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AirDataController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/AirDataProgram.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerAnimation.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerAnimationType.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerLayout.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerMedia.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerOffline.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerPage.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerProgram.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidget.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetDisplayType.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLine.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLineTextAttributes.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLineTextAttributesFontFamily.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetScrollAttribute.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetScrollAttributeAnimation.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetType.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/test.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirDataService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/LightemitUtils.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
@@ -37,7 +37,7 @@
    private String deviceCode;
    /**
     * è®¾å¤‡ç±»åž‹ï¼Œ0路灯,1诺瓦,2充电桩,3大气监测,4水质监测,5ip音柱,6lcd广告机,7摄像头,8杆体倾测,9一键救助 ,10 ç†™è®¯
     * è®¾å¤‡ç±»åž‹ï¼Œ0路灯,1诺瓦,2充电桩,3大气监测,4水质监测,5ip音柱,6lcd广告机,7摄像头,8杆体倾测,9一键救助 ,10 ç†™è®¯  11大气农耕
     */
    private Integer deviceType;
dao/src/main/java/com/sandu/ximon/dao/mapper/AirDataMapper.java
@@ -19,7 +19,7 @@
    List<AirDataBo> listAirDataByIds(List<Long> airIdList);
    String getCodeByPoleId(Long poleId ,Long userId);
    String getCodeByPoleId(Long poleId ,Long clientId);
}
dao/src/main/resources/mapper/AirDataMapper.xml
@@ -80,10 +80,10 @@
        from pole_binding t1
        left join pole t2 on t1.pole_id = t2.id
        where t1.device_type = 3
        t1.pole_id = #{poleId}
        <if test="userId != null">
        and t1.pole_id = #{poleId}
        <if test="clientId != null">
            AND (t2.user_id = #{clientId} OR t2.client_id = #{clientId})
        </if>
</select>
        </mapper>
    </select>
</mapper>
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AirDataController.java
@@ -2,6 +2,7 @@
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.security.annotation.AnonymousAccess;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.manager.iot.amqp.processor.AirDataProcessor;
import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
@@ -57,6 +58,17 @@
        return ResponseUtil.success(list);
    }
    /**
     * æ ¹æ®ç¯æ†æŸ¥è¯¢å¤§æ°”数据
     * @param
     * @return
     */
    @AnonymousAccess
    @GetMapping("/listAirDataByLamp")
    public ResponseVO<Object> listAirDataByLamp(@RequestParam Long lampId) {
        return ResponseUtil.success(airDataService.getDataByPoleid(lampId));
    }
    @PostMapping("/updateAirEquipmentInfo")
    public ResponseVO<Object> updataAirEquipmentInfo(@RequestBody List<String> listMac) {
        AirDataReqInnerFrame airDataReqInnerFrame = new AirDataReqInnerFrame();
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
@@ -263,4 +263,20 @@
    }
    /**
     * æŽ¨é€å¤§æ°”设备到诺瓦
     */
    @GetMapping("/pushAidDataToNova/{poleId}")
    public ResponseVO<Object> pushAirDataToNova(@PathVariable Long poleId) {
        return ResponseUtil.success(poleService.pushAirDataToNova(poleId));
    }
    /**
     * æŽ¨é€å¤§æ°”设备到熙讯
     */
    @GetMapping("/pushAirDataToXiXun/{poleId}")
    public ResponseVO<Object> pushAirDataToXiXun(@PathVariable Long poleId) {
        return ResponseUtil.success(poleService.pushAirDataToXiXun(poleId));
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/AirDataProgram.java
copy from ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/PlayerProgram.java copy to ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/AirDataProgram.java
Îļþ´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/PlayerProgram.java ¸´ÖÆ
@@ -1,7 +1,8 @@
package com.sandu.ximon.admin.utils.request;
package com.sandu.ximon.admin.dto.nova;
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.admin.dto.SchedulesDTO;
import com.sandu.ximon.admin.utils.request.VnnoxRequest;
import lombok.Data;
import java.util.List;
@@ -9,9 +10,10 @@
/**
 * æ™®é€šèŠ‚ç›®
 * æŽ¨é€å¤§æ°”用
 */
@Data
public class PlayerProgram implements VnnoxRequest {
public class AirDataProgram implements VnnoxRequest {
    //  éœ€è¦å¤„理的播放器ID集合,最多支持100个播放器同时处理
    private List<String> playerIds;
@@ -19,7 +21,7 @@
//    private  List<SchedulesDTO> schedules;
    private  List<SchedulesDTO> schedules;
    //  éœ€è¦æ’­æ”¾çš„页面内容集合
    private  List<Map<String,Object>> pages ;
    private  List pages ;
    //  èŠ‚ç›®ä¸‹è½½è¿›åº¦é€šçŸ¥æŽ¥å£ï¼Œä¼šé€šè¿‡æ­¤æŽ¥å£å°†èŠ‚ç›®çš„ä¸‹è½½è¿›åº¦å‘ç»™å®¢æˆ·ï¼ŒæŽ¥å£çš„å“åº”æ—¶é—´ä¸èƒ½è¶…è¿‡3s
    private String noticeUrl;
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerAnimation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
/**
 * inAnimation å‚æ•°
 */
@Data
public class PlayerAnimation {
    //  ç‰¹æ•ˆçš„类型
    private PlayerAnimationType type;
    //  ç‰¹æ•ˆçš„æŒç»­æ—¶é•¿ï¼Œå•位毫秒
    private Long duration;
    public PlayerAnimation(PlayerAnimationType type, Long durantion) {
        this.type = type;
        this.duration = durantion;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerAnimationType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.sandu.ximon.admin.dto.nova;
public enum  PlayerAnimationType {
    /**
     *     ç‰¹æ•ˆçš„类型
     * NONE-无特效
     * RANDOM-随机特效
     */
    NONE,
    RANDOM
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerLayout.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
@Data
public class PlayerLayout {
    private String x;
    private String y;
    private String width;
    private String height;
    public PlayerLayout(String x,String y,String width,String height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerMedia.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
/**
 *     çª—口的内容
 */
@Data
public class PlayerMedia {
    private Integer zIndex;
    private PlayerWidgetType type;
    private Long size;
    private String md5;
    private Long duration;
    private String url;
    private PlayerAnimation inAnimation;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerOffline.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
@Data
public class PlayerOffline {
    private String url;
    private Long size;
    private String md5;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerPage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
import java.util.List;
@Data
public class PlayerPage {
    //  é¡µé¢åç§°
    private String name;
    //  é¡µé¢ä¸Šçš„组件
    private List<PlayerWidget> widgets;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerProgram.java
ÎļþÃû´Ó ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/PlayerProgram.java ÐÞ¸Ä
@@ -1,7 +1,8 @@
package com.sandu.ximon.admin.utils.request;
package com.sandu.ximon.admin.dto.nova;
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.admin.dto.SchedulesDTO;
import com.sandu.ximon.admin.utils.request.VnnoxRequest;
import lombok.Data;
import java.util.List;
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidget.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
package com.sandu.ximon.admin.dto.nova;
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.dao.domain.LEDProgramFile;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class PlayerWidget {
    //  ç»„件名称,用于日志查询使用,若不填写,日志查询时很难区分
    private String name;
    //  ç»„件类型
    //PICTURE - å›¾ç‰‡
    //VIDEO-视频
    //ARCH_TEXT- æ–‡æœ¬
    //SIMPLE_RSS - rss媒体
    //HTML - ç½‘页媒体
    //STREAM_MEDIA - æµåª’体
    //BOX - çª—口
    private PlayerWidgetType type;
    //  å›¾ç‰‡å’Œè§†é¢‘为必填项,内容为图片或视频的md5值
    private String md5;
    //  å›¾ç‰‡æˆ–视频的大小byte
    private PlayerWidgetDisplayType displayType;
    //    æ–‡å­—整体背景颜色,#00000000代表透明色
    private String backgroundColor;
    //  å½“播放方式为“滚动”时必填
    private PlayerWidgetScrollAttribute scrollAttribute;
    //  å¤šè¡Œæ–‡å­—显示集合
    private List<PlayerWidgetLine> lines;
    //  å›¾ç‰‡æˆ–视频的大小byte
    private Long size;
    //  ç»„件的播放时长,精确到毫秒
    private Long duration;
    //  å›¾ç‰‡\视频\rss\网页媒体\流媒体的访问地址, éœ€è¦è‡ªè¡ŒéªŒè¯åœ°å€çš„æœ‰æ•ˆæ€§
    private String url;
    //  ç»„件的上下覆盖顺序,数字越大图层越往上,默认0
    private Integer zIndex;
    //  ç»„件在页面的位置
    private PlayerLayout layout;
    //  ç»„件的入场特效,默认无特效
    private PlayerAnimation inAnimation;
    //  çª—口的内容,类型为窗口时必填,参考Widget的属性,也可以参考下面的示例
    private List<PlayerMedia> mediaList;
    //  html组件离线播放媒体(定制功能)
    private PlayerOffline offline;
    public PlayerWidget generateMediaWidget (String widgetName,
             Integer zIndex,
             PlayerWidgetType playerWidgetType,
             LEDProgramFile file,
             PlayerLayout playerLayout,
             PlayerAnimation animation) {
        this.setName(widgetName);
        this.setZIndex(zIndex);
        this.setType(playerWidgetType);
        this.setSize(Long.getLong(file.getSize()));
        this.setMd5(file.getMd5());
        this.setDuration(VnnoxConstant.REDIS_MAX_SAVE_TIME);
        this.setUrl(file.getFileUrl());
        this.setLayout(playerLayout);
        this.setInAnimation(animation);
        return this;
    }
    public PlayerWidget generateScrollUpTextWidget (String widgetName,
                                         Integer zIndex,
                                         Long duration,
                                         List<String> content,
                                         String contentColor,
                                         Integer fontSize,
                                         PlayerLayout playerLayout) {
        this.setName(widgetName);
        this.setZIndex(zIndex);
        this.setType(PlayerWidgetType.ARCH_TEXT);
        this.setDisplayType(PlayerWidgetDisplayType.SCROLL);
        this.setBackgroundColor("#00000000");
        this.setScrollAttribute(
                new PlayerWidgetScrollAttribute(
                        PlayerWidgetScrollAttributeAnimation.MARQUEE_UP,1
                )
        );
        this.setDuration(duration);
        List<PlayerWidgetLine> playerWidgetLineList = new ArrayList<>();
        for(String str: content) {
            PlayerWidgetLine playerWidgetLine = new PlayerWidgetLine();
            List<PlayerWidgetLineTextAttributes> playerWidgetLineTextAttributesList =
                    new ArrayList<>();
            PlayerWidgetLineTextAttributes playerWidgetLineTextAttributes =
                    new PlayerWidgetLineTextAttributes();
            playerWidgetLineTextAttributes.setContent(str);
            playerWidgetLineTextAttributes.setTextColor(contentColor);  //  "#337FE5"
            playerWidgetLineTextAttributes.setFontSize(fontSize);
            playerWidgetLineTextAttributes.setBold(true);
            playerWidgetLineTextAttributes.setUnderline(false);
            playerWidgetLineTextAttributesList.add(playerWidgetLineTextAttributes);
            playerWidgetLine.setTextAttributes(playerWidgetLineTextAttributesList);
            playerWidgetLineList.add(playerWidgetLine);
        }
        this.setLines(playerWidgetLineList);
        this.setLayout(playerLayout);
        return this;
    }
    public PlayerWidget generateLeftScrollTextWidget(
            String widgetName,
            Integer zIndex,
            Long duration,
            String content,
            String contentColor,
            Integer fontSize,
            PlayerLayout playerLayout
    ) {
        this.setName(widgetName);
        this.setZIndex(zIndex);
        this.setType(PlayerWidgetType.ARCH_TEXT);
        this.setDisplayType(PlayerWidgetDisplayType.SCROLL);
        this.setBackgroundColor("#00000000");
        this.setScrollAttribute(
                new PlayerWidgetScrollAttribute(
                        PlayerWidgetScrollAttributeAnimation.MARQUEE_LEFT,2
                )
        );
        this.setDuration(duration);
        List<PlayerWidgetLine> playerWidgetLineList = new ArrayList<>();
        List<PlayerWidgetLineTextAttributes> playerWidgetLineTextAttributesList =
                new ArrayList<>();
        PlayerWidgetLine playerWidgetLine = new PlayerWidgetLine();
        PlayerWidgetLineTextAttributes playerWidgetLineTextAttributes =
                new PlayerWidgetLineTextAttributes();
        playerWidgetLineTextAttributes.setContent(content);
        playerWidgetLineTextAttributes.setTextColor(contentColor);  //  "#337FE5"
        playerWidgetLineTextAttributes.setFontSize(fontSize);
        playerWidgetLineTextAttributes.setBold(true);
        playerWidgetLineTextAttributesList.add(playerWidgetLineTextAttributes);
        playerWidgetLine.setTextAttributes(playerWidgetLineTextAttributesList);
        playerWidgetLineList.add(playerWidgetLine);
        this.setLines(playerWidgetLineList);
        this.setLayout(playerLayout);
        return this;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetDisplayType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.dto.nova;
public enum  PlayerWidgetDisplayType {
    /**
     * æ’­æ”¾æ–¹å¼
     * PAGE_SWITCH - ç¿»é¡µ
     * SCROLL - æ»šåЍ
     * STATIC -静止(若文字内容大于屏幕,仅显示第一屏)
     */
    PAGE_SWITCH,
    SCROLL,
    STATIC
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLine.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
import java.util.List;
@Data
public class PlayerWidgetLine {
    private List<PlayerWidgetLineTextAttributes> textAttributes;
    public PlayerWidgetLine(){
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLineTextAttributes.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.sandu.ximon.admin.dto.nova;
import lombok.Data;
@Data
public class PlayerWidgetLineTextAttributes {
    private String content;
    private Integer fontSize;
    private String textColor;
    private boolean isBold;
    private PlayerWidgetLineTextAttributesFontFamily fontFamily;
    private boolean isUnderline;
    private String backgroundColor;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetLineTextAttributesFontFamily.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.sandu.ximon.admin.dto.nova;
public enum PlayerWidgetLineTextAttributesFontFamily {
    /***
     * æ–‡å­—字体(默认:Arial),播放器支持的字体:
     * SimSun - å®‹ä½“
     * Microsoft YaHei - å¾®è½¯é›…黑
     * KaiTi - æ¥·ä½“
     * Arial - Arial字体
     * Wingdings2
     * Calibri
     */
    SimSun,
    Microsoft,
    KaiTi,
    Arial,
    Wingdings2,
    Calibri
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetScrollAttribute.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.sandu.ximon.admin.dto.nova;
public class PlayerWidgetScrollAttribute {
    private PlayerWidgetScrollAttributeAnimation animation;
    private Integer speed;
    private boolean isHeadTail;
    public PlayerWidgetScrollAttribute(PlayerWidgetScrollAttributeAnimation attributeAnimation, Integer speed) {
        this.animation = attributeAnimation;
        this.speed = speed;
        setHeadTail(true);
    }
    public boolean isHeadTail() {
        return isHeadTail;
    }
    public void setHeadTail(boolean isHeadTail) {
        this.isHeadTail = isHeadTail;
    }
    public PlayerWidgetScrollAttributeAnimation getAnimation() {
        return animation;
    }
    public void setAnimation(PlayerWidgetScrollAttributeAnimation animation) {
        this.animation = animation;
    }
    public Integer getSpeed() {
        return speed;
    }
    public void setSpeed(Integer speed) {
        this.speed = speed;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetScrollAttributeAnimation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.sandu.ximon.admin.dto.nova;
public enum PlayerWidgetScrollAttributeAnimation {
    /**
     * æ»šåŠ¨æ–¹å‘
     * MARQUEE_LEFT -向左滚动
     * MARQUEE_UP -向上滚动
     */
    MARQUEE_LEFT,
    MARQUEE_UP
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/PlayerWidgetType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.sandu.ximon.admin.dto.nova;
public enum PlayerWidgetType {
    /**
     * ç»„件类型
     * PICTURE - å›¾ç‰‡
     * VIDEO-视频
     * ARCH_TEXT- æ–‡æœ¬
     * SIMPLE_RSS - rss媒体
     * HTML - ç½‘页媒体
     * STREAM_MEDIA - æµåª’体
     * BOX - çª—口
     */
    PICTURE,
    VIDEO,
    ARCH_TEXT,
    SIMPLE_RSS,
    HTML,
    STREAM_MEDIA,
    BOX
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/test.java
@@ -4,6 +4,7 @@
import org.springframework.security.crypto.password.PasswordEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
 * @Author liuhaonan
@@ -12,20 +13,29 @@
 */
public class test {
    public static void main(String[] args) {
        String s="123456";//$2a$10$t0t9gaLuWT/1XFDfbjbUueWcj2G/Dx5vQCrtyRKWNlqkz6C/y.oXK
        PasswordEncoder pw= new BCryptPasswordEncoder();
        //加密
        String encode=pw.encode(s);
        System.out.println(encode);
        //比较密码
        boolean matches=pw.matches(s,encode);
        System.out.println("==============================");
        System.out.println(matches);
 //       LocalDateTime now = LocalDateTime.now();
//        Integer week = now.getDayOfWeek().getValue();
//        System.out.println("获取当前周:" + week);
//
//        String s="123456";//$2a$10$t0t9gaLuWT/1XFDfbjbUueWcj2G/Dx5vQCrtyRKWNlqkz6C/y.oXK
//        PasswordEncoder pw= new BCryptPasswordEncoder();
//        //加密
//        String encode=pw.encode(s);
//        System.out.println(encode);
//        //比较密码
//        boolean matches=pw.matches(s,encode);
//        System.out.println("==============================");
//        System.out.println(matches);
//
// //       LocalDateTime now = LocalDateTime.now();
////        Integer week = now.getDayOfWeek().getValue();
////        System.out.println("获取当前周:" + week);
////
        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        /**
         * æ—¶é—´å­—符串转为LocalDateTime
         */
        LocalDateTime parse = LocalDateTime.parse(format, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(parse);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirDataService.java
@@ -80,7 +80,7 @@
     * +
     * æ ¹æ®ç¯æ†id查询大气数据
     */
    public A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage listAirDataByLightPoleId(Long poleId) {
    public A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage getDataByPoleid(Long poleId) {
        String code;
        if (SecurityUtils.getClientId() != null) {
            code = baseMapper.getCodeByPoleId(poleId, SecurityUtils.getUserId());
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java
@@ -11,14 +11,13 @@
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.VnnoxAPIUtil;
import com.sandu.ximon.admin.utils.VnnoxProgramAPIUtil;
import com.sandu.ximon.admin.utils.request.PlayerProgram;
import com.sandu.ximon.admin.dto.nova.PlayerProgram;
import com.sandu.ximon.admin.utils.response.VnnoxResult;
import com.sandu.ximon.admin.utils.response.VnnoxResultResponse;
import com.sandu.ximon.admin.vo.NovaOpenVO;
import com.sandu.ximon.admin.vo.NovaPushResultVO;
import com.sandu.ximon.admin.vo.PlansVO;
import com.sandu.ximon.dao.domain.LEDProgram;
import com.sandu.ximon.dao.domain.LedPlayerEntity;
import com.sandu.ximon.dao.domain.PlayPlanNv;
import com.sandu.ximon.dao.domain.PushToLed;
import com.sandu.ximon.dao.mapper.PlayPlanNvMapper;
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -17,6 +17,7 @@
import com.sandu.ximon.admin.manager.iot.frame.A1Frame;
import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A1TernaryCodeReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightResetReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.EmptyRequestInnerFrame;
@@ -30,10 +31,10 @@
import com.sandu.ximon.admin.redis.LightKey;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.response.VnnoxResult;
import com.sandu.ximon.admin.vo.PoleBindVO;
import com.sandu.ximon.dao.bo.*;
import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.mapper.MonitorMapper;
import com.sandu.ximon.dao.mapper.PoleMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -866,4 +867,51 @@
        return poleMapper.updateDeviceCode(poleId);
    }
    /**
     * æŽ¨é€å¤§æ°”监测数据到novaLED
     */
    public boolean pushAirDataToXiXun(Long poleId) {
        Pole pole = getById(poleId);
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3));
        PoleBinding xixun = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 10));
        if (pole == null) {
            throw new BusinessException("灯杆不存在");
        }
        if (air == null) {
            throw new BusinessException("未绑定大气监测设备");
        }
        if (xixun == null) {
            throw new BusinessException("未绑定xixun设备");
        }
        //获取大气监测数据
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId);
        //推送数据
        return SpringContextHolder.getBean(XiXunPlayerService.class).pushWeather(xixun.getDeviceCode(), data, pole);
    }
    /**
     * æŽ¨é€å¤§æ°”监测数据到novaLED
     */
    public VnnoxResult pushAirDataToNova(Long poleId) {
        Pole pole = getById(poleId);
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 3));
        PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, poleId).eq(PoleBinding::getDeviceType, 1));
        LedPlayerEntity LED = SpringContextHolder.getBean(LedPlayerEntityService.class).getOne(Wrappers.lambdaQuery(LedPlayerEntity.class).eq(LedPlayerEntity::getSn, nova.getDeviceCode()));
        if (pole == null) {
            throw new BusinessException("灯杆不存在");
        }
        if (air == null) {
            throw new BusinessException("未绑定大气监测设备");
        }
        if (nova == null) {
            throw new BusinessException("未绑定nova设备");
        }
        //获取大气监测数据
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(poleId);
        //推送数据
        return SpringContextHolder.getBean(VnnoxService.class).publishWaterData(LED.getPlayerId(), data);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java
@@ -2,8 +2,14 @@
import com.sandu.common.execption.BusinessException;
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.admin.dto.nova.AirDataProgram;
import com.sandu.ximon.admin.dto.nova.PlayerLayout;
import com.sandu.ximon.admin.dto.nova.PlayerPage;
import com.sandu.ximon.admin.dto.nova.PlayerWidget;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.VnnoxAPIUtil;
import com.sandu.ximon.admin.utils.VnnoxProgramAPIUtil;
import com.sandu.ximon.admin.utils.request.VnnoxScreenStatusType;
import com.sandu.ximon.admin.utils.response.VnnoxPlayerListResponse;
import com.sandu.ximon.admin.utils.response.VnnoxPlayerResponse;
@@ -16,10 +22,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.net.URISyntaxException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -37,6 +40,8 @@
    private RedisUtils redisUtils;
    // @Autowired
    private LedPlayerEntityService ledPlayerEntityService;
    // @Autowired
    private VnnoxProgramAPIUtil vnnoxProgramAPIUtil;
    /**
     * è®¾å¤‡æ ¡éªŒæ³¨å†Œ
@@ -200,20 +205,22 @@
    /**
     * åŒæ­¥æ’­æ”¾
     *
     * @param
     * @return
     */
    public VnnoxResult syncPlay(List<String> playerList,Integer option) {
        return vnnoxAPIUtil.syncPlay(playerList,option);
    public VnnoxResult syncPlay(List<String> playerList, Integer option) {
        return vnnoxAPIUtil.syncPlay(playerList, option);
    }
    /**
     * å¯¹æ—¶
     *
     * @param
     * @return
     */
    public VnnoxResult ntpSync(List<String> playerList,boolean enable) {
        return vnnoxAPIUtil.ntpSync(playerList,enable);
    public VnnoxResult ntpSync(List<String> playerList, boolean enable) {
        return vnnoxAPIUtil.ntpSync(playerList, enable);
    }
@@ -273,4 +280,57 @@
        }
        return list;
    }
    public VnnoxResult publishWaterData(String playerId, A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage poleSensorEntity) {
        List<String> playerIds = new ArrayList<>();
        playerIds.add(playerId);
        AirDataProgram playerProgram = new AirDataProgram();
        playerProgram.setPlayerIds(playerIds);
        PlayerPage playerPage = new PlayerPage();
        playerPage.setName("AirData page");
        List<PlayerWidget> widgetList = generateWaterAndSensorWidget(poleSensorEntity);
        playerPage.setWidgets(widgetList);
        List<PlayerPage> list = new ArrayList<>();
        list.add(playerPage);
        playerProgram.setPages(list);
        playerProgram.setNoticeUrl(VnnoxConstant.NOTIFY_URL);
        return vnnoxProgramAPIUtil.normalProgram(playerProgram).getData();
    }
    private List<PlayerWidget> generateWaterAndSensorWidget(A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage poleSensorEntity) {
        List widgetList = new ArrayList<>();
        List<String> list = new ArrayList<>();
//        if (Objects.nonNull(waterDataEntity)) {
//            list.add("水质环境监测实时数据:");
//            list.add("ph:"+waterDataEntity.getPh());
//            list.add("溶解氧:"+waterDataEntity.getDoData() + "(mg/L)");
//            list.add("电导率:"+waterDataEntity.getEc() + "(10^(-6)S)");
//            list.add("浊度:"+waterDataEntity.getNtu() + "NTU");
//        }
        if (Objects.nonNull(poleSensorEntity)) {
//            list.add("环境监测:");
            list.add("温度:" + poleSensorEntity.getTemperature() + "°");
            list.add("湿度:" + poleSensorEntity.getHumidity() + "%");
            list.add("pm25:" + poleSensorEntity.getPm25() + "μg/m³");
            list.add("pm10:" + poleSensorEntity.getPm10() + "μg/m³");
            list.add("甲醛:" + poleSensorEntity.getEch2o() + "μg/m³");
            list.add("CO2:" + poleSensorEntity.getCo2() + "ppm");
        }
        widgetList.add(new PlayerWidget().generateScrollUpTextWidget(
                "water",
                1,
                100000L,
                list,
                "#FFFFFF",
                15,
                new PlayerLayout("0%", "5%", "100%", "100%")
        ));
        return widgetList;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java
@@ -10,22 +10,23 @@
import com.sandu.ximon.admin.config.RealtimeServerBean;
import com.sandu.ximon.admin.config.XiXunConfig;
import com.sandu.ximon.admin.entity.*;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.JsonUtil;
import com.sandu.ximon.admin.utils.LightemitUtils;
import com.sandu.ximon.admin.utils.LogUtils;
import com.sandu.ximon.dao.domain.LEDProgram;
import com.sandu.ximon.admin.utils.request.SubTitleSet;
import com.sandu.ximon.dao.domain.LedSFile;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleLightemitEntity;
import com.sandu.ximon.dao.domain.PoleXixunPlayerEntity;
import com.sandu.ximon.dao.mapper.PoleXixunPlayerEntityMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.*;
/**
 * ç†™è®¯èŠ‚ç›®
@@ -129,7 +130,6 @@
    }
//    public Object getProgram(String json) {
////        PoleXixunPlayerEntity byId = getById(pid);
//        List<Long> fileIds = new ArrayList<>();
@@ -226,7 +226,59 @@
    /**
     * æŽ¨é€å¤§æ°”数据到熙讯LED
     */
    @Async("taskExecutor")
    public Boolean pushWeather(String lightemitControlCode, A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage sensorEntity, Pole streetlightEntity) {
        if (StringUtils.isBlank(lightemitControlCode)) {
            return Boolean.valueOf(false);
        }
        Integer screenHeight = Integer.parseInt(lightemitUtils.getScreenHeight(lightemitControlCode));
        String size = String.valueOf(screenHeight / 18);
        //字幕主体拼接
        String body =
                "<head><style type=\"text/css\">body{background-color:#000;}</style></head>" +
                        "<p style=\"font-size:" + size + "px;line-height:17px;color:#fff\">" +
                        (streetlightEntity == null || streetlightEntity.getCity() == null ? "" : streetlightEntity.getCity().replace("市", "")) + "<br/>" +
                        "温度:" + (sensorEntity == null || sensorEntity.getTemperature() == null ? "   -" : sensorEntity.getTemperature()) + "℃<br/>" +
                        "湿度:" + (sensorEntity == null || sensorEntity.getHumidity() == null ? "-" : sensorEntity.getHumidity()) + "%RH<br/>" +
                        "亮度:" + (sensorEntity == null || sensorEntity.getLightIntensity() == null ? "-" : sensorEntity.getLightIntensity()) + "lux<br/>" +
                        "风速:" + (sensorEntity == null || sensorEntity.getWindSpeed() == null ? "-" : sensorEntity.getWindSpeed()) + "m/s<br/>" +
                        "CO2:" + (sensorEntity == null || sensorEntity.getCo2() == null ? "-" : sensorEntity.getCo2()) + "ppm<br/>" +
                        "甲醛:" + (sensorEntity == null || sensorEntity.getEch2o() == null ? "-" : sensorEntity.getEch2o()) + "mg/m³<br/>" +
                        "TVOC:" + (sensorEntity == null || sensorEntity.getTvoc() == null ? "-" : sensorEntity.getTvoc()) + "mg/m³<br/>" +
                        "PM25:" + (sensorEntity == null || sensorEntity.getPm25() == null ? "-" : sensorEntity.getPm25()) + "mg/m³<br/>" +
                        "PM10:" + (sensorEntity == null || sensorEntity.getPm10() == null ? "-" : sensorEntity.getPm10()) + "mg/m³<br/>";
        //组装请求参数
        SubTitleSet subTitleSet = new SubTitleSet();
        subTitleSet.html = body;
        subTitleSet.num = 1;
        //清屏操作
        lightemitUtils.clear(lightemitControlCode);
        //清除播放列表
        lightemitUtils.clearVideoPlay(lightemitControlCode);
        //清除节目列表
        lightemitUtils.clearPlayerTask(lightemitControlCode);
        try {
            lightemitUtils.subTitleSet(subTitleSet, lightemitControlCode, false);
            return true;
        } catch (Exception e) {
            return false;
        } finally {
            //一分钟后清除屏幕
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    lightemitUtils.clear(lightemitControlCode);
                    //清除播放列表
                    lightemitUtils.clearVideoPlay(lightemitControlCode);
                    //清除节目列表
                    lightemitUtils.clearPlayerTask(lightemitControlCode);
                    //推送最后命令
                    lightemitUtils.sendLastCommand(lightemitControlCode);
                }
            }, 60 * 1000);
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/LightemitUtils.java
@@ -6,6 +6,7 @@
import com.sandu.ximon.admin.config.RealtimeServerBean;
import com.sandu.ximon.admin.service.PoleLightemitService;
import com.sandu.ximon.admin.utils.request.*;
import com.sandu.ximon.dao.domain.PoleLightemitEntity;
import com.squareup.okhttp.*;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
@@ -232,6 +233,18 @@
    }
    /**
     * å‘送最新的数据
     * @param lightemitControlCode
     */
    public void sendLastCommand(String lightemitControlCode) {
        PoleLightemitEntity poleLightemitEntity = poleLightemitService.getLedByLightControlCode(lightemitControlCode);
        if (poleLightemitEntity == null || StringUtils.isBlank(poleLightemitEntity.getRequestBody())) {
            return;
        }
        this.post(realtimeServerBean.getCommand() + lightemitControlCode, poleLightemitEntity.getRequestBody());
    }
    /**
     * èŽ·å–led屏画面
     *
     * @param ledCode
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java
@@ -2,8 +2,9 @@
import com.alibaba.fastjson.JSON;
import com.sandu.ximon.admin.config.VnnoxUrl;
import com.sandu.ximon.admin.dto.nova.AirDataProgram;
import com.sandu.ximon.admin.utils.request.CommonHeader;
import com.sandu.ximon.admin.utils.request.PlayerProgram;
import com.sandu.ximon.admin.dto.nova.PlayerProgram;
import com.sandu.ximon.admin.utils.response.VnnoxResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -26,7 +27,7 @@
     * @return
     */
    //public VnnoxResultResponse normalProgram(Map<String,Object> program) {
    public VnnoxResultResponse normalProgram(PlayerProgram program) {
    public VnnoxResultResponse normalProgram(AirDataProgram program) {
        String result = VnnoxRequestUtil.PostWithHeader(
                VnnoxUrl.getUrl(VnnoxUrl.NORMAL_PROGRAM),