2021与蓝度共同重构项目,服务端
liuhaonan
2022-10-25 d495f9b8cdc83663e4189bc3cc72ac9543ff5555
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java
@@ -1,16 +1,42 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.domain.CommonPage;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.config.FileProperties;
import com.sandu.common.file.impl.AliOssFileServiceImpl;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.dto.LightDataDto;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightHeartbeatReportInnerFrame;
import com.sandu.ximon.dao.bo.LightBo;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightDataEnum;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.dao.bo.LightReportDataBo;
import com.sandu.ximon.dao.domain.LightReportData;
import com.sandu.ximon.dao.domain.Pole;
import com.sandu.ximon.dao.domain.PoleBinding;
import com.sandu.ximon.dao.enums.OrderByEnums;
import com.sandu.ximon.dao.mapper.LightReportDataMapper;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
@@ -19,8 +45,12 @@
 * 灯上报数据 service
 */
@Service
@AllArgsConstructor
public class LightReportDataService extends BaseServiceImpl<LightReportDataMapper, LightReportData> {
    private final FileProperties properties;
    private final AliOssFileServiceImpl fileService;
    private final LightReportDataMapper lightReportDataMapper;
    /**
     * 保存上报的灯心跳数据
@@ -28,15 +58,30 @@
     * @return 是否成功
     */
    public boolean saveReportData(String deviceName, A5LightHeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
//        LightReportData lightReportData = RedisUtils.getBean().get(A5LightDataEnum.LIGHT_HEART_BEAT.getCode() + deviceName, LightReportData.class);
        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"));
        LightReportData lightReportData = new LightReportData();
        if (lightReportData == null) {
            lightReportData = new LightReportData();
            lightReportData.setCreateTime(format);
        }
        lightReportData.setCreateTime(format);
        BeanUtils.copyProperties(heartBeatDataPackage, lightReportData);
        lightReportData.setDeviceCode(deviceName);
        lightReportData.setUpdateTime(format);
        //单灯数据保存到缓存里
        RedisUtils.getBean().set(A5LightDataEnum.LIGHT_HEART_BEAT.getCode() + deviceName, lightReportData);
        return save(lightReportData);
    }
    /**
     * 获取指定设备码最新的一天上报数据
     *
     * @param deviceCodeList 设备码列表
     * @return 上报数据
     */
@@ -46,11 +91,164 @@
    /**
     * 获取上报数据
     * @param keyword 关键词
     *
     * @param keyword    关键词
     * @param deviceCode 设备码
     */
    public List<LightReportDataBo> listReportData(int pageNo, int pageSize, String keyword, String deviceCode) {
        PageHelper.startPage(pageNo,pageSize);
        return baseMapper.listReportData(keyword,deviceCode);
    public CommonPage listReportData(int pageNo, int pageSize, String keyword, String deviceCode, Integer order, Integer seq) {
        List<LightReportDataBo> lightReportDataBos = new ArrayList<>(pageSize);
        //排序字段
        String orderByResult = "t1.create_time";
        //正序、倒叙
        String orderBySeq = OrderByEnums.ASC.getCode();
        if (order != null) {
            switch (order) {
                case 1:
                    orderByResult = OrderByEnums.LIGHT_DATA_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;
        CommonPage<String> stringCommonPage = SpringContextHolder.getBean(LightService.class).listDeviceCode(pageNo, pageSize, keyword, deviceCode, orderBy);
        List<String> macList = stringCommonPage.getList();
        if (CollUtil.isEmpty(macList)) {
            return new CommonPage();
        }
        for (String macCode : macList) {
            try {
                LightReportData lightReportData
                        = JSON.parseObject(RedisUtils.getBean().get(A5LightDataEnum.LIGHT_HEART_BEAT.getCode() + macCode), LightReportData.class);
                LightReportDataBo lightReportDataBo = new LightReportDataBo();
                if (lightReportData != null) {
                    BeanUtils.copyProperties(lightReportData, lightReportDataBo);
                }
                lightReportDataBo.setDeviceCode(macCode);
                Pole pole = SpringContextHolder.getBean(PoleService.class).getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getDeviceCode, macCode));
                if (pole != null) {
                    lightReportDataBo.setPoleName(pole.getPoleName());
                }
                lightReportDataBos.add(lightReportDataBo);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        CommonPage commonPage = CommonPage.restPage(lightReportDataBos);
        commonPage.setTotal(stringCommonPage.getTotal());
        commonPage.setTotalPage(stringCommonPage.getTotalPage());
        commonPage.setPageNum(pageNo);
        return commonPage;
    }
    @SneakyThrows
    public void exportList(HttpServletRequest request, HttpServletResponse response, String deviceCode) {
        if (SecurityUtils.getClientId() != null) {
            PoleBinding one = SpringContextHolder.getBean(PoleBindingService.class).getOne(Wrappers.lambdaQuery(PoleBinding.class).eq(PoleBinding::getDeviceCode, deviceCode)
                    .eq(PoleBinding::getDeviceType, 0));
            if (one == null) {
                throw new BusinessException("未找到绑定关系!");
            } else {
                Pole pole = SpringContextHolder.getBean(PoleService.class).getOne(Wrappers.lambdaQuery(Pole.class).eq(Pole::getUserId, SecurityUtils.getUserId()).or(w -> {
                    w.eq(Pole::getClientId, SecurityUtils.getUserId());
                }));
                if (pole == null) {
                    throw new BusinessException("绑定关系不正确!");
                }
            }
        }
        List<LightReportDataBo> list = lightReportDataMapper.listReportData(null, deviceCode);
        File file = new File("./" + RandomUtil.randomString(12) + ".xlsx");
        EasyExcel.write(file, LightReportDataBo.class).sheet("模版").doWrite(list);
        //文件流化返回给前端
        findfile(request, response, file);
        //删除文件
        // file.delete();
    }
    /**
     * 文件流化
     *
     * @param request
     * @param response
     * @param file
     * @throws IOException
     */
    public void findfile(HttpServletRequest request, HttpServletResponse response, File file) throws IOException {
        ServletOutputStream out = null;
        FileInputStream ips = null;
        try {
            //获取到文字 数据库里对应的附件名字加上老的文件名字:filename 截取到后面的文件类型 例:txt  组成一个新的文件名字:newFileName
            //生成3个随机数,用来生成新的文件名字
            String newFileName = "单灯数据" + RandomUtil.randomString(3) + ".xlsx";
            if (!file.exists()) {
                //如果文件不存在就跳出
                return;
            }
            ips = new FileInputStream(file);
            response.setContentType("application/json;charset=utf-8");
            //为文件重新设置名字,采用数据库内存储的文件名称
            response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(newFileName.getBytes("UTF-8"), "ISO8859-1") + "\"");
            out = response.getOutputStream();
            //读取文件流
            int len = 0;
            byte[] buffer = new byte[1024 * 10];
            while ((len = ips.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
                ips.close();
                file.delete();
            } catch (IOException e) {
                System.out.println("关闭流出现异常");
                e.printStackTrace();
            }
        }
    }
    /**
     * 根据macCode获取灯的数据
     */
    public List<LightReportData> getReportDataList(BaseConditionVO conditionVO, String macCode) {
        if (macCode.isEmpty()) {
            throw new BusinessException("mac不能为空");
        }
        PageHelper.startPage(conditionVO.getPageNo(), conditionVO.getPageSize());
        List<LightReportData> list = list(Wrappers.lambdaQuery(LightReportData.class).eq(LightReportData::getDeviceCode, macCode));
        list.forEach(
                lightReportData -> {
                    lightReportData.setCreateTime(lightReportData.getCreateTime1().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                    lightReportData.setUpdateTime(lightReportData.getUpdateTime1().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
        );
        return list;
    }
}