2021与蓝度共同重构项目,服务端
liuhaonan
2022-11-04 e55c8b0a92eb9715edd90c31dfd4de51a47b588b
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleLightemitService.java
@@ -1,38 +1,47 @@
package com.sandu.ximon.admin.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.alibaba.fastjson.JSON;
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.ximon.admin.config.NginxConfigBean;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.config.RealtimeServerBean;
import com.sandu.ximon.admin.entity.*;
import com.sandu.ximon.admin.utils.Constant;
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.request.SubTitleSet;
import com.sandu.ximon.admin.param.PoleBindingParam;
import com.sandu.ximon.admin.redis.DeviceRedisKey;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.*;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.admin.vo.RedisDeviceStatus;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleLightemitEntity;
import com.sandu.ximon.dao.enums.OrderByEnums;
import com.sandu.ximon.dao.enums.PoleBindingEnums;
import com.sandu.ximon.dao.mapper.PoleLightemitEntityMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
 * 熙讯设备
 */
@Service
@EnableCaching
public class PoleLightemitService extends BaseServiceImpl<PoleLightemitEntityMapper, PoleLightemitEntity> {
    //    @Autowired
//    PoleStreetlightLightemitService poleStreetlightLightemitService;
    @Autowired
    private PoleBindingService poleBindingService;
    LightemitUtils lightemitUtils;
    @Autowired
@@ -41,15 +50,15 @@
    private String port;
    @Autowired
    ApplicationContext applicationContext;
    //    @Autowired
//    FfmpegUtils ffmpegUtils;
//    @Autowired
//    FileUploadPathBean fileUploadPathBean;
    @Autowired
    NginxConfigBean nginxConfigBean;
    @Autowired
    PoleLightemitEntityMapper poleLightemitDao;
    @Autowired
    LedSFileService xiXunFileService;
    @Autowired
    RedisUtils redisUtils;
    @PostConstruct
    public void init() {
@@ -57,186 +66,324 @@
        lightemitUtils = applicationContext.getBean(LightemitUtils.class);
    }
    /*@Override
    public PageUtils queryPage(Map<String, Object> params, Long userId) {
    /**
     * 熙讯list
     *
     * @param keyword
     * @param isOnLine
     * @return
     */
    public List<PoleLightemitEntity> listLed(String keyword, Integer order, Integer seq, boolean isOnLine) {
        List<PoleLightemitEntity> poleLightemitEntityList;
        //排序字段
        String orderByResult = "id";
        //正序、倒叙
        String orderBySeq = OrderByEnums.ASC.getCode();
        if (order != null) {
            switch (order) {
                case 1:
                    orderByResult = OrderByEnums.LED_S_CODE.getCode();
                    break;
                case 2:
                    orderByResult = OrderByEnums.LED_S_NAME.getCode();
                    break;
                case 3:
                    orderByResult = OrderByEnums.LED_S_POLE_NAME.getCode();
                    break;
                case 4:
                    orderByResult = OrderByEnums.LED_S_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;
        String key = (String)params.get("key");
        //超管
        if (SecurityUtils.getClientId() == null) {
            poleLightemitEntityList = poleLightemitDao.listLed(keyword, null, orderBy);
        } else {
            poleLightemitEntityList = poleLightemitDao.listLed(keyword, SecurityUtils.getUserId(), orderBy);
        }
        Long groupId = StringUtils.isNotBlank((String)params.get("group"))? Long.valueOf((String)params.get("group")): null;
        List<PoleLightemitEntity> temp = new ArrayList<>();
        for (PoleLightemitEntity poleLightemitEntity : poleLightemitEntityList) {
            //查询设备在线状态
            boolean onLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode());
            //查询屏幕的开启状态
            String isOpen = lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode());
            poleLightemitEntity.setIsOpen(String.valueOf(isOpen));
            poleLightemitEntity.setOnLine(onLine);
            if (!isOnLine || onLine) {
                temp.add(poleLightemitEntity);
            }
        }
        return temp;
    }
        String order = (String)params.get("order");
    /**
     * 熙讯设备列表(用于首页数据统计)
     *
     * @return
     */
    public List<PoleLightemitEntity> listLedOnHome() {
        List<PoleLightemitEntity> poleLightemitEntityList;
        //超管
        if (SecurityUtils.getClientId() == null) {
            poleLightemitEntityList = poleLightemitDao.listLed(null, null, null);
        } else {
            poleLightemitEntityList = poleLightemitDao.listLed(null, SecurityUtils.getUserId(), null);
        }
        String column = (String)params.get("sortby");
        return poleLightemitEntityList;
    }
        IPage<PoleLightemitEntity> page = new Page<>();
        //获取角色列表
        Long roleId = (sysUserRoleService.queryRoleId(userId));
        if(roleId == null || roleId == 0){
    /**
     * 绑定使用
     *
     * @param keyword
     * @return
     */
    public List<PoleLightemitEntity> listLedOnBinding(String keyword) {
        List<PoleLightemitEntity> poleLightemitEntityList;
        //超管
        if (SecurityUtils.getClientId() == null) {
            poleLightemitEntityList = poleLightemitDao.listLedOnBinding(keyword, null);
        } else {
            poleLightemitEntityList = poleLightemitDao.listLedOnBinding(keyword, SecurityUtils.getUserId());
        }
        for (PoleLightemitEntity poleLightemitEntity : poleLightemitEntityList) {
            //查询设备在线状态
            boolean onLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode());
            //查询屏幕的开启状态
            String isOpen = lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode());
            poleLightemitEntity.setIsOpen(String.valueOf(isOpen));
            poleLightemitEntity.setOnLine(onLine);
        }
        return poleLightemitEntityList;
    }
    /**
     * 取出在线的熙讯
     *
     * @param list
     * @return
     */
    public List<PoleLightemitEntity> ledOnline(List<PoleLightemitEntity> list) {
        List<PoleLightemitEntity> onLineList = new ArrayList<>();
        for (PoleLightemitEntity poleLightemitEntity : list) {
//            if(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()).contains("true")){
//                poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()).contains("true"));
//            }
            poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()));
            boolean ledOnLine = lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode());
            if (ledOnLine) {
                poleLightemitEntity.setOnLine(true);
                onLineList.add(poleLightemitEntity);
            } else {
                poleLightemitEntity.setOnLine(false);
            }
        }
        return onLineList;
    }
    /**
     * 设置在线状态
     *
     * @param list
     */
    public void ledOnlineCheck(List<PoleLightemitEntity> list) {
        for (PoleLightemitEntity poleLightemitEntity : list) {
            poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()));
            poleLightemitEntity.setOnLine(lightemitUtils.getLedOnLine(poleLightemitEntity.getLightemitControlCode()));
        }
    }
    /**
     * 查询单个LED
     *
     * @param lightControlCode
     * @return
     */
    public PoleLightemitEntity getLedByLightControlCode(String lightControlCode) {
        PoleLightemitEntity xiXun = getOne(Wrappers.lambdaQuery(PoleLightemitEntity.class).eq(PoleLightemitEntity::getLightemitControlCode, lightControlCode));
        Pole getpole = poleLightemitDao.getpole(lightControlCode);
        if (xiXun == null) {
            return null;
        }
        boolean isScreenOpen = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode());
        if(roleId.longValue() == Constant.SUPER_ADMIN){
//            page = this.page(
//                    new Query<PoleLightemitEntity>().getPage(params),
//                    new QueryWrapper<PoleLightemitEntity>().like(StringUtils.isNotBlank(key),"lightemit_name", key));
            if (order != null && order.equals("ASC") && column.equals("isOpen")) {
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.superAdminSelectPageVo(PageTransform.transformPage(params),key,groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(true)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else if (order != null && order.equals("DESC") && column.equals("isOpen")){
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.superAdminSelectPageVo(PageTransform.transformPage(params),key,groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(false)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else {
                page = baseMapper.superAdminSelectPageVo(PageTransform.transformPage(params), key, groupId,order,column);
            }
        xiXun.setIsOpen(lightemitUtils.getIsScreenOpen(lightControlCode));
        xiXun.setOnLine(isScreenOpen);
        xiXun.setStreetlightName(getpole.getPoleName());
        xiXun.setStreetlightId(getpole.getId());
        }else if(roleId.longValue() == Constant.ADMIN){
            if (order != null && order.equals("ASC") && column.equals("isOpen")) {
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.adminSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(true)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else if (order != null && order.equals("DESC") && column.equals("isOpen")){
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.adminSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(false)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else {
                page = baseMapper.adminSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
            }
        }else if(roleId.longValue() == Constant.USER){
            if (order != null && order.equals("ASC") && column.equals("isOpen")) {
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.userSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(true)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else if (order != null && order.equals("DESC") && column.equals("isOpen")){
                Map<String, Object> map = new HashMap<>();
                Integer pg = 1;
                Integer size = 200;
                map.put("page",pg);
                params.put("limit",size);
                page = baseMapper.userSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
                ledOnlineCheck(page.getRecords());
                page.setRecords(page.getRecords().stream().filter(h-> h.getIsOpen().equals(false)).collect(Collectors.toList()));
                return new PageUtils(page);
            }else {
                page = baseMapper.userSelectPageVo(PageTransform.transformPage(params), userId, key, groupId,order,column);
            }
        }
        ledOnlineCheck(page.getRecords());
        return new PageUtils(page);
        return xiXun;
    }
*//*
    @Override
    public List<PoleLightemitEntity> getAll(Long userId) {
        //获取角色列表
        Long roleId = (sysUserRoleService.queryRoleId(userId));
        if(roleId == null || roleId == 0){
            return null;
    /**
     * 首页灯杆绑定信息
     */
    public EquipmentInfomation getLedByLightControlCodeInfo(String lightControlCode) {
        EquipmentInfomation equipmentInfo = new EquipmentInfomation();
        equipmentInfo.setEquipmentType("SLED");
        if (lightControlCode == null || lightControlCode.trim().length() == 0) {
            return equipmentInfo;
        }
        List<PoleLightemitEntity> list = null;
        if(roleId.longValue() == Constant.SUPER_ADMIN){
            list = poleLightemitDao.selectAll();
        }else if(roleId.longValue() == Constant.ADMIN){
            list = poleLightemitDao.selectAllByCompany(userId);
        }else if(roleId.longValue() == Constant.USER){
            list = poleLightemitDao.selectAllByUser(userId);
        PoleLightemitEntity xiXun = getOne(Wrappers.lambdaQuery(PoleLightemitEntity.class).eq(PoleLightemitEntity::getLightemitControlCode, lightControlCode));
        boolean isScreenOpen = false;
        if (xiXun != null) {
            equipmentInfo.setEquipmentCreateTime(xiXun.getCreateTime());
            equipmentInfo.setEquipmentMac(xiXun.getLightemitControlCode());
            equipmentInfo.setEquipmentName(xiXun.getLightemitName());
            isScreenOpen = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode());
        }
        return list;
        if (isScreenOpen) {
            equipmentInfo.setEquipmentState("在线");
        } else {
            equipmentInfo.setEquipmentState("离线");
        }
        return equipmentInfo;
    }
*/
/*    public void ledOnlineCheck(List<PoleLightemitEntity> list) {
        for(PoleLightemitEntity poleLightemitEntity : list){
            poleLightemitEntity.setIsOpen(lightemitUtils.getIsScreenOpen(poleLightemitEntity.getLightemitControlCode()).contains("true"));
        }
    }*/
    @Transactional(rollbackFor = Exception.class)
    public void savePoleLightemit(PoleLightemitEntity poleLightemit) {
        boolean save = this.save(poleLightemit);
        // 绑定灯杆
        if(save&&!("").equals(poleLightemit.getStreetlightId())){
            System.out.println("-------------");
        if (save && poleLightemit.getStreetlightId() != null) {
            PoleBindingParam poleBindingParam = new PoleBindingParam();
            poleBindingParam.setDeviceCode(poleLightemit.getLightemitControlCode());
            poleBindingParam.setDeviceType(10);
            poleBindingParam.setDeviceName(poleLightemit.getLightemitName());
            if (SpringContextHolder.getBean(PoleService.class).getById(poleLightemit.getStreetlightId()) == null) {
                throw new BusinessException("灯杆不存在");
            }
            boolean b = poleBindingService.bindPole(poleLightemit.getStreetlightId(), poleBindingParam);
        }
      //  poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId());
        /**
         * 熙汛led新增日志记录开始
         */
        List<String> listCode = new ArrayList<>();
        listCode.add(poleLightemit.getLightemitControlCode());
        String content = "{屏幕id:" + poleLightemit.getLightemitId() + ", 屏幕名称:" + poleLightemit.getLightemitName() + ", 屏幕编码:" + poleLightemit.getLightemitControlCode() + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED新增", content);
        /**
         * 熙汛led新增日志记录结束
         */
        //  poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId());
    }
  /*  public void updatePoleLightemit(PoleLightemitEntity poleLightemit) {
        this.updateById(poleLightemit);
        poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId());
    }*/
    public void updatePoleLightemit(Long ledId, PoleLightemitEntity poleLightemit) {
        PoleLightemitEntity byId = getById(ledId);
        if (byId == null) {
            throw new BusinessException("未找到LED屏");
        }
        if (SecurityUtils.getClientId() != null) {
            boolean belong = SpringContextHolder.getBean(PoleBindingService.class).isBelong(byId.getLightemitControlCode(), PoleBindingEnums.XIXUN);
            if (!belong) {
                throw new BusinessException("该设备不属于您,不能修改设备信息");
            }
        }
        poleLightemit.setLightemitId(ledId);
        boolean b = this.updateById(poleLightemit);
        // 绑定灯杆
        if (b && poleLightemit.getStreetlightId() != null) {
            //先删除绑定关系
            poleBindingService.unBindPole(null, poleLightemit.getLightemitControlCode());
            //再绑定
            PoleBindingParam poleBindingParam = new PoleBindingParam();
            poleBindingParam.setDeviceCode(poleLightemit.getLightemitControlCode());
            poleBindingParam.setDeviceType(10);
            poleBindingParam.setDeviceName(poleLightemit.getLightemitName());
            poleBindingService.bindPole(poleLightemit.getStreetlightId(), poleBindingParam);
        }
        /**
         * 熙汛led编辑日志记录开始
         */
        List<String> listCode = new ArrayList<>();
        listCode.add(byId.getLightemitControlCode());
        String content = "{屏幕id:" + byId.getLightemitId() + ", 屏幕原名:" + byId.getLightemitName() + ", 屏幕名称:" + poleLightemit.getLightemitName() + ", 屏幕编码:" + byId.getLightemitControlCode() + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED编辑", content);
        /**
         * 熙汛led编辑日志记录结束
         */
        // poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId());
    }
    public boolean deletePoleLightemit(List<Long> ledIds) {
        List<PoleLightemitEntity> poleLightemitEntities = listByIds(ledIds);
        if (poleLightemitEntities != null && poleLightemitEntities.size() == 0) {
            throw new BusinessException("设备不存在");
        }
        List<String> listCode = new ArrayList<>();
        // 删除设备绑定
        if (poleLightemitEntities != null && poleLightemitEntities.size() != 0) {
            for (PoleLightemitEntity poleLightemitEntitie : poleLightemitEntities) {
                if (poleLightemitEntitie.getLightemitControlCode() != null) {
                    //删除绑定关系//先删除绑定关系
                    listCode.add(poleLightemitEntitie.getLightemitControlCode());
                    poleBindingService.unBindPole(poleLightemitEntitie.getLightemitControlCode());
                }
            }
        }
        //删除设备
        boolean b = removeByIds(ledIds);
        /**
         * 熙汛led删除日志记录开始
         */
        List<String> nameList = new ArrayList<>();
        for (PoleLightemitEntity poleLightemitEntitie : poleLightemitEntities) {
            nameList.add(poleLightemitEntitie.getLightemitName());
        }
        String content = "{删除熙汛LED的设备信息:" + nameList.toString() + " }";
        StoreOperationRecordsUtils.storeOperationData(listCode, null, "熙汛LED删除", content);
        /**
         * 熙汛led删除日志记录结束
         */
        return b;
        // poleStreetlightLightemitService.saveStreetlightLightemit(poleLightemit.getLightemitId(),poleLightemit.getStreetlightId());
    }
    /**
     * 查询权限范围内的所有led屏信息
     * led上传图片
     *
     * @param
     * @return
     */
   /* public List<PoleLightemitEntity> selectLightemitByUserId(Long userId) {
        List<PoleLightemitEntity> list = new ArrayList<>();
        Long roleId = sysUserRoleService.queryRoleId(userId);
        if(roleId == null || roleId == 0){
            return new ArrayList<>();
        }
        if(roleId.longValue() == Constant.SUPER_ADMIN){
            list = this.list();
        }else if(roleId.longValue() == Constant.ADMIN){
            list = baseMapper.selectCompanyLightemitByUserId(userId);
        }else if(roleId.longValue() == Constant.USER){
            list = baseMapper.selectLightemitByUserId(userId);
        }
        return list;
    }
*/
    /*
    通过屏幕编码查询
     */
    public PoleLightemitEntity selectByLightemitControlCode(String lightemitControlCode) {
        QueryWrapper<PoleLightemitEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("lightemit_control_code", lightemitControlCode);
        return this.getOne(queryWrapper);
    }
    /*
    led上传图片
     * @param lightemitControlCode
     * @param path
     * @param filenameList
     * @param userName
     * @throws IOException
     */
    @Async("taskExecutor")
    public void photoUpload(String lightemitControlCode, String path, List<String> filenameList, String userName) throws IOException {
@@ -273,76 +420,30 @@
        }
    }
    /*
    led上传视频
    /**
     * led上传视频
     *
     * @param lightemitControlCode
     */
    @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;
    }
    /**
     * LED上传单行字幕
     */
    @Async("taskExecutor")
    public Boolean subTitleSet(SubTitleSetEntity subTitleSetEntity, String path, String userName) {
        if (subTitleSetEntity == null) {
            return false;
        }
        if (subTitleSetEntity.getDirection().equals(Constant.LEFT) || subTitleSetEntity.getDirection().equals(Constant.RIGHT)) {
            //字幕横向滚动
            this.BuildHorizonSingSubTitleText(subTitleSetEntity);
        } else if (subTitleSetEntity.getDirection().equals(Constant.UP) || subTitleSetEntity.getDirection().equals(Constant.DOWN)) {
            //字幕纵向滚动
            try {
                this.BuildVerticalSingSubTitleText(subTitleSetEntity, path, userName);
            } catch (IOException e) {
                return false;
            }
        }
        return true;
    }
    /**
     * LED上传多行字幕
     */
    @Async("taskExecutor")
    public Boolean subMultiTitleSet(SubTitleSetEntity subTitleSetEntity, String path, String userName) {
        try {
            this.BuildVerticalMultiSubTitleText(subTitleSetEntity, path, userName);
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    /*
    删除
     */
   /* public void deleteByIds(List<Long> lightemitIds) {
        this.removeByIds(lightemitIds);
        //删除关系表中的数据
        poleStreetlightLightemitService.remove(
                new UpdateWrapper<PoleStreetlightLightemitEntity>().in("lightemit_id", lightemitIds.toArray()));
    }*/
    /*
    熙讯视频设置
     */
    @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));
@@ -353,15 +454,27 @@
        ProgramsTask task = new ProgramsTask();
        Command command = new Command();
        XixunPlayer xixun = new XixunPlayer();
        source.set_id(UUID.randomUUID().toString());//所有_id都可用UUID随机生成
        source.setId(filename);//请求头拼接该ID为该资源的完整下载地址
        source.set_type("Video");    //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档
        source.setFileExt(".mp4");    //资源后缀名
        source.setHeight(screenHeight);        //资源高度
        source.setWidth(screenWidth);        //资源宽度
        source.setLeft(0);            //距左
        source.setMd5("dd135d5d2d44d619a542db773ab529a4");
        source.setMime("video/mp4");
        //所有_id都可用UUID随机生成
        source.set_id(UUID.randomUUID().toString());
        //请求头拼接该ID为该资源的完整下载地址
        source.setId(filename);
        if (type == 1) {
            //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档
            source.set_type("Video");
            source.setMime("video/mp4");
        } else {
            source.set_type("Image");
            source.setMime("image/jpeg");
        }
        //资源后缀名
        source.setFileExt(fileType);
        //资源高度
        source.setHeight(screenHeight);
        //资源宽度
        source.setWidth(screenWidth);
        //距左
        source.setLeft(0);
        source.setMd5(md5);
        source.setName(filename);
        source.setPlayTime(0);    //播放起始时间
        source.setSize(filesize);    //资源字节数,要精准
@@ -375,7 +488,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
@@ -391,327 +504,94 @@
        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 "推送失败";
            }
        }
    }
    /*
    推送天气数据
    /**
     * 更新请求数据
     *
     * @param ledCode
     * @param postBody
     */
    //@Async("taskExecutor")
   /* public Boolean pushWeather(String lightemitControlCode, PoleSensorEntity sensorEntity, PoleStreetlightEntity 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.getBrightness() == null? "-": sensorEntity.getBrightness()) + "lux<br/>" +
                        "风速:" + (sensorEntity == null || sensorEntity.getWindSpeed() == null? "-": sensorEntity.getWindSpeed()) + "m/s<br/>" +
                        "CO2:" + (sensorEntity == null || sensorEntity.getEco2() == null? "-": sensorEntity.getEco2()) + "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);
        }
    }*/
    /*
    更新请求数据
     */
    public void updateRequestBody(String ledCode, String postBody) {
        baseMapper.updateRequestBody(ledCode, postBody);
    }
    /*
    根据led屏编码获取灯杆所有信息
    /**
     * 根据led屏编码设置音量
     *
     * @param lightemitControlCode
     * @param volume
     */
//    public PoleStreetlightEntity getStreetlightByLedCode(String ledCode) {
//        return baseMapper.getStreetlightByLedCode(ledCode);
//    }
    /*
    根据led屏编码设置音量
     */
    @Async("taskExecutor")
    public void setVolume(String lightemitControlCode, Integer volume) {
        lightemitUtils.setVoiume(lightemitControlCode, volume);
    }
//    public List<PoleLightemitEntity> listOfStreetlight(String streetlightId) {
//        return baseMapper.listOfStreetlight(streetlightId);
//    }
//    public List<PoleLightemitEntity> selectLedByStreetlightId(String streetlightId) {
//        return baseMapper.getLedByStreetlightId(streetlightId);
//    }
    /*
        上传水平滚动单行字幕
         */
    private void BuildHorizonSingSubTitleText(SubTitleSetEntity subTitleSetEntity) {
        //拼装LED屏幕设置请求body
        SubTitleSet subTitleSet = new SubTitleSet();
        subTitleSet.num = subTitleSetEntity.getNum() != null ? subTitleSetEntity.getNum() : subTitleSet.num;
        subTitleSet.interval = subTitleSetEntity.getInterval() != null ? subTitleSetEntity.getInterval() : subTitleSet.interval;
        subTitleSet.step = subTitleSetEntity.getStep() != null ? subTitleSetEntity.getStep() : subTitleSet.step;
        subTitleSet.direction = subTitleSetEntity.getDirection() != null ? subTitleSetEntity.getDirection() : subTitleSet.direction;
        subTitleSet.align = subTitleSetEntity.getAlign() != null ? subTitleSetEntity.getAlign() : subTitleSet.align;
        //拼接html 背景默认显色为白色
        subTitleSet.html = "<head><style type=\"text/css\">body{background-color:" +
                (subTitleSetEntity.getColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getColor()) ? subTitleSetEntity.getColor() : "#000000") +
                "}</style></head><i style=\"color:" +
                (subTitleSetEntity.getFontColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontColor()) ? subTitleSetEntity.getFontColor() : "#ffffff")
                + "; font-size: " +
                (subTitleSetEntity.getFontSize() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontSize()) ? subTitleSetEntity.getFontSize() : "1")
                + "em\">" + subTitleSetEntity.getContent() + "</i>";
        //获取所有led数据
        Collection poleLightemitControllers = this.listByIds(Arrays.asList(subTitleSetEntity.getId()));
        if (!poleLightemitControllers.isEmpty()) {
            Iterator iterator = poleLightemitControllers.iterator();
            while (iterator.hasNext()) {
                PoleLightemitEntity poleLightemitEntity = (PoleLightemitEntity) iterator.next();
                //清屏操作
                lightemitUtils.clear(poleLightemitEntity.getLightemitControlCode());
                //清除播放列表
                lightemitUtils.clearVideoPlay(poleLightemitEntity.getLightemitControlCode());
                //清除节目列表
                lightemitUtils.clearPlayerTask(poleLightemitEntity.getLightemitControlCode());
                //发送字幕设置请求
                lightemitUtils.subTitleSet(subTitleSet, poleLightemitEntity.getLightemitControlCode(), true);
            }
        }
    }
    /*
    上传垂直滚动单行字幕
    /**
     * 根据led屏编码设置亮度
     *
     * @param lightemitControlCode
     * @param brightness
     */
    private void BuildVerticalSingSubTitleText(SubTitleSetEntity subTitleSetEntity, String path, String userName) throws IOException {
        //html地址
        //获取所有led数据
        Collection poleLightemitControllers = this.listByIds(Arrays.asList(subTitleSetEntity.getId()));
        if (!poleLightemitControllers.isEmpty()) {
            Iterator iterator = poleLightemitControllers.iterator();
            while (iterator.hasNext()) {
                PoleLightemitEntity poleLightemitEntity = (PoleLightemitEntity) iterator.next();
    @Async("taskExecutor")
    public void setBrightness(String lightemitControlCode, Integer brightness) {
        lightemitUtils.setBrightness(lightemitControlCode, brightness);
    }
                String lightemitControlCode = poleLightemitEntity.getLightemitControlCode();
    public Object getProgram(Long lightemitId) {
        PoleLightemitEntity xiXun = getById(lightemitId);
                //获取屏幕宽
                Integer screenWidth = Integer.valueOf(lightemitUtils.getScreenWidth(lightemitControlCode));
                Integer screenHeight = Integer.valueOf(lightemitUtils.getScreenHeight(lightemitControlCode));
                String filenameTemp = path + userName + "_" + lightemitControlCode + ".html";
                File htmlFile = new File(filenameTemp);
                if (!htmlFile.exists() || htmlFile.delete()) {
                    htmlFile.createNewFile();
                }
                //若向下滚动,文字顺序相反
                if (Constant.DOWN.equals(subTitleSetEntity.getDirection())) {
                    subTitleSetEntity.setContent(StringUtils.reverse(subTitleSetEntity.getContent()));
                }
                Map<String, Object> params = new HashMap<>();
                params.put("direction", subTitleSetEntity.getDirection());
                params.put("screenWidth", screenWidth);
                params.put("screenHeight", screenHeight);
                params.put("fontSize", subTitleSetEntity.getFontSize() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontSize()) ? subTitleSetEntity.getFontSize() : "1");
                params.put("align", subTitleSetEntity.getAlign());
                params.put("fontColor", subTitleSetEntity.getFontColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontColor()) ? subTitleSetEntity.getFontColor() : "#ffffff");
                params.put("backgroundColor", subTitleSetEntity.getColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getColor()) ? subTitleSetEntity.getColor() : "#000000");
                params.put("interval", subTitleSetEntity.getInterval() != null ? subTitleSetEntity.getInterval() : 50);
                params.put("step", subTitleSetEntity.getStep() != null ? subTitleSetEntity.getStep() : 1);
                params.put("num", subTitleSetEntity.getNum() != null ? subTitleSetEntity.getNum() : -1);
                params.put("contentArray", subTitleSetEntity.getContent().toCharArray());
                String body = new HtmlTemplateUtils().renderPath("classpath:templates/lightemitTemplates/buildVerticalSingSubTitleTemplates.html", params);
                boolean flag = new FileUtil().writeToFile(body, filenameTemp);
                if (flag) {
                    //清屏操作
                    lightemitUtils.clear(lightemitControlCode);
                    //清除播放列表
                    lightemitUtils.clearVideoPlay(lightemitControlCode);
                    //清除节目列表
                    lightemitUtils.clearPlayerTask(lightemitControlCode);
                    //推送
                    lightemitUtils.postHtmlUseNginx(lightemitControlCode, userName);
                }
            }
        String requestBody = xiXun.getRequestBody();
        if (requestBody == null || requestBody.isEmpty()) {
            throw new BusinessException("未找到节目");
        }
        Map map = JSON.parseObject(requestBody, Map.class);
        return map;
    }
    /*
    上传垂直滚动多行字幕
    /**
     * 向Redis中存入设备状态
     */
    private void BuildVerticalMultiSubTitleText(SubTitleSetEntity subTitleSetEntity, String path, String userName) throws IOException {
        //html地址
        //获取所有led数据
        Collection poleLightemitControllers = this.listByIds(Arrays.asList(subTitleSetEntity.getId()));
        if (!poleLightemitControllers.isEmpty()) {
            Iterator iterator = poleLightemitControllers.iterator();
            while (iterator.hasNext()) {
                PoleLightemitEntity poleLightemitEntity = (PoleLightemitEntity) iterator.next();
                String lightemitControlCode = poleLightemitEntity.getLightemitControlCode();
                //获取屏幕宽
                Integer screenWidth = Integer.valueOf(lightemitUtils.getScreenWidth(lightemitControlCode));
                Integer screenHeight = Integer.valueOf(lightemitUtils.getScreenHeight(lightemitControlCode));
                String filenameTemp = path + userName + "_" + lightemitControlCode + ".html";
                File htmlFile = new File(filenameTemp);
                if (!htmlFile.exists() || htmlFile.delete()) {
                    htmlFile.createNewFile();
    public void setCacheData() {
        list().forEach(
                xiXun -> {
                    RedisDeviceStatus deviceStatus = new RedisDeviceStatus();
                    deviceStatus.setDeviceId(xiXun.getLightemitControlCode());
                    boolean ledOnLine = lightemitUtils.getLedOnLine(xiXun.getLightemitControlCode());
                    if (ledOnLine) {
                        deviceStatus.setStatus(0);
                    } else {
                        deviceStatus.setStatus(1);
                    }
                    redisUtils.set(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode(), JSON.toJSONString(deviceStatus));
//                    redisUtils.delete(DeviceRedisKey.XIXUN + xiXun.getLightemitControlCode());
                }
                Map<String, Object> params = new HashMap<>();
                params.put("direction", subTitleSetEntity.getDirection());
                params.put("screenWidth", screenWidth);
                params.put("screenHeight", screenHeight);
                params.put("fontSize", subTitleSetEntity.getFontSize() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontSize()) ? subTitleSetEntity.getFontSize() : "1");
                params.put("align", subTitleSetEntity.getAlign());
                params.put("fontColor", subTitleSetEntity.getFontColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getFontColor()) ? subTitleSetEntity.getFontColor() : "#ffffff");
                params.put("backgroundColor", subTitleSetEntity.getColor() != null && StringUtils.isNotBlank(subTitleSetEntity.getColor()) ? subTitleSetEntity.getColor() : "#000000");
                params.put("interval", subTitleSetEntity.getInterval() != null ? subTitleSetEntity.getInterval() : 50);
                params.put("step", subTitleSetEntity.getStep() != null ? subTitleSetEntity.getStep() : 1);
                params.put("num", subTitleSetEntity.getNum() != null ? subTitleSetEntity.getNum() : -1);
                params.put("contentArray", subTitleSetEntity.getContent().split("\n"));
                String body = new HtmlTemplateUtils().renderPath("classpath:templates/lightemitTemplates/buildVerticalSingSubTitleTemplates.html", params);
                boolean flag = new FileUtil().writeToFile(body, filenameTemp);
                if (flag) {
                    //清屏操作
                    lightemitUtils.clear(lightemitControlCode);
                    //清除播放列表
                    lightemitUtils.clearVideoPlay(lightemitControlCode);
                    //清除节目列表
                    lightemitUtils.clearPlayerTask(lightemitControlCode);
                    //推送
                    lightemitUtils.postHtmlUseNginx(lightemitControlCode, userName);
                }
            }
        }
    }
    //   @Override
    public void xixunplaySetting(String lightemitControlCode) {
        //获取屏幕宽
//        Integer screenWidth = Integer.valueOf(lightemitUtils.getScreenWidth(lightemitControlCode));
//        Integer screenHeight = Integer.valueOf(lightemitUtils.getScreenHeight(lightemitControlCode));
//        Source source = new Source();
//        Layer layer = new Layer();
//        Program pro = new Program();
//        TaskItem items = new TaskItem();
//        ProgramsTask task = new ProgramsTask();
//        Command payload = new Command();
//        XixunPlayer xixun = new XixunPlayer();
//        source.set_id(UUID.randomUUID().toString());//所有_id都可用UUID随机生成
//        source.setId(filename);//请求头拼接该ID为该资源的完整下载地址
//        source.set_type("Video");   //设置资源类型,其他资源类型请参考xixunplayer节目json说明文档
//        source.setFileExt(".mp4");   //资源后缀名
//        source.setHeight(screenHeight);      //资源高度
//        source.setWidth(screenWidth);      //资源宽度
//        source.setLeft(0);         //距左
//        source.setMd5("dd135d5d2d44d619a542db773ab529a4");
//        source.setMime("video/mp4");
//        source.setName(filename);
//        source.setPlayTime(0);   //播放起始时间
//        source.setSize(filesize);   //资源字节数,要精准
//        source.setTimeSpan(videoTime);      //该资源播放时长
//        source.setTop(0);         //距顶
//        List<Source> list = new ArrayList<Source>();
//        list.add(source);
//        layer.setSources(list);
//        pro.set_id(UUID.randomUUID().toString());
//        pro.setHeight(screenHeight);      //节目高度
//        List<Layer> list1=new ArrayList<Layer>();
//        list1.add(layer);
//        pro.setLayers(list1);
//        pro.setName("demo");   //节目名称
//        pro.setOthers(true);//如果为true,则该节目来自第三方接口,不是来自我们自己的web,二次开发请务必赋值为true
//        pro.setTotalSize(filesize);   //所有资源总字节数
//        pro.setVersion(0);         //高级节目=0,简易节目=2
//        pro.setWidth(screenWidth);      //节目宽度
//        items.set_id(UUID.randomUUID().toString());
//        items.set_program(pro);
//        items.setRepeatTimes(1);
//        items.setSchedules(null);//定时段,不做定时可为null
//        task.set_id(UUID.randomUUID().toString());
//        task.setName("这是一个示例");
//        List<TaskItem> list2=new ArrayList<TaskItem>();
//        list2.add(items);
//        task.setItems(list2);
//        payload.setId(UUID.randomUUID().toString());
//        //这里是下方的post回调地址,需要修改IP地址
//        payload.setNotificationURL("http://" + ip + ":" + port + "/machine-fast/serv/download/getJSON");
//        //资源下载链接的请求头
//        payload.setPreDownloadURL("http://" + ip + ":" + port + "/machine-fast/serv/download/downloadFile/");
//        payload.setTask(task);
//        xixun.set_id(UUID.randomUUID().toString());
//        xixun.setCommand(payload);
//        xixun.setType("commandXixunPlayer");   //命令固定类型,不可更改
//        String jsondata = new Gson().toJson(xixun);
//        lightemitUtils.clear(lightemitControlCode);
//        this.updateRequestBody(lightemitControlCode,jsondata);
//        lightemitUtils.post(realtimeServerBean.getCommand() + lightemitControlCode,jsondata);
        );
    }
}