2021与蓝度共同重构项目,服务端
Van333
2022-12-29 727a69f859060093e685582fa10e5de82dcc138a
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java
@@ -1,28 +1,36 @@
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;
import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
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.admin.utils.StoreOperationRecordsUtils;
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.enums.OrderByEnums;
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.*;
/**
 * 熙讯节目
@@ -31,44 +39,157 @@
@AllArgsConstructor
public class XiXunPlayerService extends BaseServiceImpl<PoleXixunPlayerEntityMapper, PoleXixunPlayerEntity> {
    private final PoleXixunPlayerEntityMapper poleXixunPlayerEntityMapper;
    private final XiXunConfig config;
    private final LightemitUtils lightemitUtils;
    private final RealtimeServerBean realtimeServerBean;
    private final PoleLightemitService poleLightemitService;
    private final ClientService clientService;
    private final LedSFileService xiXunFileService;
    //熙讯节目列表
    public LambdaQueryWrapper<PoleXixunPlayerEntity> XixunPlayerList(String keyword) {
        if (SecurityUtils.getClientId() == null) {
            if (keyword != null && keyword.isEmpty()) {
                return Wrappers.lambdaQuery(PoleXixunPlayerEntity.class);
            } else {
                return Wrappers.lambdaQuery(PoleXixunPlayerEntity.class).like(PoleXixunPlayerEntity::getProgramName, keyword);
            }
        } else {
            if (keyword != null && keyword.isEmpty()) {
                return Wrappers.lambdaQuery(PoleXixunPlayerEntity.class).eq(PoleXixunPlayerEntity::getCreateUserId, SecurityUtils.getUserId())
                        .or(w -> {
                            w.eq(PoleXixunPlayerEntity::getClientId, SecurityUtils.getClientId());
                        });
            } else {
                return Wrappers.lambdaQuery(PoleXixunPlayerEntity.class).eq(PoleXixunPlayerEntity::getCreateUserId, SecurityUtils.getUserId())
                        .or(w -> {
                            w.eq(PoleXixunPlayerEntity::getClientId, SecurityUtils.getClientId());
                        }).like(PoleXixunPlayerEntity::getProgramName, keyword);
            }
        }
    }
    public List<PoleXixunPlayerEntity> listProgram(BaseConditionVO baseConditionVO, Integer order, Integer seq, String keyword) {
        LambdaQueryWrapper<PoleXixunPlayerEntity> wrapper = XixunPlayerList(keyword);
        //排序字段
        String orderByResult = "program_id";
        //正序、倒叙
        String orderBySeq = OrderByEnums.ASC.getCode();
        if (order != null) {
            switch (order) {
                case 1:
                    orderByResult = OrderByEnums.LED_S_PROGRAM_CREATE_TIME.getCode();
                    break;
                default:
            }
        }
        if (seq != null) {
            switch (seq) {
                case 1:
                    orderBySeq = " ASC";
                    break;
                case 2:
                    orderBySeq = " DESC";
                    break;
                default:
                    break;
            }
        }
        //排序方式
        String orderBy = orderByResult + " " + orderBySeq;
        if (baseConditionVO != null) {
            PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize(), orderBy);
        }
        return list(wrapper);
    }
    public boolean insert(ProgramPro programPro) {
        String json = JsonUtil.jsonObj2Sting(programPro);
        Gson gson = new GsonBuilder().disableHtmlEscaping().create();
        String json = gson.toJson(programPro);
        PoleXixunPlayerEntity poleXixunPlayer = new PoleXixunPlayerEntity();
        poleXixunPlayer.setProgramCode(programPro.get_id());
        poleXixunPlayer.setProgramName(programPro.getName());
        poleXixunPlayer.setHeight(programPro.getHeight());
        poleXixunPlayer.setWidth(programPro.getWidth());
        poleXixunPlayer.setTotalSize((float) programPro.getTotalSize() / 1000000 + "MB");
//        poleXixunPlayer.setTotalSize( Long.parseLong(programPro.getTotalSize()) / 1000000 + "MB");
//        programPro.setProgramId(poleXixunPlayer.getProgramId());
//        System.out.println(poleXixunPlayer.getProgramId());
        poleXixunPlayer.setRequestBody(json);
        poleXixunPlayer.setScreenShot(programPro.getScreenShot());
        //  poleXixunPlayer.setCreatTime(sdf.format(date));
        poleXixunPlayer.setCreateUserId(SecurityUtils.getUserId());
        if (!clientService.findClientId()) {
            poleXixunPlayer.setClientId(clientService.getClientId());
        if (SecurityUtils.getClientId() != null) {
            poleXixunPlayer.setCreateUserId(SecurityUtils.getUserId());
            if (clientService.findClientId()) {
                poleXixunPlayer.setClientId(clientService.getClientId());
            }
        }
        return this.save(poleXixunPlayer);
        boolean save = this.save(poleXixunPlayer);
        /**
         * 熙汛节目新增日志记录开始
         */
        String content = "{节目id:" + poleXixunPlayer.getProgramId()
                + ", 节目名称:" + poleXixunPlayer.getProgramName()
                + ", 节目内容:" + json
                + " }";
        StoreOperationRecordsUtils.storeOperationData(null, null, "熙汛节目添加", content);
        /**
         * 熙汛节目新增日志记录结束
         */
        return save;
    }
    public boolean deleteProgram(Long pid) {
        PoleXixunPlayerEntity byId = getById(pid);
        if (byId == null) {
    /**
     * 编辑
     *
     * @param programPro
     * @return
     */
    public boolean update(ProgramPro programPro) {
        Gson gson = new GsonBuilder().disableHtmlEscaping().create();
        String json = gson.toJson(programPro);
//        String jsondata = JsonUtil.jsonObj2Sting(programPro);
        PoleXixunPlayerEntity poleXixunPlayer = new PoleXixunPlayerEntity();
        poleXixunPlayer.setProgramCode(programPro.get_id());
        poleXixunPlayer.setProgramName(programPro.getName());
        poleXixunPlayer.setHeight(programPro.getHeight());
        poleXixunPlayer.setWidth(programPro.getWidth());
        poleXixunPlayer.setTotalSize((float) programPro.getTotalSize() / 1000000 + "MB");
        poleXixunPlayer.setRequestBody(json);
        poleXixunPlayer.setScreenShot(programPro.getScreenShot());
        if (SecurityUtils.getClientId() != null) {
            poleXixunPlayer.setCreateUserId(SecurityUtils.getUserId());
            if (clientService.findClientId()) {
                poleXixunPlayer.setClientId(clientService.getClientId());
            }
        }
        poleXixunPlayer.setProgramId(programPro.getProgramId());
        boolean updateResult = updateById(poleXixunPlayer);
        /**
         * 熙汛节目新增日志记录开始
         */
        String content = "{节目id:" + poleXixunPlayer.getProgramId()
                + ", 节目名称:" + poleXixunPlayer.getProgramName()
                + ", 节目内容:" + json
                + " }";
        StoreOperationRecordsUtils.storeOperationData(null, null, "熙汛节目编辑", content);
        /**
         * 熙汛节目新增日志记录结束
         */
        return updateResult;
    }
    public boolean deleteProgram(List<Long> pids) {
        List<PoleXixunPlayerEntity> poleXixunPlayerEntities = listByIds(pids);
        if (poleXixunPlayerEntities.isEmpty()) {
            throw new BusinessException("未找到该节目");
        }
        return removeById(pid);
        /**
         * 熙汛节目删除日志记录开始
         */
        String content = "{删除的节目id:" + pids
                + " }";
        StoreOperationRecordsUtils.storeOperationData(null, null, "熙汛节目删除", content);
        /**
         * 熙汛节目删除日志记录结束
         */
        return removeByIds(pids);
    }
    public Object getByPid(Long pid) {
@@ -81,7 +202,9 @@
        String json = byId.getRequestBody();
        ProgramPro programPro = new ProgramPro();
        try {
            programPro = JsonUtil.convertJsonStringToObject(json, ProgramPro.class);
            Gson gson = new GsonBuilder().disableHtmlEscaping().create();
//            programPro = JsonUtil.convertJsonStringToObject(json, ProgramPro.class);
            programPro = gson.fromJson(json, ProgramPro.class);
            programPro.setProgramId(pid);
            programPro.setScreenShot(byId.getScreenShot());
            programPro.getLayers().forEach(
@@ -101,67 +224,192 @@
        return programPro;
    }
    /**
     * 推送节目
     *
     * @param programId
     * @param lightemitIds
     */
    public void videoXixunPlayer(long programId, List<Long> lightemitIds) {
    public List<Map> videoXixunPlayer(long programId, List<Long> lightemitIds) {
        //记录操作结果
        List<Map> mapList = new ArrayList<>();
        ProgramPro pro = new ProgramPro();
        ItemPro items = new ItemPro();
        TaskPro taskPro = new TaskPro();
        CommandPro command = new CommandPro();
        XixunPlayerPro xixun = new XixunPlayerPro();
        PoleXixunPlayerEntity poleXixunPlayerEntity = new PoleXixunPlayerEntity();
        PoleXixunPlayerEntity poleXixunPlayerEntity;
        items.set_id(UUID.randomUUID().toString());
        QueryWrapper<PoleXixunPlayerEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("program_id", programId);
        poleXixunPlayerEntity = this.getOne(queryWrapper);
        if (poleXixunPlayerEntity == null) {
            throw new BusinessException("节目数据异常!");
        }
        String json = poleXixunPlayerEntity.getRequestBody();
        if (StringUtils.isEmpty(json)) {
            throw new BusinessException("节目数据异常!");
        }
//        System.out.println( JSON.parseArray(json, ProgramPro.class));
        ProgramPro pro;
        try {
            pro = JsonUtil.convertJsonStringToObject(json, ProgramPro.class);
            pro.getLayers().forEach(layerPro -> {
                layerPro.getSources().forEach(sourcePro -> {
                    long fileId = Long.parseLong(sourcePro.getId());
                    LedSFile file = xiXunFileService.getById(fileId);
                    if (file != null) {
                        String fileUrl = file.getFileUrl();
                        String[] split = fileUrl.split("/");
                        sourcePro.setId(split[split.length - 1]);
                        sourcePro.setMd5(file.getMd5());
                    }
                });
            });
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException("节目数据异常!");
        }
        items.set_program(pro);
        items.setRepeatTimes(1);
        items.setSchedulePros(null);//定时段,不做定时可为null
        //定时段,不做定时可为null
        items.setSchedulePros(null);
        taskPro.set_id(UUID.randomUUID().toString());
        taskPro.setName(poleXixunPlayerEntity.getProgramName());
        List<ItemPro> list2 = new ArrayList<>();
        list2.add(items);
        taskPro.setItems(list2);
        command.setId(UUID.randomUUID().toString());
        //这里是下方的post回调地址,需要修改IP地址
        command.setNotificationURL("http://" + config.getIp() + ":" + config.getPort() + "/machine-fast/serv/download/getJSON");
        //资源下载链接的请求头
        command.setPreDownloadURL("http://" + config.getIp() + ":" + config.getPort() + "/machine-fast/serv/download/downliadFileById/");
        command.setNotificationURL("");
        //资源下载链接的请求头,阿里云图片下载地址头
        command.setPreDownloadURL("https://ximonsmart.oss-cn-shanghai.aliyuncs.com/");
        command.setTask(taskPro);
        xixun.set_id(UUID.randomUUID().toString());
        xixun.setCommand(command);
        xixun.setType("commandXixunPlayer");    //命令固定类型,不可更改
        //命令固定类型,不可更改
        xixun.setType("commandXixunPlayer");
        Gson gson = new GsonBuilder().disableHtmlEscaping().create();
//        String jsondata = JSON.toJSONString(xixun);
        String jsondata = gson.toJson(xixun);
        System.out.println("推送内容" + JSONUtil.toJsonStr(jsondata));
        Collection<PoleLightemitEntity> poleLightemitEntities = poleLightemitService.listByIds(lightemitIds);
        if (poleLightemitEntities != null) {
            Map map;
            for (PoleLightemitEntity entity : poleLightemitEntities) {
                lightemitUtils.clear(entity.getLightemitControlCode());
                poleLightemitService.updateRequestBody(entity.getLightemitControlCode(), jsondata);
                String post = lightemitUtils.post(realtimeServerBean.getCommand() + entity.getLightemitControlCode(), jsondata);
                LogUtils.error("结果:" + post);
                map = new LinkedHashMap();
                String clearResult = lightemitUtils.clear(entity.getLightemitControlCode());
                if (clearResult.contains("does not exist")) {
                    map.put("LightemitId", entity.getLightemitId());
                    map.put("Result", "失败");
                    mapList.add(map);
                } else {
                    poleLightemitService.updateRequestBody(entity.getLightemitControlCode(), jsondata);
                    String post = lightemitUtils.post(realtimeServerBean.getCommand() + entity.getLightemitControlCode(), jsondata);
                    //{"_type":"success","_id":"ce8dc3ff-dc88-43b7-8f55-60abd8700f1a","timestamp":1653555160535}
                    if (post.startsWith("{") && post.endsWith("}") && post.contains("_type\":\"success")) {
                        map.put("LightemitId", entity.getLightemitId());
                        map.put("Result", "成功");
                        mapList.add(map);
                    } else {
                        map.put("LightemitId", entity.getLightemitId());
                        map.put("Result", "失败");
                        mapList.add(map);
                    }
                    LogUtils.error("结果:" + post);
                }
            }
        }
        /**
         * 熙汛节目推送日志记录开始
         */
        List<String> listCode = new ArrayList<>();
        for (PoleLightemitEntity bean : poleLightemitEntities) {
            listCode.add(bean.getLightemitControlCode());
        }
        String content = "{节目id:" + programId
                + ", 节目名称:" + poleXixunPlayerEntity.getProgramName()
                + ", 节目内容:" + json
                + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛节目推送", content);
        /**
         * 熙汛节目推送日志记录结束
         */
        return mapList;
    }
    /**
     * 推送大气数据到熙讯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);
        }
    }
}