| | |
| | | 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.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.service.impl.BaseServiceImpl; |
| | | import com.sandu.common.util.SpringContextHolder; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightHeartbeatReportInnerFrame; |
| | | 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.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; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | |
| | | * 灯上报数据 service |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class LightReportDataService extends BaseServiceImpl<LightReportDataMapper, LightReportData> { |
| | | |
| | | private final FileProperties properties; |
| | | private final AliOssFileServiceImpl fileService; |
| | | |
| | | /** |
| | | * 保存上报的灯心跳数据 |
| | |
| | | * @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); |
| | | } |
| | | //todo |
| | | lightReportData.setCreateTime(format); |
| | | BeanUtils.copyProperties(heartBeatDataPackage, lightReportData); |
| | | lightReportData.setDeviceMac(deviceName); |
| | | lightReportData.setDeviceCode(deviceName); |
| | | |
| | | lightReportData.setUpdateTime(format); |
| | | //单灯数据保存到缓存里 |
| | | RedisUtils.getBean().set(A5LightDataEnum.LIGHT_HEART_BEAT.getCode() + deviceName, lightReportData); |
| | | |
| | | return save(lightReportData); |
| | | } |
| | | |
| | | /** |
| | | * 获取指定设备码最新的一天上报数据 |
| | | * |
| | | * @param deviceCodeList 设备码列表 |
| | | * @return 上报数据 |
| | | */ |
| | | public List<LightReportData> getNewestReportByDeviceCode(List<String> deviceCodeList) { |
| | | return baseMapper.getNewestReportByDeviceCode(deviceCodeList); |
| | | } |
| | | |
| | | /** |
| | | * 获取上报数据 |
| | | * |
| | | * @param keyword 关键词 |
| | | * @param deviceCode 设备码 |
| | | */ |
| | | public CommonPage listReportData(int pageNo, int pageSize, String keyword, String deviceCode) { |
| | | |
| | | List<LightReportDataBo> lightReportDataBos = new ArrayList<>(pageSize); |
| | | |
| | | CommonPage<String> stringCommonPage = SpringContextHolder.getBean(LightService.class).listDeviceCode(pageNo, pageSize, keyword, deviceCode); |
| | | 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 String 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 = baseMapper.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(); |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 文件流化 |
| | | * |
| | | * @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 { |
| | | //获取文件存放的路径 |
| | | String fileName = file.getName(); |
| | | //获取到文字 数据库里对应的附件名字加上老的文件名字:filename 截取到后面的文件类型 例:txt 组成一个新的文件名字:newFileName |
| | | //生成3个随机数,用来生成新的文件名字 |
| | | String newFileName = "单灯数据" + RandomUtil.randomString(3) + ".xlsx"; |
| | | if (!file.exists()) { |
| | | //如果文件不存在就跳出 |
| | | return; |
| | | } |
| | | ips = new FileInputStream(file); |
| | | response.setContentType("multipart/form-data"); |
| | | //为文件重新设置名字,采用数据库内存储的文件名称 |
| | | 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(); |
| | | } catch (IOException e) { |
| | | System.out.println("关闭流出现异常"); |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } |