2021与蓝度共同重构项目,服务端
liuhaonan
2022-07-19 dca94edc9cd0681be081e36b0dba3bbe0f581ea0
新需求
已修改11个文件
已添加2个文件
已删除2个文件
544 ■■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/config/RealtimeServerBean.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PlayPlanNvController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/ProgramDto.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/ProgramPush.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/base64_Img.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/ceshi.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/security/stringTest.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/LightemitUtils.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/DownloadFileToLocal.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/SetPlayList.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/RealtimeServerBean.java
@@ -4,10 +4,7 @@
import org.springframework.stereotype.Component;
/**
 * @program: machine-fast
 * @description: led服務器地址
 * @author: YSS
 * @create: 2019-04-24 13:24
 * led服務器地址
 **/
@Component
@ConfigurationProperties(prefix = "realtime-server")
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PlayPlanNvController.java
@@ -82,6 +82,15 @@
        return ResponseUtil.success(playPlanNvService.pushSchedule(planId, playerIds));
    }
    @PostMapping(value = "/pushProgram/{pid}", produces = "application/json;charset=UTF-8")
    public ResponseVO<Object> pushProgram(@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));
    }
    @GetMapping("/listPlan")
    public ResponseVO<Object> list(BaseConditionVO baseConditionVO,
                                   @RequestParam(value = "order", required = false) Integer order,
@@ -132,9 +141,7 @@
        }
        List<PlayPlanNv> list = playPlanNvService.list(wrapper);
        list.forEach(plan -> {
//            plan.setPlan(JSON.parseObject(plan.getSchedule(), Map.class));
            plan.setPlan(JSON.parseObject(plan.getSchedules(), List.class));
//            plan.setPlan(JSON.parseArray(plan.getSchedule(), SchedulesDTO.class));
        });
        return ResponseUtil.successPage(list);
    }
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/XiXunController.java
@@ -6,6 +6,8 @@
import com.sandu.common.domain.CommonPage;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.FileUploadDto;
import com.sandu.common.file.impl.AliOssFileServiceImpl;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.common.util.SpringContextHolder;
@@ -25,7 +27,9 @@
import com.sandu.ximon.dao.domain.PoleXixunPlayerEntity;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
@@ -46,7 +50,10 @@
    private final LedScheduleService scheduleService;
    private PermissionConfig permissionConfig;
    // private final ListPageUtil listPageUtil;
    private final AliOssFileServiceImpl aliOssFileService;
    private final FileOperationRecordService fileOperationRecordService;
    /**
     * æ–°å¢žèŠ‚ç›®
@@ -531,4 +538,78 @@
         */
        return ResponseUtil.success("清屏成功");
    }
    /**
     * ç†™æ±›ç›´æŽ¥ä¸Šä¼ è§†é¢‘到播放器播放
     */
    @PostMapping("/pushVideo")
    @Transactional(rollbackFor = Exception.class)
    public ResponseVO<Object> video(@RequestParam("file") MultipartFile file,
                                    @RequestParam("lightemitId") List<Long> lightemitIds,
                                    @RequestParam("type") Integer type) {
        if (!permissionConfig.check(MenuEnum.XIXUN_PROGRAM_PUSH.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        if (file == null || lightemitIds.isEmpty()) {
            throw new BusinessException("未选择LED屏或文件");
        }
        FileUploadDto fileUploadDto = aliOssFileService.uploadFile(file);
        if (type == null && (type > 2 || type < 1)) {
            throw new BusinessException("请选择正确的播放类型");
        }
        if (type == 1 && !"mp4".equals(fileUploadDto.getFileType())) {
            throw new BusinessException("请不要在播放视频时选择非mp4文件");
        } else if (type == 2 && (!"jpg".equals(fileUploadDto.getFileType()) && !"gif".equals(fileUploadDto.getFileType()) && !"png".equals(fileUploadDto.getFileType()))) {
            throw new BusinessException("请不要在播放图片时时选择非jpg/gif/png文件");
        }
        //获取所有led数据
        List<PoleLightemitEntity> poleLightemitControllers = poleLightemitService.listByIds(lightemitIds);
        int num = 0;
        if (!poleLightemitControllers.isEmpty()) {
            Iterator iterator = poleLightemitControllers.iterator();
            while (iterator.hasNext()) {
                PoleLightemitEntity poleLightemitEntity = (PoleLightemitEntity) iterator.next();
                //上传视频
                String s = poleLightemitService.videoUpload(poleLightemitEntity.getLightemitControlCode(), fileUploadDto, type);
                if ("推送失败".equals(s)) {
                    num++;
                }
            }
        } else {
            throw new BusinessException("未正确选择LED屏");
        }
        /**
         * ç†™æ±›ä¸Šä¼ æ–‡ä»¶æ’­æ”¾ æ—¥å¿—记录开始
         */
        //获取listCode
        List<String> listCode = new ArrayList<>();
        List<String> msg = new ArrayList<>();
        for (PoleLightemitEntity poleLightemitEntity : poleLightemitControllers) {
            listCode.add(poleLightemitEntity.getLightemitControlCode());
            msg.add("[屏幕名称" + poleLightemitEntity.getLightemitName() + "设备编码" + poleLightemitEntity.getLightemitControlCode() + "],");
        }
        String content = JSON.toJSONString(msg);
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛文件推送", content);
        /**
         * ç†™æ±›ä¸Šä¼ æ–‡ä»¶æ’­æ”¾ æ—¥å¿—记录结束
         */
        if (num != 0 && num != lightemitIds.size()) {
            //存在失败但是不完全失败
            return ResponseUtil.success("部分文件播放成功");
        } else if (num == lightemitIds.size()) {
            //全部失败
            return ResponseUtil.fail("文件播放失败");
        } else {
            return ResponseUtil.success("文件播放成功");
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/dto/nova/ProgramDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
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/7/15
 * ç›´æŽ¥æŽ¨é€èŠ‚ç›®å®žä½“
 */
@NoArgsConstructor
@Data
public class ProgramDto {
    private String name;
    private List<WidgetsDTO> widgets;
    @Data
    public static class WidgetsDTO {
        private Integer duration;
        private String type;
        private String url;
        private Integer zIndex;
        private LayoutDTO layout;
        private String md5;
        private String size;
        @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/ProgramPush.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/7/15
 */
@Data
public class ProgramPush implements VnnoxRequest {
    //  éœ€è¦å¤„理的播放器ID集合,最多支持100个播放器同时处理
    private List<String> playerIds;
    //  æ’­æ”¾æ—¶é—´æŽ’期,如果为空,会全天24小时循环播放
    private Map schedule;
    //  éœ€è¦æ’­æ”¾çš„页面内容集合
    private  List<ProgramDto> pages ;
    //  èŠ‚ç›®ä¸‹è½½è¿›åº¦é€šçŸ¥æŽ¥å£ï¼Œä¼šé€šè¿‡æ­¤æŽ¥å£å°†èŠ‚ç›®çš„ä¸‹è½½è¿›åº¦å‘ç»™å®¢æˆ·ï¼ŒæŽ¥å£çš„å“åº”æ—¶é—´ä¸èƒ½è¶…è¿‡3s
    private String noticeUrl;
    @Override
    public String toJson() {
        return VnnoxConstant.GSON.toJson(this);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/security/base64_Img.java
@@ -9,29 +9,9 @@
    public static void main(String[] args) {
        //str = GetImageStr();
        String s="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";
        String s=  "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCADAAMADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD/AD/6\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK\nKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooA//9k=\n";
        GenerateImage(s);
    }
    // å›¾ç‰‡è½¬åŒ–成base64字符串
//    public static String GetImageStr() {
//        String imgFile = "D:\\tanbing.jpg";// å¾…处理的图片
//        InputStream in = null;
//        byte[] data = null;
//        // è¯»å–图片字节数组
//        try {
//            in = new FileInputStream(imgFile);
//            data = new byte[in.available()];
//            in.read(data);
//            in.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        // å¯¹å­—节数组Base64编码
//        BASE64Encoder encoder = new BASE64Encoder();
//        System.out.println(encoder.encode(data));
//        return encoder.encode(data);// è¿”回Base64编码过的字节数组字符串
//    }
    // å¯¹å­—节数组字符串进行Base64解码并生成图片
    public static boolean GenerateImage(String imgStr) {
@@ -49,7 +29,7 @@
                }
            }
            // ç”Ÿæˆjpeg图片
            String imgFilePath = "D:\\Download\\jieping.jpg";// æ–°ç”Ÿæˆçš„图片
            String imgFilePath = "C:\\Users\\Administrator\\Desktop\\jieping.jpg";// æ–°ç”Ÿæˆçš„图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
ximon-admin/src/main/java/com/sandu/ximon/admin/security/ceshi.java
ÎļþÒÑɾ³ý
ximon-admin/src/main/java/com/sandu/ximon/admin/security/stringTest.java
ÎļþÒÑɾ³ý
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PlayPlanNvService.java
@@ -11,6 +11,8 @@
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.entity.Plans;
import com.sandu.ximon.admin.param.PlayPlanParam;
@@ -22,10 +24,7 @@
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.domain.*;
import com.sandu.ximon.dao.mapper.PlayPlanNvMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -48,6 +47,7 @@
    private VnnoxAPIUtil vnnoxAPIUtil;
    private final LEDProgramService ledProgramService;
    private final ClientService clientService;
    private final LEDProgramFileService fileService;
    public boolean addPlan(PlayPlanParam playPlanParam) {
@@ -378,4 +378,95 @@
        plan.put("schedules", schedules);
        return plan;
    }
    /**
     * æŽ¨é€å®žæ—¶èŠ‚ç›®
     *
     * @param pid
     * @param nova
     * @return
     */
    public Map<String, Object> pushProgram(Long pid, List<NovaPushResultVO> nova) {
        LEDProgram ledProgram = ledProgramService.getById(pid);
        if (ledProgram == null) {
            throw new BusinessException("未找到节目");
        }
        String pages = ledProgram.getPages();
        List<String> playerIds = new ArrayList<>();
        nova.forEach(n -> {
            playerIds.add(n.getPlayerId());
        });
        ProgramPush program = new ProgramPush();
        List<ProgramDto> programDtos = JSON.parseArray(pages, ProgramDto.class);
        programDtos.forEach(
                programDto -> {
                    programDto.getWidgets().forEach(
                            widget -> {
                                String url = widget.getUrl();
                                LEDProgramFile one = fileService.getOne(Wrappers.lambdaQuery(LEDProgramFile.class).eq(LEDProgramFile::getFileUrl, url));
                                if (one == null) {
                                    throw new BusinessException("节目文件已失效");
                                }
                                widget.setMd5(one.getMd5());
                                widget.setSize(one.getSize());
                            }
                    );
                }
        );
        program.setPlayerIds(playerIds);
        //获取节目实体
        program.setPages(programDtos);
        program.setNoticeUrl(VnnoxConstant.NOTIFY_URL);
        VnnoxResultResponse vnnoxResultResponse = vnnoxProgramAPIUtil.pushProgram(program);
        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:" + pid
                + ", èŠ‚ç›®åç§°ï¼š" + ledProgram.getName()
                + "}," + " æŽ¨é€ç»“果:" + result
                + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "诺瓦推送节目", content);
        /**
         * è¯ºç“¦æŽ¨é€èŠ‚ç›®æ—¥å¿—è®°å½•ç»“æŸ
         */
        return result;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java
@@ -3,16 +3,14 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.gson.Gson;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.FileUploadDto;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.config.RealtimeServerBean;
import com.sandu.ximon.admin.entity.*;
import com.sandu.ximon.admin.param.PoleBindingParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.FileUtil;
import com.sandu.ximon.admin.utils.HtmlTemplateUtils;
import com.sandu.ximon.admin.utils.LightemitUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.utils.*;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleLightemitEntity;
@@ -393,28 +391,26 @@
     * led上传视频
     *
     * @param lightemitControlCode
     * @param filename
     * @param path
     * @param userName
     * @throws IOException
     */
    @Async("taskExecutor")
    public void videoUpload(String lightemitControlCode, String filename, String path, String userName) throws IOException {
    public String videoUpload(String lightemitControlCode, FileUploadDto fileUploadDto, Integer type) {
        //获取屏幕宽
        String screenWidth = lightemitUtils.getScreenWidth(lightemitControlCode);
        String screenHeight = lightemitUtils.getScreenHeight(lightemitControlCode);
        //发送视频至开发板并播放
        lightemitUtils.postVideo(screenWidth, screenHeight, filename, lightemitControlCode);
        String fileUrl = fileUploadDto.getFileUrl();
        String[] split = fileUrl.split("/");
        String id = split[split.length - 1];
        String result = this.videoXixunPlayer(lightemitControlCode, id, fileUploadDto.getFileSize(), fileUploadDto.getMd5(), type, fileUploadDto.getFileType(), 999999);
        //清屏
        lightemitUtils.clear(lightemitControlCode);
        LogUtils.error("上传播放结果:" + result);
        return result;
    }
    @Async("taskExecutor")
    public void videoXixunPlayer(String lightemitControlCode, String ip, String filename, Long filesize, Integer videoTime) {
    public String videoXixunPlayer(String lightemitControlCode, String filename, Long filesize, String md5, Integer type, String fileType, Integer videoTime) {
        //获取屏幕宽
        Integer screenWidth = Integer.valueOf(lightemitUtils.getScreenWidth(lightemitControlCode));
        Integer screenHeight = Integer.valueOf(lightemitUtils.getScreenHeight(lightemitControlCode));
@@ -429,18 +425,23 @@
        source.set_id(UUID.randomUUID().toString());
        //请求头拼接该ID为该资源的完整下载地址
        source.setId(filename);
        //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档
        source.set_type("Video");
        if (type == 1) {
            //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档
            source.set_type("Video");
            source.setMime("video/mp4");
        } else {
            source.set_type("Image");
            source.setMime("image/jpeg");
        }
        //资源后缀名
        source.setFileExt(".mp4");
        source.setFileExt(fileType);
        //资源高度
        source.setHeight(screenHeight);
        //资源宽度
        source.setWidth(screenWidth);
        //距左
        source.setLeft(0);
        source.setMd5("dd135d5d2d44d619a542db773ab529a4");
        source.setMime("video/mp4");
        source.setMd5(md5);
        source.setName(filename);
        source.setPlayTime(0);    //播放起始时间
        source.setSize(filesize);    //资源字节数,要精准
@@ -454,7 +455,7 @@
        List<Layer> list1 = new ArrayList<Layer>();
        list1.add(layer);
        pro.setLayers(list1);
        pro.setName("demo");    //节目名称
        pro.setName("文件上传播放");    //节目名称
        pro.setOthers(true);//如果为true,则该节目来自第三方接口,不是来自我们自己的web,二次开发请务必赋值为true
        pro.setTotalSize(filesize);    //所有资源总字节数
        pro.setVersion(0);            //高级节目=0,简易节目=2
@@ -470,17 +471,29 @@
        task.setItems(list2);
        command.setId(UUID.randomUUID().toString());
        //这里是下方的post回调地址,需要修改IP地址
        command.setNotificationURL("http://" + ip + ":" + port + "/machine-fast/serv/download/getJSON");
        command.setNotificationURL("");
        //资源下载链接的请求头
        command.setPreDownloadURL("http://" + ip + ":" + port + "/machine-fast/serv/download/downloadFile/");
        command.setPreDownloadURL("https://ximonsmart.oss-cn-shanghai.aliyuncs.com/");
        command.setTask(task);
        xixun.set_id(UUID.randomUUID().toString());
        xixun.setCommand(command);
        xixun.setType("commandXixunPlayer");    //命令固定类型,不可更改
        String jsondata = new Gson().toJson(xixun);
        lightemitUtils.clear(lightemitControlCode);
        poleLightemitDao.updateRequestBody(lightemitControlCode, jsondata);
        lightemitUtils.post(realtimeServerBean.getCommand() + lightemitControlCode, jsondata);
        String clearResult = lightemitUtils.clear(lightemitControlCode);
        if (clearResult.contains("does not exist")) {
            return "推送失败";
        } else {
            poleLightemitDao.updateRequestBody(lightemitControlCode, jsondata);
            String post = lightemitUtils.post(realtimeServerBean.getCommand() + lightemitControlCode, jsondata);
            LogUtils.error("结果:" + post);
            //{"_type":"success","_id":"ce8dc3ff-dc88-43b7-8f55-60abd8700f1a","timestamp":1653555160535}
            if (post.startsWith("{") && post.endsWith("}") && post.contains("_type\":\"success")) {
                return "推送成功";
            } else {
                return "推送失败";
            }
        }
    }
    /**
@@ -492,16 +505,6 @@
    public void updateRequestBody(String ledCode, String postBody) {
        baseMapper.updateRequestBody(ledCode, postBody);
    }
//    /**
//     * æ ¹æ®led屏编码获取灯杆所有信息
//     *
//     * @param ledCode
//     * @return
//     */
//    public PoleStreetlightEntity getStreetlightByLedCode(String ledCode) {
//        return baseMapper.getStreetlightByLedCode(ledCode);
//    }
    /**
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin.service;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -262,7 +263,7 @@
                layerPro.getSources().forEach(sourcePro -> {
                    long fileId = Long.parseLong(sourcePro.getId());
                    LedSFile file = xiXunFileService.getById(fileId);
                    if(file != null){
                    if (file != null) {
                        String fileUrl = file.getFileUrl();
                        String[] split = fileUrl.split("/");
                        sourcePro.setId(split[split.length - 1]);
@@ -301,6 +302,8 @@
        Gson gson = new GsonBuilder().disableHtmlEscaping().create();
        String jsondata = gson.toJson(xixun);
        System.out.println("推送内容" + JSONUtil.toJsonStr(jsondata));
        Collection<PoleLightemitEntity> poleLightemitEntities = poleLightemitService.listByIds(lightemitIds);
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/LightemitUtils.java
@@ -1,7 +1,9 @@
package com.sandu.ximon.admin.utils;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.sandu.common.file.FileUploadDto;
import com.sandu.ximon.admin.config.RealtimeServerBean;
import com.sandu.ximon.admin.service.PoleLightemitService;
import com.sandu.ximon.admin.utils.request.*;
@@ -32,6 +34,9 @@
    private final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private OkHttpClient client = new OkHttpClient();
    @Autowired
    private Snowflake snowflake;
    public void init() {
@@ -146,36 +151,53 @@
     *
     * @param screenWidth
     * @param screenHeight
     * @param filename
     * @param ledCode
     */
    public void postVideo(String screenWidth, String screenHeight, String filename, String ledCode) {
    public String postFile(String screenWidth, String screenHeight, String ledCode, FileUploadDto fileUploadDto) {
        String fileUrl = fileUploadDto.getFileUrl();
        String[] split = fileUrl.split("/");
        String id = split[split.length - 1];
        //led开发板下载视频请求body
        DownloadFileToLocal downloadFileToLocal = new DownloadFileToLocal();
        downloadFileToLocal.url = realtimeServerBean.getUrl() + filename;
        downloadFileToLocal.path += filename;
        downloadFileToLocal.url = realtimeServerBean.getUrl() + "https://ximonsmart.oss-cn-shanghai.aliyuncs.com/" + id;
        downloadFileToLocal.path += fileUrl;
        //led开发板下载视频请求
        this.post(realtimeServerBean.getCommand() + ledCode, new Gson().toJson(downloadFileToLocal));
        //led开发板视频列表请求body
        SetPlayList setPlayList = new SetPlayList();
        setPlayList.list[0] = "/data/data/com.xixun.xy.conn/files/local/abc/" + filename;
//        setPlayList.pathList[0] = "";
        setPlayList.list[0] = fileUrl;
        setPlayList.pathList[0] = ledCode;
        try {
            setPlayList.width = Integer.valueOf(screenWidth);
            setPlayList.height = Integer.valueOf(screenHeight);
        } catch (Exception e) {
            return;
            return "推送失败";
        }
        String postBody = new Gson().toJson(setPlayList);
        //保存led数据
        poleLightemitService.updateRequestBody(ledCode, postBody);
        //led开发板视频列表请求
        this.post(realtimeServerBean.getCommand() + ledCode, postBody);
        String post = this.post(realtimeServerBean.getCommand() + ledCode, postBody);
        LogUtils.error("视频上传结果:----" + post);
        if (post.contains("does not exist")) {
            return "推送失败";
        } else {
            //{"_type":"success","_id":"ce8dc3ff-dc88-43b7-8f55-60abd8700f1a","timestamp":1653555160535}
            if (post.startsWith("{") && post.endsWith("}") && post.contains("_type\":\"success")) {
                //保存led数据
                poleLightemitService.updateRequestBody(ledCode, postBody);
                return "推送成功";
            } else {
                return "推送失败";
            }
        }
    }
    /**
     * led屏字幕设置
     *
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/VnnoxProgramAPIUtil.java
@@ -3,6 +3,7 @@
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.utils.request.CommonHeader;
import com.sandu.ximon.admin.dto.nova.PlayerProgram;
@@ -23,11 +24,10 @@
    /**
     * æ™®é€šèŠ‚ç›®æ’­æ”¾
     * å¤§æ°”信息推送
     * @param
     * @return
     */
    //public VnnoxResultResponse normalProgram(Map<String,Object> program) {
    public VnnoxResultResponse normalProgram(AirDataProgram program) {
        String result = VnnoxRequestUtil.PostWithHeader(
@@ -41,6 +41,11 @@
    }
    /**
     * æ™®é€šèŠ‚ç›®æ’­æ”¾
     * @param
     * @return
     */
    public VnnoxResultResponse normalProgram(PlayerProgram program) {
        String result = VnnoxRequestUtil.PostWithHeader(
@@ -54,6 +59,24 @@
    }
    /**
     * å®žæ—¶èŠ‚ç›®æ’­æ”¾
     * @param
     * @return
     */
    public VnnoxResultResponse pushProgram(ProgramPush program) {
        String result = VnnoxRequestUtil.PostWithHeader(
                VnnoxUrl.getUrl(VnnoxUrl.NORMAL_PROGRAM),
                program.toJson(),
                new CommonHeader(CommonHeader.JSON, true)
        );
        System.out.println(program.toJson());
        LogUtils.error("普通节目播放response:"+result);
        return JSON.parseObject(result,VnnoxResultResponse.class);
    }
    /**
     * å®šæ—¶èŠ‚ç›®æ’­æ”¾
     * @param program
     * @return
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/DownloadFileToLocal.java
@@ -12,6 +12,6 @@
    public String url;
    public String path = "/abc/";
    public String path = "https://ximonsmart.oss-cn-shanghai.aliyuncs.com/";
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/request/SetPlayList.java
@@ -12,7 +12,7 @@
    public String[] list = new String[1] ;
//    public String[] pathList = new String[1];
  public String[] pathList = new String[1];
    public Integer width = 128;