2021与蓝度共同重构项目,服务端
liuhaonan
2022-08-03 28bf6e5a47b7235d829b5f1021cfbec1cb1811d6
changes
已修改13个文件
已添加3个文件
432 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/bo/InterphoneSubBo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/Pole.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/PoleMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/PoleMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/VnnoxUrl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PlayPlanNvController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/NormalProgramDto.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/WeatherDto.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/WeatherProgram.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleParam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleStatesParam.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/InterphoneHostSubService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/InterphoneSubService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/bo/InterphoneSubBo.java
@@ -11,4 +11,5 @@
public class InterphoneSubBo extends InterphoneSub {
    private String poleId;
    private String PoleName;
    private Integer hostId;
}
dao/src/main/java/com/sandu/ximon/dao/domain/Pole.java
@@ -4,13 +4,13 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.sandu.ximon.dao.bo.BindEquipments;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.sandu.ximon.dao.bo.BindEquipments;
import lombok.Data;
/**
 * ç¯æ†è¡¨
@@ -97,6 +97,19 @@
    private Integer bindingCount;
    /**
     * æ˜¯å¦ä¸ºä¸­å¿ƒ
     */
    @JsonIgnore
    private Integer centre;
    /**
     * æ˜¯å¦ä¸ºä¸­å¿ƒ
     */
    @TableField(exist = false)
    private boolean Center = false;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createTime;
dao/src/main/java/com/sandu/ximon/dao/mapper/PoleMapper.java
@@ -15,7 +15,7 @@
    boolean updateDeviceCode(Long id);
    List<Pole> queryPoleOnLineStatesList(Long userid, Integer isTrue, Integer bingStates, Long groupid, String keyword, String orderBy);
    List<Pole> queryPoleOnLineStatesList(Long userid, Integer isTrue, Integer bingStates, Long groupid, String keyword,Integer center, String orderBy);
    List<Pole> getPoleListOnBinding(Long userid, String keyword);
}
dao/src/main/resources/mapper/PoleMapper.xml
@@ -9,6 +9,7 @@
        <result property="poleCode" column="pole_code" jdbcType="BIGINT"/>
        <result property="poleName" column="pole_name" jdbcType="VARCHAR"/>
        <result property="deviceType" column="device_type" jdbcType="INTEGER"/>
        <result property="centre" column="centre" jdbcType="INTEGER"/>
        <result property="userId" column="user_id" jdbcType="BIGINT"/>
        <result property="clientId" column="client_id" jdbcType="BIGINT"/>
        <result property="province" column="province" jdbcType="VARCHAR"/>
@@ -51,7 +52,8 @@
            </if>
            <if test="keyword != null and keyword != ''">
                AND ( t1.pole_name LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.device_code LIKE CONCAT(CONCAT('%', #{keyword}), '%'))
                OR t1.device_code LIKE CONCAT(CONCAT('%', #{keyword}), '%')
                OR t1.centre LIKE CONCAT(CONCAT('%', #{keyword}), '%'))
            </if>
            <if test="isTrue != null and isTrue == 1">
                AND t1.device_type = -1
@@ -68,6 +70,9 @@
            <if test="bingStates != null and bingStates == 1 ">
                AND t1.user_id = -1
            </if>
            <if test="center != null and center != ''">
                AND t1.centre = #{center}
            </if>
        </where>
        GROUP BY t1.id
        <if test="orderBy != null">
ximon-admin/src/main/java/com/sandu/ximon/admin/config/VnnoxUrl.java
@@ -27,6 +27,8 @@
    public static String SIMU_LCAST = "/v1/player/immediateControl/simulcast";
    // NTP对时
    public static String NTP_SYNC = "/v1/player/immediateControl/ntp";
    //天气
    public static String WEATHER = "/v1/player/program/weather";
    public static String getUrl(String urlSuffix) {
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PlayPlanNvController.java
@@ -91,6 +91,22 @@
        return ResponseUtil.success(playPlanNvService.pushProgram(pid, playerIds));
    }
    @PostMapping(value = "/pushWeather/{pid}", produces = "application/json;charset=UTF-8")
    public ResponseVO<Object> pushWeather(@PathVariable Long pid, @RequestBody List<NovaPushResultVO> playerIds) {
        if (!permissionConfig.check(MenuEnum.LED_N_PLAY_PLAN_PUSH.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(playPlanNvService.pushProgram(pid, playerIds));
    }
    @PostMapping(value = "/pushWeatherPlan/{id}", produces = "application/json;charset=UTF-8")
    public ResponseVO<Object> pushWeatherPlan(@PathVariable Long id, @RequestBody List<NovaPushResultVO> playerIds) {
        if (!permissionConfig.check(MenuEnum.LED_N_PLAY_PLAN_PUSH.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(playPlanNvService.pushWeatherToLed(id, playerIds));
    }
    @GetMapping("/listPlan")
    public ResponseVO<Object> list(BaseConditionVO baseConditionVO,
                                   @RequestParam(value = "order", required = false) Integer order,
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/NormalProgramDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.sandu.ximon.admin.dto.nova;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/8/1
 * æ™®é€šèŠ‚ç›®å®žä½“
 */
@NoArgsConstructor
@Data
public class NormalProgramDto {
    private String name;
    private List<SchedulesDTO> schedules;
    private List<WidgetsDTO> widgets;
    @NoArgsConstructor
    @Data
    public static class SchedulesDTO {
        private String startDate;
        private String endDate;
        private List<PlansDTO> plans;
        @NoArgsConstructor
        @Data
        public static class PlansDTO {
            private List<Integer> weekDays;
            private String startTime;
            private String endTime;
        }
    }
    @NoArgsConstructor
    @Data
    public static class WidgetsDTO {
        private Integer zIndex;
        private String type;
        private Integer size;
        private String md5;
        private Integer duration;
        private String url;
        private LayoutDTO layout;
        private InAnimationDTO inAnimation;
        @NoArgsConstructor
        @Data
        public static class LayoutDTO {
            private String x;
            private String y;
            private String width;
            private String height;
        }
        @NoArgsConstructor
        @Data
        public static class InAnimationDTO {
            private String type;
            private Integer duration;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/WeatherDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.sandu.ximon.admin.dto.nova;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/8/1
 */
@NoArgsConstructor
@Data
public class WeatherDto {
    private String name;
    private List<WidgetsDTO> widgets;
    @NoArgsConstructor
    @Data
    public static class WidgetsDTO {
        private Integer zIndex;
        private String type;
        private String address;
        private Double latitude;
        private Double longitude;
        private Integer width;
        private Integer height;
        private Integer refreshPeriod;
        private Integer fontSize;
        private Boolean bold;
        private Boolean italic;
        private Boolean underline;
        private String color;
        private Integer tempUnit;
        private Integer unitSymbol;
        private Boolean weatherEnable;
        private Boolean tempEnable;
        private Boolean windEnable;
        private Boolean humidEnable;
        private Boolean currentTempEnable;
        private Boolean isShowInOneLine;
        private Integer duration;
        private LayoutDTO layout;
        @NoArgsConstructor
        @Data
        public static class LayoutDTO {
            private String x;
            private String y;
            private String width;
            private String height;
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/WeatherProgram.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.sandu.ximon.admin.dto.nova;
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.admin.utils.request.VnnoxRequest;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
 * @author LiuHaoNan
 * @date 2022/8/1
 */
@Data
public class WeatherProgram implements VnnoxRequest {
    //  éœ€è¦å¤„理的播放器ID集合,最多支持100个播放器同时处理
    private List<String> playerIds;
    //  æ’­æ”¾æ—¶é—´æŽ’期,如果为空,会全天24小时循环播放
    private Map schedule;
    //  éœ€è¦æ’­æ”¾çš„页面内容集合
    private List<WeatherDto> pages;
    //  èŠ‚ç›®ä¸‹è½½è¿›åº¦é€šçŸ¥æŽ¥å£ï¼Œä¼šé€šè¿‡æ­¤æŽ¥å£å°†èŠ‚ç›®çš„ä¸‹è½½è¿›åº¦å‘ç»™å®¢æˆ·ï¼ŒæŽ¥å£çš„å“åº”æ—¶é—´ä¸èƒ½è¶…è¿‡3s
    private String noticeUrl;
    @Override
    public String toJson() {
        return VnnoxConstant.GSON.toJson(this);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleParam.java
@@ -71,5 +71,11 @@
    private String deviceCode;
    /**
     * æ˜¯å¦ä¸ºä¸­å¿ƒ  0是 1否
     */
    private Integer isCenter;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleStatesParam.java
@@ -32,5 +32,10 @@
     */
    private Integer isTrue;
    /**
     * æ˜¯å¦ä¸­å¿ƒ 0是/1否/2全部
     */
    private Integer center;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/InterphoneHostSubService.java
@@ -8,6 +8,7 @@
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.domain.InterphoneHost;
import com.sandu.ximon.dao.domain.InterphoneHostSubPole;
import com.sandu.ximon.dao.domain.InterphoneSub;
import com.sandu.ximon.dao.mapper.InterphoneHostSubPoleMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -29,7 +30,7 @@
        }
        InterphoneHostSubPole pole = new InterphoneHostSubPole();
        InterphoneHost host = SpringContextHolder.getBean(InterphoneHostService.class).getById(hostId);
        InterphoneHost sub = SpringContextHolder.getBean(InterphoneHostService.class).getById(subId);
        InterphoneSub sub = SpringContextHolder.getBean(InterphoneSubService.class).getById(subId);
        if (host == null || sub == null) {
            throw new BusinessException("主设备或子设备不存在");
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/service/InterphoneSubService.java
@@ -148,6 +148,13 @@
        } else {
            list = interphoneSubMapper.getInterphoneSubList(keyword, SecurityUtils.getUserId());
        }
        list.forEach(interphoneSubBo -> {
            InterphoneHostSubPole one = SpringContextHolder.getBean(InterphoneHostSubService.class).getOne(Wrappers.lambdaQuery(InterphoneHostSubPole.class)
                    .eq(InterphoneHostSubPole::getSubId, interphoneSubBo.getSubId()));
            if (one != null) {
                interphoneSubBo.setHostId(one.getHostId());
            }
        });
        return list;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java
@@ -10,10 +10,7 @@
import com.sandu.ximon.admin.config.VnnoxConstant;
import com.sandu.ximon.admin.dto.PlanDto;
import com.sandu.ximon.admin.dto.SchedulesDTO;
import com.sandu.ximon.admin.dto.nova.PlayerProgram;
import com.sandu.ximon.admin.dto.nova.ProgramDto;
import com.sandu.ximon.admin.dto.nova.ProgramPush;
import com.sandu.ximon.admin.dto.nova.ProgramSchedule;
import com.sandu.ximon.admin.dto.nova.*;
import com.sandu.ximon.admin.entity.Plans;
import com.sandu.ximon.admin.param.PlayPlanParam;
import com.sandu.ximon.admin.security.SecurityUtils;
@@ -168,6 +165,12 @@
        return removeByIds(ids);
    }
    /**
     * æŽ¨é€å®šæ—¶èŠ‚ç›®
     * @param planId
     * @param nova
     * @return
     */
    public Map<String, Object> pushToLed(Long planId, List<NovaPushResultVO> nova) {
        if (nova == null) {
            throw new BusinessException("请选择正确的LED屏");
@@ -496,4 +499,103 @@
        return result;
    }
    /**
     * å®šæ—¶æŽ¨é€å¤©æ°”
     * @param planId
     * @param nova
     * @return
     */
    public Map<String, Object> pushWeatherToLed(Long planId, List<NovaPushResultVO> nova) {
        if (nova == null) {
            throw new BusinessException("请选择正确的LED屏");
        }
        PushToLed pushToLed = playPlanMapper.pushToLed(planId);
        if (pushToLed.getPages() == null) {
            throw new BusinessException("节目内容丢失");
        }
        PlayPlanNv byId = getById(planId);
        if (pushToLed == null) {
            throw new BusinessException("未找到该播放计划");
        }
        List<String> playerIds = new ArrayList<>();
        nova.forEach(n -> {
            playerIds.add(n.getPlayerId());
        });
        WeatherProgram program = new WeatherProgram();
        program.setPlayerIds(playerIds);
        //获取节目实体
        List<WeatherDto> programDtos = JSON.parseArray(pushToLed.getPages(), WeatherDto.class);
        program.setPages(programDtos);
        //获取节目定时实体
        program.setSchedule((JSON.parseObject(pushToLed.getSchedule(), Map.class)));
        Map map = JSON.parseObject(pushToLed.getSchedule(), Map.class);
        map.get("plans");
        List<Plans> plans = JSON.parseArray(map.get("plans").toString(), Plans.class);
        plans.forEach(p -> {
            //删除后两位字符串
            p.setStartTime(p.getStartTime().substring(0, p.getStartTime().length() - 3));
            p.setEndTime(p.getEndTime().substring(0, p.getEndTime().length() - 3));
        });
        map.put("plans", plans);
        program.setSchedule(map);
        program.setNoticeUrl(VnnoxConstant.NOTIFY_URL);
        VnnoxResultResponse vnnoxResultResponse = vnnoxProgramAPIUtil.pushWeather(program);
        vnnoxAPIUtil.volChange(playerIds, Integer.valueOf(pushToLed.getVolume()).intValue());
        List<String> success = new ArrayList<>();
        List<String> fail = new ArrayList<>();
        if (vnnoxResultResponse.getData() != null) {
            success = vnnoxResultResponse.getData().getSuccess();
            fail = vnnoxResultResponse.getData().getFail();
        }
        //拼接成功失败的结果
        Map<String, Object> result = new HashMap<>();
        List<NovaPushResultVO> successList = new ArrayList<>();
        List<NovaPushResultVO> faileList = new ArrayList<>();
        List<String> finalSuccess = success;
        List<String> finalFail = fail;
        nova.forEach(n -> {
            if (finalSuccess.contains(n.getPlayerId())) {
                successList.add(n);
            } else if (finalFail.contains(n.getPlayerId())) {
                faileList.add(n);
            }
        });
        result.put("success", successList);
        result.put("fail", faileList);
        /**
         * è¯ºç“¦æŽ¨é€èŠ‚ç›®æ—¥å¿—è®°å½•å¼€å§‹
         */
        List<LedPlayerEntity> list = SpringContextHolder.getBean(LedPlayerEntityService.class)
                .list(Wrappers.lambdaQuery(LedPlayerEntity.class).in(LedPlayerEntity::getId, nova.stream().map(NovaPushResultVO::getPlayerId).toArray()));
        List<String> listCode = new ArrayList<>();
        for (LedPlayerEntity temp : list) {
            listCode.add(temp.getSn());
        }
        String content = "{节目ID:" + planId
                + ", èŠ‚ç›®åç§°ï¼š" + byId.getName()
                + "}," + " æŽ¨é€ç»“果:" + result
                + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "诺瓦推送播放计划", content);
        /**
         * è¯ºç“¦æŽ¨é€èŠ‚ç›®æ—¥å¿—è®°å½•ç»“æŸ
         */
        return result;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -14,7 +14,6 @@
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.dto.DeviceStatus;
import com.sandu.ximon.admin.dto.WaterQualityDataDto;
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;
@@ -25,14 +24,18 @@
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1DeviceMacRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A1TernaryCodeRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.*;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A1OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A2OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.DeviceStateEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.param.*;
import com.sandu.ximon.admin.param.PoleBindingParam;
import com.sandu.ximon.admin.param.PoleParam;
import com.sandu.ximon.admin.param.PoleStatesParam;
import com.sandu.ximon.admin.redis.LightKey;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.LightemitUtils;
import com.sandu.ximon.admin.utils.ListPagingUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.utils.response.VnnoxResult;
import com.sandu.ximon.admin.vo.PoleBindVO;
@@ -71,6 +74,7 @@
        BeanUtils.copyProperties(param, pole);
        pole.setPoleCode(generatePoleCode());
        pole.setDeviceType(-1);
        pole.setCentre(1);
        boolean save = save(pole);
        /**
@@ -99,6 +103,9 @@
        Pole update = new Pole();
        BeanUtils.copyProperties(param, update);
        update.setId(poleId);
        if (param.getIsCenter() != null) {
            update.setCentre(param.getIsCenter());
        }
        /**
         * ä¿®æ”¹ç¯æ†æ—¥å¿—记录开始
         */
@@ -257,12 +264,19 @@
        List<Pole> poleList;
        if (SecurityUtils.getClientId() == null) {
            poleList = poleMapper.queryPoleOnLineStatesList(null, param.getIsTrue(),
                    param.getBingStates(), param.getGroupid(), param.getKeyword(), orderBy);
                    param.getBingStates(), param.getGroupid(), param.getKeyword(), param.getCenter(), orderBy);
        } else {
            poleList = poleMapper.queryPoleOnLineStatesList(SecurityUtils.getUserId(),
                    param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword(), orderBy);
                    param.getIsTrue(), param.getBingStates(), param.getGroupid(), param.getKeyword(), param.getCenter(), orderBy);
        }
        poleList.forEach(
                centre -> {
                    if (centre.getCentre() == 0) {
                        centre.setCenter(true);
                    }
                }
        );
        List<Pole> PoleResult = isOnLine(poleList, param);
        setCount(PoleResult);
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java
@@ -2,11 +2,8 @@
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.dto.nova.ProgramPush;
import com.sandu.ximon.admin.dto.nova.ProgramSchedule;
import com.sandu.ximon.admin.dto.nova.*;
import com.sandu.ximon.admin.utils.request.CommonHeader;
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;
@@ -92,4 +89,22 @@
    }
    /**
     * å¤©æ°”
     * @param program
     * @return
     */
    public VnnoxResultResponse pushWeather(WeatherProgram program) {
        String result = VnnoxRequestUtil.PostWithHeader(
                VnnoxUrl.getUrl(VnnoxUrl.WEATHER),
                program.toJson(),
                new CommonHeader(CommonHeader.JSON, true)
        );
        System.out.println(program.toJson());
        LogUtils.error("天气节目播放response:"+result);
        return JSON.parseObject(result,VnnoxResultResponse.class);
    }
}