2021与蓝度共同重构项目,服务端
liuhaonan
2022-11-18 385b687cc1a0a8f6de2320af6b6e0d654cd658ed
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/led/NewNovaLedService.java
@@ -1,13 +1,40 @@
package com.sandu.ximon.admin.newnova.led;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5AtmosphereHeartbeatReportInnerFrame;
import com.sandu.ximon.admin.newnova.conf.ProgramPathConfig;
import com.sandu.ximon.admin.newnova.param.NewNovaLedParam;
import com.sandu.ximon.admin.newnova.param.ProgramPrarm;
import com.sandu.ximon.admin.newnova.program.NewNovaProgramService;
import com.sandu.ximon.admin.newnova.utils.NovaAPIUtil;
import com.sandu.ximon.admin.newnova.vo.ProWHVO;
import com.sandu.ximon.admin.newnova.vo.StatusVO;
import com.sandu.ximon.admin.newnova.vo.TrasfromStatusVO;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.service.AirDataService;
import com.sandu.ximon.admin.service.PoleBindingService;
import com.sandu.ximon.admin.service.PoleService;
import com.sandu.ximon.dao.bo.NewNovaGroupListBo;
import com.sandu.ximon.dao.domain.NewNovaLed;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.mapper.NewNovaLedMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author LiuHaoNan
@@ -17,6 +44,8 @@
@AllArgsConstructor
public class NewNovaLedService extends BaseServiceImpl<NewNovaLedMapper, NewNovaLed> {
    private final PoleBindingService poleBindingService;
    private ProgramPathConfig filePathConfig;
    /**
     * 屏幕注册
@@ -32,9 +61,320 @@
        NewNovaLed led = new NewNovaLed();
        led.setSn(param.getSn());
        led.setName(param.getName());
        led.setOnlineSign(0);
        return save(led);
    }
    /**
     * 编辑屏幕名称
     *
     * @param param
     * @return
     */
    public boolean editLed(NewNovaLedParam param) {
        if (param.getId() == null) {
            throw new BusinessException("屏幕id不能为空");
        }
        if (param.getName() == null || param.getName().isEmpty()) {
            throw new BusinessException("屏幕名称不能为空");
        }
        NewNovaLed one = getById(param.getId());
        if (one == null) {
            throw new BusinessException("设备不存在!");
        }
//        one.setSn(param.getSn());
        one.setName(param.getName());
        return updateById(one);
    }
    /**
     * 删除LED
     *
     * @param ids
     * @return
     */
    public boolean delLed(List<Long> ids) {
        if (ids.isEmpty()) {
            throw new BusinessException("id不能为空");
        }
        List<NewNovaLed> newNovaLeds = listByIds(ids);
        if (newNovaLeds.isEmpty()) {
            throw new BusinessException("设备不存在!");
        }
        //获取删除设备的设备码
        List<String> snList = newNovaLeds.stream().map(NewNovaLed::getSn).collect(Collectors.toList());
        //删除绑定关系
        SpringContextHolder.getBean(PoleBindingService.class).remove(Wrappers.lambdaQuery(PoleBinding.class)
                .eq(PoleBinding::getDeviceType, 12).in(PoleBinding::getDeviceCode, snList));
        //删除设备
        return removeByIds(ids);
    }
    /**
     * LED列表
     *
     * @param baseConditionVO
     * @param keyword
     * @param groupId
     * @param onlineStatus
     * @return
     */
    public List<NewNovaLed> listLed(BaseConditionVO baseConditionVO, String keyword, Long groupId, boolean onlineStatus) {
        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
        //排序
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        List<NewNovaLed> newNovaListBos = baseMapper.listLed(keyword, groupId, SecurityUtils.getClientId());
        //获取在线状态
        instanceUtil.getOnlineStatus(newNovaListBos, onlineStatus);
        //获取屏幕开关
        instanceUtil.getScreenPowerState(newNovaListBos);
        //获取音量
        instanceUtil.getVolumeState(newNovaListBos);
        //获取亮度
        instanceUtil.getScreenBrightness(newNovaListBos);
        //获取同步状态
        instanceUtil.getSync(newNovaListBos);
        updateBatchById(newNovaListBos);
        return newNovaListBos;
    }
    public NewNovaLed getInfo(Long ledId) {
        NovaAPIUtil instanceUtil = NovaAPIUtil.getInstanceUtil();
        NewNovaLed byId = getById(ledId);
        if (byId == null) {
            throw new BusinessException("设备不存在或id不正确 !");
        }
        PoleBinding poleBinding = SpringContextHolder.getBean(PoleBindingService.class).getOne(Wrappers.lambdaQuery(PoleBinding.class)
                .eq(PoleBinding::getDeviceCode, byId.getSn()).eq(PoleBinding::getDeviceType, 12));
        if (poleBinding != null) {
            Pole pole = SpringContextHolder.getBean(PoleService.class).getById(poleBinding.getPoleId());
            byId.setPoleId(pole.getId());
            byId.setPoleName(pole.getPoleName());
        }
        List<NewNovaLed> list = new ArrayList<>();
        list.add(byId);
        //获取在线状态
        instanceUtil.getOnlineStatus(list, false);
        //获取屏幕开关
        instanceUtil.getScreenPowerState(list);
        //获取音量
        instanceUtil.getVolumeState(list);
        //获取亮度
        instanceUtil.getScreenBrightness(list);
        //获取同步状态
        instanceUtil.getSync(list);
        //获取详情
        instanceUtil.getInfo(byId);
        return list.get(0);
    }
    /**
     * 获取整组的屏幕
     *
     * @param groupId
     */
    public List<NewNovaGroupListBo> getListByGroupId(Long groupId) {
        List<NewNovaGroupListBo> listByGroupId = baseMapper.getListByGroupId(groupId, SecurityUtils.getClientId());
        return listByGroupId;
    }
    /**
     * 推送大气
     *
     * @param id
     * @param duration
     * @param fontSize
     */
    public Object pushAirData(Long id, Long duration, Long fontSize) throws InterruptedException {
        NovaAPIUtil apiUtil = NovaAPIUtil.getInstanceUtil();
        NewNovaLed byId = getById(id);
        PoleBinding nova = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, byId.getSn()).eq(PoleBinding::getDeviceType, 12));
        if (nova == null) {
            throw new BusinessException("未绑定诺瓦设备");
        }
        PoleBinding air = poleBindingService.getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getPoleId, nova.getPoleId()).eq(PoleBinding::getDeviceType, 3));
        if (air == null) {
            throw new BusinessException("未绑定大气设备");
        }
        //获取大气监测数据
        A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data = SpringContextHolder.getBean(AirDataService.class).getDataByPoleid(nova.getPoleId());
        //解析大气数据
        Map pageInfo = parseData(data, duration,fontSize);
        ProgramPrarm page = new ProgramPrarm();
        page.setPageInfo(pageInfo);
        page.setInsertPlay(true);
        ProWHVO whvo = new ProWHVO("大气监测", 128, 256);
        page.setProgramMsg(whvo);
        StatusVO createPro = apiUtil.createPro(whvo);
        Integer pid = Integer.valueOf(createPro.getStatusData());
        page.setProgramID(pid);
        StatusVO editPro = apiUtil.editProgram(pid, pageInfo);
        if(editPro.getStatusCode()!=0){
            throw new BusinessException(editPro.getStatusData());
        }
        StatusVO genVO = apiUtil.genrateProgram(pid);
        if(genVO.getStatusCode()!=0){
            throw new BusinessException(genVO.getStatusData());
        }
        page.setProgramID(Integer.valueOf(createPro.getStatusData()));
        page.setStartPlayAfterTransferred(true);
        List<String> sns = new ArrayList<String>();
        sns.add(byId.getSn());
        page.setSnList(sns);
        List<TrasfromStatusVO> trasfromStatusVOS = apiUtil.trasfromProgram(page);
        File file = new File(filePathConfig.getOutPutPath() + "/program" + pid);
        SpringContextHolder.getBean(NewNovaProgramService.class).deleteFile(file);
        return trasfromStatusVOS;
    }
    /**
     * 处理大气数据
     *
     * @param data
     * @param duration
     * @param fontSize
     * @return
     */
    private Map parseData(A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage data, Long duration, Long fontSize) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z+8:00'");
        Date end = new Date();
        end.setTime(end.getTime()+duration);
        String str = "{\n" +
                "        \"name\": \"大气监测\",\n" +
                "        \"widgetContainers\": [\n" +
                "            {\n" +
                "                \"contents\": {\n" +
                "                    \"widgets\": [\n" +
                "                        {\n" +
                "                            \"constraints\": [\n" +
                "                                {\n" +
                "                                    \"cron\": [\n" +
                "                                        \"\"\n" +
                "                                    ],\n" +
                "                                    \"endTime\": \"" + sdf.format(end) + "\",\n" +
                "                                    \"startTime\": \"" + sdf.format(new Date()) + "\"\n" +
                "                                }\n" +
                "                            ],\n" +
                "                            \"duration\":" + duration + ",\n" +
                "                            \"metadata\": {\n" +
                "                                \"content\": {\n" +
                "                                    \"autoPaging\": true,\n" +
                "                                    \"backgroundMusic\": {\n" +
                "                                        \"duration\": 0,\n" +
                "                                        \"isTextSync\": false\n" +
                "                                    },\n" +
                "                                    \"displayStyle\": {\n" +
                "                                        \"scrollAttributes\": {\n" +
                "                                            \"effects\": {\n" +
                "                                                \"animation\": \"MARQUEE_LEFT\",\n" +
                "                                                \"speed\": 3\n" +
                "                                            }\n" +
                "                                        },\n" +
                "                                        \"type\": \"STATIC\"\n" +
                "                                    },\n" +
                "                                    \"paragraphs\": [\n" +
                "                                        {\n" +
                "                                            \"backgroundColor\": \"#00000000\",\n" +
                "                                            \"horizontalAlignment\": \"LEFT\",\n" +
                "                                            \"letterSpacing\": 0,\n" +
                "                                            \"lineSpacing\": 0,\n" +
                "                                            \"lines\": [\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"环境监测:\"\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"温度:" + (data == null || data.getTemperature() == null ? " - " : data.getTemperature()) + "°\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"湿度:" + (data == null || data.getHumidity() == null ? " - " : data.getHumidity()) + "%\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"pm25:" + (data == null || data.getPm25() == null ? " - " : data.getPm25()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"pm10:" + (data == null || data.getPm10() == null ? " - " : data.getPm10()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"甲醛:" + (data == null || data.getEch2o() == null ? " - " : data.getEch2o()) + "μg/m³\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                },\n" +
                "                                                {\n" +
                "                                                    \"segs\": [\n" +
                "                                                        {\n" +
                "                                                            \"content\": \"CO2:" + (data == null || data.getCo2() == null ? " - " : data.getCo2()) + "ppm\"" + "\n" +
                "                                                        }\n" +
                "                                                    ]\n" +
                "                                                }\n" +
                "                                            ],\n" +
                "                                            \"verticalAlignment\": \"TOP\"\n" +
                "                                        }\n" +
                "                                    ],\n" +
                "                                    \"textAttributes\": [\n" +
                "                                        {\n" +
                "                                            \"backgroundColor\": \"#ff000000\",\n" +
                "                                            \"attributes\": {\n" +
                "                                                \"font\": {\n" +
                "                                                    \"family\": [\n" +
                "                                                        \"Helvetica\"\n" +
                "                                                    ],\n" +
                "                                                    \"isUnderline\": false,\n" +
                "                                                    \"size\": "+fontSize+",\n" +
                "                                                    \"style\": \"NORMAL\"\n" +
                "                                                },\n" +
                "                                                \"letterSpacing\": 0,\n" +
                "                                                \"textColor\": \"#ffff0000\"\n" +
                "                                            }\n" +
                "                                        }\n" +
                "                                    ]\n" +
                "                                }\n" +
                "                            },\n" +
                "                            \"name\": \"环境监测\",\n" +
                "                            \"type\": \"ARCH_TEXT\"\n" +
                "                        }\n" +
                "                    ]\n" +
                "                },\n" +
                "                \"id\": 1,\n" +
                "                \"name\": \"widgetContainers1\"\n" +
                "            }\n" +
                "        ]\n" +
                "    }";
        return JSON.parseObject(str, Map.class);
    }
}